in src/core/cdk/src/tasks/create-stack-set-task.ts [33:294]
constructor(scope: cdk.Construct, id: string, props: CreateStackSetTask.Props) {
super(scope, id);
const { role, lambdaCode, functionPayload, waitSeconds = 10 } = props;
role.addToPrincipalPolicy(
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: ['*'],
actions: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'],
}),
);
role.addToPrincipalPolicy(
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: ['*'],
actions: ['codepipeline:PutJobSuccessResult', 'codepipeline:PutJobFailureResult'],
}),
);
const createTaskResultPath = '$.createStackSetOutput';
const createTaskStatusPath = `${createTaskResultPath}.status`;
const createTask = new CodeTask(scope, `Start Stack Set Creation`, {
resultPath: createTaskResultPath,
functionPayload,
functionProps: {
role,
code: lambdaCode,
handler: 'index.createStackSet.createStackSet',
},
});
const verifyTaskResultPath = '$.verifyStackOutput';
const verifyTaskStatusPath = `${verifyTaskResultPath}.status`;
const verifyTask = new CodeTask(scope, 'Verify Stack Set Creation', {
resultPath: verifyTaskResultPath,
functionProps: {
role,
code: lambdaCode,
handler: 'index.createStackSet.verify',
},
});
const createInstancesTaskResultPath = '$.createInstancesOutput';
const createInstancesTaskStatusPath = `${createInstancesTaskResultPath}.status`;
const createInstancesTask = new CodeTask(scope, `Start Stack Set Instance Creation`, {
resultPath: createInstancesTaskResultPath,
functionPayload,
functionProps: {
role,
code: lambdaCode,
handler: 'index.createStackSet.createStackSetInstances',
},
});
const verifyCreateInstancesTaskResultPath = '$.verifyCreateInstancesOutput';
const verifyCreateInstancesTaskStatusPath = `${verifyCreateInstancesTaskResultPath}.status`;
const verifyCreateInstancesTask = new CodeTask(scope, 'Verify Stack Set Instances Creation', {
resultPath: verifyCreateInstancesTaskResultPath,
functionProps: {
role,
code: lambdaCode,
handler: 'index.createStackSet.verify',
},
});
const updateInstancesTaskResultPath = '$.updateInstancesOutput';
const updateInstancesTaskStatusPath = `${updateInstancesTaskResultPath}.status`;
const updateInstancesTask = new CodeTask(scope, `Start Stack Set Instance Update`, {
resultPath: updateInstancesTaskResultPath,
functionPayload,
functionProps: {
role,
code: lambdaCode,
handler: 'index.createStackSet.updateStackSetInstances',
},
});
const verifyUpdateInstancesTaskResultPath = '$.verifyUpdateInstancesOutput';
const verifyUpdateInstancesTaskStatusPath = `${verifyUpdateInstancesTaskResultPath}.status`;
const verifyUpdateInstancesTask = new CodeTask(scope, 'Verify Stack Set Instances Update', {
resultPath: verifyUpdateInstancesTaskResultPath,
functionProps: {
role,
code: lambdaCode,
handler: 'index.createStackSet.verify',
},
});
const deleteInstancesTaskResultPath = '$.deleteInstancesOutput';
const deleteInstancesTaskStatusPath = `${deleteInstancesTaskResultPath}.status`;
const deleteInstancesTask = new CodeTask(scope, `Start Stack Set Instance Deletion`, {
resultPath: deleteInstancesTaskResultPath,
functionPayload,
functionProps: {
role,
code: lambdaCode,
handler: 'index.createStackSet.deleteStackSetInstances',
},
});
const verifyDeleteInstancesTaskResultPath = '$.verifyUpdateInstancesOutput';
const verifyDeleteInstancesTaskStatusPath = `${verifyDeleteInstancesTaskResultPath}.status`;
const verifyDeleteInstancesTask = new CodeTask(scope, 'Verify Stack Set Instances Deletion', {
resultPath: verifyDeleteInstancesTaskResultPath,
functionProps: {
role,
code: lambdaCode,
handler: 'index.createStackSet.verify',
},
});
const deleteInOperableInstancesTask = new CodeTask(scope, `Start Stack Set InOperable Instance Deletion`, {
resultPath: deleteInstancesTaskResultPath,
functionPayload: {
'stackName.$': '$.stackName',
'instanceAccounts.$': '$.instanceAccounts',
'instanceRegions.$': '$.instanceRegions',
retainStacks: true,
},
functionProps: {
role,
code: lambdaCode,
handler: 'index.createStackSet.deleteStackSetInstances',
},
});
const verifyDeleteInOperableInstancesTask = new CodeTask(scope, 'Verify Stack Set InOperable Instances Deletion', {
resultPath: verifyDeleteInstancesTaskResultPath,
functionProps: {
role,
code: lambdaCode,
handler: 'index.createStackSet.verify',
},
});
const waitTask = new sfn.Wait(scope, 'Wait For Stack Set Creation', {
time: sfn.WaitTime.duration(cdk.Duration.seconds(waitSeconds)),
});
const waitCreateInstancesTask = new sfn.Wait(scope, 'Wait for Stack Set Instances Creation', {
time: sfn.WaitTime.duration(cdk.Duration.seconds(waitSeconds)),
});
const waitUpdateInstancesTask = new sfn.Wait(scope, 'Wait for Stack Set Instances Update', {
time: sfn.WaitTime.duration(cdk.Duration.seconds(waitSeconds)),
});
const waitDeleteInstancesTask = new sfn.Wait(scope, 'Wait for Stack Set Instances Deletion', {
time: sfn.WaitTime.duration(cdk.Duration.seconds(waitSeconds)),
});
const waitDeleteInOperableInstancesTask = new sfn.Wait(scope, 'Wait for Stack Set InOperable Instances Deletion', {
time: sfn.WaitTime.duration(cdk.Duration.seconds(waitSeconds)),
});
const pass = new sfn.Pass(this, 'Stack Set Creation Succeeded');
const fail = new sfn.Fail(this, 'Stack Set Creation Failed');
createInstancesTask.next(
new sfn.Choice(scope, 'Stack Set Instances Created?')
.when(sfn.Condition.stringEquals(createInstancesTaskStatusPath, 'UP_TO_DATE'), updateInstancesTask)
.when(sfn.Condition.stringEquals(createInstancesTaskStatusPath, 'SUCCESS'), waitCreateInstancesTask)
.otherwise(fail)
.afterwards(),
);
waitCreateInstancesTask
.next(verifyCreateInstancesTask)
.next(
new sfn.Choice(scope, 'Stack Set Instances Creation Done?')
.when(sfn.Condition.stringEquals(verifyCreateInstancesTaskStatusPath, 'SUCCESS'), updateInstancesTask)
.when(sfn.Condition.stringEquals(verifyCreateInstancesTaskStatusPath, 'IN_PROGRESS'), waitCreateInstancesTask)
.otherwise(fail)
.afterwards(),
);
updateInstancesTask.next(
new sfn.Choice(scope, 'Stack Set Instances Updated?')
.when(sfn.Condition.stringEquals(updateInstancesTaskStatusPath, 'UP_TO_DATE'), deleteInstancesTask)
.when(sfn.Condition.stringEquals(updateInstancesTaskStatusPath, 'IN_OPERABLE'), deleteInstancesTask)
.when(sfn.Condition.stringEquals(updateInstancesTaskStatusPath, 'SUCCESS'), waitUpdateInstancesTask)
.otherwise(fail)
.afterwards(),
);
waitUpdateInstancesTask
.next(verifyUpdateInstancesTask)
.next(
new sfn.Choice(scope, 'Stack Set Instances Update Done?')
.when(sfn.Condition.stringEquals(verifyUpdateInstancesTaskStatusPath, 'SUCCESS'), deleteInstancesTask)
.when(sfn.Condition.stringEquals(verifyUpdateInstancesTaskStatusPath, 'IN_OPERABLE'), deleteInstancesTask)
.when(sfn.Condition.stringEquals(verifyUpdateInstancesTaskStatusPath, 'IN_PROGRESS'), waitUpdateInstancesTask)
.otherwise(fail)
.afterwards(),
);
deleteInstancesTask.next(
new sfn.Choice(scope, 'Stack Set Instances Deleted?')
.when(sfn.Condition.stringEquals(deleteInstancesTaskStatusPath, 'UP_TO_DATE'), pass)
.when(sfn.Condition.stringEquals(deleteInstancesTaskStatusPath, 'SUCCESS'), waitDeleteInstancesTask)
.otherwise(fail)
.afterwards(),
);
deleteInOperableInstancesTask.next(
new sfn.Choice(scope, 'Stack Set InOperable Instances Deleted?')
.when(sfn.Condition.stringEquals(deleteInstancesTaskStatusPath, 'UP_TO_DATE'), pass)
.when(sfn.Condition.stringEquals(deleteInstancesTaskStatusPath, 'SUCCESS'), waitDeleteInOperableInstancesTask)
.otherwise(fail)
.afterwards(),
);
waitDeleteInstancesTask
.next(verifyDeleteInstancesTask)
.next(
new sfn.Choice(scope, 'Stack Set Instances Deletion Done?')
.when(sfn.Condition.stringEquals(verifyDeleteInstancesTaskStatusPath, 'SUCCESS'), pass)
.when(
sfn.Condition.stringEquals(verifyDeleteInstancesTaskStatusPath, 'IN_OPERABLE'),
deleteInOperableInstancesTask,
)
.when(sfn.Condition.stringEquals(verifyDeleteInstancesTaskStatusPath, 'IN_PROGRESS'), waitDeleteInstancesTask)
.otherwise(fail)
.afterwards(),
);
waitDeleteInOperableInstancesTask
.next(verifyDeleteInOperableInstancesTask)
.next(
new sfn.Choice(scope, 'Stack Set InOperable Instances Deletion Done?')
.when(sfn.Condition.stringEquals(verifyDeleteInstancesTaskStatusPath, 'SUCCESS'), pass)
.when(
sfn.Condition.stringEquals(verifyDeleteInstancesTaskStatusPath, 'IN_PROGRESS'),
waitDeleteInOperableInstancesTask,
)
.otherwise(fail)
.afterwards(),
);
waitTask
.next(verifyTask)
.next(
new sfn.Choice(scope, 'Stack Set Creation Done?')
.when(sfn.Condition.stringEquals(verifyTaskStatusPath, 'SUCCESS'), createInstancesTask)
.when(sfn.Condition.stringEquals(verifyTaskStatusPath, 'IN_PROGRESS'), waitTask)
.otherwise(fail)
.afterwards(),
);
const chain = sfn.Chain.start(createTask).next(
new sfn.Choice(scope, 'Stack Set Created?')
.when(sfn.Condition.stringEquals(createTaskStatusPath, 'SUCCESS'), waitTask)
.when(sfn.Condition.stringEquals(createTaskStatusPath, 'UP_TO_DATE'), createInstancesTask)
.otherwise(fail)
.afterwards(),
);
this.startState = chain.startState;
this.endStates = chain.endStates;
}