使用带有管道自动化的 CDK 使用给定的模板文件创建资源

问题描述

[![codecommit contains cloudformation template][1]][1]我有一个需求,我需要创建管道,负责将模板 yaml 文件作为输入并相应地创建资源。

我采用的方法是在代码构建阶段提供模板 yaml 文件的路径,命令如下: "aws cloudformation deploy --template-file D:/pipeline/aws-waf.yml --stack-name waf-deployment"

export class Pipelinestack extends Stack {
  constructor(app: App,id: string,props: PipelinestackProps) {
    super(app,id,props);

    const code = codecommit.Repository.fromrepositoryName(this,'ImportedRepo',props.repoName);

    const cdkBuild = new codebuild.PipelineProject(this,'CdkBuild',{
      buildSpec: codebuild.BuildSpec.fromObject({
        version: '0.2',phases: {
          install: {
            commands: 'npm install',},build: {
            commands: [
              'npm run build','npm run cdk synth -- -o dist','aws cloudformation deploy --template-file D:/pipeline/aws-waf.yml --stack-name waf-deployment','echo $?'
            ],artifacts: {
          'base-directory': 'dist',files: [
            'LambdaStack.template.json',],}),environment: {
        buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_3,});

    const sourceOutput = new codepipeline.Artifact();
    const cdkBuildOutput = new codepipeline.Artifact('CdkBuildOutput');
    //const lambdaBuildOutput = new codepipeline.Artifact('LambdaBuildOutput');
    new codepipeline.Pipeline(this,'Pipeline',{
      stages: [
        {
          stageName: 'Source',actions: [
            new codepipeline_actions.CodeCommitSourceAction({
              actionName: 'CodeCommit_Source',repository: code,output: sourceOutput,{
          stageName: 'Build',actions: [
              new codepipeline_actions.CodeBuildAction({
              actionName: 'CDK_Build',project: cdkBuild,input: sourceOutput,outputs: [cdkBuildOutput],});
  }
}
```[![enter image description here][2]][2]


  [1]: https://i.stack.imgur.com/u7rRe.jpg
  [2]: https://i.stack.imgur.com/xzk6v.png

解决方法

我不完全确定您正在寻找什么,因此可以考虑更新您的问题以使其更具体。但是,我接受了这个问题,因为您正在寻找在代码管道中给定文件的正确方法来部署云形成/cdk?

我们通过 codepipeline 处理 cloudformation 部署的方式是利用 codebuild 和 codedeploy。管道从存储库中获取文件/更改(可选,可以使用许多其他触发器),然后 codebuild 使用 aws cli 将文件上传到 s3,一旦该文件上传到 s3,您就可以使用 codedeploy 从源部署 cloudformation s3 中的文件。

因此,对于上面的示例,我将更新构建以将新工件上传到 s3,然后在您的管道中创建一个新步骤以使用 codedeploy 部署该 s3 模板。

完全可以构建一个脚本/代码构建命令来执行 cloudformation 部署,但由于 codedeploy 已经支持跟踪该更改、错误处理等,我建议使用 codedeploy 进行 cloudformation 部署。

注意: 如果您没有使用现有的 cloudformation 模板 (json/yaml) 而是使用 cdk,您需要在上传到 s3 之前将您的 cdk 合成为一个 cloudformation 模板。