LoginSignup
5
14

More than 3 years have passed since last update.

【AWS】API Gateway + LambdaでAPIをつくる

Last updated at Posted at 2020-04-26

やりたいこと

サーバを使わずにAPIを作成したい。
EC2インスタンスからAPI Gatewayで作成したREST APIにリクエストを投げて返ってくるのを確認します。
Qiita logo

手順

Amazon API GatewayとLambdaを使用して、REST APIを作成してみます。

1. Lambda関数を作成する
2. API GatewayでREST APIを作成する
3. REST APIをデプロイする
4. 2番目のLambda関数を作成する
5. API GatewayでREST APIにリソース、メソッド、パラメータを追加する

参考:https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-getting-started-with-rest-apis.html

1. Lambda関数を作成する

API Gatewayを作成する際に、Lambda関数を指定する必要があるので、先にLambda関数を作成します。

Lambdaのコンソール画面から「関数」→「関数の作成」を選択します。
関数の作成画面で「一から作成」を選択します。

関数名: my-function
ランタイム: Python 3.7
を設定して「関数の作成」を押下します。
2.png

「関数 my-functionを正常に作成しました。」と出れば関数の作成は完了です。
3.png

ちなみに、作成した関数はデフォルトで「Hello from Lambda!」を返すようになっています。
4.png

2. API GatewayでREST APIを作成する

API Gatewayのコンソール画面から「APIの作成」を押下します。
今回は検証なので、「REST API プライベート」で「構築」を選択します。
5.png

ポップアップが出るのでOKを選択します。
6.png

下記画像のように設定していきます。
選択と入力が完了したら、「APIの作成」を押下します。
7.png

完了すると「/」のみが表示されます。
この「/」がルートレベルのリソースであり、APIのベースパスのURLに対応しています。
8.png

次にメソッドの追加を行います。
「アクション」→「メソッドの作成」を選択します。
9.png

「GET」を選択し、チェックマークを押下します。
10.png

すると、GETのセットアップ画面になるので、必要事項を入力して、「保存」します。
11.png

設定された内容が表示されます。
各項目の詳細については公式をご参照ください。
12.png

REST APIの作成はここで完了です。

3. REST APIをデプロイする

実際に使用するには、作成したREST APIをデプロイする必要があります。

作成したREST APIの「アクション」→「APIのデプロイ」を選択します。
13.png

ポップアップが出現するので、「新しいステージ」を選択し、
ステージ名を「dev」にして「デプロイ」を押下します。
14.png

すると、ステージエディターの画面が表示されURLの呼び出しのURLで実際にAPIにリクエストを送ることができます。
15.png

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
実行ロール:既存のロールを使用するで先ほど作成したロールを選択します。
16.png

作成が完了したら、関数コードを書き換えます。
17.png

受け取ったパラメータをレスポンスに乗せるようにします。

lambda_function.py
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でリソースの作成をしていきます。

「アクション」→「リソースの作成」
18.png

リソース名:my-resource
→「リソースの作成」
19.png

次にメソッドの作成をしていきます。
my-resourceを選択した状態で、「アクション」→「メソッドの作成」
20.png

「GET」を選択してチェックボタンで決定する。
21.png

my-resource GETのセットアップ画面になるので、Lambda関数に先ほど作成した「my-function2」を選択して保存する。
22.png

権限追加のポップアップが出るので、「OK」
23.png

メソッドの実行画面で「統合リクエスト」を選択します。
24.png

下の方に「マッピングテンプレート」の設定があるので、
リクエスト本文のパススルー:テンプレートが定義されていない場合(推奨)
Content-Type:application/json
を指定します。
25.png

テンプレートを入力して保存します。
26.png

テンプレート
{
    "myParam": "$input.params('myParam')"
}

これで、リクエストパラメータの"myParam"という項目をLambda関数側でevent['myParam']で取得できるようになります。

lambda_function.py
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の全体像はつかめたかと思います。

5
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
14