AWS Lambdaで1からAPIを実装する

Cloud Functionsと比較すると次のような点において使い勝手は非常に良いと感じました。

  • いちいちデプロイせずともコード変更を反映させられる
  • コンソールから関数テストができる

AWS Lambdaの構成

ということで簡単に解説していきます。
Lambdaは次の二つの構成要素に大別できます

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

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

Layer

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

Layerの作成

前述の通り依存関係に関する情報を格納したものです。zip形式でアップロードすることで作成できます。

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単体で活用する場面はかなり限られます。パラメーターを取得することはできません。そのため。Lambda関数でパラメーターを受け取ることができるようになり、APIとして利用することができるようになります。具体的な手順については割愛しますが、LambdaコンソールからAPI Gatewayを作成でき、作成が完了するとこのように連結されていることが確認することができます。またAPI Gatewayを作成する際のタイプは基本的にRESTを選んでおくと良いでしょう。

Lambda proxy integrationで簡単に連携

以前はJSONマッピングの設定を記述する必要があったそうですが、下画像のように「Lambdaプロキシ統合」にチェックマークを入れるだけで簡単に連携させることが可能になりました。

クエリの取得方法

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の非同期呼び出し

追記予定

最後までご覧いただきありがとうございました

こっちは真面目に作ってます。笑

サクっとプログラミング

iOSアプリ開発のあれこれがまとまるwebサイト