【问题标题】:Call Python boto3 library from AWS Lambda function written in Node.js从用 Node.js 编写的 AWS Lambda 函数调用 Python boto3 库
【发布时间】:2019-05-09 01:50:13
【问题描述】:

我有一个用 Node.js 编写的 lambda。我需要从boto3 library 调用get_api_key 函数。我的 Node.js Lambda 函数的精简版本在这里:

exports.handler = function(input, context) {
   const spawn = require("child_process").spawn;
   const pythonProcess = spawn('python',["pythonScript.py", "API_KEY_123"]);
   pythonProcess.stdout.on('data', (data) => {
      console.log("DATA FROM PYTHON: ", data);
   });
};

我使用了来自this question 的功能。我的 Python 脚本如下所示:

import sys
import boto3

#this is the client
client = boto3.client('apigateway')

apiKey = client.get_api_key(apiKey=sys.argv[1], includeValue=True)
print(apiKey)

我希望看到 console.log 结果出现在此 Lambda 函数的 CloudWatch 日志中,但似乎我们没有从 Python 脚本中获取任何数据,因为没有完成日志记录。

我在做我想做的事吗? Lambda函数上有一个设置说它是用Node.js编写的,所以我不知道我在与Lambda函数相同的目录中随机制作了一个Python脚本这一事实是否会导致问题?

如果它可能更容易,我很高兴有一个替代方案。

【问题讨论】:

  • 您能解释一下为什么需要从 boto3 而不是 AWS JavaScript SDK 调用 API Gateway get_api_key() 吗?
  • 亚马逊有人将我指向 boto3,所以我只是假设我必须使用它!

标签: python node.js amazon-web-services


【解决方案1】:

AWS Lambda 原生支持多种语言,包括 JavaScript 和 Python。您不需要使用 boto3 库(这需要您用 Python 编写)。您可以使用 AWS JavaScript 开发工具包。

以下是从 API Gateway 获取 API 密钥的示例:

const AWS = require("aws-sdk");
const apigateway = new AWS.APIGateway();

exports.handler = async (event) => {

    var params = {
        apiKey: "ab92ke1p70",
        includeValue: true
    };

    const apikey = await apigateway.getApiKey(params).promise();
    console.log("apikey:", apikey);
    return apikey;
};

【讨论】:

  • 但是如果我需要使用自定义脚本怎么办?我正在尝试使用外部 python 库,但在运行它时遇到了麻烦。如何安装依赖项?
  • @javiergarval 构建 Python 部署包的描述在 docs.aws.amazon.com/lambda/latest/dg/…
  • 如何在 Node.js lambda 中安装 python 依赖项?我正在使用 Node.js 并想使用自定义 python 脚本;我使用节点的 child_process 来生成脚本,但没有得到想要的响应。相反,它需要一个库,我无法通过 ssh 安装它。我尝试使用您给我的文档部署它,创建了包含我需要的所有依赖项的 .zip 文件,但我不知道如何使用 $ aws lambda update-function-code --function-name python37 --zip- 部署它文件 fileb://function.zip
  • @javiergarval 在 Lambda 中从另一个运行时 (Node.js) 启动一个运行时 (Python) 是不寻常的,但我会查看 aws.amazon.com/blogs/compute/running-executables-in-aws-lambda 的博客。您可能需要在生成子进程之前设置一些环境变量(包括 PYTHONPATH?),以便 Python 知道您部署的包在哪里。
最近更新 更多