はじめてのLambda～関数のサンプルを作ってみよう

 近年、AWSでシステム構築する際、サーバー環境を自分で用意する必要がない「サーバーレス」で構成する設計が増えてきています。AWSでのサーバーレスアーキテクチャのLambdaは、実行環境としての仮想サーバーを必要とせず、サーバーシステムの保守・運用をする必要がありません。


 普段、AWSのインフラ作業をしている方であれば、ネットワークや、サーバー、ストレージなどのサービスの知識をお持ちだと思いますが、実際に興味はあるけれど、AWSのシステムに触れる機会があまりないという方は、初期コストの少ないLambdaでシステムを組むというアプローチから始めてみるのも良いと思います。


 Lambdaとは、「あらかじめ関数を登録しておくと、それを実行できる仕組み」のことで、実行したいプログラムを関数として実装してLambdaにアップロードしておくだけで、実行の段となるとそれらの実行環境（ランタイム環境）が自動的に作られ、実行してくれます。

「JavaScript(Node.js)」「Java」「C#」「Python」「Go」「Ruby」「PowerShell」等のプログラムで記述できます。
<br>

 ここでは、「AWSのLambdaとはなに？」というところから説明を行い、「シンプルなLambda関数～割り算をするLambda関数」を作成するハンズオンを実際にしていきたいと思います。基本的なサービスに触れることで、AWSの知見を深めていければと思います。

<h2>Lambdaとは？</h2>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/bd50be98-99a7-b852-aad1-af91faf009cb.png)

「あらかじめ関数を登録することで実行してくれる仕組み」という流れを実際に、AWSマネジメントコンソールからLambda関数のサンプルを組んでみることで理解していきましょう。

・書式に従ったLambda関数の書き方
・Lambdaの利用に必要なアクセス権
・Lambda関数の実行

というポイントを押さえて、ハンズオンを進めていければと思います。

Lambda関数を作ったり実行したりする操作には、適切なアクセス権があります。
開発者のIAMユーザーと、Lambda関数を実行するときに使うIAMロールを、あらかじめ作成しておきましょう。（ポリシーとして、AdministratorAccess, AWSLambda_FullAccess が必要となります）

 また、Lambda関数は、イベント駆動型であり、AWSサービスと連携して実行することができるという特徴があります。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/fb102f0d-581e-9aa5-a54e-a4a0081bc25e.png)


実行のトリガーを「イベントソース」と呼び、
DBのデータに対して操作した時や、メールを受信した時、ファイルがアップロードされた時など、イベントに応じた処理を実現することができます。

　AWSサービスと連携して実行することができるLambdaですが、API Gatewayと組み合わせると、Lambda関数をREST形式のWeb APIとして呼び出すことができるようになります。

　たとえば、HTMLの入力フォームでPOSTしたり、JavaScriptのAjaxで通信したりした結果をLambda関数で処理して、データベースに保存するという処理も記述できます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/2dd0c2e9-22ae-cd9d-4dd7-812761bfa7ae.png)

 
<h2>ログをしっかりと残すようにする～CloudWatch Logsの利用</h2>

 Lambda関数は、実行した時の状態がステートレスな実行環境であるがゆえに残りません。
その為、不具合が生じたときの原因を突き止めるために、Lambda関数の処理で何かエラーが発生したら、CloudWatch Logsなどに処理内容や状態を書き出すなどして、決まった文字列を書き出すよう実装しておくことを心がけましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/ba5d402b-873d-48f4-c1e7-4d1875d07378.png)



<h2>シンプルなLambda関数の作成</h2>

　それでは、以下のような「割り算をするLambda関数」をPythonで作っていくことにしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/0a53e9c1-d9cb-ddce-d9f9-823763bffcac.png)


<h2>Lambda関数の書式</h2>

　Lambda関数は「ハンドラ」とも呼ばれます。
関数名として「機能名_handler」と名称を付けることもあります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/eb8c99a2-c198-9a38-d5cb-d41888c9c0d9.png)


　実際に割り算の結果を返すLambda関数の中身をみていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/1fd6cdf5-3db8-480b-a58a-cfd1ca28aeee.png)

int関数を使って、関数に渡されるJSON形式の入力データ項目のxとyをそれぞれ文字列から整数に変換していきます。その値をprint関数を使って、標準出力へと書き出します。
（後で実際に動作確認をしますが、この出力は、CloudWatch Logsに、そのまま出力されます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/dcc7c1ec-7991-ca02-c248-62d1dcbac8c3.png)

　最後は、戻り値を設定します。
ここでは、json.dumpsメソッドを使って、除算の結果をJSON文字列に変換したものを返します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/7e666657-8a53-5094-15e7-64b0aadf1ce5.png)



<h2> Lambda関数の作成・登録</h2>

　まず、AWSマネジメントコンソールで「Lambda」を検索し、Lambdaコンソールを開いて、
 [ 関数の作成 ] を選択してください。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/b742b50b-2212-9e44-96d6-75b9ce41a89f.png)
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/f2dbc79c-d467-8169-3ae1-1ad3498ae2bc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/02801941-f123-46bd-f090-23065a0ea51e.png)



コードソースを以下のように書き換えて「Deploy」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/e57d7465-359c-49e2-e482-c9f0970d2b0f.png)


<h2> Lambda関数のテスト</h2>

　Lambdaコンソールにおいて、「テストイベント」というテスト用のイベントを定義することで、Lambda関数を手動で実行できます。

「テスト」タブを押下すると、テストイベントを定義する画面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/f44c5168-45fc-ac63-ec5a-b79d22cd1264.png)


操作手順：テストイベントを登録

[1]  新しいイベントを選択する
[2]  名前を入力する
[3]  Lambda関数に渡す引数を設定する
[4]  変更を保存する


ここでは、名前を「MyTestEvent」とし、イベントJSONの入力値を書き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/63139284-936b-c137-3928-a99a73204e65.png)


「テスト」ボタンを押下して、テストを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/60190328-51c8-46ab-b93b-27aec1a8eb45.png)

ログと書かれているリンクをクリックすると、該当のCloudWatch Logsが開かれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/dd975d31-5110-93a4-628e-07b6b0b0a9ac.png)


ログの行をクリックすると、[詳細] を表示できます。[詳細] には、CloudWatchのログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/52ae1f67-0d54-8de5-8554-435ef45cf80f.png)

ログが出力されていることを確認できると思います。

今回は正常終了となっていますが、エラーが発生した場合には、errorMessage, errorType, requestId, stackTraceの4つを含むJSONが返されます。

これで、Lamda関数のサンプルを実行してログの中身を確認することができました。
<hr>
今回の内容はいかがだったでしょうか。AWSサービスについて、実際に手を動かして動作確認できると面白いなと感じて頂けた方もいらっしゃるかもしれません。自分にできる範囲のものから少しずつAWSサービスの機能にも目を向けてみようかなと思っていただければ幸いです。

以上となります。


参考資料：
・大澤文孝「AWS Lambda実践ガイド 第2版」株式会社インプレス（2022年）