sironekotoroの日記

Perl で楽をしたい

Perl を AWS Lambda で使って Hello World! する

前回までのあらすじ

AWS 何もわからん・・・でもやらないと・・・そんな気持ちだけが先走った状態をやっと抜け、 AWS のハンズオンに取り組み始めた sironekotoro 。

しかし、ここで自分が動画ハンズオンが苦手なことに気づいてしまう。追い討ちをかけるように低速度回線(WiMAX 夜間108kbps)が進捗と精神を蝕む。

そして、どうしても AWS Lambda で Perl を動かしたい!という気持ちが抑えられないのだった。

前提

AWS の勉強はこれをやってます。

qiita.com

書いてある順にこなし、AWS Lambda のところまで来ました。

pages.awscloud.com

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 GatewayAPI 作って GET を叩き、最後に DynamoDB で入出力の記録を収録するというものです。

途中で書くコードは AWS Lambda が標準でサポートしている Python でした。

Perl 書いて Lambda で Hello,World!

準備

AWS Lambda で Perl を動かす方法はいろいろあるみたいなのですが、今回はレイヤーを使いました。

docs.aws.amazon.com

レイヤーは、ライブラリ、カスタムランタイム、またはその他の依存関係を含む .zip ファイルアーカイブです。レイヤーを使用することで、関数のライブラリを使用することができます。

「Lambda Perl」で検索すると、このカスタムランタイムなるものを使えば Perl が動く、ってことが書いてある・・・あるけど、具体的にどうやるのか分からず。

が、分からないまま進めていきます。蛮勇。

github.com

Perl のレイヤー一覧見ていくと、AWS のリージョンごとに提供されている模様。

今回、自分は東京リージョンで Lambda を作成したので arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-32-runtime-al2:3 を用います。

具体的な進め方

結局、試行錯誤したんで、かつての自分が知りたかったことを書いていきます。いつか、「Perl 入学式 in AWS」 でやるかもしれない・・・(そんな企画はない

  1. AWS の Lambda のページを開く

  2. 「関数の作成」のページ

    • 画面上部にあるオプションは「一から作成」を選択
    • 関数名は任意ですが、今回は「perl_test」とします
    • ランタイムはプルダウンメニュー最下部にある「カスタムランタイム」の中の「Amazon Linux 2 でユーザー独自のブートストラップを提供する」を選択
      • shogo82148 / p5-aws-lambdaUse Prebuild Public Lambda Layers3. For the "Runtime" selection, select Provide your own bootstrap on Amazon Linux 2. より
    • 画面右下のオレンジ色の「関数の作成」をクリック f:id:sironekotoro:20210312223315p:plain
  3. 「関数の概要」部の「Perl_test」の下にある「Layers」をクリック f:id:sironekotoro:20210312223805p:plain

  4. 遷移した先の「レイヤーの追加」ボタンをクリック f:id:sironekotoro:20210312224009p:plain

  5. レイヤーの情報を入力する

    • 「ARN を指定」のラジオボタンを選択
    • 「ARN を指定」のテキストボックスに arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-32-runtime-al2:3 をコピペ f:id:sironekotoro:20210312224422p:plain
    • 画面右下のオレンジ色の「追加」をクリック
  6. 「関数の概要」部の「Perl_test」の下にある「Layers」の右に (1) となっていればレイヤーの追加に成功している

    f:id:sironekotoro:20210312231120p:plain

  7. 「関数の概要」の下にあるコードソースのところで新しいファイルを作る

    • File から New File を選択

      f:id:sironekotoro:20210312231215p:plain

    • 右側のテキストフィールドに以下のコードを記述またはコピペ

      • このサブルーチン名 hundler は固定

    gist.github.com

    • コードを書いたら File から Save を選択し hello.pl という名前で保存する
      • このファイル名 hello.pl は今のところ固定

    f:id:sironekotoro:20210312233303p:plain

    f:id:sironekotoro:20210312233526p:plain

    • 左側のファイル一覧に保存した hello.pl が増えてることを確認する

    f:id:sironekotoro:20210312233751p:plain

  8. デプロイする

    • コードの編集・保存をする都度、上にあるオレンジ色の「Deploy」ボタンを押す

    f:id:sironekotoro:20210312235132p:plain

    • コードの保存をしても、この「Deploy」ボタンを押さないと Lambda 上では変更が反映されないので注意

    • 「Deploy」ボタンを押すと、ボタン右の表示が緑色になり「Deploy」ボタンが押せなくなる

    f:id:sironekotoro:20210312235434p:plain

  9. コード入力欄の上にある「Test」をクリックする

    f:id:sironekotoro:20210312234648p:plain

    • ラジオボタンは「新しいテストイベントの作成」をクリックする
    • イベントテンプレートは hello-world のまま
    • イベント名は適当に PerlTest とかで
    • 入力が終わったら、画面右下のオレンジ色の「作成」ボタンを押す

    f:id:sironekotoro:20210312234319p:plain

  10. 再度「Test」ボタンを押す

    • コードを書いたテキストフィールドの上に「Execution results」タブが増えており、そこにテスト結果が入っている

    f:id:sironekotoro:20210313001802p:plain

もう一歩

ここまでだと、単にテストケース増やしただけなので、もう少しコードを増やしてみます。

増やしたら保存&「Deploy」を忘れずに。

gist.github.com

f:id:sironekotoro:20210313001815p:plain

ということで

Lambda でも Perl 使えるよ!ってな記事でした。

公式の AWS Lambda ハンズオンのように、他のサービスに繋げるのもできるのではないかなぁと思います(やってない)。

ただ、現状では標準モジュール以外のモジュール(cpanm とかでインストールするもの)が使えません。

どうも、モジュールを zip で固めてレイヤーで追加する・・・らしいんですが、その辺りが不明です。

あと、AWSが提供している他のサービスとの連携・・・を Perl でやるには?とか。

aws-sdk-perl

AWS::Lambda とか?

その辺りは勉強進めていきたいですね。

何か良い資料ある方、あるいは教えてやろうという方お待ちしてます。

感想

「何も Perl でやらなくても良いのでは?」

「メモリで課金されるし、Perl 使うと高くつくのでは」

「標準で提供されている言語でやるのが楽なのでは」

などなど、やりながらいろいろ思ったんですが、何やかんやで「好奇心」と 1 週間前の自分に教えてあげたいよねー、というのが推進力でした。