michimani.net

OpenTofu と Terraform で同じリソースを作成した場合の tfstate と lock ファイルの差分

2024-01-17

Terraform の fork として誕生した OpenTofu が GA されたので、それぞれで同じリソースを作成した場合の tfstatelock.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

Terraform

基本的には OpenTofu と同じなので、差分のみ記載します。

実装の詳細については下記を参照してください。

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 で同じリソースを作成した場合の tfstatelock.hcl ファイルの差分を確認してみました。

provider の registry が異なってはいますが、それとコマンド以外はほぼ同じです。

Terraform からのマイグレーション方法については OpenTofu のドキュメントに記載されていますが、 OpenTofu のバージョンを書き換えて tofu init するだけです。

Migrating to OpenTofu from Terraform | OpenTofu

今後これらの関係がどうなっていくのかはわからないですが、現時点では OpenTofu への移行はサクッとできそうです。


comments powered by Disqus