マネージド ID を持つ Azure マネージド アプリケーション

Note

Azure マネージド アプリケーションでのマネージド ID のサポートは現在、プレビュー段階です。 マネージド ID を利用するには、2018-09-01-preview api バージョンを使用してください。

マネージド ID を含むようにマネージド アプリケーションを構成する方法について説明します。 マネージド ID を使用すると、顧客は、マネージド アプリケーションに既存のリソースへのアクセスを付与できます。 Azure プラットフォームによって ID が管理されるため、シークレットをプロビジョニングしたりローテーションしたりする必要はありません。 Microsoft Entra ID のマネージド ID の詳細については、「Azure リソースのマネージド ID」を参照してください。

アプリケーションには 2 種類の ID を付与できます。

  • システム割り当てマネージド ID はアプリケーションに関連付けられているため、アプリが削除されると削除されます。 アプリは 1 つのシステム割り当てマネージド ID しか持つことができません。
  • ユーザー割り当てマネージド ID は、アプリに割り当てることができるスタンドアロン Azure リソースです。 アプリは複数のユーザー割り当てマネージド ID を持つことができます。

マネージド ID を使用する方法

マネージド ID は、マネージド アプリケーションのための多数のシナリオを可能にします。 解決できるいくつかの一般的なシナリオには、次のものがあります。

  • 既存の Azure リソースにリンクされたマネージド アプリケーションのデプロイ。 例として、既存のネットワーク インターフェイスに接続されているマネージド アプリケーション内での Azure 仮想マシン (VM) のデプロイがあります。
  • マネージド アプリケーションやパブリッシャーへのマネージド リソース グループの外部にある Azure リソースへのアクセスの付与。
  • アクティビティ ログや Azure 内のその他のサービスのためのマネージド アプリケーションの運用 ID の提供。

マネージド ID の追加

マネージド ID を持つマネージド アプリケーションを作成するには、Azure リソースに別のプロパティを設定する必要があります。 次の例は、サンプルの identity プロパティを示しています。

{
  "identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.ManagedIdentity/userassignedidentites/myuserassignedidentity": {}
    }
  }
}

identity でマネージド アプリケーションを作成するための一般的な方法には、createUiDefinition.jsonAzure Resource Manager テンプレートの 2 つがあります。 単純な 1 つの作成のシナリオの場合は、より豊富なエクスペリエンスが提供されるため、createUiDefinition を使用してマネージド ID を有効にしてください。 ただし、マネージド アプリケーションの自動化された、または複数のデプロイを必要とする高度なシステムや複雑なシステムに対応する場合は、テンプレートを使用できます。

createUiDefinition の使用

マネージド アプリケーションは、createUiDefinition.json を使用してマネージド ID で構成できます。 outputs セクションでは、キー managedIdentity を使用して、マネージド アプリケーション テンプレートの identity プロパティをオーバーライドできます。 次のサンプルは、マネージド アプリケーションでシステム割り当てマネージド ID を有効にします。 コンシューマーに入力を求める createUiDefinition 要素を使用して、より複雑な ID オブジェクトを形成できます。 これらの入力を使用すると、ユーザー割り当てマネージド ID でマネージド アプリケーションを構築できます。

"outputs": {
  "managedIdentity": { "Type": "SystemAssigned" }
}

マネージド ID のために createUiDefinition を使用する状況

マネージド アプリケーションでマネージド ID を有効にするために createUiDefinition を使用する状況に関するいくつかの推奨事項を次に示します。

  • マネージド アプリケーションの作成は、Azure Portal または Azure Marketplace 経由で実行されます。
  • マネージド ID には複雑なコンシューマー入力が必要です。
  • マネージド アプリケーションの作成ではマネージド ID が必要です。

マネージド ID createUiDefinition コントロール

createUiDefinition.json では、組み込みのマネージド ID コントロールがサポートされています。

{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [],
    "steps": [
      {
        "name": "applicationSettings",
        "label": "Application Settings",
        "subLabel": {
          "preValidation": "Configure your application settings",
          "postValidation": "Done"
        },
        "bladeTitle": "Application Settings",
        "elements": [
          {
            "name": "appName",
            "type": "Microsoft.Common.TextBox",
            "label": "Managed application Name",
            "toolTip": "Managed application instance name",
            "visible": true
          },
          {
            "name": "appIdentity",
            "type": "Microsoft.ManagedIdentity.IdentitySelector",
            "label": "Managed Identity Configuration",
            "toolTip": {
              "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
              "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
            },
            "defaultValue": {
              "systemAssignedIdentity": "Off"
            },
            "options": {
              "hideSystemAssignedIdentity": false,
              "hideUserAssignedIdentity": false,
              "readOnlySystemAssignedIdentity": false
            },
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "applicationResourceName": "[steps('applicationSettings').appName]",
      "location": "[location()]",
      "managedIdentity": "[steps('applicationSettings').appIdentity]"
    }
  }
}

Screenshot of the application settings for system-assigned managed identity and user-assigned managed identity

Azure リソース マネージャーのテンプレートを作成する

Note

Marketplace マネージド アプリケーション テンプレートは、Azure Portal の作成エクスペリエンスを実行する顧客のために自動的に生成されます。 これらのシナリオでは、ID を有効にするために createUiDefinitionmanagedIdentity 出力キーを使用する必要があります。

マネージド ID は、Azure Resource Manager テンプレートを使用して有効にすることもできます。 次のサンプルは、マネージド アプリケーションでシステム割り当てマネージド ID を有効にします。 入力を指定する Azure Resource Manager テンプレート パラメーターを使用して、より複雑な ID オブジェクトを形成できます。 これらの入力を使用すると、ユーザー割り当てマネージド ID でマネージド アプリケーションを構築できます。

マネージド ID のために Azure Resource Manager テンプレートを使用する状況

マネージド アプリケーションでマネージド ID を有効にするために Azure Resource Manager テンプレートを使用する状況に関するいくつかの推奨事項を次に示します。

  • マネージド アプリケーションは、テンプレートに基づいてプログラムでデプロイできます。
  • マネージド アプリケーションをプロビジョニングするには、マネージド ID へのカスタム ロールの割り当てが必要です。
  • マネージド アプリケーションに Azure Portal やマーケットプレース作成フローは必要ありません。

SystemAssigned テンプレート

システム割り当てマネージド ID を使用してマネージド アプリケーションをデプロイする基本的な Azure Resource Manager テンプレート。

"resources": [
  {
    "type": "Microsoft.Solutions/applications",
    "name": "[parameters('applicationName')]",
    "apiVersion": "2018-09-01-preview",
    "location": "[parameters('location')]",
    "identity": {
        "type": "SystemAssigned"
    },
    "properties": {
        "ManagedResourceGroupId": "[parameters('managedByResourceGroupId')]",
        "parameters": { }
    }
  }
]

UserAssigned テンプレート

ユーザー割り当てマネージド ID を使用してマネージド アプリケーションをデプロイする基本的な Azure Resource Manager テンプレート。

"resources": [
  {
    "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
    "name": "[parameters('managedIdentityName')]",
    "apiVersion": "2018-11-30",
    "location": "[parameters('location')]"
  },
  {
    "type": "Microsoft.Solutions/applications",
    "name": "[parameters('applicationName')]",
    "apiVersion": "2018-09-01-preview",
    "location": "[parameters('location')]",
    "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
            "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('managedIdentityName'))]": {}
        }
    },
    "properties": {
        "ManagedResourceGroupId": "[parameters('managedByResourceGroupId')]",
        "parameters": { }
    }
  }
]

Azure リソースへのアクセスの付与

マネージド アプリケーションに ID が付与されたら、ロールの割り当てを作成することによって、それに既存の Azure リソースへのアクセス権を付与できます。

そのためには、マネージド アプリケーションまたはユーザー割り当てマネージド ID の名前を検索して選んでから、[アクセス制御 (IAM)] を選びます。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

既存の Azure リソースのリンク

Note

マネージド アプリケーションをデプロイする前に、ユーザー割り当てマネージド ID を構成する必要があります。 さらに、マネージド アプリケーションのリンクされたリソースのデプロイは、マーケットプレースの種類に対してのみサポートされます。

マネージド ID を使用すると、デプロイ中に既存のリソースへのアクセスが必要なマネージド アプリケーションをデプロイすることもできます。 顧客がマネージド アプリケーションをプロビジョニングする場合は、ユーザー割り当てマネージド ID を追加して mainTemplate デプロイに追加の承認を提供できます。

リンクされたリソースによる createUiDefinition の作成

マネージド アプリケーションのデプロイを既存のリソースにリンクする場合は、既存の Azure リソースと、そのリソースに対する適用可能なロールの割り当てを持つユーザー割り当てマネージド ID の両方を指定する必要があります。

サンプルの createUiDefinition.json では、ネットワーク インターフェイス リソース ID とユーザー割り当てマネージド ID リソース ID の 2 つの入力が必要です。

{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [
      {}
    ],
    "steps": [
      {
        "name": "managedApplicationSetting",
        "label": "Managed Application Settings",
        "subLabel": {
          "preValidation": "Managed Application Settings",
          "postValidation": "Done"
        },
        "bladeTitle": "Managed Application Settings",
        "elements": [
          {
            "name": "networkInterfaceId",
            "type": "Microsoft.Common.TextBox",
            "label": "Network interface resource ID",
            "defaultValue": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.Network/networkInterfaces/existingnetworkinterface",
            "toolTip": "Must represent the identity as an Azure Resource Manager resource identifer format ex. /subscriptions/sub1/resourcegroups/myGroup/providers/Microsoft.Network/networkInterfaces/networkinterface1",
            "visible": true
          },
          {
            "name": "userAssignedId",
            "type": "Microsoft.Common.TextBox",
            "label": "User-assigned managed identity resource ID",
            "defaultValue": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.ManagedIdentity/userassignedidentites/myuserassignedidentity",
            "toolTip": "Must represent the identity as an Azure Resource Manager resource identifer format ex. /subscriptions/sub1/resourcegroups/myGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity1",
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "existingNetworkInterfaceId": "[steps('managedApplicationSetting').networkInterfaceId]",
      "managedIdentity": "[parse(concat('{\"Type\":\"UserAssigned\",\"UserAssignedIdentities\":{',string(steps('managedApplicationSetting').userAssignedId),':{}}}'))]"
    }
  }
}

この createUiDefinition.json では、2 つのフィールドを含むユーザーの作成エクスペリエンスが生成されます。 最初のフィールドは、ユーザーがマネージド アプリケーションのデプロイにリンクされたリソースの Azure リソース ID を入力できるようにします。 2 番目は、コンシューマーが、リンクされた Azure リソースにアクセスできるユーザー割り当てマネージド ID Azure リソース ID を入力するためのものです。 生成されたエクスペリエンスは次のようになります。

Screenshot of a sample createUiDefinition.json with two inputs: a network interface resource ID and a user-assigned managed identity resource ID.

リンクされたリソースによる mainTemplate の作成

createUiDefinition の更新に加えて、メイン テンプレートも、渡されるリンクされたリソース ID を受け付けるように更新する必要があります。 メイン テンプレートは、新しいパラメーターを追加することによって、新しい出力を受け付けるように更新できます。 生成されたマネージド アプリケーション テンプレート上の値は managedIdentity 出力によってオーバーライドされるため、メイン テンプレートに渡されず、parameters セクションには含まれません。

ネットワーク プロファイルを createUiDefinition.json によって提供された既存のネットワーク インターフェイスに設定するサンプルのメイン テンプレート。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "existingNetworkInterfaceId": { "type": "string" }
  },
  "variables": {
  },
  "resources": [
    {
      "apiVersion": "2016-04-30-preview",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "myLinkedResourceVM",
      "location": "[resourceGroup().location]",
      "properties": {
        …,
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[parameters('existingNetworkInterfaceId')]"
            }
          ]
        }
      }
    }
  ]
}

リンクされたリソースによるマネージド アプリケーションの消費

マネージド アプリケーション パッケージが作成されたら、Azure Portal 経由でマネージド アプリケーションを消費できます。 消費する前に必要ないくつかの前提条件となる手順があります。

マネージド ID トークンへのアクセス

これでマネージド アプリケーションのトークンに、パブリッシャー テナントから listTokens api を使用してアクセスできるようになりました。 要求の例は次のようになります。

POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Solutions/applications/{applicationName}/listTokens?api-version=2018-09-01-preview HTTP/1.1

{
  "authorizationAudience": "https://management.azure.com/",
  "userAssignedIdentities": [
      "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{userAssignedIdentityName}"
  ]
}

要求本文のパラメーター:

パラメーター 必須 内容
authorizationAudience いいえ ターゲット リソースのアプリ ID URI。 発行されたトークンの aud (対象ユーザー) 要求でもあります。 既定値は "https://management.azure.com/" です。
userAssignedIdentities いいえ トークンを取得するためのユーザー割り当て済みマネージド ID のリスト。 指定しない場合、listTokens はシステム割り当てマネージド ID のトークンを返します。

サンプルの応答は次のようになります。

HTTP/1.1 200 OK
Content-Type: application/json

{
  "value": [
    {
      "access_token": "eyJ0eXAi…",
      "expires_in": "2…",
      "expires_on": "1557…",
      "not_before": "1557…",
      "authorizationAudience": "https://management.azure.com/",
      "resourceId": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Solutions/applications/{applicationName}",
      "token_type": "Bearer"
    }
  ]
}

応答では、value プロパティの下にトークンの配列が含まれます。

パラメーター 説明
access_token 要求されたアクセス トークン。
expires_in アクセス トークンが有効である秒数。
expires_on アクセス トークンが期限切れになるまでの期間。 この値は、エポックからの秒数で表されます。
not_before アクセス トークンが有効になるまでの期間。 この値は、エポックからの秒数で表されます。
authorizationAudience アクセス トークンが要求された aud (対象ユーザー)。 この値は、listTokens 要求で指定されたものと同じです。
resourceId 発行されたトークンの Azure リソース ID。 この値は、マネージド アプリケーション ID またはユーザー割り当てマネージド ID のどちらかです。
token_type トークンの種類。

次のステップ