⚖️
AWSとCircleCIをOIDCで連携するためのIAMロールの作成(CloudFormation)
概要
タイトルのまんまですが、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バケットが表示されることを確認できました。
参考
Discussion