どうして RDS と DynamoDB は接続方法が異なるのか?

どうして RDS と DynamoDB は接続方法が異なるのか?

こんにちは!Koty-Mousa 矢坂幸太郎です!
先日 11月9日、VRChatで開催されている ITインフラ集会 に登壇してきました!

https://x.com/Koty_Mousa/status/1856550199507988913?t=WOxsCgUR7iSmn9_DM6nPkQ&s=19

登壇レポートは、後日公開予定です。

本日は、その中でいただいた質問について、改めて確認しましたので、ブログにまとめました!

質問

RDS と DynamoDB は、どちらもデータベースサービスなのに、どうしてこんなに接続方法が違うのですか?

ご質問ありがとうございました。当日はうまくお答えできず、申し訳ございませんでした。
また、この質問に補足いただいた参加者の方、ありがとうございました。

私が登壇でお伝えしたのは、EC2 インスタンスとの接続方法について、いくつかのサービスの例を使ってお伝えしました。

RDSは、基本的にEC2と同じVPCに配置し、セキュリティグループの設定を、EC2-RDS間の通信を許可するように設定します。

ITインフラ11_9新 (1)

DynamoDBは、VPCに所属せず、VPCエンドポイントを用いて VPC内のEC2インスタンスと接続します。

ITインフラ11_9新

確かに、どちらもデータベースサービスなのに、接続方法は大きく異なりますね...
詳しく調査してみました!

概要を比べよう

まずは、両サービスの違いを表でまとめてみます。

項目 RDS DynamoDB
EC2との
接続方法
DBドライバーでプログラム接続
(mysql-connector-python等)
AWS SDKを使用
(boto3, aws-sdk等)
アーキテクチャ インスタンスベース
(VPC内に存在)
サーバーレス
(VPC外のAWSマネージドサービス)
接続プロトコル TCP/IP HTTPS
接続方法 TCP/IP直接接続 HTTPS/APIを介した接続
認証方式 ユーザー名/パスワード または IAM認証 ※1 IAM認証
(アクセスキー、IAMロール等)
通信経路 VPC内での直接通信
(同一VPCの場合 ※2)
VPCエンドポイント / パブリックエンドポイント経由
接続先 DBインスタンスのエンドポイント
例:xxx.rds.amazonaws.com
リージョン別のサービスエンドポイント
例:dynamodb.ap-northeast-1.amazonaws.com

(※1) IAM認証は MariaDB, MySQL, PostgreSQL が対応しています
なお、本記事では パスワード認証を使用しています。
参照:MariaDB、MySQL、および PostgreSQL の IAM データベース認証 - Amazon Relational Database Service

(※2)EC2とRDSが同一VPCに配置されていない、他の接続パターン(パブリックエンドポイントを使用する等)では異なる場合があります。


RDSは、従来から利用されている「サーバ上にRDBMSを構築する」リレーショナルデータベースの仕組みをAWS上でRDSインスタンスとして実現しています。
EC2とは別のサービスですが、実際のところEC2とよく似た仕組みで動作しており、VPCに属してTCP/IPで接続します。
そのため、接続の際はセキュリティグループでRDBMSが利用するポートの通信を許可する必要があります。デフォルトでは、MySQL : 3306PostgreSQL : 5432Oracle:1521 です。

DynamoDBは、『サーバーレスのフルマネージド NoSQL データベース』つまり、AWSが設計した独自のサービスです。
サーバーレスのため、'インスタンス'の概念がなく、VPCには属しません。
皆様が普段利用する Webサービスでは、どこにサーバがあるか意識することは少ないと思いますが、それに似ています。
アクセスはHTTPS経由でのAWS API呼び出しによって行われ、EC2インスタンスから接続する場合は、適切なIAMポリシーが設定されたIAMロールをアタッチする必要があります。

接続方法

続いて、接続した後のEC2に入力するコマンドを踏まえて、接続方法を確認します。

RDSは、次のようなコマンドで接続します
(パスワード認証を行います)

mysql -h [RDSのDNSホスト名] -P 3306 -u [ユーザー名] -p [データベース名]

このコマンドは、オンプレミスでも大きく変わりません。
オンプレミスでは、DNSホスト名ではなく IPアドレスで接続することが多いですが、EC2でもIPアドレスで技術上は接続可能です (強く非推奨です)

本コマンドで接続した後は、対話型コマンド(CREATE TABLE / SELECT など)を入力して操作します。


一方で、DynamoDB の場合、SQLのような対話型コマンドを使用しません。
まず、接続されている DynamoDB テーブル一覧を取得するコマンドです

aws dynamodb list-tables

次のような結果が表示されます

[ec2-user@ip-XX-XX-XX-XX ~]$ aws dynamodb list-tables
{
    "TableNames": [
        "ToDoTable"
    ]
}

ここには、ToDoTableというテーブルが存在することがわかります。
(このテーブルは事前にマネジメントコンソールから作成しています)

ちなみに、テーブルに項目を追加するには、下記のようなスクリプトを実行します。
import boto3
import uuid
from datetime import datetime

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('ToDoTable')

todo_item = {
    'todo_id': str(uuid.uuid4()),
    'created_at': datetime.now().isoformat(),
    'title': 'DynamoDB学習',
    'description': 'DynamoDBの基本操作を学習する',
    'status': 'pending',
    'due_date': '2023-12-31',
    'user_id': 'user123'
}
table.put_item(Item=todo_item)

(このコードは完全ではありません。説明のために簡略化しています。ご了承ください。)

注目していただきたい点として、RDS は mysql 等 RDBMSのコマンドを、DynamoDB は aws コマンドを用いて APIを用いたアクセスを行うという違いです。

RDSとDynamoDBでは、データベースへのアクセス方法が大きく異なる点にご注目ください。RDSの場合は、MySQL(mysql)やPostgreSQL(psql)などの各RDBMSが提供する標準的なクライアントツールやコマンドを使用して直接アクセスします。
一方、DynamoDBは aws から始まる AWS CLI を使用してAPIベースでアクセスする必要があります。

(ここでは EC2 からの CLI 操作について説明しています。両サービス共に プログラム中から AWS SDK で接続することもありますが、ここでは省略します)

認証方式

合わせて、認証方式についても確認しましょう。

RDSは、ユーザ名とパスワードを使って認証できます。
これも、従来からのRDBMSと同様です。
先ほど紹介したコマンドで、ユーザ名を指定して、次にパスワードを入力するよう求められます

mysql -h [RDSのDNSホスト名] -P 3306 -u [ユーザー名] -p [データベース名]
Enter password:   #ここでパスワードを入力・安全のため表示されません

ITインフラ11_9新 (2)

これにより、RDSとの安全な接続を確立し、SQL操作できるようになります


DynamoDBは、IAM認証を行います。具体的には 接続先DynamoDBテーブルへのアクセス権限を持った IAMロールをアタッチされたEC2インスタンス などを使用します。

例えば、特定のテーブルのみに接続を許可する場合、下記のようなポリシーを設定します

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem",
                "dynamodb:Query",
                "dynamodb:Scan"
            ],
            "Resource": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/ToDoTable"
        }
    ]
}

認証方式については、RDSは ユーザ名とパスワード という RDBMS の方法をそのまま採用しており、DynamoDBは、IAM というAWS標準の認証認可システムを使用しています。

回答

ここまでの考察を踏まえて、『どうして RDS と DynamoDB は接続方法が異なるのか?』の質問への回答を、下記に記載します。

RDS は、オンプレミス向けに作られた仕組みを AWS上で利用できるサービスです。そのため、EC2との接続は TCP/IP(DNS または IPアドレス)で行います。AWSでは この仕組みを VPC で提供しています。インスタンスをユーザが管理するなど、EC2 とよく似ている点が多いです。
このため、RDSは EC2 と同じ VPC に属する仕組みで接続します。

DynamoDBは、AWS が AWS のために設計したサービスです。EC2 や RDS のように、インスタンスをユーザが管理せず、AWSが管理します。自動的に リージョン内のAZに分散して作成されます。
このため、VPC には属しません。ただし、EC2はVPC内に配置されているため、DynamoDB と EC2 を接続するために、VPCエンドポイントをVPCに作成して、EC2はVPCエンドポイントと通信することで接続します。


先日のイベントでは、うまく回答できませんでしたが、
こちらを回答と代えさせていただきます。

ご覧いただきありがとうございました!
Koty-Mousa 矢坂幸太郎がお伝えしました!


The avatar, logo and name of "Koty-Mousa 矢坂幸太郎" and "Clamerus, dev. by Koty-Mousa" (include inconsistent/abbreviation spelling) are owned and copyrighted by Koty-Mousa (individually).

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.