パブリックプレビューの Azure Chaos Studio を AzureCLI で試してみた

## 背景と目的

カオスモンキーとかカオスエンジニアリングとか言葉や概念は知っていても、組織やチームによっては実際にここまでやる必要に迫られないと手をつけない領域の機能だと思います。今回 Azure Chaos Studio を触ってみて、なるほどこういう事なのね、と理解するために、まずは試してみることにしました。

## 前提条件

コマンドの実施環境は、Mac + Azure CLI です。

```bash
$ sw_vers
ProductName:    macOS
ProductVersion: 12.0.1
BuildVersion:   21A559

$ az version
{
  "azure-cli": "2.30.0",
  "azure-cli-core": "2.30.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## Chaos Studio を登録

```bash
# リソースプロバイダーの Chaos Studio を登録にします
az provider register \
  --namespace Microsoft.Chaos

# Registered になったのを確認します
az provider show \
  --namespace Microsoft.Chaos \
  --query registrationState \
  --output tsv
```

## Chaos Studio で検証する VM を作成

```bash
# 環境変数をセットします
region=japaneast
prefix=mnrchaos
sid=$(az account show --query id --output tsv)

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# VNET を作成します
az network vnet create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet \
  --address-prefixes 10.1.0.0/16 \
  --subnet-name default-subnet \
  --subnet-prefix 10.1.0.0/24

# NSG を作成します
az network nsg create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-nsg

# NSG をサブネットに登録します
az network vnet subnet update \
  --resource-group ${prefix}-rg \
  --vnet-name ${prefix}-vnet \
  --name default-subnet \
  --network-security-group ${prefix}-nsg

# 仮想マシンを作成します（起動と停止を確認するだけなのでパスワードは何でも良いです）
az vm create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --os-disk-name ${prefix}-vmOSDisk \
  --image CentOS \
  --size Standard_A1_v2 \
  --admin-username azureuser \
  --admin-password $(openssl rand -base64 16) \
  --vnet-name ${prefix}-vnet \
  --subnet default-subnet \
  --nsg "" \
  --public-ip-address "" \
  --storage-sku Standard_LRS
```

## Chaos Studio を使用してカオス実験を作成して実行

Chaos Studio で VM シャットダウンのサービス直接実験を使用します。

```bash
# 検証用 VM をサービス直接ターゲットにします
az rest \
  --method put \
  --url "https://management.azure.com/subscriptions/$sid/resourceGroups/${prefix}-rg/providers/microsoft.compute/virtualmachines/${prefix}-vm/providers/Microsoft.Chaos/targets/microsoft-virtualmachine?api-version=2021-09-15-preview" \
  --body '{"properties": {}}'

# 検証用 VM に Chaos Studio のシャットダウン機能を有効にします
az rest \
  --method put \
  --url "https://management.azure.com/subscriptions/$sid/resourceGroups/${prefix}-rg/providers/microsoft.compute/virtualmachines/${prefix}-vm/providers/Microsoft.Chaos/targets/microsoft-virtualmachine/capabilities/Shutdown-1.0?api-version=2021-09-15-preview" \
  --body '{"properties": {}}'

# カオス実験を作成します（設定内容としては PT10M でシャットダウンの期間を指定しています）
az rest \
  --method put \
  --url "https://management.azure.com/subscriptions/$sid/resourceGroups/${prefix}-rg/providers/Microsoft.Chaos/experiments/${prefix}?api-version=2021-09-15-preview" \
  --body "{
  \"location\": \"$region\",
  \"identity\": {
    \"type\": \"SystemAssigned\"
  },
  \"properties\": {
    \"steps\": [
      {
        \"name\": \"step1\",
        \"branches\": [
          {
            \"name\": \"branch1\",
            \"actions\": [
              {
                \"type\": \"Continuous\",
                \"name\": \"urn:csci:microsoft:virtualMachine:shutdown/1.0\",
                \"selectorId\": \"selector1\",
                \"duration\": \"PT10M\",
                \"parameters\": [
                  {
                    \"key\": \"abruptShutdown\",
                    \"value\": \"false\"
                  }
                ]
              }
            ]
          }
        ]
      }
    ],
    \"selectors\": [
      {
        \"type\": \"List\",
        \"id\": \"selector1\",
        \"targets\": [
          {
            \"type\": \"ChaosTarget\",
            \"id\": \"/subscriptions/$sid/resourceGroups/${prefix}-rg/providers/Microsoft.Compute/virtualMachines/${prefix}-vm/providers/Microsoft.Chaos/targets/Microsoft-VirtualMachine\"
          }
        ]
      }
    ]
  }
}"

# カオス実験から検証用 VM を操作出来るようにします
az role assignment create \
  --assignee $(az rest \
  --method get \
  --url "https://management.azure.com/subscriptions/$sid/resourceGroups/${prefix}-rg/providers/Microsoft.Chaos/experiments/${prefix}?api-version=2021-09-15-preview" \
  --query identity.principalId \
  --output tsv) \
  --role "Virtual Machine Contributor" \
  --scope $(az vm show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --query id \
  --output tsv)
```

## Chaos Studio を使用してカオス実験を試す

カオス実験を開始すると検証用 VM が停止し 10 分経過したのち、検証用 VM が起動するというものでした。つまり冗長構成を組んでいる構成の一部が停止しても、サービス全体としては稼働し続けることをカオス実験を使って簡単に試すことが出来ます。また、指定時間を経過したら VM が起動状態になってくれるので、手動で実験するよりも戻し忘れがなく安全だと感じました。

```bash
# 検証用 VM の電源状態を確認します（この時点では VM running です）
az vm show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --show-details \
  --query powerState \
  --output tsv

VM running

# 作成したカオス実験を開始します
az rest \
  --method post \
  --url "https://management.azure.com/subscriptions/$sid/resourceGroups/${prefix}-rg/providers/Microsoft.Chaos/experiments/${prefix}/start?api-version=2021-09-15-preview"

# カオス実験の状態を確認します（この時点では PreProcessingQueued です）
az rest \
  --method get \
  --url "https://management.azure.com/subscriptions/$sid/resourceGroups/${prefix}-rg/providers/Microsoft.Chaos/experiments/${prefix}/statuses?api-version=2021-09-15-preview" \
  --query "value[].{name:name, status:properties.status, create:properties.createdDateUtc, end:properties.endDateUtc}" \
  --output table

Name                                  Status               Create                        End
------------------------------------  -------------------  ----------------------------  ----------------------------
96DA296C-21E0-4BBC-AC07-94958036F44D  PreProcessingQueued  2021-11-28T11:04:51.5793558Z

# もう一度カオス実験の状態を確認します（この時点では Running です）
az rest \
  --method get \
  --url "https://management.azure.com/subscriptions/$sid/resourceGroups/${prefix}-rg/providers/Microsoft.Chaos/experiments/${prefix}/statuses?api-version=2021-09-15-preview" \
  --query "value[].{name:name, status:properties.status, create:properties.createdDateUtc, end:properties.endDateUtc}" \
  --output table

Name                                  Status    Create                        End
------------------------------------  --------  ----------------------------  ----------------------------
96DA296C-21E0-4BBC-AC07-94958036F44D  Running   2021-11-28T11:04:51.5793558Z

# 検証用 VM の電源状態を確認します（この時点では VM stopped です）
az vm show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --show-details \
  --query powerState \
  --output tsv

VM stopped

# 10 分経過後カオス実験の状態を確認します（この時点では Success です）
az rest \
  --method get \
  --url "https://management.azure.com/subscriptions/$sid/resourceGroups/${prefix}-rg/providers/Microsoft.Chaos/experiments/${prefix}/statuses?api-version=2021-09-15-preview" \
  --query "value[].{name:name, status:properties.status, create:properties.createdDateUtc, end:properties.endDateUtc}" \
  --output table

Name                                  Status    Create                        End
------------------------------------  --------  ----------------------------  ----------------------------
96DA296C-21E0-4BBC-AC07-94958036F44D  Success   2021-11-28T11:04:51.5793558Z  2021-11-28T11:15:56.2366323Z

# 検証用 VM の電源状態を確認します（この時点では VM running です）
az vm show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --show-details \
  --query powerState \
  --output tsv

VM running
```

## 参考

作成したリソースを削除します。

```bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg
```

参考サイトです。

https://azure.microsoft.com/ja-jp/updates/public-preview-azure-chaos-studio-systematically-improve-resilience-with-controlled-chaos/

https://docs.microsoft.com/ja-jp/azure/chaos-studio/chaos-studio-quickstart-azure-portal

https://docs.microsoft.com/ja-jp/rest/api/chaosstudio/