async function ensureDeploymentUsEast1Stack()

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;
}