例えばこんなときに便利
- Web開発で画像などを
assets
やstatic
といった名前のディレクトリにまとめている - それらのファイルはS3でホスティングする
※S3のバケットを公開設定にして画像等をホスティングする想定ですが、もちろん公開設定にしないことも可能です。
Step.1 静的ファイルを1つのディレクトリにまとめる
- ホスティングするディレクトリ
static-files
を作成 - サンプル画像
yakiniku.jpg
を作成 - 例外的にアップロードしないサンプルファイル
README.md
を作成(任意) - GitHub Actionsのワークフローを書く
workflow.yml
を作成
tree.txt
your-project-dir
├── .github
│ └── workflows
│ └── workflow.yml
└── static-files
├── README.md
└── yakiniku.jpg
Step.2 事前準備
- GitHub Actions用のIAMユーザーを作成
- GitHubのSecretsに上記IAMユーザーのシークレットを登録
- S3のバケットを
projectname-static-files
という名前で作成(ホスティングする場合は公開設定にする)- S3のバケット名はグローバルでユニークにする必要がある(公式ドキュメント)
Step.3 GitHub Actionsのワークフローを書く
はじめに全体像を載せます。
.github/workflows/workflow.yml
name: s3-deploy-sample
on:
pull_request:
branches:
- master
types: [opened, synchronize, closed] #他のjobがある想定でこの設定にしている
jobs:
UploadStaticFiles:
name: Upload static files
if: github.event.pull_request.merged == true #マージされたときのみこのjobを実行する
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_DEV_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_DEV_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: S3 sync
working-directory: static-files
run: aws s3 sync . s3://projectname-static-files --delete --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --exclude "README.md"
AnotherJob:
# 以下省略
ポイント
実際にS3へアップロードしているの部分は以下です。
.github/workflows/workflow.yml
- name: S3 sync
working-directory: static-files
run: aws s3 sync . s3://projectname-static-files --delete --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --exclude "README.md"
working-directory
でカレントディレクトリをstatic-files
にした上で、
aws s3 sync
を使用してカレントディレクトリとバケットを同期させています。
※他のいくつかの記事(Google検索結果)ではaws s3 cp
を用いていますが、cpではファイルの追加はされますが、削除を行うことができません。
オプションの解説
-
--delete
は、バケットには存在するがディレクトリにはないファイルがあった場合に、バケットのファイルを削除する -
--grants {}
は、ファイルのアクセス権限を設定する- バケットの公開設定を変更しただけではファイルは公開されない。ファイルごとにアクセス権限を設定する必要がある
-
read=uri=http://acs.amazonaws.com/groups/global/AllUsers
はPublic Readにする定義済みURI(公式ドキュメントの「Amazon S3 の定義済みグループ」を参照)
-
--exclude {}
は、例外的にアップロードしないファイルを指定する
サンプルはこちら
類似の公開Action
AWSのクレデンシャルの設定とs3 syncをまとめて行うアクションが既に存在します。やってることはおそらくほぼ同じです。