gpt4 book ai didi

aws-lambda - 在localstack中创建API网关

转载 作者:行者123 更新时间:2023-12-02 11:47:20 25 4
gpt4 key购买 nike

我能够设置 localstack ( https://github.com/atlassian/localstack ) 并在其中创建 lambda 函数(使用 create-function ... 命令)。但是,我找不到在 localstack 中创建 APIGateway 的方法,以便可以使用它调用 lambda 函数。基本上,我需要一个 APIGateway(及其 arn),以便使用它可以调用 lambda 函数。

最佳答案

针对每个 CLI 创建 NodeJS Lambda 和 API 网关的演练:

首先我们创建一个简单的 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 堆栈。然而,由于 localstack 与 AWS 相比存在一些不一致,该过程将失败。不过,不要沮丧,创建的 cloudformation 模板工作正常,您只需要一个额外的请求即可完成:

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}}

希望这有帮助。

关于aws-lambda - 在localstack中创建API网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44547574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com