Точно какой путь я 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