👾

GitHub Actions で S3 にファイルアップロードする

2024/03/22に公開

はじめに

設定ファイルなどを 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枚保存

リポジトリはこちら
https://github.com/Mo3g4u/github-actions-fileupload-to-s3

※実際に試す場合はご自身の GitHubユーザー名 / GitHubリポジトリ名 に置き換えてください

S3 バケットを準備します

今回は以下のバケットを作成しておきました。

  • リージョン: us-east-1
  • バケット名:github-actions-fileupload-to-s3

OIDC 用に ID プロバイダを作成します

次のサイトを参考に ID プロバイダを作成しておきます。
GitHub Actions で OIDC を使用して AWS 認証を行う
https://zenn.dev/kou_pg_0131/articles/gh-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 をつかったところで 権限エラーがでました。
つぎのページを見て解決しました。
https://repost.aws/ja/knowledge-center/s3-access-denied-listobjects-sync

aws sync--deleteをつけないとS3側のファイルが削除されませんでした。
それに合わせて当たり前ですが s3:DeleteObject も必要になりました。

最後に

わりと簡単にできることがわかりました。
私の今回の目的は設定ファイルのアップですが、S3 にサイトデータをアップするのにも使えますね!
どんどん自動化していこうと思います!

レスキューナウテックブログ

Discussion