Как получить строку запроса в интеграции шлюза AWS лямбда - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь запустить немного измененный пример :

AWSTemplateFormatVersion: "2010-09-09"
Description: "My API Gateway and Lambda function"

Parameters:
    apiGatewayStageName:
        Type: "String"
        AllowedPattern: "^[a-z0-9]+$"
        Default: "call"

    lambdaFunctionName:
        Type: "String"
        AllowedPattern: "^[a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+$"
        Default: "my-function"

Resources:
    apiGateway:
        Type: "AWS::ApiGateway::RestApi"
        Properties:
            Name: "my-api"
            Description: "My API"

    apiGatewayRootMethod:
        Type: "AWS::ApiGateway::Method"
        Properties:
            AuthorizationType: "NONE"
            HttpMethod: "GET"
            Integration:
                IntegrationHttpMethod: "POST"
                Type: "AWS_PROXY"
                Uri: !Sub
                    - "arn:aws:apigateway:${AWS::Region}:lambda:path/functions/${lambdaArn}/invocations"
                    - lambdaArn: !GetAtt "lambdaFunction.Arn"
            ResourceId: !GetAtt "apiGateway.RootResourceId"
            RestApiId: !Ref "apiGateway"

    apiGatewayDeployment:
        Type: "AWS::ApiGateway::Deployment"
        DependsOn:
            - "apiGatewayRootMethod"
        Properties:
            RestApiId: !Ref "apiGateway"
            StageName: !Ref "apiGatewayStageName"

    lambdaFunction:
        Type: "AWS::Lambda::Function"
        Properties:
            Code:
                ZipFile: |
                    def handler(event,context):
                      return {
                        'body': 'Hello there {0}'.format(event['requestContext']['identity']['sourceIp']),
                        'headers': {
                          'Content-Type': 'text/plain'
                        },
                        'statusCode': 200
                      }
            Description: "My function"
            FunctionName: !Ref "lambdaFunctionName"
            Handler: "index.handler"
            MemorySize: 128
            Role: !GetAtt "lambdaIAMRole.Arn"
            Runtime: "python2.7"
            Timeout: 10

    lambdaApiGatewayInvoke:
        Type: "AWS::Lambda::Permission"
        Properties:
            Action: "lambda:InvokeFunction"
            FunctionName: !GetAtt "lambdaFunction.Arn"
            Principal: "apigateway.amazonaws.com"
            SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${apiGateway}/*/GET/"

    lambdaIAMRole:
        Type: "AWS::IAM::Role"
        Properties:
            AssumeRolePolicyDocument:
                Version: "2012-10-17"
                Statement:
                    - Action:
                          - "sts:AssumeRole"
                      Effect: "Allow"
                      Principal:
                          Service:
                              - "lambda.amazonaws.com"
            Policies:
                - PolicyDocument:
                      Version: "2012-10-17"
                      Statement:
                          - Action:
                                - "logs:CreateLogGroup"
                                - "logs:CreateLogStream"
                                - "logs:PutLogEvents"
                            Effect: "Allow"
                            Resource:
                                - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${lambdaFunctionName}:*"
                  PolicyName: "lambda"

    lambdaLogGroup:
        Type: "AWS::Logs::LogGroup"
        Properties:
            LogGroupName: !Sub "/aws/lambda/${lambdaFunctionName}"
            RetentionInDays: 90

Outputs:
    apiGatewayInvokeURL:
        Value: !Sub "https://${apiGateway}.execute-api.${AWS::Region}.amazonaws.com/${apiGatewayStageName}"

    lambdaArn:
        Value: !GetAtt "lambdaFunction.Arn"

Все работает, но когда я пытаюсь получить строку запроса, я получаю нулевое значение. Какая необходимая конфигурация необходима для передачи параметров строки запроса в лямбду?

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Вы найдете параметры строки запроса в подкаталогах queryStringParameters и multiValueQueryStringParameters полученных event, например,

const queryStringParams = event.queryStringParameters;
console.log(JSON.stringify(queryStringParams));

Документирование параметров строки запроса и других доступных данныхможно найти в разделе Формат ввода лямбда-функции для интеграции прокси в руководстве разработчика API Amazon Gateway.

Примечание: данные, доступные в событии Lambda, различаются в зависимости от событияисточник, который запускает лямбду.Иногда достаточно просто зарегистрировать входящее событие, например console.log(JSON.stringify(event));.

1 голос
/ 09 июля 2019

Как именно вы пытаетесь получить параметры строки запроса?

Поскольку вы используете интеграцию прокси, HTTP-запрос отправляется как есть вашей лямбда-функции без каких-либо изменений в API Gateway, что означает, что параметры строки запросадоступны через объект события - event['queryStringParameters']

Я попробовал ваш пример и добавил оператор печати в функцию

def lambda_handler(event,context):
    print('query string params', event['queryStringParameters'])
    return {
        'body': 'Hello there {0}'.format(event['requestContext']['identity']['sourceIp']),
        'headers': {
            'Content-Type': 'text/plain'
        },
        'statusCode': 200
    }

И если я нажму эту конечную точку API, при указании некоторых параметров строки запросанапример, ?a=1&b=2, я вижу, что функция правильно регистрирует эти параметры.

CloudWatch регистрирует:

START RequestId: 18f343c8-55ff-4b26-8d74-ae81ce90e8de Version: $LATEST
query string params {'a': '1', 'b': '2'}
END RequestId: 18f343c8-55ff-4b26-8d74-ae81ce90e8de
REPORT RequestId: 18f343c8-55ff-4b26-8d74-ae81ce90e8de  Duration: 20.58 ms  Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 53 MB  
...