これは TECHSCORE Advent Calendar 2018 の25日目(最終日)の記事です。
こんにちは、宮垣です。
テックスコアブログに投稿するのは約4年ぶりになりますが、よろしくお願いします。
さて、先日、AWS re:Invent 2018のKeynote Day2 で AWS Lambda に新機能、Custom Runtime がサポートされることが発表されました。
AWS Lambda がカスタムランタイムをサポート
今回は、この新機能を利用してLambdaでシェルを動かすテストをしてみたいと思います。
Custom Runtime を動かすためのチュートリアルが公式ドキュメントに用意されていますので
これを参考にしながら、主にマネジメントコンソールを利用して実施していきます。
Tutorial – Publishing a Custom Runtime - AWS Lambda
1.関数の作成を開始
まずは関数の作成を行います。
AWS Lambda のコンソールから「関数の作成」ボタンをクリックします。
次に、関数の詳細項目の設定を行います。
- ポイント1
Custom Runtimeを利用するため、「ランタイム」項目は
「関数コードまたはレイヤーでカスタムランタイムを使用」を選択すること
- ポイント2
「ロール」項目は「1つ以上のテンプレートから新しいロールを作成します。」を選択し
任意の名称を入力すること
#チュートリアルの「To create an execution role」の箇所と同じことになる
2.関数ファイルの準備
チュートリアル#Using a Custom Runtime
に沿って、2つの関数ファイルを準備し、パッケージングを行います。
- bootstrap(Runtime Bootstrap file)
ファイル名をbootstrapとした実行可能なファイルです。
デプロイメントパッケージ内の bootstrap という名前のファイルがまず実行されます。
- function.sh(Function file)
bootstrapから呼び出される関数で、実際の処理の中身はここに記載します。任意のファイル名で良いです。
bootstrap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/sh set -euo pipefail # ハンドラ関数の読み込み source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" while true do HEADERS="$(mktemp)" # イベントの取得 EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # ハンドラ関数の実行 RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # 結果を返却 curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done |
function.sh
1 2 3 4 5 6 7 |
function handler () { EVENT_DATA=$1 echo "$EVENT_DATA" 1>&2; RESPONSE="Echoing request: '$EVENT_DATA'" echo $RESPONSE } |
実行権限を付与しzipパッケージにする
1 2 3 4 5 6 |
$ chmod 755 function.sh bootstrap $ zip lambda-custom-runtime-for-shell.zip function.sh bootstrap $ ls -la -rw-r--r-- 1 miyagaki.y domain users 802 12月 11 11:49 2018 lambda-custom-runtime-for-shell.zip -rwxr-xr-x 1 miyagaki.y domain users 129 12月 11 11:37 2018 function.sh -rwxr-xr-x 1 miyagaki.y domain users 674 12月 11 11:37 2018 bootstrap |
あともう少し。
3.テストイベントの設定
パッケージアップロード後の動作確認ためのテストイベントの作成です。
テストイベント名を決めて作成完了します。
・イベント名を決めるときに何度か怒られたので、以下のルールは満たすように!
4.パッケージのアップロードと実行
上記で作成した「lambda-custom-runtime-for-shell.zip」を、「アップロード」ボタンよりアップし、
「ハンドラ」項目にシェル内の関数名「function handler」を指定して、設定を保存します。
これで全ての準備が完了しました。
無事に成功しました!
1 |
"Echoing request: '{\"key1\":\"value1\",\"key2\":\"value2\",\"key3\":\"value3\"}'" |
テストイベントによって渡されたJSONデータをシェルが受け取って出力(echo)する ということが実現できていますね。
また、CloudWatch Logs にも成功ログが出力されています。
5.まとめ
今回はチュートリアルスクリプトのテストを実行しただけですが、入力された値をecho
するだけでなく整形して返したり、サービス死活監視の仕組みを作ってみたりしてみるとと面白いかもしれません。
既にCustom Runtime関連の記事は世に多く出ていますが、多くの言語でLambda関数を動作させることができるようになったことで、今後、活用方法がどんどん共有されていくのではないかと思います。
#キーワード:AWS Lambda Custom Runtimes芸人
おまけ.Custom Runtime実行エラー
Windows環境にて、bootstrapファイルを編集した後、再度zip化したものをアップロードしてしまうとパーミッションエラーでうまく実行できませんでした。
/var/task/bootstrap : permission denied
ちゃんとチュートリアルに Linux 互換環境を用意するように!と書いていましたので
関数ファイルに「実行権限」を付与する設定は重要ですね。
#問題解決に協力してくれた 鎌田悠平 編集長 ありがとうございました。m(_ _)m