チュートリアル: マネージ ID と SQL バインドを使用して Azure SQL に関数アプリを接続する

Azure Functions は、Azure SQL Database やその他の Azure サービスへのアクセスをセキュリティ保護するためのターンキー ソリューションであるマネージド ID を提供しています。 マネージド ID を使用すると、接続文字列内の認証情報などのシークレットをアプリから排除することで、アプリのセキュリティを強化できます。 このチュートリアルでは、Azure SQL バインドを利用する Azure Function にマネージド ID を追加します。 SQL バインドを使用したサンプルの Azure Function プロジェクトを、ToDo バックエンドの例で入手できます。

このチュートリアルを終了すると、ユーザー名とパスワードを指定しなくとも、Azure Function を Azure SQL データベースに接続できるようになります。

実行する手順の概要は次のとおりです。

データベースへのアクセスを Azure AD ユーザーに許可する

まず、Azure AD ユーザーをサーバーの Active Directory 管理者として割り当てることで SQL データベースへの Azure AD 認証を有効にします。 このユーザーは、ご使用の Azure サブスクリプションのサインアップに使用した Microsoft アカウントと異なります。 Azure AD に作成、インポート、同期、または招待したユーザーである必要があります。 許可されている Azure AD ユーザーの詳細については、Azure AD の機能と SQL データベースの制限事項に関するセクションを参照してください。

Azure portal、PowerShell、または Azure CLI を使用して Azure AD 認証を有効にすることができます。 Azure CLI を使用した手順を以下に示します。Azure portal と PowerShell を使用してこれを完了する方法については、Azure AD 認証に関する Azure SQL のドキュメントを参照してください。

  1. Azure AD テナントにまだユーザーが作成されていない場合は、「Azure Active Directory を使用してユーザーを追加または削除する」の手順に従ってユーザーを作成します。

  2. az ad user list を使用して Azure AD ユーザーのオブジェクト ID を見つけます。az ad user list は置き換えてください。 結果は変数に保存されます。

    Azure CLI 2.37.0 以降の場合:

    azureaduser=$(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query [].id --output tsv)
    

    以前のバージョンの Azure CLI の場合:

    azureaduser=$(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query [].objectId --output tsv)
    

    ヒント

    Azure AD 内のすべてのユーザー プリンシパル名の一覧を表示するには、az ad user list --query [].userPrincipalName を実行します。

  3. Cloud Shell で az sql server ad-admin create コマンドを使用して、この Azure AD ユーザーを Active Directory 管理者として追加します。 次のコマンドで、server-name> を、サーバー名 (.database.windows.net サフィックスなし) に置き換えます。

    az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    

Active Directory 管理者の追加の詳細については、サーバーの Azure Active Directory 管理者のプロビジョニングに関するセクションを参照してください。

Azure Function でシステム割り当てマネージド ID を有効にする

この手順では、システム割り当て ID を Azure Function に追加します。 後の手順で、この ID に SQL データベースへのアクセス権が付与されます。

Azure portal でシステム割り当てマネージド ID を有効にするには

  1. 通常どおり、ポータルで Azure Function を作成します。 ポータルでアプリに移動します。
  2. 左側のナビゲーションで、[設定] グループまで下にスクロールします。
  3. [ID] を選択します。
  4. [システム割り当て済み] タブで、 [状態] を [オン] に切り替えます。 [保存] をクリックします。

関数アプリのシステム割り当て ID を有効にする

Azure CLI または PowerShell を使用してシステム割り当てマネージド ID を有効にする方法については、Azure Functions でのマネージド ID の使用に関する詳細を確認してください。

ヒント

ユーザー割り当てマネージド ID の場合は、[ユーザー割り当て] タブに切り替えます。[追加] をクリックし、マネージド ID を選択します。 ユーザー割り当てマネージド ID を作成する方法の詳細については、「ユーザー割り当てマネージド ID の管理」を参照してください。

SQL データベースへのアクセスをマネージド ID に付与する

この手順では、Azure AD ユーザー アカウントを使用して SQL データベースに接続し、データベースへのアクセスをマネージド ID に付与します。

  1. 任意の SQL ツールを開き、Azure AD ユーザー アカウント (管理者として割り当てた Azure AD ユーザーなど) でログインします。 これは、Cloud Shell で、SQLCMD コマンドを使用して実行できます。

    sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  2. 対象のデータベースの SQL プロンプトで次のコマンドを実行して、自分の関数にアクセス許可を付与します。 たとえば、次のように入力します。

    CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
    GO
    

    identity-name> は、Azure AD のマネージド ID の名前です。 ID がシステムによって割り当てられる場合は常に、関数アプリと同じ名前になります。

Azure Function SQL 接続文字列を構成する

最後の手順では、Azure AD マネージド ID 認証を使用するように Azure Function SQL 接続文字列を構成します。

SQL の入力バインドの属性と注釈に示されているように、接続文字列の設定名は、関数コードでバインド属性 "ConnectionStringSetting" として識別されます。

関数アプリのアプリケーション設定で、SQL 接続文字列の設定を次の形式に更新する必要があります。

Server=demo.database.windows.net; Authentication=Active Directory Managed Identity; Database=testdb

testdb は接続先のデータベースの名前で、demo.database.windows.net は接続先のサーバーの名前です。

ヒント

ユーザー割り当てマネージド ID には、Server=demo.database.windows.net; Authentication=Active Directory Managed Identity; User Id=ClientIdOfManagedIdentity; Database=testdb を使用します。

次のステップ