はじめに
こんばんは。
今回も短いですがあげます。
今フリーランスでお仕事いただいているところでは CDNにCloudFrontを使用しています。
jsなりcssなりを上げた際に毎回キャッシュクリアしているのですが、 /css/*
とか /js/*
とかって感じでガッツリ全部キャッシュクリアしちゃっているようでした。
今回、なんとかうまく狙ったファイルだけクリアできないかなーと思い、頑張ってみました。
修正前までは、過去の負債で何故か、開発用レポジトリと、本番用レポジトリというように、2つのレポジトリがありました。
開発用レポジトリで js,css関連のbuildをおこなったり、相対パスをcloudfrontからの絶対パスに書き換えたりしたものを、まるママ rsyncで本番用に移すという力技で作っておりました。
そのさい、コピーするファイル群の中に、css, jsが存在していれば aws cloudfront create-invalidation
を叩いてキャッシュクリアしていました。
今回、そのあたりも一つのレポジトリに統一したので、若干アプローチが変わります。
本題
まず、必ずリリースタグを切るようにしたので、最新タグを取得するように git describe --tags
を利用します。
そして、git logをこねくり回して、「編集されたjs,cssファイル」を抜き出しました。
# distribution-id DISTRIBUTION_ID=********** # 最新tagを取得 GIT_LATEST_TAG=`git describe --tags` # CloudFront削除(CSS,JS) MODIFY_FILES=`git log --name-status -n 1 --oneline ${GIT_LATEST_TAG} | grep -E '(.js$|.css)' | grep -E '^M' | awk '{print $2}' | awk -F '/' '{print substr($0, 12)}'` if [ -n "$MODIFY_FILES" ]; then aws cloudfront create-invalidation --distribution-id $DISTRIBUTION_ID --paths $MODIFY_FILES fi
これで、今回反映予定で、修正があったjs,cssファイルだけをキャッシュクリアできます。
$ ./cloudfront.sh { "Location": "https://cloudfront.amazonaws.com/YYYY-MM-DD/distribution/XXXXXXXXXXX/invalidation/ZZZZZZZZZZZ", "Invalidation": { "Id": "ZZZZZZZZZZZ", "Status": "InProgress", "CreateTime": "2019-09-15T19:22:18.038Z", "InvalidationBatch": { "Paths": { "Quantity": 5, "Items": [ "/js/hoge.js", "/css/fuga.css", "/css/fuga/piyo.css", "/css/fugafuga/piyopiyo.css", "/css/hoge.css" ] }, "CallerReference": "cli-1111111111111-222222" } } }
終わりに
シェルスクリプトはいつまでたっても苦手です。