はじめに
マネージド ID を使用して Azure Functions から Azure SQL Database へ接続を試みましたが、少し難しかったので手順をまとめてみます。
既に丁寧に解説されているブログ等もありますが、一度やってみるまでは理解が追いつかないところがあったのでより細かな手順にまとめました。
以下のような連携を行います(マイクロソフトの公式絵に注釈を加えました)
(公式絵のURL)
"Azure リソースのマネージド ID の理解" と "マネージド ID を使用して Azure Functions から Azure SQL Database へ接続する" の2部構成です。
Azure リソースのマネージド ID の理解
Azure リソースのマネージド ID の ユースケース
Functions や app service から Azure ストレージ、 Azure SQL server へ資格情報の管理無しでアクセスする際に利用
マネージド ID、 サービスプリンシパル、 アプリケーション、クライアント などの整理
-
アプリケーション == クライアント
- Azure AD == サーバー なので、identity を提供する アプリケーションがクライアント という関係になる
-
内部的には、マネージド ID は特別な種類のサービス プリンシパル
-
システム割り当てマネージド ID で発行される オブジェクト ID = (サービス)プリンシパル ID
-
今のところ サービスプリンシパル は アプリケーション用の identity と理解している
-
アプリケーションとサービス プリンシパルは 1 対 1 で対応している
-
サービス プリンシパルとアプリケーションはアプリケーション ID で紐づいている
-
マネージド ID の確認方法
- Azure portal で Azure Active Directory のリソースを選択
- メニューから "エンタープライズ アプリケーション" を選択
- "すべてのアプリケーション" からアプリケーションの種類 == マネージド ID で絞り込む
-
マネージド サービス ID と Azure 仮想マシン (VM) が連携する様子
参考資料
マネージド ID を使用して Azure Functions から Azure SQL Database へ接続する
- 任意の関数アプリを deploy する
- server less プラン で問題無し
- 今回は "functions-sql-managedid" という名前で作成
- Functions に システム割り当てマネージド ID を割り当てる
- オブジェクト (プリンシパル) ID をメモしておく
- Azure Active Directory へ行き "マネージド ID の確認方法" で記載した方法でマネージド IDとアプリケーションIDの紐付きを確認しておく
- SQL server を作成する
- SQL Server の Azure Active Directory 管理者が自身のユーザアカウントであることを確認する
- Functions の マネージド ID に SQL Server への適切なロールを割り当てる
- SQL データベースのこちら↓から Azure Data Studio へアクセス
- ユーザーを追加する
-
CREATE USER "functions-sql-managedid" FROM EXTERNAL PROVIDER;
- "functions-sql-managedid" は アプリケーション名 (functions のマネージドID)と一致するはず
EXEC sp_addrolemember 'db_datareader', "functions-sql-managedid";
EXEC sp_addrolemember 'db_datawriter', "functions-sql-managedid";
- 以下クエリで追加されたことを確認する
SELECT * FROM sys.database_principals where name = 'functions-sql-managedid'
-
- テーブルを作成してみる
CREATE TABLE "functions-sql-managedid.test"(id NCHAR(5) PRIMARY KEY, name NVARCHAR(256))
-
select * FROM "functions-sql-managedid.test";
を実行してみる。
- DB に接続するための準備ができたのでコードを実行してみる
- こちらの Python コードで接続を試してみてそのまま動かすことができました
- 上記コードは "マネージド サービス ID と Azure 仮想マシン (VM) が連携する様子" の 5 - 7 に相当します。
参考
以上です。