CLIでCloudFrontディストリビューションを新規作成する、既存ディストリビューションをコピーする

先月ぐらいに怒涛の勢いで記事を書いたはいいが、さっそくネタ切れになった。。。
意外に出し尽くした感があるが、それでもまだまだ地味なTipsが残っている。だが、地味なTipsほど書く気が起きない。難しいところ。やや出涸らし気味だが、頑張ってみる。

# 目的（やりたいこと）
- CloudFrontのディストリビューションをCLIで作成したい
- 作成するにしても既存のものをコピーしたい

# 前提条件
- Cloudshellを利用

# CloudFrontのディストリビューションをCLIで作成
## テンプレートコンフィグ取得
基本的にCloudformationのようにコンフィグファイルを作成して、そのコンフィグファイルをCloudFrontに適用するイメージとなる。コンフィグファイルをどう作ればいい？という話になるが、そのテンプレートはAWSCLIで出力することが可能。

```sh
aws cloudfront create-distribution --generate-cli-skeleton > aws-cloudfront-distribution.json
```
「aws-cloudfront-distribution.json」の部分は出力ファイル名のため、お好きな名前に変更する。
<br>

## コンフィグファイルを修正
```sh
vi aws-cloudfront-distribution.json
```
たくさん設定値があるので、それをお好み、よしなに設定する。
<br>

## コンフィグファイルを適用
```sh
aws cloudfront create-distribution --cli-input-json file://aws-cloudfront-distribution.json
```

この流れでCLIでのディストリビューションドメイン作成が可能となる。
<br>
<br>

# 既存のCloudFrontディストリビューションをコピーしたい
テンプレートで作成してくれる機能はあるが、正直設定値は多いため難しい。であれば、試験的なディストリビューションをGUIで事前に作成しておいたり、既存に存在するディストリビューションの設定値をコンフィグファイルとして出力して、それを改修したほうが効率がよい。

- callerReferenceを取得
```sh
callerReference=`date +"%Y%m%d%H%M%S%N"`
```

これはユニークな値でないといけないそうなので、ミリ秒単位で取得している。

https://dev.classmethod.jp/articles/replicate-existing-cloudfront/

<br>

- callerReferenceが取得できたか確認
```sh
echo ${callerReference}
```
<br>

- ディストリビューションの設定情報を取得
「EXXXXXXX」はコピーしたいディストリビューションのIDのため、この値は事前にコンソールで確認しておく。
```sh
aws cloudfront get-distribution --id EXXXXXXX | \
 jq -r ".Distribution | { DistributionConfig: .DistributionConfig } | .DistributionConfig.CallerReference = \"${callerReference}\"" > copydist.json
```
copydist.jsonが出来上がる。
<br>

## コンフィグファイルを修正
```sh
vi copydist.json
```
viなどのエディタで修正する。


### 既存ディストリビューションのコンフィグファイル修正ポイント
- ドメイン名の変更
基本的にコピー元で使っているドメイン名、例えばexample.comがコピー元ディストリビューションのオリジンドメイン名だったとして、その部分は新たに設定するドメイン名に変える。

- callerReferenceの変更
設定変更するにあたり、この部分も新たな値に変更する（変えなくても設定できるかもしれないが、念のため変えている）。
これも同じように以下コマンドを実行して、値を出力し、その値を記載する。

```sh
date +"%Y%m%d%H%M%S%N"
20230525051758555398360
```
<br>

上記コマンドの結果を、copydist.jsonの「"CallerReference":」に記載する
```json:copydist.json
{
  "DistributionConfig": {
    "CallerReference": "20230525051758555398360",
    "Aliases": {
      "Quantity": 0
    },

```
<br>

- ACMの設定
私の環境だけかもしれないが、ACMに登録した証明書を空にして適用すると、エラーで失敗した。ディストリビューションを作成するにあたり、ACMは必須のように見えるので、ACMの証明書を記載しておく。まだACMに証明書をインポートしてない場合は、事前にインポートしておく。
インポートできる証明書がない場合は、ダミーでオレオレ証明書を作成し、ACMにインポートしておき、それを指定しておくとよい。
ACMでオレオレ証明書を作ってインポートするやり方は以下。

https://qiita.com/Raccoon-san/items/f342c4f41c8d6ce465cb

ACMの証明書指定箇所はこちら。指定する証明書ARNが「arn:aws:acm:us-east-1:NNNNNNNNNNNNNNNNNNNN:certificate/XXXXXXXXXXXXXXXXXXXX」としているため、これをご自身の証明書ARNに置き換える。
```json:copydist.json
    "ViewerCertificate": {
      "CloudFrontDefaultCertificate": false,
      "ACMCertificateArn": "arn:aws:acm:us-east-1:NNNNNNNNNNNNNNNNNNNN:certificate/XXXXXXXXXXXXXXXXXXXX",
      "SSLSupportMethod": "sni-only",
      "MinimumProtocolVersion": "TLSv1.2_2021",
      "Certificate": "arn:aws:acm:us-east-1:NNNNNNNNNNNNNNNNNNNN:certificate/XXXXXXXXXXXXXXXXXXXX",
      "CertificateSource": "acm"

```
<br>

## コンフィグファイルを適用
エラーが出なければ、新たなディストリビューションを作成できる。
```sh
aws cloudfront create-distribution --cli-input-json file://copydist.json
```

# 参考リンク
CloudFrontの設定をコマンドラインから作成する

https://hori-ryota.com/blog/create-cloudfront-with-awscli/

[AWS] CloudFront Distributionをコマンドライン(CLI)から作成する

https://qiita.com/sengoku/items/4f93a2b2209ab72578bf

AWS CloudFormation の「One or more of your origins or origin groups do not exist」(1 つ以上のオリジンまたはオリジングループが存在しません) というエラーを解決するにはどうすればよいですか?

https://repost.aws/ja/knowledge-center/cloudformation-origin-error

"One or more of your origins or origin groups do not exist"

https://twitter.com/omuron/status/1346833757639041027