CircleCIのOpenIdConnectProviderを信頼するRoleをCDKで作成する

CircleCIのOpenIdConnectProviderを信頼するRoleをCDKで作成する
2022.07.07

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

↓こちらで作成しているOIDCProviderとIAM RoleをCDKで作成してみました。

CircleCIがOpenID ConnectをサポートしたのでAWSと連携させてJWTを使用したAssumeRoleを試してみた

CDKの中身

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

const CIRCLECI_ORGANIZATION_ID = "CircleCIのORGANIZATIONのID";
const CIRCLECI_PROJECT_ID = "CircleCIのPROJECTのID"
// id providerがcircleciである場合常にこのthumbprintを使う
const CIRCLECI_THUMBPRINT = "9e99a48a9960b14926bb7f3b02e22da2b0ab7280"

/**
 * CircleCIのOIDC認証を用いてdocsのデプロイを行うIAM Roleを作成する
 */
export class RoleStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const oidcProvider = new iam.OpenIdConnectProvider(this, "CircleCiOidcProvider", {
      url: `https://oidc.circleci.com/org/${CIRCLECI_ORGANIZATION_ID}`,
      clientIds: [CIRCLECI_ORGANIZATION_ID],
      thumbprints: [CIRCLECI_THUMBPRINT],
    });

    const role = new iam.Role(this, "DeployRole", {
      roleName: `circleci-deploy-role`,
      assumedBy: new iam.OpenIdConnectPrincipal(oidcProvider, {
        StringLike: {
          [`oidc.circleci.com/org/${CIRCLECI_ORGANIZATION_ID}:sub`]: [
            `org/${CIRCLECI_ORGANIZATION_ID}/project/${CIRCLECI_PROJECT_ID}/user/*`
          ]
        }
      })
      // 必要な権限を足してね。
    });
  }
}

CIRCLECI_ORGANIZATION_IDCIRCLECI_PROJECT_IDと、roleに付ける権限が変数で、他はテンプレとして使える!