问题描述
[![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 模板。