从 AWS Lambda 调用 aws-cli
Call aws-cli from AWS Lambda
有什么方法可以在 AWS Lambda 中执行 aws-cli 吗?
它似乎没有预装。
(我已经通过 Node.js 子进程与 "which aws" 核对过,它不存在。)
您可以使用 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
除非您将它(及其所有依赖项)作为部署包的一部分包含在内,否则不会。即使那样,您也必须从 python 内调用它,因为 Lambda 不允许您执行 shell 命令。即使您到达那里,我也不建议您尝试在 Lambda 函数中进行同步,因为您最多只能执行 5 分钟的执行时间。最重要的是,在许多情况下,额外的启动时间并不值得,因为您要为每 100 毫秒的数据块付费。
所以你可以,但你可能不应该。
编辑:Lambda 是否 允许您执行 shell 命令
我认为您应该将触发逻辑与操作分开。
将带有 aws cli 的容器放在另一个 ec2 上,然后使用 aws lambda 将其触发到一个动作中。
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) 更改awspython脚本的第一行:
sed -i '1 s/^.*$/\#\!\/usr\/bin\/python/' aws
6) 停用virtualenv:
deactivate
7) 用 运行 aws-cli on lambda 所需的所有文件创建一个目录:
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
现在我们可以在 Lambda 中使用图层了。 Bash 带有 aws-cli 的层在 https://github.com/gkrizek/bash-lambda-layer
可用
handler () {
set -e
# Event Data is sent as the first parameter
EVENT_DATA=
# 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
}
现在您可以简单地 运行 它作为 lambda 中的 Docker 容器以及 AWS CLI。
如果您使用代码配置 Lambda,那么这是最简单的方法
lambda_function.add_layers(AwsCliLayer(scope, "AwsCliLayer"))
你可以试试这个。我得到了这个为我工作。
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=
DATA=`/opt/awscli/aws s3 ls `
RESPONSE="{\"statusCode\": 200, \"body\": \"$DATA\"}"
echo $RESPONSE
}
有什么方法可以在 AWS Lambda 中执行 aws-cli 吗? 它似乎没有预装。 (我已经通过 Node.js 子进程与 "which aws" 核对过,它不存在。)
您可以使用 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
除非您将它(及其所有依赖项)作为部署包的一部分包含在内,否则不会。即使那样,您也必须从 python 内调用它,因为 Lambda 不允许您执行 shell 命令。即使您到达那里,我也不建议您尝试在 Lambda 函数中进行同步,因为您最多只能执行 5 分钟的执行时间。最重要的是,在许多情况下,额外的启动时间并不值得,因为您要为每 100 毫秒的数据块付费。
所以你可以,但你可能不应该。
编辑:Lambda 是否 允许您执行 shell 命令
我认为您应该将触发逻辑与操作分开。 将带有 aws cli 的容器放在另一个 ec2 上,然后使用 aws lambda 将其触发到一个动作中。
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) 更改awspython脚本的第一行:
sed -i '1 s/^.*$/\#\!\/usr\/bin\/python/' aws
6) 停用virtualenv:
deactivate
7) 用 运行 aws-cli on lambda 所需的所有文件创建一个目录:
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
现在我们可以在 Lambda 中使用图层了。 Bash 带有 aws-cli 的层在 https://github.com/gkrizek/bash-lambda-layer
可用handler () {
set -e
# Event Data is sent as the first parameter
EVENT_DATA=
# 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
}
现在您可以简单地 运行 它作为 lambda 中的 Docker 容器以及 AWS CLI。
如果您使用代码配置 Lambda,那么这是最简单的方法
lambda_function.add_layers(AwsCliLayer(scope, "AwsCliLayer"))
你可以试试这个。我得到了这个为我工作。
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=
DATA=`/opt/awscli/aws s3 ls `
RESPONSE="{\"statusCode\": 200, \"body\": \"$DATA\"}"
echo $RESPONSE
}