🐙

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

2022/08/04に公開約2,100字

Github ActionsでS3にファイルをアップする必要があったので調べた。
GithubのSecretに色々なキーを設定してやるのかと思っていが、その必要もなくAWS側で設定を行うことで可能だということがわかった。

https://dev.classmethod.jp/articles/github-actions-aws-sts-credentials-iamrole/

IAMユーザーで発行したクレデンシャルは永続的に利用可能です。
GitHubではAWSのクレデンシャルをSecretsにより秘匿化できますが、AWS外のサービスに永続的なクレデンシャルを設定するのは、セキュリティや運用で課題になることが多いです。

AWSの内外問わず、AWSクレデンシャルの直接的な設定を可能な限り避けるのが基本的な考え方です。そのため、IAMロールの一時的なクレデンシャルを利用できないかを最初に検討する必要があります。

ほぼこの記事のままやっていけばOK。
やることはこんな感じ

  • OIDCプロバイダ追加
  • IAMロール作成
  • GitHub Actionsワークフロー作成

OIDCプロバイダ追加

OIDCのプロバイダを設定することでSecretをGithubに設定しなくても良くなるらしいが、そもそもこの仕組みは何か?

https://github.blog/2021-11-23-secure-deployments-openid-connect-github-actions-generally-available/
OIDCを使わないと、Githubに永続的に使用できるtoken等を設定しないといけないが、この仕組みであれば存続期間が短いtokenをGithub Actionsを実行した時のみに発行して使うからセキュリティ的に良いということかな。

IAMロール作成

作成したOIDCプロバイダにロールを割り当てる。
Github Actionsで行いたい操作の権限を持つIAMロールを作成することで紐づけることができる。
作成したIAMロールの「信頼関係の編集」を行うことで使用したいGithubリポジトリとの信頼関係を設定する。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<AWSアカウントID>:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザー名>/<GitHubリポジトリ名>:*"
                }
            }
        }
    ]
}

このConditionに記述する内容でどのリポジトリからアクセスできるのかを設定しているっぽい。

Github Actionsのワークフロー作成

AWSと関係のあるところを抜粋。
自分はpermissionsの設定を忘れてエラーが出て困った。。

 permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v2
      - name: Configure AWS credentials from IAM Role
        uses: aws-actions/configure-aws-credentials@master
        with:
          role-to-assume: <設定したロール>
          aws-region: ap-northeast-1
            - name: Upload to s3
        run: |
          aws s3 sync <アップしたいフォルダ> <S3のバケット>

Discussion

ログインするとコメントできます