はじめに
こんにちは、Gakken LEAPのバックエンドエンジニアのmizunoです。
サイトのリリース時、GitHub ActionsからCloudFrontのキャッシュ削除を行っていたのですが、ファイルが古いまま表示される問題が発生しました。
原因を調査したところ、AWS CLIのコマンド実行時にワイルドカードの扱いが正しくなかったことが判明しました。
問題の詳細
GitHub Actionsのワークフローで、以下のコマンドを実行していました。
env:
CLOUDFRONT_DISTRIBUTION_ID: "CLOUDFRONT_DISTRIBUTION_ID"
CLOUDFRONT_TARGET_PATH: "/*"
jobs:
upload:
runs-on: ubuntu-latest
steps:
# ... (他の処理) ...
- name: Delete Cloudfront Cache
run: aws cloudfront create-invalidation --distribution-id $CLOUDFRONT_DISTRIBUTION_ID --paths $CLOUDFRONT_TARGET_PATH
しかし、この設定ではキャッシュが正しく削除されず、リリース後も古いコンテンツが表示されることがありました。
原因
原因は、AWS CLIのドキュメントに記載されている通り、ワイルドカードを含むパスを引用符で囲む必要があったためです。
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Invalidation_Requests.html
ファイルの無効化にAWS Command Line Interface (AWS CLI) を使用し、* ワイルドカードが含まれるパスを指定する場合は、以下の例のようにパスを引用符 (") で囲む必要があります。
aws cloudfront create-invalidation --distribution-id distribution_ID --paths "/*"
環境変数を展開した結果、コマンドが以下のようになっていました。
aws cloudfront create-invalidation --distribution-id distribution_ID --paths /*
シェルがワイルドカードを解釈してしまい、CloudFrontに意図したパスが渡らなかったため、キャッシュ削除が失敗していました。
修正方法
環境変数の使用を止め、直接コマンド内に引用符で囲んだパスを指定するように修正しました。
env:
CLOUDFRONT_DISTRIBUTION_ID: "CLOUDFRONT_DISTRIBUTION_ID"
jobs:
upload:
runs-on: ubuntu-latest
steps:
# ... (他の処理) ...
- name: Delete Cloudfront Cache
run: aws cloudfront create-invalidation --distribution-id $CLOUDFRONT_DISTRIBUTION_ID --paths "/*"
これにより、シェルがワイルドカードを解釈する前に、CloudFrontに正しいパスが渡されるようになり、キャッシュ削除が成功しました。
まとめ
今回の問題から、以下の教訓が得られました。
- 環境変数を扱う際は、展開される値を確認する
- AWS CLIのドキュメントをよく読む
これらの教訓を活かし、今後の開発に役立てていきたいと思います。
エンジニア募集
Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています!!
ぜひお気軽にカジュアル面談へお越しください!!