- Outline・概要
- When to use Lambda Functions・いつLambda関数を使用すべき
- Adding Lambda Functions・Lambda 関数の追加
- Adding Lambda Layers・Lambda Layerの追加
- Summary・まとめ
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でバックエンドをフロントエンドアプリに統合。
Adding Lambda Functions・Lambda 関数の追加
AWS Lambdaへ移動、関数 → 関数の作成をクリックします。
次の画面で「一から作成」で関数名を記入し、ランタイムを選択(当記事はNode.js 18.x
を使用)、
実行ロールは「シンプルなマイクロサービスのアクセス権限」にします。
💡 関数を役に立たせるには他のAWSサービスにアクセスが必要になります。「IAM」ではアクセス権限を追加することはできます。どの権限が必要となるというのは、関数で何をしたいかによります。ただし、原則としては最低限なポリシーを追加しましょう。
関数の作成をクリックします。そうすると関数の画面に下記のような表示され、下の方を見ると定型コードもすでに入ってあるということもわかります。
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時間の時差を考慮して記入します。
Cron式を確認する際、このサイトは役に立つと思います。
💡 API Gatewayイベントの場合、リクエストのデータは
event
に入ってくるため、そのデータを処理することができますが、今回はEventBridge (CloudWatch Events)で呼び出す場合、以前のテスト.JSONのevent
は入ってこないですので、index.js
内でkey1
とkey2
をハードコードしてOKです!
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}
2. このバージョンを使用する関数 → バージョンアップしたい関数を選択→ 編集
3. レイヤーバージョン選択 → 関数を更新
Summary・まとめ
以上はLambda関数→テスト→イベント→レイヤー→レイヤーのバージョンアップの流れでした。ご参考になれば幸いです。