OpenTofu と Terraform で同じリソースを作成した場合の tfstate と lock ファイルの差分
2024-01-17Terraform の fork として誕生した OpenTofu が GA されたので、それぞれで同じリソースを作成した場合の tfstate
と lock.hcl
ファイルの違いを確認してみます。
OpenTofu Announces General Availability
前提
OpenTofu と Terraform それぞれのバージョンは現時点(2024/01/16)で最新の下記を使います。
❯ tofu --version
OpenTofu v1.6.0
on darwin_arm64
❯ terraform --version
Terraform v1.6.6
on darwin_arm64
また、今回は AWS のリソースを作成するので aws-provider の最新バージョン v3.52.1
を使います。
作成するリソース
手頃でコストも掛からない CloudWatch Evidently の Feature リソースを作成します。
OpenTofu
-
versions.tf
terraform { required_version = ">= 1.6.0" required_providers { aws = "= 5.32.1" } } provider "aws" { region = "ap-northeast-1" }
-
backend.tf
terraform { backend "local" { path = "opentofu.tfstate" } }
-
main.tf
resource "aws_evidently_project" "main" { name = "opentofu-project" } # Features that has boolean value resource "aws_evidently_feature" "bool_feature" { project = aws_evidently_project.main.name name = "bool-feature" variations { name = "true" value { bool_value = true } } default_variation = "true" lifecycle { ignore_changes = [ default_variation, ] } }
Terraform
基本的には OpenTofu と同じなので、差分のみ記載します。
-
versions.tf
--- opentofu/versions.tf 2024-01-16 22:40:39 +++ terraform/versions.tf 2024-01-16 22:28:48 @@ -1,5 +1,5 @@ terraform { - required_version = ">= 1.6.0" + required_version = ">= 1.6.6" required_providers { aws = "= 5.32.1" }
-
backend.tf
--- opentofu/backend.tf 2024-01-16 22:40:51 +++ terraform/backend.tf 2024-01-16 22:24:46 @@ -1,5 +1,5 @@ terraform { backend "local" { - path = "opentofu.tfstate" + path = "terraform.tfstate" } }
-
main.tf
--- opentofu/main.tf 2024-01-16 22:40:44 +++ terraform/main.tf 2024-01-16 22:28:00 @@ -1,5 +1,5 @@ resource "aws_evidently_project" "main" { - name = "opentofu-project" + name = "terraform-project" } # Features that has boolean value
実装の詳細については下記を参照してください。
misc/infra/terraform-opentofu · michimani/misc
OpenTofu と Terraform の差分
HCL ファイルの書き方については、上述の通りほぼ Terraform のままです。
異なるのはコマンドのみで、 OpenTofu は tofu
コマンドを使います。
OpenTofu が GA されたのでおすすめの alias 設定を書いておく
tfstate と hcl.lock の差分
OpenTofu と Terraform で同じリソースを作成した場合の tfstate
ファイルの差分は下記の通りです。
--- opentofu/opentofu.tfstate 2024-01-16 22:42:05
+++ terraform/terraform.tfstate 2024-01-16 22:29:30
@@ -1,30 +1,30 @@
{
"version": 4,
- "terraform_version": "1.6.0",
+ "terraform_version": "1.6.6",
"serial": 3,
- "lineage": "6246b819-8c4e-aaaa-xxxx-111111111111",
+ "lineage": "371ac6db-8448-bbbb-yyyy-111111111111",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "aws_evidently_feature",
"name": "bool_feature",
- "provider": "provider[\"registry.opentofu.org/hashicorp/aws\"]",
+ "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
- "arn": "arn:aws:evidently:ap-northeast-1:000000000000:project/opentofu-project/feature/bool-feature",
- "created_time": "2024-01-16T13:42:05Z",
+ "arn": "arn:aws:evidently:ap-northeast-1:000000000000:project/terraform-project/feature/bool-feature",
+ "created_time": "2024-01-16T13:29:30Z",
"default_variation": "true",
"description": "",
"entity_overrides": null,
"evaluation_rules": [],
"evaluation_strategy": "ALL_RULES",
- "id": "bool-feature:arn:aws:evidently:ap-northeast-1:000000000000:project/opentofu-project",
- "last_updated_time": "2024-01-16T13:42:05Z",
+ "id": "bool-feature:arn:aws:evidently:ap-northeast-1:000000000000:project/terraform-project",
+ "last_updated_time": "2024-01-16T13:29:30Z",
"name": "bool-feature",
- "project": "arn:aws:evidently:ap-northeast-1:000000000000:project/opentofu-project",
+ "project": "arn:aws:evidently:ap-northeast-1:000000000000:project/terraform-project",
"status": "AVAILABLE",
"tags": null,
"tags_all": {},
@@ -56,23 +56,23 @@
"mode": "managed",
"type": "aws_evidently_project",
"name": "main",
- "provider": "provider[\"registry.opentofu.org/hashicorp/aws\"]",
+ "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"active_experiment_count": 0,
"active_launch_count": 0,
- "arn": "arn:aws:evidently:ap-northeast-1:000000000000:project/opentofu-project",
- "created_time": "2024-01-16T13:42:05Z",
+ "arn": "arn:aws:evidently:ap-northeast-1:000000000000:project/terraform-project",
+ "created_time": "2024-01-16T13:29:29Z",
"data_delivery": [],
"description": "",
"experiment_count": 0,
"feature_count": 0,
- "id": "opentofu-project",
- "last_updated_time": "2024-01-16T13:42:05Z",
+ "id": "terraform-project",
+ "last_updated_time": "2024-01-16T13:29:29Z",
"launch_count": 0,
- "name": "opentofu-project",
+ "name": "terraform-project",
"status": "AVAILABLE",
"tags": null,
"tags_all": {},
作成したリソース(Evidently::Project
)の ARN と作成日時が異なるのは自明として、それ以外だと provider
の値が異なっていることがわかります。
下記の部分です。
"type": "aws_evidently_project",
"name": "main",
- "provider": "provider[\"registry.opentofu.org/hashicorp/aws\"]",
+ "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
provider
の値が異なるのは、OpenTofu と Terraform で使っているプロバイダが異なるためです。
OpenTofu は Terraform から fork されたものですが、各 provider も hasicorp から fork されています。
例えば aws-provider の場合、 Terraform 用の provider は
hashicorp/terraform-provider-aws: Terraform AWS provider
ですが、 OpenTofu 用の provider は
opentofu/terraform-provider-aws: Terraform AWS provider
となっています。
tfstate
と同様に lock.hcl
ファイルの差分も確認してみます。
--- opentofu/.terraform.lock.hcl 2024-01-16 22:41:17
+++ terraform/.terraform.lock.hcl 2024-01-16 23:04:35
@@ -1,20 +1,25 @@
-# This file is maintained automatically by "tofu init".
+# This file is maintained automatically by "terraform init".
# Manual edits may be lost in future updates.
-provider "registry.opentofu.org/hashicorp/aws" {
+provider "registry.terraform.io/hashicorp/aws" {
version = "5.32.1"
constraints = "5.32.1"
hashes = [
コメントの文言と、こちらでも provider
の値が異なっていることがわかります。 (hashes
の値が異なるのは自明なので省略しています)
現時点ではコマンド以外ほぼ同じ
OpenTofu と Terraform で同じリソースを作成した場合の tfstate
と lock.hcl
ファイルの差分を確認してみました。
provider の registry が異なってはいますが、それとコマンド以外はほぼ同じです。
Terraform からのマイグレーション方法については OpenTofu のドキュメントに記載されていますが、 OpenTofu のバージョンを書き換えて tofu init
するだけです。
Migrating to OpenTofu from Terraform | OpenTofu
今後これらの関係がどうなっていくのかはわからないですが、現時点では OpenTofu への移行はサクッとできそうです。
comments powered by Disqus