LocalStack 很简洁,但很难找到它的文档。我在访问连接到 Lambda 函数的 API Gateway 代理端点时遇到问题。
我唯一能想到的是,当我为网关进行放置集成时,我不确定如何处理凭证参数(假设这是 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
}
}
}
}
}
}
}
]
}
我的 Lambda 函数已全部设置完毕,并在我这样做时响应 200:
aws --endpoint-url=http://localhost:4574 lambda invoke --function-name PostProposal outfile.json
现在我只想 cURL 一个将触发 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 ID,并且“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
有什么想法吗?我只需要魔法之路!
您部署了 API 吗?我没有看到上面的命令。如果是,在浏览器中打开 http://localhost:4567/restapis 应该可以看到。
可以肯定的是,这里是在 Localstack 中使用 API 网关设置 lambda 的完整演练:
首先我们创建一个简单的 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,
}
将其放入名为 apiTestHandler.zip 的 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
}
有了我们在这里获得的 ID,我们可以询问其父 ID:
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"
}
我们在此处获得的 ID 需要用于创建链接的 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
我们就快到了 - 最后要做的事情之一就是创建与已上传的 lambda 的集成:
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