Docker 開発環境 for Lambda Rust runtime
AWS Lambda 上で動作する Rust runtime を簡単に作成するための Docker 開発環境の lambda-rust-builder というのを作りました。
やってみる
Docker がインストールされている環境を用意してください。そこに din コマンドをインストールして PATH も通しておきます。
$ curl -o ~/.local/bin/din https://raw.githubusercontent.com/anyakichi/docker-buildenv/master/din.sh
$ PATH=$HOME/.local/bin:$PATH
そしたらサンプル用の lambda-rust-sample をビルドして動かしてみます。
lambda-rust-sample は受け取ったデータをそのまま返すだけのプログラムです。
$ mkdir workspace && cd workspace
$ din anyakichi/lambda-rust-builder
[builder@workspace build]$ extract
[builder@workspace build]$ setup
[builder@workspace lambda-rust-sample]$ build
[builder@workspace lambda-rust-sample]$ echo '{"data":"test"}' \
| DOCKER_LAMBDA_USE_STDIN=1 /var/runtime/init -bootstrap target/release/lambda-rust-sample
はい、動きましたね。
さらに続けて、AWS で実際に動かしてみましょう。
[builder@workspace lambda-rust-sample]$ package
lambda-rust-sample.zip というファイルができているはずなので、これを aws コマンドでも Web のコンソールでもいいのでアップロードしてください(role 引数の都合で aws コマンド例を示しにくい)。実行環境は provided (Amazon Linux 1) の環境にします。コンテナから抜けてもファイルはそのまま置いてあるはずです。
アップロードしたら実行します(コンソールからでも構いません)。
$ aws lambda invoke --function-name lambda-rust-sample \
--payload '{"data":"test"}' /dev/stdout
はい、おしまい。簡単でしたね。
コンテナの外からアクセス
Docker コンテナは Lambda の実行環境になっているので(実際に先ほども標準入力からデータを渡す形で実行しました)、今度はホスト側からリクエストを投げてみましょう。
workspace から今度は直接 run コマンドを実行してみます(9001 ポートも公開します)。
$ cd workspace
$ din -p 9001:9001 anyakichi/lambda-rust-builder run
これで Lambda が API モード(?)で動くので、別のターミナルウインドウから
$ curl -d '{"data":"test"}' http://localhost:9001/2015-03-31/functions/myfunction/invocations
とやるとテストができます。
細かいこと
-
Amazon Linux 2 の環境だと pkg-config の具合が悪いようで、openssl-sys などのビルドに失敗します。なので Docker 環境も Amazon Linux 1 になっていて、 AWS 側もこれに合わせています。
-
din を使ったこのシステムは Docker 開発環境と呼んでいて、もともと組み込み用のファームウェア (Yocto や AOSP など) をビルドするために作られたものではありますが、だいたい何にでも流用できます。
Rust で Lambda とか全然敷居高くないんで、ぜひやってみてください。
Discussion