6.3. CloudFrontディストリビューションの作成

作業の目的 [why]

CloudFrontディストリビューション"<CloudFrontディストリビューション名>"を作成します。

完了条件/事前条件 [設計者用情報]

完了条件 [after]

主処理は、以下を満たしたときに成功したものとします。

完了条件1
設定ファイルに記述されたWebsiteをオリジンとするCloudFrontディストリビューションが存在する。

事前条件 [before]

主処理の実施は、以下の状態であることを前提とします。

事前条件1
設定ファイル用ディレクトリ"${HOME}/tmp/conf-handson-cli"が存在する。
事前条件2
設定ファイル"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"が存在する。

作業対象 [what]

  • CloudFrontサービス

標準時間(合計)

8分

パラメータ設定

パラメータ設定の標準時間:2分

作業に必要なモノ・情報 [resource]

作業開始には、以下が全て揃っていることが必要です。

リソース1: 設定ファイル用ディレクトリ

  • 今回は"${HOME}/tmp/conf-handson-cli"を設定ファイル用ディレクトリとします。

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

コマンド:

ls -d ${HOME}/tmp/conf-handson-cli

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

${HOME}/tmp/conf-handson-cli

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

コマンド:

mkdir -p ${HOME}/tmp/conf-handson-cli

リソース2: 設定ファイル

  • cloudfrontディストリビューションを作成するための設定ファイルです。
  • 今回は"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"とします。

パラメータの指定

作業に必要なパラメータを変数に格納をします。

0.0. リージョンの指定

変数の設定

export AWS_DEFAULT_REGION='ap-northeast-1'

0.1. 設定ファイルディレクトリの指定

変数の設定:

DIR_CONF="${HOME}/tmp/conf-handson-cli"

0.2. 設定ファイルの指定

変数の設定:

FILE_INPUT="${DIR_CONF}/cloudfront-distribution-create-$(date +%Y-%m-%d).json" \
  && echo ${FILE_INPUT}

結果(例):

${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json

パラメータの保存

設定されている変数の保存先となるファイル名を指定します。

変数の設定:

DIR_PARAMETER="${HOME}/tmp/parameter-handson-cli"
FILE_PARAMETER="${DIR_PARAMETER}/$(date +%Y-%m-%d)-cloudfront-distribution-create.env" \
  && echo ${FILE_PARAMETER}

結果(例):

${HOME}/tmp/parameter-handson-cli/2019-04-30-cloudfront-distribution-create.env

各変数に正しいパラメータ値が格納されていることを確認しながら保存します。

変数の確認:

cat << EOF > ${FILE_PARAMETER}

  # 0.0. AWS_DEFAULT_REGION:"ap-northeast-1"
         AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 0.1. DIR_CONF:"${HOME}/tmp/conf-handson-cli"
         DIR_CONF="${DIR_CONF}"
  # 0.2. FILE_INPUT:"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"
         FILE_INPUT="${FILE_INPUT}"

EOF

cat ${FILE_PARAMETER}

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

タスクの実施

課題

(未検証)

タスク標準時間:6分

1. 前処理

処理対象の状態確認

主処理の実施は、以下の状態であることを前提とします。

前提と異なることが判明した場合、直ちに処理を中止します。

事前条件1: 設定ファイル用ディレクトリ"${HOME}/tmp/conf-handson-cli"が存在する。

「設定ファイル用ディレクトリ"${HOME}/tmp/conf-handson-cli"が存在する。」ことを確認します。

コマンド:

ls -d ${DIR_CONF}

結果(例):

${HOME}/tmp/conf-handson-cli

事前条件2: 設定ファイル"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"が存在する。

「設定ファイル"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"が存在する。」ことを確認します。

コマンド:

ls ${FILE_INPUT}

結果(例):

${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json

事前条件3: 設定ファイルに記述されたWebsiteをオリジンとするCloudFrontディストリビューションが存在しない。

「設定ファイルに記述されたWebsiteをオリジンとするCloudFrontディストリビューションが存在しない。」ことを確認します。

変数の設定:

CFRONT_DEFAULT_TARGET=$( \
  cat ${FILE_INPUT} \
  | jp.py 'DistributionConfig.DefaultCacheBehavior.TargetOriginId' \
  | sed 's/\"//g' \
) \
  && echo ${CFRONT_DEFAULT_TARGET}

変数の設定:

CFRONT_ORIGIN_DOMAIN_NAME=$( \
  cat ${FILE_INPUT} \
  | jp.py "DistributionConfig.Origins.Items[?Id == \`${CFRONT_DEFAULT_TARGET}\`].DomainName" \
  | sed 's/\"//g' \
  | sed 's/\[//' \
  | sed 's/\]//' \
) \
  && echo ${CFRONT_ORIGIN_DOMAIN_NAME}

コマンド:

aws cloudfront list-distributions \
  --query "DistributionList.Items[?contains(Origins.Items[].DomainName, \`${CFRONT_ORIGIN_DOMAIN_NAME}\`)].DomainName"

結果(例):

null

2. 主処理

CloudFrontディストリビューションの作成

変数の確認:

cat << ETX

  # FILE_INPUT:"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"
    FILE_INPUT="${FILE_INPUT}"

ETX

コマンド(cli-input-json):

aws cloudfront create-distribution \
  --cli-input-json file://${FILE_INPUT}

結果(例):

{
  "Distribution": {
    "Status": "InProgress",
    "DomainName": "d1fxioaf8yk47h.cloudfront.net",
    "InProgressInvalidationBatches": 0,
    "DistributionConfig": {
        "Comment": "",
        "CacheBehaviors": {
            "Quantity": 0
        },
        "IsIPV6Enabled": true,
        "Logging": {
            "Bucket": "",
            "Prefix": "",
            "Enabled": false,
            "IncludeCookies": false
        },
        "WebACLId": "",
        "Origins": {
            "Items": [
                {
                    "OriginPath": "",
                    "CustomOriginConfig": {
                        "OriginSslProtocols": {
                            "Items": [
                                "TLSv1",
                                "TLSv1.1",
                                "TLSv1.2"
                            ],
                            "Quantity": 3
                        },
                        "OriginProtocolPolicy": "http-only",
                        "OriginReadTimeout": 30,
                        "HTTPPort": 80,
                        "HTTPSPort": 443,
                        "OriginKeepaliveTimeout": 5
                    },
                    "CustomHeaders": {
                        "Quantity": 0
                    },
                    "Id": "S3-Website-handson-cli.<ドメイン名>.s3-website-ap-northeast-1.amazonaws.com",
                    "DomainName": "handson-cli.<ドメイン名>.s3-website-ap-northeast-1.amazonaws.com"
                }
            ],
            "Quantity": 1
        },
        "DefaultRootObject": "",
        "PriceClass": "PriceClass_All",
        "Enabled": true,
        "DefaultCacheBehavior": {
            "TrustedSigners": {
                "Enabled": false,
                "Quantity": 0
            },
            "LambdaFunctionAssociations": {
                "Quantity": 0
            },
            "TargetOriginId": "S3-Website-handson-cli.<ドメイン名>.s3-website-ap-northeast-1.amazonaws.com",
            "ViewerProtocolPolicy": "redirect-to-https",
            "ForwardedValues": {
                "Headers": {
                    "Quantity": 0
                },
                "Cookies": {
                    "Forward": "none"
                },
                "QueryStringCacheKeys": {
                    "Quantity": 0
                },
                "QueryString": false
            },
            "MaxTTL": 31536000,
            "SmoothStreaming": false,
            "DefaultTTL": 86400,
            "AllowedMethods": {
                "Items": [
                    "HEAD",
                    "GET"
                ],
                "CachedMethods": {
                    "Items": [
                        "HEAD",
                        "GET"
                    ],
                    "Quantity": 2
                },
                "Quantity": 2
            },
            "MinTTL": 0,
            "Compress": false
        },
        "CallerReference": "20170808120550",
        "ViewerCertificate": {
            "CloudFrontDefaultCertificate": true,
            "MinimumProtocolVersion": "SSLv3",
            "CertificateSource": "cloudfront"
        },
        "CustomErrorResponses": {
            "Quantity": 0
        },
        "HttpVersion": "http2",
        "Restrictions": {
            "GeoRestriction": {
                "RestrictionType": "none",
                "Quantity": 0
            }
        },
        "Aliases": {
            "Quantity": 0
        }
    },
    "ActiveTrustedSigners": {
        "Enabled": false,
        "Quantity": 0
    },
    "LastModifiedTime": "2019-04-30T01:23:45.678Z",
    "Id": "E36MP417B2RXEE",
    "ARN": "arn:aws:cloudfront::401286648550:distribution/E36MP417B2RXEE"
  },
  "ETag": "EZU8BUUJ9BS9L",
  "Location": "https://cloudfront.amazonaws.com/2017-03-25/distribution/E36MP417B2RXEE"
}

3. 後処理

3.1. 完了条件の確認

主処理は、以下を満たしたときに成功したものとします。

完了条件1: 設定ファイルに記述されたWebsiteをオリジンとするCloudFrontディストリビューションが存在する。

「設定ファイルに記述されたWebsiteをオリジンとするCloudFrontディストリビューションが存在する。」ことを確認します。

コマンド:

aws cloudfront list-distributions \
  --query "DistributionList.Items[?contains(Origins.Items[].DomainName, \`${CFRONT_ORIGIN_DOMAIN_NAME}\`)].DomainName"

結果(例)

[
  "<CloudFrontドメイン名>"
]

ディストリビューションIDの取得

コマンド:

CFRONT_DIST_ID=$( \
  aws cloudfront list-distributions \
    --query "DistributionList.Items[?DefaultCacheBehavior.TargetOriginId == \`${CFRONT_DEFAULT_TARGET}\`].Id" \
    --output text \
  ) \
  && echo ${CFRONT_DIST_ID}

結果(例):

<CloudFrontディストリビューションID>

コマンド:

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

結果(例):

Deployed

完了