amazon-web-services - 使用带有管道自动化的 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
解决方案
我不完全确定你在寻找什么,所以也许考虑更新你的问题更具体。但是,我提出了这个问题,因为您正在寻找在代码管道中给定文件的情况下部署云形成/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 模板。
推荐阅读
- java - Spring Test:数据库在测试中被初始化两次
- python - Python SQL 数据到数组(如 csv)
- c# - 使用图片框引发 System.ArgumentException
- r - 如何将数据集划分为 R 中所有可能的测试和训练组合?
- ios - 无论如何知道iOS的共享模型何时会出现或关闭?
- javascript - 在两个数组上反应映射并在表中显示结果
- java - 将 BigInteger 中的公钥转换为 Java 中的 pem 文件
- python - 在python中合并后数据的形状发生了变化
- vim - VIM:打开新标签时如何保留netrw侧边栏窗口?
- vim - 在 vimrc 中,仅对某些文件类型应用某些突出显示规则