既存Azureリソースを参照しTerraformで追加のリソースを作成する

前回、Terraformを使ったAzureへのリソース作成について書きました。

blog.jbs.co.jp

この時は、リソースグループ含めてすべてのリソースをTerraformから作成しましたが、既にAzure上に作成済みのリソースがある際には、その既存リソース情報を利用して既存のリソースに追加する、という事も可能です。

本記事では、既存のリソースグループ内にTerraformを使ってリソースを追加する方法について解説します。

既存Azureリソースの参照

Terraform定義ファイル内で既存Azureリソースを参照する場合、dataブロックを使用することで参照することが可能となります。

dataブロックにて参照可能な情報としては、各リソースの「Data Sources」にて記載がある情報を取得可能です。

registry.terraform.io

実行例

今回は例として以下リソースのデプロイする場合の例の記載致します。

※今回はサービスプリンシパルを使用したAzureへの認証にて実施致します。

  • リソースグループ:既存リソース
  • 仮想ネットワーク:新規リソース
  • サブネット:新規リソース

定義ファイルの記載例

main.tfの作成

provider情報、状態格納先ストレージアカウントを記載します。

# Env info
provider "azurerm" {
  features {}
  subscription_id = var.subscription_id
  tenant_id       = var.tenant_id
  client_id       = var.client_id
  client_secret   = var.client_secret
}

# Azure Provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=3.25.0"
    }
  }

  # Store Terraform state in Azure Storage
  backend "azurerm" {
    resource_group_name  = "<Resource Group名(状態格納用ストレージアカウントが格納されているResource Group)>"
    storage_account_name = "<Storage Account名>"
    container_name       = "<Blob Container名>"
    # Statment File Name
    key = "terraform.tfstate"
  }
}
rg.tfの作成

リソースグループ設定を記載します。

#-------------------------------
# Resource Group
#-------------------------------

# Resource Group
data "azurerm_resource_group" "rg" {
  name     = var.resource_group_name
}
vnet.tfの作成

仮想ネットワーク設定を記載します。

#-------------------------------
# Virtual Network
#-------------------------------

# Virtual Network
resource "azurerm_virtual_network" "vnet" {
  name                = var.virtual_network_name
  address_space       = var.vnet_address_space
  location            = var.location
  resource_group_name = data.azurerm_resource_group.rg.name
  depends_on = [
    data.azurerm_resource_group.rg
  ]
}

# Subnet
resource "azurerm_subnet" "snet" {
  name                 = var.subnet_name
  resource_group_name  = data.azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = var.snet_address_space
  depends_on = [
    data.azurerm_resource_group.rg,
    azurerm_virtual_network.vnet
  ]
}
valiables.tfの作成

各リソースの値を記載します。

#-------------------------------
# 基本変数定義
#-------------------------------

# Subscription ID
variable "subscription_id" {}

# Service Principal ID
variable "client_id" {}

# Service Principal Secret
variable "client_secret" {}

# TenantID
variable "tenant_id" {}

# Region
variable "location" {
  default = "<作成先Region>"
}


#-------------------------------
# Resource Group
#-------------------------------

# Resource Group Name
variable "resource_group_name" {
  default = "<既存Resource Group名>"
}

#----------------------------------
# Virtual Network
#----------------------------------

# Virtual Network Name
variable "virtual_network_name" {
  default = "<VNET名>"
}

# Subnet Name
variable "subnet_name" {
  default = "<Subnet名>"
}

# Vnet Address Space
variable "vnet_address_space" {
  default = ["<VNET IP Prefix>"]
}

# Subnet Address Space
variable "snet_address_space" {
  default = ["<Subnet IP Prefix>"]
}
tarraform.tfvarsの記載

環境情報等を記載
※環境情報等を別ファイル管理をする場合に作成

# Subscription ID
subscription_id = "<Subscription ID>"

# Tenant ID
tenant_id = "<Tenant ID>"

# Service Principal ID
client_id = "<Service Principal ID>"

# Srcret (Service Principal)
client_secret = "<Srcret>"

Terraformコマンドの実行

定義ファイルの作成が完了しましたら、Terraformコマンドを実行していきます。

terraform init

初期化をし、provider pluginsを取得します。

成功すると「Terraform has been successfully initialized!」と表示されます。

terraform init実行画面

terraform validate

構成の検証をします。

問題がなければ「Success! The configuration is valid.」と表示されます。

terraform validate実行画面

terraform plan

tfファイルにて定義された構築リソースを表示します。

※今回のように「.tfvars」で環境情報等を別ファイルで管理している場合は「-var-file」オプションにて「terraform.tfvars」ファイルを参照しコマンドを実行します。

terraform plan実行画面(1)

構築内容や、作成・削除・変更されるリソース数が表示されます。

terraform plan実行画面(2)

terraform apply

リソースをデプロイします。

※今回のように「.tfvars」で環境情報等を別ファイルで管理している場合は「-var-file」オプションにて「terraform.tfvars」ファイルを参照しコマンドを実行します。

terraform apply実行画面(1)

内容に問題がないことを確認し、「yes」を入力後「Enter」を押下します。

terraform apply実行画面(2)

問題なくデプロイを実行できると「Apply complete! Resources: * added, * changed, * destroyed.」と表示されます。

terraform apply実行画面(3)

Azure Portalを確認すると、リソースが問題なく構築されていることが確認できます。

Azure Portal画面

おわりに

本記事を最後までお読みいただき、ありがとうございます。 本記事がTerraformを使用する際の参考となれば幸いです。

執筆担当者プロフィール
西山 正太郎

西山 正太郎(日本ビジネスシステムズ株式会社)

クラウドソリューション事業本部に所属。近年は業務で主にMicrosoft Azureに携わっています。山登りが趣味です。

担当記事一覧