もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

コマンドでcloudFrontの狙ったファイルのキャッシュを削除

はじめに

こんばんは。

今回も短いですがあげます。

フリーランスでお仕事いただいているところでは 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"
        }
    }
}

終わりに

シェルスクリプトはいつまでたっても苦手です。