AWS SAM - многоуровневая циклическая зависимость между лямбда-ресурсами SAM и API-ресурсами SAM - PullRequest
1 голос
/ 01 июня 2019

Я создаю большое приложение, которое имеет «статические» ресурсы (API, лямбда-уровни LayerVersions, таблицы DynamoDB и т. Д.) И «динамические» ресурсы (лямбда-функции, очереди Batch и SQS).

Чтобы упорядочить это, я создал несколько файлов шаблонов, некоторые из которых ссылались на другие, используя тип SAM AWS::Serverless::Application.

В некоторых «модулях» (вложенные стеки 1-го уровня) у меня есть лямбда-выражения, которые действуют как лямбда-прокси, и API, с которым они интегрируются, объявляется во вложенном стеке StaticResourcesModule.

Однако этим лямбдам необходимо AWS::Serverless::Api RestApiId свойство , чтобы знать, на какое событие ответить .

Циркулярная зависимость возникает из-за того, что шаблон Swagger 2.0, определяющий AWS::Serverless::Api, в первую очередь , нуждается в ARN лямбда-выражения (или имени и номере счета лямбда-функции) , чтобы узнать, какой лямбда-код реализует какой метод (x-amazon-apigateway-integration атрибут uri)

Как я могу передать в API ссылку на лямбду, если самим лямбдам нужна ссылка на свойство API RestApiId, и оба находятся в разных стеках?

Файл шаблона YAML верхнего уровня выглядит следующим образом:

Resources:
  StaticResourcesModule:
    Type: AWS::Serverless::Application
    Properties:
      Location: static_resources_module/template.yaml

  DataFetchingModule:
    Type: AWS::Serverless::Application
    Properties:
      Location: datafetching_module/template.yaml
      Parameters:
        MainApiId: !GetAtt StaticResourcesModule.Outputs.MainApiId

datafetching_module/template.yaml:

Parameters:
  MainApiId:
    Type: String
    Description: >
      Reference to the main api (AWS::Serverless::Api) resource.

Resources:
  FetchingRequestsHandler:
    Type: AWS::Serverless::Function
    Description: Handles incoming requests [...]
    Properties:
      [...]
      Events:
        ApiPostNewRequestEvent:
          Type: Api
          Properties:
            Method: post
            Path: /fetching/low-priority
            RestApiId: !Ref MainApiId

static_resources_module/template.yaml

Parameters:
    FetchingRequestsHandlerArn:
        Type: String
Resources:
  MainApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      DefinitionUri: api/swagger2_template.yaml

Outputs:
 MainApiId:
   Value: !Ref MainApi
   Description: The Main API's RestApiId which to provide to the Lambda that require an API Event (lambda proxy)

api/swagger2_template.yaml

  /fetching/low-priority:
    post:
      # API integration, necessary.
      x-amazon-apigateway-integration:
        uri:
          Fn::Sub: "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${FetchingRequestsHandlerArn}/invocations"
...