LambdaとDynamoDBを活用したサーバレスアーキテクチャの構築

awsアプリケーション開発

こんにちは、ITエンジニアのz_a_k_iです!^^

今回はLambdaでDynamoDBのデータを取得しクライアントへ返却するWebアプリを作成します。

以下の記事でLambdaを利用したWebアプリを作成してます。今回はこちらで作成したWebアプリをベースに、DynamoDBと連携したサーバレスアプリケーションを作成します。

Amazon DynamoDBとは

Amazon DynamoDBは、AWSが提供するフルマネージドのNoSQLデータベースサービスです。

このデータベースは、キーと値のペア、またはドキュメントとしてデータを格納することができます。

DynamoDBは、高い可用性と拡張性を持ち、大量のデータとトラフィックを処理する能力があります。

サーバーレスアーキテクチャとの組み合わせでよく使用されるデータベースです。

LambdaとDynamoDBを連携したサーバレスプログラミング

作成するWebアプリ

以下のWebアプリを作成していきます。

Webアプリの見た目は前回と同様で、内部的なデータ取得先がDynamoDBとなります。

DynamoDBでのテーブル作成

マネジメントコンソール上でデータを保管するテーブルを作成します。DynamoDBのメニューを開き「テーブルの作成」ボタンをクリックします。

DynamoDBのテーブルにはキーとなるパーティションキーを設定する必要があります。

今回はテーブル名に「user-table」、パーティションキーに「id」を指定します。

DynamoDBはNoSQL型のデータベースであるため、パーティションキー以外の項目は自由に登録できます。

DynamoDBのモードとして、読み書き数を事前に設定する「プロビジョンド」と読み書き数を事前に設定しない「オンデマンド」というモードがあります。検証の間しか読み書きしないため、今回は「オンデマンド」で作成します。

その他の項目はデフォルトのまま、「テーブルの作成」ボタンをクリックします。

以下画面になればテーブルの作成が成功してます。

作成したテーブルにデータを追加しておきます。

マネジメントコンソールからデータを追加します。作成したテーブルを選択し、「項目を作成」ボタンをクリックします。

今回はデータが少ないので、マネジメントコンソール上で以下のようにデータを作成していきます。

Lambdaの作成

以前の記事で作成したサーバレスアプリケーションをベースに作成します。

前回の状態は以下となってます。データはLambda上で保持しています。

今回は上記のデータをDynamoDBから取得するように以下のコードに変更します。

import json
import boto3

# DynamoDBリソースを作成
dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):
    # フロントエンドから送信されたidを取得
    name_to_search = event['queryStringParameters']['name']
    
    # 'user-table'テーブルを指定
    table = dynamodb.Table('user-table')
    
    # DynamoDBから全データを取得
    response = table.scan()
    users_data = response["Items"]
    
    # 前方一致するユーザーデータを検索
    matching_users = [user for user in users_data if user['name'].startswith(name_to_search)]
    
    # 結果を返却
    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'application/json'
        },
        'body': json.dumps(matching_users)
    }

デフォルトだとLambdaからDynamoDBにアクセスする権限がないため、処理が失敗します。


↓エラー内容

  "errorMessage": "An error occurred (AccessDeniedException) when calling the Scan operation: User: arn:aws:sts::xxxxxx:assumed-role/getUserData-role-3wecocu1/getUserData is not authorized to perform: dynamodb:Scan on resource: arn:aws:dynamodb:ap-northeast-1:xxxxx:table/user-table because no identity-based policy allows the dynamodb:Scan action",

以下手順でLambdaからDynamoDBにアクセスできる権限を設定していきます。
「設定」タブをクリックし、「アクセス権限」を選択します。

ロール名をクリックし、IAMのサービスに移動します。
「許可を追加」ボタンをクリックすると、メニューが表示されるので「ポリシーをアタッチ」を選択します。

今回は検証なので、DynamoDBへのフルアクセスを許可します。

作成したLambdaの実行確認

Lambda上でテストを実行します。
イベントJSONには前回と同様に以下の値を設定します。

{
  "queryStringParameters": {
    "name": "山田"
  }
}

正常終了となり、以下の画面が表示されれば成功です。

Lambdaの公開

API Gatewayのデプロイ

API Gatewayを再度デプロイします。デプロイの方法は前回の記事を参照ください。

Lambdaを呼び出すフロントエンド

フロントエンドアプリの変更

今回は、Lamdbaのデータ取得先をDynamoDBに変更する修正であるため、フロントエンドアプリは変更しません。

前回と同様のコードで実行します。

Webアプリのテスト

フロントエンドアプリを起動し、画面操作を行います。

検索結果が表示されれば成功です。

まとめ

LambdaとDynamoDBを連携したWebアプリのまとめ

本記事では、AWS LambdaとDynamoDBを利用したWebアプリの構築方法を紹介しました。

Lambda、DynamoDBはサーバーレスサービスであるため、インフラの構築なく簡単にWebアプリを構築することができます。

今後は本記事の内容をベースに、データの登録、更新や画面の見た目などを整え実用的な本格的なWebアプリの構築をご紹介していきます。

皆様の参考になりましたら幸いです。

コメント

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