Share via


チュートリアル: マネージド ID を使用して Azure Spring Apps アプリから Azure Functions を呼び出す

注意

Azure Spring Apps は、Azure Spring Cloud サービスの新しい名前です。 サービスの名前は新しくなりましたが、スクリーンショット、ビデオ、図などの資産の更新に取り組んでいる間、場所によってはしばらく古い名前が表示されます。

この記事の適用対象: ✔️ Basic または Standard ✔️ Enterprise

この記事では、Azure Spring Apps でホストされたアプリ用のマネージド ID を作成し、それを使用して HTTP によってトリガーされる関数を呼び出す方法を説明します。

Azure Functions と App Services には、どちらも Microsoft Entra 認証の機能が組み込まれています。 この組み込みの認証機能と併せて、Azure Spring Apps のマネージド ID を使用することで、最新の OAuth のセマンティクスを使用して RESTful サービスを呼び出すことができます。 この方法では、シークレットをコード中に保存する必要がなく、外部リソースへのアクセスに対し、より粒度の細かい制御が可能となります。

前提条件

リソース グループを作成する

リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 次のコマンドを使用して、関数アプリを格納するリソース グループを作成します。

az group create --name <resource-group-name> --location <location>

詳細については、az group create コマンドに関するページを参照してください。

関数アプリを作成する

関数アプリを作成するには、最初にバッキング ストレージ アカウントを作成する必要があります。 az storage account create コマンドを使用できます。

重要

関数アプリとストレージ アカウントには、それぞれ一意の名前が必要です。

次のコマンドを使用して、ストレージ アカウントを作成します。 <function-app-name> は実際の関数アプリの名前に置き換え、<storage-account-name> は実際のストレージ アカウントの名前に置き換えてください。

az storage account create \
    --resource-group <resource-group-name> \
    --name <storage-account-name> \
    --location <location> \
    --sku Standard_LRS

ストレージ アカウントが作成されたら、次のコマンドを使用して関数アプリを作成します。

az functionapp create \
    --resource-group <resource-group-name> \
    --name <function-app-name> \
    --consumption-plan-location <location> \
    --os-type windows \
    --runtime node \
    --storage-account <storage-account-name> \
    --functions-version 4

https://<your-functionapp-name>.azurewebsites.net の形式で返される hostNames の値を書き留めます。 関数アプリをテストするために、関数アプリのルート URL でこの値を使用します。

Microsoft Entra 認証を有効にする

次の手順を使用して、関数アプリにアクセスするための Microsoft Entra 認証を有効にします。

  1. Azure portal で、リソース グループに移動し、作成した関数アプリを開きます。

  2. ナビゲーション ウィンドウで [認証] を選択し、メイン ウィンドウで [ID プロバイダーの追加] を選択します。

  3. [ID プロバイダーの追加] ページで、[ID プロバイダー] ドロップダウン メニューから [Microsoft] を選択します。

    Screenshot of the Azure portal showing the Add an identity provider page with Microsoft highlighted in the identity provider dropdown menu.

  4. [追加] を選択します。

  5. [ID プロバイダーの追加] ページの [基本] 設定で、[サポートされているアカウントの種類][Any Microsoft Entra directory - Multi-tenant] (任意の Microsoft Entra ディレクトリ - マルチテナント) に設定します。

  6. [認証されていない要求][HTTP 401 非認可: API に推奨] に設定します。 この設定により、認証されていない要求が確実にすべて拒否されます (401 応答)。

    Screenshot of the Azure portal showing the Add an identity provider page with Support account types and Unauthenticated requests highlighted.

  7. [追加] を選択します。

設定を追加すると、関数アプリが再起動し、以降のすべての要求で、Microsoft Entra ID を介してサインインするように求められます。 (az functionapp create コマンドの hostNames 出力で返される) 関数アプリのルート URL を使用して、認証されていない要求が現在拒否されることをテストできます。 その後、組織の Microsoft Entra サインイン画面にリダイレクトされます。

後で使用するために、アプリケーション ID とアプリケーション ID URI が必要です。 Azure portal 内で、作成した関数アプリに移動します。

アプリケーション ID を取得するには、ナビゲーション ウィンドウで [認証] を選択し、関数アプリの名前を含む ID プロバイダーの [アプリ (クライアント) ID] の値をコピーします。

Screenshot of the Azure portal showing the Authentication page for a Function app, with the Function app name highlighted in the Identity provider.

アプリケーション ID URI を取得するには、ナビゲーション ウィンドウで [API の公開] を選択し、[アプリケーション ID URI] の値をコピーします。

Screenshot of the Azure portal showing the Expose an API page for a Function app with the Application ID URI highlighted.

HTTP によってトリガーされる関数の作成

空のローカル ディレクトリで、次のコマンドを使用して新しい関数アプリを作成し、HTTP によってトリガーされる関数を追加します。

func init --worker-runtime node
func new --template HttpTrigger --name HttpTrigger

HTTP エンドポイントをセキュリティで保護するために、関数では、既定でキーベースの認証が使用されます。 関数へのアクセスをセキュリティで保護するために Microsoft Entra 認証を有効にするには、次の例に示すように、function.json ファイル内で authLevel キーを anonymous に設定します。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      ...
    }
  ]
}

詳細については、「Azure Functions の HTTP トリガー」の「運用環境で HTTP エンドポイントを保護する」セクションを参照してください。

次のコマンドを使用して、前の手順で作成したインスタンスにアプリを発行します。

func azure functionapp publish <function-app-name>

次の出力に示されているように、publish コマンドの出力には、新しく作成した関数の URL がリストされます。

Deployment completed successfully.
Syncing triggers...
Functions in <your-functionapp-name>:
    HttpTrigger - [httpTrigger]
        Invoke url: https://<function-app-name>.azurewebsites.net/api/httptrigger

Azure Spring Apps サービス インスタンスとアプリケーションを作成する

次のコマンドを使用して、Spring 拡張機能を追加し、Azure Spring Apps の新しいインスタンスを作成します。

az extension add --upgrade --name spring
az spring create \
    --resource-group <resource-group-name> \
    --name <Azure-Spring-Apps-instance-name> \
    --location <location>

次のコマンドを使用して、システム割り当てマネージド ID を持つ msiapp という名前のアプリケーションを作成します。この ID は、--assign-identity パラメーターで要求します。

az spring app create \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --name "msiapp" \
    --assign-endpoint true \
    --assign-identity

関数を呼び出すサンプル Spring Boot アプリを作成する

このサンプルは、HTTP によってトリガーされる関数を呼び出します。まず、MSI エンドポイントにアクセス トークンを要求し、そのトークンを使用して関数の HTTP 要求を認証します。 詳細については、「Azure VM 上で Azure リソースのマネージド ID を使用してアクセス トークンを取得する方法」の「HTTP を使用してトークンを取得する」セクションを参照してください。

  1. 次のコマンドを使用して、サンプル プロジェクトを複製します。

    git clone https://github.com/Azure-Samples/azure-spring-apps-samples.git
    
  2. 次のコマンドを使用して、アプリのプロパティで関数の URI とトリガー名を指定します。

    cd azure-spring-apps-samples/managed-identity-function
    vim src/main/resources/application.properties
    
  3. Azure Spring Apps アプリのマネージド ID を使用するには、次のプロパティとこれらの値を src/main/resources/application.properties に追加します。

    azure.function.uri=https://<function-app-name>.azurewebsites.net
    azure.function.triggerPath=httptrigger
    azure.function.application-id.uri=<function-app-application-ID-uri>
    
  4. 次のコマンドを使用して、サンプル アプリをパッケージ化します。

    mvn clean package
    
  5. 次のコマンドを使用して、Azure Spring Apps にアプリをデプロイします。

    az spring app deploy \
        --resource-group <resource-group-name> \
        --service <Azure-Spring-Apps-instance-name> \
        --name "msiapp" \
        --artifact-path target/asc-managed-identity-function-sample-0.1.0.jar
    
  6. 次のコマンドを使用して、パブリック エンドポイントまたはテスト エンドポイントにアクセスしてアプリをテストします。

    curl https://<Azure-Spring-Apps-instance-name>-msiapp.azuremicroservices.io/func/springcloud
    

    応答本文で次のメッセージが返されます。

    Function Response: Hello, springcloud. This HTTP triggered function executed successfully.
    

次の手順