AWS

AWSLambda関数の解説とAPI化の手順

Lambda関数独自の概念があるので、そこを中心に解説しています。

AWSLamdaについて

AWSで提供されているサービス群の中の一つで関数をデプロイ・することができるサービスです。いわゆるFaaS(Function as a Service)と呼ばれ、サーバーレスということでコードそのもののメンテナンス以外は基本的にすることはありません。そのため良いためいろいろと汎用性が高いです。

またCloud Functionsと比較して、以下の点で使い勝手が良いと感じました。なんというか痒い所に手が届く感。詳細は後述します。

  • いちいちデプロイせずともコード変更を反映させられる
  • テストができる
  • 依存関係をLayerとして保存&使い回しが可能(後述)
解説

AWS Lambdaの構成

Lambdaは次の二つの構成要素に大別できます

  • Layer - 依存関係
  • Lambda Function - スクリプト

この二つを簡単に解説します。

Layer

聞き馴染みがありませんが、Layerは単純に依存関係に関する情報が格納されたものです。例えばnodejsの場合であれば具体的にはpackage.jsonnode_modulesです。 GoogleCloudFunctionsにはない概念だったので若干戸惑いましたが、依存関係に関する情報をレイヤーとして保存しておけば、ほかのLambda関数でも使い回すことができ非常に便利です。

Layerの作成

前述の通りLayerは依存関係に関する情報を格納したものですので、以下のようにpackage.jsonnode_modulesが格納されたディレクトリをzip形式で圧縮し、AWSコンソールでアップロードすることで作成できます。

mkdir nodejs  #ディレクトリ名は必ず「nodejs」と命名する
cd nodejs
npm init
vim package.json  #必要なライブラリを記述
npm install --save
cd ../
zip nodejs sample-layer.zip

Layer作成用のコンソール画面からsample-layer.zipをアップロードします。

注意点としてzip化するディレクトリ名は必ずnodejsとする必要があります。気をつけましょう

Lambda Function

続いてLambda Functionはそのまんまで、Lambdaで実行する関数です。呼び出される関数はhandlerと呼ばれます。若干仕様にクセがあります。

Lambda関数の仕様

  1. Lambda Function単体ではリクエストのクエリパラメーターを受け取ることはでき Lambda Functionにクエリパラメーターを渡すにはAPI Gatewayと合わせて使う必要があります。
  2. 引数は、event,callback,contextの3つです
  3. response

API Gatewayとの連携でLambda関数をAPI化する

AWS Lambda単体では例えばパラメーターを取得することができないなどの制約があり、利用する場面はかなり限られます。そこでリクエストを受け取る窓口としての役割を担うAPI Gatewayと連携させることで、Lambda関数でパラメーターを受け取ることができるようになります。

具体的な手順については割愛しますが、LambdaコンソールからAPI Gatewayを作成でき、作成が完了するとこのように連結されていることが確認することができます。またAPI Gatewayを作成する際のタイプは基本的にRESTを選んでおくと良いでしょう。

Layer

ポイント1. Lambda proxy integrationでJSONマッピングを自動で行う

関数に渡すクエリ名さえ一致していれば、下画像のように「Lambdaプロキシ統合」にチェックマークを入れるだけで自動でマッピングが可能になりました。

Lambda Proxy

余談ですが以前はJSONマッピングの設定も記述する必要があったそうです。こういうところに日進月歩を感じますね・・・!

ポイント2. handler内でのクエリの取得方法

API Gatewayとの連携ができていれば以下のようにリクエストを受け取ることができます。

exports.handler = async (event, context, callback) => {
		let body = JSON.parse(event.body)  //リクエストボディ
		let urlQuery =  event.queryStringParameters  //urlクエリ
		let headers = event.headers  //リクエストヘッダ
}

もう少し詳しく知りたいという方には以下のチュートリアルが参考になるでしょう

チュートリアル: Lambda プロキシ統合を使用して Hello World REST API をビルドする

その他Tips

・ローカルデバッグ

VSCodeのExtensionで可能

AWS Toolkit for Visual Studio Code

・Lambdaの非同期呼び出し

Node.js の AWS Lambda 関数ハンドラー

公式ドキュメント: 非同期呼び出し

追記予定

読んでいただきありがとうございます!!

記事として取り上げたトピックを体系化してまとめた内容を電子書籍として販売しています。購入していただくことで執筆の応援ができます。詳細はこちらから