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