この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
CloudFormationでクロスアカウントアクセスロールを作成する機会があったのでブログにまとめておきます。
クロスアカウントアクセスロールとは
クロスアカウントアクセスロールとはAWSアカウントAにあるIAMロールの権限をAWSアカウントBのIAMユーザが利用してアカウントAのリソースを操作するためのものになります。
メリットとしてはアカウントBにログインした状態からログアウトしてアカウントAにアクセスするといったことが不要になります。
IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任
マネジメントコンソールから作成する場合はIAMロールを作成する画面の「信頼されたエンティティタイプ」を選択して信頼するAWSアカウントIDを入力すると作成できます。
本題のCloudFormationテンプレート
今回作成したCloudFormationテンプレートは以下になります。
AWSTemplateFormatVersion: "2010-09-09"
Description: Cross Acount Access Role
Parameters:
# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------#
IamUserName:
Type: String
Description: IAM User Name
AWSAccountId:
Type: Number
Description: AWS AccountId
IamRoleName:
Type: String
Description: IAM Role Name
Resources:
# ------------------------------------------------------------#
# IAM
# ------------------------------------------------------------#
IamRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
AWS:
- !Join
- ''
- - 'arn:aws:iam::'
- !Ref AWSAccountId
- :user/
- !Ref IamUserName
Action:
- sts:AssumeRole
Condition:
Bool:
aws:MultiFactorAuthPresent: true
ManagedPolicyArns:
- arn:aws:iam::aws:policy/PowerUserAccess
RoleName: !Ref IamRoleName
テンプレート説明
以下の部分では作成するIAMロールを使用するIAMユーザ、AWSアカウントID、作成するIAMロール名をパラメータとして設定できるようにしています
Parameters:
# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------#
IamUserName:
Type: String
Description: IAM User Name
AWSAccountId:
Type: Number
Description: AWS AccountId
IamRoleName:
Type: String
Description: IAM Role Name
以下の部分では実際にIAMロールを作成しています。
AssumeRolePolicyDocumentでIAMロールを引き受けられる信頼されたAWSアカウントのIAMユーザを指定しています。
ManagedPolicyArnsでAWSマネージドポリシーを設定しています。今回はPowerUserAccessを設定しました。
Resources:
# ------------------------------------------------------------#
# IAM
# ------------------------------------------------------------#
IamRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
AWS:
- !Join
- ''
- - 'arn:aws:iam::'
- !Ref AWSAccountId
- :user/
- !Ref IamUserName
Action:
- sts:AssumeRole
Condition:
Bool:
aws:MultiFactorAuthPresent: true
ManagedPolicyArns:
- arn:aws:iam::aws:policy/PowerUserAccess
RoleName: !Ref IamRoleName
実際に作成してみる
今回はマネジメントコンソール上からではなくAWS CLIでCloudFormationスタックを作成してみました。
AWS CLIのインストールは以下のブログを参考にしてください。
ローカルのWindowsPCにAWS CLIをインストールしてみた
Windows10+WSL2環境のLinuxディストリビューションにAWS CLIをインストールしてみた
PowerShell上で以下のコマンドを実行します。
※IAMロールを作成するAWSアカウントはIAMユーザのあるAWSアカウントとは別のところになります。
aws cloudformation create-stack --stack-name CloudFormationスタック名 --template-body file://CloudFormationテンプレートファイル名 --parameters ParameterKey=IamUserName,ParameterValue=IAMユーザ名 ParameterKey=AWSAccountId,ParameterValue=信頼するAWSアカウントID ParameterKey=IamRoleName,ParameterValue=IAMロール名 --capabilities CAPABILITY_NAMED_IAM
IAM関連のリソースを作成するときはオプションで「--capabilities CAPABILITY_NAMED_IAM」を指定しないと以下のエラーが出力されます。
An error occurred (InsufficientCapabilitiesException) when calling the CreateStack operation: Requires capabilities : [CAPABILITY_NAMED_IAM]
create-stack
しばらく待つと作成が完了するのでアクセスしてみます。
IAMユーザのあるアカウントAのマネジメントコンソールにアクセスして画面右上にあるIAMユーザ名をクリックします。
クリックすると以下のものが表示されるのでロールの切り替えをクリックします。
クリックすると以下の画面に移動するので「アカウント」にIAMロールのあるAWSアカウントID、「ロール」に作成したIAMロール名、「表示名」に任意の表示名を入力してロールの切り替えをクリックするとAWSアカウントが切り替わります。
さいごに
クロスアカウントアクセスロールは便利な反面どの環境にアクセスしているのかわかりにくくなることがあります。
そのためIAMロールを作成する際は今回のようなPowerUserではなく、しっかりと必要な権限だけに絞ったものを作成するようにする必要があると思いました。