AWS LambdaではLambda functionとして使える言語は現時点ではJavaScript/Node.jsしかありません。
でもPythonで書きたい人もいるよねってことでPythonで書いたスクリプトを実行してみました。
といっても難しいことはしていません。
Lambda functionとして実行するスクリプトでは外部コマンドが実行可能なことがわかっています。また、環境内にはpythonのruntimeがあることも前回の調査でわかりました(AWS Lambdaをいろいろ暴くのls結果参照)。
というわけでPythonで書いたスクリプトをLambda function内でJavaScriptを使って生成し、child_process()を使って外部コマンドとして呼び出す、というだけです。
では早速やってみましょう。
今回はLambda function内でスクリプト生成するのではなく、事前に用意したスクリプトをS3に保存しそれをLambda functionの環境内でHTTPアクセスして取得し、実行するという方法を取っています。
なお、ファイルをHTTPで取得する際なぜかLambda functionの環境にはwgetがないのでcurlを使っています。
まず、実行したいPythonのスクリプトを適当に用意します。今回はお試しってことでこんな感じにしました。
#! /usr/bin/python
print "Hello, Wordl!"
これをS3にあげてmake publicしてHTTPアクセスできるようにしておきます。
続いて実際に登録するLambda functionのコードです。
exports.handler = function(event, context) {
var exec = require('child_process').exec;
var cmd = "curl -s https://s3-ap-northeast-1.amazonaws.com/<bucket名>/test.py > /tmp/test.py;chmod 755 /tmp/test.py;/tmp/test.py"
var child = exec(cmd, function(error, stdout, stderr) {
if (!error) {
console.log('standard out: ' + stdout);
console.log('standard error: ' + stderr);
context.done();
} else {
console.log("error code: " + error.code + ", err: " + error);
context.done(error,'lambda');
}
});
};
はい、勘の良い方は気づいたと思いますが、前回のスクリプトそのままです。
単に実行する外部コマンドを変更しているだけです。
実際に実行しているコマンドは以下を順番に実行しているだけです。
- curlを使って実行するPythonスクリプトを取得し、/tmpに保存
- 実行権限を付与
- 実行
では早速Lambda functionをInvokeしてみます。
2014-11-26T11:51:47.683Z a0862c9f-7562-11e4-8f05-ebd8b45899f3 standard out: Hello, Wordl!
おお、ちゃんと実行されて「Hello, World!」と出力されました!
というわけで実際に有用かどうかはともかくPythonで書いたスクリプトをLambda functionで実行してみました。
免責
こちらは個人の意見で、所属する企業や団体は関係ありません。