STEP 0: APIを自分の手で作る
フロント編で作ったアプリは、いまメンターが用意した仮の計算APIで動いています。 このガイドでは、その計算APIを AWS(Lambda + API Gateway)で自分の手で作り、この仮のAPIと差し替えます。
前提: フロント編 STEP 6(第一目標)まで完成していること
ゴールは「差し替えてもアプリの動きが1ミリも変わらないこと」。 仕様(契約)が同じなら、中身は丸ごと入れ替えられる ── これが「API仕様は契約」という、Web開発でいちばん大事な考え方です。
フロント編では「API Gateway + Lambda」の部分をメンターが用意したAPIが担当していた。今日からは自分のAWSアカウントの中で同じものを動かす ── 用意された Lambda に中身のコードを書き、API Gateway をつないでいく。
サーバーマシンを自分で建てる場面が1度も出てこないことに注目 ── これがサーバーレスと呼ばれる構成。「サーバーが無い」のではなく、AWSが裏で動かしてくれるので自分は管理しなくていい、という意味だ。
フロント編で「月々の支払額を計算する」ボタンを押すたび、あなたのアプリは裏でこのJSONをAPIに送り、 返ってきたJSONを結果カードに表示していた。 ここではアプリの代わりに自分の手で送ってみて、これから作るAPIの仕事を「裏側から」のぞいてみよう。
頭金を車両価格より大きくするなど、わざと変な入力で送るとどうなるかも見てみよう。 この「JSONを受け取り、計算して、JSONを返す」係を、STEP 1〜5 で自分のAWS上に作っていく。
- フロント編で作った自分のアプリをブラウザで開き、開発者ツールを出す(F12 キー、または画面を右クリック →「検証」)→「Network(ネットワーク)」タブを開く
- 計算ボタンを押すと、一覧に
calcという通信が1行現れる。クリックして中を見る - 「ヘッダー」にステータス(200)、「ペイロード」に①のリクエストJSON、「応答」に②のレスポンスJSONが、いま上で体験したのと同じ形で入っている
この Network タブは「APIに何が届いて、何を返したか」を確かめる虫めがね。いま映っているのはメンターのAPIだが、STEP 4 で自分のAPIを作ったあとも、動作確認やエラーの切り分けでずっと使う。
| STEP | 作るもの | クリアの条件 |
|---|---|---|
| 1 | Lambda関数を開いて動かす | テスト実行で "Hello from Lambda!" が返る |
| 2 | JSONを受け取り、JSONを返す | 送った値がそのまま返る(オウム返し) |
| 3 | 元利均等の計算ロジック | テストで正しい計算結果が返る |
| 4 | API GatewayでURLを付ける | URLを叩くと計算結果が返る |
| 5 | バリデーション(最終防衛) | 不正な入力に 400 とエラーを返す |
| 6 | フロントのURLを差し替える | 🎉 第一目標クリア(仮のAPIを卒業) |
| 7 | 応用編 車種一覧API(GET /cars) | URLを叩くと車種JSONが返る |
| 8 | 応用編 フロントの車種APIを差し替え | 🏆 第二目標クリア |
| 9 | 拡張 拡張課題(好きなお題に挑戦) | 🚀 天井なし |
STEP 6 までが全員のゴール。STEP 7〜9 は、余力があればチャレンジ!
① AWSコンソールの画面は更新で変わることがある。見つからないボタンはメンターに聞こう
② コードはまず自分で書いてみる。詰まったらメンターに声をかけてパスワードをもらい、「🔒 答えのコード例」を開こう
③ クリアの条件を満たしたらメンターに見せて、次のSTEPへ
STEP 1: Lambda関数を開いて動かす
| やること | メンターが用意した自分用の計算用 Lambda(名前はメンターが伝える)を開き、最初から入っているコードをテスト実行する |
|---|---|
| 到達チェック | テスト実行が成功(緑色)になり、"Hello from Lambda!" が返る |
| 学ぶこと | Lambda = サーバーを建てずに「関数のコードだけ」を動かせるサービス。書いたコードは「Deploy」を押すまで反映されない(このガイド最大のハマりポイント!) |
- メンターから配布されたアカウントで AWS コンソールにログインする
- 画面右上のリージョンが「東京 (ap-northeast-1)」になっているか確認する(違ったら切り替え)
- 上の検索バーで「Lambda」を検索して開く →「関数」の一覧を表示する
- 自分用に用意された計算用 Lambda(名前はメンターが伝える)をクリックして開く
- 「テスト」タブ → イベント名に
test1と入れて保存 →「テスト」を実行する
※ 関数そのもの(と動かすための権限)はメンターが事前に用意済み。あなたの仕事はこの中身のコードを育てること。
lambda_handler が「呼ばれたら実行される関数」。event に呼び出し時の情報(あとでフロントからの入力が入る)、
戻り値の statusCode と body がAPIの返事になる。フロント編で受け取っていたJSONは、この body の中身だった。
STEP 2: リクエストを受け取り、JSONを返す(オウム返し)
| やること | event からリクエストの body を取り出し、そのままJSONで返す。テストイベントを「本番でフロントから届くのと同じ形」に作り変えて確認する |
|---|---|
| 到達チェック | テスト実行すると、テストイベントに入れた4つの値がそのまま返ってくる |
| 学ぶこと | APIの正体は「JSONを受け取り、JSONを返す関数」。届く body は「JSONの文字列」なので json.loads で辞書に変換してから使う |
- 「テスト」タブでテストイベントの中身を、下の「テストイベント」のJSONに丸ごと書き換えて保存する
- コードを「bodyを取り出して、そのまま返す」ように書き換える(ヒント:
json.loadsとjson.dumps) - 「Deploy」を押してから「テスト」を実行する
🔒 詰まったら: 答えのコード例を見る(要パスワード)
STEP 3: 元利均等の計算ロジックを実装する
| やること | 下の公式をPythonで実装し、レスポンス5項目を仕様書どおりのキー名で返す |
|---|---|
| 到達チェック | STEP 2 のテストイベントで実行すると、monthlyPayment が 48515 になる |
| 学ぶこと | 計算はサーバー側の仕事(フロントは表示するだけ)。キー名は「契約」── 1文字でも違うとフロントの結果カードが壊れる。年利0%のときは公式が使えないので計算を分ける(ゼロ除算の回避)という、計算ならではのエッジケースも扱う |
総支払額 = 月額 × 回数 + 頭金 / 利息合計 = 総支払額 − 車両価格。 この5つのキー名は、フロント編 STEP 6 で結果カードに表示していたものと同じ ── つまり仕様書(契約)そのもの。
🔒 詰まったら: 答えのコード例を見る(要パスワード)
STEP 4: API GatewayでURLを付ける
| やること | API Gateway(HTTP API)を作り、POST /calc ルートを自分の Lambda に繋ぎ、CORS を設定する |
|---|---|
| 到達チェック | 下のAPIテスターに自分のURLを入れて送信すると、計算結果が返ってくる |
| 学ぶこと | API Gateway = Lambda に「世界中から呼べるURL」を与える玄関。CORS = ブラウザ(別のサイト)から呼ぶことを許可する設定で、忘れるとフロントから一切呼べなくなる定番ポイント |
- 検索バーで「API Gateway」を開く →「APIを作成」→「HTTP API」の「構築」
- 「統合を追加」→ Lambda を選び、自分の関数(calc-api-自分の名前)を指定。API名も
calc-api-自分の名前 - ルートの設定: メソッド POST、リソースパス /calc
- そのまま進めて「作成」(ステージは
$default・自動デプロイのままでOK) - 左メニューの「CORS」を開いて設定する: Access-Control-Allow-Origin に
*、Allow-Methods にPOSTとOPTIONS、Allow-Headers にcontent-typeを追加して保存 - API の詳細画面に表示される「呼び出しURL」をコピーする。使うときは末尾に
/calcを付ける(例: https://xxxx.execute-api.ap-northeast-1.amazonaws.com/calc)
STEP 5: バリデーション(最終防衛)を作る
| やること | 不正な入力が来たら、計算せずに 400 + {"error": "メッセージ"} を返す処理を Lambda に追加する |
|---|---|
| 到達チェック | 下のテスターで「頭金 ≧ 車両価格」を送ると、400 と日本語のエラーメッセージが返る |
| 学ぶこと | フロントのチェック(STEP 4でやった)は「親切」、APIのチェックは「契約」。フロントのチェックは F12 から簡単に迂回できるため、クライアントの入力は信用しない ── サーバー側だけが信頼できる防衛線。これで二段構えが完成する |
| キー | ルール | エラーメッセージの例 |
|---|---|---|
vehiclePrice | 1 以上 | 車両価格は1円以上で入力してください |
downPayment | 0 以上、かつ車両価格未満 | 頭金は車両価格未満で入力してください |
annualRate | 0 以上(0% は有効な入力) | 年利は0%以上で入力してください |
installments | 1 以上 | 支払回数は1回以上で入力してください |
🔒 詰まったら: 答えのコード例を見る(要パスワード)
STEP 6: フロントのURLを自分のAPIに差し替える
| やること | 自分のフロント(app.js)の API_URL を、メンターのAPIのURLから自分のAPIのURLに書き換える。変更はこの1行だけ |
|---|---|
| 到達チェック | 🎉 第一目標クリア ── 自分のアプリが、自分の作ったAPIで動く。見た目の動きが何も変わらないことこそが成功 |
| 学ぶこと | 仕様(契約)が同じなら、中身は丸ごと差し替えられる。仮のAPIを先に用意してフロントとバックを並行開発するのは、実務でも定番の進め方 |
- 自分のアプリをブラウザで開き、F12 → Network タブを開く
- 計算ボタンを押す
- 一覧に
calcへのリクエストが出る。クリックして、宛先が自分のURL・ステータスが 200 であることを確認する - この画面のスクショを撮っておくと、成果発表で「自分でAPIを作った証拠」として使える
| 症状(Consoleタブ / Networkタブ) | 原因のあたり |
|---|---|
| 赤い文字で「CORS policy」のエラー | STEP 4 の CORS 設定もれ(Allow-Origin / Allow-Headers) |
| ステータス 404 | URLの間違い。末尾の /calc を忘れていないか |
| ステータス 500 | Lambda のコードがエラーを起こしている(拡張課題のCloudWatchでログが見られる) |
| 直したのに動きが変わらない | Lambda の Deploy 忘れ/ブラウザのリロード忘れ |
STEP 7: 車種一覧API(GET /cars)を作る 応用編
| やること | メンターが用意した2つ目の Lambda(車種用)を開き、車種一覧を JSONで返すコードを書く(データはまずコードに直接置く)。API Gateway に GET /cars ルートを追加する |
|---|---|
| 到達チェック | 下のテスターで自分のURLを叩くと {"cars": [...]} が返る |
| 学ぶこと | 「データを返すだけのAPI」も calc と同じ作り方(受け取って・返すだけ)。データはまずコードに直接置いて動かし、本格的にDBへ移すのは STEP 9 の拡張。フロント編 STEP 7 で fetch した車種データの「出どころ」を、今度は自分で作る |
- STEP 1 と同じ要領で、用意された車種用 Lambdaを開く
- 車種一覧を
{"cars": [...]}の形で返すコードを書く(下の見本データを使ってOK)。Deploy も忘れずに - API Gateway で STEP 4 と同じAPIを開き、「ルート」→「作成」→ メソッド GET・パス /cars → 統合に cars-api の Lambda を選ぶ
- CORS の Allow-Methods に
GETが入っているか確認する(入っていなければ追加)
🔒 詰まったら: 答えのコード例を見る(要パスワード)
STEP 8: フロントの車種APIを自分のAPIに差し替える 応用編
| やること | フロント(app.js)の CARS_API_URL を自分の GET /cars のURLに書き換える |
|---|---|
| 到達チェック | 🏆 第二目標クリア ── 自分のアプリの車種一覧が、自分のAPIから取得した車に変わる |
| 学ぶこと | 画面に並ぶデータの出どころが、自分で作ったAPIになった。フロントとバックの分離 ── 返す車種を変えても、フロントのコードは1行も触らなくていい |
- 自分のアプリを開いて、車種一覧が「自分のAPIから来た車」になっていることを確認する
- 車種用 Lambda のコードに車をもう1台追加して Deploy する
- アプリをリロードする → フロントのコードを触っていないのに車が増える
STEP 9: 拡張課題 — 好きなお題に挑戦しよう 拡張
| やること | 下のメニューから好きなお題を選んで挑戦する。順不同・いくつでもOK。着手前にメンターに一言伝えよう |
|---|---|
| 到達チェック | なし。ここから先は天井なし 🚀 |
| 学ぶこと | ここまでは「決められたものを作る」、ここからは「何を作るか自分で決めて作る」。実務にいちばん近い部分 |
| お題 | 難易度 | できると何が嬉しい? | ヒント |
|---|---|---|---|
| 車種データをDynamoDBに置く | ★★★ | データを「コードの外」に出せる=本物のWebアプリの構成。増やすのにコードを触らなくてよくなる | DynamoDBにテーブル作成+車種を登録 → 車種用 Lambda の固定リストを boto3 の table.scan() に置き換える。⚠️数値が Decimal 型で返るので int() 変換。DB読み取り権限はメンターが設定済み |
| バリデーションの強化 | ★★ | 「壊れた入力」への耐性が上がる=APIの品質が上がる | 数字以外が来たら? キーが足りなかったら? body がJSONですらなかったら?(try-except の出番) |
| フロントのCSSをブラッシュアップ | ★ | 見た目が整う=発表で「自分のアプリ」として見せやすくなる | フロント編に戻って、配色・余白・レスポンシブ(スマホ幅)を整える。フロント編の拡張「デザイン磨き」とセット |
| 自由課題 | ? | 企画から自分でやる、いちばん実務に近い体験 | 「あったら便利」をメンターに提案して実装(例: ボーナス併用払い、返済スケジュールAPI など) |
| CloudWatchでログ探検 (任意・余力があれば) | ★ | 「サーバーで何が起きたか」を見られる=障害調査の第一歩 | Lambda のコードに print() を仕込む → CloudWatch Logs で見つける。500エラーの原因調査にも使える |