リソースグループのデプロイ
- Terraformのコードは、拡張子.tfのファイルにHashiCorp Configuration Language(HCL)という言語で書く
プロバイダの設定
- 次の内容を含む main.tfというファイルを作成する
- プロバイダとしてAzureを利用し、インフラをデプロイするサブスクリプションとテナントを指定している
provider "azurerm" {
features {}
subscription_id = ”サブスクリプションIDを記載”
client_id = ”サービスプリンシパルのアプリケーションIDを記載”
client_secret = ”サービスプリンシパルのクライアントシークレットを記載”
tenant_id = ”Entra IDのテナントIDを記載”
}
リソースの設定
- Terraformでリソースを作成する際の一般的な文法
resource "<プロバイダ>_<タイプ>" "<名前>"
{
[設定・・・]
}
- プロバイダ
- プロバイダの名前(azurerm、aws、・・・)
- タイプ
- プロバイダ内に作成するリソースのタイプ
- 名前
- このリソースを参照するのにTerraformコード内で使用する識別子
- 設定
- リソース特有の引数
- 各プロバイダ、リソース、引数、などの情報は都度Terraformのドキュメントを参照する
- https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs
リソースグループのデプロイ
- Terraformのドキュメント引用(https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group)
resource "azurerm_resource_group" "example" {
name = "example"
location = "West Europe"
}
- 今回は下記のようにmain.tfファイルに書く
provider "azurerm" {
features {}
subscription_id = ”サブスクリプションIDを記載”
client_id = ”サービスプリンシパルのアプリケーションIDを記載”
client_secret = ”サービスプリンシパルのクライアントシークレットを記載”
tenant_id = ”Entra IDのテナントIDを記載”
}
resource "azurerm_resource_group" "rg-tf" {
name = "rg-tf"
location = "Japaneast"
}
Terraformの実行
- ターミナルを起動し、main.tfファイルを作ったフォルダを開き、terraform initコマンドを実行する
- Terraformを初めて使うときには terraform init を実行して、Terraformがコードをスキャンし、どのプロバイダを使うのか判断し、そのプロバイダに関するコードをダウンロードする必要がある
- デフォルトでは、.terraformディレクトリにダウンロードされる
- .terraform.lock.hclファイルにダウンロードしたプロバイダのコードについての情報も保存する
実行結果
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/azurerm...
- Installing hashicorp/azurerm v3.93.0...
- Installed hashicorp/azurerm v3.93.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
- プロバイダのコードがダウンロードされたので、terraform planを実行する
- planコマンドを使うと、実際に変更を加える前にTerraformが何をする予定なのか確認できる
- (+):作成されるもの
- (ー):削除されるもの
- (〜):変更されるもの
実行結果
$ terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# azurerm_resource_group.rg-tf will be created
+ resource "azurerm_resource_group" "rg-tf" {
+ id = (known after apply)
+ location = "japaneast"
+ name = "rg-tf"
}
Plan: 1 to add, 0 to change, 0 to destroy.
- 最後に、実際にリソースを作成するには、terraform applyコマンドを実行する
azurerm_resource_group.rg-tf: Creating...
azurerm_resource_group.rg-tf: Creation complete after 1s [id=/subscriptions/xxxxxxxxxxxxxxxx/resourceGroups/rg-tf]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
リソースの変更
- リソースグループにタグを付けてみる
provider "azurerm" {
features {}
subscription_id = ”サブスクリプションIDを記載”
client_id = ”サービスプリンシパルのアプリケーションIDを記載”
client_secret = ”サービスプリンシパルのクライアントシークレットを記載”
tenant_id = ”Entra IDのテナントIDを記載”
}
resource "azurerm_resource_group" "rg-tf" {
name = "rg-tf"
location = "Japaneast"
tags = {
environment = "Staging"
}
}
- Teraform applyをもう一度実行してみる
$ terraform apply
azurerm_resource_group.rg-tf: Refreshing state... [id=/subscriptions/xxxxxxxxxxxx/resourceGroups/rg-tf]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
~ update in-place
Terraform will perform the following actions:
# azurerm_resource_group.rg-tf will be updated in-place
~ resource "azurerm_resource_group" "rg-tf" {
id = "/subscriptions/92c7afc3-695f-47ac-bdf2-66494e00abbb/resourceGroups/rg-tf"
name = "rg-tf"
~ tags = {
+ "environment" = "Staging"
}
# (1 unchanged attribute hidden)
}
Plan: 0 to add, 1 to change, 0 to destroy.
- (+)は「”environment” = “Staging”」のみ(Refeshing state…と出力されている)。Terraformは、リソースグループが既に存在していることをわかっている
- Terraformは、現在デプロイされているものとTerraformのコードに書かれていることの差分を表示する。所謂、手続き型言語の特徴
参考
https://learn.microsoft.com/ja-jp/azure/developer/terraform/create-resource-group?tabs=azure-cli