初めてのAPI Gateway

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

菅野です。 今回はAPI GatewayとLambdaの連携に初挑戦です。
今まで一度も試してなかったのですが、同じような方は是非このエントリーの内容をお試しください。
「今さら聞けないAPI Gateway」スタートです。

API Gatewayを作成する

「APIの作成」ボタンをクリックしてAPI Gatewayを作成を開始します。
スクリーンショット 2016-05-27 15.07.51

名前に「ExecLambda」と入力して「APIの作成」ボタンをクリックだけで完成。簡単ですね。
スクリーンショット 2016-05-27 15.05.45

Lambda関数用のRoleを作成する

以下の条件で作成します。

  • ロール名:「ExecLambda」
  • ロールタイプの選択:「AWS Lambda」
  • カスタムポリシー:以下の内容
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
}

Lambda関数を作成する

以下の条件でLambda関数を作成します。
今回は簡単な関数しか書かないので、ついでにPythonも初挑戦します。

  • Name:「LambdaTest」
  • Runtime:「Python 2.7」
  • Role:「ExecLambda」
  • Lambda function code:以下の内容。クエリ文字列パラメーターとして「?myname=***」で渡すと「yourname」として返される仕様にします。
def lambda_handler(event, context): 
    return {
        "yourname": event['myname']
    }

API GatewayとLambdaを連携させる

設定はLambda側から行います。
スクリーンショット 2016-05-27 16.28.17
「API endpoints」タブの中の「Add API endpoint」をクリックすると以下のようなポップアップが表示されます。
スクリーンショット 2016-05-27 16.30.50
API Gatewayを選択すると、次は以下のようなポップアップが表示されます。 スクリーンショット 2016-05-27 16.49.52

  • 「API Name」には先ほど作成した「API Gateway」の名前を選択します。
  • 「Resource name」は、URLのドメイン以降を指定します。今回はデフォルトで「/LambdaTest」が入力されているのでそれを使います。
  • 「Method」はブラウザで簡単にテストできるように「GET」のままにします。
  • 「Security」は「Open」にしておきます。

これらを入力したら「submit」ボタンをクリックしてください。
以下のように「API endpoint」の一覧に追加されているはずです。
スクリーンショット 2016-05-27 17.50.54
(「API endpoint URL」に表示されたURLはメモしておいてください。後ほどブラウザからテストする時に使います)

このまま、API Gatewayのページへ移動してみましょう。
API名をクリックして中の設定を見ると、先ほど入力した「/LambdaTest」や「GET」が見えると思いますので「GET」をクリックしてください。
先ほど「API endpoints」で入力した内容でAPI Gatewayに設定された事がわかります。
スクリーンショット 2016-05-27 18.00.27

GETのクエリ文字列パラメーターをAPI Gatewayに処理させる

今回ブラウザからアクセスする時に付加するクエリ文字列パラメーター「?myname=***」を、解析する為のコードは書かずにAPI Gatewayにおまかせすることにしましょう。
先ほどAPI Gatewayのページで「GET」をクリックした時に表示された中に、「統合リクエスト」というのがありますのでクリックしましょう。
スクリーンショット 2016-05-29 22.43.58

表示された内容の中に「本文マッピングテンプレート」というものがあります。ここでクエリ文字列パラメーターをLambda関数のeventの要素の一つとしてマッピングする設定を行います。
スクリーンショット 2016-05-29 22.51.55

  • 「リクエスト本文のパススルー」は「テンプレートが定義されていない場合 (推奨)」を選択する
  • 「マッピングテンプレートの追加」をクリックする
  • 「Content-Type」に「application/json」と入力する
  • 入力欄の右にあるチェックマークをクリックする
  • テンプレートの内容は以下(クエリ文字列パラメーターのmynameをLambda関数のeventの要素にマッピングする)
{
    "myname" : "$input.params('myname')"
}

最後に「保存」ボタンをクリックして完了です。

実行してみる

ここまできたら後少しです。 まずは、API Gatewayのマッピングを変更したのでデプロイします。
スクリーンショット 2016-05-29 23.09.42

  • 左上にある「アクション」ボタンをクリックする
  • 「API のデプロイ」をクリックする
  • 「デプロイされるステージ」で「prod」を選択する
  • 「デプロイ」をクリックする

それではブラウザに、先ほどLambdaでAPI endpointを追加した時にコピーしたURLを貼り付け、「?myname=masataka」を付加してアクセスしてみましょう。
{"yourname": "masataka"}
と表示されれば完成です!

さいごに

いかがでしたでしょうか。
API Gatewayの作成は名前を決めるだけ、Lambdaとの連携はポチポチするだけ、クエリ文字列パラメータの分解はマッピングの設定をするだけと、お手軽にAPIができてしまいました。
しかもEC2インスタンスは不要、apacheの設定も不要、コストはAPIを叩いた時だけなのでお財布にもやさしいというおまけつきです。
使った事が無い方は、是非一度このお手軽さを体験してみてください。
(一度やってみればお手軽なのですが、私はAPIのデプロイがわからずに数時間試行錯誤してました・・・)

参考ページ

これらのページを参考にさせていただきました。
ありがとうございました。
Lambda 関数ハンドラー (Python)
チュートリアル: Lambda 関数の API Gateway API を作成する
AWS Lambda アクセス権限モデル
演習: HTTP エンドポイントの API Gateway API を作成する
API Gateway のマッピングテンプレートリファレンス