本文へスキップ

Equinix/MetalからEquinix/Equinixへの移行

[Equinix Metal(旧Packet)はPlatform Equinixに完全に統合されたため、テラフォームプロバイダーも変更されました。このプロバイダ(terraform-provider-equinix、provider equinix/equinix)は、Platform Equinixで利用可能なさまざまなサービスのプロバイダであり、Terraformを使用して管理できます。

terraform-provider-metalを使用していて、新しいバージョンのプロバイダを使用してEquinix Metalでリソースを管理する場合は、HCLファイルの参照を変更する必要があります。リソースの名前をmetal_deviceからequinix_metal_deviceに変更するだけです。これでうまくいくはずですが、metal_deviceが破棄され、代わりに新しいequinix_metal_deviceが作成されます。リソースの再作成は望ましくないかもしれないので、このガイドでは再作成せずにequinix_metal_リソースに移行する方法を示します。

Terraformテンプレートの移行を始める前に、以下をアップグレードしてください。

  • Equinix/Metalプロバイダを最新バージョン(3.2.1)に更新しました。
  • Terraformのバージョンをv0.13以上にしてください。

プロバイダの置き換えとsedによる迅速な移行

Terraform HCL テンプレートと同様に、Terraform の状態はリソース名とその属性を構造化されたテキストで含むファイルです。可能な限りmetal_equinix_metal_に置き換え、プロバイダのソースリファレンスを修正します。

この作業を行う前にTerraformディレクトリ全体のバックアップを取ることをお勧めします。

以下のテンプレートから作成されたインフラストラクチャがあるとします:

terraform {
required_providers {
metal = {
source = "equinix/metal"
}
}
}

resource "metal_project" "example" {
name = "example"
}

resource "metal_vlan" "example" {
project_id = metal_project.example.id
facility = "sv15"
description = "example"
}

まずTerraformのステートファイル(terraform.tfstate)のプロバイダをterraform stateサブコマンドreplace-providerで変更します:

terraform state replace-provider equinix/metal equinix/equinix

次に、HCL テンプレート内のプロバイダ参照を置き換えます。この作業を、参照を持つすべてのファイルに対して行います:

sed -i 's|equinix/metal|equinix/equinix|g' main.tf

次に、Terraform HCLファイルのすべての文字列metal_equinix_metal_に置き換えるだけです。

sed -i 's/metal_/equinix_metal_/g' main.tf

...これは少し危険なので、git diffの後にチェックしてください。これはmetal_プレフィックスをすべて置き換え、required_providersブロックのキーも置き換える必要があります。

次に、terraformステートファイルのmetal_equinix_metal_に置き換えます:

sed -i 's/metal_/equinix_metal_/g' terraform.tfstate

テンプレートの例は次のようになります:

terraform {
required_providers {
equinix = {
source = "equinix/equinix"
}
}
}

resource "equinix_metal_project" "example" {
name = "example"
}

resource "equinix_metal_vlan" "example" {
project_id = equinix_metal_project.example.id
facility = "sv15"
description = "example"
}

次にterraform initを実行してequinix/equinixプロバイダをインストールする必要があります。その後、テンプレートがTerraformの状態やEquinix Metalのアップストリームリソースと照合されます。terraform planを実行して結果を確認できます。

プランが空でない場合、リソースの一部がアップストリームから単純に読み取れないか、equinix/metalプロバイダのバージョンとequinix/equinixプロバイダの現在のバージョンの間で属性が変更されていることを意味します。

一度に1つのリソースを移行

terraform stateterraform importを使って、既存のリソースを破壊することなく移行を実現できます。

既存のインフラストラクチャ

プロバイダequinix/metalで作成されたインフラストラクチャがデバイスとIP予約を持っていると仮定します。HCLは次のようになります:

terraform {
required_providers {
metal = {
source = "equinix/metal"
version = "3.2.1"
}
}
}

resource "metal_reserved_ip_block" "example" {
project_id = local.project_id
facility = "sv15"
quantity = 2
}

resource "metal_device" "example" {
project_id = local.project_id
facilities = ["sv15"]
plan = "c3.medium.x86"
operating_system = "ubuntu_24_04"
hostname = "test"
billing_cycle = "hourly"

ip_address {
type = "public_ipv4"
cidr = 31
reservation_ids = [metal_reserved_ip_block.example.id]
}

ip_address {
type = "private_ipv4"
}
}

リソースUUID

プロバイダ equinix/equinix に移行するには、移行したいすべてのリソースの UUID を調べる必要があります。この場合はmetal_reserved_ip_block.examplemetal_device.exampleです。UUID を調べるには terraform state を使用します。

予約IPブロック

$ terraform state show metal_reserved_ip_block.example

# metal_reserved_ip_block.example:
resource "metal_reserved_ip_block" "example" {
[...]
id = "e689072f-aa6e-4d51-8e37-c2fbe18b4ff0"
[...]
}

デバイス

$ terraform state show metal_device.example

# metal_device.example
resource "metal_device" "example" {
[...]
id = "8eb3bc10-0e1a-476a-aec2-6dc699df9c1c"
[...]

移行テンプレート

移行するリソースのUUIDがわかったら、HCLテンプレートで、変更する必要があります:

  • required_providers ブロックで equinix/equinix を要求します。
  • リソースの名前をプロバイダ equinix/equinix の対応するリソースに変更します:sed 's/metal_/equinix_metal_'
  • metal_リソースからequinix_metal_リソースへのすべての参照

修正したテンプレートは次のようになります:

terraform {
required_providers {
equinix = {
source = "equinix/equinix"
}
}
}

resource "equinix_metal_reserved_ip_block" "example" {
project_id = local.project_id
facility = "sv15"
quantity = 2
}

resource "equinix_metal_device" "example" {
project_id = local.project_id
facilities = ["sv15"]
plan = "c3.medium.x86"
operating_system = "ubuntu_24_04"
hostname = "test"
billing_cycle = "hourly"

ip_address {
type = "public_ipv4"
cidr = 31
reservation_ids = [equinix_metal_reserved_ip_block.example.id]
}

ip_address {
type = "private_ipv4"
}
}

Terraformの状態の移行

テンプレートを適宜変更したら、Terraformの状態から古いmetal_リソースを削除し、新しいリソースをequinix_metal_リソースとしてUUIDでインポートします。

以前の状態を確認すると、metal_device.exampleのUUIDは8eb3bc10-0e1a-476a-aec2-6dc699df9c1cで、metal_reserved_ip_block.exampleのUUIDはe689072f-aa6e-4d51-8e37-c2fbe18b4ff0であることがわかります。

terraform stateとimportコマンドでは、リソースのタイプと名前をドットで区切って使用します:

terraform state rm metal_reserved_ip_block.example
terraform import equinix_metal_reserved_ip_block.example e689072f-aa6e-4d51-8e37-c2fbe18b4ff0
terraform state rm metal_device.example
terraform import equinix_metal_device.example 8eb3bc10-0e1a-476a-aec2-6dc699df9c1c

次にterraform initを実行してequinix/equinixプロバイダをインストールする必要があります。その後、テンプレートがTerraformの状態やEquinix Metalのアップストリームリソースと照合されます。terraform planを実行して移行を確認すると、インフラストラクチャが最新であることがわかります。

移行に関する問題の解決

移行が成功したことを確認するためにterraform planを実行すると、terraformはテンプレートのリソース属性がインポートされた状態と一致していないと警告することがあります。これは全てのリソース属性を計算できるわけではないからです。例えばmetal_deviceip_addressブロックはユーザ定義であり、ダウンロードされたインポートされた状態との差分が空でないという結果になります。

ip_addressの場合、結果のterraform applyは上流のリソースを変更せずにローカルの状態を更新しますが、属性が上流の更新を引き起こす場合、テンプレートを変更するか、Terraformに上流のリソースを変更させるか、手動で解決する必要があります。

このページは役に立ちましたか?