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

後始末1.1. 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"

ディレクトリが存在することを確認します。

コマンド:

ls -d ${DIR_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC}

結果(例:存在する場合):

${HOME}/environment/conf-handson-cli-cloudfront

存在しない場合は作成します。

コマンド:

mkdir -p ${DIR_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC}

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

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

4. 一時ファイル用ディレクトリ

一時ファイル用ディレクトリの指定します。

変数の設定:

DIR_TMP="${HOME}/environment/tmp-handson-cli-cloudfront"

ディレクトリが存在することを確認します。

コマンド:

ls -d ${DIR_TMP}

結果(例:存在する場合):

${HOME}/environment/tmp-handson-cli-cloudfront

ディレクトリが存在しない場合は作成します。

コマンド:

mkdir -p ${DIR_TMP}

設定値の確認

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

変数の確認:

cat << END

  # 1. CLOUDFRONT_DISTRIBUTION_TAG_NAME:"handson-cli-cloudfront-distribution"
       CLOUDFRONT_DISTRIBUTION_TAG_NAME="${CLOUDFRONT_DISTRIBUTION_TAG_NAME}"
  # 2. DIR_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC:"${HOME}/environment/conf-handson-cli-cloudfront"
       DIR_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC="${DIR_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC}"
  # 3. 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}"
  # 4. DIR_TMP:"${HOME}/environment/tmp-handson-cli-cloudfront"
       DIR_TMP="${DIR_TMP}"

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コマンドでタグの有無をチェックするしか方法がない。(サポートには未確認)

現在の設定を抽出します。

変数の設定:

FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_CURRENT="${DIR_TMP}/tmp-${CLOUDFRONT_DISTRIBUTION_TAG_NAME}-$(date +%Y-%m-%d-%H%M%S).json" \
  && echo ${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_CURRENT}

結果(例):

${HOME}/environment/tmp-handson-cli-cloudfront/tmp-handson-cli-cloudfront-distribution-2021-11-25-012345.json

変数の確認:

cat << END

  # CLOUDFRONT_DISTRIBUTION_ID:"Exxxxxxxxxxxxx"
    CLOUDFRONT_DISTRIBUTION_ID="${CLOUDFRONT_DISTRIBUTION_ID}"
  # FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_CURRENT:"${HOME}/environment/tmp-handson-cli-cloudfront/tmp-handson-cli-cloudfront-distribution-2021-11-25-012345.json"
    FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_CURRENT="${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_CURRENT}"

END

コマンド:

aws cloudfront get-distribution-config \
  --id ${CLOUDFRONT_DISTRIBUTION_ID} \
  > ${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_CURRENT}

  cat ${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_CURRENT}

結果(例):

{
    "ETag": "Exxxxxxxxxxxxx",
    "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": true,
        "ViewerCertificate": {
            "CloudFrontDefaultCertificate": true,
            "MinimumProtocolVersion": "TLSv1",
            "CertificateSource": "cloudfront"
        },
        "Restrictions": {
            "GeoRestriction": {
                "RestrictionType": "none",
                "Quantity": 0
            }
        },
        "WebACLId": "",
        "HttpVersion": "http2",
        "IsIPV6Enabled": true
    }
}

値を確認します。

コマンド:

cat ${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_CURRENT} \
  | jp.py 'DistributionConfig.Enabled'

結果(例):

true

CloudFrontディストリビューション設定ファイルを作成します。

コマンド:

cat ${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_CURRENT} \
  | jp.py 'DistributionConfig' \
  | jp.py 'merge(@, `{ "Enabled": false}`)' \
  > ${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC}

cat ${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC}

結果(例):

{
    "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
}

値を確認します。

コマンド:

cat ${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_DOC} \
  | jp.py 'Enabled'

結果(例):

false

完了確認

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

完了条件1: CloudFrontディストリビューション設定ファイル"${HOME}/environment/conf-handson-cli-cloudfront/handson-cli-cloudfront-distribution-delete-update.json"が存在する。

「CloudFrontディストリビューション設定ファイル"${HOME}/environment/conf-handson-cli-cloudfront/handson-cli-cloudfront-distribution-delete-update.json"が存在する。」ことを確認します。

コマンド:

ls ${FILE_CLOUDFRONT_DISTRIBUTION_CONFIG_CURRENT}

結果(例):

${HOME}/environment/tmp-handson-cli-cloudfront/tmp-handson-cli-cloudfront-distribution-2021-11-25-012345.json

一時ファイルを削除します。

コマンド:

rm ${DIR_TMP}/tmp-${CLOUDFRONT_DISTRIBUTION_TAG_NAME}-*.json

結果(例):

(出力なし)

手順の完了