⚖️

AWSとCircleCIをOIDCで連携するためのIAMロールの作成(CloudFormation)

2023/08/17に公開

概要

タイトルのまんまですが、AWSとCircleCIをOIDCで連携する際に手動でIAMロールを作るのは手間なので、CloudFormationで作成できるようにしてみました。

IAMロール作成手順

IAMロール作成用のCFnテンプレートファイル作成

以下のCloudFormationテンプレートのymlファイルを作成しました。
パラメータは以下の2つを設定します。

  • CircleciOrgId
    • CircleCIのOrganization ID
  • CircleciProjectId
    • CircleCIのProject ID
OIDC.yml
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  CircleciOrgId:
    Type: String
  CircleciProjectId:
    Type: String

Resources:
  CircleciRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: CircleciRole
      ManagedPolicyArns: [arn:aws:iam::aws:policy/ReadOnlyAccess]
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Action: sts:AssumeRoleWithWebIdentity
            Principal:
              Federated: !Ref CircleciOidc
            Condition:
              StringLike:
                oidc.circleci.com/org/${CircleCIのOrganization ID}:sub: !Sub 'org/${CircleciOrgId}/project/${CircleciProjectId}/user/*'

  CircleciOidc:
    Type: AWS::IAM::OIDCProvider
    Properties:
      Url: !Sub 'https://oidc.circleci.com/org/${CircleciOrgId}'
      ThumbprintList: 
        - 9e99a48a9960b14926bb7f3b02e22da2b0ab7280
      ClientIdList: 
        - !Ref CircleciOrgId

以下のConditionの${CircleCIのOrganization ID}は、CircleciOrgIdに指定したOrganization IDを指定します。
ここも変数にできれば再利用性を高められたのですが、実現方法がわからず。。。

            Condition:
              StringLike:
                oidc.circleci.com/org/${CircleCIのOrganization ID}:sub: !Sub 'org/${CircleciOrgId}/project/${CircleciProjectId}/user/*'

CFnの実行

お好みの方法でCFnを実行して、IAMロールを作成します。

動作確認

作成したIAMロールを使用してCircleCIからAWSにアクセス可能か確認します。

環境変数の設定

CircleCIとAWSを連携させるためのIAMロールを使用する際に、CircleCIのOrbsのcircleci/aws-cli@4.0.0を使用します。
連携させるためにはIAMロールのARNが必要なので、CircleCIのプロジェクトの環境変数にAWS_OIDC_ROLE_ARN環境変数を設定します。

.circleci/config.yml

動作確認のために以下のconfig.ymlを作成し、CircleCIでS3バケットを表示できるか確認します。

.circleci/config.yml
version: 2.1

orbs:
  aws-cli: circleci/aws-cli@4.0.0

jobs:
  s3ls:
    executor: aws-cli/default
    steps:
      - aws-cli/install
      - aws-cli/assume_role_with_web_identity:
          role_arn: $AWS_OIDC_ROLE_ARN
      - run: aws s3 ls s3://

workflows:
  oidc-test:
    jobs:
      - s3ls

以下のrole_arnの部分で設定したAWS_OIDC_ROLE_ARN環境変数を使用します。

      - aws-cli/assume_role_with_web_identity:
          role_arn: $AWS_OIDC_ROLE_ARN

確認結果

S3バケットが表示されることを確認できました。

参考

https://zenn.dev/kou_pg_0131/articles/circleci-oidc-aws
https://zenn.dev/kangaechu/articles/circleci-oidc
https://qiita.com/minamijoyo/items/eac99e4b1ca0926c4310
https://dev.classmethod.jp/articles/github-actions-issuerurl-and-audience/
https://devops-blog.virtualtech.jp/entry/20230614/1686710819

Discussion