AWS CDKで Github ActionsのOIDC連携用のIAM Roleを作成する

AWS CDKで Github ActionsのOIDC連携用のIAM Roleを作成する方法です。
2022.06.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「Github ActionsのOIDC連携用のIAM RoleもCDKで設定したい。。」

Github ActionsでIAM Roleを使って、認証できるの嬉しいですよね。

AWS CDKでGithub ActionsのOIDC連携用のIAM Roleを作ってみました。 ConstrutHubにライブラリがあったので、併せて紹介します。

aws-cdk-github-oidc 2.2.1 - Construct Hub

やってみた

AWS CDKの用意

import { Stack, StackProps, Duration } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as iam from 'aws-cdk-lib/aws-iam';

export class GithubActionsOidcStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const provider = new iam.OpenIdConnectProvider(this, 'Provider', {
      url: 'https://token.actions.githubusercontent.com',
      clientIds: ['sts.amazonaws.com'],
    });
    const role = new iam.Role(this, 'Role', {
      roleName: 'DeployRole',
      maxSessionDuration: Duration.hours(2),
      assumedBy: new iam.WebIdentityPrincipal(provider.openIdConnectProviderArn, {
        StringEquals: {
          ['token.actions.githubusercontent.com:aud']: 'sts.amazonaws.com',
        },
        StringLike: {
          ['token.actions.githubusercontent.com:sub']: 'repo:octo-org/octo-repo:*',
        },
      }),
    });
    role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AdministratorAccess'));
  }
}

注意点としては、IAMのConditionでリポジトリ名を指定しているのところです。(StringLike)

公式ドキュメントでは、StringEquals を使用しています。 以下、引用。

"Condition": {
  "StringEquals": {
    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
    "token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:ref:refs/heads/octo-branch"
  }
}

今回のようにワイルドカード('repo:octo-org/octo-repo:*')を使用する場合は、StringLikeを使用する必要があります。

動作確認

適当なworkflowsファイルを用意して、GithubActionsを実行します。

事前にリポジトリのシークレットにIAMロールのARNを登録する必要があります。 以下の記事がわかりやすいです。

.github/workflows/test.yaml

name: test

on:
  push:

jobs:
  deploy:
    name: List to Amazon S3
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Configure AWS credentials from Test account
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME_TEST }}
          aws-region: ap-northeast-1

      - name: Copy files to the test website with the AWS CLI
        run: |
          aws s3 ls

Github上から確認すると、正常に動作しました。

iam role gh

aws-cdk-github-oidcを使ってみる

OIDCのIAMロールを作成するConstruct Libraryを使うと以下のように書けます。

aws-cdk-github-oidc

import { Stack, StackProps, Duration } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { GithubActionsIdentityProvider, GithubActionsRole } from 'aws-cdk-github-oidc';
import * as iam from 'aws-cdk-lib/aws-iam';

export class GithubActionsOidcStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const provider = new GithubActionsIdentityProvider(this, 'GithubProvider');
    const role = new GithubActionsRole(this, 'DeployRole', {
      provider: provider,
      owner: 'octo-org',
      repo: 'octo-repo',
      roleName: 'DeployRole',
      maxSessionDuration: Duration.hours(2),
    });

    role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AdministratorAccess'));
  }
}

おわりに

Github ActionsのOIDC連携用のIAM RoleもAWS CDKで作ってみました。

実施する頻度は多くないかもしれませんが、設定項目が多く手動だと面倒なのでコード化しておくと便利かもしれません。