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