Я только начинаю работать с AWS Lambda и Bref.sh.Мне удалось создать несколько функций, каждая из которых имеет собственный API-шлюз.Однако у меня возникли проблемы с выяснением того, как публиковать несколько функций в одном шлюзе API.Шаблон по умолчанию template.yaml выглядит так:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: ''
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: 'my-function'
Description: ''
CodeUri: .
Handler: index.php
Timeout: 30 # in seconds (API Gateway has a timeout of 30 seconds)
MemorySize: 1024 # The memory size is related to the pricing and CPU power
Runtime: provided
Layers:
- 'arn:aws:lambda:us-east-1:209497400698:layer:php-73-fpm:1'
Events:
# The function will match all HTTP URLs
HttpRoot:
Type: Api
Properties:
Path: /
Method: ANY
HttpSubPaths:
Type: Api
Properties:
Path: /{proxy+}
Method: ANY
# Outputs show up in the CloudFormation dashboard
Outputs:
DemoHttpApi:
Description: 'URL of our function in the *Prod* environment'
Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/'
Давайте предположим, что у меня есть две разные функции, привет и до свидания (каждая в своих собственных каталогах в моей системе).Я хочу загрузить их так, чтобы они оба были вложены как ресурсы в один и тот же шлюз API. Итак, я изменил шаблон следующим образом:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: ''
Resources:
Hello:
Type: AWS::Serverless::Function
Properties:
FunctionName: 'hello'
Description: ''
CodeUri: .
Handler: ./hello/index.php
Timeout: 30 # in seconds (API Gateway has a timeout of 30 seconds)
MemorySize: 1024 # The memory size is related to the pricing and CPU power
Runtime: provided
Layers:
- 'arn:aws:lambda:us-east-1:209497400698:layer:php-73-fpm:1'
Events:
# The function will match all HTTP URLs
HttpRoot:
Type: Api
Properties:
Path: /hello/
Method: ANY
HttpSubPaths:
Type: Api
Properties:
Path: /hello/{proxy+}
Method: ANY
Goodbye:
Type: AWS::Serverless::Function
Properties:
FunctionName: 'goodbye'
Description: ''
CodeUri: .
Handler: ./goodbye/index.php
Timeout: 30 # in seconds (API Gateway has a timeout of 30 seconds)
MemorySize: 1024 # The memory size is related to the pricing and CPU power
Runtime: provided
Layers:
- 'arn:aws:lambda:us-east-1:209497400698:layer:php-73-fpm:1'
Events:
# The function will match all HTTP URLs
HttpRoot:
Type: Api
Properties:
Path: /goodbye/
Method: ANY
HttpSubPaths:
Type: Api
Properties:
Path: /goodbye/{proxy+}
Method: ANY
# Outputs show up in the CloudFormation dashboard
Outputs:
DemoHttpApi:
Description: 'URL of our function in the *Prod* environment'
Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/'
Все загружается и публикуется просто отлично - шлюз API созданкаждая функция является ресурсом корневого API, я могу проверить, что код существует для каждой лямбды и т. д. Однако, если я щелкну URL-адрес для любой из функций, я получу:
{"message": "Internal server error"}
Чтоя делаю не так?
РЕДАКТИРОВАТЬ
Я понял, в чем проблема.CodeUri
ссылается на корневой путь проекта - я думал, что он ссылается на рабочий путь для каждого скрипта.Итак, CodeUri
должно оставаться как "."в то время как Handler
должен включать полный путь к каждому сценарию (с использованием относительных обозначений, таких как ./path/to/index.php
).Для получения дополнительной информации я разместил свои заметки для Брефа в Gist: https://gist.github.com/summersab/e55050b781c043439898bf66044359b3