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

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

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

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

前提条件

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

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

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

マネージド アプリケーション インスタンスの作成に必要なこのユーザー インターフェイス定義ファイルには、funcnamestoragename という入力要素があります。 ストレージ アカウント名と関数名はグローバルに一意である必要があります。 既定では、関数ファイルはサンプル関数パッケージからデプロイされますが、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 の中で名前が public、種類が Microsoft.CustomProviders/resourceProviders のカスタム プロバイダー リソースを定義する必要があります。 そのリソースで、サービスのリソースの種類とアクションを定義します。 Azure 関数と Azure ストレージ アカウントのインスタンスをデプロイするには、種類が Microsoft.Web/sitesMicrosoft.Storage/storageAccounts のリソースをそれぞれ定義します。

このチュートリアルでは、リソースの種類 users、カスタム アクション ping、カスタム リソース users のコンテキストで実行するカスタム アクション users/contextAction を、それぞれ作成します。 リソースの種類とアクションのそれぞれに、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 のカスタム リソースのコンテキストで実行される、 [ユーザー] ページ内のカスタム リソース アクション users/contextAction

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

{
    "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 つの新しいリソース グループが作成されています。 1 つめのリソース グループ applicationGroup にはマネージド アプリケーションのインスタンスが含まれます。2 つめのリソース グループ managedResourceGroup は、そのマネージド アプリケーションのためのリソース (カスタム プロバイダーなど) を保持するものです。

Application resource groups

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

  • [概要] ページに移動し、[Ping Action](Ping アクション) ボタンをクリックします。

Perform custom action

  • [ユーザー] ページに移動し、[追加] ボタンをクリックします。 リソースを作成するための入力を指定し、フォームを送信します。

Screenshot shows the Add button selected from Users.

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

Screenshot shows Custom Context Action selected.

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

前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると思わない場合は、リソース グループを削除してリソースを削除できます。

Azure portal メニューまたは [ホーム] ページから、 [リソース グループ] を選択します。 次に、 [リソース グループ] ページで [myResourceGroup] を選択します。

[myResourceGroup] ページで、一覧表示されたリソースが、削除しようとするリソースであることを確認します。

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

ヘルプを探しています

Azure Managed Applications に関して不明な点がある場合には、azure-managed-app というタグを使用して Stack Overflow で質問するか、azure-managed-application というタグを使用して Microsoft Q&A で質問してみてください。 同様の質問が既に質問され回答されているため、投稿する前にまず確認してください。 回答が得られるまでの時間を短縮するために、それぞれのタグを使用してください。

次のステップ

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

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