はじめる前に
- 必須AWS アカウントを持ち、マネジメントコンソールにサインインできること
- 必須Lambda 関数をコンソールで作り、テスト実行した経験があること
- あると良い「URL にアクセスすると、何かが返ってくる」というイメージ(ブラウザでページが開くのもその一種です)
- あると良い「JSON」という、データを表す書き方を見たことがある(本文で軽く説明します)
※ このハンズオンは すべてコンソールだけで完結します。できた API はブラウザで開いて確認します。
🌱 プログラミングがはじめての人へ
コードはこのページにすべて用意してあります。コピーして貼り付けるだけで動きます。書いてある内容は 1 行ずつ日本語で説明するので、いま意味が分からなくても大丈夫。「URL にアクセスするとデータが返る」体験が目的です。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
Web ページは「人が見るための画面」ですが、アプリどうしがやり取りするときは、画面ではなく「データそのもの」をやり取りします。たとえばスマホアプリが「最新のお知らせをちょうだい」とサーバーに頼み、サーバーがデータ(文字や数値の集まり)を返す——この「URL にアクセスするとデータが返ってくる窓口」を API と呼びます。
AWS では、この API の入口を API Gateway で作り、実際の処理を Lambda に任せる組み合わせが定番です。利用者は API Gateway の URL にアクセスするだけ。裏で Lambda が動いて、データ(JSON という形式)を返します。今回は、アクセスすると簡単なデータを返す API を、サーバーを立てずに作ります。
前にやった「関数 URL」と何が違うの?
関数 URL も Lambda を Web から呼べますが、API Gateway を前に置くと、複数の窓口(パス)を整理したり、アクセスの制限・記録・流量の制御などをまとめて行ったりしやすくなります。本格的な API を作るときの「受付」がしっかりする、というイメージです。今回はまず、基本の「つないで返す」を体験します。
「JSON」って何?
データを表すための、世界中で使われる書き方です。{ "message": "こんにちは" } のように、項目名と値のセットで書きます。人にもアプリにも読みやすいので、API のやり取りでよく使われます。
API Gateway を Lambda の前に置き、発行された API の URL にブラウザでアクセスすると、Lambda が返したデータ(JSON)が表示されることを確認する。
つくる構成
ブラウザ(やアプリ)が API Gateway の URL にアクセスすると、API Gateway が裏の Lambda を呼び出します。Lambda はデータ(JSON)を作って返し、それがそのまま利用者へ返されます。
サーバーは 1 台もありません。
要件
以下の要件を満たし、API の URL でデータが返ることを確認してください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | Lambda 関数を 1 つ作成する。ランタイムは Python(最新版でよい)。本文のサンプル(JSON データを返す)に置き換えて保存(デプロイ)する。 |
| 3 | 関数に API Gateway のトリガーを追加する。API タイプは HTTP API、セキュリティは学習用に オープン(認証なし)とする。 |
| 4 | 発行された API エンドポイントの URL をブラウザで開く。 |
| 5 | Lambda が返した データ(JSON)が表示されることを確認する(例:{"message": "..."})。 |
構築の進め方
「関数を作る → データを返すコードを貼る → API Gateway をトリガーに追加 → URL で確認」の順に進みます。コードは貼り付けるだけ。意味は 1 行ずつ説明します。
-
リージョンを合わせ、Lambda 関数を作る
リージョンが東京であることを確認し、
Lambdaコンソールで「関数の作成」→「一から作成」を選び、関数名api-function、ランタイム Python(最新版)で作成します。 -
データ(JSON)を返すコードを貼り付ける
「コードソース」の中身をすべて消して、次のコードを貼り付け、「Deploy」で保存します。
ざっくり言うと:アクセスされたら、JSON 形式のデータ(あいさつのメッセージ)を返す API のプログラムです。(細かい意味は、コードの下で 1 行ずつ説明します)
import json def lambda_handler(event, context): data = { "message": "こんにちは!これは API が返したデータです。" } return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": json.dumps(data, ensure_ascii=False) }
- import jsonデータを「JSON という文字の形」に変換するための道具(機能)を読み込んでいます。
- def lambda_handler(event, context):関数の「入口」です。API にアクセスがあると、AWS がここを実行します。
- data = { "message": "..." }返したいデータを用意しています。
{ }は項目をまとめた入れ物で、"message"という項目名に、あいさつの文章を入れています。 - return { ... }利用者に返す「返事のセット」を返しています。
- "statusCode": 200「成功しました」を表す番号です(
200= OK)。 - "headers": { "Content-Type": "application/json" }「この返事は JSON データです」と相手に伝えています。
- "body": json.dumps(data, ensure_ascii=False)用意した
dataを、JSON の文字に変換して返しています。ensure_ascii=Falseは「日本語をそのまま読める形にする」おまじないです。
字下げ(インデント)に注意関数の中身の行の先頭にある空白は、Python の大切なルールです。貼り付けた字下げを崩さないようにしましょう。
-
API Gateway をトリガーに追加する
関数の画面で「トリガーを追加」を押し、ソースに API Gateway を選びます。「Create a new API(新しい API を作成)」を選び、API タイプは HTTP API、セキュリティは 「Open(オープン=認証なし)」を選んで追加します。
API タイプ
HTTP API軽量で手早く作れる APIREST API高機能だが設定項目が多いWebSocket API双方向の常時接続向け↳今回は「データを返すだけ」なので、軽量な HTTP API を選びます
HTTP API とオープンを選ぶ理由HTTP API は、軽くて手早く作れる種類の API です。「オープン」は学習用に「認証なしで誰でも呼べる」設定で、ブラウザですぐ試せます。本番では認証を付けたり、後片づけで消したりして、開けっ放しにしないことが大切です。
-
API の URL にアクセスして確認する
トリガーが追加されると、API エンドポイントの URL(例:
https://xxxx.execute-api.ap-northeast-1.amazonaws.com/default/api-function)が表示されます。これをブラウザで開くと、Lambda が返したデータ(例:{"message": "こんにちは!これは API が返したデータです。"})が表示されるはずです。表示されるのは「画面」ではなく「データ」ページのように飾られた画面ではなく、データそのもの(JSON)が表示されます。これがアプリどうしのやり取りで使われる形です。「人が見る画面」とは目的が違う、という点を味わってみましょう。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「API の URL を開いても、データが返らない」
①セキュリティを「オープン」にしたか(認証ありだと、ブラウザでそのまま開いても拒否されます)、②表示された URL を最後まで正しく開いているか(末尾の関数名やパスまで含めて)、③コードを変えたあとに Deploy したかを見直しましょう。
「返ってきたデータの日本語が、おかしな記号になる」
データを文字に変換するところを確認しましょう。①json.dumps(...) に ensure_ascii=False が付いているか(日本語をそのまま出す指定です)、②return の形(statusCode / headers / body のセット)が崩れていないかを見直しましょう。コードを貼り直すのが確実です。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。Lambda・API Gateway のコンソールとブラウザを開いて、次を順に確かめましょう。
- Lambda 関数
api-functionがあり、コードが Deploy 済みになっている。 - 関数の画面に、API Gateway のトリガーが表示され、API エンドポイントの URL が分かる。
- その API のセキュリティがオープンになっている。
- ブラウザで API の URL を開くと、JSON データ(
{"message": "..."})が表示される。 - 日本語が文字化けせずに表示されている。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- 今回返ってきたのは、飾られたページではなく「データ(JSON)」でした。なぜアプリどうしのやり取りでは、画面ではなくデータをやり取りするのでしょうか。
ヒント
受け取る側(アプリ)は、見た目の飾りより「中身の値」がほしいからです。データだけ受け取れれば、それを使ってアプリが自由に画面を作れます。「見せる相手が人か、アプリか」で必要なものが違う、という観点で考えてみましょう。 - 関数 URL でも Lambda を Web から呼べました。あえて API Gateway を前に置くと、どんなことがやりやすくなるでしょうか。
ヒント
複数の窓口(パス)を整理する、アクセスを制限・記録する、流量を制御する、といったことを「受付」でまとめて行えます。API が大きくなるほど、こうした受付の役割が効いてきます。「窓口が増えても整理できる」という観点で考えてみましょう。 - 今回の API は、いつ呼んでも同じデータを返しました。実際のサービスでは、データはどこかに保存されていて、それを読み出して返すのが普通です。この API の裏に「データの保管場所」を足すなら、何を組み合わせるとよさそうでしょうか。
ヒント
Lambda の中から、データベースにデータを読みに行く・書きに行くようにすれば、保存された内容を返したり、受け取った内容を貯めたりできます。「API(受付)+ Lambda(処理)+ データベース(保管)」という組み合わせを思い浮かべてみましょう。
後片づけ
API は「認証なしで誰でも呼べる入口」です。学習が終わったら、開けっ放しにせず片づけましょう。
- API を削除する:関数の「トリガー」から API Gateway のトリガーを削除します。あわせて、API Gateway コンソールで作成された API(HTTP API)が残っていれば、そちらも削除します。
- Lambda 関数を削除する:「関数」一覧で
api-functionを選び、「アクション」→「削除」で消します。 - ログを削除する(任意):CloudWatch の「ロググループ」から、この関数のログを削除できます。
API と関数の両方を片づける
トリガーを消しても、API Gateway 側に API 本体が残ることがあります。API Gateway コンソールも確認して、作った API を削除しておきましょう。認証なしの入口を残したままにしないことが大切です。
コストに関する注意: API Gateway は、受け付けたリクエスト数に応じて課金され、新規アカウントには毎月一定回数までの無料利用枠があります。Lambda も呼び出し回数・実行時間に応じた課金で、毎月かなりの回数までの無料枠があります。学習での数回〜数十回のアクセスは、ほぼ無料の範囲に収まることが多いです。ただし、認証なしの API を公開したまま放置して大量にアクセスされると、リクエスト数と Lambda の実行が積み上がります。使い終えたら、上の「後片づけ」で API と関数を削除しておきましょう。最新の料金は AWS の公式料金ページで確認してください。