首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在本地堆栈中创建API网关

在本地堆栈中创建API网关
EN

Stack Overflow用户
提问于 2017-06-14 22:26:49
回答 2查看 13.2K关注 0票数 8

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

EN

回答 2

Stack Overflow用户

发布于 2018-02-08 18:01:27

用于创建API和每个NodeJS的API网关的演练:

首先,我们创建一个简单的NodeJS Lambda:

代码语言:javascript
复制
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的压缩文件中,并将其上传到本地堆栈:

代码语言:javascript
复制
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了:

代码语言:javascript
复制
aws apigateway create-rest-api --region us-east-1 --name 'API Test' --endpoint-url=http://localhost:4567

这将给出以下响应:

代码语言:javascript
复制
{
"name": "API Test",
"id": "487109A-Z548",
"createdDate": 1518081479
}

使用我们在这里获得的ID,我们可以请求它的父ID:

代码语言:javascript
复制
aws apigateway get-resources --region us-east-1 --rest-api-id 487109A-Z548 --endpoint-url=http://localhost:4567

响应:

代码语言:javascript
复制
{
"items": [
    {
        "path": "/",
        "id": "0270A-Z23550",
        "resourceMethods": {
            "GET": {}
        }
    }
]
}

现在我们有了创建资源及其路径所需的一切:

代码语言:javascript
复制
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

响应:

代码语言:javascript
复制
{
"resourceMethods": {
    "GET": {}
},
"pathPart": "{somethingId}",
"parentId": "0270A-Z23550",
"path": "/{somethingId}",
"id": "0662807180"
}

我们在这里获得的ID需要用来创建我们的linked GET方法:

代码语言:javascript
复制
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的集成:

代码语言:javascript
复制
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部署到我们所需的阶段:

代码语言:javascript
复制
aws apigateway create-deployment \
 --region us-east-1 \
 --rest-api-id 487109A-Z548 \
 --stage-name test \
 --endpoint-url=http://localhost:4567

现在我们可以测试它了:

代码语言:javascript
复制
curl http://localhost:4567/restapis/487109A-Z548/test/_user_request_/HowMuchIsTheFish

响应:

代码语言:javascript
复制
  % 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“,而不必键入”---url= ...“对于每个命令

使用无服务器框架和本地堆栈的演练:

您还可以使用无服务器框架(https://serverless.com/)。

首先通过npm安装:

代码语言:javascript
复制
npm install serverless -g

现在,您可以基于nodejs-aws模板创建示例应用程序:

代码语言:javascript
复制
serverless create --template aws-nodejs

为了拥有一个HTTP端点,您必须编辑serverless.yml并添加相应的事件:

代码语言:javascript
复制
functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: ping
          method: get

为了在本地堆栈安装上运行它,你必须使用serverless-localstack插件( https://github.com/temyers/serverless-localstack):

代码语言:javascript
复制
npm install serverless-localstack

现在你必须再次编辑你的serverless.yml,添加插件并调整你的端点。在我的例子中,本地堆栈是在Docker工具箱中运行的,所以它的IP是192.168.99.100 --您可能必须将其更改为localhost,这取决于您的使用:

代码语言:javascript
复制
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

现在您可以尝试部署它:

代码语言:javascript
复制
serverless deploy --verbose --stage local

这将创建一个S3存储桶,上传您的lambda并创建一个CloudFormation栈。然而,与AWS相比,由于本地堆栈的一些不一致,该过程将失败。不过,不要沮丧,创建的cloudformation模板运行良好,您只需要一个额外的请求,您就完成了:

代码语言:javascript
复制
awslocal cloudformation update-stack --template-body file://.serverless/cloudformation-template-update-stack.json --stack-name aws-nodejs-local

现在您的lambda已经部署好了,可以进行测试了:

代码语言:javascript
复制
curl http://192.168.99.100:4567/restapis/75A-Z278430A-Z/local/_user_request_/ping

响应:

代码语言:javascript
复制
% 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}}

希望这能有所帮助。

票数 25
EN

Stack Overflow用户

发布于 2017-06-15 08:13:50

看起来有一个与在GitHub上使用本地堆栈设置应用程序接口网关相关的未决问题:

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

您可以尝试按照答案中提供的步骤进行操作。

从GitHub问题复制:

""“

一种选择是使用无服务器框架(https://github.com/serverless/serverless)。否则,您可以直接调用LocalStack服务(通过命令行工具或SDK)来创建API网关resource+method+integration,并将它们连接到您的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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44547574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档