Подтвердить что ты не робот

Вызовите aws-cli из AWS Lambda

Есть ли какой-нибудь способ выполнить aws-cli внутри AWS Lambda? Кажется, он не установлен заранее. (Я проверил с помощью "aws" через дочерний процесс Node.js, и он не существовал.)

4b9b3361

Ответ 1

Нет, если вы не включите его (и все его зависимости) как часть вашего пакета развертывания. Даже тогда вам придется называть это изнутри python, поскольку Lambda не позволяет выполнять команды оболочки. Даже если вы доберетесь туда, я бы не рекомендовал делать синхронизацию в функции лямбда, так как вы ограничены максимум 5 минутами времени выполнения. Кроме того, дополнительное время размножения просто не стоит во многих случаях, поскольку вы платите за каждые 100 мс кусок.

Итак, вы можете, но вы, вероятно, не должны.

EDIT: Lambda позволяет выполнять команды оболочки

Ответ 2

aws-cli - пакет python. Чтобы сделать его доступным в функции AWS Lambda, вам необходимо упаковать его с помощью zip файла.

1) Запустите экземпляр EC2 с 64-разрядным Amazon Linux;

2) Создайте виртуальный файл python:

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 script:

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

6) Деактивировать virtualenv:

deactivate

7) Создайте каталог всех файлов, необходимых для запуска 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) Создайте функцию (python или nodejs), которая вызовет aws-cli:

Например (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;

    });

}

Создайте файл index.js(с кодом выше или кодом) на ~/awscli_lambda/index.js

9) Zip все (файлы и зависимости aws-cli и ваши функции):

cd ~
zip -r awscli_lambda.zip awscli_lambda

Ответ 3

Вы можете использовать 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

Ответ 4

Вы можете записать код java или nodejs, а затем вызвать функции AWS.

Ответ 5

Я думаю, что вы должны отделить свою триггерную логику от действия. Поместите контейнер с aws cli на другой ec2 И используйте aws lambda, чтобы вызвать это в действие.

Ответ 6

Теперь мы можем использовать слои внутри лямбды. Слой Bash с aws-cli доступен по адресу 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 output will show up in CloudWatch Logs
    aws s3 ls

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