はじめに
今まで避けていたCloudFormationのStackSetsを、勉強のつもりで触ってみました。
簡単なサンプルでやり方を記事にしますので、同じような方の参考になれば幸いです。
記事概要
- 子AWSアカウントに対して、親AWSアカウントから"StackSets"を使って、CloudFormationを実行
- 子AWSアカウントと親AWSアカウントは、同じでも可能
- 今回は別にしました
- AWS Organizationsを使わない方法になります
- 子AWSアカウントと親AWSアカウントは、同じでも可能
今回は以下のCloudFormationを実行してIAMユーザを作ります。
AWSTemplateFormatVersion: 2010-09-09
Resources:
AWSUser:
Type: AWS::IAM::User
Properties:
UserName: 'You'
参考ページ
手順
子AWSアカウントにIAMロール作成
子のAWSアカウント内に、CloudFormationを実行させるIAMロールを作成します。
AWSTemplateFormatVersion: 2010-09-09
Description: Configure the AWSCloudFormationStackSetExecutionRole to enable use of your account as a target account in AWS CloudFormation StackSets.
Parameters:
AdministratorAccountId:
Type: String
Description: AWS Account Id of the administrator account (the account in which StackSets will be created).
MaxLength: 12
MinLength: 12
Resources:
ExecutionRole:
Type: AWS::IAM::Role
Properties:
RoleName: AWSCloudFormationStackSetExecutionRole
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS:
- !Ref AdministratorAccountId
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- 'arn:aws:iam::aws:policy/AdministratorAccess'
- リソースが作成できる権限を与えてください
- 今回はAdministratorAccessを付与しています
- パラメータには、親AWSアカウントのIDを入力してください
親AWSアカウントにIAMロール作成
親のAWSアカウント内に、StackSetsを実行するIAMロールを作成します。
AWSTemplateFormatVersion: 2010-09-09
Description: Configure the AWSCloudFormationStackSetAdministrationRole to enable use of AWS CloudFormation StackSets.
Resources:
AdministrationRole:
Type: AWS::IAM::Role
Properties:
RoleName: AWSCloudFormationStackSetAdministrationRole
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service: cloudformation.amazonaws.com
Action:
- sts:AssumeRole
Path: /
Policies:
- PolicyName: AssumeRole-AWSCloudFormationStackSetExecutionRole
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- sts:AssumeRole
Resource:
- 'arn:aws:iam::*:role/AWSCloudFormationStackSetExecutionRole'
-
Resource
で、先ほど子AWSアカウントに作成したIAMロールが対象になっているか確認
親AWSアカウントで、StackSets実行
ここからはコンソールを操作します。
CloudFormationの画面で、StackSetの作成をクリック。
IAM実行ロール名は、先ほど作成したロールを指定。
テンプレートファイルは本記事の最初に示した、ユーザを作成するcreateIAMUser.yaml
を指定。
実行指定は競合する場合に考慮が必要な設定のようですが、今回はIAMユーザを1つ作るだけなので、非アクティブにしました。
今回は新しくスタックを作るので、新しいスタックのデプロイを選択。
デプロイ先に、子AWSアカウントIDをカンマ区切りで指定します。
リージョンは東京を1つ指定し、デプロイオプションはデフォルトのままにしました。
確認画面で設定を確認します。
IAMユーザを作成するので、いつもの以下のチェックが表示されました。
子AWSアカウントで、IAMユーザを作成するスタックが作られていました。
StackSetsで、テンプレートを変更
続けて、テンプレートのyamlファイルを変更してみます。ユーザ名を以下のように変更しました。
AWSTemplateFormatVersion: 2010-09-09
Resources:
AWSUser:
Type: AWS::IAM::User
Properties:
UserName: 'Yuu-Takasaki'
先程作成したStackSetを選択し、アクションから "StackSetの詳細を編集" を選択。
その後はほぼ作成時と同様の画面になります。テンプレートファイルは変更後のものを指定します。
アカウントとリージョンは空になっていました。作成時と同じ設定にします。
実行を開始すると、オペレーションにUPDATEで進捗が表示されます。スタックインスタンスのタブは完了後も特に変わりありませんでした。
子AWSアカウントの対象のスタックを見ると、UPDATEとなっていました。
削除手順
作成した各種リソースを削除する場合は以下の順序になります。
スタックの削除方法
こちらでもデプロイオプションが空なので、削除する内容を指定します。
デプロイオプションに、"スタックを保持"というのがあります。これをONにすると、このStackSetから管理外になるだけで、子AWSアカウントのスタックはそのまま残ります。
今回はOFFにして作成したIAMユーザも削除します。
StackSetsの削除方法
続けて、アクションから Stacksetの削除 を選択します。
これでStackSetは削除されます。
あとは作成したIAMロールを削除してください。
おわりに
今回はIAMユーザを作るだけのStackSetsを記事にしました。
親子関係があったり、Organizationsを使うと思い込んでいたりで避けていた機能でしたが、親子それぞれにIAMロールを作り、GUIだけでできたため、かなり簡単だった印象です。
私と同様避けていた方は、簡単ですので触ってみてください。
ただパラメータを使うと厄介な点ありましたので、それについていずれ記事にしたいと思います。