やりたいこと
サーバを使わずにAPIを作成したい。
EC2インスタンスからAPI Gatewayで作成したREST APIにリクエストを投げて返ってくるのを確認します。
手順
Amazon API GatewayとLambdaを使用して、REST APIを作成してみます。
1. Lambda関数を作成する
2. API GatewayでREST APIを作成する
3. REST APIをデプロイする
4. 2番目のLambda関数を作成する
5. API GatewayでREST APIにリソース、メソッド、パラメータを追加する
1. Lambda関数を作成する
API Gatewayを作成する際に、Lambda関数を指定する必要があるので、先にLambda関数を作成します。
Lambdaのコンソール画面から「関数」→「関数の作成」を選択します。
関数の作成画面で「一から作成」を選択します。
関数名: my-function
ランタイム: Python 3.7
を設定して「関数の作成」を押下します。
「関数 my-functionを正常に作成しました。」と出れば関数の作成は完了です。
ちなみに、作成した関数はデフォルトで「Hello from Lambda!」を返すようになっています。
2. API GatewayでREST APIを作成する
API Gatewayのコンソール画面から「APIの作成」を押下します。
今回は検証なので、「REST API プライベート」で「構築」を選択します。
下記画像のように設定していきます。
選択と入力が完了したら、「APIの作成」を押下します。
完了すると「/」のみが表示されます。
この「/」がルートレベルのリソースであり、APIのベースパスのURLに対応しています。
次にメソッドの追加を行います。
「アクション」→「メソッドの作成」を選択します。
すると、GETのセットアップ画面になるので、必要事項を入力して、「保存」します。
設定された内容が表示されます。
各項目の詳細については公式をご参照ください。
REST APIの作成はここで完了です。
3. REST APIをデプロイする
実際に使用するには、作成したREST APIをデプロイする必要があります。
作成したREST APIの「アクション」→「APIのデプロイ」を選択します。
ポップアップが出現するので、「新しいステージ」を選択し、
ステージ名を「dev」にして「デプロイ」を押下します。
すると、ステージエディターの画面が表示されURLの呼び出しのURLで実際にAPIにリクエストを送ることができます。
EC2インスタンスから実際にリクエストを投げてみましょう。
$ curl -X GET '呼び出しのURL'
"Hello from Lambda!"
設定しているLambdaが返却する「Hello from Lambda!」がレスポンスされればOKです。
4. 2番目のLambda関数を作成する
次に、GETリクエストでパラメータを持つパターンも行っていきます。
先ほどのAPIではLambdaが固定値で'Hello from Lambda!'を返却するようになっていました。
なので、今回は受け取ったGETリクエストのパラメータをレスポンスに乗せるようなLambdaでAPIを作成していきます。
先ほどと同じ要領でLambda関数を作成していきます。
関数名:my-function2
ランタイム:Python 3.7
実行ロール:既存のロールを使用するで先ほど作成したロールを選択します。
受け取ったパラメータをレスポンスに乗せるようにします。
import json
def lambda_handler(event, context):
myParam = event['myParam']
return {
'statusCode': 200,
'body': json.dumps(myParam)
}
Lambdaの設定は完了です。
5. API GatewayでREST APIにリソース、メソッド、パラメータを追加する
API Gatewayでリソースの作成をしていきます。
次にメソッドの作成をしていきます。
my-resourceを選択した状態で、「アクション」→「メソッドの作成」
my-resource GETのセットアップ画面になるので、Lambda関数に先ほど作成した「my-function2」を選択して保存する。
下の方に「マッピングテンプレート」の設定があるので、
リクエスト本文のパススルー:テンプレートが定義されていない場合(推奨)
Content-Type:application/json
を指定します。
{
"myParam": "$input.params('myParam')"
}
これで、リクエストパラメータの"myParam"という項目をLambda関数側でevent['myParam']で取得できるようになります。
import json
def lambda_handler(event, context):
myParam = event['myParam'] #←ここ
return {
'statusCode': 200,
'body': json.dumps(myParam)
}
これでAPI側の設定は完了になりますので、先ほどと同様にデプロイして実行してみます。
確認してみる
パラメータに「my-resource?myParam=Hello%20from%20API%20Gateway!」を付与してリクエストしてみます。
$ curl -X GET 'https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/my-resource?myParam=Hello%20from%20API%20Gateway!'
{"statusCode": 200, "body": "\"Hello from API Gateway!\""}
リクエストパラメータに付与した「Hello from API Gateway!」がbodyとしてレスポンスすることを確認できました。
今回は必要最低限の設定で実施したので、導入する際はもっと調査が必要になりそうですが、サーバレスとしてのAPI Gateway + Lambdaの全体像はつかめたかと思います。