複数Subscriptionへのデプロイ

この記事はMicrosoft Azure Advent Calendar 2017の2日目の記事です。

ちょっと便利な、ARM template の小技を紹介します。

以前から1つのテンプレートを使って、複数のリソースグループへデプロイすることができましたが[1]。さらに、Microsoft.Resources/deploymentsAPI Version: 2017-05-10から、別のサブスクリプションへもデプロイできるようになりました。[2]

リソースを異なるサブスクリプションにデプロイするには、別のリソースグループへデプロイする時と同じように、nested template(Microsoft.Resources/deployments) を使います。 deployments リソースにsubscriptionId プロパティが追加され、そこに指定したサブスクリプションにnested templateで定義したリソースが展開されるってわけです、簡単ですね。

IMG_3105

ちょっとやってみよう、下のテンプレートの抜粋を見て下さい。[3]テンプレートは、別のリソースグループへデプロイする時とほぼ同じで、8行目のsubscriptionId のところが違うぐらいなのがわかります。

{
"resources": [
{
"type": "Microsoft.Resources/deployments",
"name": "nestedTemplate",
"apiVersion": "2017-05-10",
"resourceGroup": "[parameters('RemoteResourceGroup')]",
"subscriptionId": "[parameters('RemoteSubscriptionId')]",
"properties": {
"mode": "Incremental",
"template": {
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"name": "[parameters('RemoteStorageAccountName')]",
"apiVersion": "2015-06-15",
"location": "japanwest",
"properties": {
"accountType": "Standard_LRS"
}
}
]
},
"parameters": {}
}
},
{
"type": "Microsoft.Storage/storageAccounts",
"name": "[parameters('StorageAccountName')]",
"apiVersion": "2015-06-15",
"location": "[resourceGroup().location]",
"properties": {
"accountType": "Standard_LRS"
}
}
]
}

これで上手くデプロイできるか確認しましょう。 local subscription (083c462a-7c24-4a16-8bfe-876cb0ab434b) を選択した状態でデプロイします。そうするとストレージアカウント(東日本)が作成され、同時に remote subscription (ff05d8ad-12ee-4c68-97bb-78baefa1c01a) にもストレージアカウント(西日本)も作成されます。

実行には事前に、リソースグループが必要です。サブスクリプションを切替ながら、リソースグループを両側に用意します。

$ Select-AzureRmSubscription -SubscriptionId 083c462a-7c24-4a16-8bfe-876cb0ab434b
$ New-AzureRmResourceGroup -Name LocalRG -Location japaneast

$ Select-AzureRmSubscription -SubscriptionId ff05d8ad-12ee-4c68-97bb-78baefa1c01a
$ New-AzureRmResourceGroup -Name RemoteRG -Location japanwest

これでリソースグループが出来たので、local subscription を選択し直して、前記のテンプレートをデプロイします。

$ Select-AzureRmSubscription -SubscriptionId 083c462a-7c24-4a16-8bfe-876cb0ab434b
$ New-AzureRmResourceGroupDeployment -TemplateFile .\deploystorage.json `
       -StorageAccountName kyrtlocal01 `
       -ResourceGroupName LocalRG `
       -RemoteResourceGroup RemoteRG `
       -RemoteSubscriptionId ff05d8ad-12ee-4c68-97bb-78baefa1c01a `
       -RemoteStorageAccountName kyrtremote01

思った通りに出来ているか確認しましょう。

$ Select-AzureRmSubscription -SubscriptionId 083c462a-7c24-4a16-8bfe-876cb0ab434b
$ Get-AzureRmStorageAccount -ResourceGroupName RemoteRG | fl ResourceGroupName,Id, Location

ResourceGroupName : localrg
Id                : /subscriptions/08.../resourceGroups/localrg/providers/Microsoft.Storage/storageAccounts/kyrtlocal01
Location          : japaneast


$ Select-AzureRmSubscription -SubscriptionId ff05d8ad-12ee-4c68-97bb-78baefa1c01a
$ Get-AzureRmStorageAccount -ResourceGroupName RemoteRG | fl ResourceGroupName,Id, Location

ResourceGroupName : remoterg
Id                : /subscriptions/ff.../resourceGroups/remoterg/providers/Microsoft.Storage/storageAccounts/kyrtremote01
Location          : japanwest

ストレージアカウントが2つ作成され、それぞれ別のサブスクリプションに東日本と西日本に配置されているのが確認できました。複数サブスクリプションへの配置が必要なケースはあまり無い気もしますが、なかなか面白いですね。

注意

テンプレートの、38行目で、location を西日本を直接指定しています。 ここを、location": "[resourceGroup().location]としたら、locationが東日本になってしまいました。resourceGroup()は、親のdeploymentsリソースを指すようです。ちょっと混乱しますが、「まあ納得できる範囲かな」という気はします。

最後に

今回の元ネタは、@rjmaxの、Demos for Ignite US 2017 session BRK3167[4]です。このレポジトリだけで無く彼のレポジトリはARM template を使う人には必見の情報満載です、素晴らしい。特に、rjmax/ArmExamplesはお勧めですよ、ここのテンプレートは短くて見やすいのも良い感じです。