やりたいこと
Azure の SQL Server/DB に Data Factory の System Assigned Managed ID で接続する方法をいろいろと調べて実現できたので、その内容をまとめます。
前提
- Azure のリソースは Terraform で作成する
- SQL Server の管理者として AAD で作成したグループを登録する
- 管理者としてアクセスできないと設定できないので
Terraform コード (参考)
実際のコードを一部改変しているため、正しく動作するかは未検証。参考程度に。
# Resource Group
resource "azurerm_resource_group" "my_rg" {
name = "rg-aad-connection"
location = "Japan East"
}
# AAD Group
resource "azuread_group" "grp_admin" {
display_name = "grp-aad-connection-admin'
owners = "user1@sample.co.jp"
members = "user1@sample.co.jp"
security_enabled = true
}
# SQL Server
resource "azurerm_mssql_server" "sql" {
name = "sql-aad-connection"
resource_group_name = azurerm_resource_group.my_rg.name
location = azurerm_resource_group.my_rg.location
version = "12.0"
administrator_login = "sqladmin"
administrator_login_password = "YOUR_SQLADMIN_PASSWORD"
azuread_administrator {
azuread_authentication_only = false
login_username = "AzureAD Admin"
object_id = azuread_group.grp_admin.object_id
}
}
# SQL DB
resource "azurerm_mssql_database" "sqldb" {
name = "sqldb-aad-connection"
server_id = azurerm_mssql_server.sql.id
auto_pause_delay_in_minutes = 60
collation = Japanese_CI_AS
max_size_gb = 2
min_capacity = 1
read_scale = false
sku_name = "GP_S_Gen5_2"
storage_account_type = "Local"
zone_redundant = false
}
# Data Factory
esource "azurerm_data_factory" "adf" {
name = "adf-aad-connection"
resource_group_name = azurerm_resource_group.my_rg.name
location = azurerm_resource_group.my_rg.location
identity {
type = "SystemAssigned"
}
}
SQL Server のリソース定義の azuread_administrator
ブロックによってサーバ管理者を設定している。
デフォルトだと、SQL 認証 (sqladmin) とこの AAD グループしか DB にログインできないので Data Factory から接続するには、Managed ID を DB のユーザとして作成する必要がある。
SQL DB 上での AAD ユーザ作成とロール割当
以下の公式ドキュメントを参考に行った。
DB へ接続して以下のクエリを実行する (db_datareader
は冗長かもしれない)。
# ユーザ作成
CREATE USER [adf-aad-connection] FROM EXTERNAL PROVIDER;
# ロール割当
ALTER ROLE db_datareader ADD MEMBER [adf-aad-connection];
ALTER ROLE db_datawriter ADD MEMBER [adf-aad-connection];
ALTER ROLE db_ddladmin ADD MEMBER [adf-aad-connection];
以上を行った後に、Data Factory Studio 上で、SQL DB への Linked Service を作成して、Test Connection してみると接続される!
ということで
SQL DB へ Data Factory から Managed ID で接続しました。今回は Data Factory からでしたが、他のリソース (Web Apps や Functions App など) でも同様に接続できるので、パスワードの管理などに悩まなくて済みそうです。
RBAC とは別のレイヤでの話になるので最初は?となりましたが、通常の SQL DB でのユーザ管理と一緒ですね。このあたりも全部 Azure 上の設定で完結できると良いなと個人的には思います。
以上です。