【问题标题】:Call aws-cli from AWS Lambda从 AWS Lambda 调用 aws-cli
【发布时间】:2016-02-04 11:03:08
【问题描述】:

有没有办法在 AWS Lambda 中执行 aws-cli? 好像没有预装。 (我已经通过Node.js子进程检查了“which aws”,它不存在。)

【问题讨论】:

  • 这方面有什么进展吗?我正在寻找同样的问题,我需要使用命令“aws opsworks register”。可惜他们没有在所有 Lambda 语言中提供这种能力
  • 为什么要使用 CLI?使用 AWS 开发工具包无法实现的您正在尝试做的事情是什么?

标签: amazon-web-services aws-lambda aws-cli aws-sdk-nodejs


【解决方案1】:

现在我们可以在 Lambda 中使用层。带有 aws-cli 的 Bash 层可在 https://github.com/gkrizek/bash-lambda-layer

获得
handler () {
    set -e

    # Event Data is sent as the first parameter
    EVENT_DATA=$1

    # This is the Event Data
    echo $EVENT_DATA

    # Example of command usage
    EVENT_JSON=$(echo $EVENT_DATA | jq .)

    # Example of AWS command that's output will show up in CloudWatch Logs
    aws s3 ls

    # This is the return value because it's being sent to stderr (>&2)
    echo "{\"success\": true}" >&2
}

【讨论】:

  • 天啊!!!谢谢!我真的在努力让这样的东西工作 4 个小时!谢谢 :D :D
  • 我正在尝试将此层的 aws cli 与我的 python 代码一起使用。但我什么也得不到。
  • 这是 bash 层。我不确定你为什么在 python 中需要它。你可以只使用 python SDK。
【解决方案2】:

除非您将它(及其所有依赖项)作为部署包的一部分包含在内,否则不会。即使那样,您也必须从 python 中调用它,因为 Lambda 不允许您执行 shell 命令。即使您到达那里,我也不建议您尝试在 Lambda 函数中进行同步,因为您最多只能执行 5 分钟的执行时间。最重要的是,在许多情况下,额外的启动时间是不值得的,因为您要为每 100 毫秒的块付费。

所以你可以,但你可能不应该。

编辑:Lambda 确实允许您执行 shell 命令

【讨论】:

  • 请参阅alestic.com/2016/11/aws-lambda-awscli,了解如何完成捆绑 aws-cli python 包以在 lambda 中使用
  • 实际使用 aws cli IS 例如,在将 Lambda 用于 Cloudformation 自定义资源时,这是一个好主意
【解决方案3】:

aws-cli 是一个 python 包。要使其在 AWS Lambda 函数上可用,您需要将其与函数 zip 文件一起打包。

1) 使用 64 位 Amazon Linux 启动 EC2 实例;

2) 创建一个python virtualenv:

mkdir ~/awscli_virtualenv
virtualenv ~/awscli_virtualenv

3) 激活 virtualenv:

cd ~/awscli_virtualenv/bin
source activate

4) 安装 aws-cli 和 pyyaml:

pip install awscli
python -m easy_install pyyaml

5) 更改aws python脚本的第一行:

sed -i '1 s/^.*$/\#\!\/usr\/bin\/python/' aws

6) 停用 virtualenv:

deactivate

7) 使用在 lambda 上运行 aws-cli 所需的所有文件创建一个目录:

cd ~
mkdir awscli_lambda
cd awscli_lambda
cp ~/awscli_virtualenv/bin/aws .
cp -r ~/awscli_virtualenv/lib/python2.7/dist-packages .
cp -r ~/awscli_virtualenv/lib64/python2.7/dist-packages .

8) 创建一个将调用 aws-cli 的函数(python 或 nodejs):

例如(nodejs):

var Q = require('q');
var path = require('path');
var spawn = require('child-process-promise').spawn;    

exports.handler = function(event, context) {

    var folderpath = '/folder/to/sync';
    var s3uel = 's3://name-of-your-bucket/path/to/folder';

    var libpath = path.join(__dirname, 'lib');
    var env = Object.create(process.env);
    env.LD_LIBRARY_PATH = libpath;

    var command = path.join(__dirname, 'aws');
    var params = ['s3', 'sync', '.', s3url];
    var options = { cwd: folderpath };

    var spawnp = spawn(command, params, options);

    spawnp.childProcess.stdout.on('data', function (data) {
        console.log('[spawn] stdout: ', data.toString());
    });

    spawnp.childProcess.stderr.on('data', function (data) {
        console.log('[spawn] stderr: ', data.toString());
    });

    return spawnp
    .then(function(result) {

        if (result['code'] != 0) throw new Error(["aws s3 sync exited with code", result['code']].join(''));

        return result;

    });

}

在 ~/awscli_lambda/index.js 上创建 index.js 文件(使用上面的代码或您的代码)

9) 压缩所有内容(aws-cli 文件和依赖项以及您的函数):

cd ~
zip -r awscli_lambda.zip awscli_lambda

【讨论】:

    【解决方案4】:

    现在您可以在 lambda 中将其作为 Docker 容器与 AWS CLI 一起简单地运行。

    【讨论】:

    【解决方案5】:

    您可以使用 AWS node.js SDK,它应该在 Lambda 中可用,而无需安装它。

    var AWS = require('aws-sdk');
    var lambda = new AWS.Lambda();
    lambda.invoke({
        FunctionName: 'arn:aws:lambda:us-west-2:xxxx:function:FN_NAME',
        Payload: {}, 
      },
      function(err, result) {
        ...
    });
    

    据我所知,如果不是所有的 cli 功能,我可以告诉您最多。在此处查看完整文档:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

    【讨论】:

    • 感谢 Ryan,但我想要一些不会在 node.js SDK 中退出并且确实存在于 aws-cli 中的功能,因为在某些情况下使用 aws-cli 似乎更容易,例如 s3 sync跨存储桶。
    • 啊,我现在明白了。在这种情况下,您似乎需要在每次运行时都安装它,这听起来有点痛苦且效率低下。
    • 无法安装,yum和pip安装在nodejs环境下不可用
    • 问题是关于 aws cli,而不是 aws sdk
    【解决方案6】:

    如果您使用代码配置 Lambda,那么这是最简单的方法

    lambda_function.add_layers(AwsCliLayer(scope, "AwsCliLayer"))
    

    参考:https://pypi.org/project/aws-cdk.lambda-layer-awscli/

    【讨论】:

      【解决方案7】:

      你可以试试这个。我得到了这个为我工作。

      1- 添加 AWS CLI 层

      https://harishkm.in/2020/06/16/run-aws-cli-in-a-lambda-function/

      2- 添加一个 lambda 并运行以下命令来运行任何 AWS CLI 命令行。

      https://harishkm.in/2020/06/16/run-bash-scripts-in-aws-lambda-functions/

      function handler () {
          EVENT_DATA=$1
          
          DATA=`/opt/awscli/aws s3 ls `
          RESPONSE="{\"statusCode\": 200, \"body\": \"$DATA\"}"
          echo $RESPONSE
      }
      

      【讨论】:

        【解决方案8】:

        我认为您应该将触发逻辑与操作分开。 将带有 aws cli 的容器放在另一个 ec2 上并使用 aws lambda 将其触发为动作。

        【讨论】:

        • 这意味着您需要始终有一个 ec2 实例,而不是实现 lambda 的用处 - 小范围且仅在需要时运行。
        猜你喜欢
        • 1970-01-01
        • 2020-04-22
        • 2018-09-22
        • 1970-01-01
        • 2020-12-20
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        • 2018-08-21
        相关资源
        最近更新 更多