どうして RDS と DynamoDB は接続方法が異なるのか?
こんにちは!Koty-Mousa 矢坂幸太郎です!
先日 11月9日、VRChatで開催されている ITインフラ集会 に登壇してきました!
登壇レポートは、後日公開予定です。
本日は、その中でいただいた質問について、改めて確認しましたので、ブログにまとめました!
質問
RDS と DynamoDB は、どちらもデータベースサービスなのに、どうしてこんなに接続方法が違うのですか?
ご質問ありがとうございました。当日はうまくお答えできず、申し訳ございませんでした。
また、この質問に補足いただいた参加者の方、ありがとうございました。
私が登壇でお伝えしたのは、EC2 インスタンスとの接続方法について、いくつかのサービスの例を使ってお伝えしました。
RDSは、基本的にEC2と同じVPCに配置し、セキュリティグループの設定を、EC2-RDS間の通信を許可するように設定します。
DynamoDBは、VPCに所属せず、VPCエンドポイントを用いて VPC内のEC2インスタンスと接続します。
確かに、どちらもデータベースサービスなのに、接続方法は大きく異なりますね...
詳しく調査してみました!
概要を比べよう
まずは、両サービスの違いを表でまとめてみます。
項目 | 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 : 3306
・PostgreSQL : 5432
・Oracle: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: #ここでパスワードを入力・安全のため表示されません
これにより、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 テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。