StackSetsでコンソールからパラメータを指定した時のあれこれ

# はじめに
前回、StackSetsをGUIで作成しました。その際はパラメータの指定はしませんでした。

https://qiita.com/a_b_/items/1858055ba447c4966b58

構成は同じだけどパラメータはアカウントごとに別にしたい、という際も、コンソール画面から可能でした。
用途としては、"本番環境と開発環境で、同じインスタンスだけど、スペックは別にしたい"等が考えられます。

ですが、パラメータを指定して作成する際に、若干戸惑った点ありましたので記事にしました。

# 概要
- スタックセット自体に保持されるパラメータがある模様
- スタックインスタンスには、それとは別のパラメータを指定可能
- パラメータの変更は、それぞれ別々に可能
- 既に作成されたスタックインスタンスのパラメータはスタックセットが編集されても元のパラメータのまま変更されない
    - 親のパラメータ変更、CFnテンプレートが変更されても、子のパラメータはそのまま
- **スタックセットのコンソール画面からでは、スタックインスタンスごとに設定したパラメータがわからない**

# 用意したコード
# 親のIAMロール
前回と同じものです。
```yaml:creatChildRsource.yaml
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ロール
こちらも前回と同じ。
```yaml:creatParentrRsource.yaml
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ユーザを作成します。

```yaml
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
```

# やったこと
1. スタックセットを、子のアカウントは一つで作成
    - 手順は前回をご確認ください
    - defaultで指定した文字列がそのままパラメータ指定の入力ボックスにセットされていました
    - パラメータ、及び作成されたユーザとタグは以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/dee75379-7291-0fa0-f894-6bb6a553fc14.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ab0bd0df-40d2-1757-4d68-fe3d76a2e30d.png)

    関係図は以下のようなイメージです。
    ```mermaid
    graph TD;
     親:kasumin --- 子1:kasumin
    ```

2. そのスタックセットに、"StackSetにスタックを追加"から新しく別アカウントを追加。ただし、"別のパラメータ"を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/95462d30-337f-f912-64bf-5930a85729b9.png)

    - 異なるパラメータをコンソールから指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/03019e4f-313a-7a2c-cf9c-695ab9dc6e10.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/1cf2367c-b6d1-be97-982c-743b332fa37f.png)

    - 作成後、スタックセットのパラメータは以下。変更なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/3903adcf-9b98-77de-d39c-d9073825a45f.png)

    - 先に作られた子アカウントの方は変更なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f9584228-4795-d81f-6977-23a61ab43a66.png)

    - 後から作った子アカウントの方は設定したパラメータで作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/3ec2e7b1-d388-2145-a2db-b2715fa75cfd.png)

    関係図はこうなります。
    ```mermaid
    graph TD;
     親:kasumin --- 子1:kasumin
     親:kasumin --- 子2:kasukasu
    ```

    子2にのみ設定したパラメータを確認しようとスタックセット画面を見てみたのですが、管理している2つのスタックインスタンスのパラメータに何を指定したのかわかりませんでした。
ドリフトチェックを行ってみても、パラメータの違いは差分として扱われませんでした。確認する場合は、対象のアカウントにサインイン等してみる必要がありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/33cccbb2-85dd-814b-6c8e-36126c25c124.png)

1. 次に"StackSetのパラメータを上書き"から、初期に登録した方のみパラメータを上書き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/b72be341-d7f4-5f51-d45a-4f8e4ce23a0f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/43132a1e-f3cf-eaa9-b945-2b97faf9134c.png)

    - スタックセットのパラメータは変更されません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e3acb09c-c621-fc0d-73ca-7f8144af1bc7.png)

    - 先に作った（変更で指定した）方は操作どおり変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/dee9221f-562f-07eb-dbb9-3b7a10541f76.png)
    - 後に作った（変更で指定しなかった）方は変更なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/504bd3dd-16d3-6fe2-c8d5-c6e5281121cd.png)

    関係図はこうなります。
    ```mermaid
    graph TD;
     親:kasumin --- 子1:かすかす
     親:kasumin --- 子2:kasukasu
    ```


1. "StackSetの詳細を編集"から、パラメータを変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/cea8f84e-c87f-9075-6b57-531ae1295eb2.png)

    - テンプレートは変更せず、パラメータに新しい文字列を指定
        - 日本語だと文字化けしてしまいました
    - デプロイ先は、新しい方のみ指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f81b789b-8e35-c02e-2f2b-cc2841226e86.png)

   - スタックセットのパラメータは変更されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e5c9dd4e-4eb8-8dc9-2207-8bf9fcae3669.png)

   - しかし、2つのスタックインスタンスには反映されませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a12cb76d-e5ca-31e1-487b-c95feb730930.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c9d52018-b47e-38e8-080f-b97febc555da.png)

    関係図はこうなります。
    ```mermaid
    graph TD;
     親:coppe-pan --- 子1:かすかす
     親:coppe-pan --- 子2:kasukasu
    ```

   デプロイ先２つの子アカウントの両方を指定してもパラメータは変更されませんでした。

1. ここまでの状態で、テンプレートのCFnを変更

変更したCFnは以下になります。
```diff
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'
```

それでも、子アカウントのパラメータは変更されず、元の文字列がそのままでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/fefe4273-7767-7330-c587-984b4ab17157.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a123660f-03c7-cc78-9be3-cc04450eba60.png)


   関係図はそのまま、変更なしです。    
   ```mermaid
    graph TD;
     親:coppe-pan --- 子1:かすかす
     親:coppe-pan --- 子2:kasukasu
   ```

これらのことから、一度作られたスタックインスタンスのパラメータは、スタックのパラメータが変更されてもそのまま保持されるようです。


# おわりに
今回は、StackSetsのパラメータの変更を試してみました。
それぞれの子に設定したパラメータが、親の変更に影響されないのは助かりますが、その値が親から確認できず、子を直接見る必要があるのが難点と感じました。

子アカウントに指定したパラメータを把握しやすくする場合は、スタックセットをコンソールから作成せず、CFnで作成したほうがよさそうです。