6.2. CloudFrontディストリビューション設定ファイルの作成

作業の目的 [why]

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

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

完了条件 [after]

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

完了条件1
設定ファイル"${HOME}/tmp/conf-handson-cli"が存在する。
完了条件2
設定ファイル"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"が有効なJSON形式である。

事前条件 [before]

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

事前条件1
設定ファイル用ディレクトリ"${HOME}/tmp/conf-handson-cli"が存在する。
事前条件2
設定ファイル"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"が存在しない。
事前条件3
オリジンS3バケット"handson-cli.<ドメイン名>"が存在する。
事前条件4
ログ用S3バケット"handson-cli.<ドメイン名>-log"が存在する。
事前条件5
ドメイン"<ドメイン名>"のSSL証明書がus-east-1リージョンに存在する。

作業対象 [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: 設定ファイル

リソース3: SSL証明書ドメイン名

  • 作成するCloudFrontディストリビューションが利用するSSL証明書のドメイン名です。
  • 今回は"<ドメイン名>"とします。

リソース4: ホスト名

  • 作成するCloudFrontディストリビューションにアクセスするときに利用するホスト名です。
  • 今回は"handson-cli.<ドメイン名>"とします。

リソース5: オリジンS3バケット名

  • 作成するCloudFrontディストリビューションが利用するオリジンS3バケットの名称です。
  • 今回は"handson-cli.<ドメイン名>"とします。

リソース6: ログ用S3バケット名

  • 作成するCloudFrontディストリビューションが利用するログ用S3バケットの名称です。
  • 今回は"handson-cli.<ドメイン名>-log"とします。

パラメータの指定

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

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

0.3. SSL証明書のドメイン名の指定

ドメイン名を指定します。

変数の設定:

DOMAIN_NAME='<ドメイン名>'

0.4. ホスト名の指定

ホスト名を指定します。

変数の設定:

HOST_NAME='handson-cli'

0.5. オリジンS3バケット名の指定

オリジンとなるS3バケット名を指定します。

変数の設定:

S3_BUCKET_NAME="${HOST_NAME}.${DOMAIN_NAME}" \
  && echo ${S3_BUCKET_NAME}

結果(例):

handson-cli.<ドメイン名>

0.6. ログ用S3バケット名の指定

ログ用S3バケット名を指定します。

変数の設定:

S3_BUCKET_LOG="${HOST_NAME}.${DOMAIN_NAME}-log" \
  && echo ${S3_BUCKET_LOG}

結果(例):

handson-cli.<ドメイン名>-log

パラメータの保存

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

変数の設定:

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

結果(例):

${HOME}/tmp/parameter-handson-cli/2019-04-30-cloudfront-distribution_conf-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}"
  # 0.3. DOMAIN_NAME:"<ドメイン名>"
         DOMAIN_NAME="${DOMAIN_NAME}"
  # 0.4. HOST_NAME:"handson-cli"
         HOST_NAME="${HOST_NAME}"
  # 0.5. S3_BUCKET_NAME:"handson-cli.<ドメイン名>"
         S3_BUCKET_NAME="${S3_BUCKET_NAME}"
  # 0.6. S3_BUCKET_LOG:"handson-cli.<ドメイン名>-log"
         S3_BUCKET_LOG="${S3_BUCKET_LOG}"

EOF

cat ${FILE_PARAMETER}

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

タスクの実施

課題

(未検証)

タスク標準時間:6分

1. 前処理

1.1. 状態確認に必要な情報の取得

CloudFrontへのアクセスに利用するホスト名(Alias名)の指定

変数の設定:

HOST_FQDN="${HOST_NAME}.${DOMAIN_NAME}" \
  && echo ${HOST_FQDN}

結果(例):

handson-cli.<ドメイン名>

Websiteのホスト名の取得

変数の設定:

S3_BUCKET_LOCATION=$( \
  aws s3api get-bucket-location \
    --bucket ${S3_BUCKET_NAME} \
    --output text \
) \
  && echo ${S3_BUCKET_LOCATION}

結果(例):

ap-northeast-1

変数の設定:

CFRONT_ORIGIN_DOMAIN_NAME="${S3_BUCKET_NAME}.s3-website-${S3_BUCKET_LOCATION}.amazonaws.com" \
  && echo ${CFRONT_ORIGIN_DOMAIN_NAME}

結果(例)

handson-cli.<ドメイン名>.s3-ap-northeast-1.amazonaws.com

1.2. 処理対象の状態確認

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

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

事前条件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}

結果(例):

ls: cannot access ${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json: No such file or directory

事前条件3: オリジンS3バケット"handson-cli.<ドメイン名>"が存在する。

「オリジンS3バケット"handson-cli.<ドメイン名>"が存在する。」ことを確認します。

変数の確認:

curl ${CFRONT_ORIGIN_DOMAIN_NAME}

コンテンツにアクセスできることを確認します。

事前条件4: ログ用S3バケット"handson-cli.<ドメイン名>-log"が存在する。

「ログ用S3バケット"handson-cli.<ドメイン名>-log"が存在する。」ことを確認します。

コマンド:

aws s3api list-buckets \
  --query "Buckets[?Name == \`${S3_BUCKET_LOG}\`].Name" \
  --output text

結果(例):

handson-cli.<ドメイン名>-log

事前条件5: ドメイン"<ドメイン名>"のSSL証明書がus-east-1リージョンに存在する。

「ドメイン"<ドメイン名>"のSSL証明書がus-east-1リージョンに存在する。」ことを確認します。

コマンド:

aws acm list-certificates \
  --region us-east-1 \
  --query "CertificateSummaryList[?DomainName == \`${HOST_FQDN}\`].DomainName" \
  --output text

結果(例):

handson-cli.<ドメイン名>

1.3. 主処理に必要な情報の取得

CloudFrontオリジンIDの指定

変数の設定:

CFRONT_ORIGIN_ID="S3-Website-${S3_BUCKET_NAME}.s3-website-${S3_BUCKET_LOCATION}.amazonaws.com" \
  && echo ${CFRONT_ORIGIN_ID}

結果(例):

S3-Website-handson-cli.<ドメイン名>.s3-website-ap-northeast-1.amazonaws.com

証明書のARN取得

コマンド:

ACM_CERT_ARN=$( \
  aws acm list-certificates \
    --region us-east-1 \
    --query "CertificateSummaryList[?DomainName == \`${HOST_FQDN}\`].CertificateArn" \
    --output text \
) \
  && echo ${ACM_CERT_ARN}

結果(例):

handson-cli.<ドメイン名>

CallerReferenceの生成

変数の設定:

CFRONT_DIST_CALLER_REFERENCE=$(date +%Y-%m-%d-%H%M%S) \
  && echo ${CFRONT_DIST_CALLER_REFERENCE}

結果(例):

2019-04-30-012345

2. 主処理

2.1. 設定情報の生成

変数の確認:

cat << ETX

  # FILE_INPUT:"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"
    FILE_INPUT="${FILE_INPUT}"
  # HOST_FQDN:"handson-cli.<ドメイン名>"
    HOST_FQDN="${HOST_FQDN}"
  # S3_BUCKET_LOG:"handson-cli.<ドメイン名>-log"
    S3_BUCKET_LOG="${S3_BUCKET_LOG}"
  # CFRONT_ORIGIN_DOMAIN_NAME:"handson-cli.<ドメイン名>.s3-website-ap-northeast-1.amazonaws.com"
    CFRONT_ORIGIN_DOMAIN_NAME="${CFRONT_ORIGIN_DOMAIN_NAME}"
  # CFRONT_ORIGIN_ID:"S3-Website-handson-cli.<ドメイン名>.s3-website-ap-northeast-1.amazonaws.com"
    CFRONT_ORIGIN_ID="${CFRONT_ORIGIN_ID}"
  # ACM_CERT_ARN:"arn:aws:acm:us-east-1:XXXXXXXXXXXX:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    ACM_CERT_ARN="${ACM_CERT_ARN}"
  # CFRONT_DIST_CALLER_REFERENCE:"2019-04-30-012345"
    CFRONT_DIST_CALLER_REFERENCE="${CFRONT_DIST_CALLER_REFERENCE}"

ETX

コマンド:

cat << EOF > ${FILE_INPUT}
{
  "DistributionConfig": {
    "CallerReference": "${CFRONT_DIST_CALLER_REFERENCE}",
    "Aliases": {
      "Quantity": 1,
      "Items": [ "${HOST_FQDN}" ]
    },
    "DefaultRootObject": "",
    "Origins": {
      "Quantity": 1,
      "Items": [
        {
          "Id": "${CFRONT_ORIGIN_ID}",
          "DomainName": "${CFRONT_ORIGIN_DOMAIN_NAME}",
          "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
          }
        }
      ]
    },
    "DefaultCacheBehavior": {
      "TargetOriginId": "${CFRONT_ORIGIN_ID}",
      "ForwardedValues": {
        "QueryString": false,
        "Cookies": {
          "Forward": "none"
        },
        "Headers": {
          "Quantity": 0
        },
        "QueryStringCacheKeys": {
          "Quantity": 0
        }
      },
      "TrustedSigners": {
        "Enabled": false,
        "Quantity": 0
      },
      "ViewerProtocolPolicy": "redirect-to-https",
      "MinTTL": 0,
      "AllowedMethods": {
        "Quantity": 2,
        "Items": [
          "HEAD",
          "GET"
        ],
        "CachedMethods": {
          "Quantity": 2,
          "Items": [
            "HEAD",
            "GET"
          ]
        }
      },
      "SmoothStreaming": false,
      "DefaultTTL": 86400,
      "MaxTTL": 31536000,
      "Compress": false,
      "LambdaFunctionAssociations": {
        "Quantity": 0
      }
    },
    "CacheBehaviors": {
      "Quantity": 0
    },
    "CustomErrorResponses": {
      "Quantity": 0
    },
    "Comment": "",
    "Logging": {
      "Enabled": true,
      "IncludeCookies": true,
      "Bucket": "${S3_BUCKET_LOG}.s3.amazonaws.com",
      "Prefix": ""
    },
    "PriceClass": "PriceClass_All",
    "Enabled": true,
    "ViewerCertificate": {
      "ACMCertificateArn": "${ACM_CERT_ARN}",
      "SSLSupportMethod": "sni-only",
      "MinimumProtocolVersion": "TLSv1",
      "Certificate": "${ACM_CERT_ARN}",
      "CertificateSource": "acm"
    },
    "Restrictions": {
      "GeoRestriction": {
        "RestrictionType": "none",
        "Quantity": 0
      }
    },
    "WebACLId": "",
    "HttpVersion": "http1.1",
    "IsIPV6Enabled": true
  }
}
EOF

cat ${FILE_INPUT}

3. 後処理

完了条件の確認

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

完了条件1: 設定ファイル"${HOME}/tmp/conf-handson-cli"が存在する。

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

コマンド:

ls ${FILE_INPUT}

結果(例):

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

完了条件2: 設定ファイル"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"が有効なJSON形式である。

「設定ファイル"${HOME}/tmp/conf-handson-cli/cloudfront-distribution-create-2019-04-30.json"が有効なJSON形式である。」ことを確認します。

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

エラーが出力されなければOKです。

コマンド:

jsonlint -q ${FILE_INPUT}

結果(例):

(出力なし)

完了