🐙

GitHub ActionsからAWSへの認証をOIDCで実現する

2024/05/01に公開

動機

何を今更、って感じだし、何回かやってる作業だけれど毎回忘れちゃうので備忘録的に。
なぜやるのか、とかどういう仕組みなのか、は世界にいっぱい情報が転がっているので具体的な作業で行ったもののみを残す。
公式ドキュメントを読むのが苦手な人の役にでも立てば。

リソース

作業

AWS側での作業

ざっくりやることはIdPの追加とIAM Roleの作成

  1. IAMのメニューにある「IDプロバイダ」からIdPの追加を行う

    • プロバイダのURLは https://token.actions.githubusercontent.com を指定
    • 対象者には sts.amazonaws.com を指定
    • サムプリントも取得しておこう
  2. IAM Roleを作成する

    • エンティティタイプは「ウェブアイデンティティ」にするとIdPのコンボボックスが出るので、先ほど追加した token.actions.githubusercontent.com を選択する
    • Audience」も同様に sts.amazonaws.com を選択する
    • そのほかのGitHub組織やリポジトリ・ブランチなどは、公開範囲の設定なのでActionsがあるリポジトリ・ブランチを入力する
    • 次にポリシーを選択する。最小権限の原則にしたがって、Deployするリソースに必要な最低限の権限を選択する
    • 最後にRoleの名前などを適切に整えればおしまい
    • もし2つ以上のリポジトリで同じRoleを使いたかったら、信頼ポリシーに書かれている以下の記述が配列なので作成後に編集すれば良い
{
    "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:*",
                    ]
                }
            }
        }
    ]
}
  1. 後続の作業に必要なので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