有没有办法在AWS Lambda中执行aws-cli? 它似乎没有预先安装。 (我通过Node.js子进程检查了“哪个aws”,并且它不存在。)
答案 0 :(得分:12)
除非您将其(及其所有依赖项)包含在部署包中,否则不会这样做。即使这样,你也必须在python中调用它,因为Lambda不允许你执行shell命令。即使你到达那里,我也不建议尝试在Lambda函数中进行同步,因为你被限制在最多5分钟的执行时间。最重要的是,在许多情况下,额外的启动时间是不值得的,因为你需要每100毫秒支付一次。
所以你可以,但你可能不应该
。编辑:Lambda 允许您执行shell命令
答案 1 :(得分:7)
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)制作一个dir,其中包含在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
答案 2 :(得分:5)
现在,我们可以在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
}
答案 3 :(得分:4)
您可以使用AWS node.js SDK,该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
答案 4 :(得分:1)
现在,您可以将其作为lambda中的Docker容器与AWS CLI一起运行。
答案 5 :(得分:-1)
我认为您应该将触发逻辑与动作分开。 将一个带有aws cli的容器放在另一个ec2上并使用aws lambda将其触发到一个动作中。