はじめに
本記事では、API GatewayとAWS Lambdaを組み合わせて、サーバーレスAPIを構築する方法をステップバイステップで解説します。
本記事で作る構成の概要
以下のような構成を作成します
- ユーザーが
https://...にアクセス - API Gateway が HTTP リクエストを受け取る
- リクエストは Lambda 関数に転送される
- Lambda 関数が処理し、レスポンスを返す
- レスポンスは API Gateway 経由でユーザーに返される
この構成は、フロントエンドやモバイルアプリのバックエンドとしても活用でき、サーバー管理不要でスケーラブルなAPI基盤となります。
想定読者
- AWSを使ってWeb APIを構築したいエンジニア
- LambdaやAPI Gatewayの使い方を実践的に学びたい方
プログラミング初心者でも、Pythonの基本が分かっていれば問題ありません。
使用サービス一覧
| サービス | 用途 |
|---|---|
| API Gateway | HTTPリクエストの受け口 |
| AWS Lambda | リクエストに応じたロジックの実行 |
| IAM | LambdaとAPI Gatewayに必要な権限管理 |
構成図(アーキテクチャ図)
本記事で構築する環境は、API GatewayとAWS Lambdaを中心としたシンプルなサーバーレス構成です。

リクエストフロー
- クライアントが API Gateway のエンドポイントに リクエストを送信
- API Gateway がリクエストを受け取り、Lambda 関数をトリガー
- Lambda 関数が処理を実行し、レスポンスを生成
- レスポンスが API Gateway 経由でクライアントに返却される
この流れによって、サーバーレスかつスケーラブルなAPIエンドポイントを提供することが可能です。
必要リソースの関係性
以下のリソースが連携して動作します
| リソース | 役割 |
|---|---|
| API Gateway | クライアントからのリクエストの受付 |
| Lambda 関数 | リクエスト処理ロジックを実行 |
| IAM ロール | Lambda が正しく実行されるための権限設定 |
Lambda 関数の作成
関数の作成方法(はじめに選ぶオプション)
今回は1から作成します。
| オプション | 説明 |
|---|---|
| 一から作成 | Hello World のコードから始める最もシンプルな方法。テンプレなし。 |
| 設計図の使用 | 事前に用意されたテンプレートを使って、SNS通知・S3連携などのユースケースに対応 |
| コンテナイメージ | Dockerで作成したコンテナをLambdaにデプロイ。Node.jsやPython以外も使用可。 |
基本的な情報
今回の設定内容は下記です。詳しい内容はこの後の項目に記載します。基本的な Lambda アクセス権限で新しいロールを作成
| 項目 | 推奨設定 |
|---|---|
| 関数名 | my-api-function |
| ランタイム | Python 3.12 |
| アーキテクチャ | x86_64 |
| 実行ロール | 基本的なLambdaロールを新規作成 |
| その他 | 関数URL:オフ、VPC:未設定、タグ:未設定 |
関数名
- 関数の一意な名前(例:
my-api-function) - 半角英数字、ハイフン(
-)、アンダースコア(_)のみ使用可能 - 長さ:1~64文字
ランタイム情報
- 使用する言語を選択します(例:Python 3.12, Node.js 18.x など)
- Webコンソールでは、Python / Node.js / Rubyのみエディタ対応
- その他の言語(Java, Go など)も zipアップロードやSAM経由で利用可能
アーキテクチャ情報
| オプション | 説明 | 目安 |
|---|---|---|
| x86_64 | 通常の64ビットCPU。互換性が高い。 | 迷ったらこれ |
| arm64 | Graviton2ベースのCPU。低コスト・高性能(最大20%安い) | ARM対応ライブラリを使える人向け |
アクセス権限(実行ロール)
Lambda関数が他のAWSリソースにアクセスするためのIAMロールを指定します。
| 設定項目 | 説明 |
|---|---|
| 基本的な Lambda アクセス権限で新しいロールを作成 | CloudWatch Logs にログを書き込む最小限の権限ロールが自動作成されます。初心者向け。 |
| 既存のロールを使用する | すでにIAMで作ったロールを使う。複数の関数で同じロールを共有したいときに便利。 |
| AWS ポリシーテンプレートから新しいロールを作成 | 権限テンプレを選んでロールを自動作成。S3アクセス付き、VPCアクセス付きなどが選べる。 |
CloudWatch Logs へ出力するための権限はデフォルトロールで十分です。
その他の構成(オプション)
| 機能 | 説明 |
|---|---|
| コード署名 | コードに署名を施し、信頼されたソースからの変更であることを保証(セキュリティ強化向け) |
| KMSによる暗号化 | Lambdaコードを暗号化する際にカスタムKMSキーを使う設定。より厳密なセキュリティ管理が必要なときのみ。 |
| 関数URLの有効化 | Lambda単体でHTTP(S)エンドポイントを持てる機能。API Gateway不要で簡単なAPIを作れる。 |
| タグの設定 | key=value 形式のメタ情報。課金管理・リソース分類に使われます。 |
| VPCへの接続 | LambdaをVPC内のリソース(RDSなど)と連携させるときに設定。VPC・サブネット・セキュリティグループが必要。 |
サンプルコード作成~デプロイ
今回は初期値関数を利用します。
更新してdeployしたい場合、lambda_function.pyを更新して、Deployボタンを押下します。
def lambda_handler(event, context):
return {
"statusCode": 200,
"body": "Hello from Lambda"
}

APIGatewayの構築
APIの作成
APIGatewayにアクセスして、APIを作成をクリックします。

API種類の選択
今回はRestAPIを選択します。

種類に関しては下記があります。
| タイプ | 主な用途 | 特徴 | 対応バックエンド | CORS/OAuth2 | 使用例 |
|---|---|---|---|---|---|
| HTTP API | 通常のWeb API | 軽量・高速・安価 | Lambda、HTTP | OIDC/OAuth2・CORSをネイティブサポート | スマホアプリのAPI、SPAのバックエンド |
| REST API | 高度なAPI制御が必要 | 高機能・細かく制御可・やや高コスト | Lambda、HTTP、AWSサービス | 自分で設定(手動) | 外部開発者に公開するAPI、APIキー管理が必要なサービス |
| REST API(プライベート) | VPC内限定API | REST APIと同等だが、外部アクセス不可 | Lambda、HTTP、AWSサービス | 手動 | 社内業務システム、非公開バックエンド |
| WebSocket API | リアルタイム通信が必要 | 双方向通信、接続維持型 | Lambda、HTTP、AWSサービス | (そもそもRESTではない) | チャット、通知、リアルタイムダッシュボード |
API の詳細
REST API を新規作成する方法を選ぶセクションです。
選択肢は下記がありますが、今回は新しいAPIを選択します。

| オプション | 説明 |
|---|---|
| 新しい API | 一から新しい REST API を作成します(通常はこれを選択)。 |
| 既存の API のクローンを作成 | すでに存在する API をコピーして新しく作成します(設定を再利用したい場合に便利)。 |
| API をインポート | OpenAPI 仕様(YAMLまたはJSON形式のAPI定義ファイル)からAPI構成を取り込みます。 |
| サンプル API | AWS が提供するサンプル API(例:ペットストアAPI)を使ってAPI Gatewayの動作を試すことができます。 |
API 名
- このREST APIの任意の名前を入力します(例:
my-sample-api)。 - 管理画面やCLIでこの名前を使って識別できます。

説明(オプション)
- APIの目的や機能などの説明を入力できます。
- ドキュメント代わりに書いておくと便利ですが、空でも問題ありません。

API エンドポイントタイプ
API Gatewayのエンドポイントがどのようにアクセスされるかを決定します。
今回はリージョンを選択します。

| 種類 | 説明 | 使用例 |
|---|---|---|
| リージョン | APIは現在のAWSリージョン(例:東京 ap-northeast-1)に作成され、そこからリクエストを処理します。 | 社内ツール、地理的に近いユーザー向け |
| エッジ最適化 | AWS CloudFront経由でリクエストを最寄りのリージョンに中継。グローバル配信向けで、低レイテンシが実現できます。 | 世界中のユーザーに提供するサービス |
| プライベート | APIはVPC内部のみで使用され、外部からアクセスできません。 | 社内限定システムやセキュアな業務API |
通常の公開APIなら「リージョン」または「エッジ最適化」、VPC内用途なら「プライベート」を選びます。
IP アドレスのタイプ
API Gateway エンドポイントがサポートする IP アドレスの種類を選びます。
今回はIPv4を選択します。

| オプション | 説明 |
|---|---|
| IPv4 | 標準の IPv4 アドレスでアクセス(一般的な選択) |
| デュアルスタック | IPv4 + IPv6 両対応(IPv6対応が必要な場合に選択) |
メソッドを作成
メソッド作成をクリックします。

今回の作成内容
| 項目 | 設定例 |
|---|---|
| メソッドタイプ | GET |
| 統合タイプ | Lambda 関数 |
| Lambda プロキシ統合 | 有効 |
| 認可 | なし |
| リクエストバリデーター | なし |
| APIキー | なし |
| タイムアウト | デフォルト(29000) |
メソッドタイプ
- APIで使用する HTTPメソッドの種類 を選びます。
| メソッド | 用途例 |
|---|---|
| GET | データ取得(例:記事一覧の取得) |
| POST | データ登録・送信(例:新規ユーザー作成) |
| PUT | データの上書き更新 |
| DELETE | データ削除 |
| PATCH | データの一部を更新 |
統合タイプ(Integration Type)
API Gateway からリクエストをどこへ送るか、バックエンドの種別を選びます。
| 統合タイプ | 説明 |
|---|---|
| Lambda 関数 | AWS Lambda にリクエストを転送(一般的) |
| HTTP | 外部APIや自社サーバーと接続 |
| Mock | 実際の処理なしで、API Gatewayが固定のレスポンスを返す |
| AWS のサービス | S3やSNSなどのAWSサービスに直接アクセス |
| VPC リンク | VPC内のPrivateなHTTPエンドポイントに接続(例:社内のFargate) |
Lambda プロキシ統合
- 有効にすることで、Lambdaにリクエスト全体(event)をJSON形式で渡せるようになります。
- 有効化しない場合、パラメータを個別マッピングしなければならず面倒です。
Lambda 関数の指定
- 統合タイプが「Lambda 関数」のときに指定する。
- 名前またはARNで指定。
- 他アカウントのLambda関数もARN指定で利用可能。
リージョン(例:ap-northeast-1)
- Lambda 関数が配置されている AWSリージョン を指定。
統合のタイムアウト
- LambdaやHTTPバックエンドが応答するまで最大待つ時間(ミリ秒)。
- デフォルトは最大29,000ミリ秒(=29秒)。
- 処理が遅い場合は値を上げると良いが、Lambdaの最大実行時間(15分)を超えないように注意。
認可(Authorization)
APIにアクセスするユーザーの制限方法を指定。
| 種類 | 内容 |
|---|---|
| なし | 認証なしで誰でも呼べる(テスト用・公開API) |
| IAM | IAM認証(SigV4署名)を使う |
| Cognito ユーザープール | Cognitoを使ってユーザー認証 |
| Lambda オーソライザー | Lambdaで独自の認証処理を実装 |
リクエストバリデーター
APIリクエストの検証レベルを設定。
| 種類 | 説明 |
|---|---|
| なし | バリデーションしない |
| パラメータの検証 | クエリ・ヘッダー・パスパラメータだけ検証 |
| 本文とパラメータの検証 | リクエスト本文(JSON)も含めて検証 |
APIキーの必須チェック
- オンにすると、APIキーを持っていないユーザーはアクセス不可になります。
- 管理者向けAPIや有料APIに使う。
オペレーション名(任意)
- メソッドにわかりやすい名前をつけて管理(ドキュメント用)。
例:createUser, getUserById など
URL クエリ文字列パラメータ
/api/items?limit=10のようなクエリパラメータをAPI仕様として明示的に定義。- バリデーションやマッピングに使用。
HTTP リクエストヘッダー
- 必須ヘッダー(例:
Authorization,X-Custom-Header)を定義。
リクエスト本文(Model)
- JSONなどのリクエストボディ構造をスキーマとして定義できます。
- 定義することでバリデーションやOpenAPIエクスポートが明確になります。
デプロイ
リソース画面でAPIをデプロイをクリック

ステージから新しいステージを選択

ステージ名など内容は任意で記載

デプロイをクリックするとデプロイされます。
動作確認
ステージ画面でurlを確認できます。
そのurlをcurlコマンドを叩くと、Hello from Lambdaが出力されたら成功です。

curl {url}
# → Hello from Lambda
まとめ
本記事では、API GatewayとAWS Lambdaを組み合わせたサーバーレスAPIの構築方法を解説しました。
業務ではインフラはコード化することが一般的なので、今度はコード化とCI/CD構築を解説できたらと思います。


コメント