Terraformのblog投稿、参考訳


Terraform - HashiCorp
http://www.hashicorp.com/blog/terraform.html

blog 投稿に対する日本語訳です。参考程度にどうぞ。


## Terraform

今日、私たちは [Terraform](http://www.terraform.io/) を発表します。Terraform は、安全かつ効率的にインフラの構築・組みあわせ・稼働をするためのツールです。物理サーバからコンテナ、SaaS プロダクトに至るまで、Terraform はサービスやアプリケーションが実行するために必要な構成物の全てを作成・構築することができます。

Terraform を使えば、複数のサービスプロバイダを使っていたとしても、完全に Infrastructure as code （コードとしてのインフラ）を記述することができます。たとえば、サーバは AWS を使っても、DNS は CloudFlare かもしれませんし、データベースは Heroku で運用するかもしれません。Terraform は、これらの事業者を並列にまたがるリソースを作ります。

Terraform を使えば、あなたインフラにおける知識を体系化できます。そのための、何かしら新しいツールではなく、インフラに対する変更や更新を安全に行うためのワークフローを提供するものなのです。

私たちは Terraform を公開する事に、とても興奮しています。Terraform の可能性は深く、私たちが今日提供するものは始まりにしかすぎません。

詳細は、以降をお読みください。

## Terraform の動作

ここでは、Terraform をどのように扱い、運用していくかという、簡単でパワフルな例を示します。より技術的な詳細については、詳細な[ドキュメント](http://www.terraform.io/docs/index.html)をご覧下さい。

Terraform の設定は、インフラのリソースをマークアップ記法という、ハイレベルな表現の文法で記述します。以下に設定例を示します：

```
resource "digitalocean_droplet" "web" {
   name = "tf-web"
   size = "512mb"
   image = "centos-5-8-x32"
   region = "sfo1"
}

resource "dnsimple_record" "hello" {
   domain = "example.com"
   name = "test"
   value = "${digitalocean_droplet.web.ipv4_address}"
   type = "A"
}
```

設定は、宣言型です。Terraform は自動的に依存性を推測しますので、インフラの依存性を可能な限り並列化することができます。

この例は、複数のサービス事業者が提供しているリソース群を、Terraform が組みあわせているものです。DegitalOcean に droplet を作成し、DNS レコードを DNSimple に追加するために droplet を作りました。このようにコードからインフラを構成することは、新しく、極めて強力です。

インフラを構築するためには、`terraform apply` を実行するだけです：

```
$ terraform apply
digitalocean_droplet.web: Creating...
  image:  "" => "centos-5-8-x32"
  name:   "" => "tf-web"
  region: "" => "sfo1"
  size:   "" => "512mb"
digitalocean_droplet.web: Creation complete
dnsimple_record.hello: Creating...
  domain: "" => "example.com"
  name:   "" => "test"
  type:   "" => "A"
  value:  "" => "104.131.142.132"
dnsimple_record.hello: Creation complete

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
```

## 運用計画に従い、安全に繰り返すこと
Safety Iterating with Execution Plans

Terraform は、インフラを安全に繰り返すための大切な機能を持っています。それがexecution plans(運用計画)です。execution plan は、Terraform がインフラ基盤に対してどのように変更を行うか指示を事前に計画します。そして、その plan は保存され、適用(apply) できるようになり、あとは Terraform が plan を実行するだけという状態になります。

Terraform は、あなたがインフラに対してどのような変更を加えたいか（望ましい状態にしたいか）を正確に知っていますので、Terraform が予想外の処理を行うはずがない、という事がわかるでしょう。

例えば、上記の構築例で言いますと、Terraform を使って、DigitalOcean droplet のサイズを変更する事ができます。droplet の前の `~` が意味するのは、Terraform がリソースを破棄・更新するかわりに、更新するというものです。

```
$ terraform plan
~ digitalocean_droplet.web
    size: "512mb" => "1gb"
```

Terraform は、同じような機能を持つツールが無いかどうか検討しましたが、この類では初めてのツールです。そして、これこそが実際のシステムにおける変更を行う際に、必要であるツールであると考えたものなのです。

## 驚くべき可能性

Terraform は、見かけよりも多くの事を行う事が出来ます。歴史的に、Terraform に類似したツールは、ローレベルの計算(compute)・保管(storage)・ネットワーク(networking)リソースを構築するまででしたしかし、Terraform は複数のサービス事業者の間のギャップ（差）を埋めることができるため、Terraform は、より多くの処理を行う事ができます。

以下の例では、Terraform を使って Heroku 上で動くアプリケーションの全ての構成物を記述しています。この中には、Heroku アドオンや、アプリケーションの設定、DNS エントリを含むものです。

```
resource "heroku_app" "web" {
    name = "terraform-www"

    config_vars {
        GITHUB_TOKEN = "TOKEN"
        TF_VERSION = "0.1"
    }
}

resource "heroku_domain" "web" {
    app = "${heroku_app.web.name}"
    hostname = "www.terraform.io"
}

resource "heroku_addon" "webhooks" {
    app = "${heroku_app.web.name}"
    plan = "deployhooks:http"
    config {
        url = "http://hooks.hashicorp.com/heroku"
    }
}
```

上記のものは Terraform を使い、実際に構築することができるという例です。詳細は [Terraform](http://www.terraform.io/) のウェブサイトで確認してください。

## HashiCorp が作成

HashiCorp は、DevOps 問題を、技術的にかつ楽しく使い、それを解決するためのソリューションを構築します。私たちは技術の選択においてショートカットはとりませんし、重要なのは、私たちのツールを使う事は経験におけるショートカットではないという事です。Terraform も、それは代わりません。

Terraform は、このようにして構築してきた5番目のツールです。これまでに Vagrant、Packer、Serf、Consul を提供してきました。Terraform は私たちの他のツールと有用に扱えますが、必ずしも連携を必要とするものではありません。

## より詳しく

以下のページ群で次のステップに進んで下さい。

* [Intro](http://www.terraform.io/intro/index.html) 導入
* [Comparison to other software](http://www.terraform.io/intro/vs/index.html) 他のソフトとの比較
* [GitHub](https://github.com/hashicorp/terraform)



## 参考

http://www.hashicorp.com/blog/terraform.html