in src/cfn-custom-resources/us-east-1-lambda-stack/index.ts [323:392]
async function ensureDeploymentUsEast1Stack(props: {
stackId: string;
stackName: string;
}) {
// Create a stack in us-east-1 with a deployment bucket
// (in a next step, Lambda fuctions will be added to this stack)
console.log("Checking if us-east-1 stack already exists ...");
const { Stacks: usEast1Stacks } = await CFN_CLIENT_US_EAST_1.describeStacks({
StackName: props.stackName,
})
.promise()
.catch(() => ({ Stacks: undefined }));
if (usEast1Stacks?.length) {
const deploymentBucket = usEast1Stacks[0].Outputs?.find(
(output) => output.OutputKey === "DeploymentBucket"
)?.OutputValue;
if (!deploymentBucket)
throw new Error("Failed to locate deployment bucket in us-east-1 stack");
console.log(
`us-east-1 stack exists. Deployment bucket: ${deploymentBucket}`
);
return deploymentBucket;
}
// Get the stack tags, we'll add them to the peripheral stack in us-east-1 too
console.log("Getting CFN stack tags ...");
const { Stacks: mainRegionStacks } = await CFN_CLIENT.describeStacks({
StackName: props.stackId,
}).promise();
if (!mainRegionStacks?.length) {
throw new Error(
`Failed to describe stack ${props.stackName} (${props.stackId})`
);
}
// Create the stack
console.log("Creating change set for us-east-1 stack ...");
const { Id: changeSetArn } = await CFN_CLIENT_US_EAST_1.createChangeSet({
StackName: props.stackName,
ChangeSetName: props.stackName,
TemplateBody: US_EAST_1_STACK_BASE_TEMPLATE,
ChangeSetType: "CREATE",
ResourceTypes: ["AWS::S3::Bucket"],
Tags: mainRegionStacks[0].Tags,
}).promise();
if (!changeSetArn)
throw new Error("Failed to create change set for bucket deployment");
console.log("Waiting for change set create complete for us-east-1 stack ...");
await CFN_CLIENT_US_EAST_1.waitFor("changeSetCreateComplete", {
ChangeSetName: changeSetArn,
}).promise();
console.log("Executing change set for us-east-1 stack ...");
await CFN_CLIENT_US_EAST_1.executeChangeSet({
ChangeSetName: changeSetArn,
}).promise();
console.log("Waiting for creation of us-east-1 stack ...");
const { Stacks: createdStacks } = await CFN_CLIENT_US_EAST_1.waitFor(
"stackCreateComplete",
{
StackName: props.stackName,
}
).promise();
const deploymentBucket = createdStacks?.[0].Outputs?.find(
(output) => output.OutputKey === "DeploymentBucket"
)?.OutputValue;
if (!deploymentBucket)
throw new Error("Failed to locate deployment bucket in new stack");
return deploymentBucket;
}