【Terraform】既存の仮想ネットワーク内にサブネットを作成

前提条件

Azure上にて以下の操作が完了済みです。

  • サブスクリプションの作成
  • サービスプリンシパルの作成(アプリの登録)
  • サービスプリンシパルのシークレット値を生成
  • サービスプリンシパルにサブスクリプションの共同作成者の権限を付与
  • リソースグループの作成
  • 仮想ネットワークの作成

Terraformコード

今回は以下のファイル構造で3つのファイルのみを使用します。

project-root/
├── variables.tf     # 変数定義  イメージ:  int n ;
├── terraform.tfvars # variables.tfで定義した変数に値を格納 イメージ: n = 100;
├── main.tf          # リソースデプロイ用の定義

variables.tf

variables.tf には次のように変数を定義します。
以下ではサービスプリンシパルについての変数しか定義ていません。
以下の場合、main.tf ではvar.provider_credentials.<変数名>で変数を呼び出すことができます。

variable "provider_credentials" {
  type = object({
    subscription_id  = string
    tenant_id        = string
    sp_client_id     = string
    sp_client_secret = string
  })
}

terraform.tfvars

terraform.tfvars にはTerraformコマンドを実行した際に、自分のサブスクリプションに適用されるようにサービスプリンシパル(アプリの登録)の設定値を以下のように記述します。
青字の文字列はデプロイする環境に合わせて変更してください。

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"    #クライアントシークレット値
}

前提条件のもとで同じサブスクリプションに別のリソースをデプロイする場合は、設定値が変わらないため今回作成した terraform.tfvars と variables.tfのファイルは使いまわしてOKです。

main.tf

main.tf にてようやくリソースの払い出しについて記述します。
「既存の仮想ネットワークにサブネットを作成」をおこなう場合は以下のように記述します。
青字の文字列はデプロイする環境に合わせて変更してください。

provider "azurerm" {
    subscription_id = var.provider_credentials.subscription_id
    tenant_id       = var.provider_credentials.tenant_id
    client_id       = var.provider_credentials.sp_client_id
    client_secret   = var.provider_credentials.sp_client_secret
    features {}
}

# 既存のVNETを参照
data "azurerm_virtual_network" "sample_vnet" {
    name                = "My_VNET"            # 既存の仮想ネットワーク名
    resource_group_name = "Terraform_Test_RG"  # 既存のリソースグループ名
}

# 新規のサブネットを作成
resource "azurerm_subnet" "sample_subnet" {
    name                 = "Terraform_Subnet01"   # 新規作成するサブネット名
    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/28"]        # 新規作成するサブネットのIPレンジ
}

data “azurerm_virtual_network” “sample_vnet” {} で仮想ネットワークを定義することで、Terraform上で管理していない仮想ネットワークをあるものとして認識させることができます。
これにより、Terraform上の管理下に置きたくないリソースも見かけ上参照させることができます。

Powershell で Terraform コマンドを実行

Powershellを起動し、まずTerraformコマンド実行の準備のため以下のコマンドを実行します

terraform init

成功すると以下のようなメッセージが返ってきます。

続いてplanを実行し、作成したコードが問題なくデプロイ可能か確認します。

terraform plan

plan が成功すると以下のようなメッセージが返ってきます。
今回はサブネットの作成のみのため、「Plan: 1 to add, 0 to change, 0 to destroy.」と記載されています。

いよいよ、Azure上へデプロイします。
以下のコマンドを実行してください。

terraform apply

以下のように applyを実行するしコードに問題がなければ、最終的に本当にデプロイをするかを聞いてきます。
問題なければ「yes」と入力しましょう。

Azureにデプロイ反映されるまで待ちます…。作成が完了すれば以下のようにメッセージが返ってきます。(私の環境では10秒ほどで反映されました)

Azure ポータルを確認

自身のAzure環境にサブネットが新規作成されたことを確認しましょう
以下の画像のように意図した仮想ネットワークにサブネットが作成されていれば成功です!

まとめ

今回は既存仮想ネットワークに新規サブネットを作成するTerraformコードについて紹介しました。
main.tf 内でdataを使用することでTerraform管理上に存在しない仮想ネットワークをあるものとしてTerraformに認識させPlanを通すことができました。
他のリソースでも応用が利きそうですね

※ちなみにリソースグループはTerraformの管理下になくても仮想ネットワークのdataを使って定義する必要はないそうです。

コメント

タイトルとURLをコピーしました