AWS Lambda と Python でサーバーレスAPI構築入門 初心者向けハンズオン解説

lamda python AWS
この記事は約14分で読めます。

この記事の最終更新日: 2025年5月8日

はじめに

AWS のサーバーレスサービスである AWS Lambda を利用して、Python 製の API を構築してみましょう。AWS Lambda はサーバーを管理する手間を大幅に削減でき、API Gateway と組み合わせることで比較的簡単に HTTP(S) エンドポイントを公開できます。

本記事では、以下の流れで「Hello World」を返す API を構築してみます。

  1. Lambda 関数の作成
  2. コードの編集とテスト
  3. API Gateway の設定
  4. Lambda 関数との統合
  5. API のデプロイと動作確認

ここでは最小限の実装を紹介していますが、必要に応じてデータベース連携やログイン認証などの機能を追加していくことも可能です。

lamda python

前提条件

  • AWS アカウント をお持ちであること
  • AWS Management Console にログインできること
  • Python の基本的な文法を理解していること
  • AWS Lambda や API Gateway の概要をざっくり知っているとスムーズ

補足: この記事では AWS CLI を使ったデプロイではなく、AWS マネジメントコンソールから直接操作する方法を紹介します。より本格的な開発・運用では、AWS CLI や AWS SAM (Serverless Application Model)、Serverless Framework などを活用してコード管理と CI/CD を行うケースが多いです。


ステップ 1: AWS Lambda 関数の作成

まずは Lambda 関数を新規作成し、Python コードを実行できる環境を用意しましょう。

1. Lambda の画面へ移動

  1. AWS マネジメントコンソールにログイン
  2. サービス検索バーから Lambda を入力し選択

2. 関数の作成

Lambda コンソール画面にて、以下のように設定します。

  1. [Create function](関数を作成)ボタンをクリック
  2. Author from scratch(一から作成)を選択
  3. 必須入力項目
    • 関数名: 例)hello_lambda
    • ランタイム: Python 3.9 (あるいは 3.8 や 3.10 でも可)
    • アーキテクチャ: x86_64 (ARM も選択可能ですが、ここではデフォルト設定で OK)
    • デフォルトロール: 「Create a new role with basic Lambda permissions」を選択ロールとは、AWS リソースに対して何ができるかを定義した IAM (Identity and Access Management) の概念です。Lambda で最低限必要となるのは、ログを保存するための CloudWatch に書き込みできるポリシー(AWSLambdaBasicExecutionRole)などです。
  4. 画面下部の [Create function] ボタンをクリック

これで空の Lambda 関数が作成されます。


ステップ 2: Lambda 関数のコードを編集

1. コードエディタで Python コードを記述

Lambda 関数の詳細画面に移動すると、上部に「Code」のタブがあるので、そこをクリックしてください。エディタにデフォルトでサンプルコードが入っている場合がありますが、以下のようなシンプルなコードに置き換えましょう。

def lambda_handler(event, context):
    """
    AWS Lambda が呼び出された時のエントリポイント関数。
    event: dict 形式で API Gateway 等から渡されるイベント情報
    context: ランタイム情報やメモリなどコンテキスト情報
    """
    # 返却するレスポンス
    response = {
        "statusCode": 200,
        "body": "Hello World from Lambda!"
    }
    return response

ここでのポイント:

  • 関数名 lambda_handler は Lambda のデフォルトエントリポイント(handler)として設定されるため、原則変更しない方が無難です。(設定画面で変えることもできます。)
  • event にリクエストボディやクエリパラメータなどが入り、context には Lambda 実行環境に関する情報が入ります。
  • API Gateway を経由して呼び出される場合は、return するオブジェクトが API のレスポンスとなります。
    • statusCode は HTTP ステータスコード
    • body は文字列として扱われるため、JSON を返す場合は json.dumps などで文字列に変換します。

2. テストイベントを使った動作確認

コードをエディタに貼り付けたら、画面右上にある Test ボタンを使ってローカルテストを行えます。

  1. Test ボタンをクリック
  2. 「Configure test event」(テストイベントの作成)ダイアログが出るので、適当な名前を(例: testEvent)入力
  3. イベント JSON はデフォルトのままでも OK
  4. [Create] ボタンを押してから Test ボタンを再度押下

テストの結果が画面下部に表示され、{"statusCode":200,"body":"Hello World from Lambda!"} が返ってくれば OK です。

補足: event の内容によって動作を分岐する場合は、テストイベントを自由に編集して確認できます。


ステップ 3: API Gateway でエンドポイントを作成

ここからは API Gateway の設定を行い、Lambda 関数を HTTP(S) 経由で呼び出せるようにしていきます。

1. API Gateway の画面へ移動

  1. AWS マネジメントコンソールで「API Gateway」を検索
  2. 「API Gateway」を選択

2. API の作成 (REST API)

API Gateway には複数のタイプ(REST API / HTTP API / WebSocket API など)がありますが、
ここでは学習用途として「REST API (API Gateway v1)」を使います。

  1. [Create API](API の作成)をクリック
  2. 「REST API」を選択し、[Build] をクリック
  3. 「New API」を選択し、必要な項目を入力
    • API name: 例)hello-api
    • Endpoint Type: Regional(基本はこれで OK)
  4. 最後に [Create API] ボタンを押す

3. Resource とメソッドを作成

続いて、API ゲートウェイのリソース(エンドポイントのパス)と、HTTP メソッド(GET, POST など)を設定します。

  1. 作成した API の左メニューにある「Resources」を選択
  2. 「Actions」 -> [Create Resource] をクリック
  3. リソース名を hello と入力(Resource Path は /hello となる)
  4. [Create Resource] ボタンをクリック

次に、/hello に対して GET メソッドを作成します。

  1. /hello を選択している状態で、「Actions」 -> [Create Method] をクリック
  2. 下向き矢印をクリックして「GET」を選択し、チェックボタンを押す
  3. 新しく GET メソッドが追加される

ステップ 4: Lambda と API Gateway の連携

1. メソッドの Integration Type 設定

GET メソッドをクリックすると、右側にメソッドの設定画面が表示されます。ここで Lambda 関数を呼び出すように設定します。

  1. Integration type: 「Lambda Function」を選択
  2. Lambda Region: Lambda 関数を作成したリージョン(例: ap-northeast-1
  3. Lambda Function: hello_lambda
  4. [Save] ボタンをクリックすると、API Gateway から権限付与を求められるので [OK] をクリック

これで、GET /hello を呼び出すと、AWS Lambda 関数 hello_lambda が起動するように紐付けられました。

注意: Lambda 関数名を設定する際に、スペルミスやリージョンの不一致があるとエラーが出ます。正しいものを選択してください。


ステップ 5: API のデプロイ

1. デプロイ作業の必要性

API Gateway のリソースやメソッドを定義しただけでは、まだ外部からアクセスできません。
「デプロイ」 と呼ばれる作業を行い、ステージ(環境)を作って初めてインターネット経由で呼び出せるようになります。

2. ステージの作成とデプロイ

  1. 左メニューの「Actions」 -> [Deploy API] をクリック
  2. 「Deployment Stage」にて「[New Stage]」を選択し、ステージ名を dev と入力 (または prod, test など適宜)
  3. [Deploy] をクリック

3. Invoke URL の確認

デプロイに成功すると、画面上部に Invoke URL が表示されます。これが公開されるエンドポイントのベース URL です。
例:

今回は /hello リソースを作成したので、実際のアクセス先は以下のようになります。


ステップ 6: 動作確認

最後に、ブラウザまたは curl などを使ってアクセスし、レスポンスを確認しましょう。

1. ブラウザで確認

上記で表示された URL にアクセスしてみます。

何らかの文字列が表示されれば成功です。今回は "Hello World from Lambda!" という文字列が返ってくるはずです。

2. curl コマンドでの確認

ターミナルやコマンドプロンプトで以下のように curl コマンドを実行します。

curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/hello

同様に "Hello World from Lambda!" のレスポンスが返ってきたら、API が正しく動いていることを確認できます。


発展: より実践的な活用ポイント

1. Request Body / Path Parameters / Query Parameters

API Gateway では、クエリパラメータパスパラメータリクエストボディ を Lambda に渡せます。たとえば GET /hello/{username} のように定義して、username を取得するには、API Gateway のマッピングテンプレートを活用したり、event["pathParameters"]event["queryStringParameters"] から取得します。

def lambda_handler(event, context):
    username = event["pathParameters"]["username"] if "pathParameters" in event else "NoName"
    greeting = f"Hello, {username}!"
    response = {
        "statusCode": 200,
        "body": greeting
    }
    return response

2. JSON を返す

API から JSON を返したい場合は、Python の json モジュールを使ってシリアライズしましょう。

import json

def lambda_handler(event, context):
    data = {
        "message": "Hello",
        "value": 123
    }
    response = {
        "statusCode": 200,
        "body": json.dumps(data),
        "headers": {
            "Content-Type": "application/json"
        }
    }
    return response

3. ログ出力 (CloudWatch Logs)

Lambda は実行時のログを CloudWatch Logs に送信します。Python で標準出力 (print) や logging ライブラリを使えば、実行状況やデバッグ情報を残せます。

import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info("Lambda function is invoked!")
    ...

API Gateway 側でもアクセスログや詳細ログの設定ができ、リクエストがどのように処理されたかを追跡できます。

4. IAM ロールとセキュリティ

Lambda から他の AWS リソース(DynamoDB, S3 など)にアクセスする場合は、適切な IAM ポリシーを付与したロールを割り当てる必要があります。最小権限の原則に従い、必要なアクセスのみ許可してください。

5. バージョニングとエイリアス

Lambda では、デプロイ時に自動でバージョンが付与されます。$LATEST の他に、固定バージョンを使うことで、リリース管理をより安全に行うことができます。また、エイリアス を使ってステージごと(dev, prod など)に異なるバージョンを割り当てる運用も一般的です。

6. コストとスケーラビリティ

  • Lambda はリクエスト数と実行時間 (GB-秒) に応じた従量課金制です。小規模利用なら無料枠(Lambda 無料利用枠で毎月 100 万回まで)で収まるケースも多いです。
  • 負荷が高まった場合、自動的に水平スケーリングが走り、複数の Lambda インスタンスでリクエストを処理してくれます。
  • 一方で、同時実行数に上限が設定されているので、大量のアクセスが見込まれる場合は事前に 同時実行数プロビジョンドコンカレンシー の設定を検討しましょう。

7. ローカルでの開発・テスト

実際の開発では、AWS サービスとやりとりをせずにローカル環境でテストしたい場面が多々あります。その際は AWS SAM の「sam local」機能や Serverless Framework などを活用すると便利です。ホットリロード付きでローカル検証できるので、デプロイサイクルが減り効率的に開発できます。


まとめ

以上のステップで、AWS LambdaAPI Gateway を使った Python 製 API の公開ができました。サーバーの構築や管理が不要という大きなメリットがある一方、従来のサーバー常駐型アプリケーションとは少し異なる設計が必要です。
しかし一度慣れてしまえば、スケーラブル かつ 手軽 な構成でサービスを迅速に立ち上げることができます。

  • 最低限のハローワールド実装: Lambda + API Gateway で HTTP GET リクエスト→レスポンスの流れを体験
  • JSON や複雑な構造のレスポンス: json.dumps() を使ってレスポンスを拡張
  • DynamoDB / S3 など、AWS リソースと連携: IAM ロールを付与し、権限管理を適切に行う
  • 認証・認可(Cognito / JWT / IAM 認証): API Gateway には認証を挟む仕組みがあり、企業システムや個人プロジェクトにも対応

みなさんもぜひ、プライベートプロジェクトや学習用途で試してみてください。サーバーレスに慣れると、アイデアを形にするまでの時間が驚くほど短くなるはずです。


参考リンク

本記事が、Lambda + API Gateway を使ったサーバーレスアプリケーション開発の入門としてお役に立てば幸いです。ぜひいろいろなユースケースで活用してみてください!

コメント

タイトルとURLをコピーしました