🐙
GitHub ActionsからAWSへの認証をOIDCで実現する
動機
何を今更、って感じだし、何回かやってる作業だけれど毎回忘れちゃうので備忘録的に。
なぜやるのか、とかどういう仕組みなのか、は世界にいっぱい情報が転がっているので具体的な作業で行ったもののみを残す。
公式ドキュメントを読むのが苦手な人の役にでも立てば。
リソース
- GitHub側の設定について
- AWS側の設定について
作業
AWS側での作業
ざっくりやることはIdPの追加とIAM Roleの作成
-
IAMのメニューにある「IDプロバイダ」からIdPの追加を行う
- プロバイダのURLは
https://token.actions.githubusercontent.com
を指定 - 対象者には
sts.amazonaws.com
を指定 - サムプリントも取得しておこう
- プロバイダのURLは
-
IAM Roleを作成する
- エンティティタイプは「ウェブアイデンティティ」にするとIdPのコンボボックスが出るので、先ほど追加した
token.actions.githubusercontent.com
を選択する - 「
Audience
」も同様にsts.amazonaws.com
を選択する - そのほかのGitHub組織やリポジトリ・ブランチなどは、公開範囲の設定なのでActionsがあるリポジトリ・ブランチを入力する
- 次にポリシーを選択する。最小権限の原則にしたがって、Deployするリソースに必要な最低限の権限を選択する
- 最後にRoleの名前などを適切に整えればおしまい
- もし2つ以上のリポジトリで同じRoleを使いたかったら、信頼ポリシーに書かれている以下の記述が配列なので作成後に編集すれば良い
- エンティティタイプは「ウェブアイデンティティ」にするとIdPのコンボボックスが出るので、先ほど追加した
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRoleWithWebIdentity",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
},
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": [
"sts.amazonaws.com"
]
},
"StringLike": {
"token.actions.githubusercontent.com:sub": [
- "repo:anizozina/eks-entry:*"
+ "repo:anizozina/eks-entry:*",
+ "repo:anizozina/eks-entry-2:*",
]
}
}
}
]
}
- 後続の作業に必要なのでARNをコピーしておく
GitHub側での作業
ざっくりやることはGitHub Actionsで使用するWorkflowの実装のみ。
例えば以下のようになる
name: Check terraform
on:
workflow_dispatch:
pull_request:
branches:
- main
paths:
- '.github/workflows/terraform-check.yml'
- 'infrastructures/**'
permissions:
pull-requests: write
id-token: write
contents: read
jobs:
plan:
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: ./infrastructures
steps:
- name: Checkout
uses: actions/checkout@v3
- uses: hashicorp/setup-terraform@v2
with:
terraform_version: 1.4.6
- name: Configure AWS Credentials for China region audience
uses: aws-actions/configure-aws-credentials@v4
with:
audience: sts.amazonaws.com
aws-region: ap-northeast-1
role-to-assume: arn:aws:iam::123456789012:role/GitHubActions_OIDC
- name: Init
run: terraform init -reconfigure -backend-config dev/terraform.backend
- name: Plan
id: plan
run: terraform plan -var-file dev/terraform.tfvars -no-color
continue-on-error: true
- name: Comment PR
uses: thollander/actions-comment-pull-request@v2
with:
message: |
### Terraform Plan Result
```
${{ steps.plan.outputs.stdout }}
```
comment_tag: execution
mode: upsert
pr_number: context.issue.number
これはTerraformのPlanをPRに残すワークフロー。
大事なのは以下の2つ
- permissionの指定
- IAM RoleのAssume
GitHub ActionsからID Tokenの発行を依頼する必要があるため id-token を write する権限が必要になる。
コードでは以下で表現されている
permissions:
pull-requests: write
id-token: write
contents: read
IAM RoleのAssumeは自前で書くと面倒なので社内規定で許されていればサードパーティのActionsを使う
コードでは以下で表現されている
- name: Configure AWS Credentials for China region audience
uses: aws-actions/configure-aws-credentials@v4
with:
audience: sts.amazonaws.com
aws-region: ap-northeast-1
role-to-assume: arn:aws:iam::123456789012:role/GitHubActions_OIDC
終わりに
OIDCで安全に、楽に、Actionsを動かせるようにしよう〜 👏
Discussion