AWS Lambdaは、サーバレスでロジックを記述できる関数型のフレームワークです。EC2などでサーバを立てて常駐させてたようなサービスを、関数として登録するだけで構築する事ができる仕組みです。
また API Gateway は、AWSのサービスをRESTで呼び出す事ができるフレームワークです。これらを用いて、API GatewayからLambdaを呼び出すことで、サーバレスなREST/API環境が構築できそうです。
具体的には
https://xxxx.execute-api.ap-northeast-1.amazonaws.com/dev?q_param=value1
などとクエリパラメタ付きのリクエストを送ると、
{ "my_param1": "value1" }
なんてJSONを echoするAPIを構築してみます。
Lambdaサービスのトップにアクセスし、関数の作成 >> 一から作成を選択します
関数名を helloworld に、ロールは新しく作成(lambdaRole)し、関数の作成をクリック
helloworldという関数が作成され、関数を記述する画面が表示されます。今回はPythonを選択しました。
真ん中あたりの「ハンドラ」というテキストボックスに、lambda_function.lambda_handler とありますが、これはソースコードの lambda_function.pyのlambda_handlerメソッドを呼び出すことを意味しています。で、具体的なコードは 単純なオブジェクトを一つ、
return { "my_param1": event['param1'] }
と返すように記述しました。コード全体は以下の通り:
def lambda_handler(event, context): # TODO implement #return 'Hello from Lambda' return { "my_param1": event['param1'] }
さて右上の「テスト」ボタンをクリックしてみると「テストイベントの設定」という、関数を呼び出した際にパラメタに渡ってくるオブジェクトを指定できる画面が表示されます。
図のように、JSONオブジェクトを指定したりできますが、ここでは"param1":"value1" というテストデータを指定しました。これは関数中の event['param1'] に渡ってくるようになっています。
つぎにこの画面下の「作成」をクリックすると、元の画面に戻ってきます。先のテストイベントが選択された状態になっているので、再度「テスト」をクリックすることで、関数が実行されます。
関数の戻り値は
return { "my_param1": event['param1'] }
と書きましたが、実行結果は
return { "my_param1": "value1" }
となっていて、テストイベントの
{ "key3": "value3", "key2": "value2", "param1": "value1" ←ココ }
この値が event['param1'] とやってアクセス出来ることが確認できました。
つぎにAPI Gatewayを定義して、定義したLambda関数を呼び出してみます。
API Gatewayのトップにアクセスし「APIの作成」をクリックすると、下記の画面が表示されます。API名に適当な名前をつけて、右下の「APIの作成」をクリックします。
下記のように アクション >> メソッドの作成 をクリックします。
唐突に空のプルダウンが表示されるので、開いてメソッドのGETを選択します。HTTP GETに対する処理を定義する画面になりますので、統合タイプは「Lambda関数」、また関数名は、先ほどLambdaで定義した関数「helloworld」を指定します。
ここまででAPI GatewayとLambdaが紐付いた事になります。
つぎにAPI に クエリパラメタを定義します。ゴールは、
https://xxxx.execute-api.ap-northeast-1.amazonaws.com/dev?q_param=value1
とリクエストすると、Lambdaに
{ "param1": "value1" }
と渡されることなので、 API に q_param というクエリパラメータを定義したいと思います。
下記画面の「メソッドリクエスト」をクリックします。
下記のような画面が出てきました。「URLクエリ文字列パラメータ」に「q_param」と指定して右のチェックボタンを押します。以上でクエリパラメタとしてq_paramを定義することができました。
つづいて、クエリパラメタと Lambda関数の引数をマッピングします。
メソッドの実行、画面で「統合リクエスト」を選択します。下記の「本文マッピングテンプレート」で「マッピングテンプレートの追加」をクリックします。
Content-Typeを application/json を選択。下記の「テンプレートの生成」の入力ボックスが表示されるので
{ "param1" : "$input.params('q_param')" , ... "paramN" : "$input.params('q_paramN')" }
と入力します。 Lambda 内で event['param1'] でアクセスする箇所に、"$input.params('q_param')" が渡されたことになり、ようするにAPI Gatewayのクエリパラメタが紐付いたことになりました。
さて、作成したAPIのテストを実施しましょう。下記のメソッドの実行画面から「テスト」をクリックします。
定義済みのクエリパラメタ q_param などの値を指定しつつ、テスト を押下してAPIを呼び出してみましょう。
下記の通り、実行結果が得られれば、テスト完了です。
つぎにデプロイ(リリース)を行います。アクション >> APIのデプロイを選択します。
デプロイするステージを選択します。初めは定義されていないので「新しいステージ」を選ぶとステージを作成できます。「dev」という名前でステージを作成しました。最後にデプロイを押下します。
デプロイが完了し、さらにステージのパラメタを変更できる画面になります。デプロイ完了です。
先ほどデプロイしたGETメソッドのURLは、下記のようにステージ >> dev >> GET で確認できます。画像が小さいですが、
https://q0xt61j9f1.execute-api.ap-northeast-1.amazonaws.com/dev/
と書いてあります。API名(APIのID?) がprefix についたURLになるっぽいですね。
最後に、デプロイされたAPIに、実際に HTTP(s) でアクセスしてみます。
curl https://q0xt61j9f1.execute-api.ap-northeast-1.amazonaws.com/dev/ -d 'q_param=value1' -G { "my_param1": "value1" }
が得られました。OKっぽいですね。ちなみにcurlのオプションについては こちら をご参照ください。
お疲れ様でした。
この記事は
現在のアクセス:6271