Lambda + API Gateway ハンズオン

サーバーレスで REST API を構築する ― Lambda 関数を API Gateway で公開しログ・環境変数を扱う

AWS Lambda API Gateway IAM Role CloudWatch Logs サーバーレス マネコン操作 所要時間 60〜75 分 v1.0

📋 概要

サーバーレスは、サーバー管理なしでコードを実行できるアーキテクチャです。このハンズオンでは 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 万リクエストまで無料枠)
ℹ️ サーバーレスのメリット
  • サーバー管理不要:OS パッチ・スケーリングは AWS 任せ
  • 従量課金:実行された分(リクエスト数 + 実行時間)だけ課金
  • 自動スケール:同時実行数に応じて自動的にスケールアウト
  • イベント駆動:API・S3・SQS など様々なトリガーで起動できる

🏗️ アーキテクチャ

🧑‍💻 クライアント(curl / ブラウザ)
GET https://<api-id>.execute-api.../hello?name=Taro
↓ HTTPS リクエスト
🚪 API Gateway(HTTP API)
ルート: GET /hello → Lambda プロキシ統合
↓ イベント(JSON)
⚡ Lambda 関数 handson-hello
Python ランタイム / 実行ロール / 環境変数
↓ ログ出力
📋 CloudWatch Logs /aws/lambda/handson-hello
print / エラーを記録

HTTP API と REST API の違い

項目HTTP APIREST API
料金安い(約 1/3)高い
レイテンシ低いやや高い
機能シンプル・高速高機能(使用量プラン等)
本ハンズオンこちらを使用

✅ 前提条件

⚡ ステップ 1 ― Lambda 関数の作成

実行ロールを自動作成しつつ、Python の Lambda 関数を作ります。

1-1. 関数を作成する

マネジメントコンソールで 「Lambda」→「関数の作成」 をクリックします。「一から作成」を選択します。

関数名handson-hello
ランタイムPython 3.12
アーキテクチャx86_64
実行ロール基本的な Lambda アクセス権限で新しいロールを作成

「関数の作成」をクリックします。これで handson-hello-role-xxxx という実行ロール(CloudWatch Logs への書き込み権限付き)が自動作成されます。

1-2. コードを記述する

「コード」タブの 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」後に「正常に更新されました」と表示されれば成功です。「設定」→「アクセス権限」で実行ロールが付与されていることも確認できます。

🧪 ステップ 2 ― 環境変数の設定とテスト実行

2-1. 環境変数を設定する

「設定」タブ → 「環境変数」→「編集」 をクリックし、以下を追加します。

キー
GREETINGこんにちは
STAGEdev

「保存」をクリックします。コードを変更せずに挙動を切り替えられるのが環境変数の利点です。

2-2. テストイベントを作成して実行

「テスト」タブを開き、テストイベントを作成します。

イベント名test-hello

イベント JSON に以下を入力して「テスト」をクリックします。

{
  "queryStringParameters": { "name": "田中" }
}
2-3. 実行結果を確認

実行結果に以下のようなレスポンスが返れば成功です。

{
  "statusCode": 200,
  "headers": { "Content-Type": "application/json" },
  "body": "{\"message\": \"こんにちは, 田中!\", \"stage\": \"dev\"}"
}

「概要」に実行時間・課金時間・使用メモリも表示されます。

ℹ️ タイムアウトとメモリ

「設定」→「一般設定」でタイムアウト(デフォルト 3 秒)とメモリ(デフォルト 128 MB)を調整できます。メモリを増やすと比例して CPU 性能も上がります。今回はデフォルトで十分です。

🚪 ステップ 3 ― API Gateway で公開する

HTTP API を作成し、Lambda 関数を REST エンドポイントとして公開します。

3-1. HTTP API を作成

Lambda の関数画面で 「トリガーを追加」 をクリックし、「API Gateway」 を選択します。

API タイプHTTP API
セキュリティオープン(ハンズオン用。本番は認証を付ける)

「追加」をクリックします。Lambda プロキシ統合された API が自動生成されます。

3-2. ルートを確認・調整

「API Gateway」コンソール を開き、作成された API(handson-hello-API)を選択します。「ルート」を開き、デフォルトルートを GET /hello に整えます(自動生成は ANY /handson-hello 等になる場合があるため)。

メソッドパス統合先
GET/helloLambda: handson-hello
3-3. エンドポイントを呼び出す

API の詳細画面に表示される 「Invoke URL」(例: https://abcd1234.execute-api.ap-northeast-1.amazonaws.com)を控え、curl で呼び出します。

curl "https://abcd1234.execute-api.ap-northeast-1.amazonaws.com/hello?name=Taro" # => {"message": "こんにちは, Taro!", "stage": "dev"}
✅ 確認ポイント

ブラウザや curl から JSON レスポンスが返れば、サーバーレス API の公開は成功です。name パラメータを変えるとレスポンスが変わることも確認しましょう。

📋 ステップ 4 ― CloudWatch Logs でデバッグする

関数内の print 出力やエラーは CloudWatch Logs に自動で記録されます。

4-1. ロググループを開く

「CloudWatch」→「ログ」→「ロググループ」 を開き、/aws/lambda/handson-hello を選択します。最新のログストリームを開きます。

4-2. ログを確認

ステップ 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
4-3. わざとエラーを起こして観察(任意)

コードに raise Exception("test error") を一時的に追加して Deploy し、API を叩くとログにスタックトレースが記録され、API は 500 を返します。確認後は元に戻します。

ℹ️ Logs Insights での集計

Logs Insights で以下のクエリを実行すると、関数の実行時間やエラー件数を集計できます。

filter @type = "REPORT"
| stats avg(@duration), max(@duration), count() by bin(5m)

🔁 ステップ 5 ― コードの更新とデプロイ

関数の更新方法と、バージョン・エイリアスによる安全なリリースを学びます。

方法① インラインエディタで更新

5-1. コードを変更して Deploy

「コード」タブでコードを編集し「Deploy」を押すだけで即時反映されます。小さな修正に向いています。

方法② zip パッケージ / CLI で更新

5-2. zip をアップロードして更新

外部ライブラリを含む場合は zip でデプロイします。CloudShell で以下を実行します。

zip function.zip lambda_function.py aws lambda update-function-code \ --function-name handson-hello \ --zip-file fileb://function.zip

バージョンとエイリアス(安全なリリース)

5-3. バージョンを発行してエイリアスを作成

「バージョン」→「新しいバージョンを発行」で不変のスナップショット(v1, v2…)を作成できます。prod エイリアスを特定バージョンに向けることで、API からは prod を参照させ、裏で安全に切り替えられます。

aws lambda publish-version --function-name handson-hello aws lambda create-alias --function-name handson-hello \ --name prod --function-version 1
✅ 確認ポイント

コードを変更して再デプロイ後、API のレスポンスが変わることを確認できれば、デプロイのサイクルを習得できています。

🧹 クリーンアップ

⚠️ 課金防止のためクリーンアップを実施

無料枠内で収まる構成ですが、不要なリソースは削除しておきましょう。

削除手順(逆順で実施)

  1. API Gateway を削除
    API Gateway → handson-hello-API を選択 → 「削除」
  2. Lambda 関数を削除
    Lambda → handson-hello → 「アクション」→「削除」
  3. CloudWatch ロググループを削除
    CloudWatch → ログ → /aws/lambda/handson-hello を削除
  4. 実行ロールを削除
    IAM → ロール → handson-hello-role-xxxx を削除

学習のまとめ

習得したスキル実践内容
Lambda 関数作成Python ランタイム・実行ロール自動作成・コードデプロイ
環境変数コード変更なしで挙動を切り替え
API GatewayHTTP API で Lambda を REST 公開・プロキシ統合
ログとデバッグCloudWatch Logs での print 出力・Logs Insights 集計
デプロイインライン / zip / CLI 更新・バージョン・エイリアス