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 执行不可能的操作顺序:
SLS Deploy
项目创建为管道堆栈的一部分(需要 VPC)
Deploy-dev
堆栈部署(创建 VPC)
SLS Deploy
项目运行
解决此排序问题的一种方法是将 SLS Deploy
的逻辑添加到 Deploy-dev
堆栈本身。有几种方法可以做到这一点:
- 最简单的方法是将
build.sh
转换为 TriggerFunction Lambda that has access to the VPC. A Trigger 结构,调用 Lambda 作为 Deploy-dev
堆栈部署生命周期的一部分。正如文档所说,触发器专为 “数据启动:在资源创建后将初始数据添加到资源”之类的任务而设计。
- 如果您确实需要一个 CodeBuild 项目,第二个选择是将
SLS Deploy
移动到 Deploy-dev
并使用 AwsCustomResource 执行它。它是 Trigger
的 lower-level 表亲,用于运行任意 SDK 调用(如 codebuild:StartBuild
)作为堆栈部署周期的一部分。
N.B。这两种方法都具有 finer-grained 控制迁移脚本运行时间的附加优势(例如,仅在首次部署时?每次更新后?)
我正在使用 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 执行不可能的操作顺序:
SLS Deploy
项目创建为管道堆栈的一部分(需要 VPC)Deploy-dev
堆栈部署(创建 VPC)SLS Deploy
项目运行
解决此排序问题的一种方法是将 SLS Deploy
的逻辑添加到 Deploy-dev
堆栈本身。有几种方法可以做到这一点:
- 最简单的方法是将
build.sh
转换为 TriggerFunction Lambda that has access to the VPC. A Trigger 结构,调用 Lambda 作为Deploy-dev
堆栈部署生命周期的一部分。正如文档所说,触发器专为 “数据启动:在资源创建后将初始数据添加到资源”之类的任务而设计。 - 如果您确实需要一个 CodeBuild 项目,第二个选择是将
SLS Deploy
移动到Deploy-dev
并使用 AwsCustomResource 执行它。它是Trigger
的 lower-level 表亲,用于运行任意 SDK 调用(如codebuild:StartBuild
)作为堆栈部署周期的一部分。
N.B。这两种方法都具有 finer-grained 控制迁移脚本运行时间的附加优势(例如,仅在首次部署时?每次更新后?)