2015-11-04 22 views
20

Gibt es irgendeine Möglichkeit, AWS-CLI in AWS Lambda auszuführen? Es scheint nicht vorinstalliert zu sein. (Ich habe mit "what aws" über Node.js Kind-Prozess überprüft, und es war nicht vorhanden.)Anruf aws-cli von AWS Lambda

+1

Irgendwelche Fortschritte dabei? Ich suche die gleiche Frage, ich brauche den Befehl "aws opsworks register". Es saugt, dass sie diese Fähigkeit nicht in allen Lambda Sprachen zur Verfügung stellen – Casper

Antwort

8

nicht, wenn Sie es sind (und alle seine Abhängigkeiten) als Teil Dein Deployment-Paket, selbst dann müßtest du es in Python aufrufen, da Lambda dir nicht erlaubt, Shell-Kommandos auszuführen Wenn Sie dorthin gelangen, würde ich nicht empfehlen, eine Synchronisierung in einer Lambda-Funktion durchzuführen, da Sie auf eine Ausführungszeit von maximal 5 Minuten beschränkt sind. Hinzu kommt, dass sich die zusätzliche Spin-Up-Zeit in vielen Fällen nicht lohnt, da Sie für jeden 100ms-Chunk zahlen.

So können Sie können, aber Sie sollten wahrscheinlich nicht.

EDIT: Lambda tut können Sie Shell

ausführen Befehle
+2

Siehe https://alestic.com/2016/11/aws-lambda-awscli/ für einen guten Überblick darüber, wie die Bündelung der AWS-CLI Python zu erreichen Paket für den Einsatz in Lambda – Noah

4

Sie können das AWS node.js SDK, die in Lambda verfügbar sein sollte, ohne es zu installieren.

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

Soweit ich Sie am meisten bekommen kann sagen, die alle, wenn nicht cli Funktionalität die vollständige Dokumentation finden Sie hier:. http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

+1

Danke Ryan, aber ich will einige Funktionen, die NICHT in node.js SDK beenden und existieren in aws-cli, weil es einfacher scheint, aws-cli zu verwenden in einigen Fällen, wie S3 über Buckets synchronisieren. –

+0

Ah, ich sehe jetzt. In diesem Fall scheint es, dass Sie es bei jedem Lauf installieren müssen, der irgendwie schmerzhaft und ineffizient klingt. – Ryan

+0

Sie können es nicht installieren, yum und pip installieren ist nicht in nodejs Umgebung verfügbar – halil

1

Ich denke, dass Sie Ihre Trigger-Logik von der Aktion trennen sollte. Setzen Sie einen Container mit aws cli auf einen anderen ec2 Und verwenden Sie aws Lambda, um das in eine Aktion auszulösen.

1

Sie können Java oder Nodejs-Code aufschreiben und dann AWS-Funktionen von dort aufrufen.

1

aws-cli ist ein Python-Paket. Um es für eine AWS Lambda-Funktion verfügbar zu machen, müssen Sie es mit Ihrer Zip-Datei für die Funktion packen.

1) Starten Sie eine EC2-Instanz mit 64-Bit-Amazon Linux;

2) Erstellen eines Python virtualenv:

mkdir ~/awscli_virtualenv 
virtualenv ~/awscli_virtualenv 

3) Aktivieren virtualenv:

cd ~/awscli_virtualenv/bin 
source activate 

4) Installieren AWS-cli und pyyaml:

pip install awscli 
python -m easy_install pyyaml 

5) Ändern Sie die erste Zeile des aws Python-Skript:

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

6) Deaktivieren virtualenv:

deactivate 

7) Machen Sie ein Verzeichnis mit allen Dateien, die Sie brauchen, um run aws-cli auf 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) Erstellen Sie eine Funktion (Python oder NodeJS), die aws-cli nennen: oben

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; 

    }); 

} 

Erstellen Sie die index.js-Datei (mit dem Code:

Zum Beispiel (NodeJS) oder Code) auf ~/awscli_lambda/index.js

9) Zip alles (aws-cli Dateien und Abhängigkeiten und Ihre Funktion):

cd ~ 
zip -r awscli_lambda.zip awscli_lambda