#author("2020-10-01T04:19:03+00:00","","") #topicpath ---- #contents **API GatewayからAWS Lambdaを呼び出す。 [#i2d0e487] 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関数の作成 [#ue909962] *** まずはパラメタを受け取るLambda関数を定義 [#xaa8c941] Lambdaサービスのトップにアクセスし、関数の作成 >> 一から作成を選択します #ref(01.png) 関数名を helloworld に、ロールは新しく作成(lambdaRole)し、関数の作成をクリック #ref(02.png) helloworldという関数が作成され、関数を記述する画面が表示されます。今回はPythonを選択しました。 #ref(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'] } さて右上の「テスト」ボタンをクリックしてみると「テストイベントの設定」という、関数を呼び出した際にパラメタに渡ってくるオブジェクトを指定できる画面が表示されます。 #ref(04.png) 図のように、JSONオブジェクトを指定したりできますが、ここでは"param1":"value1" というテストデータを指定しました。これは関数中の event['param1'] に渡ってくるようになっています。 *** テスト [#lad1f2b3] つぎにこの画面下の「作成」をクリックすると、元の画面に戻ってきます。先のテストイベントが選択された状態になっているので、再度「テスト」をクリックすることで、関数が実行されます。 #ref(06.png) 関数の戻り値は return { "my_param1": event['param1'] } と書きましたが、実行結果は return { "my_param1": "value1" } となっていて、テストイベントの { "key3": "value3", "key2": "value2", "param1": "value1" ←ココ } この値が event['param1'] とやってアクセス出来ることが確認できました。 ** API Gatewayの作成 [#yb7a6a71] *** つぎにAPI Gatewayを定義 [#m44b7b2d] つぎにAPI Gatewayを定義して、定義したLambda関数を呼び出してみます。 API Gatewayのトップにアクセスし「APIの作成」をクリックすると、下記の画面が表示されます。API名に適当な名前をつけて、右下の「APIの作成」をクリックします。 #ref(02_01.png) 下記のように アクション >> メソッドの作成 をクリックします。 #ref(02_02.png) 唐突に空のプルダウンが表示されるので、開いてメソッドのGETを選択します。HTTP GETに対する処理を定義する画面になりますので、統合タイプは「Lambda関数」、また関数名は、先ほどLambdaで定義した関数「helloworld」を指定します。 #ref(02_03.png) ここまででAPI GatewayとLambdaが紐付いた事になります。 *** API Gateway のクエリパラメタの定義 [#o9b75228] つぎにAPI に クエリパラメタを定義します。ゴールは、 https://xxxx.execute-api.ap-northeast-1.amazonaws.com/dev?q_param=value1 とリクエストすると、Lambdaに { "param1": "value1" } と渡されることなので、 API に q_param というクエリパラメータを定義したいと思います。 下記画面の「メソッドリクエスト」をクリックします。 #ref(02_04.png) 下記のような画面が出てきました。「URLクエリ文字列パラメータ」に「q_param」と指定して右のチェックボタンを押します。以上でクエリパラメタとしてq_paramを定義することができました。 #ref(02_05.png) *** クエリパラメタと、Lambda関数の引数のマッピング [#nb5c7453] つづいて、クエリパラメタと Lambda関数の引数をマッピングします。 メソッドの実行画面で「統合リクエスト」を選択します。下記の「本文マッピングテンプレート」で「マッピングテンプレートの追加」をクリックします。 #ref(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関数の引数と紐付いたことになります。 #ref(02_08.png) ***テスト [#ua771ddb] さて、作成したAPIのテストを実施します。下記のメソッドの実行画面から「テスト」をクリックします。 #ref(02_09.png) 定義済みのクエリパラメタ q_param などの値を指定しつつ、テスト を押下してAPIを呼び出してみましょう。 #ref(02_10.png) 下記のように実行結果が得られれば、テスト完了です。 #ref(02_11.png) *** デプロイ [#d8ff7170] つぎにデプロイ(リリース)を行います。アクション >> APIのデプロイを選択します。 #ref(02_12.png) デプロイするステージを選択します。初めは定義されていないので「新しいステージ」を選ぶとステージを作成できます。「dev」という名前でステージを作成しました。最後にデプロイを押下します。 #ref(02_13.png) デプロイが完了し、さらにステージのパラメタを変更できる画面になります。デプロイ完了です。 #ref(02_14.png) *** APIのURL確認 [#i06ceb58] 先ほどデプロイしたGETメソッドのURLは、下記のようにステージ >> dev >> GET で確認できます。画像が小さいですが、 https://q0xt61j9f1.execute-api.ap-northeast-1.amazonaws.com/dev/ と書いてあります。API名(APIのID?) がprefix についたURLになるっぽいですね。 #ref(02_15.png) ***実際に HTTP でアクセスしてみる。 [#kea548b3] 最後に、デプロイされたAPIに、実際に HTTP(s) でアクセスしてみます。 curl https://q0xt61j9f1.execute-api.ap-northeast-1.amazonaws.com/dev/ -d 'q_param=value1' -G { "my_param1": "value1" } が得られました。OKっぽいですね。ちなみにcurlのオプションについては [[こちら>curl]] をご参照ください。 お疲れ様でした。 **関連リンク [#g1205b30] -[[IDE なしで Maven を使用した .jar デプロイパッケージの作成 (Java) - AWS Lambda>https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-create-jar-pkg-maven-no-ide.html]] ---- この記事は #vote(おもしろかった[8],そうでもない[0]) #comment #topicpath SIZE(10){現在のアクセス:&counter;}