packethost/packetからequinix/equinixへの移行
[Equinix Metal(旧Packet)はPlatform Equinixに完全に統合されたため、テラフォームプロバイダーも変更されました。このプロバイダ(terraform-provider-equinix、provider equinix/equinix)は、Platform Equinixで利用可能なさまざまなサービスのプロバイダであり、Terraformを使用して管理できます。
terraform-provider-packetを使用していて、新しいバージョンのプロバイダを使用してEquinix Metalでリソースを管理する場合は、HCLファイルの参照を変更する必要があります。例えば、リソース名をpacket_deviceからequinix_metal_deviceに変更するだけです。これでうまくいくはずですが、packet_deviceが破棄され、代わりに新しいequinix_metal_deviceが作成されます。リソースの再作成は望ましくないかもしれないので、このガイドでは再作成せずにequinix_metal_リソースに移行する方法を示します。
Terraformテンプレートの移行を始める前に、以下をアップグレードしてください。
- packethost/packet プロバイダを最新バージョン(3.2.1)に更新しました。
- Terraformのバージョンをv0.13以上にしてください。
プロバイダの置き換えとsedによる迅速な移行
Terraform HCL テンプレートと同様に、Terraform の状態はリソース名とその属性を構造化されたテキストで含むファイルです。可能な限りpacket_をequinix_metal_に置き換え、プロバイダのソースリファレンスを修正します。
この作業を行う前にTerraformディレクトリ全体のバックアップを取ることをお勧めします。
以下のテンプレートから作成されたインフラストラクチャがあるとします:
terraform {
required_providers {
packet = {
source = "packethost/packet"
}
}
}
resource "packet_project" "example" {
name = "example"
}
resource "packet_vlan" "example" {
project_id = packet_project.example.id
facility = "sv15"
description = "example"
}
まずTerraformのステートファイル(terraform.tfstate)のプロバイダをterraform stateサブコマンドreplace-providerで変更します:
terraform state replace-provider packethost/packet equinix/equinix
次に、HCL テンプレート内のプロバイダ参照を置き換えます。この作業を、参照を持つすべてのファイルに対して行います:
sed -i 's|packethost/packet|equinix/equinix|g' main.tf
次に、Terraform HCLファイルのすべての文字列packet_をequinix_metal_に置き換えるだけです。
sed -i 's/packet_/equinix_metal_/g' main.tf
...これは少し危険なので、git diffの後にチェックしてください。これはpacket_プレフィックスをすべて置き換え、required_providersブロックのキーも置き換える必要があります。
次に、terraformステートファイルのpacket_をequinix_metal_に置き換えます:
sed -i 's/packet_/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を実行して結果を確認できます。
プランが空でない場合、リソースの一部がアップストリームから単純に読み取れないか、packethost/packetプロバイダのバージョンとequinix/equinixプロバイダの現在のバージョンの間で属性が変更されていることを意味します。
一度に1つのリソースを移行
terraform stateとterraform importを使って、既存のリソースを破壊することなく移行を実現できます。
既存のインフラストラクチャ
プロバイダpackethost/packetで作成されたインフラストラクチャがデバイスとIP予約を持っていると仮定します。HCLは次のようになります:
terraform {
required_providers {
packet = {
source = "packethost/packet"
version = "3.2.1"
}
}
}
resource "packet_reserved_ip_block" "example" {
project_id = local.project_id
facility = "sv15"
quantity = 2
}
resource "packet_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 = [packet_reserved_ip_block.example.id]
}
ip_address {
type = "private_ipv4"
}
}
リソースUUID
プロバイダ equinix/equinix に移行するには、移行したいすべてのリソースの UUID を調べる必要があります。この場合はpacket_reserved_ip_block.exampleとpacket_device.exampleです。UUID を調べるには terraform state を使用します。
予約IPブロック
$ terraform state show packet_reserved_ip_block.example
# packet_reserved_ip_block.example:
resource "packet_reserved_ip_block" "example" {
[...]
id = "e689072f-aa6e-4d51-8e37-c2fbe18b4ff0"
[...]
}
デバイス
$ terraform state show packet_device.example
# packet_device.example
resource "packet_device" "example" {
[...]
id = "8eb3bc10-0e1a-476a-aec2-6dc699df9c1c"
[...]
移行テンプレート
移行するリソースのUUIDがわかったら、HCLテンプレートで、変更する必要があります:
- required_providers ブロックで
equinix/equinixを要求します。 - リソースの名前をプロバイダ
equinix/equinixの対応するリソースに変更します:sed 's/packet_/equinix_metal_' packet_リソースから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の状態から古いpacket_リソースを削除し、新しいリソースをequinix_metal_リソースとしてUUIDでインポートします。
以前の状態を確認すると、packet_device.exampleのUUIDは8eb3bc10-0e1a-476a-aec2-6dc699df9c1cで、packet_reserved_ip_block.exampleのUUIDはe689072f-aa6e-4d51-8e37-c2fbe18b4ff0です。
terraform stateとimportコマンドでは、リソースのタイプと名前をドットで区切って使用します:
terraform state rm packet_reserved_ip_block.example
terraform import equinix_metal_reserved_ip_block.example e689072f-aa6e-4d51-8e37-c2fbe18b4ff0
terraform state rm packet_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はテンプレートのリソース属性がインポートされた状態と一致していないと警告することがあります。これは全てのリソース属性を計算できるわけではないからです。例えばpacket_deviceのip_addressブロックはユーザ定義であり、ダウンロードされたインポートされた状態との差分が空でないという結果になります。
ip_addressの場合、結果のterraform applyは上流のリソースを変更せずにローカルの状態を更新しますが、属性が上流の更新を引き起こす場合、テンプレートを変更するか、Terraformに上流のリソースを変更させるか、手動で解決する必要があります。