Perl を AWS Lambda で使って Hello World! する
前回までのあらすじ
AWS 何もわからん・・・でもやらないと・・・そんな気持ちだけが先走った状態をやっと抜け、 AWS のハンズオンに取り組み始めた sironekotoro 。
しかし、ここで自分が動画ハンズオンが苦手なことに気づいてしまう。追い討ちをかけるように低速度回線(WiMAX 夜間108kbps)が進捗と精神を蝕む。
そして、どうしても AWS Lambda で Perl を動かしたい!という気持ちが抑えられないのだった。
前提
AWS の勉強はこれをやってます。
書いてある順にこなし、AWS Lambda のところまで来ました。
AWS公式で掲載されているハンズオンも 2019 年に収録されているものなので、AWS のコントロールパネルの配置や情報のたどり方が違っています。
進化の早い業界なので仕方ないですね・・・でも、大体なんとかわかります。
あ、一点だけ、途中に出てくる JSON が invalid なのでそこだけは注意かなぁ。
invalid な(よろしくない)やつ
{ "statusCode": 200, "body": { { "report_id": 5, "report_title" : "Hello, world" }, { "report_id": 7, "report_title" : "Good morning!" } } }
多分こうじゃないかなという
{ "statusCode": 200, "body": [ { "report_id": 5, "report_title" : "Hello, world" }, { "report_id": 7, "report_title" : "Good morning!" } ] }
ハンズオン自体はまず Lambda で関数を作り、API Gateway で API 作って GET を叩き、最後に DynamoDB で入出力の記録を収録するというものです。
途中で書くコードは AWS Lambda が標準でサポートしている Python でした。
Perl 書いて Lambda で Hello,World!
準備
AWS Lambda で Perl を動かす方法はいろいろあるみたいなのですが、今回はレイヤーを使いました。
レイヤーは、ライブラリ、カスタムランタイム、またはその他の依存関係を含む .zip ファイルアーカイブです。レイヤーを使用することで、関数のライブラリを使用することができます。
「Lambda Perl」で検索すると、このカスタムランタイムなるものを使えば Perl が動く、ってことが書いてある・・・あるけど、具体的にどうやるのか分からず。
が、分からないまま進めていきます。蛮勇。
Perl のレイヤー一覧見ていくと、AWS のリージョンごとに提供されている模様。
今回、自分は東京リージョンで Lambda を作成したので arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-32-runtime-al2:3
を用います。
具体的な進め方
結局、試行錯誤したんで、かつての自分が知りたかったことを書いていきます。いつか、「Perl 入学式 in AWS」 でやるかもしれない・・・(そんな企画はない
AWS の Lambda のページを開く
- 今回はアジアパシフィック リージョンで作ります
- リージョンとは?となったら、遠回りでも先に紹介した「【AWS初心者向け】AWS学習方法まとめ【15時間で達成できる】」とかで復習
- 右上のオレンジ色の「関数の作成」をクリック
- 今回はアジアパシフィック リージョンで作ります
「関数の作成」のページ
- 画面上部にあるオプションは「一から作成」を選択
- 関数名は任意ですが、今回は「perl_test」とします
- ランタイムはプルダウンメニュー最下部にある「カスタムランタイム」の中の「Amazon Linux 2 でユーザー独自のブートストラップを提供する」を選択
- shogo82148 / p5-aws-lambda の
Use Prebuild Public Lambda Layers
の3. For the "Runtime" selection, select Provide your own bootstrap on Amazon Linux 2.
より
- shogo82148 / p5-aws-lambda の
- 画面右下のオレンジ色の「関数の作成」をクリック
「関数の概要」部の「Perl_test」の下にある「Layers」をクリック
遷移した先の「レイヤーの追加」ボタンをクリック
レイヤーの情報を入力する
- 「ARN を指定」のラジオボタンを選択
- 「ARN を指定」のテキストボックスに
arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-32-runtime-al2:3
をコピペ - 画面右下のオレンジ色の「追加」をクリック
「関数の概要」部の「Perl_test」の下にある「Layers」の右に
(1)
となっていればレイヤーの追加に成功している「関数の概要」の下にあるコードソースのところで新しいファイルを作る
File
からNew File
を選択右側のテキストフィールドに以下のコードを記述またはコピペ
- このサブルーチン名
hundler
は固定
- このサブルーチン名
- コードを書いたら
File
からSave
を選択しhello.pl
という名前で保存する- このファイル名
hello.pl
は今のところ固定
- このファイル名
- 左側のファイル一覧に保存した
hello.pl
が増えてることを確認する
デプロイする
- コードの編集・保存をする都度、上にあるオレンジ色の「Deploy」ボタンを押す
コードの保存をしても、この「Deploy」ボタンを押さないと Lambda 上では変更が反映されないので注意
「Deploy」ボタンを押すと、ボタン右の表示が緑色になり「Deploy」ボタンが押せなくなる
コード入力欄の上にある「Test」をクリックする
- ラジオボタンは「新しいテストイベントの作成」をクリックする
- イベントテンプレートは
hello-world
のまま - イベント名は適当に
PerlTest
とかで - 入力が終わったら、画面右下のオレンジ色の「作成」ボタンを押す
再度「Test」ボタンを押す
- コードを書いたテキストフィールドの上に「Execution results」タブが増えており、そこにテスト結果が入っている
もう一歩
ここまでだと、単にテストケース増やしただけなので、もう少しコードを増やしてみます。
増やしたら保存&「Deploy」を忘れずに。
ということで
Lambda でも Perl 使えるよ!ってな記事でした。
公式の AWS Lambda ハンズオンのように、他のサービスに繋げるのもできるのではないかなぁと思います(やってない)。
ただ、現状では標準モジュール以外のモジュール(cpanm
とかでインストールするもの)が使えません。
どうも、モジュールを zip で固めてレイヤーで追加する・・・らしいんですが、その辺りが不明です。
あと、AWSが提供している他のサービスとの連携・・・を Perl でやるには?とか。
aws-sdk-perl
?
AWS::Lambda
とか?
その辺りは勉強進めていきたいですね。
何か良い資料ある方、あるいは教えてやろうという方お待ちしてます。
感想
「何も Perl でやらなくても良いのでは?」
「メモリで課金されるし、Perl 使うと高くつくのでは」
「標準で提供されている言語でやるのが楽なのでは」
いいか、これは、この世界でいちばんいい銃だ!
— 軍事オタクがリプライに使える画像bot (@replyphotomili) 2017年11月18日
いちばんすぐれた小銃なんだ!!
おれには、これしかないんだ!
だから、これがいちばんいいんだ!! pic.twitter.com/qjboSQZzfh
などなど、やりながらいろいろ思ったんですが、何やかんやで「好奇心」と 1 週間前の自分に教えてあげたいよねー、というのが推進力でした。