Apex で Go はどう実行されているのか


こんにちは、小野寺です。
これは、 TECHSCORE Advent Calendar 2016 の8日目の記事です。

先日のAWS re:Invent 2016の発表で AWS Lambda で使用できる言語に、これまでのJava、Python、Node.jsに加えてC#が追加されましたね。

Apex というLambdaFunctionを簡単に構築・展開・管理できるツールを使うと
正式にはサポートされていないGoをNode.jsを介してLambdaで使うことができます。
今回はApexがどのようにGoをLambdaで実行しているのか見てみました。

ApexでGoをLambdaにデプロイ

まず、ApexにあるGoのサンプルコードを参考にLambdaにデプロイします。
サンプルコードはこちらからご覧ください。(Apexの設定は割愛します)

apex deploy すると、Apexの内部パッケージであるshimによって
Lambdaに以下のようなファイルを展開します。

Apex で生成されたコードを読む

展開されたコードを読んでみましょう。
index.js は以下のような内容です。

index.js を細かく見ていきます。

index.jsでは2つのモジュールが使われています。

child_process.spawn(command, [args], [options]) で子プロセスを作成しています。

command

実行するコマンドを指定します。
./main は Go で作成した main.go のビルド済みバイナリを実行します。

args

コマンドの引数を指定できますが、今回は省略しています。

options

stdioのオプションで子プロセスの入出力設定をしています。それぞれ、

に対応していて、標準入力、標準出力はパイプに、標準エラー出力は親プロセスと共有しています。

また、子プロセスが終了した場合、もしくはエラーが発生した場合に標準エラー出力をして終了します。

bylineモジュールによって、子プロセスからの標準出力を1行ずつ処理します。
ctx.done()で、レスポンス(エラーがあればエラーレスポンス)を返して処理を終了します。

このハンドラがLambdaで実行される関数です。
event と context を子プロセスの標準入力に渡しています。

おわりに

Node.jsとGoが標準入出力パイプでやり取りしていることがわかりました。
今回、Go言語の記事を書こうと思っていたのですがNode.jsのコードリーディングになりました。

まだLambdaもApexも使い始めたばかりなので、これから色々試していこうと思います。

参考リンク


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です