AWS SAM - 如何在 swagger 端点 uri 上将阶段变量与 Fn::Sub 组合
AWS SAM - How to combine stage variables with Fn::Sub on swagger endpoint uri
我们有一个堆栈,它利用另一个堆栈的输出,并在 swagger 定义主体中使用 Fn::ImportValue
进行跨堆栈引用。
Note: other parts ommitted to shorten the code
SampleApi:
Type: AWS::Serverless::Api
Properties:
StageName: Stage
Variables:
SampleFunctionName:
Fn::ImportValue:
!Sub ${OtherStackName}-SampleFunctionName
DefinitionBody:
swagger: 2.0
paths:
/sample:
get:
x-amazon-apigateway-integration:
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${stageVariables.SampleFunctionName}/invocations
其中 ${OtherStackName}-SampleFunctionName
是从其他堆栈导入的函数的名称。
现在,我们现在的问题是我们不能将它放在端点的 uri
中。 Cloudformation 在 sam deploy 期间抱怨它,说 ${stageVariables.SampleFunctionName}
是 Fn::Sub.
中的非法属性
我尝试了几种方法,包括将整个 uri
放在 stage 变量本身上,但仍然没有出现。
非常感谢您的想法!
Fn::Sub 从 SAM CLI 的 v0.21.0 版本开始支持。 0.21.0以下的版本不支持大部分的Cloudformation Intrinsic Functions。
可以查看下面的link了解更多详情:
https://github.com/awslabs/aws-sam-cli/issues/528
https://github.com/awslabs/aws-sam-cli/releases/tag/v0.21.0
如果您使用的版本低于上述版本,您可以尝试使用 Fn::Join 而不是 Fn::Sub 作为解决方法
uri: !Join
- ''
- - 'arn:aws:apigateway:'
- !Ref "AWS::Region"
- ':lambda:path/2015-03-31/functions/arn:aws:lambda:'
- !Ref "AWS::Region"
- ':'
- !Ref "AWS::AccountId"
- ':function:${stageVariables.SampleFunctionName}/invocations'
我是这样工作的
x-amazon-apigateway-integration:
uri:
Fn::Join:
- ''
- - Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
- Fn::ImportValue:
Fn::Sub: ${StackName}-FunctionArn
- /invocations
出于某种原因,shorthand 函数在 uri
中不起作用,并且 ${stageVariables.<somename>}
在 Fn::Sub 函数中不起作用。
Note that this only happens inside a swagger definition body
正如 Jeff 所提到的,阶段变量在 Fn::Sub 函数中不起作用。但是,如果有人希望在 uri 字符串中使用阶段变量,下面的代码对我有用。
uri:
Fn::Join:
- ''
- - arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
- Fn::Sub: ${LambaFunctionResource.Arn}
- :${stageVariables.<stageVariableName>}
- /invocations
我们有一个堆栈,它利用另一个堆栈的输出,并在 swagger 定义主体中使用 Fn::ImportValue
进行跨堆栈引用。
Note: other parts ommitted to shorten the code
SampleApi:
Type: AWS::Serverless::Api
Properties:
StageName: Stage
Variables:
SampleFunctionName:
Fn::ImportValue:
!Sub ${OtherStackName}-SampleFunctionName
DefinitionBody:
swagger: 2.0
paths:
/sample:
get:
x-amazon-apigateway-integration:
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${stageVariables.SampleFunctionName}/invocations
其中 ${OtherStackName}-SampleFunctionName
是从其他堆栈导入的函数的名称。
现在,我们现在的问题是我们不能将它放在端点的 uri
中。 Cloudformation 在 sam deploy 期间抱怨它,说 ${stageVariables.SampleFunctionName}
是 Fn::Sub.
我尝试了几种方法,包括将整个 uri
放在 stage 变量本身上,但仍然没有出现。
非常感谢您的想法!
Fn::Sub 从 SAM CLI 的 v0.21.0 版本开始支持。 0.21.0以下的版本不支持大部分的Cloudformation Intrinsic Functions。
可以查看下面的link了解更多详情:
https://github.com/awslabs/aws-sam-cli/issues/528
https://github.com/awslabs/aws-sam-cli/releases/tag/v0.21.0
如果您使用的版本低于上述版本,您可以尝试使用 Fn::Join 而不是 Fn::Sub 作为解决方法
uri: !Join
- ''
- - 'arn:aws:apigateway:'
- !Ref "AWS::Region"
- ':lambda:path/2015-03-31/functions/arn:aws:lambda:'
- !Ref "AWS::Region"
- ':'
- !Ref "AWS::AccountId"
- ':function:${stageVariables.SampleFunctionName}/invocations'
我是这样工作的
x-amazon-apigateway-integration:
uri:
Fn::Join:
- ''
- - Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
- Fn::ImportValue:
Fn::Sub: ${StackName}-FunctionArn
- /invocations
出于某种原因,shorthand 函数在 uri
中不起作用,并且 ${stageVariables.<somename>}
在 Fn::Sub 函数中不起作用。
Note that this only happens inside a swagger definition body
正如 Jeff 所提到的,阶段变量在 Fn::Sub 函数中不起作用。但是,如果有人希望在 uri 字符串中使用阶段变量,下面的代码对我有用。
uri:
Fn::Join:
- ''
- - arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
- Fn::Sub: ${LambaFunctionResource.Arn}
- :${stageVariables.<stageVariableName>}
- /invocations