LoginSignup
0
0

More than 1 year has passed since last update.

OpenID Connect & GitHubActionsでS3へデプロイ

Last updated at Posted at 2022-03-30

概要

  • 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への認証・デプロイが実現可能
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0