Amazon web services 将源代码从管道发送到cloudformation中的另一个模板
我试图在我的代码中实现Amazon web services 将源代码从管道发送到cloudformation中的另一个模板,amazon-web-services,amazon-cloudformation,Amazon Web Services,Amazon Cloudformation,我试图在我的代码中实现AWS::CloudFormation::Stack,以避免代码多次重复。(在本例中,每个lambda都有一个cloudwatch警报) 在进行此更改之前,我将我的“alarms.json”放入AWS::CodePipeline::Pipeline上的一个操作中,它工作正常 但是文件变得一团糟,因为我有15个相同的报警,只是更改了需要跳转的lambda名称。因此,我有了创建一个文件的想法,其中有一个警报;它接收lambda名称作为参数 因此我怀疑,在AWS::CloudFo
AWS::CloudFormation::Stack
,以避免代码多次重复。(在本例中,每个lambda都有一个cloudwatch警报)
在进行此更改之前,我将我的“alarms.json”放入AWS::CodePipeline::Pipeline
上的一个操作中,它工作正常
但是文件变得一团糟,因为我有15个相同的报警,只是更改了需要跳转的lambda名称。因此,我有了创建一个文件的想法,其中有一个警报;它接收lambda名称作为参数
因此我怀疑,在AWS::CloudFormation::Stack
中,TemplateURL
应该是S3
位置,但我可能做错了什么,因为我收到的错误说明TemplateURL必须是Amazon S3 URL。
因此,为了实现这一目标,我正在做的是:
在我有报警的.json上,我添加了一个新参数
"SourceCodeS3":
{
"Description": "Sourcecode",
"Type": "String",
"ConstraintDescription": "Source code Location in s3"
}
在同一个文件中,我有一个堆栈
"stackAlarm":
{
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters" : {"Name" : {"Ref": "lambda"} },
"TemplateURL" : {
"Fn::ImportValue": { "Fn::Sub": "${SourceCodeS3}/AWSAlarms/lambdaAlarm.json" }
},
"TimeoutInMinutes" : 20
}
}
因此,在管道中,我有一个操作部署
,如下所示:
{
"ActionTypeId" : {
"Category" : "Deploy",
"Owner" : "AWS",
"Provider" : "CloudFormation",
"Version" : "1"
},
"Configuration" : {
"ActionMode": "REPLACE_ON_FAILURE",
"StackName": "RawDataApplication",
"Capabilities": "CAPABILITY_IAM,CAPABILITY_NAMED_IAM",
"ChangeSetName": "code-pipeline-update",
"RoleArn": "arn",
"TemplatePath": "BuildArtifact::lambdas.json", //This calls properly
"ParameterOverrides": "{\"Environment\": \"Internal\", \"SourceCodes3\" : \"BuildArtifact::AWS\" }"
},
"Name" : "namehere",
"InputArtifacts" : [{
"Name": "BuildArtifact"
}],
"Region" : {"Ref": "AWS::Region"},
"RoleArn" : "arn",
"RunOrder" : 1
}
文件的位置是$AWS/AWSAlarms/lambdalarm.json
这很奇怪,因为我遇到了两个不同的错误:
管道中的1:参数:[SourceCodeS3]必须具有值,使我认为我没有发送任何内容
2在cloudformation中:如果我转到实际错误并转到我看到的事件:TemplateURL必须是AmazonS3URL。
这可能是因为它是空的
除此之外,我还尝试在buildspec
文件中返回一个工件,即文件。但它不起作用。
我还尝试使用sourceCode
将文件firest添加到InputArtifacts
中,然后添加到参数overrides
"InputArtifacts" :
[{
"Name": "BuildArtifact"
},{
"Name": "SourceCode"
}]
"ParameterOverrides": "{\"Environment\": \"Internal\", \"SourceCodes3\" : \"BuildArtifact::AWS\" }"
还可以使用get attr
"ParameterOverrides": "{\"Environment\": \"Internal\", \"SourceCodes3\" : { \"Fn::GetArtifactAtt\" : [ \"SourceCode\", \"Name\" ] } }"
在这一点上,我想知道我试图实现的是可能的,如果我做的是正确的方式
有人能帮我吗
谢谢 你能告诉我这是什么“Fn::ImportValue”:{“Fn::Sub”:“${SourceCodeS3}/AWSAlarms/lambdalarm.json”}这段代码,你可以从cloudformation中(子)堆栈的参数部分访问它,以避免代码多次重复。(在本例中,每个lambda都有一个cloudwatch警报)“您是否考虑过使用jinja宏来完成此任务?@MyStackRunnethOver嗨,不,我们希望避免使用任何其他工具,而不是Amazon提供的工具。@MHamzaRazzaq当它失败时,堆栈会回滚,我无法访问新的参数/模板,当我单击这些选项卡时,它会显示最后一个有效的选项卡。@TiGreX您可以转到已删除的堆栈并从中检查参数值。我使用的方法与您在本问题中描述的方法相同,并且对我有效,只需确保您的模板URL格式如下https://s3.amazonaws.com/bucket name/folder/../Template.json