AzureにLINUX(Ubuntu)のポート転送サーバを構築します。
Azure Automation(Runbook)でUbuntuの仮想マシンを作成し、ポート転送設定までを自動化します。
必要な時だけ仮想マシンを生成し、使い終わったら削除する形態とすることで、使用しない時は利用料のかからないようにするということです。
作成する仮想マシンは、インスタンスタイプ「B1s」(1core 1GiB)、ディスク「32GiB」のHDDとします。
ミニマム構成としましたので、課金は数円/時間程度だと思います。
構築用のRunbook
例として、ポート80番で受けたHTTP通信を別のWEBサーバへ転送します。
管理者のパスワードはランダムな英大小文字、数字としていますが、あくまでも必要な時だけ稼働する踏み台ということでサーバにログインできなくても問題ありません。
設定内容は再起動すると消えてしまいますが、インスタンスの新規構築、削除という運用としています。
# ポート転送用VM作成
#
try
{
Write-Output "Logging in to Azure..."
$null = Connect-AzAccount -Identity
}
catch {
Write-Error -Message $_.Exception
throw $_.Exception
}
# 管理者ユーザ、パスワード(自動生成)
$AdminUsername = "LocalAdminUser"
$AdminPassword = -join((65..90 | Get-Random -Count 4) + `
(97..122 | Get-Random -Count 4) + `
(48..57 | Get-Random -Count 4) `
| Get-Random -Count 12 | ForEach-Object {[char]$_})
# リソース配置
$ResourceGroupName = "(リソースグループ名)"
$Location = "Japan East"
# 仮想マシン名、サイズ
$VMName = "(サーバ名)"
$VMSize = "Standard_B1s"
# 仮想ネットワーク、サブネット名
$VNetName = "(VNet名)"
$SubnetName = "(サブネット名)"
Write-Output "仮想マシン($VMName)の作成"
# NetworkInterface作成
$Vnet = Get-AzVirtualNetwork -Name $VNetName -ResourceGroupName $ResourceGroupName
$subnet = Get-AzVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $Vnet
$NIC = New-AzNetworkInterface -Name "${VMName}-nic" `
-ResourceGroupName $ResourceGroupName `
-Location $Location `
-SubnetId $subnet.Id
# Credential作成
$pass = ConvertTo-SecureString -String $AdminPassword -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential($AdminUsername, $pass);
# VirtualMachine準備
$vmConfig = New-AzVMConfig -VMName $VMName `
-VMSize $VMSize
$vmConfig = Set-AzVMOSDisk -VM $vmConfig `
-Name "${VMName}-OsDisk" `
-StorageAccountType "Standard_LRS" `
-CreateOption FromImage `
-DiskSizeInGB 32
$vmConfig = Set-AzVMSourceImage -VM $vmConfig `
-PublisherName "Canonical" `
-Offer "0001-com-ubuntu-server-jammy" `
-Skus "22_04-lts-gen2" `
-Version latest
$vmConfig = Add-AzVMNetworkInterface -VM $vmConfig `
-Id $NIC.Id
$vmConfig = Set-AzVMOperatingSystem -VM $vmConfig `
-Linux `
-ComputerName $VMName `
-Credential $Credential
$vmConfig.DiagnosticsProfile = New-Object Microsoft.Azure.Management.Compute.Models.DiagnosticsProfile
$vmConfig.DiagnosticsProfile.BootDiagnostics = New-Object Microsoft.Azure.Management.Compute.Models.BootDiagnostics
$vmConfig.DiagnosticsProfile.BootDiagnostics.Enabled = $true
# VirtualMachine作成
Write-Output "Create Virtual Machine"
New-AzVM -VM $vmConfig `
-ResourceGroupName $ResourceGroupName `
-Location $Location `
-WarningAction Ignore
# ポート転送
$script = @'
#!/bin/bash
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination (転送先IPアドレス):80
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
'@
# スクリプトをVMに送信して実行
Invoke-AzVMRunCommand -ResourceGroupName $ResourceGroupName `
-VMName $VMName `
-CommandId 'RunShellScript' `
-ScriptString $script
# 終了
Write-Output "Generated Password: $AdminPassword"
削除用のRunbook
使用が終わったら速やかにリソースを削除します。
仮想マシン、ディスク、NICを削除します。
順番に削除していくだけです。
try
{
"Logging in to Azure..."
Connect-AzAccount -Identity
}
catch {
Write-Error -Message $_.Exception
throw $_.Exception
}
$ResourceGroupName = "(リソースグループ名)"
$VMName = "(サーバ名)"
$vm = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName
If ($vm) {
Write-Output "Remove Virtual machine, Disk, NIC"
Remove-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Force
Remove-AzDisk -ResourceGroupName $ResourceGroupName -DiskName $vm.StorageProfile.OsDisk.Name -Force
Remove-AzNetworkInterface -ResourceGroupName $ResourceGroupName -Name $vm.NetworkProfile.NetworkInterfaces[0].Id.Split('/')[-1] -Force
}
コメント