Top / AWS / Amazon API Gateway

API GatewayからAWS Lambdaを呼び出す。

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関数の作成

まずはパラメタを受け取るLambda関数を定義

Lambdaサービスのトップにアクセスし、関数の作成 >> 一から作成を選択します

01.png

関数名を helloworld に、ロールは新しく作成(lambdaRole)し、関数の作成をクリック

02.png

helloworldという関数が作成され、関数を記述する画面が表示されます。今回はPythonを選択しました。

03.png

真ん中あたりの「ハンドラ」というテキストボックスに、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']
    }

さて右上の「テスト」ボタンをクリックしてみると「テストイベントの設定」という、関数を呼び出した際にパラメタに渡ってくるオブジェクトを指定できる画面が表示されます。

04.png

図のように、JSONオブジェクトを指定したりできますが、ここでは"param1":"value1" というテストデータを指定しました。これは関数中の event['param1'] に渡ってくるようになっています。

テスト

つぎにこの画面下の「作成」をクリックすると、元の画面に戻ってきます。先のテストイベントが選択された状態になっているので、再度「テスト」をクリックすることで、関数が実行されます。

06.png

関数の戻り値は

return {
 "my_param1": event['param1']
}

と書きましたが、実行結果は

return {
 "my_param1": "value1"
}

となっていて、テストイベントの

{
  "key3": "value3",
  "key2": "value2",
  "param1": "value1"   ←ココ
}

この値が event['param1'] とやってアクセス出来ることが確認できました。

API Gatewayの作成

つぎにAPI Gatewayを定義

つぎにAPI Gatewayを定義して、定義したLambda関数を呼び出してみます。

API Gatewayのトップにアクセスし「APIの作成」をクリックすると、下記の画面が表示されます。API名に適当な名前をつけて、右下の「APIの作成」をクリックします。

02_01.png

下記のように アクション >> メソッドの作成 をクリックします。

02_02.png

唐突に空のプルダウンが表示されるので、開いてメソッドのGETを選択します。HTTP GETに対する処理を定義する画面になりますので、統合タイプは「Lambda関数」、また関数名は、先ほどLambdaで定義した関数「helloworld」を指定します。

02_03.png

ここまででAPI GatewayとLambdaが紐付いた事になります。

API Gateway のクエリパラメタの定義

つぎにAPI に クエリパラメタを定義します。ゴールは、

https://xxxx.execute-api.ap-northeast-1.amazonaws.com/dev?q_param=value1

とリクエストすると、Lambdaに

{
  "param1": "value1"
}

と渡されることなので、 API に q_param というクエリパラメータを定義したいと思います。

下記画面の「メソッドリクエスト」をクリックします。

02_04.png

下記のような画面が出てきました。「URLクエリ文字列パラメータ」に「q_param」と指定して右のチェックボタンを押します。以上でクエリパラメタとしてq_paramを定義することができました。

02_05.png

クエリパラメタと、Lambda関数の引数のマッピング

つづいて、クエリパラメタと Lambda関数の引数をマッピングします。

メソッドの実行画面で「統合リクエスト」を選択します。下記の「本文マッピングテンプレート」で「マッピングテンプレートの追加」をクリックします。

02_07.png

Content-Type は application/json を選択。下記の「テンプレートの生成」の入力ボックスが表示されるので

{
 "param1" : "$input.params('q_param')" ,
 ...
 "paramN" : "$input.params('q_paramN')"
 }

などと入力します。これで Lambda 内で event['param1'] でアクセスできる箇所に "$input.params('q_param')" が渡されたことになり、以上で API GatewayのクエリパラメタがLambda関数の引数と紐付いたことになります。

02_08.png

テスト

さて、作成したAPIのテストを実施します。下記のメソッドの実行画面から「テスト」をクリックします。

02_09.png

定義済みのクエリパラメタ q_param などの値を指定しつつ、テスト を押下してAPIを呼び出してみましょう。

02_10.png

下記のように実行結果が得られれば、テスト完了です。

02_11.png

デプロイ

つぎにデプロイ(リリース)を行います。アクション >> APIのデプロイを選択します。

02_12.png

デプロイするステージを選択します。初めは定義されていないので「新しいステージ」を選ぶとステージを作成できます。「dev」という名前でステージを作成しました。最後にデプロイを押下します。

02_13.png

デプロイが完了し、さらにステージのパラメタを変更できる画面になります。デプロイ完了です。

02_14.png

APIのURL確認

先ほどデプロイしたGETメソッドのURLは、下記のようにステージ >> dev >> GET で確認できます。画像が小さいですが、

https://q0xt61j9f1.execute-api.ap-northeast-1.amazonaws.com/dev/

と書いてあります。API名(APIのID?) がprefix についたURLになるっぽいですね。

02_15.png

実際に HTTP でアクセスしてみる。

最後に、デプロイされたAPIに、実際に HTTP(s) でアクセスしてみます。

curl https://q0xt61j9f1.execute-api.ap-northeast-1.amazonaws.com/dev/ -d 'q_param=value1' -G
{
  "my_param1": "value1"
}

が得られました。OKっぽいですね。ちなみにcurlのオプションについては こちら をご参照ください。

お疲れ様でした。

関連リンク


この記事は

選択肢 投票
おもしろかった 13  
そうでもない 0  
  • aaa -- 2021-10-25 (月) 09:45:56

Top / AWS / Amazon API Gateway

現在のアクセス:6060


添付ファイル: file02_15.png 832件 [詳細] file02_14.png 813件 [詳細] file02_13.png 775件 [詳細] file02_12.png 708件 [詳細] file02_11.png 842件 [詳細] file02_10.png 861件 [詳細] file02_09.png 783件 [詳細] file02_08.png 788件 [詳細] file02_05.png 754件 [詳細] file02_04.png 815件 [詳細] file02_03.png 829件 [詳細] file02_01.png 821件 [詳細] file02_07.png 825件 [詳細] file02_06.png 490件 [詳細] file02_02.png 839件 [詳細] file06.png 770件 [詳細] file04.png 825件 [詳細] file03.png 810件 [詳細] file02.png 848件 [詳細] file01.png 763件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-11-08 (水) 09:42:56 (396d)