亀のコツコツクラウドインフラ

2025年1月26日

API Gateway×LambdaでREST APIを構築する方法を解説!

はじめに

以下のような方におすすめの内容です。

  • AWSでAPIを作ってみたい
  • サーバレスに興味がある

この記事ではAPI GatewayとLambdaを使用して、APIでLambda関数を実行する方法をご紹介します。
最後にDynamoDBでレコードを追加して動作確認を行います。

DynamoDBが何かわからない場合はHello Worldの文字を表示させましょう。

設定手順

IAMロールの作成

IAMロールで使用するサービスにLambdaを設定して、以下のポリシーを付与します。

  • AmazonDynamoDBFullAccess
  • CloudWatchLogsFullAccess

ロール名はdynamodb_access_roleにしています。

IAMロールの作り方は以下の記事を参考にしてください。

AWS IAMロールとは?初心者向けの説明と設定手順をご紹介!

Lambda関数の作成

Lambda関数を作成します。

Lambdaについて知りたい方は以下の記事を参考にしてください。

【初心者向け】Lambdaを使ってみよう!AWSでサーバーレス環境を構築する方法

Lambda関数には以下の設定で作成していきます。

  • 関数名:dynamoInsertTestAPIGateway
  • ランタイム:Python 3.13(2025年1月21日時点の最新)
  • アーキテクチャ:x86_64
  • ロール:dynamodb_access_role

PythonでDynamoDBにテーブルを挿入していくコードを記述します。

DynamoDBではkamecloud_dynamo_usersテーブルを作成しておきましょう。

DynamoDBについて知りたい方は以下の記事を参考にしてください。

【初心者必見】DynamoDBの設定手順と活用法!概要と具体的な使い方を解説

import json
import boto3

def lambda_handler(event, context):

    # わからない方は以下のコメントアウト外しましょう。
    # return {"statusCode": 200,"body": "Hello World."}

    dynamodb = boto3.client('dynamodb', region_name='ap-northeast-1')

    table_name = "kamecloud_dynamo_users"

    # 書き込みテスト
    try:
        dynamodb.put_item(
            TableName = table_name,
            Item = {
                'user_id': {'S': '100'},
                'user_age': {'N': '18'},
                'user_name': {'S': 'kame'}
            }
        )

        response_body = {"message": "Success"}
        status_code = 200
    except Exception as e:
        response_body = {"message": f"Failed: {str(e)}"}
        status_code = 500
    
    return {
        "statusCode": status_code,
        "body": json.dumps(response_body)
    }

REST APIの設定

API GatewayでREST APIを作成していきます。

API名はkamecloud-dynamo-testにします。

リソースの作成を行い、APIのエンドポイントをカスタマイズしておきます。
dynamoTestという名前にしています。

作成したリソースに対して、メソッドの作成を行っていきます。

使用量プランを設定していきます。

設定値は以下の設定で作成します。

  • 名前:DynamoTestUsedPlan
  • レート:5
  • バースト:20
  • リクエスト:1ヵ月あたり5000

CORSを有効にします。
CORSにしないと、API実行時にエラーなるので注意してください。

使用量プラン制限に必要なAPIキーを作成していきます。
APIキーはセキュリティを高くする意味合いもありますが、一番は使用量を図るために使用されます。

APIキーから「使用量プランに追加」という欄が表示されるので、作成したAPIキーを使用量プランに追加していきます。

APIキーを必須にしたら、使用量プラン設定が完了します。

最後に「APIをデプロイ」を行うと使用量制限があるAPIが作成できます。

デプロイしたら使用量プランでステージを関連付けましょう。

動作確認

動作確認でローカルからでもいいのでhtmlを作成して、以下のコードを実行してみましょう。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>API ゲートウェイテスト</title>
</head>
<body>
    <div id="response_data" style="margin-top: 20px;"></div>
  <script>
    const api_endpoint = "<APIのルートエンドポイント>/v1-kame-dev/dynamoTest";
    window.addEventListener('load', async () => {
      try {
        const res = await fetch(api_endpoint, {
          method: 'PUT',
          headers: {
            'Content-Type': 'application/json',
            'x-api-key': '<APIキー>'
          }
        });
        const response_data = await res.json();
        document.getElementById('response_data').innerHTML = `<pre>${JSON.stringify(response_data, null, 2)}</pre>`

      } catch (error) {
        console.error(error);
        document.getElementById('response_data').innerHTML = `<p style = "color: red;">${error.message}</p>`;
      }
    });
  </script>
</body>
</html>

実行して画面上で成功時のステータスが返ってきたらOKです。
DynamoDBにも挿入できているか確認しましょう。

失敗する場合は、CORSの設定をもう一度PUTにチェックを入れて有効にして、APIの現在使用しているステージをデプロイしてみてください。
つまづく人が多い点です。

それでも無理な場合は、APIキーの設定ができているか・エンドポイントは間違っていないか等をチェックしていきましょう。

API Gateway×Lambdaのユースケースとコスト

一部のアプリケーションとそれぞれのユースケースに対するコスト感をご紹介します。

小規模なWebアプリケーションのバックエンド

API GatewayがHTTPリクエストを受け取り、Lambdaがデータ処理を行い、必要に応じてDynamoDBやS3と連携。

コスト:月50万リクエスト程度のアプリケーションで数百円程度で運用が可能。

定期的な処理のトリガー

バッチ処理等でレポート・ファイル生成でCloudWatchやS3と連携が可能。

コスト:トリガー数が少ない場合、無料枠内でほとんどコストが発生しない。

サーバレスアプリケーションのAPI

チャットアプリやIoTデバイス管理APIをサーバレスで実現し、S3やDynamoDBをストレージとして活用。

コスト:大量のリクエストがある場合でも、Lambdaの最適化でコスト削減が可能。

まとめ

IAMロールの設定からLambda関数の作成、API Gatewayの利用まで、手順を追うことで簡単にサーバーレスなAPIを構築できます。

エラーが発生した場合は、CORS設定やステージのデプロイ、APIキーの設定を確認してみてください。

この記事が、AWSを使ったAPI開発の第一歩となれば幸いです。

この記事を書いた人

コツコツ亀

コツコツ亀

Webエンジニアとして活動中
AWSを使用してWebアプリケーションを作ったり、サーバーを構築したりしています。

関連記事

新着記事