EC2をTerraformで操作、ssh

## 参考

* [Change Infrastructure - Terraform by HashiCorp](https://www.terraform.io/intro/getting-started/change.html)
* [terraformでsshアクセス可能なEC2インスタンスを作成する - Qiita](http://qiita.com/tjinjin/items/8ef3ce60bd0a1524c0dc)

### その他リンク集

* Heroku
  * [Terraform で Ruboty-Gacha アプリケーション を Heroku に構築 - Qiita](http://qiita.com/tbpgr/items/0e2487af7bd698153994)
* DigitalOcean
  * [Terraform を Digital Ocean で触ってみた (初級編) - Qiita](Terraform を Digital Ocean で触ってみた (初級編) - Qiita)
* GCE
  * [Terraform 0.2.2 で GCE + Ansible を試してみた - Qiita](http://qiita.com/voluntas/items/2d1971c434447d935aee)
  * [Terraform 0.2 で Google Compute Engine を試してみた (初級編) - Qiita](qiita.com/voluntas/items/3e245200f48f053a1334)
* AWS
  * [TerraformでAWS(EC2)のセキュリティグループを管理 - Qiita](http://qiita.com/zembutsu/items/5de875ed99ac8a56a998)
  * [TerraformでAWS S3バケットを操作 - Qiita](http://qiita.com/zembutsu/items/8a8f2b6b8d74e7b8fee5)

----

## terraformのダウンロード

* http://www.terraform.io/downloads.html
* v0.6.0 (2015/7/11)

## terraform設定ファイル

* access_keyとsecret_keyの取得方法は
  * EC2ダッシュボード -> 右上のAWSにようこそ -> 認証情報 -> ユーザ -> ユーザ操作 -> アクセスキーの管理 -> アクセスキーの作成 -> ユーザーのセキュリティ認証情報を表示 -> アクセスキー ID, シークレットアクセスキー


```js:example.et
provider "aws" {
    access_key = "XXXXXXXXXXXXXXXXXXXX"
    secret_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    region = "ap-northeast-1"
}

resource "aws_instance" "example" {
    ami = "ami-cbf90ecb" #AmazonLinux
    #ami = "ami-936d9d93" #Ubuntu
    instance_type = "t2.micro"
    key_name = "aws_key1"
    security_groups = ["${aws_security_group.default.name}"]
}

# SSH access from anywhere
resource "aws_security_group" "default" {
    name = "terraform_example"
    description = "Used in the terraform"
    ingress {
        from_port = 22 #適宜変更
        to_port = 22
        protocol = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
    }
}
```

* remote-exeでコマンド発行やfileでファイル転送ができるようだが自分は成功しなかったので別の方法(itamaeとか)で実施する。

## terraformコマンド

```bash:適用
./terraform apply
```

* applyすると、現在のEC2インスタンスがterminatedになり、新規インスタンスがrunningになる。

```bash:変更点確認
./terraform plan
```

```bash:現状確認
./terraform show
```

```bash:削除
./terraform play -destroy
./terraform destroy
# yes を入力。一応EC2ダッシュボードから削除(=terminated状態)か確認しておくこと。
```

詳細なログを出したい場合は

```bash:
TF_LOG=1 ./terraform showなど
```

# ssh接続

## GlobalIP確認

```bash:
$ ./terraform show | grep public_ip
  public_ip = 52.69.110.23
```

## AmazonLinux(ami-cbf90ecb)の場合

```bash:
ssh -i aws_key1.pem ec2-user@52.69.110.23
```

## Ubuntu(ami-936d9d93)の場合

```bash:
ssh -i aws_key1.pem ubuntu@52.69.110.23
```

# 設定の分割

* [terraform使い方(超基礎編) - Qiita](http://qiita.com/kohey18/items/38400d8c498baa0a0ed8)

```js:example.tf
provider "aws" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region = "${var.region}"
}

resource "aws_instance" "example" {
    ami = "${lookup(var.amis, var.region)}"
    instance_type = "${var.instance_type}"
    key_name = "aws"
    security_groups = ["${aws_security_group.default.name}"]
}

resource "aws_security_group" "default" {
    name = "terraform_example"
    description = "Used in the terraform"

    # SSH access from anywhere
    ingress {
        from_port = 22
        to_port = 22
        protocol = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
    }
}
```

```js:variables.tf
variable "access_key" {
  description = "AWS access key"
  default     = "XXXXXXXXXXXXXXXXXXXX"
}

variable "secret_key" {
  description = "AWS secret access key"
  default     = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

variable "region" {
  description = "AWS region to host your network"
  default     = "ap-northeast-1"
}

variable "instance_type" {
  default = "t2.micro"
}

variable "amis" {
  default = {
    "ap-northeast-1" = "ami-cbf90ecb" #AmazonLinux
    #"ap-northeast-1" = "ami-936d9d93" #Ubuntu14.04
  }
}
```

```bash:実行方法は今までと変わらない(Enterを何度か押す必要はある)
./terraform apply
```