Шаблон AWS SAM не может создать конфигурации для шлюза API - PullRequest
2 голосов
/ 11 апреля 2019

У меня проблема с AWS SAM и настройками конфигурации шлюза API.Я пытаюсь сделать несколько вещей:

  1. Сконфигурировать шлюз API для запроса API-ключа в заголовках
  2. Создать свой собственный этап, как определено в моих конфигурационных файлах.
  3. Модель шлюза API, определенная в моем файле, не создается

В настоящее время шлюз API инициализируется и связывается с моей лямбда-функцией, но в двух вышеуказанных требованиях он не выполняется.Ниже приведены мои файлы: template.yaml и swagger.yaml.

Template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
    sam-nfeed-s3

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
    Function:
        Timeout: 60
    Api:
      EndpointConfiguration: REGIONAL
Resources:
  SAMnfeedS3API:
    Type: AWS::Serverless::Api
    Properties:
      StageName: alpha
      DefinitionUri: ./swagger.yaml
Resources:
  SAMnfeedS3Lambda:
    Type: AWS::Serverless::Function
    Properties:
        CodeUri: test-function-sam/
        Handler: nfeed_vdp_clusters.lambda_handler
        Runtime: python3.6
        Role: arn:aws:iam::XXXXXXX:role/Lambda
        Events:
            SAMnfeedS3API:
                Type: Api
                Properties:
                    Path: /vdp_clusters
                    Method: GET 
        Environment:
            Variables:
                TEST: test

Outputs:

    SAMnfeedS3API:
      Description: "API Gateway endpoint URL for Staging env"
      Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Staging/vdp_clusters"

    SAMnfeedS3Lambda:
      Description: "Lambda Function ARN"
      Value: !GetAtt SAMnfeedS3Lambda.Arn

Swagger.yaml

---
swagger: '2.0'
info:
  title: !Ref AWS::StackName
basePath: "/alpha"
schemes:
- "https"
x-amazon-apigateway-api-key-source : "HEADER"
paths:
  "/vdp_clusters":
    get:
      consumes:
      - application/json
      produces:
      - application/json
      parameters:
      - name: x-api-key
        in: header
        required: true
        type: string
      responses:
        200:
          description: "200 response"
          schema:
            $ref: "#/definitions/Empty"
      x-amazon-apigateway-integration:
        uri: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:XXXXXXXXX:function:${SAMnfeedS3Lambda.Arn}/invocations
        responses:
          default:
            statusCode: "200"
        httpMethod: "POST"
        type: aws_proxy
      security:
      - api_key: []
securityDefinitions:
  api_key:
    type: "apiKey"
    name: "x-api-key"
    in: "header"
definitions:
  Empty:
    type: "object"
    title: "Empty Schema"
    $schema: "http://json-schema.org/draft-04/schema#"

Как определено в моем чванстве и шаблонефайлы, для шлюза должна быть создана «альфа» ступень, но ничего не появляется.«Пустая» модель и требование API-ключа также не отображаются.Буду признателен за любую помощь.

1 Ответ

1 голос
/ 11 апреля 2019

Проблема в том, что вы дублировали ключ Resources в шаблоне.

Я рекомендую всегда использовать утилиту yamllint в шаблонах SAM, поскольку она обнаруживает проблемы форматирования YAML, которые sam validate не всегда может обнаружить.Вот что я получил:

▶ yamllint sam-app/template.yaml
sam-app/template.yaml
...
  18:1      error    duplication of key "Resources" in mapping  (key-duplicates)

Если вы посмотрите в файл packaged.yml, созданный шагом sam build, вы заметите, что определенный вами API будет отсутствовать.Это потому, что для dict в Python невозможно содержать дубликаты ключей.Второй указанный вами блок Resources просто перезаписывает первый, когда библиотека YAML Python считывает файл.

SAM затем генерирует неявный API SAMnfeedS3API на основе API, указанного в Events, используя егособственный сгенерированный Swagger, а не тот, который вы (как вы думали) предоставили.

Обратите также внимание, что после устранения проблемы с дублированием ключа вам также нужно будет ссылаться на свой API из Events с помощью строки вроде:

    Events:
      SAMnfeedS3API:
        Type: Api
        Properties:
          Path: /vdp_clusters
          Method: GET
          RestApiId: !Ref SAMnfeedS3API  ## ADD THIS LINE

См. Также мой предыдущий ответ здесь .

...