はじめに
前回、StackSetsをGUIで作成しました。その際はパラメータの指定はしませんでした。
構成は同じだけどパラメータはアカウントごとに別にしたい、という際も、コンソール画面から可能でした。
用途としては、"本番環境と開発環境で、同じインスタンスだけど、スペックは別にしたい"等が考えられます。
ですが、パラメータを指定して作成する際に、若干戸惑った点ありましたので記事にしました。
概要
- スタックセット自体に保持されるパラメータがある模様
- スタックインスタンスには、それとは別のパラメータを指定可能
- パラメータの変更は、それぞれ別々に可能
- 既に作成されたスタックインスタンスのパラメータはスタックセットが編集されても元のパラメータのまま変更されない
- 親のパラメータ変更、CFnテンプレートが変更されても、子のパラメータはそのまま
- スタックセットのコンソール画面からでは、スタックインスタンスごとに設定したパラメータがわからない
用意したコード
親の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'
子の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'
作成するCFnテンプレート
パラメータでタグの値を指定するIAMユーザを作成します。
AWSTemplateFormatVersion: 2010-09-09
Parameters:
NicknameString:
Type: String
Default: 'kasumin'
Resources:
AWSUser:
Type: AWS::IAM::User
Properties:
UserName: 'Kasumi-Nakasu'
Tags:
- Key: 'Nickname'
Value: !Ref NicknameString
やったこと
-
スタックセットを、子のアカウントは一つで作成
関係図は以下のようなイメージです。
-
そのスタックセットに、"StackSetにスタックを追加"から新しく別アカウントを追加。ただし、"別のパラメータ"を指定
関係図はこうなります。
子2にのみ設定したパラメータを確認しようとスタックセット画面を見てみたのですが、管理している2つのスタックインスタンスのパラメータに何を指定したのかわかりませんでした。
ドリフトチェックを行ってみても、パラメータの違いは差分として扱われませんでした。確認する場合は、対象のアカウントにサインイン等してみる必要がありそうです。
-
次に"StackSetのパラメータを上書き"から、初期に登録した方のみパラメータを上書き
関係図はこうなります。
-
-
テンプレートは変更せず、パラメータに新しい文字列を指定
- 日本語だと文字化けしてしまいました
関係図はこうなります。
デプロイ先2つの子アカウントの両方を指定してもパラメータは変更されませんでした。
-
-
ここまでの状態で、テンプレートのCFnを変更
変更したCFnは以下になります。
AWSTemplateFormatVersion: 2010-09-09
Parameters:
NicknameString:
Type: String
Default: 'kasumin'
Resources:
AWSUser:
Type: AWS::IAM::User
Properties:
UserName: 'Kasumi-Nakasu'
Tags:
- Key: 'Nickname'
Value: !Ref NicknameString
+ - Key: 'Unit'
+ Value: 'QU4RTZ'
それでも、子アカウントのパラメータは変更されず、元の文字列がそのままでした。
関係図はそのまま、変更なしです。
これらのことから、一度作られたスタックインスタンスのパラメータは、スタックのパラメータが変更されてもそのまま保持されるようです。
おわりに
今回は、StackSetsのパラメータの変更を試してみました。
それぞれの子に設定したパラメータが、親の変更に影響されないのは助かりますが、その値が親から確認できず、子を直接見る必要があるのが難点と感じました。
子アカウントに指定したパラメータを把握しやすくする場合は、スタックセットをコンソールから作成せず、CFnで作成したほうがよさそうです。