はじめに
配信中に色々動かしてみたい処理とか考えてるんだけど、普段普通に配信するだけでローカルマシン上で動いてるプロセスの数(あとなんかみんな似たようなカーネルの機能使っててそれぞれ非破壊的である信用がないのもやだ)に発狂しそうになってるので配信中だけ存在するVMデプロイフローみたいなのが欲しくなった
というかLinuxじゃないと無~理っ⤴
前提条件
- Azure CLI または Azure Portal にアクセス可能であること。自分はWSLのkaliから実行した
- デプロイしたいARM(Azure Resource Manager)テンプレートが既に存在してて、 Azure CLI から正常にデプロイできることを確認できている
- リソースグループが作成済み
- 今回はNIC(Network Interface Card)とVM(Virtual Machine)を一緒にデプロイするARMテンプレート(
vm-deploy-template.json
)で検証した
構成要素
要素 | 用途 |
---|---|
Azure Automation アカウント | Runbookを実行するための実行環境 |
Azure Automation Runbook | ARMテンプレートをデプロイするPowerShellスクリプト |
Azure Storage アカウント | ARMテンプレートを格納するAzure Blob Storage |
SASトークン付きURL | Runbookがテンプレートを参照するための期限付きアクセス権限を持つURL |
マネージドID | Azure Automation アカウントに自動作成されるシステム割り当てマネージドID(Azure RBAC による認証・認可に使用) |
ロール割り当て | マネージドIDに対するリソース操作権限の付与 |
実施手順
Automationアカウントの作成
自分の場合はAutomationアカウントもARMテンプレート作ってデプロイした
大した設定箇所もないので別にポータルからポチポチ作っていいと思う
automation-account.json:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Automation/automationAccounts",
"apiVersion": "2023-11-01",
"name": "<Automationアカウント名>",
"location": "japaneast",
"identity": {
"type": "SystemAssigned"
},
"properties": {
"sku": {
"name": "Basic"
}
}
}
]
}
az deployment group create \
--resource-group <リソースグループ名> \
--template-file ./automation-account.json
ストレージアカウントの作成とテンプレートの配置
Runbookが参照できる場所にデプロイしたいARMテンプレートを配置する為のストレージアカウントとコンテナを作ってファイルをアップロードする
az storage account create \
--name <ストレージアカウント名> \
--resource-group <リソースグループ名> \
--location japaneast \
--sku Standard_LRS \
--kind StorageV2
az storage container create \
--name <コンテナ名> \
--account-name <ストレージアカウント名> \
--public-access off
az storage blob upload \
--account-name <ストレージアカウント名> \
--container-name <コンテナ名> \
--name vm-deploy-template.json \
--file ./vm-deploy-template.json
SASトークン付きURLの生成
アップロードしたARMテンプレートにRunbookがアクセスできるようにSASトークン付きURLを生成する
今回は一旦有効期間1か月で作成
expiry=$(date -u -d "+1 month" '+%Y-%m-%dT%H:%MZ')
sas_token=$(az storage blob generate-sas \
--account-name <ストレージアカウント名> \
--container-name <コンテナ名> \
--name vm-deploy-template.json \
--permissions r \
--expiry $expiry \
--output tsv)
template_uri="https://<ストレージアカウント名>.blob.core.windows.net/<コンテナ名>/vm-deploy-template.json?$sas_token"
echo $template_uri
コマンド実行後、最終行にSASトークン付きURLが出力されるので、次に作成するPowerShellスクリプト内に張り付ける
az storage blob generate-sas
に相当する機能呼び出しがRunboookからも使えればもっと有効期間短くしてRunbook内で自動更新したかったんだけど、今はできないっぽいので定期的に再取得してPowerShell内のURLも書き換えて更新する必要がある
Runbookの作成・登録・公開
Runbookで動かすPowerShellは日本語のコメントとか書くとエンコーディング関係のエラー出るっぽいので注意
PowerShellスクリプト(runbook-vm-deploy.ps1
)
param (
[string]$ResourceGroupName = "<リソースグループ名>",
[string]$DeploymentName = "vm-deploy-from-runbook"
)
$TemplateUri = "<SAS付きURLをここに貼り付け>"
Connect-AzAccount -Identity
New-AzResourceGroupDeployment `
-Name $DeploymentName `
-ResourceGroupName $ResourceGroupName `
-TemplateUri $TemplateUri `
-Verbose
Runbookの作成・登録・公開
az automation runbook create \
--automation-account-name <Automationアカウント名> \
--resource-group <リソースグループ名> \
--name <Runbook名> \
--type PowerShell \
--location japaneast
az automation runbook replace-content \
--automation-account-name <Automationアカウント名> \
--resource-group <リソースグループ名> \
--name <Runbook名> \
--content @./runbook-vm-deploy.ps1
az automation runbook publish \
--automation-account-name <Automationアカウント名> \
--resource-group <リソースグループ名> \
--name <Runbook名>
マネージドIDへのロール割り当て
作成したAutomationアカウントのプリンシパルIDを取得する
az automation account show \
--name <Automationアカウント名> \
--resource-group <リソースグループ名> \
--query identity.principalId \
--output tsv
VMをデプロイするリソースグループに対するContributorロールを付与
az role assignment create \
--assignee-object-id <プリンシパルID> \
--role "Contributor" \
--scope /subscriptions/<サブスクリプションID>/resourceGroups/<リソースグループ名>
自分の場合はサブネットが別のリソースグループ内にあったのでそっちにもNetwork Contributorロールを付与した
az role assignment create \
--assignee-object-id <プリンシパルID> \
--role "Network Contributor" \
--scope /subscriptions/<サブスクリプションID>/resourceGroups/<リソースグループ名>
Runbookの手動実行
az automation runbook start \
--automation-account-name <Automationアカウント名> \
--resource-group <リソースグループ名> \
--name <Runbook名>
これも別にただ実行してるだけなのでポータルから実行してもいい
おわりに
あとはWebhookとかの設定すればARMテンプレートからのVMデプロイをイベント駆動っぽく使えそう
作成したリソースの削除はテンプレートの参照とかないから単純にaz deleteに相当するやつ実行するRunbook作ればいいだけ
Runbook自体はいいんだけどPythonだと使えないAzureリソース操作結構あるのどうにかならんかな、PowerShellとか書きたくないよ~