Точно какой путь я cURL для интеграции лямбда-шлюза LocalStack API?

LocalStack аккуратен, но трудно найти документацию для него. У меня проблемы с подключением к конечной точке прокси-сервера API Gateway, подключенного к функции Lambda.

Единственное, о чем я могу думать, - когда я делал пут-интеграцию для шлюза, я не был уверен, как обращаться с параметром учетных данных (учитывая, что он на 100% локальный... нет реальной учетной записи AWS, которую я использую) поэтому я оставил это комментарий пока:

aws --endpoint-url=http://localhost:4567 apigateway \
    put-integration \
    --region us-west-2 \
    --rest-api-id 0091232159 \
    --resource-id 3732709762 \
    --http-method ANY \
    --type AWS_PROXY \
    --integration-http-method POST \
    --uri arn:aws:lambda:us-west-2:000000000000:function:PostProposal \
    #--credentials arn:aws:iam::123456789012:role/apigAwsProxyRole

И мой коллега обнаружил нить, которая звучит так, как будто это ошибка в LocalStack:

https://github.com/atlassian/localstack/issues/129

Во всяком случае, вот как выглядит мой API, когда я делаю aws --endpoint-url=http://localhost:4567 apigateway get-resources --rest-api-id 0091232159:

{
    "items": [
        {
            "id": "3312801A-ZA-Z6",
            "path": "/",
            "resourceMethods": {
                "GET": {}
            }
        },
        {
            "id": "3732709762",
            "parentId": "3312801A-ZA-Z6",
            "pathPart": "{proxy+}",
            "path": "/{proxy+}",
            "resourceMethods": {
                "GET": {},
                "ANY": {
                    "httpMethod": "ANY",
                    "authorizationType": "NONE",
                    "methodIntegration": {
                        "type": "AWS_PROXY",
                        "httpMethod": "ANY",
                        "uri": "arn:aws:lambda:us-west-2:000000000000:function:PostProposal",
                        "integrationResponses": {
                            "200": {
                                "statusCode": 200,
                                "responseTemplates": {
                                    "application/json": null
                                }
                            }
                        }
                    }
                }
            }
        }
    ]
}

Моя лямбда-функция все настроена и отвечает 200, когда я делаю:

aws --endpoint-url=http://localhost:4574 lambda invoke --function-name PostProposal outfile.json

Теперь я просто хочу свернуть конечную точку, которая будет запускать Lambda.

Я нашел эту тему: https://github.com/localstack/localstack/issues/229 которой есть пример cURL:

curl http://localhost:4567/restapis/35937034A-Z3/test/_user_request_/u-1234

И еще один: https://bitbucket.org/atlassian/localstack/issues/4/how-to-create-api-gateway-deployments который имеет:

curl http://localhost:4567/restapis/$api_id/v1/_user_request_/mypath

Я знаю мой идентификатор API, и это v1 соответствует моему сценическому имени. Моя конечная точка находится в корне, поэтому я не думаю, что мне нужно что-то там, где он попал в обход.

Итак, я пробовал все варианты путей, как это с GET и POST:

curl http://localhost:4567/restapis/0091232159/test/_user_request_/

Я получаю различные ответы 404, 500 и {"message": "Unable to find integration for path ...,

Я по крайней мере поражаю имитируемый сервер API Gateway; когда я делаю curl -vv я вижу:

* Connected to localhost (127.0.0.1) port 4567 (#0)
> GET /restapis/0091232159/test/_user_request_/ HTTP/1.1
> Host: localhost:4567
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 404 Not Found

Есть идеи? Мне просто нужен волшебный путь!

2 ответа

Вы развернули свой API? Я не вижу команду для этого выше. Если да, это должно быть видно, если вы откроете http://localhost:4567/restapis в своем браузере.

Просто чтобы быть уверенным, вот полное пошаговое руководство по настройке лямбды с API-шлюзом в Localstack:

Сначала мы создаем простую NodeJS Lambda:

const apiTestHandler = (payload, context, callback) => {
console.log(`Function apiTestHandler called with payload ${JSON.stringify(payload)}`);
callback(null, {
    statusCode: 201,
    body: JSON.stringify({
        somethingId: payload.pathParameters.somethingId
    }),
    headers: {
        "X-Click-Header": "abc"
    }
}); 
}
module.exports = {
    apiTestHandler,
}

Поместите это в ZIP-файл с именем apiTestHandler.zip и загрузите его в localstack:

aws lambda create-function \
--region us-east-1 \
--function-name api-test-handler \
--runtime nodejs6.10 \
--handler index.apiTestHandler \
--memory-size 128 \
--zip-file fileb://apiTestHandler.zip \
--role arn:aws:iam::123456:role/role-name --endpoint-url=http://localhost:4574

Теперь мы можем создать наш Rest-Api:

aws apigateway create-rest-api --region us-east-1 --name 'API Test' --endpoint-url=http://localhost:4567

Это дает следующий ответ:

{
"name": "API Test",
"id": "487109A-Z548",
"createdDate": 1518081479
}

С помощью идентификатора, который мы получили, мы можем запросить его идентификатор родителя:

aws apigateway get-resources --region us-east-1 --rest-api-id 487109A-Z548 --endpoint-url=http://localhost:4567

Отклик:

{
"items": [
    {
        "path": "/",
        "id": "0270A-Z23550",
        "resourceMethods": {
            "GET": {}
        }
    }
]
}

Теперь у нас есть все для создания нашего ресурса вместе с его путем:

aws apigateway create-resource \
--region us-east-1 \
--rest-api-id 487109A-Z548 \
--parent-id 0270A-Z23550 \
--path-part "{somethingId}" --endpoint-url=http://localhost:4567

Отклик:

{
"resourceMethods": {
    "GET": {}
},
"pathPart": "{somethingId}",
"parentId": "0270A-Z23550",
"path": "/{somethingId}",
"id": "0662807180"
}

Идентификатор, который мы здесь получили, необходим для создания нашего связанного метода GET:

aws apigateway put-method \
 --region us-east-1 \
 --rest-api-id 487109A-Z548 \
 --resource-id 0662807180 \
 --http-method GET \
 --request-parameters "method.request.path.somethingId=true" \
 --authorization-type "NONE" \
--endpoint-url=http://localhost:4567

Мы почти на месте - одна из последних вещей, которую нужно сделать, - это создать нашу интеграцию с уже загруженной лямбдой:

aws apigateway put-integration \
 --region us-east-1 \
 --rest-api-id 487109A-Z548 \
 --resource-id 0662807180 \
 --http-method GET \
 --type AWS_PROXY \
 --integration-http-method POST \
 --uri arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:000000000000:function:api-test-handler/invocations \
 --passthrough-behavior WHEN_NO_MATCH \
 --endpoint-url=http://localhost:4567

И последнее, но не менее важное: разверните наш API до желаемой стадии:

aws apigateway create-deployment \
 --region us-east-1 \
 --rest-api-id 487109A-Z548 \
 --stage-name test \
 --endpoint-url=http://localhost:4567

Теперь мы можем проверить это:

curl http://localhost:4567/restapis/487109A-Z548/test/_user_request_/HowMuchIsTheFish

Отклик:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
100    34  100    34    0     0      9      0  0:00:03  0:00:03 --:--:--     9
{"somethingId":"HowMuchIsTheFish"}

Надеюсь, это поможет.

Совет 1: для более легкого использования я рекомендую установить AWSCLI Local ( https://github.com/localstack/awscli-local) - с этим инструментом вы можете использовать команду "awslocal" и не нужно вводить "--endpoint" -url= ..."для каждой команды

Подсказка 2: Если вы не хотите определять вышеописанные шаги вручную каждый раз в будущем, я рекомендую использовать Serverless Framework ( https://serverless.com/) вместе с плагином localstack ( https://github.com/temyers/serverless-localstack). Если вам нужна помощь в этом, я также могу предоставить вам краткое руководство.

      http://localhost:4566/restapis/**{your api gateway rest-api-id }** /**{your api gateway stage name}**/_user_request_/**{your api gateway pathpath i.e /users}**

Я использовал это:

      http://localhost:4566/restapis/mcycg8nxqr/local/_user_request_/users
Другие вопросы по тегам