Terraformと仲良くなる(1)

タダです。

最近、Terraformを触るようになりました。
今は、VPC周りしかいじってないので、あれですが、今後も触っていきたいので、今回からセットアップ内容を投稿していきたいと思います。

## 実行環境
まずは、Terraformの実行環境についてです。

* Mac OSX 10.11.6
* Terraform v0.7.3

## セットアップ
[こちら](https://www.terraform.io/downloads.html)に、Downloadページがあります。
ダウンロードしたら、`$PATH`を通せば、利用できるのでお手軽です。
実際にPATHを通した後、ダウンロードしたバイナリファイルのバージョンを確認してみます。

``` 
$ export PATH=/hoge/terraform:$PATH
$ terraform version
Terraform v0.7.3 
```

## 初期設定
Terraformは、AWSのIAMロールを使って、AWS環境作成を行います。
そのため、予め必要な権限を付与したIAMユーザーを作成してください。

Terraformには、環境変数を`terraform.tfvars`まとめて定義することができます。
こちらにIAMユーザーのクレデンシャル情報を定義することができるので、書いていきます。

```
$ cat terraform.tfvars
access_key = "xxxxxxxxxxxxxxxxx"
secret_key = "xxxxxxxxxxxxxxxxxxxxxxx"
region = "ap-northeast-1"
```

Terraform内で上記の変数をtfファイル内で使用できるようにvariableで定義します。
上記のterraform.tfvarsの記述内容は環境変数に入るので、それを定義します。

```
$ cat variables.tf
variable "access_key" {}
variable "secret_key" {}
variable "region" {}
```

上記で設定した変数を使って、AWS環境の設定を行います。

```
$ cat aws.tf
provider "aws" {
    access_key = "${var.access_key}"
    secret_key = "${var.secret_key}"
    region = "${var.region}"
}
```

これで初期設定が完了です。


## VPCの作成
今回、VPCとVPC Flow Logsを作ることを行っていきます。
実際に定義した内容は、下記の通りです。

```
$ cat aws_vpc.tf
# Create a VPC to launch our instances into
resource "aws_vpc" "vpc-test" {
  cidr_block = "10.200.0.0/16"

  tags {
     Name = "vpc-test"
  }
}

# Create a VPC Flow Logs
resource "aws_flow_log" "vpc-flow-logs-test" {
  log_group_name = "vpc-flow-logs-test"
  iam_role_arn = "${aws_iam_role.test_role.arn}"
  vpc_id = "${aws_vpc.vpc-tesst.id}"
  traffic_type = "ALL"
}

resource "aws_iam_role" "test_role" {
    name = "test_role"
    assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
 ]
}
EOF
}

resource "aws_iam_role_policy" "test_policy" {
    name = "test_policy"
    role = "${aws_iam_role.test_role.id}"
    policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
EOF
}

resource "aws_cloudwatch_log_group" "vpc-flow-logs-test" {
  name = "vpc-flow-logs-test"
  retention_in_days = "7"
}
```

定義した内容を、dry-runする機能があります。
`terraform plan -var-file=環境変数定義ファイル` で環境変数を定義したファイルを読み込んで試しに実行してくれます。

```
$ terraform plan -var-file=terraform.tfvars
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.


The Terraform execution plan has been generated and is shown below.
Resources are shown in alphabetical order for quick scanning. Green resources
will be created (or destroyed and then created if an existing resource
exists), yellow resources are being changed in-place, and red resources
will be destroyed. Cyan entries are data sources to be read.

Note: You didn't specify an "-out" parameter to save this plan, so when
"apply" is called, Terraform can't guarantee this is what will execute.

+ aws_cloudwatch_log_group.vpc-flow-logs-test
    arn:               "<computed>"
    name:              "vpc-flow-logs-test"
    retention_in_days: "7"

+ aws_flow_log.vpc-flow-logs-test
    iam_role_arn:   "${aws_iam_role.test_role.arn}"
    log_group_name: "aws-vpc-vpc-test"
    traffic_type:   "ALL"
    vpc_id:         "${aws_vpc.vpc-test.id}"

+ aws_iam_role.test_role
    arn:                "<computed>"
    assume_role_policy: "{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Sid\": \"\",\n      \"Effect\": \"Allow\",\n      \"Principal\": {\n        \"Service\": \"vpc-flow-logs.amazonaws.com\"\n      },\n      \"Action\": \"sts:AssumeRole\"\n    }\n ]\n}\n"
    name:               "test_role"
    path:               "/"
    unique_id:          "<computed>"

+ aws_iam_role_policy.test_policy
    name:   "test_policy"
    policy: "{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Action\": [\n        \"logs:CreateLogGroup\",\n        \"logs:CreateLogStream\",\n        \"logs:PutLogEvents\",\n        \"logs:DescribeLogGroups\",\n        \"logs:DescribeLogStreams\"\n      ],\n      \"Effect\": \"Allow\",\n      \"Resource\": \"*\"\n    }\n  ]\n}   \n"
    role:   "${aws_iam_role.test_role.id}"

+ aws_vpc.vpc-test
    cidr_block:                "10.200.0.0/16"
    default_network_acl_id:    "<computed>"
    default_route_table_id:    "<computed>"
    default_security_group_id: "<computed>"
    dhcp_options_id:           "<computed>"
    enable_classiclink:        "<computed>"
    enable_dns_hostnames:      "<computed>"
    enable_dns_support:        "<computed>"
    instance_tenancy:          "<computed>"
    main_route_table_id:       "<computed>"
    tags.%:                    "1"
    tags.Name:                 "vpc-test"


Plan: 5 to add, 0 to change, 0 to destroy.
```

通ったようですね。
あとは、`terraform apply`と試しに作った環境は、`terraform destroy`で削除できます。
簡単ですねぇ〜次は残りのVPCのリソースとEC2を作ってみたいと思います。