AWS Lambda с использованием Bref / PHP - несколько функций в шлюзе API - PullRequest
0 голосов
/ 11 марта 2019

Я только начинаю работать с 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

...