【问题标题】:How to call a grpc service running on ec2 from aws lambda如何从 aws lambda 调用在 ec2 上运行的 grpc 服务
【发布时间】:2020-04-11 22:06:51
【问题描述】:

我有一个 grpc 服务,用 python 编写,部署在一个 EC2 实例上。我已经编写了一个 nodejs 应用程序并使用该应用程序,我可以从我的本地机器调用 grpc 服务,也可以从另一个 EC2 实例调用。但是,当我将相同的应用程序部署到 Lambda(使用无服务器部署)时,它无法调用相同的 grpc 服务。 我在 package.json 的脚本部分中添加了以下行,以便代码能够正确部署到 lambda。

"postinstall": "npm rebuild grpc --target=12.x --target_arch=x64 --target_platform=linux --target_libc=glibc"

最初 lambda 执行时没有任何错误,只是它没有调用 grpc 服务。 之后,我在 serverless.yml 文件中添加了 VPC 端点配置,它在 cloudwatch 中返回内部服务器错误和记录错误“EACCES:权限被拒绝,打开'/var/task/handler.js'”。

更新:我更新了 IAM 角色,现在没有记录错误,但 lambda 始终响应“Go Serverless v1.0!您的函数已成功执行!”。 我尝试在 utterQuery 方法的回调中记录的所有消息都没有记录在 cloudwatch 日志中。

这里可能有什么问题。

这里是 serverless.yml 文件:

service: myservice

provider:
  name: aws
  runtime: nodejs12.x
  vpc:
    securityGroupIds:
      - securityGroupid1
    subnetIds:
      - subnetId1
    stage: dev
  region: us-east-1
  stackTags:
    owner: me

functions:
  sendMessage:
    handler: handler.sendMessage
    events:
      - http:
          path: sendMessage
          method: post

这里是lambda函数代码:

'use strict';
const AWS = require('aws-sdk');
const grpcClient = require('./grpcClient');

module.exports.sendMessage = async (event, context) => {
  const timestamp = new Date().getTime();
  console.log(event, timestamp);
  console.log(event.body);

  const message = event.body;

  let reply = 'Go Serverless v1.0! Your function executed successfully!';


     grpcClient.utterQuery({
       query: message,
       user_id: 10101,
       session_id: 321
     }, (error, riaReply) => {
         if (error) {
           console.error(error)
         } else {
           console.log('successfully queried grpc service.')
           console.log(riaReply.response)
         }
     });

  return {
    statusCode: 200,
    body: reply
  };
};

【问题讨论】:

  • 我猜这是由于您的 IAM 角色的 lambda 函数。错误应包含发生错误的操作名称。更新角色,它应该可以工作。如果你能分享完整的错误日志,那就更容易理解了。
  • 是的,这是由于 IAM 角色。我可以解决错误。但是现在我发现 Lambda 无法调用 GRPC 服务。来自 lambda 的回复始终是“Go Serverless v1.0!您的函数执行成功!''
  • @24x7Programmer 你知道为什么 grpc 不打电话了吗?我有同样的问题

标签: amazon-web-services aws-lambda grpc grpc-node


【解决方案1】:

由于您在处理程序结束时调用 return,因此 lambda 调用在 utterQuery() 调用有机会完成之前结束,并且调用是回调。

https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html 建议您改为返回一个承诺,并且 node.js lambda 运行时将知道在结束 lambda 之前等待该承诺被履行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2017-01-26
    • 2020-09-18
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多