Azure Bastionの自動起動停止(新規作成削除)

Azure,Bastion,PowerShell/Azure CLI

Azure Bastionには起動停止はありません。その為に課金が継続して掛かります。
仮想マシンを停止していたりアクセスしない時間帯起動しておくことはコストが無駄になります。

Azure Bastionの価格

停止させて課金を抑えたい所ですが、Azure Bastion自体の起動停止は出来ません。
作成削除するしか課金を抑える手段はありません。

それなら使う度に作成削除しちゃおうという事でAzure Bastion(SKUはStandard)の作成をPowerShellを使ってやってみました。
PowerShellだとネイティブクライアントの有効化が出来なかった(記載時点)ので、REST API(Logic Apps)を使ったBastionの作成削除もやってみました。

スポンサーリンク

PowerShellを使ったAzure Bastion作成、削除

Azure Bastionに関するPowerShellコマンドレット

Azure Bastionに関するPowerShellコマンドレットは4つです。
作成、情報取得、更新、削除になります。
作成時はリソース名、リソースグループ名、ロケーション、仮想ネットワークのリソース情報、パブリックIPのリソース情報、SKUなどを指定します。Portalで作成時と同じ項目になります。

処理 Azure PowerShell
作成 New-AzBastion
取得 Get-AzBastion
更新 Set-AzBastion
削除 Remove-AzBastion

PowerShellを使ってAzure Bastionを作成する

今回はこのような設定でAzure Bastionを作成してみます。

    • 設定値
      • Bastionホスト名: test-bastion
      • SKU:Standard
      • リソースグループ名: Test-RG-01
      • 場所:米国西部2
      • 仮想ネットワーク名:Test-VNET-01
      • パブリックIP名:bastion-ip

仮想ネットワークおよびAzure Bastion用のサブネット(サブネット名:AzureBastionSubnet)を準備済みであるで想定で進めます。課金が掛かるパブリックIPとAzure Bastionのリソースを新規作成しています。

Portalを利用したBastionホストの作成はこちら。

Azure Bastionホストを作成

Get-AzVirtualNetworkを使って仮想ネットワークの情報を取得しています。

New-AzPublicIpAddressでパブリックIPの作成をしています。Bastionの場合パブリックIPのSKUはStandardの必要があります。

New-AzBastionでBastionを作成しています。
Bastionホスト名、ロケーション、リソースグループ名を指定します。
その他PublicIpAddressとVirtualNetworkとSKUを指定しています。

 

#変数設定
$resourcegroup = “Test-RG-01"
$vnetneme  = “Test-VNET-01"
$pubipname = “bastion-ip"
$location = “westus2"
$bastionname = “test-bastion"

#サブスクリプション指定
$subscription = “サブスクリプションID"
Set-AzContext -SubscriptionId $subscription

#仮想ネットワーク情報取得
$vnet = Get-AzVirtualNetwork -Name $vnetneme `
 -ResourceGroupName $resourcegroup

#パブリックIP作成
 $publicip = New-AzPublicIpAddress -Name $pubipname `
 -ResourceGroupName $resourcegroup  `
 -Location $location `
 -AllocationMethod Static `
 -IpAddressVersion “IPv4" `
 -Sku Standard

#Azure Bastion作成
New-AzBastion -Name $bastionname `
 -ResourceGroupName $resourcegroup `
 -PublicIpAddress $publicip `
 -VirtualNetwork $vnet `
 -Sku “Standard"

※今回は省略していますがScale Unitの指定も出来ます。デフォルト値設定だったので今回は省略しています。

PowerShellを使ってAzure Bastionを削除する

先ほど作成したAzure Bastionを削除してみます。
課金が掛かるパブリックIPとAzure Bastionのリソースを削除しています。
仮想ネットワークやサブネットはそのまま残しています。

Azure Bastionホストを削除

Remove-AzBastionを使ってBastionホストを削除しています。

Remove-AzPublicIpAddressでパブリックIPを削除しています。

#変数設定
$resourcegroup = “Test-RG-01"
$bastionname = “test-bastion"
$pubipname = “bastion-ip"

#サブスクリプション指定
$subscription = “サブスクリプションID"
Set-AzContext -SubscriptionId $subscription

#Azure Bastion削除
Remove-AzBastion -Name $bastionname `
 -ResourceGroupName $resourcegroup `
 -Force

#パブリックIP削除
Remove-AzPublicIpAddress -Name $pubipname `
 -ResourceGroupName $resourcegroup `
 -Force

※パブリックIPがリソースIDで削除できないようでした。なのでリソースグループ、リソース名を指定して削除しています。

PowerShellを使った場合はネイティブクライアント等を有効化出来ない

PowerShellでAzure Bastionのリソース自体は作成出来るのですが、ネイティブクライアントの有効化等設定出来ない項目が存在します。実際にPortalで作成されたリソースを確認しても有効化されていません。

REST APIを使ってAzure Bastionを作成、削除

Azure BastionのREST API

Azure Bastionに関するREST APIはマイクロソフトで公開されています。

Bastion Hosts(REST API)

作成更新、リスト表示、ホスト情報の取得、削除等がありBastionの操作に必要なREST APIが揃っています。

REST APIを定期実行させる環境としてLogic Appsを利用

仮想マシンの起動停止と併せて使う事を想定している為、REST APIを定期実行させる必要があります。
今回はAzureネイティブに実行させるという事でLogic Appsを使ってやってみました。

今回はパブリックIPと仮想ネットワーク準備済みである前提で進めます。Logic Apps自体のリソースも事前に準備済みである想定で進めます。

REST API(Logic Apps)を使ってAzure Bastionホストを作成

ロジックアプリデザイナーで設定を進めていきます。
スケジュール設定、変数設定、HTTPのアクションを使ったREST API実行と言う流れになります。

Azure Bastionホストを作成
トリガーの繰り返しでスケジュール設定を行います。
今回は日本時間15時に開始するようにしています。

設定値を指定します。
変数を初期化するを選択します。
Bastionホスト作成時の設定値を指定します。

  • 変数(設定値)
    • サブスクリプションID
    • リソースグループ名
    • Bastionホスト名
    • 仮想ネットワーク名
    • パブリックIP名
REST APIを実行させる為にはHTTPのアクションを利用します。
新規作成時にはPUTを使います。
URIでは作成するBastionホストのリソースIDを設定します。
ヘッダーのキーにはContent-Typeを設定します。
値にはapplication/jsonを設定します。

本文には設定値を記載します。
REST APIの解説にある要求本文を参考に記載しています。
ネイティブクライアントの設定値はproperties.enableTunnelingになります。

※コピー貼り付けに関する項目にはproperties.disableCopyPasteを使っています。
※環境に合わせて変数化します。今回は構成情報やSKUは本文で直接指定しています。

認証にはシステム割り当てマネージドIDを使っています。

※事前にLogic AppsでマネージドIDを有効化して適切な権限付与を行っておきます。

ネイティブクライアントの設定状況を確認

ネイティブクライアントが有効化されているかを確認してみます。

作成したBastionホストの構成情報
ネイティブクライアント サポートが有効化されている事が確認出来ます。

REST API(Logic Apps)を使ってAzure Bastionホストを削除

作成時と同様にスケジュール設定、変数設定、HTTPのアクションを使ったREST API実行と言う流れになります。

Azure Bastionホストを削除
HTTPの方法でDELETEを選択します。
削除時にはヘッダーや本文の設定は必要ありません。

※作成と同じ部分は割愛しています。

最後に

Azure Bastionホストの作成、削除をスケジュール実行する事が出来ました。
仮想マシンの自動起動停止と組み合わせて使う事でコスト削減も可能かと思いました。