CodePipeline:在堆栈中创建 vpc 并在 post CodeBuildStep 中使用它

CodePipeline: create vpc in stack and use it in post CodeBuildStep

我正在使用 AWS CDK 创建管道。我首先创建包含一个 vpc 和一个 rds 的堆栈,我导出 vpc 对象并在迁移数据库的 post CodeBuildStep 中使用它:

export class CdkPipelineStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props)

    const repo = new codecommit.Repository(this, 'CloudFrontCDKRepo', {
      repositoryName: 'backend',
    })
    const pipeline = new CodePipeline(this, 'Pipeline', {
      crossAccountKeys: false,
      pipelineName: 'MyPipeline2',
      synth: new ShellStep('Synth', {
        input: CodePipelineSource.codeCommit(repo, 'cdk'),
        commands: ['cd cdk', 'npm ci', 'npm run build', 'npx cdk synth'],
        primaryOutputDirectory: 'cdk/cdk.out',
      }),
    })

    const deploy = new DevStage(this, 'Deploy-dev')
    const deployStage = pipeline.addStage(deploy)
    deployStage.addPost(
      new CodeBuildStep('SLS Deploy', {
        commands: ['./build.sh'],
        vpc: deploy.vpc
      }),
    )
  }
}

但是我收到以下错误:

Stack "MyPipelineStack" cannot consume a cross reference from stack "MyPipelineStack/Deploy-dev/S3Stack". Cross stack references are only supported for stacks deployed to the same environment or between nested stacks and their parent stack

如何在此处正确导入vpc?如果这不可能,我如何 运行 将代码构建步骤作为单独的堆栈,仅在主堆栈完成后执行?

正如@gshpychka 在评论中所说,您要求 CodePipeline 执行不可能的操作顺序:

  1. SLS Deploy 项目创建为管道堆栈的一部分(需要 VPC)
  2. Deploy-dev 堆栈部署(创建 VPC)
  3. SLS Deploy 项目运行

解决此排序问题的一种方法是将 SLS Deploy 的逻辑添加到 Deploy-dev 堆栈本身。有几种方法可以做到这一点:

  1. 最简单的方法是将 build.sh 转换为 TriggerFunction Lambda that has access to the VPC. A Trigger 结构,调用 Lambda 作为 Deploy-dev 堆栈部署生命周期的一部分。正如文档所说,触发器专为 “数据启动:在资源创建后将初始数据添加到资源”之类的任务而设计
  2. 如果您确实需要一个 CodeBuild 项目,第二个选择是将 SLS Deploy 移动到 Deploy-dev 并使用 AwsCustomResource 执行它。它是 Trigger 的 lower-level 表亲,用于运行任意 SDK 调用(如 codebuild:StartBuild)作为堆栈部署周期的一部分。

N.B。这两种方法都具有 finer-grained 控制迁移脚本运行时间的附加优势(例如,仅在首次部署时?每次更新后?)