👾
GitHub Actions で S3 にファイルアップロードする
はじめに
設定ファイルなどを S3 にアップロードすることが多くなり、面倒になってきています・・・。
そこで GitHub にファイルをマージした時に自動でアップロードしたくなったのでちょっと試してみました。
今回の構成はこちら
├── .github
│ └── workflows
│ └── upload-to-s3.yaml
├── README.md
├── images
│ ├── sampleA.webp
│ └── sampleB.webp
└── sample.html
sample.html
<!DOCTYPE html>
<html>
<head>
<title>Sample HTML Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>This is a sample HTML page.</p>
</body>
</html>
images には適当にChatGPTで生成した画像を2枚保存
リポジトリはこちら
※実際に試す場合はご自身の GitHubユーザー名 / GitHubリポジトリ名 に置き換えてください
S3 バケットを準備します
今回は以下のバケットを作成しておきました。
- リージョン: us-east-1
- バケット名:github-actions-fileupload-to-s3
OIDC 用に ID プロバイダを作成します
次のサイトを参考に ID プロバイダを作成しておきます。
GitHub Actions で OIDC を使用して AWS 認証を行う
今回用のロールを作成します
ロール名:github-actions-fileupload-to-s3
信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<AWSアカウントID>:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:Mo3g4u/github-actions-fileupload-to-s3:*"
}
}
}
]
}
カスタマーインラインでポリシーを追加
許可
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::github-actions-fileupload-to-s3",
"arn:aws:s3:::github-actions-fileupload-to-s3/*"
]
}
]
}
GitHub Actions を作成します
- main ブランチにプッシュされた場合に実行されるようにしています
- OIDC で認証しています
- sample.html は cp でアップロードしてみました
- images は sync でファイルを同期してみました
-
--delete
をつけることでファイルが無くなった場合にS3から削除してくれるようになります
-
-
AWS_ROLE_TO_ASSUME
には作成したロールの ARN を入れておきます。 -
AWS_REGION
は今回 us-east-1 を入れておきます。
upload-to-s3.yaml
name: Upload to S3
on:
push:
branches:
- main
permissions:
id-token: write
contents: read
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Upload to S3
run: |
aws s3 cp sample.html s3://github-actions-fileupload-to-s3/sample.html
- name: Sync images folder to S3
run: |
aws s3 sync images s3://github-actions-fileupload-to-s3/images --delete
あとは main に push したら GitHub Actions が動き出してくれます。
ちょっとつまずいたところ
aws sync
をつかったところで 権限エラーがでました。
つぎのページを見て解決しました。
aws sync
に--delete
をつけないとS3側のファイルが削除されませんでした。
それに合わせて当たり前ですが s3:DeleteObject
も必要になりました。
最後に
わりと簡単にできることがわかりました。
私の今回の目的は設定ファイルのアップですが、S3 にサイトデータをアップするのにも使えますね!
どんどん自動化していこうと思います!
Discussion