Geoレプリケーションを構成したAzure SQL DatabaseにContained Database Userを作成する
2020-03-04
azblob://2022/11/11/eyecatch/2020-03-04-geo-replication-contained-database-user-000.jpg

こんにちは。cloud.config Divの神田です。
今回はGeoレプリケーションを構成したAzure SQL DatabaseにContained Database Userを作成します。

Contained Database Userとは

通常のSQL Databseのユーザは masterデータベースにログイン(パスワードなどの認証情報)を作成したあと、ログインと紐づける形で作成します。
そのためSQL Serverにアクセスする際の認証はmasterデータベースで行われます。

一方、 Contained Database User(包含データベースユーザ)はmasterデータベースにログインを作成せず、
ユーザ自体がパスワードを持つことにより、masterデータベースではなく、
ユーザデータベースで認証を行います。

参考 : master Database
https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/master-database?view=sql-server-ver15

参考 : Contained Database Users - Making Your Database Portable
https://docs.microsoft.com/ja-jp/sql/relational-databases/security/contained-database-users-making-your-database-portable?view=sql-server-ver15

なぜ必要か?

Azure SQL DatabaseでGeoレプリケーションを構成した際、
プライマリとセカンダリでmasterデータベースは独立になりますが、
レプリケーション対象のユーザデータベースは登録されているユーザも含めて同期されてしまいます。
そのためmasterデータベースで認証を行う通常のユーザは
プライマリ、セカンダリでそれぞれ別個に必要になってしまいます。
これではフェールオーバーが発生した際に
ユーザ名とパスワードの不一致が発生してしまいます。

一方、Contained Database Userはmasterデータベースでの認証を行わず、
ユーザデータベースで認証を行うので、
プライマリ、セカンダリで認証情報も含めて同期されることにより、
確実に同じユーザ名、パスワードでアクセスすることが可能となります。
そのためGeoレプリケーションを構成したSQL Databaseでは一般的には
Contained Databse Userを使用します。

参考 : アクティブ geo レプリケーションの作成と使用 - 資格情報とファイアウォール規則の同期を保つ
https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-active-geo-replication#keeping-credentials-and-firewall-rules-in-sync

手順

1. Azure SQL Databaseでフェールオーバーグループを構成
2. プライマリSQL Serverに管理者でアクセス
3. Contaied Database Userを作成
4. セカンダリデータベースに作成したユーザでアクセスできることを確認

1. Azure SQL DatabaseでGeoレプリケーションを構成

事前にプライマリとなるSQL ServerとSQL Database、
セカンダリとなるSQL Serverを作っておきます。
AzureポータルでプライマリのSQL Serverから「フェールオーバーグループ」を選択し、
セカンダリとなるSQL Serverを選択しフェールオーバーグループを構成します。
これでGeoレプリケーションが構成されました。

フェールオーバーグループの構成

2. プライマリのSQL Serverに管理者でログイン

SQL Server Management Studio(SSMS)を用いて
プライマリのSQL Serverに管理者でログインします。

SSMSでプライマリにSQL Serverにログイン

3. Contaied Database Userを作成

レプリケーションを構成しているユーザデータベースに
Contaied Database Userを作成します。
今回は以下のクエリを用いて作成します。

CREATE USER 作成するユーザー名 WITH PASSWORD = '任意のパスワード';
GO
作成の様子
追加されたContained Database User

4. セカンダリデータベースに作成したユーザでログインできることを確認

セカンダリのSQL Serverに、先ほど作成したContaied Database Userでログインします。
なお、 Contaied Database Userはmasterデータベースでの認証を行わないので、
接続先のデータベースを指定する必要があります。
※オプション > 接続プロパティ > データベースへの接続 より指定

セカンダリのSQL Serverへのログイン
Contained Database Userでログインする際のオプション
セカンダリに同期されたContained Database User

終わりに

プライマリ、セカンダの両方にContained Database Userを作成することができました。
実際はユーザへの権限の付与も行いますが、今回は作成のみといたします。

メモ程度の内容ですが、今後も構築、運用のノウハウを記事にしていきたいと思います。