アクセスキーを使用せずに AWS CDK をデプロイするために OIDC プロバイダーを使用します。

Step 1. Identity providers を作成

  1. IAM > Identity providers ( ID プロバイダ) > Add provider
  2. 以下を入力:
    • Provider type: OpenID Connect
    • Provider URL: https://oidc.circleci.com/org/
    • Audience: ``
  3. Add provider をクリック

Step 2. IAM ロールを作成

ロール名:ExsampleDeployRole

  1. IAM > Roles > Create role
  2. Trusted entity type: Web Identity を選択
  3. 以下を入力:
    • Identity provider: oidc.circleci.com/org/
    • Audience: ``
  4. Next
  5. 権限を設定して作成

権限

CDK v2 の標準ブートストラップ(cdk bootstrap)済みの環境では、CI のロールに必要なのは cdk-* のブートストラップロール(deploy / file-publishing / image-publishing / lookup)への sts:AssumeRole です。実際のデプロイ処理(CloudFormation 操作など)はブートストラップロール側の権限で実行されるため、CloudFormationFullAccess や IAMFullAccess を CI ロールに付与する必要はありません。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::123456789012:role/cdk-*"
    }
  ]
}

cdk bootstrap 自体は CloudFormation / IAM / S3 / ECR / SSM などの権限が必要なため、管理者権限で別途実行します。
※ 動作確認の段階で一時的に AdministratorAccess を付与し、その後に上記のように絞り込む方法もありますが、AdministratorAccess のまま運用しないでください。

Trust policy で project を絞り込む

ウィザードで作成した trust policy は aud の条件のみで、CircleCI Organization 内のすべての project からこのロールを引き受けられます。作成後に Trust relationships を編集し、sub 条件で対象の project を絞ってください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.circleci.com/org/"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.circleci.com/org/:aud": ""
        },
        "StringLike": {
          "oidc.circleci.com/org/:sub": "org//project//user/*"
        }
      }
    }
  ]
}

Step 3. CircleCI の環境変数に以下を追加

Name Value
AWS_ROLE_ARN arn:aws:iam::123456789012:role/ExsampleDeployRole
AWS_ROLE_SESSION_NAME circleci-cdk-deploy

123456789012 は AWS アカウント ID のダミーです。実際の値に置き換えてください。