AWSのLambda関数の作成とAPI Gateway経由でコールを行うまでの作業手順のメモです。
■Lambda関数の作成
AWSのコンソールにログインして、Lambdaのダッシュボードへ行きます。
「関数の作成」→「一から作成」で、
・関数名:今回はsamplePythonFuncという名前にします。
・ランタイム:今回はPython3.6
・ロール:既存のロールを選択(lambda_basic_execution)
というのに設定します。
関数を作成するとコードには常にjsonを返すだけの関数がデフォルト状態で入っていますので、今回はそのまま使用してみます。
1 2 3 4 5 6 7 8 |
import json def lambda_handler(event, context): # TODO implement return { "statusCode": 200, "body": json.dumps('Hello from Lambda!') } |
この状態で、右上の「テスト」ボタンを押すとテストのパラメーターを決める画面が出ますのでそのままテストイベントの名前だけ決めて完了。
戻ったら「テスト」ボタンの横に先ほど設定したイベント名が出ているので、選択されている状態で「テスト」実行。
すると、
実行結果:成功(ログ)
というのが表示されるので、「詳細」を開いてみると、
関数で返すようになっているstatusCodeとbodyを含むJSONが返って来ているのが確認できます。
1 2 3 4 |
{ "statusCode": 200, "body": "\"Hello from Lambda!\"" } |
その他、所要時間、課金期間、使用中メモリなどが表示されます。
■API Gatewayの設定
次にAPI Gatewayの設定を行います。
Amazon API Gatewayのコンソールに行き「今すぐ始める」で開始。
(1)APIの作成
「新しいAPIの作成」画面で、
●新しい API ●Swagger からインポート ●API の例
が並んでいるので、「新しいAPI」を選択。
今回は API名: helloWorldAPI で。
「APIの作成」で、詳細を決める画面に行きます。
「アクション」プルダウンの中を見ると、一番上に「メソッドの作成」というのがあるのでそこからやって行きます。
GETを選択してチェックマークを押すと、右側に設定項目が出てくるので、先ほど作成したlambda関数「samplePythonFunc」を設定します。
「保存」すると「Lambda 関数に権限を追加する」というダイアログが出るのでOKで続行。
クライアントからのリクエスト〜lambda関数〜レスポンスまでのルートが表示される画面になり、クライアントの部分に「テスト」ボタンがありますので試してみます。
すると、作成したlambda関数が返すように設定したJSONがレスポンス本文に出力されているのが確認できます。
(2)APIのデプロイ
次にAPIをデプロイします。
「アクション」プルダウンから「APIのデプロイ」を選択。
ステージ名:beta
で今回はデプロイします。
ステージエディターというの画面に遷移し、
そこには呼び出し口となるURLが表示されています。
1 |
URL の呼び出し: https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/beta |
試しにこの呼び出し用URLをブラウザに入れてみます。
今回はリソースが ”/”のみなのでそのままでOKです。
すると、また同様のJSONが返って来ているのが確認できます。
(3)APIキーの設定
次にAPIへのアクセスに制限をかけるAPIキーを設定しておきます。
今回は「helloAPIKey」という名前にします。
作成すると、
API キーが生成され、「表示」というリンクが出ますので押すと、APIキーの文字列が表示されます。
「APIステージの関連付け」という設定項目も出るので、先程のhellowWorldAPIとbetaステージを選択して「追加」。
ここで、APIのメソッドに戻り(今回は “/” の “GET”しか作成していないのでそれを選択)
「メソッドリクエスト」を押すと出てくる設定画面の「APIキーの必要性」をtrueに変更します。
APIキーの必要性設定を変更したら再度デプロイします。
この状態でブラウザからAPIにアクセスすると
1 |
{"message":"Forbidden"} |
となり、API必要設定が有効になっているのが確認できます。
次に、APIキーとステージを紐付ける設定を行います。
「使用量プラン」メニューから「作成」を押して、名前を決めます(今回はsamplePlan)
今回はAPI使用量制限の項目(「スロットリング」「クォータ」)はとりあえずチェックを外しておきます。
次の画面で「APIステージの追加」を行います。
helloWorldAPIとbetaステージを選択します。
次に、「APキーを使用量プランに追加」して、先程生成したhelloAPIKeyを設定します。
これでAPIにAPIキーが設定されましたので、ターミナルからcurlしてみます。
1 2 |
$ curl -H 'x-api-key:<APIキー>' https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/beta {"statusCode": 200, "body": "\"Hello from Lambda!\""} |
期待通りのJSONが返って来ています。
APIキーを付けないで実行すると、
1 2 |
$curl https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/beta {"message":"Forbidden"} |
となる事が確認できます。
(4)POSTメソッドもお試し
POSTメソッドも試しておきます。
lambda関数のreturnに、受け取ったeventをそのまま入れて返してみます。
1 2 3 4 5 |
return { "statusCode": 200, "body": json.dumps('Hello from Lambda!'), "evvent":event } |
lambda関数を保存したら
API Gatewayコンソールの「アクション」からPOSTメソッドを追加します。
ついでなのでリソースに /sample を追加してそこにPOSTメソッドを追加します。
メソッドのテストのヘッダーに
APIキーの設定: x-api-key:<APIキー>
リクエスト本文に
{“sample”:999}
でテスト実行すると、
レスポンス本文のeventにリクエストがそのまま入って返って来ているのが確認できます。
1 2 3 4 5 6 7 |
{ "statusCode": 200, "body": "\"Hello from Lambda!\"", "evvent": { "sample": 999 } } |
curlで確認してみます。
1 2 |
$ curl -d '{"sample":999}' -H 'x-api-key:<APIキー>' https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/beta/sample/ {"message":"Missing Authentication Token"} |
が返って来てしまいました。
デプロイし直すのを忘れていましたので、再デプロイしてから再試行。
1 |
{"statusCode": 200, "body": "\"Hello from Lambda!\"", "evvent": {"sample": 999}} |
期待通りの値が返って来る事を確認して今回は完了です。