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