LoginSignup
2
0

Terraform CLIの環境をTerraform Cloudに移行してみた

Posted at

はじめに

Terraform CLIの環境をTerraform Cloudに移行してみました。
その際にローカルとは違う部分や詰まったところを書いていきます。
ローカル(作業端末)はWindows 11で構築するクラウドのリソースはAzureです。

Terraform Cloudの準備

まずはアカウント登録してWorkspaceを作成します。
今回はworkflowをCLI-drivenにしました。

workspaceの設定です。
Execution ModeはRemoteにします。
terraformの実行環境をterraform Cloudに任せるタイプです。

後は適当に。

Terraform CLIでのModuleの構成

Terraform CLIでは共通的な部分をModuleとして利用していました。
各リソースを作成する定義を用意しておき、変数を渡して複数作成できるようにしていました。

ローカルのフォルダ構成
home
│  recovery_services_vault.tf
│  resource_group.tf
│  storage_account.tf
│  variables.tf
│  virtual_network.tf
├─env
│  ├─dev
│  │      main.tf
│  │      variables.tf
│  └─prd    
│
└─modules
    ├─lb
    │      lb.tf
    │      outputs.tf
    │      variables.tf
    ├─nsg
    │      nsg.tf
    │      variables.tf
    └─vm
            manageddisk.tf
            outputs.tf
            variables.tf
            vm.tf

呼び出しの指定はこんな感じ。
実行ディレクトリからの相対パスです。

module "main" {
  source = "../../"

  resource_group            = local.resource_group
  virtual_network           = local.virtual_network
  subnet                    = local.subnet
}

module "vm01" {
  source = "../../modules/vm/"

  vm              = local.vm01_vm
  data_disk       = local.vm01_data_disk
  virtual_network = local.virtual_network.vnet1
  subnet          = local.subnet.sub1
}

Terraform CloudでのModuleの構成

Module自体はGitHubやS3等色々なサービスで使用出来ますが今回は折角Terraform Cloudを使うので
Terraform Registryに登録してみます。

Module用GitHubリポジトリの作成

Module登録にはGitHubのリポジトリを指定する必要があります。
そのためGitHubのリポジトリを事前に作成しておきます。
リポジトリ名はterraform-<PROVIDER>-<NAME>とする必要がありますのでAzureの場合、
terraform-azurerm-devmodule 等のようにします。
また、リリースしている必要もありますので忘れずにリリースもします。

なお、リポジトリはPrivateで大丈夫です。

リポジトリの構成
home
│  availability.tf
│  recovery_services_vault.tf
│  resource_group.tf
│  storage_account.tf
│  variables.tf
│  virtual_network.tf
└─modules
    ├─lb
    │      lb.tf
    │      outputs.tf
    │      variables.tf
    ├─nsg
    │      nsg.tf
    │      variables.tf
    └─vm
            manageddisk.tf
            outputs.tf
            variables.tf
            vm.tf

Terraform RegistryにModule登録

上記のリポジトリを登録

リポジトリが命名規則に則っていない場合は一覧に表示されません。

Terraform Registryでバージョン毎の構成を見れます。

上記のようなフォルダ構成にした場合はmodules以下のフォルダはサブモジュールとして登録されます。

Moduleの呼び出し

Moduleの呼び出し記述はapp.terraform.io/<organization>/module/azurermとなります。
Moduleのversionも指定します。
サブモジュールを指定する場合は基本のパスの最後に/を2つ入れた後に配下のフォルダ名となります。

main.tf

module "main" {
  source  = "app.terraform.io/<organization>/module/azurerm"
  version = "1.0.4"

  resource_group            = local.resource_group
  virtual_network           = local.virtual_network
  subnet                    = local.subnet
}

module "vm01" {
  source  = "app.terraform.io/<organization>/module/azurerm//modules/vm/"
  version = "1.0.4"

  vm              = local.vm01_vm
  data_disk       = local.vm01_data_disk
  virtual_network = local.virtual_network.vnet1
  subnet          = local.subnet.sub1
}

Terraform Cloudで実行するように定義していきます。
Terraform Cloudのorganizationとworkspace名を指定します。
テナントIDとサブスクリプションIDはTerrform CloudのVariablesでも登録出来ますが、
気軽に変更出来るようにローカル環境で定義します。

remote.tf
terraform {
  cloud {
    organization = "<organization name>"

    workspaces {
      name = "workspace name"
    }
  }
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
    }
  }
}

provider "azurerm" {
  features {}
  subscription_id = "<subscription_id>"
  tenant_id       = "<tenant_id>"
}

Azureへの認証

Azureにはサービスプリンシパルを使って認証します。
Azure Portalでサービスプリンシパルを作成します。
ロールの付与も忘れずに。

シークレットキーとクライアントIDをVariablesに登録します。

  • ARM_CLIENT_ID
  • ARM_CLIENT_SECRET

Terraform Cloudへの認証

Terraform CloudへはTokenで認証します。
Windowsの場合、Tokenを%APPDATA%\terraform.rcに格納すれば大丈夫とドキュメントに記載があったのですが、うまく動作しなかったので
terraform loginで遷移した画面でTokenを発行しました。

%AppData%terraform.dというフォルダが出来上がり、その中のファイルに記述されていました。

Token記述の形式は以下です。

credentials "app.terraform.io" {
  token = "xxxxxx.atlasv1.zzzzzzzzzzzzz"
}

実行

準備完了後はCLIと同じように実行することでリソース作成が出来ます。

terraform init
terraform plan
terraform apply

実行結果や状態はTerraform Cloudで確認出来ます。

さいごに

複数人で実行する場合はTerraform Cloudで管理するのがいいですね。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0