AWSを使って何か作る: API Gateway を使ってAPIを公開する

この記事はシリーズものです。

  1. 本記事
  2. 自作 API 改修: DynamoDB の Item 取得処理とテーブル設計を見直してレスポンス速度向上

モチベーション

tokizuoh.dev

  • 指定した単語と同じ母音を持つ単語を返すツールを作ったが未公開のまま。せっかくだから公開したい
  • AWSのサーバーレスのチュートリアル をやったのでAWSで公開したい
  • とりあえず最初はミニマムで公開したい
    • 変なところにこだわっちゃって結局公開しないケースが多いため、今回は公開することを一番に!
  • とりあえずフロントとかは後回しでAPIを作る

作ったもの

> curl https://**********/words\?input_text\=aaua | jq . 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   322  100   322    0     0     61      0  0:00:05  0:00:05 --:--:--    85
[
  {
    "japanese_word": "キャラクタ",
    "roman_alphabet": "kyarakuta",
    "vowels": "aaua"
  },
  {
    "japanese_word": "アラスカ",
    "roman_alphabet": "arasuka",
    "vowels": "aaua"
  },
  {
    "japanese_word": "頑な",
    "roman_alphabet": "katakuna",
    "vowels": "aaua"
  },
  {
    "japanese_word": "鼻歌",
    "roman_alphabet": "hanauta",
    "vowels": "aaua"
  }
]

母音から成る文字列をクエリとして渡すと、同じ母音を持つ単語のリストを返す。
(ex. "aaa" -> banana[バナナ], karada[身体])

構成図

処理の概要

DynamoDBにデータを格納するまで

  1. 以下の様な CSVファイル を作成して S3 にアップロード
  2. lambda で S3 にある CSV の内容を dynamoDB に格納
japanese_word,roman_alphabet,vowels
頭金,atamakin,aaain
どうにかこうにか,dounikakounika,ouiaouia
大砲,taihou,aiou
スチーム,suchiimu,uiiu
...

ユーザーがAPIをリクエストしてレスポンスを受けるまで

AWSのサーバーレスのチュートリアル と同じ要領で構築した。

  1. lambda で DynamoDB に接続して条件に沿うデータを取得して返す処理を書く
  2. API gateway でプロキシ統合でリソース作ってメソッド作って lambda を紐付けてデプロイ

今後の展望

  • dynamoDB にアクセスするときに全件取得しているためレスポンスまで時間がかかっている
    • 1リクエストあたり5秒ぐらいかかっていて体感めちゃくちゃ遅いので改善したい
      • NoSQL で速度向上を試みる?
      • RDS を構築して SQL 書いて速度向上を試みる?
  • Terraform 使って可能な限りコード化したい
    • lambda の IAM を毎回手動で設定するのが非常に手間だったので効率化したい
  • この API を使ったフロントエンドを実装して Webページ を公開したい
  • lambda は全部コンソール上で書いた。git管理下に置きたいので Terraform か何かでデプロイ周りを管理したい

参考