S3の静的ウェブサイトホスティングでGitHub ActionsのCI/CD環境を構築する
おはようございます。金山雄星です。
今回はGitHub Actionsを用いて、S3でホスティングをしているWEBサイトのソースコードがGitHubでマージされた時に自動デプロイする環境を構築する方法を解説します。
はじめに
サードパーティーのGithubアクションが公開されていたりしますが、
AWS公式から出ているこちらをもちいてAWS CLIを利用したいとおもいます。
今回の要件
静的WEBサイト(ビルド不要なHTML,CSS,JSで構成されたシンプルなWEBサイト)を、S3+CloudFront(+ACMでSSL化)の構成でホスティングしていることを想定しています。
GitHubのブランチとデプロイ環境の対応は以下の通りです。
・mainブランチ:本番環境(S3+CloudFront)
・developブランチ:ステージング環境(S3の静的ウェブサイトホスティング機能を利用)
各featureブランチで開発
↓
developブランチにマージ、ステージング環境に自動デプロイ
↓
ステージンク環境でテスト
↓
問題なければmainにマージ、本番環境に自動デプロイ
のシンプルな流れです。
GitHub Actionsを設定していく
これらの設定はGitHubのGUI上で可能です。
公式ドキュメントはこちら
https://docs.github.com/ja/actions
ymlファイルを作成
Actionsのページの「set up a workflow yourself」から下記の2つのファイルを作成してCommitしてください!
ステージング環境デプロイ用(deploy-staging.yml)
name: Deploy to Staging
on:
pull_request:
types:
- closed
branches:
- develop
jobs:
deploy:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
- name: Deploy to S3
run: |
aws s3 sync . s3://${{ vars.STAGING_BUCKET_NAME }} --delete --exclude ".git/*" --exclude ".github/*" --exclude ".gitignore" --exclude "README.md"
本番環境デプロイ用(deploy-production.yml)
name: Deploy to Production
on:
pull_request:
types:
- closed
branches:
- main
jobs:
deploy:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
- name: Deploy to S3
run: |
aws s3 sync . s3://${{ vars.PRODUCTION_BUCKET_NAME }} --delete --exclude ".git/*" --exclude ".github/*" --exclude ".gitignore" --exclude "README.md"
- name: Clear CloudFront cache
run: aws cloudfront create-invalidation --distribution-id ${{ vars.DISTRIBUTION_ID }} --paths "/*"
※ 以前、aws s3コマンドで --deleteのオプションをつけ忘れていてファイルがたまり続けていたことがあったので注意です💦
※ 「.」にしているディレクトリや --excludeオプションは適宜変更してください〜
環境変数を設定
GitHubの当該リポジトリのページの
Settings > Security(サイドバー) > Secrets and variables > Actions
で設定できます。
Secretsは一度登録したら見えなくなり、Variablesは登録しても内容が見えますし変更可能な仕様となっております。
今回は、AWSのクレデンシャルをSecretsに、バケット名などはVariablesに登録しましょう!
AWSのクレデンシャルを作成方法はこちらを参照
権限強めなポリシーはやめておいたほうがいいですね。
できれば、IAM ポリシーでS3のバケット限定に設定しましょう。
正しく設定できるとこんな感じ
これで、無事マージをトリガーにSTGと本番環境に自動デプロイできる設定が完了しました。
おわりに
CI/CDっていいですよね!!
FTPやSSHでscpする時間は、定期的にCSVをダウンロードしてエクセルに貼り付ける作業の次に、退屈な時間だとおもってます。この世からなくなったほうがいい。
調べたり実装したりしてる時間があったら手動でやったほうが早いんじゃないか?というツッコミはご勘弁を。。
以上、ギークかなやまがお送りしました。
お疲れ様でした!
金山雄星