今回は AWS Lambda と Amazon API Gateway を使って、
ブラウザから直接アクセスできるシンプルな Web API を構築する手順を解説します。
サーバーの用意やミドルウェアのインストールは一切不要です。AWSコンソールの操作だけで、数十分後には世界中からアクセスできる自分専用のAPIが完成します。
今回ご紹介する内容はすべてAWSの無料利用枠の範囲内で完結しますので、コストを気にせず試していただけます。
目次
前提条件
本ハンズオンを進める上での前提としては以下になります。
・AWSアカウントを保有していること
・AWSマネジメントコンソールの基本操作ができること
・Lambda、API Gatewayについては初めてでも問題ありません
本記事では学習用途として、あえて認証機能を追加しないシンプルな構成で進めます。
実際の業務システムに組み込む際の認証方式については、以下の記事で解説していますので、あわせてご参照ください。
Amazon Cognitoによる認証をALBに連携
1.事前準備(課金防止のBudget設定)
本ハンズオンで利用するサービスはすべて無料利用枠の範囲内で完結しますが、念のため予期せぬ課金を検知できるよう、AWS Budgetsでアラートを設定しておきます。
AWSコンソール右上のアカウント名⇒「請求とコスト管理」⇒左メニューの「Budgets」⇒「予算を作成」を選択
テンプレートは「ゼロ支出予算」を選び、通知先メールアドレスを登録して作成します。
これで少しでも課金が発生した際に、メールで即座に検知できるようになります。
2.Lambda関数の作成
AWSマネジメントコンソールで「Lambda」と検索し、Lambdaの画面を開きます。
リージョンはどこでも問題ありませんが、今回は「アジアパシフィック(東京)ap-northeast-1」を選択しています。
「関数の作成」を選択

以下の通り入力し、「関数の作成」を選択
関数名:test-api(任意の名前でも問題ありません)
ランタイム:Python 3.11以上(今回は最新バージョンを選択)
実行ロール:基本的なLambdaアクセス権限で新しいロールを作成

3.コードの実装とデプロイ
1.コードの貼り付けとデプロイ
関数が作成されたら「コード」タブを選択し、デフォルトで入っているコードをすべて削除して、以下のコードを貼り付けます。
import json
from datetime import datetime, timezone, timedelta
def lambda_handler(event, context):
try:
# GETのクエリパラメータからnameを取得
params = event.get("queryStringParameters") or {}
name = params.get("name", "AWS初心者")
JST = timezone(timedelta(hours=+9), 'JST')
current_time = datetime.now(JST).strftime("%Y-%m-%d %H:%M:%S JST")
response_data = {
"message": f"こんにちは、{name}さん!Lambdaへようこそ!",
"timestamp": current_time,
"status": "success"
}
return {
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*"
},
"body": json.dumps(response_data, ensure_ascii=False)
}
except Exception as e:
print(f"エラー発生: {str(e)}")
return {
"statusCode": 500,
"body": json.dumps(
{"error": "処理中にエラーが発生しました"},
ensure_ascii=False
)
}
コードを貼り付けたら、必ず「Deploy」を選択します。

画面上部に「関数 “test-api” が正常に更新されました。」と表示されれば、デプロイは完了です。
注意 コードを修正した際は、その都度Deployを選択しないと変更が反映されませんのでご注意ください。

2.Lambdaコンソールでの単体テスト
API Gatewayと接続する前に、まずLambda関数単体で正しく動作するかを確認しておきます。
「テスト」タブを選択し、「新しいイベントを作成」を選択、以下のイベントJSONを入力します。
{
"queryStringParameters": {
"name": "太郎"
}
}
このJSONは、後ほどブラウザから?name=太郎というパラメータを付けてアクセスした場合と同じ状況を、Lambda単体で再現したものです。API Gatewayを経由すると、URLのクエリパラメータは自動的にこのqueryStringParametersという形式に変換されてLambdaに渡されます。

右上の「テスト」を選択し、実行結果を確認します。

「実行中の関数:成功」と表示され、statuscodeが200、bodyの中に指定した名前を含むメッセージが含まれていれば成功です。
なお、bodyの中身は\”message\”: \”…\”のようにエスケープされた文字列として表示されますが、これは仕様通りの正常な動作です。
Lambda関数内でjson.dumps()によりJSON文字列として生成されているためで、後ほどブラウザからアクセスすると、整形された読みやすいJSON形式で表示されます。
Lambda単体での動作確認ができました。次はいよいよ外部からアクセスできるように公開します。
4.API Gatewayの統合
Lambda関数の画面上部にある「+ トリガーを追加」を選択
以下の通り設定し、「追加」を選択
ソース:API Gateway
インテント:新規APIを作成
APIタイプ:HTTP API
セキュリティ:オープン
追加の設定⇒オリジン間リソース共有(CORS):チェックを入れる
注意 今回は学習用途のためセキュリティを「オープン」にしていますが、実務では必ず認証の追加を検討してください。

追加が完了すると、「設定」タブ⇒「トリガー」に以下のようにAPIエンドポイントが表示されます。このURLは後ほど使用しますので、メモしておきます。

5.ブラウザでの動作確認
画面に表示されているAPIエンドポイントのURLをコピーし、ブラウザの新しいタブに貼り付けます。
さらに、URLの末尾に?name=太郎のように付け足してアクセスします。
【入力例】
(コピーしたAPIエンドポイントURL)?name=太郎
以下のようなJSONが画面に表示されれば成功です。

ブラウザにJSONが表示されただけのシンプルな結果ですが、この裏側ではサーバーの構築や管理を一切行うことなく、世界中からアクセス可能なAPIが自動でスケーリングしながら稼働しています。これがサーバーレスの大きな価値です。
6.セキュリティに関する考慮事項
今回はセキュリティを「オープン」に設定しているため、URLを知っていれば誰でもアクセスできる状態です。ただし、以下の理由から学習用途における現実的なリスクは低いと考えられます。
・APIエンドポイントのURLはランダムな文字列を含んでおり、第三者が推測することは困難
・レスポンス内容は挨拶メッセージのみであり、攻撃者にとって価値がない
・Budgetアラートにより、想定外の利用が発生した場合も即座に検知可能
より安全に運用したい場合は、API Gatewayの「スロットリング」設定で秒間リクエスト数を制限したり、Lambdaの同時実行数に上限を設定することも有効です。
7.コストについて
今回のハンズオンで利用したサービスの無料枠と、実際の想定使用量は以下の通りです。
| サービス | 無料枠 | 想定使用量 | 費用 |
|---|---|---|---|
| AWS Lambda | 月100万リクエスト(永続) | 数十〜数百回 | 0円 |
| API Gateway(HTTP API) | 月100万リクエスト(12ヶ月間) | 数十〜数百回 | 0円 |
| CloudWatch Logs | 5GB(永続) | 数MB程度 | 0円 |
今回のハンズオンで数十回程度アクセスを試す範囲であれば、いずれのサービスも無料利用枠を大きく下回るため、費用は一切発生しません。
(参考)ハマったポイント
一通りの設定完了後、ブラウザからAPIエンドポイントにアクセスしたところ、以下のようなエラーが表示されました。
{"message":"Not Found"}
切り分けた結果、APIエンドポイントのURLを手入力した際に、末尾のパス部分を書き間違えていたことが原因と判明しました。
注意 URLは手入力せず、Lambdaの「トリガー」画面に表示されているものをそのままコピーして使用することで、この種のミスを防げます。
また、コードを修正した後に「Deploy」を押し忘れ、修正前の古いコードのまま実行されてしまうケースもありましたので、コード変更後は必ずDeployを行ったか確認する習慣をつけると安心です。
(参考)リソースの削除
ハンズオン完了後、今後このAPIを使用する予定がなければ、以下の順番でリソースを削除しておくと安心です。
・API Gateway:作成したAPIを削除
・Lambda:test-api関数を削除
・IAM:自動作成された実行ロールを削除
まとめ
今回はAWS LambdaとAPI Gatewayを使って、ブラウザから直接アクセスできるシンプルなAPIを構築する手順を解説しました。
サーバーの管理を一切行うことなく、数十分でインターネット上に公開されたAPIが完成することを体感いただけたかと思います。
今回作成したLambda関数は非常にシンプルな構成ですが、これがサーバーレスアーキテクチャの基本形です。
Lambda関数の中身を書き換えるだけで、データベースへのアクセスやAI機能の統合など、さまざまな機能に発展させることができます。
引き続き、このLambda関数をベースにした応用ハンズオンを発信していく予定ですので、ぜひご期待ください。
なお、今回は学習用途としてあえて認証を追加しない構成としましたが、実際の業務システムに組み込む際は認証機能の追加が重要です。
Amazon CognitoとALBを組み合わせた認証基盤の構築については、以下の記事もあわせてご参照ください。
Amazon Cognitoによる認証をALBに連携


コメント