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