Skip to content

Commit 403b6b8

Browse files
fix(core): Replace StackSet and removing dependency with CloudFormationStackSetExecutionRole (#583)
* Adding validation for StackSet and replace fix * Fixing Typo for OrganizationAdminRole and passing role to addQurantineSCP
1 parent 78baf3d commit 403b6b8

File tree

6 files changed

+32
-18
lines changed

6 files changed

+32
-18
lines changed

src/core/cdk/src/initial-setup.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ export namespace InitialSetup {
158158
'inputConfig.$': '$',
159159
'executionArn.$': '$$.Execution.Id',
160160
'stateMachineArn.$': '$$.StateMachine.Id',
161+
acceleratorPrefix: props.acceleratorPrefix,
161162
},
162163
resultPath: '$.configuration',
163164
});
@@ -208,7 +209,7 @@ export namespace InitialSetup {
208209
'phases.$': '$.configuration.baselineOutput.phases',
209210
'acceleratorVersion.$': '$.configuration.acceleratorVersion',
210211
'configRootFilePath.$': '$.configuration.configRootFilePath',
211-
'organizationAdmiRole.$': '$.configuration.baselineOutput.organizationAdmiRole',
212+
'organizationAdminRole.$': '$.configuration.baselineOutput.organizationAdminRole',
212213
},
213214
resultPath: '$.configuration',
214215
});
@@ -228,7 +229,7 @@ export namespace InitialSetup {
228229
'phases.$': '$.configuration.baselineOutput.phases',
229230
'acceleratorVersion.$': '$.configuration.acceleratorVersion',
230231
'configRootFilePath.$': '$.configuration.configRootFilePath',
231-
'organizationAdmiRole.$': '$.configuration.baselineOutput.organizationAdmiRole',
232+
'organizationAdminRole.$': '$.configuration.baselineOutput.organizationAdminRole',
232233
},
233234
resultPath: '$.configuration',
234235
});
@@ -304,6 +305,7 @@ export namespace InitialSetup {
304305
'configFilePath.$': '$.configuration.configFilePath',
305306
'configCommitId.$': '$.configuration.configCommitId',
306307
acceleratorPrefix: props.acceleratorPrefix,
308+
'organizationAdminRole.$': '$.configuration.organizationAdminRole',
307309
},
308310
});
309311

@@ -354,7 +356,7 @@ export namespace InitialSetup {
354356
'regions.$': '$.configuration.regions',
355357
'accounts.$': '$.configuration.accounts',
356358
'configRootFilePath.$': '$.configuration.configRootFilePath',
357-
'organizationAdmiRole.$': '$.configuration.organizationAdmiRole',
359+
'organizationAdminRole.$': '$.configuration.organizationAdminRole',
358360
},
359361
resultPath: '$',
360362
});
@@ -390,7 +392,7 @@ export namespace InitialSetup {
390392
s3ObjectKey: installCfnRoleMasterTemplate.s3ObjectKey,
391393
},
392394
stackParameters: {
393-
'RoleName.$': '$.configuration.organizationAdmiRole',
395+
'RoleName.$': '$.configuration.organizationAdminRole',
394396
},
395397
}),
396398
resultPath: 'DISCARD',
@@ -423,7 +425,7 @@ export namespace InitialSetup {
423425
},
424426
stackTemplate: executionRoleContent.toString(),
425427
'accountId.$': '$.accountId',
426-
'assumedRoleName.$': '$.organizationAdmiRole',
428+
'assumedRoleName.$': '$.organizationAdminRole',
427429
}),
428430
resultPath: 'DISCARD',
429431
});
@@ -434,7 +436,7 @@ export namespace InitialSetup {
434436
maxConcurrency: 40,
435437
parameters: {
436438
'accountId.$': '$$.Map.Item.Value',
437-
'organizationAdmiRole.$': '$.organizationAdmiRole',
439+
'organizationAdminRole.$': '$.organizationAdminRole',
438440
},
439441
});
440442

src/core/cdk/src/tasks/create-organization-account-task.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export class CreateOrganizationAccountTask extends sfn.StateMachineFragment {
9393
functionPayload: {
9494
'account.$': '$.moveOutput',
9595
'acceleratorPrefix.$': '$.createAccountConfiguration.acceleratorPrefix',
96+
'organizationAdminRole.$': '$.createAccountConfiguration.organizationAdminRole',
9697
},
9798
});
9899
attachQuarantineScpTask.next(pass);

src/core/runtime/src/get-baseline-step.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export interface GetBaseelineOutput {
2020
baseline: string;
2121
storeAllOutputs: boolean;
2222
phases: number[];
23-
organizationAdmiRole: string;
23+
organizationAdminRole: string;
2424
}
2525

2626
const dynamoDB = new DynamoDB();
@@ -69,6 +69,6 @@ export const handler = async (input: GetBaseLineInput): Promise<GetBaseelineOutp
6969
baseline,
7070
storeAllOutputs: runStoreAllOutputs,
7171
phases: [-1, 0, 1, 2, 3],
72-
organizationAdmiRole: globalOptionsConfig['organization-admin-role'] || 'AWSCloudFormationStackSetExecutionRole',
72+
organizationAdminRole: globalOptionsConfig['organization-admin-role'] || 'AWSCloudFormationStackSetExecutionRole',
7373
};
7474
};

src/core/runtime/src/get-or-create-config.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ import { S3 } from '@aws-accelerator/common/src/aws/s3';
33
import { RawConfig } from '@aws-accelerator/common/src/util/common';
44
import { JSON_FORMAT, RAW_CONFIG_FILE, YAML_FORMAT } from '@aws-accelerator/common/src/util/constants';
55
import { StepFunctions } from '@aws-accelerator/common/src/aws/stepfunctions';
6+
import { CloudFormation } from '@aws-accelerator/common/src/aws/cloudformation';
67

78
interface GetOrCreateConfigInput {
89
repositoryName: string;
910
s3Bucket: string;
1011
branchName: string;
1112
executionArn: string;
1213
stateMachineArn: string;
14+
acceleratorPrefix: string;
1315
acceleratorVersion?: string;
1416
// Taking entire input to replace any default paramaters in SM Input
1517
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -19,6 +21,7 @@ interface GetOrCreateConfigInput {
1921
const codecommit = new CodeCommit();
2022
const s3 = new S3();
2123
const stepfunctions = new StepFunctions();
24+
const cfn = new CloudFormation();
2225

2326
export const handler = async (input: GetOrCreateConfigInput) => {
2427
console.log(`Get or Create Config from S3 file...`);
@@ -32,11 +35,9 @@ export const handler = async (input: GetOrCreateConfigInput) => {
3235
inputConfig,
3336
executionArn,
3437
stateMachineArn,
38+
acceleratorPrefix,
3539
} = input;
36-
const runningStatus = await validateExecution(stateMachineArn, executionArn);
37-
if (runningStatus === 'DUPLICATE_EXECUTION') {
38-
throw new Error('Another execution of Accelerator is already running');
39-
}
40+
await beforeStart(acceleratorPrefix, stateMachineArn, executionArn);
4041
const storeAllOutputs: boolean = !!inputConfig.storeAllOutputs;
4142
const configRepository = await codecommit.batchGetRepositories([repositoryName]);
4243
if (!configRepository.repositories || configRepository.repositories?.length === 0) {
@@ -291,3 +292,16 @@ async function validateExecution(stateMachineArn: string, executionArn: string)
291292
}
292293
return 'SUCCESS';
293294
}
295+
296+
async function beforeStart(acceleratorPrefix: string, stateMachineArn: string, executionArn: string) {
297+
const installRolesStack = await cfn.describeStackSet(`${acceleratorPrefix}PipelineRole`);
298+
if (installRolesStack) {
299+
throw new Error(
300+
'This upgrade requires the manual removal of the "PBMMAccel-PipelineRole" Stackset from this account - see upgrade instructions',
301+
);
302+
}
303+
const runningStatus = await validateExecution(stateMachineArn, executionArn);
304+
if (runningStatus === 'DUPLICATE_EXECUTION') {
305+
throw new Error('Another execution of Accelerator is already running');
306+
}
307+
}

src/core/runtime/src/load-configuration-step.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export interface LoadConfigurationInput {
44
configFilePath: string;
55
configRepositoryName: string;
66
configCommitId: string;
7-
organizationAdmiRole: string;
7+
organizationAdminRole: string;
88
baseline?: BaseLineType;
99
acceleratorVersion?: string;
1010
configRootFilePath?: string;

src/lib/common/src/scp/index.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,8 @@ export class ServiceControlPolicy {
9292
throw e;
9393
}
9494

95-
// eslint-disable-next-line no-template-curly-in-string
96-
if (policyContent.includes('${ORG_ADMIN_ROLE}')) {
97-
// eslint-disable-next-line no-template-curly-in-string
98-
policyContent = policyContent.replace('${ORG_ADMIN_ROLE}', organizationAdminRole);
99-
}
95+
policyContent = policyContent.replace(/\${ORG_ADMIN_ROLE}/g, organizationAdminRole);
96+
10097
// Minify the SCP content
10198
policyContent = JSON.stringify(JSON.parse(policyContent));
10299

0 commit comments

Comments
 (0)