【参考訳】Terraform 0.7

06.08.2016 in HashiCorp using tags Terraform , HashiCorp , translation

概要

8月2日、Terraform のDocker の新しいバージョン v0.7.0 がリリースされました。メジャー・バージョンアップは v0.6.0 から1年と1ヶ月ぶりです。HhashiCorp のブログに解説記事が掲載されています。例によって、参考訳を作成しましたので、参考程度にどうぞ。

Terraform 0.7

Terraform 0.7 をリリースしました。Terraform はインフラエンジニアの構築、組み合わせ、起動を安全かつ効果的に行うためのツールです。

Terraform は HashiCorp のプロジェクト中で最も早い成長を続けています。ここ1年間で、リソースや対応プロバイダの拡張だけでなく、バグ修正をあわせ、20 を越える Terraform のマイナーバージョンをリリースしてきました。Terraform 0.7 は、ここ1年で最新かつ最大のメジャー機能リリースです。

Terraform 0.7 では Terraform に新たな機能性を追加しました。主な点は次の通りです。

コミュニティ

まず感謝を申しあげたいのは、絶え間ない改良、修正、アイディアの流れによる成長するコミュニティの皆さまです。Terraform は極めて早く成長していると認識しています。イシューやプル・リクエストの対応に遅れを取ってしまうほどですが、Terraform の改善に対するコミュニティの皆さんの対応や集中には、非常に感謝しています。

そして、コードでの貢献者の皆さんだけでなく、メーリングリストやカンファレンスなどで、素晴らしい対応や思いやりある対応に感謝申し上げます。

Terraform コミュニティの皆さん、ありがとうございます!

Import

Terraform 0.7 は既存のインフラ・リソースを Terraform に取り込む(Import)する機能を取り込みました。

今回の Terraform のリリースでは、その時点におけるリソースを取り込めるようになりました。ただし、Terraform は設定ファイルを作成しません。いずれは機能を拡張し、設定ファイルの生成や、複数のリソースの取り込みに対応する予定です。強調しておきたいのは、インポート(import)は複雑な機能であり、Terraform 0.7 で初めて取り込んだ機能なのです。

これで、既存のインフラを徐々に Terraform へ対応できるようになります。import の使い方は単純です。

$ terraform import aws_instance.foo i-abcd1234
…

こちらは、指定した ID の AWS インスタンスを取り込む例です。APS API で通信し、インスタンスを見つけ、Terraform の state(訳者注:状態管理用の terraform.state ファイル)に追加します。

先ほどお伝えした通り、import を使っても、現時点では自動的に設定ファイルに設定を反映しません。import 実行後に terraform plan を実行すると、対象リソースの情報が設定ファイルに無いため、Terraform はリソースの削除を計画していると表示します。対象となるリソースを手動で追加しておけば、terraform plan を実行しても何も変更を加える表示は出なくなります。これで import が正常に終わりました。

Data Sources

読み込み専用のリソースの取り扱いには、従来の Terraform では大変な面倒さがありました。読み込み専用のリソースは、Terraform の作成―読み込み―更新―削除するモデルとは全く一致しなかったからです。例えば、Consul 鍵や、AWS AMI 等です。

Terraform 0.7 で導入した新しい機能は、Terraform の設定で、データのみのリソースを扱うための データ・ソース(Data Sources) というファースト・クラスのタイプです。

データ・ソースを使えば、外部のデータを Terraform の設定に反映できます。データは refresh で常に読み込み、plan で利用できます。既存の読み込み専用のリソースをデータ・ソースに変更すると、 terraform plan<computed> の出力をかなり減らし、より便利になります!

データ・ソースはリソースのようなものです。

data "aws_ami" "nat" {
  most_recent = true

  filter {
    name = "owner-alias"
    values = ["amazon"]
  }

  filter {
    name = "name"
    values = ["amzn-ami-vpc-nat*"]
  }
}

output "ami" {
  value = "${data.aws_ami.nat.image_id}"
}

この例では、AWS に直近で使った NAT AMI を問い合わせ、出力に反映します。 terraform apply を実行すると、値が確認できます。

$ terraform apply
...

出力結果:

ami = ami-bae80fd7

Terraform 0.7 は aws_ami のような数々のデータ・リソースをすぐに使い始められます。今後は、コミュニティの皆さんから、数多くのデータ・ソースが追加されるのをお待ちしています。そして、これまで通り、Terraform は自分自身でデータ・ソースを追加するプラグインを書くこともできます。

より詳しく学ぶには データ・ソースのドキュメント をご覧ください。

State Management CLI

Terraform の状態(state)を安全に調査・変更するために便利なサブコマンド群、 terraform state を紹介します。

このコマンドにより、リソースの状態を一覧するためや、リソースの名称変更、リソースを別のモジュールに移動するため等に使えます。これらのコマンドの目的は、Terraform の state ファイルを手動で変更させないためです。

次の例はリソース一覧の状態(state)を表示します。

$ terraform state list
aws_instance.foo
aws_instance.bar[0]
aws_instance.bar[1]
module.elb.aws_elb.main

また、リソースの名称変更や、リソースとモジュールの移動にも使えます。次の例は、リソースの名前を変えます。

$ terraform state mv aws_instance.foo aws_instance.bar

次の例はリソースをモジュールに移動する例です。

$ terraform state mv aws_instance.foo module.web

最後の例は、モジュールを別の状態(state)ファイルに移動します。これは高度なリファクタリング(作り直す)オプションであり、Terraform の設定を複数の状態ファイルに分割する時に便利です。

$ terraform state mv -state-out=other.tfstate \
    module.web module.web

これらの例だけでなく、リソースに対する属性の表示がだけでなく、状態ファイルからアイテムの削除なども可能になりました。

コマンド出力は、意図的にシンプルかつ Unix 風のツールのような行指向(line-oriented)です。そして、これらのコマンドは他の Terraform とは異なり、オプションごとに状態ファイルをタイムスタンプ付きでバックアップできます。これにより、複雑な状態を連続して変更する時にも、あらゆるロールバックが可能となります。このような特性により、状態管理 CLI はスクリプトでも安全に使えます。

List and Map Types

新しいリストとマップという、ファースト・クラスのタイプ(型)を Terraform の設定で使えるようになります。

これまでの Terraform ユーザは、 splitjoin 機能を組み合わせて見せかけのリストを作っていました。単純な場合は動作しますが、複雑なシナリオでは早々に機能しませんでした。Terraform 0.7 では、これらのような様々な問題を解決するため、リスト(list)とマップ(map)というファースト・クラスのタイプ(型)が追加されました。

使用例は次の通りです。

# main.tf
variable "allowed_cidr_blocks" {
  type = "list"
}

module "appsecuritygroup" {
  source              = "./appsecuritygroup"
  allowed_cidr_blocks = "${var.cidr_blocks}"
}
# appsecuritygroup/sg.tf
variable "allowed_cidr_blocks" {}

resource "aws_security_group" "app" {
  #全ての出力(egress)を許可
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = -1
    cidr_blocks = ["0.0.0.0/0"]
  }
  # 指定した CIDR ブロックからのみ入力(ingress)を許可
  ingress {
    from_port   = 0
    to_port     = 0
    protocol    = -1
    cidr_blocks = "${var.allowed_cidr_blocks}"
  }
}

この設定例は、 allowed_cidr_blocks 変数で 「リスト」タイプを使い、直接モジュールに渡しています。

以下は、この値をフラグで指定する例です。

terraform plan -var 'allowed_cidr_blocks=["10.0.1.0/24", "10.0.2.0/24"]'

リストとマップの値は、変数ファイルや環境変数を通しても設定に利用できます。詳しくは v0.7 アップグレード・ガイド をご覧ください。

まとめ

Terraform は爆発的な成長を続けています。私たちは大規模な商用環境で使われるだけでなく、コミュニティにおける大きな成長も目の当たりにしています。Terraform 0.7 で追加された機能群は、より一層、この流れを後押しするでしょう。

Terraform は一定の間隔でマイナー・リリースのコミットを続けるつもりです。Terraform を改良した Terraform 0.7.1 は来月にも登場するでしょう。

Terraform をダウンロード し、お試しください!

参照