HapInS Developers Blog

HapInSが提供するエンジニアリングの情報サイト

バックエンドに欠かせないAWS Lambda関数&レイヤーの紹介!

Outline・概要

当記事では、Lambda 関数とレイヤーについてシンプルな関数を初め、呼び出すイベントの一つ、関数を共有できるレイヤーも紹介します!

使用する言語はJavaScriptですが、どの言語でも概念は同様です。

まずはいつLambdaを使用すべきか確認しましょう!

When to use Lambda Functions・いつLambda関数を使用すべき

AWS Lambdaのおすすめの使い方としては、下記の通りです。

  • ファイル処理:S3などを利用し、アップロード後にリアルタイムでLambdaでデータ処理。
  • ストリーム処理:LambdaとKinesisを利用し、ストリーミングデータの処理。
  • Webアプリ:他のAWSサービスと組み合わせ、自動的にスケールアップ/スケールダウンし、複数のデータセンターで実行されるWebアプリを構築。
  • IoTバックエンド:Lambdaを使用してサーバーレスバックエンドを構築し、Web、モバイル、IoT、サードパーティーAPIリクエストを処理。
  • モバイルバックエンド:API GatewayとLambdaでAPIリクエストの認証・処理。LambdaとAmplifyでバックエンドをフロントエンドアプリに統合。

上記に関しAWSドキュメンテーションを参照

Adding Lambda Functions・Lambda 関数の追加

AWS Lambdaへ移動、関数 → 関数の作成をクリックします。

Lambda関数
Functions

次の画面で「一から作成」で関数名を記入し、ランタイムを選択(当記事はNode.js 18.xを使用)、

実行ロールは「シンプルなマイクロサービスのアクセス権限」にします。

関数の作成
関数の作成

関数の作成をクリックします。そうすると関数の画面に下記のような表示され、下の方を見ると定型コードもすでに入ってあるということもわかります。

Lambda関数の定型コード
Lambda関数の定型コード

Creating a simple function・シンプルな関数を作成

この関数にはイベントなどをつけていないため、呼び出すにはまずテストのイベントをつけてみましょう。 テストのタブではテストイベントの作成が可能です。テンプレートイベントが様々ありますし、自分で作成してもOKです。今回はhello-worldのテンプレートを下記のように少々変更します。

event.json

{
  "key1": "Hello",
  "key2": "World"
}

イベントのデータを使用するために、下記のgreeting関数をつけます。

index.js

export const handler = async(event) => {
    const {key1, key2} = event;
    const greeting = (word1, word2)  => {
        return word1 + ' ' + word2;
    }
    const helloWorld = greeting(key1, key2);
    const response = {
        statusCode: 200,
        body: JSON.stringify(helloWorld),
    };
    return response;
};

テストを実行すると下記のリスポンスが戻ってきます。

Test Event Name
helloWorld

Response
{
  "statusCode": 200,
  "body": "\"Hello World\""
}

How to call a function・Functionの呼び出し方

コードは実行できていますが、手動でTestを押して呼び出していますので、あまり役に立たない関数ですね。自動に実行したいため、トリガーを追加しましょう。様々ありますがトリガーの例としては、S3バケットに新しいものが入ったことや、APIが呼ばれたことや、設定した時間になったことなど、なんでもあり得ます。

今回はシンプルなトリガーにしたく、毎朝の9時(JST)に世界に挨拶できれば良いと思いますので、その設定しましょう。

Events・イベント

関数の概要の「+トリガーを追加」ボタンを押します。 テストテンプレートと同じように様々な選択がありますが、今回は追加したいトリガーはEventBridge (CloudWatch Events)です。 スケジュール式を選択、そしてcron式で設定します。ちなみにcronは協定世界時UTC)のため、日本時間の9時間の時差を考慮して記入します。

EventBridge
EventBridge (CloudWatch Events)

Cron式を確認する際、このサイトは役に立つと思います。

Adding Lambda Layers・Lambda Layerの追加

Why add layers?・なぜLayerを使用する?

先ほどのgreeting関数を他のLambda関数で使用したい場合はどうしますか?手動でコピペしても良いですが、関数が増えれば増えるほど管理が大変になってしまいます。また、greeting関数程度シンプルではないものでしたら?node_modulesなどはどうしますか?その場合はレイヤーを使用しましょう。

レイヤーを使用すると、レイヤーに追加するライブラリや関数などを共有することができます。管理もしやすくなります!

レイヤーでモージュールなどを共有
レイヤーでモージュールなどを共有

Creating a Lambda Layer・Lambda Layerの作成

レイヤーは.zipでアップロードできます。.zipを作成する時、パスが重要のため、下記の表を確認しましょう。

1. Node.jsを使用していますので、nodejsフォルダーをまず作成します。もしnode_modulesもある場合はその中に入れましょう。カスタムなUtilsなどをLambdaレイヤーに追加しましたら、Lambda関数では/opt/nodejsのフォルダーからリファレンス可能です。

各 Lambda ランタイムのレイヤーパス

ランタイム パス
Node.js nodejs/node_modules
nodejs/node14/node_modules (NODE_PATH)
nodejs/node16/node_modules (NODE_PATH)
Python python
python/lib/python3.9/site-packages(サイトディレクトリ)
Java java/lib(CLASSPATH)
Ruby ruby/lib (RUBYLIB)
すべてのランタイム bin (PATH)
lib (LD_LIBRARY_PATH)

上記の表はAWSドキュメンテーションを参照

2. nodejsフォルダーにはutilsフォルダーを作成し、その中にgreeting.jsを作成し、下記のコードを追加します。

const greeting = (word1, word2)  => {
    return word1 + ' ' + word2;
};

exports.greeting = greeting;

3. 保存して、nodejsフォルダーを.zipとして保存します。

4. AWS Lambdaに戻り、レイヤーの作成をクリック、名前(greeting)、説明など記入し、ランタイムは複数も選択できますが、今回はNode.js 18.xにします。.zipのアップロードも忘れないように!

5. 追加できたら、Lambda関数に戻ります。関数の概要から「Layers」を選択し、カスタムレイヤーを選択、前のステップで作ったレイヤーとバージョンを追加します。

関数の概要
関数の概要

Lambda Layer usage・Lambda Layerを使用する

レイヤーは追加完成しましたが、コードではどうやって呼び出せるでしょう?

まずは呼び出すにはimportが必要です。

// 下記で見ての通り、以前作成したnodejsとutilsのフォルダーがあります。全ては”/opt/"の中にあります。
import layer from "/opt/nodejs/utils/greeting.js";

使用しましょう。

import layer from "/opt/nodejs/utils/greeting.js";

export const handler = async(event) => {
    const {key1, key2} = event;
    const helloWorld = layer.greeting(key1, key2);
    const response = {
        statusCode: 200,
        body: JSON.stringify(helloWorld),
    };
    return response;
};

node_modulesを追加する場合は/opt/nodejsは不要でいつも通りimportできます。

import axios from 'axios';

これで他のLambda関数でもコードを共有できます!

Upgrading Layer versions through the console・コンソールでバージョンアップする

レイヤーの新規バージョンを作成して.zipをアップロードしても使用している関数に新しいバージョンを使用するようにしないとなりません。

レイターを修正してバージョンアップしたい場合は下記の手順でできます。

1. AWS Lambda → レイヤー → ${layerName}

Lambdaレイヤー
AWS Lambda Layers

2. このバージョンを使用する関数 → バージョンアップしたい関数を選択→ 編集

レイヤーのバージョンアップ画面
バージョンの詳細

3. レイヤーバージョン選択 → 関数を更新

関数のレイヤーバージョンを編集
関数のレイヤーバージョンを編集

Summary・まとめ

以上はLambda関数→テスト→イベント→レイヤー→レイヤーのバージョンアップの流れでした。ご参考になれば幸いです。