【超入門】DynamoDBのデータをWeb公開!AWSサーバーレス三種の神器(API Gateway, Lambda, DynamoDB)で動くAPIを構築

記事タイトルとURLをコピーする

1.はじめに

こんにちは、この度第二新卒で入社いたしました、元オンプレミスエンジニアの山本です。

学習として経験したクラウド環境の構築が、オンプレ時代と比べて圧倒的に速く、そしてシンプルであることに衝撃を受けました。

その感動を元に今回経験した構築の内容を初心者の方にも分かりやすくお伝えします!

1.1 この記事で紹介すること

この記事では、AWS DynamoDB上で登録したデータをAPI Gatewayを使用してお手元のWebブラウザで表示する方法を紹介します。

1.2 対象読者

とにかくAWSに興味がある人、データベースの動きやAPIの概念が「なんとなく」でもわかっている人

1.3 この記事で得られること

各サービスの役割の理解とサービス同士の結合部分の構成のイメージ。また、コンソール操作での実践経験

2.今回作成したもの(イメージ)

2.1 完成イメージ

APIGateway.png

2.2 各サービスの役割と連携(2.1 の解説)

  • API GatewayREST API を簡単に作成、公開、維持、監視できるサービス。今回はWebブラウザからのHTTPリクエストを受け取り、Lambdaに転送する役割を持つ。

    ※今回はデータの作成,読み取り,更新,削除といったCRUD操作が中心となっているので直感的に設計のできるRESTを選出。

  • Lambda:サーバーを管理せずにコードを実行できるサービス。API Gatewayからのリクエストを受けてDynamoDBからデータを取得する処理を行う。


  • DynamoDB:フルマネージド(AWS側で完全管理されている)なNoSQLデータベース。今回の役割はユーザーデータを登録・保存する場所。

3.実装手順

3.1 DynamoDBテーブルの作成

今回登録するデータベースは以下のような感じ。

UserID Name BirthPlace
0001 Sato Tokyo
0002 Suzuki Aichi
0003 Takahashi Saitama
0004 Tanaka Saitama

1. AWSコンソールにログインし、DynamoDBを選択して「テーブルの作成」を選択

2. テーブル名:UsersTable

 パーティションキー:UserID(文字列)

 テーブル設定:デフォルト設定

 それ以外はデフォルトのままでOK ※以下画像参照

CreateTable.png
3.左側メニュー「テーブル」を選択してテーブル名を確認し、テーブル名をクリック

clickTablename.png
4.「テーブルアイテムの選択」をクリック

choosetableitem.png

5.下側にスクロールし、「返された項目」欄の「項目を作成」をクリック

 ※今回は既に実行済みなのでデータが存在しているが本来は空のはず。

createitem.png

6.「新しい属性の追加」をクリックして属性(DBのフィールド)を追加してデータベースを参考にして値を入力して「項目を作成」をクリック 

※今回は属性を全て「文字列」で定義

createitem0001.png

7. 上記6の作業をデータの数だけ繰り返してデータベースを完成させる。

3.2 Lambda関数の作成

1.検索バーに「Lambda」と入力してサービスへ移動

2.左側のナビゲーションペインで「関数」を選択し、「関数の作成」ボタンをクリック

createFunction.png

3. 関数名:GetUsersDataFunction

 ランタイム:Python3.13

 アーキテクチャ:x86_64

 それ以外はデフォルトのままでOK ※以下画像参照

 下側にスクロールし、「関数を作成」ボタンをクリック。

CreateFunction2.png ※すでに関数は作成してあるので今回は関数名でエラー表示となっている

4.関数の一覧から作成した関数をクリックして詳細画面を表示し、「設定」タブの「アクセス権限」をクリックし、ロール名をクリックしてIAMに移動

functionAccesssetting.png

5.「許可」タグから「許可を追加」をクリックして「ポリシーをアタッチ」を選択

rolesetting.png

6.「その他の許可ポリシー」欄の検索窓に「DynamoDBRead」と入力すると「AmazonDynamoDBReadOnlyAccess」が検索結果として表示されるのでチェックボックスをオンにして「許可を追加」ボタンをクリック。

attachpolicy.png ※今回はすでにアタッチ済み

7.Lambdaのウインドウに戻り、「コード」タブを選択してコードソースの画面を表示する。

Codesoure.png

8.コードエディタに以下のコードを貼り付ける。

import json
import boto3
from botocore.exceptions import ClientError

# DynamoDBクライアントを初期化
dynamodb = boto3.resource('dynamodb')
table_name = 'UsersTable'
table = dynamodb.Table(table_name)

def lambda_handler(event, context):
    try:
        # DynamoDBから全ての項目を取得
        response = table.scan()
        items = response.get('Items', [])

        # DynamoDBから取得した項目をJSONで返すために整形
        for item in items:
                for key, value in item.items():
                    if isinstance(value, type(boto3.dynamodb.types.Decimal('0'))):
                        item[key] = float(value) # または int(value)

        return {
                'statusCode': 200,
                'headers': {
                    'Content-Type': 'application/json',
                    'Access-Control-Allow-Origin': '*', # CORS対応:どのオリジンからのアクセスも許可
                    'Access-Control-Allow-Methods': 'GET,OPTIONS',
                    'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'
                },
                'body': json.dumps(items, ensure_ascii=False) # 日本語対応
        }
    
    except ClientError as e:
        # DynamoDBクライアント関連のエラーハンドリング
        print(f"DynamoDB Client Error: {e.response['Error']['Message']}")
        return {
            'statusCode': 500,
            'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            },
            'body': json.dumps({'error': e.response['Error']['Message']})
        }
    except Exception as e:
        # その他の一般的なエラーハンドリング
        print(f"General Error: {e}")
        return {
            'statusCode': 500,
            'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            },
            'body': json.dumps({'error': str(e)})
        }

9.コードエディタ内の「Deploy」ボタンをクリック

deproy.png

3.3API Gatewayの作成と設定

Lambda関数をHTTPエンドポイントとして公開するためのAPI Gatewayを作成します。

1.検索バーに「API Gateway」と入力してサービスへ移動

2.「APIの作成」をクリック startAPI.png

3.今回はREST APIで構築するのでREST API欄の「構築」をクリック

selectAPI.png

4. API名:UsersDataAPI

 説明:API for retrieving user data from DynamoDB

 その他はデフォルトでOK。「APIを作成」をクリック。

createAPI.png

5.作成完了したら自動的にAPI詳細ページになるので、ルートリソース(/)が選択されているのを確認して「リソースの作成」をクリック CreateResource.png

6.リソース名:usersとしてCORSにチェックをつけて「リソースを作成」をクリック

resourcesetting.png

7.コンソール上でリソース「users」が選択されていることを確認して「メソッドを作成」をクリック

createmethod.png

8.メソッドタイプ:GETとして、先程作成したLambda関数を設定し、下側にスクロールして「メソッドを作成」をクリック

methodsetting.png

9.適用されたらコンソールに戻るので、「APIをデプロイ」をクリック  この時、以下のようにステージの詳細を聞かれるのでステージ名はprodで作成する。

stagesetting.png

4.動作確認

手元のwebブラウザからAPIのエンドポイントにアクセスすることでLambda関数を動かし、帰ってきた値を見てみましょう。

1.AWSコンソール上でLambdaのページに遷移

2.サイドバーの「関数」より今回作成したGetUsersDataFunctionをクリックし、関連付けされているAPI Gatewayをクリックして設定画面を開く。

LambdaAPISet.png

3.APIエンドポイントをクリックしてWebブラウザからAPIエンドポイントへ接続

LambdaAPISet2.png

4.成功していれば、以下のようなデータが含まれる文字列が表示される。

[
  {
    "Name": "Sato",
    "UserID": "0001",
    "Birthplace": "Tokyo"
  },
  {
    "Name": "Suzuki",
    "UserID": "0002",
    "Birthplace": "Aichi"
  },
  {
    "Name": "Takahashi",
    "UserID": "0003",
    "Birthplace": "Saitama"
  },
  {
    "Name": "Tanaka",
    "UserID": "0004",
    "Birthplace": "Saitama"
  }
]

5.まとめ

今回の記事では、AWSの代表的なサーバーレスサービスである Amazon API Gateway、AWS Lambda、そして Amazon DynamoDB を連携させ、WebブラウザからDynamoDBのデータを参照できるシンプルなAPIを構築しました。

手動でのサーバー構築や管理を一切行わず、AWSコンソール上での設定と少量のPythonコードだけで、Webからアクセス可能なデータ取得APIが完成したことを体験いただけたかと思います。(元オンプレエンジニアの私も本当に感動しました)


今回作成した仕組みはデータの読み取りだけでしたが、この構成を応用すると

  • DB内のデータ更新と削除
  • ほかのAWSサービス(SQSやSNS)と連携しての非同期処理
  • チャットボットのバックエンド

のように様々な場面で応用できます。

サーバーレスな構成は、現代のWebアプリケーション開発において非常に強力なツールです。今回の経験を活かして、さらに様々なサーバーレスアプリケーションの構築に挑戦していきましょう!

山本 竜也 (記事一覧)

2025年度新入社員です!AWSについてはほぼ未経験なのでたくさんアウトプットできるよう頑張ります✨