aws-lambda-perl5-layer 書いた
[2018-12-05 追記]
ビルド済みのLayerを公開しましたので,そちらを使うと便利です.
See also: http://moznion.hatenablog.jp/entry/2018/12/05/211523
[追記ここまで]
先日のre:InventでCustom AWS Lambda Runtimesが発表され*1,これはつまり任意の言語でAWS Lambdaを実行することを可能とする機能なんですが,ということはPerl5が動くということでして,すなわち動くと嬉しいはず,したがって動かすためのLayerを書いたという話です.
この場合のLayerというのはPerl5を動かすための基盤だと思ってください.基本的にはbootstrapが実際にぐるぐる回ってperlの関数を実行するという感じになっております.
どのようにして動いているかは公式のTutorialが詳しいので参考されたい: https://docs.aws.amazon.com/lambda/latest/dg/runtimes-walkthrough.html
さて実際やってみた感想としてはbootstrapを書くのは非常に簡単で,ざっくり挙動を説明するとOver HTTPでLambdaのイベントを取ってきてその内容に従って関数を実行して,結果をPOST backするという非常に素朴な感じです.どんな言語でも比較的容易に書けるでしょう.
問題は実行基盤を整備するところで,これは scripts/build.sh
に様々集約されているわけですが,エッセンスとしては
- デフォルトだとPATHは
/usr/local/bin:/usr/bin/:/bin:/opt/bin
以下に通っているのでそこにランタイムを突っ込む必要がある - Layerのzip archiveのルートは
/opt
に アタッチされるっぽい- なので
bin/
やらlib/
やらをzipのルートに入れておけば良い感じになる - そこにperlのランタイムを突っ込むという作戦
- bootstrapが必要とするライブラリ群もあらかじめここに入れておく
- なので
- Layer zipのルートに
bootstrap
を置いておけばそのファイルがbootstrapとして認識される (つまり実行される)- 実行可能なpermissionが当たってないと動かない
- ランタイムやツールのインストール (つまりzipping) する際には実環境と揃える必要がある
- 適切なDockerコンテナを使って処理する必要がある
- lambciの提供しているものを使った
という感じです.結構難しくてハマってしまいました……なお,実際に利用可能な環境変数群については以下を参考にされたい: https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
まだドキュメントが十分に揃っていなく,また謎挙動もいろいろあるのですが *2 非常に面白い機能だと思いました.夢が広がりますね!!!