CloudFrontのコンフィグ取得や操作関連＠CloudShell

CDNを触るのも、CloudFrontを触ることも初めてだった。初めてにも関わらず、それをやらなければならないことがあった。
アプリケーションレイヤなので、設定も膨大な量になることが、うっすらと見えていた。

そんな中で「全部GUIでやる！」というツワモノがいて、震える夜、眠れない夜を過ごした（これだけ設定がたくさんあるのに、どう管理して、どうチェックするつもりなんだという震え。1－2個のドメインだったらそれでいいんだけどね。。。ああ、コワイヨ・・・）。案の定、設定ミスが多く、関係各位から怒られる。

設定はミスっても仕方ないと思う。人間は不完全な生き物ですから。設定箇所もとても多いし、時間もないので。
ただ、どこを間違えたのかはわかるようにしたいよね。そうしないと対策も作れないし、何よりも元に戻せないのがつらいね・・・。
そんな震える夜、ヒトリノ夜ももうこれで大丈夫。

# 前提
 - Cloudshellを使って操作
 - AWSCLIが操作可能で、適切なIAM権限のあるLinuxインスタンスでも可能なはず（こちらは未検証だけど、操作は全部AWSCLIなので可能の認識）

# 手順
ここでは、「example-test.jp」がオリジンのドメイン名であるCloudFrontディストリビューションドメインを操作する。

- CloudFrontのIDを確認する
CloudFrontのGUIで見てもよし。CLIで見てもよし。以下はCloudShellによるCLI方式。
example-test.jpは自身のオリジンドメインネームに置き換えること。
5行あるが、全部まるっとコピーペーストが可能（\で改行してるだけなので）。
```shell-session
$ aws cloudfront list-distributions \
 --query "DistributionList.Items[].{DistId: Id, DomainName: DomainName, OriginDomainName: Aliases.Items[0]}[? OriginDomainName == 'example-test.jp'] \
 | [0].DistId" \
 --output=text \
 | grep -v -i "none"
```
<br>

 - 作業用ディレクトリ作成
CloudFrontのIDを確認できたら、作業用ディレクトリを作る。cfsetting日付ディレクトリができ、そこにカレントを移す。
```shell-session
$ mkdir cfsetting`date '+%Y%m%d'`
$ cd cfsetting`date '+%Y%m%d'`
```
<br>

- 事前コンフィグ取得
設定前にコンフィグを取ってテキストに残す。
EXXXXXXXXXXXXX は前工程で確認したIDに置き換えて入力。

```shell-session
$ aws cloudfront get-distribution-config --id "EXXXXXXXXXXXXX" | jq '.DistributionConfig' > EXXXXXXXXXXXXX-before.conf
```
<br>

- 設定ファイルの作成
設定したい内容を記載するため、前工程で取得した事前コンフィグをコピーしてリネームする。
```shell-session
$ cp -p EXXXXXXXXXXXXX-before.conf EXXXXXXXXXXXXX-modify.conf
$ ls -ltr
```
<br>

- 設定ファイルの編集
EXXXXXXXXXXXXX-modify.confを編集する。sedとか使って一括で変えたりする。設定項目がそんなに多くなければ、GUIで設定してもいい。
```shell-session
$ vi EXXXXXXXXXXXXX-modify.conf
```
<br>

- 設定反映前のETAG取得
ETAG値を取得する。EXXX・・・は実際のIDに置き換える。コマンド実行結果に文字列が出るため、これをコピーして、次のコマンドに使う。
```shell-session
$ aws cloudfront get-distribution-config --id "EXXXXXXXXXXXXX" | jq '.ETag'
```
<br>

- 設定反映
EXXX・・・は実際のIDに置き換える。ETAGIDは「設定反映前のETAG取得」のコマンド実行結果の値に変更する。このコマンドを打つと、設定が反映されるため、心の準備をしておく。
```shell-session
$ aws cloudfront update-distribution --id "EXXXXXXXXXXXXX" --distribution-config file://EXXXXXXXXXXXXX-modify.conf --if-match ETAGID
```
<br>

- 設定値の確認
設定値一覧を出力。ただ、設定箇所が多すぎるので、流す程度で見る。EXXX・・・は実際のIDに置き換える。
```shell-session
$ aws cloudfront get-distribution-config --id "EXXXXXXXXXXXXX"
```
<br>

- 事後コンフィグ取得
設定後にコンフィグを取ってテキストに残す。EXXX・・・は実際のIDに置き換え。
```shell-session
$ aws cloudfront get-distribution-config --id "EXXXXXXXXXXXXX" | jq '.DistributionConfig' > EXXXXXXXXXXXXX-after.conf
```
<br>

- コンフィグ差分比較
設定前後のコンフィグをdiffでコンペア。こちらで見れば、設定した箇所だけ変わっているかという観点と、他に設定してしまった部分がないかという観点で、網羅的にチェックできる。ここまでして初めて「設定しました、問題ないっす！」と言えるんだよ、後輩くん・・・。

```shell-session
$ diff EXXXXXXXXXXXXX-before.conf EXXXXXXXXXXXXX-after.conf
```
<br>


# まとめ
こんな感じで、なにごともバックアップとテキストに残すことはとっても大事。L7レベルの設定になるとどうしたって設定値は増えるんだから、これぐらいは当たり前にやっておきたいところ。

# 参考
先人への感謝もこめて、掲載。

sedコマンドでファイルを上書き編集
https://open-groove.net/linux-command/sed-edit-files/

aws-cli で CloudFront の設定を変更する。
https://blog.proudit.jp/2018/04/27/change-the-parameter-of-cloudfront-by-awscli.html

jqコマンドで指定したキーが特定の値を持つ配列のみキーの置換(書き換え)を行う
https://orebibou.com/ja/home/201604/20160423_001/

aws cli と jq コマンド
https://qiita.com/naokishi/items/f9d2f53bb103241b2817

jq で条件にマッチするデータ構造だけ出力する
https://blog.kyanny.me/entry/2014/05/28/030006