Интеграция AWS API Gateway и Lambda с ресурсами различных стеков облачной информации - PullRequest
0 голосов
/ 01 марта 2019

Я хочу интегрировать лямбда-функцию в шлюз API, чтобы при выполнении процедуры POST для пути, определенного на шлюзе API, выполнялась лямбда-функция и возвращалось значение.

Теперь в моем текущем проектеВ настоящее время у нас есть 2 шаблона Cloudformation: - один, который является общим и содержит определение ресурсов, общих для всех сред разработки; - и еще один неуниверсальный, который развертывает различные ресурсы в зависимости от среды, передаваемой в качестве параметра (dev, prod и т. д.).

В не универсальном я определил лямбда-функцию, а также развертывание и этап.В общем шаблоне CF я определил APIGateway следующим образом:

Resources:
  RecargakiApiGateway:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Body:
        swagger: "2.0"
        info:
          version: "VersionTimestamp"
          title: "Some API"
        host: "some.host"
        schemes:
          - "https"
        paths:
          /payment:
            post:
              produces:
                - "application/json"
              responses:
                "200":
                  description: "200 response"
                  schema:
                    $ref: "#/definitions/Empty"
              x-amazon-apigateway-integration:
                credentials: 
                  Fn::ImportValue:
                    "lambda-credentials-outputvalue-in-another-generic-stack"
                uri: !Sub
                  - "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda::${AWS::Region}:${AWS::AccountId}:function:${lambdaName}/invocations"
                  - lambdaName: "${stageVariables.lambda_name}"
                responses:
                  default:
                    statusCode: "200"
                passthroughBehavior: "when_no_match"
                timeoutInMillis: 5000
                httpMethod: "POST"
                contentHandling: "CONVERT_TO_TEXT"
                type: "aws_proxy"
        definitions:
          Empty:
            type: "object"
            title: "Empty Schema"
      Description: "Desc"
      Name: "Name"
      EndpointConfiguration:
        Types:
          - REGIONAL

Теперь в соответствии с документами по интеграции прокси-серверов AWS можно построить лямбда-ури следующим образом:

arn:aws:apigateway:<region>:lambda:path/2015-03-31/functions/arn:aws:lambda::<account_id>:function:${stageVariables.<function_variable_name>}/invocations

Я пытался построить URI в соответствии с этим форматом, но я получаю эту ошибку:

Unable to put integration on 'POST' for resource at path '/payment': Invalid function ARN or invalid uri (Service: AmazonApiGateway; Status Code: 400; Error Code: BadRequestException

Во всех примерах, которые я видел, люди предполагают, что интегрируемая функция Lambdaнаходится в том же шаблоне / стеке CF, что и ресурс API-шлюза, но я понятия не имею, как ссылаться на ARN и / или имя функции в определении Swagger шлюза API, когда функция фактически находится в другом стеке CF.

Я также пытался ссылаться на переменную stage, которая содержала бы полный URI, например:

uri: "${stageVariables.functionURI}" # the URI would be constructed in the non generic stack in the format stated by the docs

Но она не работает с:

Unable to put integration on 'POST' for resource at path '/payment': Invalid ARN specified in the request (Service: AmazonApiGateway; Status Code: 400; Error Code: BadRequestException

Любая помощь очень ценится.

...