1

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

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

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

非常感谢您的想法!

4

3 回答 3

3

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'

于 2020-05-05T15:01:15.773 回答
1

我让它以这种方式工作

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

出于某种原因,速记函数不能在 Fn::Sub 函数内部工作uri${stageVariables.<somename>}也不能在 Fn::Sub 函数内部工作。

请注意,这只发生在大摇大摆的定义主体内

于 2020-05-08T02:13:12.693 回答
0

正如 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
于 2021-01-27T13:36:24.260 回答