sironekotoroの日記

Perl で楽をしたい

Perl を使った AWS Lambda を API Gateway に登録してブラウザから Hello, World する

前回までのあらすじ

sironekotoro.hateblo.jp

AWS Lambda で Perl を動かすことに成功した sironekotoro.

しかし、それは AWS Lambda 上で「動かしただけ」であり、なんのアクションもインプットもないものだった・・・

ってわけで

・・・いや、アクションもインプットもあったら Hello, World じゃないやろ。

今回は AWS Lambda と Amazon API Gateway を組み合わせてみます。

ブラウザでアクセスすると Hello, World! って出てくる、そういうのを目指します。

AWS Lambda の準備

なお、2021年04月02日時点での画面での記述です。

前回と同じ部分ありますが、まぁ、そういうものだと思ってお付き合いください。

ただし、2ヶ月後も同じ設定項目が、同じ名前で、同じ画面にあるかどうか・・・

  1. AWS Lambda のページ右上にある「関数の作成」をクリックする

  2. 関数の作成

    • 「1から作成」を選択
    • 関数名:my_perl_function
    • ランタイム:Amazon Linux 2 でユーザー独自のブートストラップを提供する
    • 実行ロール:デフォルトの「基本的な Lambda アクセス権限で新しいロールを作成」のまま

    右下の「関数の作成」をクリックする

  3. 「関数の概要」の画面にある Layers(0) をクリックする f:id:sironekotoro:20210402173323p:plain

    • レイヤーの追加をクリックする f:id:sironekotoro:20210402174221p:plain

    • 「ARN を指定」を選択する

    • Amazon リソースネーム(ARN)に以下を入力する arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-32-runtime-al2:1 f:id:sironekotoro:20210402174249p:plain

    保存をクリックする。「関数の概要」のところで Layers(1) となっていればok

    f:id:sironekotoro:20210402173902p:plain

  4. コードソース

    • 今回はデフォルトで用意されている bootstrap.sample, hello.sh.sample, README.md を削除しておきます。

      • 該当のファイル名の上で右クリック -> Delete を選択 f:id:sironekotoro:20210402174917p:plain
    • File から New File を選択し、エディタ部に以下のようにコードを書きます。

    • 書いたら File から Save As を選択してファイルを保存します。または Ctrl + s 。 f:id:sironekotoro:20210402191718p:plain f:id:sironekotoro:20210402191840p:plain

  5. テスト

    • エディタ部の上にある「Test」をクリックします

      • ラジオボタンは「新しいテストイベントの作成」でそのまま
      • イベント名はなんでも良いですが、ここでは「first1」としておきます
      • 下のエディタ部分は触らずに右下の「作成」ボタンをクリックします
    • ここで、Test の右隣にある Deploy ボタンをクリックします f:id:sironekotoro:20210402180608p:plain

    • デプロイが成功すると、Deploy の右にある表示が緑色で「Changes Deployed」に変わります。 f:id:sironekotoro:20210402181653p:plain

    • 再度、Test ボタンを押すと、エディタ部にタブが一つ増えテスト結果が表示されます。 f:id:sironekotoro:20210402192124p:plain

ここまでが AWS Lambda 側の準備です。

このテストはは、用意されたJSONをそのまま受け取り、body に入れて返しているというものです。

テスト結果を見ると、Web アプリ作っている人にはお馴染みの Content-TypestatusCode がありますね。

この段階でよく(自分が)引っかかるポイントは、Deploy ボタン押すのを忘れてテストやって反映されてない!ってやるやつです。

Amazon API Gateway の準備

  1. AWS のページ上部にある検索窓に API Gateway と入れて、そこから API Gateway の設定ページに進みます。 f:id:sironekotoro:20210402182713p:plain

  2. API のタイプ選択ですが、今回は 「HTTP API」で作成してみます。右下にある構築をクリックします。 f:id:sironekotoro:20210402193341p:plain

  3. 「統合を追加」のボタンをクリックし、以下のように設定します

    • 統合:Lambda
    • AWSリージョン:Lambda を作ったリージョン(今回は ap-northeast-1 (東京リージョン)) を選択
    • Lambda 関数:作成した Lambda の名前 `` を選択
    • api 名:任意に設定できるが、今回は Lambda 関数名に合わせて my_perl_api とする

    f:id:sironekotoro:20210402193739p:plain

    「次へ」をクリック

  4. ルートを設定

    ここで、HTTP のメソッドに応じた Lambda 関数を設定することができるが、今回は 1 つだけなので ANY のままでよい。

    リソースパスが API のエンドポイントになる(今回は Lambda 関数名である my_perl_function

    f:id:sironekotoro:20210402194400p:plain

    「次へ」をクリック

  5. API はバージョンによって v1 とか v2 などのようにバージョン分けすることができる。

    が、今回はそこまで改修しないのでデフォルトで設定されている通り、自動バージョニングを設定する。

    f:id:sironekotoro:20210402201205p:plain

    「次へ」をクリック

  6. 確認画面が出るので、「作成」をクリック f:id:sironekotoro:20210402201454p:plain

これで出来上がり。

f:id:sironekotoro:20210402201628p:plain

「URLを呼び出す」のところにある URL をクリックすると・・・このように not found になります。

f:id:sironekotoro:20210402201810p:plain

このURLの後ろにエンドポイントである /my_perl_function を追加してみます。

f:id:sironekotoro:20210402201938p:plain

出ました! Hello! World

これで、 AWS Lambda で作成した関数を AMAZON API Gateway に紐づけることができました。

詰まったところ

  • return で返すハッシュリファレンスを encode_jsonエンコードして返したらうまくいかなかった => 返り値は自動でエンコードしてくれる親切仕様だった

  • ログどうやって出すんだろ・・・? って試行錯誤しているうちにできたっぽい。

    API Gateway の左側メニューにある「ログ記録」を有効にして、Cloudwatch Logs の設定が必要とか言われたんで適当に作り、その ARN を貼り付けたらできた。

    ここもちゃんと解説できるようになりたいなぁ。

    f:id:sironekotoro:20210402204925p:plain