HCP Terraformのdynamic credentials用のAWS IAM RoleをAWS CloudFormationで作成してみた
HCP TerraformはIAM Role経由で、AWS認証情報を取得することができます。
今回はHCP Terraform用のIAM RoleをCloudFormationを使って作成してみました。
CloudFormationテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Description: 'HCP Terraform OIDC Provider and IAM Role'
Parameters:
HCPTerraformOrgName:
Type: String
Description: 'HCP Terraform Organization Name'
Resources:
HCPTerraformOIDCProvider:
Type: 'AWS::IAM::OIDCProvider'
Properties:
Url: 'https://app.terraform.io'
ClientIdList:
- 'aws.workload.identity'
HCPTerraformRole:
Type: 'AWS::IAM::Role'
Properties:
RoleName: 'hcp-tf-role'
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Federated: !GetAtt HCPTerraformOIDCProvider.Arn
Action: 'sts:AssumeRoleWithWebIdentity'
Condition:
StringEquals:
'app.terraform.io:aud': 'aws.workload.identity'
StringLike:
'app.terraform.io:sub': !Sub 'organization:${HCPTerraformOrgName}:project:*:workspace:*:run_phase:*'
HCPTerraformRolePolicyAttachment:
Type: 'AWS::IAM::RolePolicy'
Properties:
PolicyName: 'AdministratorAccess'
RoleName: !Ref HCPTerraformRole
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: '*'
Resource: '*'
Outputs:
RoleArn:
Description: 'ARN of the created IAM Role'
Value: !GetAtt HCPTerraformRole.Arn
OIDC Providerでは、エンドポイント検証用のサムプリントが必要です。
今回のようにCloudFormationテンプレート上でサムプリントを明示的に指定しなくても、自動的に値が設定されます。
今回は、OIDC ProviderとIAM Roleを1つのテンプレートで定義しました。
1つのAWSアカウント上にIAM Roleを複数作るパターンもあると思います。
チーム構成や設計によっては、IAM RoleとOIDC Providerでスタックを分けたほうが管理はしやすいかもしれません。
AWS::IAM::Role
のStringLike
の部分で、このIAM Roleを引き受けるProject・Workspace・Run Phaseも指定できます。
お好みで、この部分をParameters
にしても良いかもしれませんね。
動作確認
CloudFormationテンプレートからスタックを作成するとIAM Roleが作成されます。
IAM RoleのARNをHCP Terraformにセットするため控えておいてください。(スタックのOutputsからも確認できます。)
以下を参考にProject・Workspace・Variable setsを作成します。
05_04_tfc_github_deploy
WorkspaceのVariablesに、IAM Role ARNを設定しました。
Plan・Applyが成功することも確認できました。
おわりに
CloudFormationでHCP Terraform用のIAM Roleを作成してみました。
今回のテンプレートにCloudFormation StackSetsを組み合わせて、マルチアカウント環境にIAM Roleを作成する記事を書いてみようと思います。
以上、AWS事業本部の佐藤(@chari7311)でした。