本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーは一野瀬翔吾さんで、テーマは
サーバレスでコードを実行するサービスであるAWS
本稿のサンプルコードは、本誌サポートサイトから入手できます。
AWS Lambda ── サーバレスでコードを実行するサービス
AWS Lambdaはサーバレスでコードを実行するサービスです。
単にAWSでコードを実行するサービスと言えば、Amazon EC2
AWS LambdaではAWSがサーバの保守運用を代わりに行ってくれるので、ユーザーはサーバについて気にする必要はありません。コードの開発に集中できます。
AWS Lambda上で動かすコードのことをLambda関数と呼びます。Lambda関数は、プログラミング言語の関数と同じように、入力を受け取り、出力を返します。必要に応じて、Lambda関数はAWSのほかのサービスを呼び出すこともできます。
Perl Custom Runtime ── AWS Lambda上でPerlのコードを実行
執筆時点
ただし、AWS Lambda上で実際にPerlを動かすにはいくつもの手順が必要です。AWS Lambda用の特別なLinuxディストリビューションを用意し、そのLinux上でPerlをビルドしなければなりません。さらに、Custom Runtimeの仕様に合わせて起動スクリプトを書く必要があります。
その手間を省くために筆者は、AWS::Lambdaモジュールを開発しました。AWS::LambdaモジュールがCustomRuntime用の起動スクリプトを提供するので、みなさんは自分のやりたいことに集中して、Perlのコードを書けばよいのです。それに合わせて、AWS Lambda用にビルドしたPerlのバイナリを、Perl Custom Runtimeとして公開しています。Perl Custom RuntimeにはあらかじめAWS::Lambdaモジュールをインストールしてあるので、簡単にPerlのコードを動かすことができます。
AWS Lambdaへのデプロイ
まずは、入力をそのまま返すだけの簡単なLambda関数をAWS Lambdaへデプロイしてみましょう。Lambda関数をデプロイするには大きく分けて、マネジメントコンソールを使ってブラウザからデプロイする方法と、AWS SAMを使ってCLI
マネジメントコンソールからデプロイ
マネジメントコンソールはブラウザから利用できるので、初心者の方にお勧めの方法です。
なお、本稿では執筆時点のスクリーンショットを掲載していますが、マネジメントコンソールは頻繁に改善が加えられています。みなさんが実行するときには、デザインや操作方法が異なる場合があります。
関数の作成
Lambda関数のデプロイを行うには、マネジメントコンソールからLambda関数の作成画面を開きます
 
「関数の作成」
 
Perl Custom Runtimeの設定
ここに、Perl Custom Runtimeが動作するのに必要な設定を追加していきます。執筆時点の最新バージョンであるPerl 5.
図2の画面をスクロールしていくと、handler.を指定します。同様にarn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-36-runtime-al2-x86_を入力しましょう。
これでPerl Runtimeの設定は完了です。正しく設定が行えていれば、図3のような画面になるはずです。
 
ソースコードのアップロード
実行環境の設定が終わったので、いよいよPerlのソースコードを書きましょう。Lambda関数はPerlのサブルーチンとして実装します。次のソースコードは、入力をそのまま出力するLambda関数です。
use v5.36;
use utf8;
sub handle ($payload, $context) {
    return $payload;
}
1;
図3の画面をスクロールすると図4のコンソールコードエディタが表示されます。表示されたコンソールエディタにこのソースコードを入力します。
 
関数の動作確認
入力したコードはコンソールコードエディタからデプロイと実行ができます。
初回実行時はダイアログが開いて、Lambda関数へどんなデータを入力するかを聞かれます。入力データはJSON形式です。例として次のJSONデータがあらかじめ入力されているので、そのまま実行しましょう。
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
実行がうまくいけば、図4の
AWS SAMを用いたデプロイ
AWS SAM
テンプレートの作成
以下は、Perl Custom Runtimeを用いたアプリケーションの設定例です。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  Function:
    Type: AWS::Serverless::Function
    Properties:
      # ソースコードを保存したディレクトリの指定
      CodeUri: src
      
      # 実行する関数の名前
      Handler: handler.handle
      
      # Custom Runtimeを指定
      Runtime: provided.al2
      
      # コンパイル済みのPerl Custom Runtimeを読み込み
      Layers:
        - "arn:aws:lambda:ap-northeast-1:445285296882\
          :layer:perl-5-36-runtime-al2-x86_64:1"
SAM CLIのインストール
SAMテンプレートをデプロイするにはSAM CLIを利用します。macOSやLinuxを使っており、Homebrewが利用可能な場合は、次のコマンドでインストールできます。
$ brew tap aws/tap $ brew install aws-sam-cli
そのほかのOSへのインストール方法は、公式ドキュメントの
関数のデプロイ
デプロイにはdeployサブコマンドを利用します。初回デプロイ時は--guidedオプションが便利です。--guidedオプションを使ってdeployサブコマンドを実行すると、デプロイに必要な項目を対話形式で設定できます。すべてデフォルトのままで設定してかまいません。
$ sam deploy --guided
関数の動作確認
デプロイが完了したら、AWS CLIを使って動作を確認してみましょう。次のコマンドを実行すると、AWSのサーバ上で関数が実行され、response.に関数の実行結果が保存されます。simple-perl-app-Function-wCB4tK9B6Bの部分は、新しいLambda関数を作成するたびに変わります。みなさんの環境に合った名前へ置き換えて実行してください。
$ aws lambda invoke \
  --function-name simple-perl-app-Function-wCB4tK9B6B \
  --cli-binary-format raw-in-base64-out \
  --payload '{"key":"value"}' \
  response.json
<続きの

