サーバーレスで REST API を構築する ― Lambda 関数を API Gateway で公開しログ・環境変数を扱う
サーバーレスは、サーバー管理なしでコードを実行できるアーキテクチャです。このハンズオンでは AWS Lambda で関数を作成し、API Gateway(HTTP API)で外部公開して REST API を構築します。実行ロール・環境変数・CloudWatch Logs によるデバッグ・デプロイ更新まで一連の流れを体験します。
| 項目 | 内容 |
|---|---|
| 対象サービス | AWS Lambda、Amazon API Gateway(HTTP API)、IAM、CloudWatch Logs |
| 主な学習内容 | 関数作成 / 実行ロール / 環境変数 / API 統合 / ログ / デプロイ |
| 所要時間 | 60〜75 分 |
| 難易度 | ★★☆☆☆(初〜中級者向け) |
| 前提知識 | HTTP / JSON の基礎・Python の基本構文 |
| 費用目安 | ほぼ 0 USD(Lambda は月 100 万リクエスト、API Gateway HTTP API は月 100 万リクエストまで無料枠) |
handson-hello/aws/lambda/handson-hello| 項目 | HTTP API | REST API |
|---|---|---|
| 料金 | 安い(約 1/3) | 高い |
| レイテンシ | 低い | やや高い |
| 機能 | シンプル・高速 | 高機能(使用量プラン等) |
| 本ハンズオン | こちらを使用 | ― |
ap-northeast-1(東京) を使用curl が使える環境(ローカル端末 or CloudShell)実行ロールを自動作成しつつ、Python の Lambda 関数を作ります。
マネジメントコンソールで 「Lambda」→「関数の作成」 をクリックします。「一から作成」を選択します。
「関数の作成」をクリックします。これで handson-hello-role-xxxx という実行ロール(CloudWatch Logs への書き込み権限付き)が自動作成されます。
「コード」タブの lambda_function.py を以下に書き換え、「Deploy」 をクリックします。
import json
import os
def lambda_handler(event, context):
# クエリ文字列から name を取得(HTTP API の形式)
params = event.get("queryStringParameters") or {}
name = params.get("name", "World")
# 環境変数を参照
greeting = os.environ.get("GREETING", "Hello")
print(f"Request received: name={name}") # CloudWatch Logs に出力
body = {
"message": f"{greeting}, {name}!",
"stage": os.environ.get("STAGE", "dev")
}
return {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": json.dumps(body, ensure_ascii=False)
}
「Deploy」後に「正常に更新されました」と表示されれば成功です。「設定」→「アクセス権限」で実行ロールが付与されていることも確認できます。
「設定」タブ → 「環境変数」→「編集」 をクリックし、以下を追加します。
| キー | 値 |
|---|---|
| GREETING | こんにちは |
| STAGE | dev |
「保存」をクリックします。コードを変更せずに挙動を切り替えられるのが環境変数の利点です。
「テスト」タブを開き、テストイベントを作成します。
イベント JSON に以下を入力して「テスト」をクリックします。
{
"queryStringParameters": { "name": "田中" }
}
実行結果に以下のようなレスポンスが返れば成功です。
{
"statusCode": 200,
"headers": { "Content-Type": "application/json" },
"body": "{\"message\": \"こんにちは, 田中!\", \"stage\": \"dev\"}"
}
「概要」に実行時間・課金時間・使用メモリも表示されます。
「設定」→「一般設定」でタイムアウト(デフォルト 3 秒)とメモリ(デフォルト 128 MB)を調整できます。メモリを増やすと比例して CPU 性能も上がります。今回はデフォルトで十分です。
HTTP API を作成し、Lambda 関数を REST エンドポイントとして公開します。
Lambda の関数画面で 「トリガーを追加」 をクリックし、「API Gateway」 を選択します。
「追加」をクリックします。Lambda プロキシ統合された API が自動生成されます。
「API Gateway」コンソール を開き、作成された API(handson-hello-API)を選択します。「ルート」を開き、デフォルトルートを GET /hello に整えます(自動生成は ANY /handson-hello 等になる場合があるため)。
| メソッド | パス | 統合先 |
|---|---|---|
| GET | /hello | Lambda: handson-hello |
API の詳細画面に表示される 「Invoke URL」(例: https://abcd1234.execute-api.ap-northeast-1.amazonaws.com)を控え、curl で呼び出します。
ブラウザや curl から JSON レスポンスが返れば、サーバーレス API の公開は成功です。name パラメータを変えるとレスポンスが変わることも確認しましょう。
関数内の print 出力やエラーは CloudWatch Logs に自動で記録されます。
「CloudWatch」→「ログ」→「ロググループ」 を開き、/aws/lambda/handson-hello を選択します。最新のログストリームを開きます。
ステップ 3 で呼び出したリクエストの Request received: name=Taro や、START / END / REPORT 行(実行時間・課金時間・メモリ使用量)が記録されています。
START RequestId: 1a2b3c... Version: $LATEST Request received: name=Taro END RequestId: 1a2b3c... REPORT RequestId: 1a2b3c... Duration: 1.45 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 39 MB
コードに raise Exception("test error") を一時的に追加して Deploy し、API を叩くとログにスタックトレースが記録され、API は 500 を返します。確認後は元に戻します。
Logs Insights で以下のクエリを実行すると、関数の実行時間やエラー件数を集計できます。
filter @type = "REPORT" | stats avg(@duration), max(@duration), count() by bin(5m)
関数の更新方法と、バージョン・エイリアスによる安全なリリースを学びます。
「コード」タブでコードを編集し「Deploy」を押すだけで即時反映されます。小さな修正に向いています。
外部ライブラリを含む場合は zip でデプロイします。CloudShell で以下を実行します。
zip function.zip lambda_function.py aws lambda update-function-code \ --function-name handson-hello \ --zip-file fileb://function.zip「バージョン」→「新しいバージョンを発行」で不変のスナップショット(v1, v2…)を作成できます。prod エイリアスを特定バージョンに向けることで、API からは prod を参照させ、裏で安全に切り替えられます。
コードを変更して再デプロイ後、API のレスポンスが変わることを確認できれば、デプロイのサイクルを習得できています。
無料枠内で収まる構成ですが、不要なリソースは削除しておきましょう。
handson-hello-API を選択 → 「削除」handson-hello → 「アクション」→「削除」/aws/lambda/handson-hello を削除handson-hello-role-xxxx を削除| 習得したスキル | 実践内容 |
|---|---|
| Lambda 関数作成 | Python ランタイム・実行ロール自動作成・コードデプロイ |
| 環境変数 | コード変更なしで挙動を切り替え |
| API Gateway | HTTP API で Lambda を REST 公開・プロキシ統合 |
| ログとデバッグ | CloudWatch Logs での print 出力・Logs Insights 集計 |
| デプロイ | インライン / zip / CLI 更新・バージョン・エイリアス |