ケース別Terraformでリソース作成


この記事はチームラボエンジニアリングアドベントカレンダー16日目の記事です。

# はじめに

Terraformを使用する際のケース別の利用方法をまとめてみました

## バージョン情報
Terraform v0.11.13


# 実行方法
* 実行ディレクトリに移動

```hs
cd aws_terraform
```

* 秘密鍵を配置
awsディレクトリ配下に秘密鍵配置
秘密鍵は何かと同じ秘密鍵でも良い

```
/aws_terraform/test-key.pem
```

* AWSで発行したIAMユーザーのアクセスキーとシークレットアクセスキーをaws prifileに設定する

```
sudo aws configure --profile [IAMユーザー名]
```


* providerに作成したIAMユーザーのユーザー名を入れる

```hs
variable "region" {}

provider "aws" {

  profile = "[IAMユーザー名]"
  region     = "${var.region}"
}
```


* Terraform初期化

```
terraform init
```

.terraformディレクトリが作成される

# Terraformを動かしてみる

awsディレクトリに移動、planをみる

```
terraform plan
```

実行する　AWS上にリソースが作成される

```
terraform apply
```

Terraformで作成したリソースを削除する

```
terraform destroy
```

# ケース別利用方法

## tfvarsファイル
ケース：EC2の秘密鍵をdev環境と本番環境で別のものを利用したい

#### dev環境

terraform/aws_terraform/develop.tfvars

```hs

key_name   = "test-key"
```

terraform/aws_terraform/variables.tf

```hs

# 秘密鍵
variable "key_name" {}
```

terraform/aws_terraform/ec2.tf

```hs

resource "aws_instance" "tfvars_test" {
  ami                    = "ami-da9e2cbc"
  instance_type          = "t2.micro"
  key_name               = "${var.key_name}"
  subnet_id              = "subnet-05ea87c24c647c898"
  vpc_security_group_ids = ["${aws_security_group.test-terraform-ec2-security.id}"]

  tags {
    Name = "test-terraform-ec2"
  }
}
```

実行

```text
terraform apply -target=aws_instance.tfvars_test -var-file=develop.tfvars
```

オプション
-target: 作成するリソースを指定する
-var-file: 環境ファイルを指定する



#### 本番環境
terraform/aws_terraform/production.tfvars

```hs

key_name   = "prod-key"
```
terraform/aws_terraform/variables.tf

```hs

# 秘密鍵
variable "key_name" {}
```

terraform/aws_terraform/ec2.tf

```hs

# devと同じ
```

実行

```text
terraform apply -target=aws_instance.tfvars_test -var-file=production.tfvars
```






## dataリソース
ケース：Terraformで作成するEC2インスタンスで既に作成されているサブネットを利用したい

#### dev環境

terraform/aws_terraform/data.tf
->Nameタグと一致するものを検索している

```hs

data "aws_subnet" "public-a" {
  filter {
    name   = "tag:Name"
    values = ["${var.subnet_id_public_a_name}"]
  }
}
```

terraform/aws_terraform/ec2.tf

```hs

resource "aws_instance" "data_test" {
  ami                    = "ami-da9e2cbc"
  instance_type          = "t2.micro"
  key_name               = "${var.key_name}"
  subnet_id              = "${data.aws_subnet.public-a.id}" # データリソースを使用している
  vpc_security_group_ids = ["${aws_security_group.test-terraform-ec2-security.id}"]

  tags {
    Name = "test-terraform-ec2"
  }
}
```

terraform/aws_terraform/develop.tfvars

```hs

key_name   = "test-key"
subnet_id_public_a_name = "test-public-1a"
```

terraform/aws_terraform/variables.tf

```hs

# 秘密鍵
variable "key_name" {}

# EC2 サブネット名
variable "subnet_id_public_a_name" {}
```

dev環境 実行

```text
terraform apply -target=aws_instance.data_test -var-file=develop.tfvars
```


#### 本番環境
terraform/aws_terraform/production.tfvars

```hs

key_name   = "prod-key"
subnet_id_public_a_name = "prod-public-1a"
```

実行

```text
terraform apply -target=aws_instance.data_test -var-file=production.tfvars
```


## ワークスペース workspace
ケース：devとprodでそれぞれインスタンス立っているか分からなくなったので確認したい

#### ワークスペース作成

* ワークスペース一覧 現在のワークスペースが何かも知れる

```text
terraform workspace list
```

* ワークスペース作成

```text
terraform workspace new develop
```

* ワークスペース選択

```text
terraform workspace select develop
```

* ワークスペース削除

```
terraform workspace delete develop
```


#### dev環境のワークスペースでec2作成
ケース：

```text
terraform apply -target=aws_instance.workspace_test -var-file=develop.tfvars
```

今までdefautのワークススペースで作成してきたので
developワークスペースではvpcごと新規作成される



## 条件分岐&カウント
ケース：dev環境でEC2を1台たてたいけど、本番環境ではEC2をたてたくない


#### dev環境
terraform/aws_terraform/ec2.tf

```hs

# 条件分岐&カウントテスト
resource "aws_instance" "count_test" {
  count                  = "${var.env == "production" ? 1 : 0}"
  ami                    = "ami-da9e2cbc"
  instance_type          = "t2.micro"
  key_name               = "${var.key_name}"
  subnet_id              = "${data.aws_subnet.public-a.id}"
  vpc_security_group_ids = ["${aws_security_group.test-terraform-ec2-security.id}"]

  tags {
    Name = "test-terraform-ec2"
  }
}
```

terraform/aws_terraform/develop.tfvars

```hs

env = "develop"
key_name   = "test-key"
subnet_id_public_a = "subnet-05ea87c24c647c898"
subnet_id_public_a_name = "test-public-1a"
```

terraform/aws_terraform/variables.tf

```hs

# 環境名
variable "env" {}

# 秘密鍵
variable "key_name" {}

# EC2 サブネットID
variable "subnet_id_public_a" {}

# EC2 サブネット名
variable "subnet_id_public_a_name" {}

```


実行

```text
terraform apply -target=aws_instance.count_test -var-file=develop.tfvars
```
リソース作成されない

#### 本番環境

terraform/aws_terraform/production.tfvars

```hs

env = "production"
key_name   = "prod-key"
subnet_id_public_a = "subnet-0310cf72d3e2a73ad"
subnet_id_public_a_name = "prod-public-1a"
```

実行

```text
terraform apply -target=aws_instance.count_test -var-file=production.tfvars
```
リソース作成される


# さいごに
ワークスペースで分けるより、ディレクトリで分ける意見が多そうなので
環境ごとに分ける場合は、ディレクトリで分けようかと思います。
またモジュールについてもまとめていきたいです。