Perl Hackers Hub

第75回AWS Lambda入門 サーバレスでもPerlを活用しよう!(1)

本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーは一野瀬翔吾さんで、テーマは「AWS Lambda入門」⁠1)です。

サーバレスでコードを実行するサービスであるAWSAmazon Web Services⁠ Lambdaでは、自分の好きな言語を動かすことができます。今回は、Perlを使ってシンプルなアクセスカウンタを作ってみましょう。

本稿のサンプルコードは、本誌サポートサイトから入手できます。

AWS Lambda ── サーバレスでコードを実行するサービス

AWS Lambdaはサーバレスでコードを実行するサービスです。

単にAWSでコードを実行するサービスと言えば、Amazon EC2Elastic Compute Cloudが第一に挙がるでしょう。Amazon EC2は非常に自由度が高く、物理サーバとほぼ同じことが実現できます。その反面、OSやミドルウェアのアップデート、サーバの監視といった、保守運用もユーザー自身が行う必要があります。

AWS LambdaではAWSがサーバの保守運用を代わりに行ってくれるので、ユーザーはサーバについて気にする必要はありません。コードの開発に集中できます。

AWS Lambda上で動かすコードのことをLambda関数と呼びます。Lambda関数は、プログラミング言語の関数と同じように、入力を受け取り、出力を返します。必要に応じて、Lambda関数はAWSのほかのサービスを呼び出すこともできます。

Perl Custom Runtime ── AWS Lambda上でPerlのコードを実行

執筆時点(2022年9月)でAWSが提供しているランタイムは JavaScript、Python、Ruby、Java、Go、.NETで、Perlは提供されていません。しかし、心配は無用です。2018年11月にCustom Runtimeが公開され、自分の好きな言語を動かすことが可能になりました。

ただし、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を使ってCLICommand Line Interfaceからデプロイする方法があります。両者を順に解説します。

マネジメントコンソールからデプロイ

マネジメントコンソールはブラウザから利用できるので、初心者の方にお勧めの方法です。

なお、本稿では執筆時点のスクリーンショットを掲載していますが、マネジメントコンソールは頻繁に改善が加えられています。みなさんが実行するときには、デザインや操作方法が異なる場合があります。

関数の作成

Lambda関数のデプロイを行うには、マネジメントコンソールからLambda関数の作成画面を開きます図1⁠。関数の作成オプションは「一から作成」を選択します。Custom Runtimeを使用するので、ランタイムには「Amazon Linux 2でユーザー独自のブートストラップを提供する」を選択します。アーキテクチャは「x86_64」を選択します。

図1 関数の作成
画像

「関数の作成」ボタンをクリックして、関数を作成しましょう。Lambda関数の動作に必要最低限なリソースが作成され、図2の画面が表示されます。

図2 新規作成されたLambda関数
画像

Perl Custom Runtimeの設定

ここに、Perl Custom Runtimeが動作するのに必要な設定を追加していきます。執筆時点の最新バージョンであるPerl 5.36を使用します。

図2の画面をスクロールしていくと、⁠ランタイム設定」という項目があります。⁠編集」ボタンをクリックし、⁠ハンドラ」handler.handleを指定します。同様に「レイヤー」という項目を探して、⁠レイヤーの追加」ボタンをクリックします。⁠レイヤーソース」から「ARNを指定」を選択したあと、⁠ARNを指定」というテキストボックスにarn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-36-runtime-al2-x86_64:1を入力しましょう。⁠レイヤーを追加」ボタンをクリックして、レイヤーを追加します。

これでPerl Runtimeの設定は完了です。正しく設定が行えていれば、図3のような画面になるはずです。

図3 関数の設定内容
画像

ソースコードのアップロード

実行環境の設定が終わったので、いよいよPerlのソースコードを書きましょう。Lambda関数はPerlのサブルーチンとして実装します。次のソースコードは、入力をそのまま出力するLambda関数です。

リスト handler.pl
use v5.36;
use utf8;

sub handle ($payload, $context) {
    return $payload;
}
1;

図3の画面をスクロールすると図4のコンソールコードエディタが表示されます。表示されたコンソールエディタにこのソースコードを入力します。

図4 コンソールコードエディタ
画像

関数の動作確認

入力したコードはコンソールコードエディタからデプロイと実行ができます。⁠Deploy」ボタンを押してAWSのサーバに反映したあと、⁠Test」ボタンを押して実行してみましょう。

初回実行時はダイアログが開いて、Lambda関数へどんなデータを入力するかを聞かれます。入力データはJSON形式です。例として次のJSONデータがあらかじめ入力されているので、そのまま実行しましょう。

{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}

実行がうまくいけば、図4の「Execution Result」タブに実行結果が表示されるはずです。入力内容がそのまま出力されていることが確認できます。

AWS SAMを用いたデプロイ

AWS SAMServerless Application Modelは、サーバレスアプリケーションを構築するためのフレームワークです。アプリケーションの設定をYAMLYAML Ain't Markup Languageで記述されたテンプレートとして表現できるので、設定の共有やバージョン管理などを行うのに便利です。

テンプレートの作成

以下は、Perl Custom Runtimeを用いたアプリケーションの設定例です。

リスト template.yaml
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へのインストール方法は、公式ドキュメントのAWS SAM CLIのインストールを参照してください。本稿では執筆時点の最新バージョンであるSAM CLI 1.53.0を用いて動作確認しています。

関数のデプロイ

デプロイにはdeployサブコマンドを利用します。初回デプロイ時は--guidedオプションが便利です。--guidedオプションを使ってdeployサブコマンドを実行すると、デプロイに必要な項目を対話形式で設定できます。すべてデフォルトのままで設定してかまいません。

$ sam deploy --guided

関数の動作確認

デプロイが完了したら、AWS CLIを使って動作を確認してみましょう。次のコマンドを実行すると、AWSのサーバ上で関数が実行され、response.jsonに関数の実行結果が保存されます。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

<続きの(2)こちら。>

おすすめ記事

記事・ニュース一覧