0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ARMテンプレートをRunbookからデプロイする

Posted at

はじめに

配信中に色々動かしてみたい処理とか考えてるんだけど、普段普通に配信するだけでローカルマシン上で動いてるプロセスの数(あとなんかみんな似たようなカーネルの機能使っててそれぞれ非破壊的である信用がないのもやだ)に発狂しそうになってるので配信中だけ存在する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とか書きたくないよ~

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?