📝

[Azure] AKS の定時起動・停止を Azure Automation で行う

2020/12/09に公開

はじめに

Azure Kubernetes Service にて、クラスタを一時停止する機能が実装されました。これで、使っていない間はコンピューティングの費用を抑えることができます。

この自動化を考えた時、Microsoft Tech Community の記事で参考になりそうなものがあったため、それをベースに AKS に対応させ、試してみました。

Auto Stop and Start your Azure Database for MySQL Single Server using PowerShell runbook - Microsoft Tech Community

手順

  1. Azure Automation アカウントの作成
  2. Az.Accounts モジュールのインポート
  3. 新しく Runbook を作成し、コードを登録して公開
  4. 動作確認
  5. 定時実行設定

1. Azure Automation アカウントの作成

まずは、Azure Automation アカウントを作成します。こちらの手順に則れば、特に迷うことはないかと。

2. Az.Accounts モジュールのインポート

スクリプトの中で Azure アカウントの情報を扱う部分があるため、Az.Accounts モジュールをインポートします。「モジュール ギャラリー」から Az.Accounts で検索してインポートすれば OK です。

Az.Accounts のインポート

3. 新しく Runbook を作成し、コードを登録して公開

Automation アカウントにて新しい Runbook を作成し、下記のようにコードを貼り付けて「保存」⇒「公開」します。(デバッグ文が残っちゃっていますが、これは不要ですね😅)


# Envrionment parameters
param(
[parameter(Mandatory=$true)] 
[string] $subscriptionId,

[parameter(Mandatory=$true)] 
[string] $resourceGroupName,

[parameter(Mandatory=$true)] 
[string] $resourceName,

[parameter(Mandatory=$true)] 
[string] $action
) 
 
filter timestamp {"[$(Get-Date -Format G)]: $_"} 

Write-Output "Script started." | timestamp

# $VerbosePreference = "Continue" ##enable this for verbose logging
$ErrorActionPreference = "Stop" 

# Authenticate with Azure Automation Run As account (service principal) 
$connectionName = "AzureRunAsConnection"

Write-Output "debug1" | timestamp

try
{
    # Get the connection "AzureRunAsConnection"
    $servicePrincipalConnection = Get-AutomationConnection -Name $connectionName

    Write-Output "Logging in to Azure..."
    Add-AzAccount `
        -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint | Out-Null 
}
catch {
    if (!$servicePrincipalConnection)
    {
        $ErrorMessage = "Connection $connectionName not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}
Write-Output "Authenticated with Automation Run As Account."  | timestamp 

$startTime = Get-Date 
Write-Output "Azure Automation local time: $startTime." | timestamp 

# Get the authentication token 
$azContext = Get-AzContext
$azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile)
$token = $profileClient.AcquireAccessToken($azContext.Subscription.TenantId)
$authHeader = @{
    'Content-Type'='application/json'
    'Authorization'='Bearer ' + $token.AccessToken
}
Write-Output "Authentication Token acquired." | timestamp 

# Invoke REST API Call based on specified action
if($action -eq 'stop')
{
    # Invoke the REST API
    $restUri='https://management.azure.com/subscriptions/' + $subscriptionId + '/resourceGroups/' `
        + $resourceGroupName + '/providers/Microsoft.ContainerService/managedClusters/' `
        + $resourceName + '/'+ $action + '?api-version=2020-09-01'
    $response = Invoke-RestMethod -Uri $restUri -Method POST -Headers $authHeader
    Write-Output "$resourceName is getting stopped." | timestamp 
}
else
{
    # Invoke the REST API
    $restUri='https://management.azure.com/subscriptions/' + $subscriptionId + '/resourceGroups/' `
        + $resourceGroupName + '/providers/Microsoft.ContainerService/managedClusters/' `
        + $resourceName + '/'+ $action + '?api-version=2020-09-01'
    $response = Invoke-RestMethod -Uri $restUri -Method POST -Headers $authHeader
    Write-Output "$resourceName is Starting." | timestamp 
}

Write-Output "Script finished." | timestamp

編集中の画面はこんな感じです。

Azure Automation にコードを記載

4. 動作確認

実行は、Runbook に必要なパラメータを渡して実行すれば OK。

Runbook の実行

実行ログは、「出力」で確認できます。

実行結果の確認

AKS 側できちんと処理が行われたかどうかは、Cloud Shell などで確認できます。

$ az aks show --resource-group XXXXX --name XXXXX

....
  
  "powerState": {
    "code": "Running"
  },
  "privateFqdn": null,
  "provisioningState": "Succeeded",

5. 定時実行設定

定時実行の設定は、Automation の画面で「スケジュールへのリンク」をクリックして設定。各パラメータの指定などもこちらで可能です。詳しくは、冒頭の記事やこちらのドキュメントを参照していただければと。

おわりに

四六時中起動すべき AKS には向きませんが、検証用途などで一部の時間帯は落としておきたいケースなどでは使えるかと思います。よかったら参考にして使ってみてください~。

Discussion