Docker 開発環境 for Lambda Rust runtime

2 min読了の目安(約2000字TECH技術記事

AWS Lambda 上で動作する Rust runtime を簡単に作成するための Docker 開発環境の lambda-rust-builder というのを作りました。

https://github.com/anyakichi/docker-lambda-rust-builder

https://hub.docker.com/r/anyakichi/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 とか全然敷居高くないんで、ぜひやってみてください。