Overwritten Parameters for AWS Stack Set Instances Are Not Applied

Viewed 281

The below CF template is indented to create a stack set containing one role with specific parameter values depending on the OU where the account is located. So if the account is located / created in OU A the trust relationship of the debug role must point to account "111111111111".

AWSTemplateFormatVersion: "2010-09-09"
Description: Debug Role
Resources:
  StackSet:
    Type: AWS::CloudFormation::StackSet
    Properties:
      Description: Debug Role Stack Set
      PermissionModel: SERVICE_MANAGED
      Capabilities:
        - CAPABILITY_NAMED_IAM
      AutoDeployment:
        Enabled: true
        RetainStacksOnAccountRemoval: false
      Parameters:
        - ParameterKey: TrustAccountId
          ParameterValue: "123456789123" # default value
      OperationPreferences:
        RegionConcurrencyType: PARALLEL
        FailureToleranceCount: 0
        MaxConcurrentPercentage: 100
      StackInstancesGroup:
        - DeploymentTargets:
            OrganizationalUnitIds:
              - ou-aaaa  # A
          ParameterOverrides:
            - ParameterKey: "TrustAccountId"
              ParameterValue: "111111111111"
          Regions:
            - 'eu-central-1'
        - DeploymentTargets:
            OrganizationalUnitIds:
              - ou-bbbb  # B
          ParameterOverrides:
            - ParameterKey: "TrustAccountId"
              ParameterValue: "222222222222"
          Regions:
            - 'eu-central-1'
      StackSetName: debug-role-stack-set
      TemplateBody: |
        AWSTemplateFormatVersion: 2010-09-09
        Description: Debug Role
        Parameters:
          TrustAccountId:
            Description: Trust to account
            Type: String
            AllowedPattern: \d{12}
        Resources:
          DebugRole:
            Type: AWS::IAM::Role
            Description: "Role for debugging accounts"
            Properties:
              RoleName: DebugRole
              Path: /
              AssumeRolePolicyDocument:
                Version: "2012-10-17"
                Statement:
                  - Effect: Allow
                    Principal:
                      AWS:
                        - Ref: TrustAccountId
                    Action:
                      - 'sts:AssumeRole'
              ManagedPolicyArns:
                - arn:aws:iam::aws:policy/AdministratorAccess

Now the issue is that all account within the stack instances group, regardless if existing or new account, get the stack applied with the default parameter value "123456789123". So all accounts get the role having the incorrect trust relationship to "123456789123".

The only way to apply the correct value based on the OU is to update the stack instances with the CLI.

aws cloudformation update-stack-instances --stack-set-name debug-role-stack-set --deployment-targets OrganizationalUnitIds=ou-aaaa --regions eu-central-1 --operation-preferences FailureToleranceCount=0,MaxConcurrentCount=5 --parameter-overrides Pa
rameterKey=TrustAccountId,ParameterValue=111111111111

Is there any way to apply the correct parameter values during the stack creation without updating them afterwards? Because for every new account all stack set instances needs to be updated.

1 Answers

Since the stack instances have not been executed with the correct parameter value, I ended up having one stack set for each OU. Of course, this solution is only feasible for static environments. So in my case, if new OUs pop up new stack sets must be created.

Related