この記事のゴール
Terraformを利用して既存の仮想ネットワーク(Vnet)にサブネットを作成し、Azure Bastionを作成します。
既存の仮想ネットワーク(Vnet)にサブネットのみを作成する方法は、前回の記事をご覧ください。
Terraform ファイル構成
この記事に沿って作成されるTerraformのファイル構成は以下になります。
variables.tf と terraform.tfvars についての説明は前回の記事を参照してください。
私は今回のTerraformファイルを入れるフォルダーに「1.Bastion」と名付けましたが、このフォルダーの名前はなんでもOKです。
1.Bastion
├── variables.tf # 変数定義 イメージ: int n ;
├── terraform.tfvars # variables.tfで定義した変数に値を格納 イメージ: n = 100;
├── main.tf # リソースデプロイ用の定義
Azure Bastion 関連リソース
Azure側の仕様により、Azure Bastionを作成するには以下のリソースが先に払い出されている必要があります。
- 仮想ネットワーク(VNet)
- サブネット
- パブリックIP
幸いTerraformではコード化する際に作成順序はあまり気にしなくても良い仕様となっており、すべての作成を一つのtfファイル上で記載してしまって問題ありません。
Terraform コード
variables.tf
以下の内容でvariables.tf というファイルを作成してください。
※前回作成したvariables.tfの内容と全く同じです。
variable "provider_credentials" {
type = object({
subscription_id = string
tenant_id = string
sp_client_id = string
sp_client_secret = string
})
}
terraform.tfvars
以下の内容でterraform.tfvars というファイルを作成してください。
※前回作成したterraform.tfvars の内容と全く同じです。
※青字の文字列はデプロイする環境に合わせて変更してください
provider_credentials = {
subscription_id = "your-subscription-id" #サブスクリプションID
tenant_id = "your-tenant-id" #テナントID
sp_client_id = "your-client-id" #クライアントID
sp_client_secret = "your-client-secret" #クライアントシークレット値
}
main.tf
今回は以下の内容でmain.tfを作成します。
※青字の文字列はデプロイする環境に合わせて変更してください。
# 既存のVNETを参照
data "azurerm_virtual_network" "sample_vnet"{
name = "My_VNET" # 既存の仮想ネットワーク名
resource_group_name = "Terraform_Test_RG" # 既存のリソースグループ名
}
# Bastion用 サブネットを作成
resource "azurerm_subnet" "sample_bastion_subnet"{
name = "AzureBastionSubnet" # サブネット名 ※Bastionの場合この名前で固定、変更不可
resource_group_name = data.azurerm_virtual_network.sample_vnet.resource_group_name
virtual_network_name = data.azurerm_virtual_network.sample_vnet.name
address_prefixes = ["10.0.0.0/27"] # サブネットのIPレンジ ※Bastionの場合 IPレンジは/27以上必須
}
# パブリックIPを作成
resource "azurerm_public_ip" "sample_bastion_public_ip"{
name = "bastion-pip"
location = var.location #リージョン名 terrafom.tfvars内で定義済み
resource_group_name = data.azurerm_virtual_network.sample_vnet.resource_group_name
allocation_method = "Static" #IPの動的/静的を定義 Bastionの場合は静的(Static) の選択が必須
sku = "Standard" #パブリックIPのプランを定義 Bastionの場合は Standard の選択が必須
}
# Bastionを作成
resource "azurerm_bastion_host" "sample_bastion"{
name = "sample_Bastion"
location = var.location
resource_group_name = data.azurerm_virtual_network.sample_vnet.resource_group_name
ip_configuration {
name = "bastionIpConfig" # Bastion上のパブリックIPの管理名 変更可能
subnet_id = azurerm_subnet.sample_bastion_subnet.id
public_ip_address_id = azurerm_public_ip.sample_bastion_public_ip.id
}
sku = "Basic" # Bastionのプランを選択
}
リージョンの値として記述している「var.location」は前回作成したterraform.tfvarsに定義されています。
PowerShell で Terraform コマンドを実行
Powershellを起動し、まずTerraformコマンド実行の準備のため以下のコマンドを実行します
cd <今回のtfファイルを保存したフォルダーのパス>
terraform init

続いてplanを実行し、作成したコードが問題なくデプロイ可能か確認します。
terraform plan
plan が成功すると以下のようなメッセージが返ってきます。
今回はサブネット/パブリックIP/Bastionの作成をおこなっているため、「Plan: 3 to add, 0 to change, 0 to destroy.」と記載されているはずです。

最後に terraform applyを実行し、問題なければ「yes」と入力しましょう。
terraform plan
Enter a value: yes
※Bastionは作成されるまで時間がかかります。
私の環境ではapplyの完了まで10分ほどかかりました。が1分ほど経過するとAzure上でBastionのリソースを確認できます

Azure ポータルを確認
自身のAzure環境にBastion/パブリックIPが新規作成されたことを確認しましょう
以下の画像のようにリソースが作成されていれば成功です!


(補足)作成したリソースの削除
BastionとパブリックIPは従量課金で1時間区切りで課金が発生します。
作成後に利用予定がない場合は削除することをおすすめします。
Terraformを利用して削除する場合は、今回のtfファイルを置いているディレクトリ上で以下のコマンドを実行してください。
terraform destroy
Azure ポータル上から削除する場合には、削除の順序を考慮する必要があります。
以下の順で削除を行ってください。
- Bastionのリソース削除
- パブリックIPのリソース削除
- 仮想ネットワーク内のサブネットの設定削除
※2、3はどちらが先でも大丈夫です。
コメント