sironekotoroの日記

Perl で楽をしたい

Perl の自作モジュールを AWS Lambda で動かす

GWずっとこれやってた

平年であれば帰省して甥っ子姪っ子と遊んだり・・・いや、もう遊んでもらえない歳になってしまったか。

まぁ、今年もコロナ禍で帰省するわけにはいかない感じなので、Perl の自作モジュールを AWS Lambda で動かすってのをやってました。

最終日にしてやっと動くようになったので、自分用の備忘録で書いておきます。

こんな感じで動かしました

shogo82148.github.io

ここに書いてあるまま +α です。

+α 分を書いていきます。

  • bootstrapinstall.sh には chmod +x で実行権限をつけておく。

  • Github からスクリプトを入れる際には、パッケージのビルドスクリプトに git を入れておく。

  • cpanm は GitHub からのインストールを正式にサポートはしていないが、 git://github.com/〜 でいける。うちの場合にはこう書きました。

#!/bin/sh
yum install -y gcc git perl-App-cpanminus
cpanm -l local --notest --installdeps .
cpanm -l local --notest git://github.com/sironekotoro/Zengin-Perl.git

あと、最後に圧縮して AWS Lambda に上げるところですが

docker run --rm -v "$PWD":/var/task lambci/lambda-base ./install.sh
zip -r ../dist.zip .

zip -r ../dist.zip . で、 dist.zip の後に . スペースとドットが必要です。まぁ、その場でわかるとは思うけど(一瞬わからなくて???ってなった人)

そして、圧縮した zip ファイルですが、AWS Lambda のここからアップロードします。コード書くところの右上の「アップロード元」ってところ。

f:id:sironekotoro:20210509132706p:plain

同じファイル名で何か書いてある場合には上書きされます。

アップロードするとこんな感じになります。圧縮されたファイルが展開されて左側に色々と増えてます。

f:id:sironekotoro:20210509133741p:plain

なお、この方法で動かす場合には、Lambda Layer に追加の Perl ランタイムは不要です。

ランタイムは「カスタムランタイムを利用」にしておきます。

f:id:sironekotoro:20210509133002p:plain

ハンドラは hello.handler としていますが、この場合、Lambda 起動したときに動く Perlスクリプトhello.pl 内の handler サブルーチンです。

なんでこんなに時間がかかったのか

  1. AWS Lambda で Perl を動かすには、Perl の Lambda Layer が必須だと思っていた。が、これがどこにも書いていない、完全な思い込み。不要だった。

    自分の思い込みで、これだけで 3 日くらい費やした気がします。

    カスタムランタイムをアップロードしつつ、Perl のランタイムレイヤーを追加したりしてた。

  2. 自作モジュールをインストールするのに当初は SSH でのインストールをやろうとしていました。

    が、そうすると Docker イメージに SSH秘密鍵を設定する必要があり、それをするのに手間取りました。しかし、最終的には cpanm git://〜 の形で解決。

  3. XS利用モジュールがうまく動かなかった。

    自作のモジュールでは Function::ParametersFile::Slurp を利用していましたが、これを検索パスから辿ることができず、またこれから依存しているモジュールが見つからない、ということで難儀しました。

    どうも、XS という C 言語のバイナリを利用しているモジュールがうまく動いていないことに気づきました。

    これに関しては、自作モジュール側を改修して、これらのモジュールを外しました。

    テストを書いていたおかげで、安心して書き直すことができました。

  4. AWS Lambda 用にモジュールをローカルにインストールする為に使う lambci/lambda と、AWS Lambda に追加する Perl Runtime Leyer の役割を理解しておらず、混乱した

  5. というか、今回の方法でインストールされる Perl は 5.016003 なんだけど、どういう方法で入っているのかわからない。標準モジュールのはずの Data::Dumper も明示的に cpanfile に書かないとダメ。Perl Runtime Leyer は Perl 5.032 で標準モジュールは普通に利用できる。

他にもまぁ、アホだ間抜けだ注意不足だなどなど、色々あるんですが、なんとか動きました。

多分、このエントリにも勘違いが入ってるんだろーなーと思います。

動機

AWS でLambda をどうこうっていうと、まぁ普通はサポートしている言語のものが多いです。当たり前ですが。

そこで、Perl を動かしてやろうじゃないか、ってのが一つ。

次に、コンソールから aws cli 使ってアップロードってのが常道で多数派だとは思うのですが、であればこのWebコンソールからもできるはずで、そちらで動かしてみたい、というのが一つ

なお、本来の目的は全銀コード検索を Slack のスラッシュコマンドからやりたい!ってやつだったのですが、先週社内勉強会でこの話したところ「herokuの方が向いてんじゃない?」とのことだったので、そりゃそうだと納得。そのうちherokuで動かしたいと思います。

前に一回やったんで、また過去の自分のブログ記事が助けになるはず。

GWの終わりに

カレンダー通りだったんですが、とはいえ随分な時間を費やしましたわ。

でも、こうやってまとめると2600文字ちょっと。1週間前の自分に教えてあげたいー、そしたらもっと前に進むことできたのにー