在 / 使用 CF 为 API Gateway 创建方法

Posted

技术标签:

【中文标题】在 / 使用 CF 为 API Gateway 创建方法【英文标题】:Create methods under / using CF for API Gateway 【发布时间】:2019-09-22 02:58:59 【问题描述】:

如何使用 CF 在 API Gateway 的根/文件夹下创建方法?例如,我有一个如下所示的网关:

/ 选项 发布

但是,当尝试使用 CF 执行此操作时,我得到: 资源的路径部分只允许在开头和结尾使用 a-zA-Z0-9._- 和花括号。所以我的 PathPart 是有问题的线。

  ApiGate:
    Type: AWS::ApiGateway::Resource
    Properties:
      ParentId: !GetAtt 
        - ApiGateApi
        - RootResourceId
      PathPart: '/'
      RestApiId: !Ref ApiGateApi

我可以将 PathPart 更改为其他内容,但随后它将它创建为 / 下的子对象,这是我不想要的。

【问题讨论】:

空字符串?或者 不幸的是,我已经尝试了这两种方法。大括号导致:属性 PathPart 的值必须是字符串类型。当我使用空字符串时:[/Resources/ApiGatewayResource/Type/PathPart/] 模板中不允许使用“null”值。 【参考方案1】:

将以下内容添加到我的AWS::ApiGateway::Method 后,结果现在可以使用了。

  MyMethodOPTIONS:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      ResourceId: !GetAtt MyRestApi.RootResourceId

这是我模板中的更多上下文:

  ApiGatewayMethodOPTIONS:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      ResourceId: !GetAtt ApiGatewayRestApi.RootResourceId
      RestApiId: !Ref ApiGatewayRestApi
      AuthorizationType: NONE
      HttpMethod: OPTIONS
      Integration:
        Type: MOCK
        IntegrationResponses:
          - ResponseParameters:
              method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'"
              method.response.header.Access-Control-Allow-Methods: "'POST,OPTIONS'"
              method.response.header.Access-Control-Allow-Origin: "'*'"
            ResponseTemplates:
              application/json: ''
            StatusCode: '200'
        PassthroughBehavior: NEVER
        RequestTemplates:
          application/json: '"statusCode": 200'
      MethodResponses:
        - ResponseModels:
            application/json: Empty
          ResponseParameters:
            method.response.header.Access-Control-Allow-Headers: true
            method.response.header.Access-Control-Allow-Methods: true
            method.response.header.Access-Control-Allow-Origin: true
          StatusCode: '200'
  ApiGatewayRestApi:
    Type: AWS::ApiGateway::RestApi
    Properties:
      ApiKeySourceType: HEADER
      EndpointConfiguration:
        Types:
          - REGIONAL
      Name: SearchAPI

【讨论】:

您能否添加更多细节来解决这个问题?可能是周围 CloudFormation 内容的更多上下文。 我在原始解决方案中添加了更多模板【参考方案2】:

这解决了我的问题,在我的情况下,我需要两种方法: 1.将响应对root的请求,例如https://<api-url>/prodhttps://<api-url>/prod/。这将使用 API Gateway 的 RootResourceId:

ResourceId: !GetAtt myApiGateway.RootResourceId

    这将响应在https://<api-url>/prod/ 下设置的任何请求。可能是petstore,或者如果使用proxy+,那么后端工作负载将尝试解析请求。它将引用模板中定义的资源类型:

ResourceId: !Ref myResource

【讨论】:

以上是关于在 / 使用 CF 为 API Gateway 创建方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 BOTO3 为 AWS Api Gateway 自动化 CORS

如何使用 AWS Cloudformer 为现有 API Gateway 创建云形成模板?

在 API Gateway 中设置阶段 » 为 REST API 部署设置阶段变量Stage variables

是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?

如何使用 OpenAPI 为 AWS API Gateway 配置 CORS?

如何使用 AWS CloudFormation 在 AWS API Gateway 上应用安全策略?