ツナ缶雑記

ぐうたらSEのブログです。主にマイクロソフト系技術を中心に扱います。

マネージド ID を使って App Service から SQL Database にアクセスする 後編

f:id:masatsuna:20200720021902p:plain

はじめに

前回に引き続き、システム割り当てマネージド ID 、ユーザー割り当てマネージド ID を用いて App Service に配置した Web Application から SQL Database にアクセスする方法を解説していきます。 今回は後編として、マネージド ID を使って App Service から SQL Database にアクセスできるよう、 Azure リソースの設定を行っていきます。

内容
前編 マネージド ID とは一体何かを概念的に解説し、それが Azure Portal 上でそれらがどのように見えるのか、具体的に解説します。
中編 ASP.NET の Web アプリケーションで システム割り当てマネージド ID 、ユーザー割り当てマネージド ID を取り扱う方法について解説します。
後編(本記事) Azure 上にアプリケーションを配置して、 App Service 上の Web アプリケーションから SQL Database にアクセスするまでの手順を解説します。

SQL Database の作成と設定

管理者用の Azure Active Directory ユーザーの作成

まずは SQL Database の管理者用として使用する Azure Active Directory のユーザーを作成します。 [Azure Active Directory] → [ユーザー] メニューを開き、 [すべてのユーザー] → [新しいユーザー] を選択します。

f:id:masatsuna:20200719235656p:plain
新しいユーザーの作成

今回は以下のような名前のユーザーを作成しておきました。

f:id:masatsuna:20200720000034p:plain
ユーザーの作成完了後

SQL Databaseの作成

次に SQL Database を作成します。 今回はサンプルなので、一番お安い SKU で作成しておきます。 ネットワーク設定は、前編で作成した App Service と、作業を行うローカルマシンから接続できるようにしておいてください。

Active Directory 管理者の設定

SQL Database は、ただ作成しただけだと Azure Active Directory を使ったログインが行えません。 これをできるようにするには、 SQL Database に対して、 Active Directory に存在するユーザーに対して管理者権限を割り当てる必要があります。 この作業は Azure Portal 上から実行できます。

まず先ほど作成した SQL Server のメニューから [Active Directory 管理者] のメニューを選択します。 [管理者の設定] ボタンを押下して、先ほど作成した Azure Active Directory 上のユーザーを選択します。 設定が完了したら、忘れずに [保存] ボタンを押下します。

f:id:masatsuna:20200720004340p:plain
Active Directory 管理者の選択

これで Azure Active Directory 上のユーザーを用いて SQL Database にアクセスできるようになりました。

データベースの初期化

続いて先ほど作成した Azure Active Directory のユーザーを使用して、 SQL Database に接続してみます。 今回はローカルマシン上にインストールした SQL Server Management Studio を使用します。

接続先の設定は以下のように行います。 ポイントは [認証] に [Azure Active Directory - MFA で汎用] を選択することです。 Azure Active Directory の方で MFA を有効にしていない場合も、これを選択します。

f:id:masatsuna:20200720004847p:plain
接続情報の設定

正常に接続できると、 SQL Server Management Studio の [オブジェクト エクスプローラー] は、以下のような表示になります。

f:id:masatsuna:20200720005247p:plain
接続完了後

ここでアプリケーションの使用するテーブルを作成しておきましょう。

マネージド ID をユーザーとして追加する

続いて、前編で作成した App Service のシステム割り当てマネージド ID と、ユーザー割り当てマネージド ID を、 SQL Database のユーザーとして追加します。 Azure Active Directory 上で、システム割り当てマネージド ID は App Service のリソース名である [app-demo0709] として登録されています。 またユーザー割り当てマネージド ID は、作成したリソースの名前である [uami-app-demo0709-01] 、 [uami-app-demo0709-02] として登録されています。 これらのユーザーを、 SQL Database でも利用できるように、以下の CREATE USER 文を実行します。

CREATE USER [app-demo0709] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [app-demo0709];
ALTER ROLE db_datawriter ADD MEMBER [app-demo0709];
GO

CREATE USER [uami-app-demo0709-01] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [uami-app-demo0709-01];
ALTER ROLE db_datawriter ADD MEMBER [uami-app-demo0709-01];
GO

CREATE USER [uami-app-demo0709-02] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [uami-app-demo0709-02];
ALTER ROLE db_datawriter ADD MEMBER [uami-app-demo0709-02];
GO

これでシステム割り当てマネージド ID 、ユーザー割り当てマネージド ID を使って SQL Database にアクセスする準備ができました。

App Service の設定

App Service に対して、マネージド ID を使って SQL Database にアクセスするための設定を行っていきます。 システム割り当てマネージド ID を使用する場合と、ユーザー割り当てマネージド ID を使用する場合で、設定方法が若干異なりますので、個別に解説します。

システム割り当てマネージド ID を使う場合

データベース接続文字列の設定をAzure Portal の App Service の [構成] から行います。 今回のアプリケーションは BooksDbContext という名前のデータベース接続文字列を使っているので、この値を Azure Portal で上書き設定します。

App Service の [構成] メニューを開き、 [アプリケーション設定] タブの下部にある [接続文字列] に、データベース接続文字列を定義します。 データベース接続文字列は、以下のようなフォーマットで作成します。 接続先のデータベース名を忘れずに入力するようにしましょう。

server=tcp:<server-name>.database.windows.net;database=<db-name>;UID=AnyString;Authentication=Active Directory Interactive

今回は以下のような設定となります。

f:id:masatsuna:20200720011606p:plain
データベース接続文字列の設定

設定を保存して再度アプリケーションにアクセスすると、データベースアクセスが正常に行われたことが確認できます。*1

f:id:masatsuna:20200720012116p:plain
実行結果

ユーザー割り当てマネージド ID を使う場合

ユーザー割り当てマネージド ID を使用する場合、どのユーザー割り当てマネージド ID をアプリケーションが使用するか設定を行う必要があります。 この設定方法には AppAuthentication の接続文字列を使用する方法と、データベース接続文字列に直接記述する方法があります。

AppAuthentication の接続文字列を使う方法

AppAuthentication の接続文字列を使う場合、接続文字列の設定はシステム割り当てマネージド ID の設定方法と変わりありません。 環境変数AzureServicesAuthConnectionString という名前のキーを定義して、そこにユーザー割り当てマネージド ID のクライアント ID を設定します。 App Service の場合、 Azure Portal の App Service の [構成] 画面から、 [アプリケーション設定] を追加することで、環境変数の代わりとすることができます。

ユーザー割り当てマネージド ID を使いたい場合、 AppAuthentication の接続文字列*2は以下のようなフォーマットとなります。 AppIdの部分に、ユーザー割り当てマネージド ID のクライアント ID 設定します、

RunAs=App;AppId={ClientId of user-assigned identity}

この例では、 uami-app-demo0709-01 のユーザー割り当てマネージド ID (クライアント ID が b1a7836c ... で始まるやつ)を使用するよう構成しています。 ユーザー割り当てマネージド ID のクライアント ID については、前編を参照してください。*3

f:id:masatsuna:20200720013234p:plain
AppAuthentication の接続文字列設定

設定を保存して再度アプリケーションにアクセスすると、データベースアクセスが正常に行われたことが確認できます。*4 実行結果は前述のものと同様なので割愛します。

データベース接続文字列を使う方法

データベース接続文字列を使う場合、前述した AppAuthentication の接続文字列は一切使用しません。 すでに前述の作業を行ってしまったいる場合は、 AzureServicesAuthConnectionString のアプリケーション設定を削除してから、以下の作業を行ってください。

データベース接続文字列に対してユーザー割り当てマネージド ID を組み込む場合、既に設定しているデータベース接続文字列を一部修正します。 設定済みのデータベース接続文字列には、 UID という名前の項目が入っていると思います。 この設定値は AnyString となっていますが、この値にユーザー割り当てマネージド ID のクライアント ID を設定します。

この例では uami-app-demo0709-02 のユーザー割り当てマネージド ID (クライアント ID が ab5a4564 ... で始まるやつ)を使用するよう構成しています。 ユーザー割り当てマネージド ID のクライアント ID については、前編を参照してください。

f:id:masatsuna:20200720014623p:plain
データベース接続文字列にユーザー割り当てマネージド ID のクライアント ID を設定する

設定を保存して再度アプリケーションにアクセスすると、データベースアクセスが正常に行われたことが確認できます。*5 実行結果は前述のものと同様なので割愛します。

まとめ

全 3 回にわたって、 App Service から SQL Database に対してマネージド ID を使用してアクセスする方法を解説してきました。 概念ややり方さえわかってしまえば、マネージド ID (特にユーザー割り当てマネージド ID )は非常に便利に活用できるものです。 徐々にマネージド ID に対応したサービスも増えてきていますので、今後はもっと使う場面も増えてくるかもしれませんね。

*1:設定を保存してから実際に反映されるまで若干タイムラグがあります。

*2:AppAuthentication の接続文字列については、以下を参照してください。 docs.microsoft.com

*3:[エンタープライズアプリケーション] の一覧画面では、 [クライアント ID ] は [アプリケーション ID ] と表記されています。

*4:設定を保存してから実際に反映されるまで若干タイムラグがあります。

*5:設定を保存してから実際に反映されるまで若干タイムラグがあります。