如何在CloudFormation模板中同时使用Sub和GetAtt函数?

74

我创建了 CloudFormation 的 yaml 模板,现在我需要在 "AWS::ApiGateway::Method" 集成 Uri 中使用 !Sub 函数作为 !GetAtt "TestLambda.Arn" 的一部分:

Type: "AWS::ApiGateway::Method"
  Properties:
    RestApiId:
      Ref: "RestApi"
    ResourceId:
      Ref: "TestResource"
    HttpMethod: "GET"
    AuthorizationType: "NONE"
    Integration:
      Type: "AWS_PROXY"
      IntegrationHttpMethod: "POST"
      Uri: !Sub "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/[[place where I want to use !GetAtt "TestLambda.Arn"]]/invocations"

因此,我希望得到类似于以下的值:

"arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/my-endpoint-lambda/invocations"

我该如何将这些函数结合起来,以获得所需的结果?

4个回答

133

在此处不需要使用 !GetAtt,如果你将它们放置在占位符内,!Sub 将自动展开这些值:

Uri: !Sub arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/${TestLambda.Arn}/invocations

这在文档中有解释:

如果你指定了模板参数名称或资源逻辑ID,例如${InstanceTypeParameter},AWS CloudFormation返回与使用Ref内在函数相同的值。如果你指定了资源属性,例如${MyInstance.PublicIp},AWS CloudFormation返回与使用Fn::GetAtt内在函数相同的值。


对于任何寻找JSON等效的人,请查看上面答案中链接的文档并使用映射:{ "Fn :: Sub":[ "www.${Domain}", { "Domain": {"Ref" : "RootDomainName" }} ]} - Alex Barnes
2
我必须说,这是那些神奇时刻之一,解决方案不仅存在,而且比预期的要容易。耶! - Ben

9

我知道这是一个老问题,但仍然是谷歌搜索结果中的第一个:

Parameters:
  path:
    Type: String
    Default: something/script.sh
Resources:
  Bucket:
    Type: AWS::S3::Bucket
Outputs:
  ScriptUrl:
    Description: Script Url
    Value:
      Fn::Sub:
        - ${url}${the_path}
        - {url: !GetAtt Bucket.WebsiteURL, the_path: !Ref path}

7

如果首先使用!的简短形式,我们可以使用Fn::来处理嵌套的内置函数。因此

!Sub "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/$(Fn::GetAtt:[TestLambda, Arn])/invocations"

-1
AWS CloudFormation提供了几个内置函数,帮助您管理堆栈。在模板中使用内在函数来分配在运行时不可用的属性值。 AWS来源 Fn::GetAtt 内在函数从模板中的资源返回属性的值。 声明
  • JSON
    • { "Fn::GetAtt" : [ "逻辑名称", "属性名称" ] }
  • YAML
    • 完整函数名称的语法:
    • Fn::GetAtt: [ 逻辑名称, 属性名称 ]
  • 短格式的语法:
    • !GetAtt 逻辑名称.属性名称
注意: 不要与双冒号混淆:Fn::GetAtt 就像 Fn_GetAtt

11
这实际上没有回答所述的问题。 - JDS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接