
AWS DevOps Agent スペースのセカンダリソースの追加に必要な IAM ロールを CloudFormation StackSets で作成してみた
AWS DevOps Agent で AWS Organizations 配下のアカウントを調査したく、セカンダリソースのアカウントとして組織配下のアカウントを追加するために必要な IAM ロールを CloudFormation StackSets で展開してみました。

CloudFormation StackSets で IAM ロールを作成してみた
DevOps Agent スペースを作成した後に、セカンダリソースのアカウントを追加しようとする際に出力される IAM ロールの情報を参考に CloudFormation テンプレートを作成します。現時点では設定しませんが、下記のセカンダリソース追加画面よりロール名に任意の名前を指定できることも分かります。そのため、後述するテンプレートではロール名をパラメータ化して任意の名前を付与できるようにしています。

上記の情報を参考にして作成した StackSets で展開する CloudFormation テンプレートの一例です。
AWSTemplateFormatVersion: '2010-09-09'
Description: AWS DevOps Agent IAM Role
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: DevOpsAgent
Parameters:
- AgentSpaceArn
- PrimaryAccountId
- Label:
default: Role
Parameters:
- RoleName
Parameters:
AgentSpaceArn:
Type: String
Description: Agent space ARN
PrimaryAccountId:
Type: String
Description: Primary AWS account id
AllowedPattern: '^\d{12}$'
RoleName:
Type: String
Description: IAM role name
Resources:
DevOpsAgentSecondaryAccountRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Ref RoleName
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: aidevops.amazonaws.com
Action: sts:AssumeRole
Condition:
StringEquals:
aws:SourceAccount: !Ref PrimaryAccountId
aws:SourceArn: !Ref AgentSpaceArn
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AIDevOpsAgentAccessPolicy
Policies:
- PolicyName: AllowCreateServiceLinkedRoles
PolicyDocument:
Version: '2012-10-17'
Statement:
- Sid: AllowCreateServiceLinkedRoles
Effect: Allow
Action:
- iam:CreateServiceLinkedRole
Resource:
- !Sub 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/resource-explorer-2.amazonaws.com/AWSServiceRoleForResourceExplorer'
パラメータとして下記を指定します。
| パラメータ名 | 説明 | 設定例 |
|---|---|---|
| AgentSpaceArn | DevOps Agent スペースの ARN | arn:aws:aidevops:ap-northeast-1:111122223333:agentspace/f1cc5a85-9974-4099-b788-147f6example |
| PrimaryAccountId | DevOps Agent スペースのプライマリソースのアカウント ID | 111122223333 |
| RoleName | DevOps Agent がクロスアカウントアクセスするために利用する IAM ロールの名前 | aws-devops-agent-role |
管理アカウントまたは CloudFormation StackSets の委任先アカウントにおいて、[CloudFormation] > [StackSets] > [スタックセットを作成] から StackSets を作成します。
ステップ 2 のパラメータは下記のイメージで指定します。

ステップ 4 において、今回は組織全体を対象にデプロイします。また、リージョンの指定は IAM ロールがグローバルリソースであることから、どこか 1 つのリージョンの指定でよいため、東京リージョンを指定します。

そのまま進めて StackSets 展開完了後に改めて DevOps Agent スペースを作成したアカウントに戻り、セカンダリソースのアカウントを追加してみます。セカンダリソースとして追加するのは、上記の StackSets で IAM ロールを展開しているアカウントです。

ステップ 1 はそのまま「次へ」で進んでも問題ないです。

ステップ 2 において、アカウント ID は追加したいセカンダリのアカウント ID を指定します。ロール名は StackSets のパラメータで指定したロール名を入力します。なお、ステップ 1 で先にロール名を修正している場合は、ステップ 2 では自動的にステップ 1 で変更したロール名が入力されていました。

追加を実行すると、問題なく追加できました。

後は同じ要領で必要なセカンダリアカウントを追加していきます。
さいごに
AWS Organizations 全体のアカウントを対象とした AWS DevOps Agent スペースを検証環境で作成したく、セカンダリソースのアカウントにおいて必要な IAM ロールの作成を CloudFormation で作成してみました。AWS CDK でさらに効率的に環境を構築する方法も下記ブログで紹介されています。
以上、このブログがどなたかのご参考になれば幸いです。








