1

我有一个 swagger.yaml 文件,其中包含以下内容:

paths:
  /path/endpoint:
    post:
      ...
      x-amazon-apigateway-integration:
        uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyFunction.Arn}/invocations"

当我尝试使用 sam cli 部署它时,我在 CloudFormation 中收到错误“用于集成的 AWS ARN 必须包含路径或操作”。

但是,如果我对 AWS::Region 值和 MyFunction.Arn 进行硬编码,则不会收到错误消息。

有谁知道为什么 Sub 函数对 uri 不起作用?

4

2 回答 2

2

是的,当使用 yaml 格式作为 swagger yaml 时,您需要像这样格式化您的集成路径:

x-amazon-apigateway-integration:
    uri:
      Fn::Sub: "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyFunction.Arn}/invocations"

您正在使用的简短形式(对于 sub,“!Sub”)会给您带来问题。您需要使用长格式 Fn::Sub 如果您正在使用 SAM,我还建议您查看有关内部函数的 AWS 文档,尤其是将 Sub 与 Imports 结合使用。希望这可以帮助。

于 2018-09-06T12:02:41.400 回答
2

Shravan 提到了问题的一半。您需要做的另一件事是使用“DefinitionBody”和“Fn::Transform”,如下所示,将您的 swagger 文件添加到您的模板时,否则您的 swagger 文件中的变量将不会被替换。

Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      Name: my-api
      StageName: dev
      DefinitionBody:
        'Fn::Transform':
          Name: 'AWS::Include'
          Parameters:
            Location: s3://my-api/swagger.yaml

简单地使用“DefinitionUri”来指定你的招摇文件是行不通的。

# This will cause the variables in your swagger file to not be substituted. You must use the format above to get variables to work in your swagger file.
Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      Name: my-api
      StageName: dev
      DefinitionUri: swagger.yaml

不幸的是,这也意味着您需要在部署 SAM 之前指定 swagger 文件的完整 s3 路径并将其上传到 S3。请参阅:https ://github.com/awslabs/serverless-application-model/issues/305

于 2018-09-07T13:54:31.803 回答