クイック スタート: マネージド アプリケーションの定義を作成および発行する

このクイックスタートでは、Azure Managed Applications の操作の概要を説明します。 サービス カタログに格納され、組織のメンバーを対象としたマネージド アプリケーション定義を作成して発行します。

サービス カタログにマネージド アプリケーションを発行するには、次の操作を行う必要があります。

  • マネージド アプリケーションでデプロイするリソースを定義する Azure Resource Manager テンプレート (ARM テンプレート) を作成します。
  • マネージド アプリケーションをデプロイするときに、ポータルのユーザー インターフェイス要素を定義する。
  • 必要な JSON ファイルを含む .zip パッケージを作成する。 .zip パッケージ ファイルには、サービス カタログのマネージド アプリケーション定義に対して 120 MB の制限があります。
  • マネージド アプリケーション定義を発行し、サービス カタログで使用できるようにする。

マネージド アプリケーション定義が 120 MB を超える場合、または組織のコンプライアンス上の理由から独自のストレージ アカウントを使用する場合は、「クイック スタート: 独自のストレージを使用して Azure Managed Applications の定義を作成および発行する」を参照してください。

Bicep を使用してマネージド アプリケーション定義を開発できますが、Azure で定義を発行する前に ARM テンプレートの JSON に変換する必要があります。 詳細については、Bicep を使用した Azure マネージド アプリケーション定義の作成と発行に関するクイックスタートを参照してください。

Bicep を使用して、サービス カタログからマネージド アプリケーション定義をデプロイすることもできます。 詳細については、Bicep を使用した Azure マネージド アプリケーション定義のデプロイに関するクイックスタートを参照してください。

前提条件

このクイックスタートを実行するには、次のものが必要です。

ARM テンプレートを作成する

各マネージ アプリケーション定義には、mainTemplate.json というファイルが含まれています。 このテンプレートは、デプロイする Azure リソースを定義し、通常の ARM テンプレートと同じ方法で定義します。

Visual Studio Code を開き、大文字と小文字を区別する名前 mainTemplate.json のファイルを作成して保存します。

次の JSON を追加し、ファイルを保存します。 それにより、App Service、App Service プラン、ストレージ アカウントをデプロイするためのアプリケーションのリソースを定義します。 このストレージ アカウントは、マネージド アプリケーション定義を保存するためには使用されません。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "appServicePlanName": {
      "type": "string",
      "maxLength": 40,
      "metadata": {
        "description": "App Service plan name."
      }
    },
    "appServiceNamePrefix": {
      "type": "string",
      "maxLength": 47,
      "metadata": {
        "description": "App Service name prefix."
      }
    },
    "storageAccountNamePrefix": {
      "type": "string",
      "maxLength": 11,
      "metadata": {
        "description": "Storage account name prefix."
      }
    },
    "storageAccountType": {
      "type": "string",
      "allowedValues": [
        "Premium_LRS",
        "Standard_LRS",
        "Standard_GRS"
      ],
      "metadata": {
        "description": "Storage account type allowed values"
      }
    }
  },
  "variables": {
    "appServicePlanSku": "F1",
    "appServicePlanCapacity": 1,
    "appServiceName": "[format('{0}{1}', parameters('appServiceNamePrefix'), uniqueString(resourceGroup().id))]",
    "storageAccountName": "[format('{0}{1}', parameters('storageAccountNamePrefix'), uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2022-03-01",
      "name": "[parameters('appServicePlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('appServicePlanSku')]",
        "capacity": "[variables('appServicePlanCapacity')]"
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2022-03-01",
      "name": "[variables('appServiceName')]",
      "location": "[parameters('location')]",
      "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
        "httpsOnly": true,
        "siteConfig": {
          "appSettings": [
            {
              "name": "AppServiceStorageConnectionString",
              "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};Key={2}', variables('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').keys[0].value)]"
            }
          ]
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    }
  ],
  "outputs": {
    "appServicePlan": {
      "type": "string",
      "value": "[parameters('appServicePlanName')]"
    },
    "appServiceApp": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Web/sites', variables('appServiceName')), '2022-03-01').defaultHostName]"
    },
    "storageAccount": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').primaryEndpoints.blob]"
    }
  }
}

ポータル エクスペリエンスを定義する

マネージド アプリケーションを作成するためのポータル エクスペリエンスは、発行者が定義します。 ポータルのユーザー インターフェイスは、createUiDefinition.json ファイルによって生成されます。 ドロップダウンやテキスト ボックスなどのコントロール要素を使用して、各パラメーターの入力をユーザーがどのように提供するかを定義します。

この例では、ユーザー インターフェイスから、App Service の名前のプレフィックス、App Service プランの名前、ストレージ アカウントのプレフィックス、ストレージ アカウントの種類を入力するよう求められます。 デプロイ中、mainTemplate.json 内の変数で uniqueString 関数を使用して、名前のプレフィックスに 13 文字の文字列を追加し、名前が Azure 全体でグローバルに一意になるようにします。

Visual Studio Code を開き、大文字と小文字を区別する名前 createUiDefinition.json のファイルを作成して保存します。

次の JSON コードをファイルに追加し、保存します。

{
  "$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": "webAppSettings",
        "label": "Web App settings",
        "subLabel": {
          "preValidation": "Configure the web app settings",
          "postValidation": "Completed"
        },
        "elements": [
          {
            "name": "appServicePlanName",
            "type": "Microsoft.Common.TextBox",
            "label": "App Service plan name",
            "placeholder": "App Service plan name",
            "defaultValue": "",
            "toolTip": "Use alphanumeric characters or hyphens with a maximum of 40 characters.",
            "constraints": {
              "required": true,
              "regex": "^[a-z0-9A-Z-]{1,40}$",
              "validationMessage": "Only alphanumeric characters or hyphens are allowed, with a maximum of 40 characters."
            },
            "visible": true
          },
          {
            "name": "appServiceName",
            "type": "Microsoft.Common.TextBox",
            "label": "App Service name prefix",
            "placeholder": "App Service name prefix",
            "defaultValue": "",
            "toolTip": "Use alphanumeric characters or hyphens with minimum of 2 characters and maximum of 47 characters.",
            "constraints": {
              "required": true,
              "regex": "^[a-z0-9A-Z-]{2,47}$",
              "validationMessage": "Only alphanumeric characters or hyphens are allowed, with a minimum of 2 characters and maximum of 47 characters."
            },
            "visible": true
          }
        ]
      },
      {
        "name": "storageConfig",
        "label": "Storage settings",
        "subLabel": {
          "preValidation": "Configure the storage settings",
          "postValidation": "Completed"
        },
        "elements": [
          {
            "name": "storageAccounts",
            "type": "Microsoft.Storage.MultiStorageAccountCombo",
            "label": {
              "prefix": "Storage account name prefix",
              "type": "Storage account type"
            },
            "toolTip": {
              "prefix": "Enter maximum of 11 lowercase letters or numbers.",
              "type": "Available choices are Standard_LRS, Standard_GRS, and Premium_LRS."
            },
            "defaultValue": {
              "type": "Standard_LRS"
            },
            "constraints": {
              "allowedTypes": [
                "Premium_LRS",
                "Standard_LRS",
                "Standard_GRS"
              ]
            },
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "location": "[location()]",
      "appServicePlanName": "[steps('webAppSettings').appServicePlanName]",
      "appServiceNamePrefix": "[steps('webAppSettings').appServiceName]",
      "storageAccountNamePrefix": "[steps('storageConfig').storageAccounts.prefix]",
      "storageAccountType": "[steps('storageConfig').storageAccounts.type]"
    }
  }
}

詳細については、CreateUiDefinition の概要に関するページを参照してください。

ファイルのパッケージ化

app.zip という名前のパッケージ ファイルに 2 つのファイルを追加します。 2 つのファイルは .zip ファイルのルートに配置する必要があります。 これらのファイルがフォルダー内にある場合、マネージド アプリケーション定義を作成するときに、必要なファイルが存在しないことを示すエラーが発生します。

マネージド アプリケーションの定義をデプロイするときに使用できるように、app.zip を Azure ストレージ アカウントにアップロードします。 ストレージ アカウント名は Azure 全体でグローバルに一意である必要があり、長さは小文字と数字のみで 3 から 24 文字にする必要があります。 コマンドで、山かっこ (<>) を含むプレースホルダー <demostorageaccount> を一意のストレージ アカウント名に置き換えます。

Visual Studio Code で、新しい PowerShell ターミナルを開き、Azure サブスクリプションにサインインします。

Connect-AzAccount

コマンドを実行すると、既定のブラウザーが開き、Azure にサインインするよう求められます。 詳細については、「Azure PowerShell を使用してサインインする」を参照してください。

New-AzResourceGroup -Name packageStorageGroup -Location westus3

$storageAccount = New-AzStorageAccount `
  -ResourceGroupName packageStorageGroup `
  -Name "<demostorageaccount>" `
  -Location westus3 `
  -SkuName Standard_LRS `
  -Kind StorageV2

$ctx = $storageAccount.Context

New-AzStorageContainer -Name appcontainer -Context $ctx -Permission blob

Set-AzStorageBlobContent `
  -File "app.zip" `
  -Container appcontainer `
  -Blob "app.zip" `
  -Context $ctx

マネージド アプリケーション定義の作成

このセクションでは、Microsoft Entra ID から ID 情報を取得し、リソース グループを作成して、マネージド アプリケーション定義をデプロイします。

グループ ID とロール定義 ID を取得する

次の手順として、顧客のリソースを管理するためのユーザー、セキュリティ グループ、またはアプリケーションを選択します。 この ID には、割り当てられているロールに従って、管理対象リソース グループに対するアクセス許可が付与されています。 そのロールには、Azure の組み込みロール (所有者、共同作成者など) をどれでも使用できます。

この例ではセキュリティ グループを使用しており、お使いの Microsoft Entra アカウントはそのグループのメンバーである必要があります。 グループのオブジェクト ID を取得するには、山かっこ (<>) を含むプレースホルダー <managedAppDemo> をグループの名前に置き換えます。 この変数の値は、マネージド アプリケーション定義をデプロイするときに使用します。

新しい Microsoft Entra グループを作成するには、「Microsoft Entra グループとグループ メンバーシップの管理」にアクセスしてください。

$principalid=(Get-AzADGroup -DisplayName <managedAppDemo>).Id

次に、ユーザー、グループ、またはアプリケーションへのアクセス権を付与する Azure の組み込みロールのロール定義 ID を取得します。 この変数の値は、マネージド アプリケーション定義をデプロイするときに使用します。

$roleid=(Get-AzRoleDefinition -Name Owner).Id

マネージド アプリケーション定義を発行する

マネージド アプリケーション定義のリソース グループを作成します。

New-AzResourceGroup -Name appDefinitionGroup -Location westus3

blob コマンドを実行して、パッケージの .zip ファイルの URL を保存するための変数を作成します。 この変数は、マネージド アプリケーション定義を作成するコマンドで使用されます。

$blob = Get-AzStorageBlob -Container appcontainer -Blob app.zip -Context $ctx

New-AzManagedApplicationDefinition `
  -Name "sampleManagedApplication" `
  -Location "westus3" `
  -ResourceGroupName appDefinitionGroup `
  -LockLevel ReadOnly `
  -DisplayName "Sample managed application" `
  -Description "Sample managed application that deploys web resources" `
  -Authorization "${principalid}:$roleid" `
  -PackageFileUri $blob.ICloudBlob.StorageUri.PrimaryUri.AbsoluteUri

コマンドが完了すると、リソース グループにマネージド アプリケーション定義が作成されます。

前の例で使用されているパラメーターは次のとおりです。

  • ResourceGroupName: マネージド アプリケーション定義が作成されるリソース グループの名前。
  • LockLevel: 管理対象リソース グループで lockLevel を指定すると、このリソース グループに対して問題となるような操作を顧客が実行できなくなります。 現在サポートされているロック レベルは ReadOnly だけです。 ReadOnly を指定すると、顧客は管理対象リソース グループに存在するリソースの読み取りしか実行できません。 管理対象リソース グループへのアクセス権が付与されている発行元 ID は、ロック レベルの対象外となります。
  • Authorization:管理対象リソース グループへのアクセス許可を付与する際に使うプリンシパル ID とロール定義 ID を記述します。
    • "${principalid}:$roleid"、または変数 "${principalid}:${roleid}" ごとに中かっこを使用できます。
    • 複数の値を区切るには、コンマを使用してください: "${principalid1}:$roleid1", "${principalid2}:$roleid2"
  • PackageFileUri: 必要なファイルが含まれた .zip パッケージ ファイルの場所。

ユーザーが定義を確認できるようにする

自身がアクセスできるマネージ アプリケーション定義に、組織の他のユーザーもアクセスできることを確認する必要があります。 定義に対して閲覧者以上のロールをユーザーに付与してください。 ユーザーはこのレベルのアクセスをサブスクリプションまたはリソース グループから継承している場合があります。 定義にアクセスできるユーザーを確認したり、ユーザーやグループを追加したりするには、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

リソースをクリーンアップする

これから定義をデプロイする場合は、記事にリンクしている「次の手順」セクションに進んで定義をデプロイします。

マネージド アプリケーションの定義が終了したら、作成した packageStorageGroup および appDefinitionGroup という名前のリソース グループを削除できます。

コマンドを実行すると、リソース グループを削除することを確認するメッセージが表示されます。

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name appDefinitionGroup

次のステップ

マネージド アプリケーション定義を発行しました。 次の手順では、その定義のインスタンスをデプロイする方法を確認します。