无法使用 Sub 函数指定 x-amazon-apigateway-integration uri

Unable to specify x-amazon-apigateway-integration uri with Sub function

我有一个 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 for integration must contain path or action"。

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

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

是的,在为 swagger yaml 使用 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 结合使用。希望这有帮助。

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" 指定您的 swagger 文件是行不通的。

# 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