我能够设置localstack(https://github.com/atlassian/localstack)并在其中创建lambda函数(使用create-function ...命令)。但是,我找不到在localstack中创建APIGateway的方法,以便可以使用它调用lambda函数。 基本上,我需要一个APIGateway(和它的arn),以便使用lambda函数可以调用。
答案 0 :(得分:15)
每个CLI与API网关一起创建NodeJS 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"
}
创建链接的GET方法需要我们在这里获得的ID:
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 = ...“对于每个命令
使用无服务器框架和Localstack的演练:
您还可以使用无服务器框架(https://serverless.com/)。
首先通过npm安装:
npm install serverless -g
现在,您可以基于nodejs-aws模板创建示例应用程序:
serverless create --template aws-nodejs
要拥有HTTP端点,您必须编辑serverless.yml
并添加相应的事件:
functions:
hello:
handler: handler.hello
events:
- http:
path: ping
method: get
要针对您的localstack安装运行此操作,您必须使用serverless-localstack插件(https://github.com/temyers/serverless-localstack):
npm install serverless-localstack
现在您必须再次编辑serverless.yml
,添加插件并调整端点。在我的情况下,localstack在Docker工具箱中运行,因此它的IP是192.168.99.100
- 您可能需要将其更改为localhost
,具体取决于您的使用情况:
plugins:
- serverless-localstack
custom:
localstack:
debug: true
stages:
- local
- dev
host: http://192.168.99.100
endpoints:
S3: http://192.168.99.100:4572
DynamoDB: http://192.168.99.100:4570
CloudFormation: http://192.168.99.100:4581
Elasticsearch: http://192.168.99.100:4571
ES: http://192.168.99.100:4578
SNS: http://192.168.99.100:4575
SQS: http://192.168.99.100:4576
Lambda: http://192.168.99.100:4574
Kinesis: http://192.168.99.100:4568
现在您可以尝试部署它:
serverless deploy --verbose --stage local
这将创建一个S3存储桶,上传您的lambda并创建一个cloudformation堆栈。但是,与AWS相比,由于localstack存在一些不一致,该过程将失败。不要感到沮丧,创建的云形态模板工作正常,您只需要一个额外的请求就可以了:
awslocal cloudformation update-stack --template-body file://.serverless/cloudformation-template-update-stack.json --stack-name aws-nodejs-local
现在你的lambda已部署并可以测试:
curl http://192.168.99.100:4567/restapis/75A-Z278430A-Z/local/_user_request_/ping
响应:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed
100 364 100 364 0 0 111 0 0:00:03 0:00:03 --:--:-- 111
{"message":"Go Serverless v1.0! Your function executed successfully!","input":{"body":null,"headers":{"host":"192.168.99.100:4567","accept":"*/*","user-agent":"curl/7.49.1"},"resource":"/restapis/75A-Z278430A-Z/local/_user_request_/ping","queryStringParameters":{},"httpMethod":"GET","stageVariables":{},"path":"/ping","pathParameters":{},"isBase64Encoded":false}}
希望这有帮助。
答案 1 :(得分:1)
看起来有一个与在GitHub上使用localstack设置API网关相关的未解决问题:
https://github.com/localstack/localstack/issues/129
您可以尝试按照答案中提供的步骤进行操作。
从GitHub问题复制:
"""
一种选择是使用无服务器框架(https://github.com/serverless/serverless)。否则,您可以直接调用LocalStack服务(通过CLI或SDK)来创建API网关资源+方法+集成,并将它们连接到您的Lambda函数。
以下是一些可能有用的提示: https://ig.nore.me/2016/03/setting-up-lambda-and-a-gateway-through-the-cli/("创建角色"部分可以跳过) https://github.com/atlassian/localstack/issues/101 https://github.com/temyers/serverless-localstack """