はじめに

クラウドインテグレーション事業部の三木です。
今まではローカルにて一人でTerraformの管理をしていたけれど、複数人でTerraformを扱いたいと思うことはありませんか?
ローカルにあるtfstateファイルをTerraform Cloudへ移行することで、そのような悩みを解決できるので紹介したく思います。

準備

準備段階では以下3点を実施します。

  • Terraformに必要なファイルの作成
  • Terraform Cloudへ移行するtfstateファイルを作成
  • Terraform Cloudの既存のworkspaceを確認

Terraformに必要なファイルの作成

ディレクトリ構造

miki1:Downloads miki$ tree
.
├── backend.tf
├── main.tf
└── variable.tf

0 directories, 3 files
miki1:Downloads miki$

backend.tfの内容

backend.tfでは移行するリソースの「プロバイダー情報」を記載しています。

miki1:Downloads miki$ cat backend.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.44.0"
    }
  }

  required_version = "~> 1.2.5"
}

provider "aws" {
  region     = "ap-northeast-1"
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
}
miki1:Downloads miki$

main.tfの内容

main.tfでは「移行するAWSリソース情報」を記載しています。
今回はVPCの情報をTerraform Cloudに移行します。
したがって、main.tfのresourceブロックではVPC情報を宣言しています。

miki1:Downloads miki$ cat main.tf
resource "aws_vpc" "main" {
  cidr_block                       = "10.0.0.0/16"
  tags = {
    Name = "terraform-import"
  }
}
miki1:Downloads miki$

variable.tfの内容

variable.tfでは他のファイルで利用している変数定義を記載しています。

miki1:Downloads miki$ cat variable.tf
variable "aws_access_key" {}
variable "aws_secret_key" {}
miki1:Downloads miki$

Terraform Cloudへ移行するtfstateファイルを作成

まずは、現在main.tfがあるディレクトリに自身がいることを確認します。

miki1:Downloads miki$ ls
backend.tf  main.tf     variable.tf
miki1:Downloads miki$

続けて、main.tfがあることを確認した現在のディレクトリ上でterraform initを実行します。

miki1:Downloads miki$ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 3.44.0"...
- Installing hashicorp/aws v3.44.0...
- Installed hashicorp/aws v3.44.0 (signed by HashiCorp)
.....省略
miki1:Downloads miki$

terraform applyを実行するとアクセスキー/シークレットアクセスキーが求められるので入力します。

miki1:Downloads miki$ terraform apply
var.aws_access_key
  Enter a value: 

var.aws_secret_key
  Enter a value: 

.....省略

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_vpc.main: Creating...
aws_vpc.main: Creation complete after 2s [id=vpc-xxxxxxxxxxxxxxxxx]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
miki1:Downloads miki$

コンソールを確認するとVPCが作成されています。

ローカルを確認すると、以下のようにtfstateファイル(terraform.tfstate)が作成されています。

miki1:Downloads miki$ ls -la
total 56
drwx------@  9 miki  IRET\Domain Users   288  7 21 01:26 .
drwxr-xr-x+ 53 miki  IRET\Domain Users  1696  7 21 00:49 ..
-rw-r--r--@  1 miki  IRET\Domain Users  6148  7 21 01:26 .DS_Store
drwxr-xr-x   3 miki  IRET\Domain Users    96  7 21 01:20 .terraform
-rw-r--r--   1 miki  IRET\Domain Users  1109  7 21 01:20 .terraform.lock.hcl
-rw-r--r--@  1 miki  IRET\Domain Users   272  7 21 01:02 backend.tf
-rw-r--r--@  1 miki  IRET\Domain Users   126  7 21 01:06 main.tf
-rw-r--r--   1 miki  IRET\Domain Users  1545  7 21 01:22 terraform.tfstate
-rw-r--r--@  1 miki  IRET\Domain Users    58  7 21 00:49 variable.tf
miki1:Downloads miki$

Terraform Cloudの既存のworkspaceを確認

以降の手順を実施することで、organization配下に新規でworkspaceが作成されます。
手順を実行する前に、organization配下に今回作成するworkspace「terraform-import」がまだ存在していないことを確認しておきます。

tfstateファイルをTerraform Cloudへ移行

backend.tfの内容を以下のように変更をします。
organizationにはみなさんがTerraform Cloudで設定している名称を記載してください。
nameには今回作成するworkspace「terraform-import」を記載しています。

terraform {
  required_version = ">= 1.2.5"
  required_providers {
    random = {                                    
      source  = "hashicorp/random"
      version = "3.0.1"                         
    }
  }
  cloud {                                                 
    organization = "xxxxx"
    workspaces {                                    
      name = "terraform-import"         
    }
  }
}
provider "aws" {
  region     = "ap-northeast-1"
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
}

terraform loginコマンドを実行し「yes」を押下します。

miki1:Downloads miki$ terraform login
Terraform will request an API token for app.terraform.io using your browser.

If login is successful, Terraform will store the token in plain text in
the following file for use by subsequent commands:
    /Users/miki/.terraform.d/credentials.tfrc.json

Do you want to proceed?
  Only 'yes' will be accepted to confirm.

  Enter a value: yes

ブラウザが以下のような画面に遷移するので「Create API token」を押下します。

以下文字列が出力されるのでコピーしターミナルに貼り付けます。

terraform initコマンドを実行すると、Terraform Cloudへtfstateファイルを移行するか問われるので、「yes」と入力します。

miki1:Downloads miki$ terraform init

Initializing Terraform Cloud...
Do you wish to proceed?
  As part of migrating to Terraform Cloud, Terraform can optionally copy your
  current workspace state to the configured Terraform Cloud workspace.

  Answer "yes" to copy the latest state snapshot to the configured
  Terraform Cloud workspace.

  Answer "no" to ignore the existing state and just activate the configured
  Terraform Cloud workspace with its existing state, if any.

  Should Terraform migrate your existing state?

  Enter a value: yes

新しくworkspace「terraform-import」が作成されています。

作成したworkspace「terraform-import」のStatesで、移行したtfstateファイルを確認できます。

まとめ

簡単にローカルにあるtfstateファイルをTerraform Cloudへ移行することができました。
Terraform Cloudに保管したtfstateファイルは、複数人でも参照することができるため以降は複数人でTerraformを扱うことができます。

参考記事

https://learn.hashicorp.com/tutorials/terraform/cloud-migrate


アイレットなら、AWS で稼働するサーバーを対象とした監視・運用・保守における煩わしい作業をすべて一括して対応し、経験豊富なプロフェッショナルが最適なシステム環境を実現いたします。AWS プレミアコンサルティングパートナーであるアイレットに、ぜひお任せください。

AWS 運用・保守サービスページ

その他のサービスについてのお問合せ、お見積り依頼は下記フォームよりお気軽にご相談ください。
https://cloudpack.jp/contact/form/