LoginSignup
7
5

More than 3 years have passed since last update.

[AWS] API GatewayとJSONサーバーで動的htmlレンダリングしてみた。

Last updated at Posted at 2020-05-13

API GatewayとJSONサーバーで動的htmlレンダリングしてみた。

AWSのAPI GatewayとDynamoDBとLambdaでサービス構築してみたかった動機があったので、今回はAPI Gatewayを触ってみた。

  • 特定URLにWebブラウザでアクセスする
  • API GatewayがJSONデータを取得して、htmlにレンダリングして表示する

というシンプルな構造です。

今回はやらないが、API Gatewayは統合リクエストなどの機能を使えばLambdaを挟まなくてもDynamoDBにアクセスできます。なので、 /1 にアクセスするとDynamoDBのあるテーブルの id 1 にアクセスして必要なデータをJSON形式で取得して、そのデータをAPIGatewayの統合レスポンスでhtmlにマッピングして返す、みたいな簡単なWEBアプリケーションが作れます。その触りだけ書いて行きます。

やりかた

REST APIとかで作る。

スクリーンショット 2020-05-14 5.12.04.png

こんな感じで適当に作り

スクリーンショット 2020-05-14 5.12.37.png

GETメソッドを追加する

スクリーンショット 2020-05-14 5.13.08.png

エンドポイントに https://jsondata.okiba.me/v1/json/PiWpM200513171710 みたいなJSONを返してくれるURLをいれる。Lambdaとかに接続させてもいいがその場合は AWSサービス を選びゴニョゴニョしてください。後ほど書きますがMockだと、統合レスポンスでマッピングできなくてハマります。

今回の帰ってくるデータはこれ

{
  "statusCode": 200, 
  "body": [
    {
      "id": 1,
      "name": "JavaScript",
      "tel": "08000000000"
    },
    {
      "id": 2,
      "name": "Object",
      "tel": "09000000000"
    },
    {
      "id": 3,
      "name": "Node",
      "tel": "07000000000"
    }
  ]
}

スクリーンショット 2020-05-14 5.13.47.png

次はここの メソッドレスポンス統合レスポンス をいじる。

スクリーンショット 2020-05-14 5.44.49.png

メソッドレスポンスで 200 のステータスで text/html がブラウザに帰るように設定する。
このあたりの application/jsontext/html に変えたらおk。

スクリーンショット 2020-05-14 5.48.26.png

次は統合レスポンスですが、これもこのあたりの application/jsontext/html に変えたらおk。
https://jsondata.okiba.me/v1/json/PiWpM200513171710 が200を返したときの処理しか書いてないが一旦これでOK

スクリーンショット 2020-05-14 5.49.48.png

#set($inputRoot = $input.path('$.body'))

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <link
            rel="stylesheet"
            href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/light.min.css"
        />
        <title>API Gateway</title>
    </head>
    <body>
        <h1>Qiitaテスト</h1>
        <table border="1">
            <tr>
                <td>id</td>
                <td>name</td>
                <td>tel</td>
            </tr>
            #foreach($elem in $inputRoot)
            <tr>
                <td>$elem.id</td>
                <td>$elem.name</td>
                <td>$elem.tel</td>
            </tr>
            #end
        </table>
    </body>
</html>

マッピングはVTLという名前のテンプレートエンジン?
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

#foreach($elem in $inputRoot)
<tr>
    <td>$elem.id</td>
    <td>$elem.name</td>
    <td>$elem.tel</td>
</tr>
#end

で、一個前の画面に戻っての テスト⚡

スクリーンショット 2020-05-14 5.44.49.png

テストとかぽちぽちしてると、ちゃんとhtmlが帰ってくれるならおk。

スクリーンショット 2020-05-14 5.55.08.png

APIのデプロイして、誰でもアクセスできるようにして、ステージ名は適当に develop とか stage とかでいいと思う。

スクリーンショット 2020-05-14 5.56.01.png

みたいなURLが発行されて完了です。

スクリーンショット 2020-05-14 5.57.52.png

Mockを統合レスポンスで使おうとしてハマった話

スクリーンショット 2020-05-14 2.07.22.png

絵でいうとここが $input.json('$') が使えなかったので2週間くらいハマってました(途中でこころ折れたりしながらの二週間)

スタック・オーバーフローに 書いてました。

以前 JSONを返す無料APIを3分で作る方法 を書きましたが、今回は https://jsondata.okiba.me/ さんを使わせてもらいました。リクエストを噛まさずにAWSサービス内で完結させようと思ってのMOCKでしたが見事にハマりました。

7
5
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
7
5