CloudFormationでクロスアカウントアクセスロールを作成してみた

2022.09.12

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ではなく、しっかりと必要な権限だけに絞ったものを作成するようにする必要があると思いました。