OpenID Connect & GitHubActionsでS3へデプロイ


概要

  • mainブランチにPushしたらS3へ自動にデプロイする
  • GitHub側にSecret変数でAWS認証キーを持たせたくない
  • 認証はOpenIDConnect認証の仕組みを利用
  • 権限は設定済のRoleに自動的に移譲される

前提

  • OpenIDConnectProvider認証可能な環境
    • 本投稿の環境は前記事であるこちらの続き
  • AWS環境は親アカウントと子アカウントからなるクロスアカウント
  • IAMでAssumeRole可能な環境
  • GitHubActionでCI可能な環境
  • S3が静的ホスティング可能な環境

詳細

ポリシー作成

  • 後で割り当てるロール用にポリシーを作成
  • 例としてサーバレス環境向けの権限をまとめたポリシーを作成
  • S3にデプロイするのでS3権限は付与しておくこと
  • ポリシー名は"hoge-dev-policy-lambda-oidc"とする
  • タグ作成はスキップ
  • ポリシー作成完了

ロール作成

  • ウェブアイデンティティを選択
  • アイデンティティプロバイダーは以前作成したものを選択
  • Audienceは"sts.amazonaws.com"を選択
  • 前段で作成したポリシーを選択
  • ロールの作成を完了する
  • 作成したロールのARNを控える

バケットポリシー作成

  • 公開状態にしておく
  • 以下のようにIPアドレス制限も設定しておく
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::dev-public-bucket/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "111.11.11.11/32",
                        "111.22.22.22/32",
                        "111.33.33.33/32"
                    ]
                }
            }
        }
    ]
}

workflow作成

  • "role-to-assume"には前段で控えたARNを入力
test-ci.yml
name: test-ci
on:
  push
env:
  BUCKET_NAME : test-public-bucket
  AWS_REGION : ap-northeast-1    
permissions:
      id-token: write
      contents: read
jobs:
  S3PackageUpload:
    runs-on: ubuntu-18.04
    steps:
      - name: Git clone the repository
        uses: actions/checkout@v1
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@master
        with:
          role-to-assume: arn:aws:iam::39**********:role/dev-role-oidc
          role-session-name: samplerolesession
          aws-region: ${{ env.AWS_REGION }}
      # Upload a file to AWS s3
      - name:  Copy documents to s3
        run: |
          aws s3 cp ./index.html s3://${{ env.BUCKET_NAME }}/

デプロイ

  • .github/workflows配下にworkflowファイルを配置
  • 同リポジトリ内のファイルを更新しCommit/Push
  • GitHubActions側で問題なく認証をパスし処理が実行される事を確認
  • S3にファイルがデプロイされている事を確認
  • S3プロパティから静的ホスティングのアドレスを確認
  • アクセス可能である事を確認

まとめ

  • このようにGitHubにSecretの変数で認証キーを持たせなくても、よりセキュアにGitHubからAWSへの認証・デプロイが実現可能