cloudfrontのキャッシュクリア、よく忘れます。
デプロイした後にawsにログインしてポチポチやるでもいいですが、自動化しましょう。
ギークフィードではwordpressのデプロイにwordmoveというオープンソースを利用しています。
また、cloudfrontを利用して負荷をかけずに高速化をしています。
詳しくは以下の社長ブログからどうぞ。
WordPressで構築されているウェブサイトにCloudFrontを立てて高速化&セキュリティ強化①
WordPressで構築されているウェブサイトにCloudFrontを立てて高速化&セキュリティ強化②
目次
環境
簡単に環境の構成図と今回の完成予想をまとめてみました。
今回はデプロイした際にオレンジ線のキャッシュクリアが実行されるようにしてみます。
図にあるように、ギークのwordpressはバーチャルホストをきって複数サイトを運用しているため、
特定のサイトをデプロイした際にどのcloudfrontディストリビューションのキャッシュをクリアするかを判別する必要があります。
IAMユーザー、ポリシーの作成
wordpress開発環境でawscliを使用するためにIAMユーザーとポリシーを作成します。
IAMユーザー
ユーザー名:cli_wordpress_dev
アクセスキー、シークレットアクセスキーを作成
IAMポリシー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "cloudfront:ListDistributions", "cloudfront:CreateInvalidation" ], "Resource": "*", "Condition": { "IpAddress": { "aws:SourceIp": "xxx.xxx.xxx.xxx/32" } } } ] } |
必要最低限のポリシーを設定し、一応リソース制限としてwordpress開発サーバーのIPを指定しています。
スクリプトの作成
作成したスクリプトは以下です。
wordmove実行時のpathから対象のwordpressプロファイルを特定し、プロファイル名を含むCNAMEを持つディストリビューションのキャッシュをすべてクリアします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/bin/bash # pathからプロファイル名を取得 path=$(pwd) path_list=(${path//\// }) profile=${path_list[-2]} # ディストリビューションidを取得 distributions=$(aws cloudfront list-distributions) items=$(echo $distributions | jq '.DistributionList.Items') len=$(echo $items | jq length) for i in $( seq 0 $(($len - 1)) ); do row=$(echo $items | jq .[$i]) # 有効になっていないディストリビューションは無視 is_enabled=$(echo $row | jq -r '.Enabled') if [ $is_enabled == 'false' ]; then continue fi # CNAMEにプロファイル名が含まれているか cname=$(echo $row | jq -r '.AliasICPRecordals[].CNAME') if [ ! $(echo $cname | grep $profile) ]; then continue fi distribution_id=$(echo $row | jq -r '.Id') done # invalidation実行 aws cloudfront create-invalidation --distribution-id $distribution_id \ --paths '/*' |
ディストリビューションidの取得について
aws cloudfront list-distributions
を実行すると、結果は以下のようなjsonで返ってきます。(本当はもっと大量に出てきますが不要な情報はすべて消しています)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
{ "DistributionList": { "Items": [ { "Enabled": true, "AliasICPRecordals": [ { "CNAME": "www.youwire.jp", "ICPRecordalStatus": "APPROVED" } ], "Id": "E12O08XXXXXXXX" }, { "Enabled": true, "AliasICPRecordals": [ { "CNAME": "www.geekfeed.co.jp", "ICPRecordalStatus": "APPROVED" } ], "Id": "E24846XXXXXXXX" }, { "Enabled": false, "AliasICPRecordals": [ { "CNAME": "cfgeekfeed.geekdev.tokyo", "ICPRecordalStatus": "APPROVED" } ], "Id": "E319WEXXXXXXXX" } ] } } |
Items以下のjson配列をループしています。
Enabledはそのディストリビューションが有効かどうかを表しており、有効になっていないものはid検索から除外しています。
jqコマンドで値を取得するとき、「-r」オプションをつけることでダブルクオーテーションを排除することができます。
awsコマンドについて
今回はすべてのキャッシュをクリアするので、この部分は簡単です。’/*’で全指定できます。
サイトごとに異なるpathのキャッシュを削除したい場合は、それぞれ専用のjsonオブジェクトを作成し、
「–invalidation-batch」オプションを使用すると実現できます。
実行してみる
実行してみるとアウトプットは以下のような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[kusanagi@kusanagi71 DocumentRoot]$ ./create_invalidation.sh { "Invalidation": { "Status": "InProgress", "InvalidationBatch": { "Paths": { "Items": [ "/*" ], "Quantity": 1 }, "CallerReference": "cli-1571728991-843434" }, "Id": "IYZJ7HO0UNVU7", "CreateTime": "2019-10-22T07:23:12.570Z" }, "Location": "https://cloudfront.amazonaws.com/2019-03-26/distribution/E24846XXXXXXXX/invalidation/IYZJ7HO0UNVU7" } |
実行後にAWSのコンソールで確認してみるとこんな感じです。
キャッシュクリアが行われていることがわかります。
自動化する
あとはwordmove実行をトリガーとして上記スクリプトを実行すればOKです。
今回はaliasを使って行うことにしました。
~/.bash_profileに以下を追記します。
1 |
alias wordmove_push='wordmove push --all && ~/create_invalidation.sh' |
以前とは若干コマンドが変わってしまいますが、wordmoveを実行する際にpushとpullの間違いがたまーに発生していたので、それも防げるということでOKでしょう。
おわりに
まとめ
・忘れやすいキャッシュクリアは自動化しよう
・ディストリビューションidの特定はjqコマンドでがんばろう
・すべてのキャッシュクリアをする場合は’/*’で指定できるよ
感想
こういったちょっとした作業も自動化できると、ミスも減りますし楽できていいですね。
次回はもうちょっと面白い内容の記事をかけたらいいっすね。
- AWS Step Functionsの基本を再学習しました - 2024-09-23
- Amazon SESでバウンスメールを管理する - 2024-07-07
- TEAMをv1.1.1にアップデートしカスタムドメインを設定する - 2024-02-17
- コールセンター白書2023とAmazon Connect - 2023-12-25
- Provide dynamic and personalized CX with in-app web call for Amazon Connect - 2023-12-16