Я создаю большое приложение, которое имеет «статические» ресурсы (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"