ハンズオン(簡易版): CloudFront入門

後始末1.2. CloudFrontディストリビューションの更新 (handson-cli-cloudfront-distribution)

手順の目的 [why]

CloudFrontディストリビューション"handson-cli-cloudfront-distribution"を更新し、無効化します。

設定値の指定

設定値の指定

手順に必要な設定値を変数に格納をします。

1. CloudFrontディストリビューションタグ名

CloudFrontディストリビューションタグ名の指定します。

変数の設定:

CLOUDFRONT_DISTRIBUTION_TAG_NAME="handson-cli-cloudfront-distribution"

2. CloudFrontディストリビューション設定ファイル名

CloudFrontディストリビューション設定ファイル名の指定します。

変数の設定:

DIR_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC="${HOME}/environment/conf-handson-cli-cloudfront"

変数の設定:

CLOUDFRONT_CONFIG_ACTION='delete'

変数の設定:

FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC="${DIR_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC}/${CLOUDFRONT_DISTRIBUTION_TAG_NAME}-${CLOUDFRONT_CONFIG_ACTION}-update.json" \
  && echo ${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC}

結果(例):

${HOME}/environment/conf-handson-cli-cloudfront/handson-cli-cloudfront-distribution-delete-update.json

設定値の確認

各変数に正しい設定値が格納されていることを確認しながら保存します。

変数の確認:

cat << END

  # 1. CLOUDFRONT_DISTRIBUTION_TAG_NAME:"handson-cli-cloudfront-distribution"
       CLOUDFRONT_DISTRIBUTION_TAG_NAME="${CLOUDFRONT_DISTRIBUTION_TAG_NAME}"
  # 2. FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC:"${HOME}/environment/conf-handson-cli-cloudfront/handson-cli-cloudfront-distribution-delete-update.json"
       FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC="${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC}"

END

下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号に戻って変数の設定を行います。

処理の実行

ディストリビューションIDを取得します。

コマンド:

for i in $(
  aws cloudfront list-distributions \
    --query "DistributionList.Items[].ARN" \
    --output text \
); do
  j=$( \
    aws cloudfront list-tags-for-resource \
      --resource ${i} \
      --query "Tags.Items[?Key == \`Name\` && Value == \`${CLOUDFRONT_DISTRIBUTION_TAG_NAME}\`].Value" \
      --output text \
  )
  if [ "${j}" == "${CLOUDFRONT_DISTRIBUTION_TAG_NAME}" ]; then \
    CLOUDFRONT_DISTRIBUTION_ID=$( \
      aws cloudfront list-distributions \
        --query "DistributionList.Items[?ARN == \`${i}\`].Id" \
        --output text \
    )
  fi
done \
  && echo ${CLOUDFRONT_DISTRIBUTION_ID}

結果(例):

Exxxxxxxxxxxxx

課題

list-distributionsコマンドがタグ表示できないため、全てのディストリビューションに対してlist-tags-for-resourceコマンドでタグの有無をチェックするしか方法がない。(サポートには未確認)

ETAGを取得します。

コマンド:

CLOUDFRONT_ETAG=$(
  aws cloudfront get-distribution \
    --id ${CLOUDFRONT_DISTRIBUTION_ID} \
    --query 'ETag' \
    --output text \
) \
  && echo ${CLOUDFRONT_ETAG}

結果(例):

Exxxxxxxxxxx

CloudFrontディストリビューションを更新します。

変数の確認:

cat << END

  # FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC:"${HOME}/environment/conf-handson-cli-cloudfront/handson-cli-cloudfront-distribution-delete-update.json"
    FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC="${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC}"
  # CLOUDFRONT_DISTRIBUTION_ID:"Exxxxxxxxxxxxx"
    CLOUDFRONT_DISTRIBUTION_ID="${CLOUDFRONT_DISTRIBUTION_ID}"
  # CLOUDFRONT_ETAG:"Exxxxxxxxxxxx"
    CLOUDFRONT_ETAG="${CLOUDFRONT_ETAG}"

END

コマンド:

aws cloudfront update-distribution \
  --id ${CLOUDFRONT_DISTRIBUTION_ID} \
   --distribution-config file://${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC} \
   --if-match ${CLOUDFRONT_ETAG}

結果(例):

{
    "ETag": "E2xxxxxxxxxxxx",
    "Distribution": {
        "Id": "E1xxxxxxxxxxxx",
        "ARN": "arn:aws:cloudfront::XXXXXXXXXXXX:distribution/E1xxxxxxxxxxxx",
        "Status": "InProgress",
        "LastModifiedTime": "2021-11-25T02:04:42.137Z",
        "InProgressInvalidationBatches": 0,
        "DomainName": "dxxxxxxxxxxxxx.cloudfront.net",
        "ActiveTrustedSigners": {
            "Enabled": false,
            "Quantity": 0
        },
        "ActiveTrustedKeyGroups": {
            "Enabled": false,
            "Quantity": 0
        },
        "DistributionConfig": {
            "CallerReference": "2021-11-21-120836",
            "Aliases": {
                "Quantity": 0
            },
            "DefaultRootObject": "index.html",
            "Origins": {
                "Quantity": 1,
                "Items": [
                    {
                        "Id": "handson-cli-cloudfront-highlevel-XXXXXXXXXXXX.s3-website-ap-northeast-1.amazonaws.com",
                        "DomainName": "handson-cli-cloudfront-highlevel-XXXXXXXXXXXX.s3-website-ap-northeast-1.amazonaws.com",
                        "OriginPath": "",
                        "CustomHeaders": {
                            "Quantity": 0
                        },
                        "CustomOriginConfig": {
                            "HTTPPort": 80,
                            "HTTPSPort": 443,
                            "OriginProtocolPolicy": "http-only",
                            "OriginSslProtocols": {
                                "Quantity": 3,
                                "Items": [
                                    "TLSv1",
                                    "TLSv1.1",
                                    "TLSv1.2"
                                ]
                            },
                            "OriginReadTimeout": 30,
                            "OriginKeepaliveTimeout": 5
                        },
                        "ConnectionAttempts": 3,
                        "ConnectionTimeout": 10,
                        "OriginShield": {
                            "Enabled": false
                        }
                    }
                ]
            },
            "OriginGroups": {
                "Quantity": 0
            },
            "DefaultCacheBehavior": {
                "TargetOriginId": "handson-cli-cloudfront-highlevel-XXXXXXXXXXXX.s3-website-ap-northeast-1.amazonaws.com",
                "TrustedSigners": {
                    "Enabled": false,
                    "Quantity": 0
                },
                "TrustedKeyGroups": {
                    "Enabled": false,
                    "Quantity": 0
                },
                "ViewerProtocolPolicy": "allow-all",
                "AllowedMethods": {
                    "Quantity": 2,
                    "Items": [
                        "HEAD",
                        "GET"
                    ],
                    "CachedMethods": {
                        "Quantity": 2,
                        "Items": [
                            "HEAD",
                            "GET"
                        ]
                    }
                },
                "SmoothStreaming": false,
                "Compress": false,
                "LambdaFunctionAssociations": {
                    "Quantity": 0
                },
                "FunctionAssociations": {
                    "Quantity": 0
                },
                "FieldLevelEncryptionId": "",
                "ForwardedValues": {
                    "QueryString": true,
                    "Cookies": {
                        "Forward": "none"
                    },
                    "Headers": {
                        "Quantity": 0
                    },
                    "QueryStringCacheKeys": {
                        "Quantity": 0
                    }
                },
                "MinTTL": 0,
                "DefaultTTL": 86400,
                "MaxTTL": 31536000
            },
            "CacheBehaviors": {
                "Quantity": 0
            },
            "CustomErrorResponses": {
                "Quantity": 0
            },
            "Comment": "",
            "Logging": {
                "Enabled": false,
                "IncludeCookies": false,
                "Bucket": "",
                "Prefix": ""
            },
            "PriceClass": "PriceClass_200",
            "Enabled": false,
            "ViewerCertificate": {
                "CloudFrontDefaultCertificate": true,
                "MinimumProtocolVersion": "TLSv1",
                "CertificateSource": "cloudfront"
            },
            "Restrictions": {
                "GeoRestriction": {
                    "RestrictionType": "none",
                    "Quantity": 0
                }
            },
            "WebACLId": "",
            "HttpVersion": "http2",
            "IsIPV6Enabled": true
        }
    }
}

完了確認

本手順の主処理は、以下の完了条件を満たしたときに成功したものとします。

完了条件1: CloudFrontディストリビューションタグ名"handson-cli-cloudfront-distribution"のEnable状態が"false"である。

「CloudFrontディストリビューションタグ名"handson-cli-cloudfront-distribution"のEnable状態が"false"である。」ことを確認します。

コマンド:

aws cloudfront get-distribution \
  --id ${CLOUDFRONT_DISTRIBUTION_ID} \
  --query 'Distribution.DistributionConfig.Enabled'

結果(例):

false

完了条件2: CloudFrontディストリビューションタグ名"handson-cli-cloudfront-distribution"のステータスが"Deployed"である。

「CloudFrontディストリビューションタグ名"handson-cli-cloudfront-distribution"のステータスが"Deployed"である。」ことを確認します。

ディストリビューションのステータスを確認します。

コマンド:

CLOUDFRONT_DISTRIBUTION_STATUS=$(
  aws cloudfront get-distribution \
    --id ${CLOUDFRONT_DISTRIBUTION_ID} \
    --query 'Distribution.Status' \
    --output text \
) \
  && echo ${CLOUDFRONT_DISTRIBUTION_STATUS}

結果(例):

Deployed

注釈

"InProgress"から"Deployed"まで、20〜30分程度かかります。

手順の完了

(参考) マネジメントコンソールの確認

ディストリビューション一覧(画面)

  • ディストリビューションのステータスが"無効"と表示されていることを確認します。