[Linux] Terraformでローカルファイルの読み書きを行う方法

Terraformはインフラの構築、変更、バージョン管理を安全かつ効率的に実行するためのツールです。
Terraformでローカルファイルの読み書きを行うために、Localプロバイダを利用することができます。今回はLocalプロバイダを利用して、ローカルファイルの読み書きを行ってみます。
 
※実行例では以下のバージョンを利用しています。

  • Ubuntu 18.04
  • Terraform 0.11.9

1. 設定ファイルをつくろう

Localプロバイダを利用してファイルの読み書きを行う設定ファイルを作成します。
はじめに、任意のワーキングディレクトリでTerraformの設定ファイルを作成します。
設定ファイルのファイル名は任意の名前でつけられますが、ファイル名の最後(拡張子)は’.tf‘とします。
 
今回は、以下のような設定ファイルを用意しました。

data "local_file" "read" {
    filename = "./test1.read"
}

resource "local_file" "write" {
    content = "${data.local_file.read.content}1234abcd\n"
    filename = "./test1.write"
}

この設定ファイルでは、以下のような処理を行っています。

  1. カレントディレクトリの’test1.read’ファイルの内容を読み込みます。読み込んだ内容は、’content’属性に書き込まれます。
  2. 読み込んだ内容の末尾に’1234abcd’を追加し、カレントディレクトリに’test1.write’ファイルを出力します。${data.local_file.read.content}の部分が、読み込んだファイルの内容に置き換わります。

2. 読み込み用のファイルをつくろう

読み込み用のファイル’test1.read’を作成します。
ファイルの中身に適当なテキストを記述しておきます。

$ echo 'This is test1.' > test1.read
$ cat test1.read
This is test1.

3. Terraformの初期化をしよう

Terraformの設定ファイルを新規に作成した場合、Terraformの初期化を行う必要があります。
初期化はterraformのinitコマンドで行います。

$ terraform init

Initializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "local" (1.1.0)...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.local: version = "~> 1.1"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

4. 実行内容を確認しておこう

Terraformを実行する前に、実行される内容を確認しておきましょう。
実行内容を事前に確認しておくことで、意図していなかった設定変更や削除を確認することができます。
実行内容の確認はterraformのplanコマンで確認できます。

$ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

data.local_file.read: Refreshing state...

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + local_file.write
      id:       
      content:  "This is test1.\n1234abcd\n"
      filename: "./test1.write"


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

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

1つの新規フィアルが作成され(1 to add)、その他の変更や削除はないようです(0 to change, 0 to destroy)。

5. Terraformを実行しよう

実行内容の事前確認が完了したら、設定した内容を実行してみましょう。
設定の実行はterraformのapplyコマンドを実行します。

$ terraform apply
data.local_file.read: Refreshing state...

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + local_file.write
      id:       
      content:  "This is test1.\n1234abcd\n"
      filename: "./test1.write"


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

local_file.write: Creating...
  content:  "" => "This is test1.\n1234abcd\n"
  filename: "" => "./test1.write"
local_file.write: Creation complete after 0s (ID: 66ca096ad7ab8efbbb12ee5b2d56927b07c7324e)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

実行が終わったら、ファイルに正常に出力されたかを確認してみましょう。

$ cat test1.write
This is test1.
1234abcd

正常に設定内容が書き込まれました。

6. まとめ

TerraformのLocalプロバイダを利用して、ローカルファイルの読み書きを行う方法を紹介しました。
AWSなど外部の環境に依存せずにTrraformの動作説明などを行う場合にも使えそうです。