【问题标题】:AWS SAM - How to combine stage variables with Fn::Sub on swagger endpoint uriAWS SAM - 如何在 swagger 端点 uri 上将阶段变量与 Fn::Sub 组合
【发布时间】:2020-08-20 03:13:17
【问题描述】:

我们有一个堆栈,它使用另一个堆栈的输出和跨堆栈引用,在一个 swagger 定义主体中使用Fn::ImportValue

注:其他部分省略以缩短代码

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 放在舞台变量本身上,但仍然没有出现。

非常感谢您的想法!

【问题讨论】:

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


    【解决方案1】:

    从 SAM CLI 的 v0.21.0 版本开始支持 Fn::Sub。 0.21.0 以下的版本不支持大部分 Cloudformation Intrinsic Functions。

    可以查看以下链接了解更多详情:

    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'
    
    

    【讨论】:

    • 感谢您抽出宝贵时间给出答案。它有点笨重,但无论如何它都可以工作。我最终修改了您的脚本并使我们的部署工作。
    【解决方案2】:

    我让它这样工作

    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
    

    由于某种原因,速记函数在 uri 中不起作用,${stageVariables.<somename>} 在 Fn::Sub 函数中不起作用。

    请注意,这只发生在 swagger 定义体中

    【讨论】:

      【解决方案3】:

      正如 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
      

      【讨论】:

        猜你喜欢
        • 2018-06-19
        • 1970-01-01
        • 2020-07-20
        • 1970-01-01
        • 1970-01-01
        • 2021-03-20
        • 1970-01-01
        • 2021-01-07
        • 2020-06-13
        相关资源
        最近更新 更多