📝
[Azure] AKS の定時起動・停止を Azure Automation で行う
はじめに
Azure Kubernetes Service にて、クラスタを一時停止する機能が実装されました。これで、使っていない間はコンピューティングの費用を抑えることができます。
この自動化を考えた時、Microsoft Tech Community の記事で参考になりそうなものがあったため、それをベースに AKS に対応させ、試してみました。
手順
- Azure Automation アカウントの作成
- Az.Accounts モジュールのインポート
- 新しく Runbook を作成し、コードを登録して公開
- 動作確認
- 定時実行設定
1. Azure Automation アカウントの作成
まずは、Azure Automation アカウントを作成します。こちらの手順に則れば、特に迷うことはないかと。
2. Az.Accounts モジュールのインポート
スクリプトの中で Azure アカウントの情報を扱う部分があるため、Az.Accounts モジュールをインポートします。「モジュール ギャラリー」から Az.Accounts
で検索してインポートすれば OK です。
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
編集中の画面はこんな感じです。
4. 動作確認
実行は、Runbook に必要なパラメータを渡して実行すれば OK。
実行ログは、「出力」で確認できます。
AKS 側できちんと処理が行われたかどうかは、Cloud Shell などで確認できます。
$ az aks show --resource-group XXXXX --name XXXXX
....
"powerState": {
"code": "Running"
},
"privateFqdn": null,
"provisioningState": "Succeeded",
5. 定時実行設定
定時実行の設定は、Automation の画面で「スケジュールへのリンク」をクリックして設定。各パラメータの指定などもこちらで可能です。詳しくは、冒頭の記事やこちらのドキュメントを参照していただければと。
おわりに
四六時中起動すべき AKS には向きませんが、検証用途などで一部の時間帯は落としておきたいケースなどでは使えるかと思います。よかったら参考にして使ってみてください~。
Discussion