その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

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を書いたという話です.

github.com

この場合の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 非常に面白い機能だと思いました.夢が広がりますね!!!