【问题标题】:How can I use axios in lambda?如何在 lambda 中使用 axios?
【发布时间】:2018-06-29 14:58:17
【问题描述】:

我必须在本地安装 axios 模块,然后将其部署到 lambda 还是有办法通过内联代码编辑器以及浏览器中的方式来完成?

【问题讨论】:

    标签: amazon-web-services aws-lambda axios alexa alexa-skills-kit


    【解决方案1】:

    您可以使用 axios 包发布一个简单的 Node.js AWS Lambda 层,然后将创建的层附加到您的 lambda。

    为层创建 .zip 文件的命令列表:

    mkdir nodejs
    cd nodejs
    npm i axios
    rm -rf package-lock.json
    cd ..
    zip -r axios.zip nodejs
    

    此命令列表摘自本文 https://ljmocic.medium.com/publish-simple-node-js-aws-lambda-layer-a87c00afdd83

    创建图层 获取层 ARN 将图层附加到 Lambda

    【讨论】:

    • 美丽。谢谢你的文章!我不确定是否有必要删除 package.lock 。我没有,它工作正常。
    • 谢谢!是的,我认为我们可以在不删除 package.lock 的情况下使用它。这篇文章不是我的,我虽然写这篇文章的那个人正在尝试遵循关于制作层的最佳实践,这就是他删除 package.lock 的原因。
    • 需要注意的关键是对于nodejs,zip里面的文件夹结构必须是nodejs/node_modules/...
    【解决方案2】:

    Lambda 实际上并没有为您捆绑包依赖项,AWS 包除外,所以是的,您需要在本地安装它,将其压缩在一起并上传到 Lambda 控制台。

    【讨论】:

    • 当我上传一个 zip 文件时。我不能再在线编辑它吗?
    • 根据我使用 Lambda 的经验,您可以编辑主入口点文件,但不能编辑其他文件,除非您的所有函数都捆绑在该特定文件中。因此,我认为您可以在捆绑并推送到 AWS 后在线编辑该文件。我知道最近推出了针对 Lambda 的 Cloud9 集成;但我还没有研究过它,所以还不知道它有什么用处,但绝对是值得探索的东西。总之,您仍然可以编辑您的主入口点文件,但不能编辑其他文件。
    • 你说得对,以前我可以编辑我的主文件。但是现在,我想我们不能再编辑任何以压缩格式上传的文件了。
    【解决方案3】:

    在您的 lambda 脚本所在的文件夹 (index.js) 中运行以下命令 -

    npm install axios
    

    您应该看到node_modules 目录被创建在与 index.js 相同的目录中。现在将这两个压缩在一起(index.js 和 npm_modules)并将其上传到您的 lambda 作为 zip。您可以对您拥有的其他 npm 模块依赖项重复此操作。如果您不想为每个模块再次重复这些手动步骤,请创建 package.json 文件并在其中添加所有模块依赖项,然后只运行一次 npm install

    【讨论】:

    • 当我上传一个 zip 文件时。我不能再在线编辑它吗?
    • 我已经看到 AWS 团队在这方面继续前进。您可以检查是否看到内联编辑器发布上传 zip。我猜你不会。
    【解决方案4】:

    您也可以创建一个图层。通过这种方法,您可以在许多功能中使用 Axios 模块。 不过,您需要小心路径。压缩模块时,文件夹路径很重要。 对于 node14.*,它应该是这样的。您的主文件夹名称应为“nodejs”。

    nodejs/node14/node_modules/axios
    nodejs/node14/node_modules/follow-redirects 
    

    附加图层后,您可以直接访问它。

    例如:

    const axios = require("axios");
    
    exports.handler = async(event) => {
      // TODO implement
      var response = await axios.post(process.env.URL, { "data": event.data }, {
      headers: {
        "authorization": process.env.PASS,
        "content-type": "application/json",
      }
    }, { timeout: 10000 }).then(response => response)
    .catch((error) => {
      //console.log(error.response.status);
      //console.log(error.response.data);
      //console.log(error.response.headers);
      return error;
    });;
    }
    

    欲了解更多信息:https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

    这种方法对我有很大帮助,希望对其他人也有帮助! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-04
      • 2019-05-19
      • 1970-01-01
      • 2018-11-24
      • 2019-02-02
      • 2019-04-08
      • 2018-07-23
      相关资源
      最近更新 更多