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