Lambda関数内にbashスクリプトを記述できますか? Python、NodeJS、およびJava 8。
一部のドキュメントでは、Bashを使用できる可能性があると記載されていますが、Bashをサポートする具体的な証拠や例はありません
何か役立つかもしれません。Nodeを使用してbashスクリプトを呼び出しています。スクリプトとnodejsファイルをZipでラムダにアップロードし、次のコードをハンドラーとして使用しています。
exports.myHandler = function(event, context, callback) {
const execFile = require('child_process').execFile;
execFile('./test.sh', (error, stdout, stderr) => {
if (error) {
callback(error);
}
callback(null, stdout);
});
}
コールバックを使用して、必要なデータを返すことができます。
前述のように、AWSはBashを使用してLambda関数を記述する方法を提供していません。
回避するには、bash関数が本当に必要な場合は、bashスクリプトを任意の言語で「ラップ」できます。
Javaの例を次に示します。
Process proc = Runtime.getRuntime().exec("./your_script.sh");
ビジネスニーズに応じて、パフォーマンスの低下を防ぐために、ネイティブ言語(Python、NodeJS、Java)の使用を検討する必要があります。
AWSは最近、開発者が カスタムランタイムをビルド できる2つの新機能「Lambda Runtime API and Lambda Layers」を発表しました。そのため、ハックなしでLambdaでbashスクリプトを直接実行することも可能になりました。
これは非常に新しい機能であるため(2018年11月)、まだあまり資料がなく、いくつかの手作業がまだ必要ですが、例については this Github repo をご覧くださいはじめに(免責事項:私はそれをテストしませんでした)。 bashのサンプルハンドラーの下:
function handler () {
EVENT_DATA=$1
echo "$EVENT_DATA" 1>&2;
RESPONSE="{\"statusCode\": 200, \"body\": \"Hello World\"}"
echo $RESPONSE
}
これにより、ラムダ内で任意のプログラミング言語を実行できる可能性が実際に広がります。これは、カスタムLambdaランタイムの公開に関する AWSチュートリアル です。
Amazon Lambda-Pythonを使用してシェルコマンドuname
出力をキャプチャできました。
以下はコードベースです。
from __future__ import print_function
import json
import commands
print('Loading function')
def lambda_handler(event, context):
print(commands.getstatusoutput('uname -a'))
出力を表示しました
START RequestId: 2eb685d3-b74d-11e5-b32f-e9369236c8c6 Version: $LATEST
(0, 'Linux ip-10-0-73-222 3.14.48-33.39.amzn1.x86_64 #1 SMP Tue Jul 14 23:43:07 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux')
END RequestId: 2eb685d3-b45d-98e5-b32f-e9369236c8c6
REPORT RequestId: 2eb685d3-b74d-11e5-b31f-e9369236c8c6 Duration: 298.59 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 9 MB
詳細については、リンクを確認してください- https://aws.Amazon.com/blogs/compute/running-executables-in-aws-lambda/
'child_process'ノードモジュールを使用して可能です。
const exec = require('child_process').exec;
exec('echo $PWD && ls', (error, stdout, stderr) => {
if (error) {
console.log("Error occurs");
console.error(error);
return;
}
console.log(stdout);
console.log(stderr);
});
これにより、現在の作業ディレクトリが表示され、ファイルが一覧表示されます。
AWSは、これに基づいてカスタムランタイムをサポートするようになりました お知らせはこちら 。私はすでにbashスクリプトをテストし、機能していました。必要なのは、新しいラムダを作成し、runtime
型のCustom
を選択するだけです。次のファイル構造が作成されます。
mylambda_func
|- bootstrap
|- function.sh
例Bootstrap
:
#!/bin/sh
set -euo pipefail
# Handler format: <script_name>.<function_name>
# The script file <script_name>.sh must be located in
# the same directory as the bootstrap executable.
source $(dirname "$0")/"$(echo $_HANDLER | cut -d. -f1).sh"
while true
do
# Request the next event from the Lambda Runtime
HEADERS="$(mktemp)"
EVENT_DATA=$(curl -v -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
INVOCATION_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
# Execute the handler function from the script
RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")
# Send the response to Lambda Runtime
curl -v -sS -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$INVOCATION_ID/response" -d "$RESPONSE"
done
例handler.sh
:
function handler () {
EVENT_DATA=$1
RESPONSE="{\"statusCode\": 200, \"body\": \"Hello from Lambda!\"}"
echo $RESPONSE
}
追伸ただし、環境の制限のために必要なものを達成できない場合があります。そのような場合は、AWS Systems ManagerがRun command
、OpsWork(Chef/Puppet)は、ECSクラスターでのScheduledTasks
の使い慣れた方法または定期的な使用に基づいています。
Bashの詳細と、それを圧縮して公開する方法については、次のリンクを確認してください。