前回、Terraformを使ったAzureへのリソース作成について書きました。
この時は、リソースグループ含めてすべてのリソースをTerraformから作成しましたが、既にAzure上に作成済みのリソースがある際には、その既存リソース情報を利用して既存のリソースに追加する、という事も可能です。
本記事では、既存のリソースグループ内にTerraformを使ってリソースを追加する方法について解説します。
既存Azureリソースの参照
Terraform定義ファイル内で既存Azureリソースを参照する場合、dataブロックを使用することで参照することが可能となります。
dataブロックにて参照可能な情報としては、各リソースの「Data Sources」にて記載がある情報を取得可能です。
実行例
今回は例として以下リソースのデプロイする場合の例の記載致します。
※今回はサービスプリンシパルを使用した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 validate
構成の検証をします。
問題がなければ「Success! The configuration is valid.」と表示されます。
terraform plan
tfファイルにて定義された構築リソースを表示します。
※今回のように「.tfvars」で環境情報等を別ファイルで管理している場合は「-var-file」オプションにて「terraform.tfvars」ファイルを参照しコマンドを実行します。
構築内容や、作成・削除・変更されるリソース数が表示されます。
terraform apply
リソースをデプロイします。
※今回のように「.tfvars」で環境情報等を別ファイルで管理している場合は「-var-file」オプションにて「terraform.tfvars」ファイルを参照しコマンドを実行します。
内容に問題がないことを確認し、「yes」を入力後「Enter」を押下します。
問題なくデプロイを実行できると「Apply complete! Resources: * added, * changed, * destroyed.」と表示されます。
Azure Portalを確認すると、リソースが問題なく構築されていることが確認できます。
おわりに
本記事を最後までお読みいただき、ありがとうございます。 本記事がTerraformを使用する際の参考となれば幸いです。