我创建了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"
如何一起使用这些功能并获得理想的结果?
答案 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提供了一些内置功能,可帮助您管理堆栈。在模板中使用内部函数将值分配给在运行时才可用的属性。
Fn::GetAtt
内在函数从模板中的资源返回属性的值。
声明
{ "Fn::GetAtt" : [ "logicalNameOfResource", "attributeName" ] }
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"