web-dev-qa-db-ja.com

AWS Lambdaからaws-cliを呼び出す

aWS Lambda内でaws-cliを実行する方法はありますか?プリインストールされていないようです。 (Node.jsの子プロセスを介して「which aws」で確認しましたが、存在しませんでした。)

32
Hirofumi Okino

これで、Lambda内でレイヤーを使用できます。 aws-cliを使用したBashレイヤーは 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

展開パッケージの一部として(およびそのすべての依存関係)を含めない限り。それでも、Lambdaではシェルコマンドを実行できないため、python内から呼び出す必要があります。そこに到達しても、Lambdaで同期を実行することはお勧めしません。最大5分の実行時間に制限されているため、機能します。さらに、多くの場合、追加のスピンアップ時間は、100ミリ秒のチャンクごとに支払うため、価値がありません。

canですが、おそらくそうすべきではありません。

編集:Lambda doesシェルコマンドの実行を許可します

12
Jordon Phillips

aws-cliはpythonパッケージです。AWSLambda関数で使用できるようにするには、関数のZipファイルでパックする必要があります。

1)64ビットAmazon LinuxでEC2インスタンスを起動します;

2)python virtualenv:を作成

mkdir ~/awscli_virtualenv
virtualenv ~/awscli_virtualenv

)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)lambdaで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)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
7

Lambdaでインストールせずに利用できるはずのAWS node.js SDKを使用できます。

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

5
Ryan