チュートリアル:カスタム アクションおよびリソースを備えたマネージド アプリケーションを作成する

このチュートリアルでは、カスタム アクションおよびリソースを備えた独自のマネージド アプリケーションを作成します。 このマネージド アプリケーションは、Overview ページ上でのカスタム アクション、Table of Content 内で独立したメニュー項目として表示されるカスタムのリソースの種類、カスタム リソース ページ上のカスタム コンテキスト アクションを備えます。

このチュートリアルに含まれる手順は次のとおりです。

  • マネージド アプリケーション インスタンスを作成するためのユーザー インターフェイス定義ファイルを作成する
  • Azure カスタム プロバイダー、Azure ストレージ アカウント、Azure 関数を指定したデプロイ テンプレートを作成する
  • カスタム アクションとリソースを指定したビュー定義アーティファクトを作成する
  • マネージド アプリケーションの定義をデプロイする
  • マネージド アプリケーションのインスタンスをデプロイする
  • カスタム アクションを実行し、カスタム リソースを作成する

前提条件

このチュートリアルを完了するには、以下に関する知識が必要です。

ユーザー インターフェイスの定義

このチュートリアルでは、マネージド アプリケーションを作成します。アプリケーションのマネージド リソース グループには、カスタム プロバイダー インスタンス、ストレージ アカウント、関数を含めます。 この例で使用する Azure 関数は、アクションとリソースに関するカスタム プロバイダーの操作を処理する API を実装するものです。 Azure ストレージ アカウントは、カスタム プロバイダー リソースの基本ストレージとして使用されます。

マネージド アプリケーション インスタンスの作成に必要なこのユーザー インターフェイス定義ファイルには、funcname と storagename という入力要素があります。 ストレージ アカウント名と関数名はグローバルに一意である必要があります。 既定では、関数ファイルはサンプル関数パッケージからデプロイされますが、createUiDefinition.json 内にパッケージ リンクの入力要素を追加することでこれを変更できます。

{
  "name": "funcname",
  "type": "Microsoft.Common.TextBox",
  "label": "Name of the function to be created",
  "toolTip": "Name of the function to be created",
  "visible": true,
  "constraints": {
    "required": true
  }
},
{
  "name": "storagename",
  "type": "Microsoft.Common.TextBox",
  "label": "Name of the storage to be created",
  "toolTip": "Name of the storage to be created",
  "visible": true,
  "constraints": {
    "required": true
  }
},
{
  "name": "zipFileBlobUri",
  "type": "Microsoft.Common.TextBox",
  "defaultValue": "https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.customproviders/custom-rp-with-function/artifacts/functionzip/functionpackage.zip",
  "label": "The Uri to the uploaded function zip file",
  "toolTip": "The Uri to the uploaded function zip file",
  "visible": true
}

createUiDefinition.json の出力は次のとおりです。

"funcname": "[steps('applicationSettings').funcname]",
"storageName": "[steps('applicationSettings').storagename]",
"zipFileBlobUri": "[steps('applicationSettings').zipFileBlobUri]"

createUiDefinition.json の完全なサンプルについては、「リファレンス: ユーザー インターフェイス要素のアーティファクト」を参照してください。

カスタム プロバイダーを指定したテンプレート

カスタム プロバイダーを備えたマネージド アプリケーション インスタンスを作成するには、mainTemplate.json の中で名前が Microsoft.CustomProviders/resourceProviders、種類が のカスタム プロバイダー リソースを定義する必要があります。 そのリソースで、サービスのリソースの種類とアクションを定義します。 Azure 関数と Azure ストレージ アカウントのインスタンスをデプロイするには、種類が Microsoft.Web/sites と Microsoft.Storage/storageAccounts のリソースをそれぞれ定義します。

このチュートリアルでは、リソースの種類 users、カスタム アクション ping、カスタム リソース users/contextAction のコンテキストで実行するカスタム アクション users を、それぞれ作成します。 リソースの種類とアクションのそれぞれに、createUiDefinition.json で指定された名前の関数を指すエンドポイントを指定します。 routingType は、リソースの種類なら Proxy,Cache、アクションなら Proxy に、それぞれ指定します。

{
  "apiVersion": "[variables('customrpApiversion')]",
  "type": "Microsoft.CustomProviders/resourceProviders",
  "name": "[variables('customProviderName')]",
  "location": "[parameters('location')]",
  "properties": {
    "actions": [
      {
        "name": "ping",
        "routingType": "Proxy",
        "endpoint": "[listSecrets(resourceId('Microsoft.Web/sites/functions', parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
      },
      {
        "name": "users/contextAction",
        "routingType": "Proxy",
        "endpoint": "[listSecrets(resourceId('Microsoft.Web/sites/functions', parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
      }
    ],
    "resourceTypes": [
      {
        "name": "users",
        "routingType": "Proxy,Cache",
        "endpoint": "[listSecrets(resourceId('Microsoft.Web/sites/functions', parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
      }
    ]
  },
  "dependsOn": [
    "[concat('Microsoft.Web/sites/',parameters('funcname'))]"
  ]
}

mainTemplate.json のサンプルの全容については、「リファレンス:デプロイ テンプレート アーティファクト」を参照してください。

ビュー定義アーティファクト

マネージド アプリケーションの中のカスタム アクションとカスタム リソースを含めたユーザーインターフェイスを定義するには、viewDefinition.json アーティファクトを作成する必要があります。 ビュー定義アーティファクトの詳細については、「Azure Managed Applications のビュー定義アーティファクト」を参照してください。

このチュートリアルでは、次のものを定義します。

  • 基本的な入力テキストを使ってカスタム アクション を表したツールバー ボタンを備えた TestAction ページ。
  • カスタムのリソースの種類 を表示する users ページ。
  • 種類が users/contextAction のカスタム リソースのコンテキストで実行される、 [ユーザー] ページ内のカスタム リソース アクション users。

次の例は、[概要] ページのビュー構成を示したものです。

{
  "kind": "Overview",
  "properties": {
    "header": "Welcome to your Demo Azure Managed Application",
    "description": "This Managed application with Custom Provider is for demo purposes only.",
    "commands": [
      {
        "displayName": "Ping Action",
        "path": "/customping",
        "icon": "LaunchCurrent"
      }
    ]
  }
}

以下の例には、カスタム リソース アクションを備えた [ユーザー] リソース ページの構成が含まれています。

{
  "kind": "CustomResources",
  "properties": {
    "displayName": "Users",
    "version": "1.0.0.0",
    "resourceType": "users",
    "createUIDefinition": {},
    "commands": [
      {
        "displayName": "Custom Context Action",
        "path": "users/contextAction",
        "icon": "Start"
      }
    ],
    "columns": [
      {
        "key": "properties.FullName",
        "displayName": "Full Name"
      },
      {
        "key": "properties.Location",
        "displayName": "Location",
        "optional": true
      }
    ]
  }
}

viewDefinition.json のサンプルの全容については、「リファレンス:ビュー定義アーティファクト」を参照してください。

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

マネージド アプリケーションに関する次のアーティファクトを zip アーカイブとしてパッケージ化し、ストレージにアップロードします。

  • createUiDefinition.json
  • mainTemplate.json
  • viewDefinition.json

ファイルはいずれも、ルート レベルに配置する必要があります。 アーティファクトが入ったパッケージは、GitHub BLOB や Azure ストレージ アカウント BLOB などの任意のストレージに格納できます。 アプリケーション パッケージをストレージ アカウントにアップロードするスクリプトは次のとおりです。

$resourceGroup="appResourcesGroup"
$storageName="mystorageaccount$RANDOM"

# Sign in to your Azure subscription
Connect-AzAccount
# Create resource group for managed application definition and application package
New-AzResourceGroup -Name $resourceGroup -Location eastus

# Create storage account for a package with application artifacts
$storageAccount=New-AzStorageAccount `
  -ResourceGroupName $resourceGroup `
  -Name $storageName `
  -SkuName Standard_LRS `
  -Location eastus `
$ctx=$storageAccount.Context

# Create storage container and upload zip to blob
New-AzStorageContainer -Name appcontainer -Context $ctx -Permission blob
Set-AzStorageBlobContent `
  -File "path_to_your_zip_package" `
  -Container appcontainer `
  -Blob app.zip `
  -Context $ctx

# Get blob absolute uri
$blobUri=(Get-AzureStorageBlob -Container appcontainer -Blob app.zip -Context $ctx).ICloudBlob.uri.AbsoluteUri

以下の Azure CLI スクリプトを実行するか、Azure portal で手順に従って、サービス カタログ マネージド アプリケーションの定義をデプロイします。

このサンプルを実行するには、最新バージョンの Azure CLI をインストールします。 開始するには、az login を実行して、Azure との接続を作成します。

Azure CLI のサンプルは、bash シェル用に記述されています。 このサンプルを Windows PowerShell またはコマンド プロンプトで実行するには、スクリプトの要素を変更する必要があります。

resourceGroup="appResourcesGroup"
# Select subscription and create resource group (if you have not created yet)
az account set --subscription <subscriptionID>
az group create --name $resourceGroup --location eastus

# Get object ID of your identity
userid=$(az ad user list --upn example@contoso.org --query [0].id --output tsv)
# Get role definition ID for the Owner role
roleid=$(az role definition list --name Owner --query [].name --output tsv)

# Create managed application definition resource
az managedapp definition create \
  --name "ManagedUsersAppDefinition" \
  --location "eastus" \
  --resource-group $resourceGroup \
  --lock-level ReadOnly \
  --display-name "Managed users app definition" \
  --description "Managed application with Azure Custom Provider" \
  --authorizations "$userid:$roleid" \
  --package-file-uri "path to your app.zip package"

マネージド アプリケーション インスタンス

マネージド アプリケーションの定義をデプロイしたら、以下のスクリプトを実行するか、Azure portal で手順に従って、カスタム プロバイダーを備えたマネージド アプリケーション インスタンスをデプロイします。

appResourcesGroup="appResourcesGroup"
applicationGroup="usersApplicationGroup"

# Create resource group for managed application instance
az group create --name $applicationGroup --location eastus

# Get ID of managed application definition
appid=$(az managedapp definition show --name ManagedUsersAppDefinition --resource-group $appResourcesGroup --query id --output tsv)

# Create the managed application
az managedapp create \
  --name ManagedUsersApp \
  --location "eastus" \
  --kind "Servicecatalog" \
  --resource-group $applicationGroup \
  --managedapp-definition-id $appid \
  --managed-rg-id "managedResourcesGroup" \
  --parameters "{\"funcname\": {\"value\": \"managedusersappfunction\"}, \"storageName\": {\"value\": \"managedusersappstorage\"}}"

カスタム アクションとリソース

サービス カタログ アプリケーション インスタンスをデプロイした後には、2 つの新しいリソース グループが作成されています。 リソース グループ applicationGroup にはマネージド アプリケーションのインスタンスが含まれます。リソース グループ managedResourceGroup は、そのマネージド アプリケーションのためのリソース (カスタム プロバイダーなど) を保持するものです。

アプリケーション リソース グループ

マネージド アプリケーション インスタンスに移動すると、[概要] ページではカスタム アクションの実行、[ユーザー] ページでは users カスタム リソースの作成、カスタム リソースではカスタム コンテキスト アクションの実行ができます。

  • [概要] に移動し、[Ping Action] (Ping アクション) を選択します。

カスタム アクションの実行

  • [ユーザー] に移動し、[追加] を選択します。 リソースを作成するための入力を指定し、フォームを送信します。

[ユーザー] で選択された [追加] ボタンを示すスクリーンショット。

  • [ユーザー] に移動し、"users" リソースを選択して [Custom Context Action] (カスタム コンテキスト アクション) を選択します。

[Custom Context Action]\(カスタム コンテキスト アクション\) が選択されていることを示すスクリーンショット。

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

前の手順では、リソース グループ内に Azure リソースを作成しました。 今後これらのリソースが不要になると予想される場合は、リソース グループを削除して削除できます。

  1. Azure portal のメニューまたはホーム ページで、 リソース グループ>myResourceGroup を選択します。

  2. myResourceGroup ペインで、一覧表示されているリソースが削除するリソースであることを確認します。

  3. [リソース グループの削除] を選択します。 確認するには、テキスト ボックスに 「myResourceGroup 」と入力し、[削除] を選択 します。

ヘルプを探しています

Azure Managed Applications に関する質問や回答が必要な場合は、タグ を使用して azure-managed-app に質問を投稿するか、タグ を使用して azure-managed-application に質問を投稿してください。

次のステップ

マネージド アプリケーションを Microsoft Azure Marketplace に発行するには、「Marketplace の Azure マネージド アプリケーション」を参照してください。

Azure カスタム プロバイダーについて学習します。