個人開発や検証環境でAzureを使っていると、気になるのが「コスト」ですよね。
特に Application Gateway (Agw) や App Service、PostgreSQL は、動かしっぱなしにすると地味に費用が嵩みます。
これまでは「使う時だけポータルから手動で起動・停止」していましたが、ついつい消し忘れて翌朝絶望することも…。そこで、Azure Automation を使って、これらをスマートに自動管理する仕組みを調べて実装してみました。
1. なぜ「手動」から「自動化」へ?
手動運用の課題は、単に「面倒」なだけではありません。
• 消し忘れリスク: 24時間稼働による無駄な課金。
• 依存関係の複雑さ: App Serviceだけ起動しても、Agwが止まっているとサイトにアクセスできないといった「起動順序」のミス。
• デプロイ時の手間: 開発のたびにポータルを開くスイッチ作業のロス。
これらを解決するのが Azure Automation です。
2. Azure Automationによる自動化の仕組み
今回採用したのは、Azure Automationの 「Runbook」 機能です。
PythonのSDKを使用して、複数のリソースを一括でコントロールします。
構成のポイント
• Managed Identity: Automationアカウントに権限を付与し、パスワードレスで操作。
• Automation 変数: サブスクリプションIDやリソースグループ名をコードに直書きせず、変数として管理。
3. 【実践】Python SDKでリソースを制御するコード
実際のコードの肝となる部分を解説します。
GetAutomationVariable を使い、動的にリソースを特定して操作する流れです。
# イメージとしてのコード例
from azure.mgmt.web import WebSiteManagementClient
from azure.mgmt.rdbms.postgresql_flexibleservers import PostgreSQLManagementClient
# (中略) 認証処理など
# Automation変数から情報を取得
rg_name = get_automation_variable("ResourceGroupName")
# App Serviceの起動例
for app in web_client.web_apps.list_by_resource_group(rg_name):
if app.name == "対象のサービス名":
web_client.web_apps.start(rg_name, app.name)
print(f"{app.name} を起動しました。")
このように、xxxManagementClient を使って、リソースを探索し、start() や stop() を呼び出すだけでOKです。
4. ハマったポイント:サイトにアクセスできない!?
自動化を実装した際、App ServiceとDBを起動したのに「このサイトにアクセスできません」となることがありました。原因は Application Gateway (Agw)。
Agwはポータルに停止ボタンがないため見落としがちですが、SDK経由で停止されている場合、ここも明示的に start させる必要があります。
5. まとめと今後の展望
Azure Automationを設定すれば、スケジュール機能(Schedule)を使って「平日の夜間だけ止める」といった運用が数クリックで実現します。
• メリット: 確実なコスト削減と、ポータル操作からの解放。
• 次の一歩: 今後は「デプロイ時だけ一時的に起動し、終わったら自動で閉じる」といったGitHub Actionsとの連携も試してみたいと思います。
