【AWS】API GatewayとLambdaで動的Webコンテンツを表示する

API GatewayとLambdaを使って、簡単な動的Webサイトを作ってみました。URLに和暦を入れて、アクセスすると、西暦が表示されるAPIです。具体的には、https://example.com/dev.japanese?input_text=reiwa2 にアクセスすると、[2020]と表示されます。

完成イメージ

アーキテクチャ

作成の流れ

Lambda関数を作成する

Lambdaのコンソールに移動し、Lambda関数を作成します。右上のリージョンは「東京」を選びます。

関数を作成します。関数名、ランタイムを入力します。他の値はデフォルト値のままで「関数の作成」ボタンをクリックします。

関数が作成されました。いったん置いておいて、次にAPI Gatewayの設定に移ります。

/japaneseリソースを作成する

API Gatewayのコンソールを開きます。リソースとは、APIのパスのことです。リソースに「test」を追加したとすると、APIのエンドポイントは、https://example.com/testとなります。右上のリージョンは「東京」を選んで、「APIを作成」ボタンをクリックします。

今回、APIタイプは作成事例が多い「REST API」を選びました。

参考サイト:AWS公式 REST API と HTTP API 間で選択する

GETメソッドを作成する

↓「GET」を選んで、チェックマークをクリックします。

統合タイプとしてLambda関数を選択、プロキシ統合してインプット/アウトプットをパススルーする

↓統合タイプは「Lambda関数」を選び、 「Lambda プロキシ統合の使用」にチェックを入れます。チェックを入れると、API Gatewayは変換処理をせずにインプットしたものをそのままパススルー(素通り)します。Lambdaリージョンは先ほど作った東京リージョンである「ap-northeast-1」を選びます。Lambda関数には先ほど作成した関数名を入力して、「保存」をクリックしいます。

メソッドができました。

パラメータを設定する

リクエストパラメータを設定する

プログラム中で呼びだされる関数に与えられる値(引数)を設定していきます。

↓「URLクエリ文字列パラメータ」に名前を入力し、チェックマークをクリックします。

↓Lambda関数の修正が必要なので、さきほど作ったLambda関数をクリックして、Lambdaのコンソール画面に遷移します。

↓API Gatewayのルールに従って、レスポンスを返す必要があるので、return値を修正していきます。API GatewayのルールはAmazon API Gateway デベロッパーガイドに記載されてます。

↓さきほど作成したLambda関数には、「statusCode」、「body」はありますが、「headers」、「isBase64Encoded」がありません。

今回はAPIのやりとりにヘッダーを使っていないので、「headers」はブランクとします。

Base64エンコードとは、64種類の英数字のみを使い、それ以外の文字を扱えない環境でデータを扱うためのエンコード方式です。今回はエンコードしていないので、「false」とします。

Lambdaでは何かしらの処理をする際、イベントを受け取ります。そのイベントがlambda_handler(event, context)の中のeventに格納されます。

import json

def lambda_handler(event, context):
    
    input_text = event['queryStringParameters']['input_text']

    if input_text == 'reiwa1':
        output_text = 2019
    elif input_text == 'reiwa2':
        output_text = 2020
    elif input_text == 'reiwa3':
        output_text = 2021
    else:
        output_text = 'other'

    return {
        'statusCode': 200,
        'body': json.dumps(output_text),
        'isBase64Encoded': False,
        'headers' : {}
    }

インプットパラメータを設定する

API GatewayのパラメータをLambdaのinput_textに代入するよう設定していきます。

↓Lambdaコンソールの「テスト」タブをクリックします。

↓「イベント共有の設定」は「プライベート」を選びます。「テンプレート」は「apigateway-aws-proxy」を選びます。下の方の「イベントJSON」には、API Gatewayからどのように情報が渡されるかが記載されています。8行目の「foo」を「input_text」に、「boo」を「reiwa2」に書き換え、「保存」をクリックします。API GatewayがLambdaに「reiwa2」というパラメータを引き渡すと、Lambdaが処理をして、「2020」というパラメータが戻ってくるはずです。

Lambda関数を修正する

Lambda関数をテスト実行する

「Test」ボタンをクリックすると、テスト実行します。レスポンスに先ほど設定した「body」、「isBased64Encoded」、「headers」が返ってきていることがわかります。

APIをデプロイする

API GatewayのコンソールからAPIをデプロイします。

[URLの呼び出し]に記載されているURLをコピーして、さきほど必須設定した[input_text]に[reiwa2]と入力し、ブラウザでURLにアクセスします。そうすると、[input_text]で指定した和暦に対する西暦が表示されました。

https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/japanese?input_text=reiwa2

参考資料

AWS Hands-on for Beginners 〜 Serverless 編 〜

コメント

タイトルとURLをコピーしました