[JAWS-UG CLI] ACM入門 #11 CloudFrontの削除

これは<A HREF="http://qiita.com/zakky/items/29cf8095f6faa24f216b" target=_blank>AWS Certificate Manager (ACM)入門ハンズオン資料</A>の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。<A HREF="#1-cloudfrontの削除">第1項へ進んでください</A>。

0. 準備
=======

0.1. ドメイン名の変数への格納
---------------

変数へドメイン名を格納します。
ここでは example.tk とします。自分のドメイン名に読み替えてください。

```bash:コマンド:
DOMAINNAME="example.tk" && echo ${DOMAINNAME}
```

```text:結果(例):
      example.tk
```

0.2. ディストリビューションIDの変数への格納
---------------

```bash:コマンド:
CF_DIST_ID=`aws cloudfront list-distributions \
 --query DistributionList.Items[].Id --output text` && echo ${CF_DIST_ID}
```
```text:結果(例):
      EQSY786QZ6BPJ
```


1. CloudFrontの削除
=================

1.1. ディストリビューション無効化のためのJSONファイルの作成
---------------

稼働しているディストリビューションを削除することはできません。
このため、まずは無効に設定する必要があります。
無効に設定変更するためのJSONファイルを作成します。

```bash:コマンド:
cat << EOF > ./cfd.json
{
  "Comment": "",
  "CacheBehaviors": {
      "Quantity": 0
  },
  "Logging": {
      "Bucket": "",
      "Prefix": "",
      "Enabled": false,
      "IncludeCookies": false
  },
  "WebACLId": "",
  "Origins": {
      "Items": [
          {
              "OriginPath": "",
              "S3OriginConfig": {
                  "OriginAccessIdentity": ""
              },
              "Id": "www.${DOMAINNAME}",
              "DomainName": "www.${DOMAINNAME}.s3.amazonaws.com",
              "CustomHeaders": {
                "Quantity": 0
              }
          }
      ],
      "Quantity": 1
  },
  "DefaultRootObject": "",
  "PriceClass": "PriceClass_All",
  "Enabled": false,
  "DefaultCacheBehavior": {
      "TrustedSigners": {
          "Enabled": false,
          "Quantity": 0
      },
      "TargetOriginId": "www.${DOMAINNAME}",
      "ViewerProtocolPolicy": "allow-all",
      "ForwardedValues": {
          "Headers": {
              "Quantity": 0
          },
          "Cookies": {
              "Forward": "none"
          },
          "QueryStringCacheKeys": {
              "Quantity": 0
          },
          "QueryString": true
      },
      "MaxTTL": 31536000,
      "SmoothStreaming": false,
      "DefaultTTL": 86400,
      "AllowedMethods": {
          "Items": [
              "HEAD",
              "GET"
          ],
          "CachedMethods": {
              "Items": [
                  "HEAD",
                  "GET"
              ],
              "Quantity": 2
          },
          "Quantity": 2
      },
      "Compress": false,
      "MinTTL": 3600
  },
  "CallerReference": "www.${DOMAINNAME}",
  "ViewerCertificate": {
      "CloudFrontDefaultCertificate": true,
      "MinimumProtocolVersion": "SSLv3"
  },
  "CustomErrorResponses": {
      "Quantity": 0
  },
  "HttpVersion": "http2",
  "Restrictions": {
      "GeoRestriction": {
          "RestrictionType": "none",
          "Quantity": 0
      }
  },
  "Aliases": {
      "Quantity": 0
  }
}
EOF
cat ./cfd.json
```
```text:結果(例):
      {
        "Comment": "",
        "CacheBehaviors": {
            "Quantity": 0
        },
        "Logging": {
            "Bucket": "",
            "Prefix": "",
            "Enabled": false,
            "IncludeCookies": false
        },
        "WebACLId": "",
        "Origins": {
            "Items": [
                {
                    "OriginPath": "",
                    "S3OriginConfig": {
                        "OriginAccessIdentity": ""
                    },
                    "Id": "www.example.tk",
                    "DomainName": "www.example.tk.s3.amazonaws.com",
                    "CustomHeaders": {
                      "Quantity": 0
                    }
                }
            ],
            "Quantity": 1
        },
        "DefaultRootObject": "",
        "PriceClass": "PriceClass_All",
        "Enabled": false,
        "DefaultCacheBehavior": {
            "TrustedSigners": {
                "Enabled": false,
                "Quantity": 0
            },
            "TargetOriginId": "www.example.tk",
            "ViewerProtocolPolicy": "allow-all",
            "ForwardedValues": {
                "Headers": {
                    "Quantity": 0
                },
                "Cookies": {
                    "Forward": "none"
                },
                "QueryStringCacheKeys": {
                    "Quantity": 0
                },
                "QueryString": true
            },
            "MaxTTL": 31536000,
            "SmoothStreaming": false,
            "DefaultTTL": 86400,
            "AllowedMethods": {
                "Items": [
                    "HEAD",
                    "GET"
                ],
                "CachedMethods": {
                    "Items": [
                        "HEAD",
                        "GET"
                    ],
                    "Quantity": 2
                },
                "Quantity": 2
            },
            "Compress": false,
            "MinTTL": 3600
        },
        "CallerReference": "www.example.tk",
        "ViewerCertificate": {
            "CloudFrontDefaultCertificate": true,
            "MinimumProtocolVersion": "SSLv3"
        },
        "CustomErrorResponses": {
            "Quantity": 0
        },
        "HttpVersion": "http2",
        "Restrictions": {
            "GeoRestriction": {
                "RestrictionType": "none",
                "Quantity": 0
            }
        },
        "Aliases": {
            "Quantity": 0
        }
      }
```

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

```bash:コマンド:
jsonlint -q cfd.json
```
```text:結果:
      返り値なし
```

1.2. ETAGの取得
---------------

CloudFrontはETAGと呼ばれる現時点を示す一意性のIDが変更あるごとに変化します。
このため、変更を行う際は現在のETAGを都度取得する必要があります。

```bash:コマンド:
ETAG=`aws cloudfront get-distribution \
 --id ${CF_DIST_ID} --query ETag --output text` && echo ${ETAG}
```
```text:結果(例):
      E2RGD6G83K3B8Q
```

1.3. ディストリビューションの無効化
---------------

```bash:コマンド:
aws cloudfront update-distribution --id ${CF_DIST_ID} \
 --if-match ${ETAG} --distribution-config file://cfd.json
```
```text:結果(例):
      {
          "Distribution": {
              "Status": "InProgress",
              "DomainName": "d3plx1x2hvysv9.cloudfront.net",
              "InProgressInvalidationBatches": 0,
              "DistributionConfig": {
                  "Comment": "",
                  "CacheBehaviors": {
                      "Quantity": 0
                  },
                  "IsIPV6Enabled": true,
                  "Logging": {
                      "Bucket": "",
                      "Prefix": "",
                      "Enabled": false,
                      "IncludeCookies": false
                  },
                  "WebACLId": "",
                  "Origins": {
                      "Items": [
                          {
                              "S3OriginConfig": {
                                  "OriginAccessIdentity": ""
                              },
                              "OriginPath": "",
                              "CustomHeaders": {
                                  "Quantity": 0
                              },
                              "Id": "www.example.tk",
                              "DomainName": "www.example.tk.s3.amazonaws.com"
                          }
                      ],
                      "Quantity": 1
                  },
                  "DefaultRootObject": "",
                  "PriceClass": "PriceClass_All",
                  "Enabled": false,
                  "DefaultCacheBehavior": {
                      "TrustedSigners": {
                          "Enabled": false,
                          "Quantity": 0
                      },
                      "TargetOriginId": "www.example.tk",
                      "ViewerProtocolPolicy": "allow-all",
                      "ForwardedValues": {
                          "Headers": {
                              "Quantity": 0
                          },
                          "Cookies": {
                              "Forward": "none"
                          },
                          "QueryStringCacheKeys": {
                              "Quantity": 0
                          },
                          "QueryString": true
                      },
                      "MaxTTL": 31536000,
                      "SmoothStreaming": false,
                      "DefaultTTL": 86400,
                      "AllowedMethods": {
                          "Items": [
                              "HEAD",
                              "GET"
                          ],
                          "CachedMethods": {
                              "Items": [
                                  "HEAD",
                                  "GET"
                              ],
                              "Quantity": 2
                          },
                          "Quantity": 2
                      },
                      "MinTTL": 3600,
                      "Compress": false
                  },
                  "CallerReference": "www.example.tk",
                  "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": "2016-11-05T06:40:52.996Z",
              "Id": "EXCSDJOUKJB7M",
              "ARN": "arn:aws:cloudfront::777777777777:distribution/EXCSDJOUKJB7M"
          },
          "ETag": "EYOPEK5P7XOW4"
      }
```

1.4. CloudFrontのデプロイ完了を待つ
-----------------

```bash:コマンド:
aws cloudfront wait distribution-deployed --id ${CF_DIST_ID}
```
```text:結果:
      返り値なし
```

プロンプトが帰ってくるまでこれは２０～３０分ぐらいかかります。
みんなでビールでも飲みながら亀田さんを囲んで待ちましょう。
（世界各地のエッヂロケーションへ設定を行うため時間がかかるのです）

waitコマンドには待てる限界が存在し、万一タイムアウトして
Waiter DistributionDeployed failed: Max attempts exceeded
という出力が返って来たらコマンドを再実行してください。

1.5. ETAGの取得
---------------

ETAGが変更されているので再度取得します。

```bash:コマンド:
ETAG=`aws cloudfront get-distribution \
 --id ${CF_DIST_ID} --query ETag --output text` && echo ${ETAG}
```
```text:結果(例):
      EYOPEK5P7XOW4
```

1.6. ディストリビューションの削除
-----------------

ディストリビューション削除の準備が整いました。

```bash:コマンド:
aws cloudfront delete-distribution --id ${CF_DIST_ID} --if-match ${ETAG}
```
```text:結果:
      返り値なし
```

1.7. 削除されたか確認
-----------------

```bash:コマンド:
aws cloudfront list-distributions
```
```text:結果:
      返り値なし
```