web-dev-qa-db-fra.com

Appelez aws-cli depuis AWS Lambda

existe-t-il un moyen d'exécuter aws-cli dans AWS Lambda? Il ne semble pas être pré-installé. (J'ai vérifié avec "which aws" via le processus enfant Node.js, et il n'existait pas.)

32
Hirofumi Okino

Nous pouvons maintenant utiliser des couches dans Lambda. La couche Bash avec aws-cli est disponible sur 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'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
}
8
Jai

Sauf si vous l'incluez (et toutes ses dépendances) dans votre package de déploiement. Même alors, vous devriez l'appeler de l'intérieur python puisque Lambda ne vous permet pas d'exécuter des commandes Shell. Même si vous y arrivez, je ne recommanderais pas d'essayer de faire une synchronisation dans un Lambda fonction car vous êtes limité à un maximum de 5 minutes de temps d'exécution. En plus de cela, le temps de rotation supplémentaire ne vaut pas la peine dans de nombreux cas puisque vous payez pour chaque tranche de 100 ms.

Donc vous pouvez, mais vous ne devriez probablement pas.

EDIT: Lambda does vous permet d'exécuter des commandes Shell

12
Jordon Phillips

aws-cli est un package python. Pour le rendre disponible sur une fonction AWS Lambda, vous devez l'intégrer à votre fichier Zip de fonction.

1) Démarrez une instance EC2 avec Amazon Linux 64 bits;

2) Créez un python virtualenv:

mkdir ~/awscli_virtualenv
virtualenv ~/awscli_virtualenv

) Activez virtualenv:

cd ~/awscli_virtualenv/bin
source activate

4) Installez aws-cli et pyyaml:

pip install awscli
python -m easy_install pyyaml

5) Changer la première ligne du aws python:

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

6) Désactiver virtualenv:

deactivate

7) Créez un répertoire avec tous les fichiers dont vous avez besoin pour exécuter aws-cli sur 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) Créez une fonction (python ou nodejs) qui appellera aws-cli:

Par exemple (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;

    });

}

Créez le fichier index.js (avec le code ci-dessus ou votre code) sur ~/awscli_lambda/index.js

9) Zip tout (fichiers aws-cli et dépendances et votre fonction):

cd ~
Zip -r awscli_lambda.Zip awscli_lambda
7

Vous pouvez utiliser le SDK AWS node.js qui devrait être disponible dans Lambda sans l'installer.

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) {
    ...
});

Autant que je sache, vous obtenez le plus, sinon toutes les fonctionnalités de cli. Voir la documentation complète ici: http://docs.aws.Amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

5
Ryan