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

时间:2018-06-22 10:50:52

标签: amazon-web-services yaml amazon-cloudformation

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

...
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 个答案:

答案 0 :(得分:15)

您无需在此处使用!GetAtt,如果您将值放置在占位符中,!Sub将自动为您解压缩值:

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

这在docs中有解释:

  

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

答案 1 :(得分:3)

AWS CloudFormation提供了一些内置功能,可帮助您管理堆栈。在模板中使用内部函数将值分配给在运行时才可用的属性。

Source from AWS

Fn::GetAtt内在函数从模板中的资源返回属性的值。

声明

  • JSON
    • { "Fn::GetAtt" : [ "logicalNameOfResource", "attributeName" ] }
  • YAML
    • 完整功能名称的语法:
    • Fn::GetAtt: [ logicalNameOfResource, attributeName ]
  • 缩写形式的语法:
    • !GetAtt logicalNameOfResource.attributeName

注意:请勿与双冒号混淆:Fn::GetAtt就像Fn_GetAtt

答案 2 :(得分:2)

我知道这是一个古老的问题,但仍然是Google的第一个结果:

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}

答案 3 :(得分:0)

如果首先使用Fn::简短形式,则可以将!用于嵌套的内在函数。所以

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