从AWS Lambda调用aws-cli

Hir*_*ino 35 amazon-web-services aws-cli aws-lambda aws-sdk-nodejs

有没有办法在AWS Lambda中执行aws-cli?它似乎没有预先安装.(我通过Node.js子进程检查了"which aws",但它不存在.)

Jor*_*ips 12

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

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

编辑:LAMBDA 不会让你执行shell命令

  • 有关如何完成捆绑用于lambda的aws-cli python包的详细信息,请参阅https://alestic.com/2016/11/aws-lambda-awscli/ (5认同)

Jai*_*Jai 12

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

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
}
Run Code Online (Sandbox Code Playgroud)

  • 我的天啊!!!谢谢!我实际上是在争取让这样的东西工作4个小时!谢谢:D:D (2认同)

Jos*_*iva 8

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

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

2)创建一个python virtualenv:

mkdir ~/awscli_virtualenv
virtualenv ~/awscli_virtualenv
Run Code Online (Sandbox Code Playgroud)

3)激活virtualenv:

cd ~/awscli_virtualenv/bin
source activate
Run Code Online (Sandbox Code Playgroud)

4)安装aws-cli和pyyaml:

pip install awscli
python -m easy_install pyyaml
Run Code Online (Sandbox Code Playgroud)

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

sed -i '1 s/^.*$/\#\!\/usr\/bin\/python/' aws
Run Code Online (Sandbox Code Playgroud)

6)停用virtualenv:

deactivate
Run Code Online (Sandbox Code Playgroud)

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 .
Run Code Online (Sandbox Code Playgroud)

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;

    });

}
Run Code Online (Sandbox Code Playgroud)

在〜/ awscli_lambda/index.js上创建index.js文件(带上面的代码或代码)

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

cd ~
zip -r awscli_lambda.zip awscli_lambda
Run Code Online (Sandbox Code Playgroud)


Rya*_*yan 5

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

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) {
    ...
});
Run Code Online (Sandbox Code Playgroud)

据我所知,即使不是全部,cli功能也能获得最大的收益。请参阅此处的完整文档:http : //docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

  • 谢谢Ryan,但我想要一些不会在node.js SDK中退出并在aws-cli中存在的函数,因为在某些情况下使用aws-cli似乎更容易,例如跨存储桶的s3 sync。 (3认同)

小智 5

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