首页 > 解决方案 > 使用带有管道自动化的 CDK 使用给定的模板文件创建资源

问题描述

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

我采用的方法是在 codebuild 阶段提供模板 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

标签: amazon-web-servicesamazon-cloudformationpipelineaws-cdk

解决方案


我不完全确定你在寻找什么,所以也许考虑更新你的问题更具体。但是,我提出了这个问题,因为您正在寻找在代码管道中给定文件的情况下部署云形成/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 模板。


推荐阅读