terraformを使ってみる

# terraformを使ってみる
自社でterraformの簡単な使用方法について説明する機会があるので準備するにあたってのメモ

## AWSアカウントの取得
無料枠でやる。普通にアカウントを作成する

### 初回ログインの注意点
ログインは`ルートユーザーの E メールを使用したサインイン`から入る

### 予算の設定
AWS Billing→Budgetsを選んで予算を設定しておくといいかも？
やらかしてEC2作りっぱなしにして延々使用料を払いたくないなら10ドルくらいの設定を入れておくといいかも。

## regionの設定
東京(ap-northeast-1)に変更しておく。画面右上のuser名の右から変更可能。
忘れてるとオハイオとかにリソース作ることになる。別にそれ自体に問題は無いが別のregionのリソースは見えないのでどこに作るにしても自分がどこのregionにリソースを作ったのか忘れないようにする。その一環として東京regionに変更してリソースを作成する。

# リソースを作成する

## 下準備
terraformを叩くためのEC2を立てる。

VPCはdefaultで作成済みの所にたてる
subnetも同様
INGも同様

### EC2の作成
Amazon Linux 2
t2.micro

セキュリティグループはとりあえず自宅の回線IPから入れるようにしておけばおっけー

### EIPの割り当て
EIPをamazonからもらって、作成したEC2に割り当てます。
割り当てないで借りっぱなしにするとコストがかかるので注意

### ec2の初期設定
ユーザーを作る
PW設定する
sudo権限持たせる

やりたい人は/etc/ssh/sshd_configのPasswordAuthenticationをyesにしておくとPW認証で入れる

俺はやらない

### IAMユーザーの作成
ここまでは管理アカウントでやってたが、terraformで何かするならIAMで権限を付けたユーザーが必要になる。
IAMで自分のアカウントを作成し、初回ログインまで行う事。
権限はAdministratorAccessがついていれば困ることは無い。

ユーザーを作成したら、認証情報タブからアクセスキーを生成する。
ここで生成するアクセスキーとシークレットアクセスキーがterraformに必要。シークレットアクセスキーは生成時しか確認できないためメモすること。

### terraformの導入
wget unzipも必要だがこれは標準で入っている。無ければyumで入れる。
terraform本体はzipで取得する
`$ wget https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip`
`0.13.0/terraform_0.13.0_linux_amd64.zip`の部分は適宜変更

`$ sudo unzip ./terraform_0.13.0_linux_amd64.zip -d /usr/local/bin/`

`$ terraform -v`で動作確認

```
[yamanashi@ip-172-31-46-224 ~]$ terraform -v

Your version of Terraform is out of date! The latest version
is 0.13.5. You can update by downloading from https://www.terraform.io/downloads.html
Terraform v0.13.0
```
おっけー



## terraform

作業ディレクトリを作成する

```
[yamanashi@ip-172-31-46-224 test01]$ pwd
/home/yamanashi/terraform/test01
```

### provider.tf
AWSのregionとか使うアカウント等の情報を書き込む。

```
[yamanashi@ip-172-31-46-224 test01]$ cat provider.tf
provider "aws" {
  version    = "~> 2.0"
  region     = "ap-northeast-1"
  access_key = "AKIXXXXXXXXXXXXXXXX"
  secret_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
```
access_key/secret_keyは作成したIAMユーザーで生成したものを書き込む

### init
terraform initは初回に実行するコマンド。必要なコンポーネントを自動で取得してくれる
provider.tfがしっかりかかれていればaws関連モジュールを取得してくれる。

```
[yamanashi@ip-172-31-46-224 test01]$ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 2.0"...
- Installing hashicorp/aws v2.70.0...
- Installed hashicorp/aws v2.70.0 (signed by HashiCorp)

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```

### vpc.tf

```
[yamanashi@ip-172-31-46-224 test01]$ cat vpc.tf
resource "aws_vpc" "test-vpc" {
  cidr_block           = "10.40.0.0/16"
  instance_tenancy     = "default"
  enable_dns_support   = true
  enable_dns_hostnames = true
  tags = {
    Name = "test-main"
  }
}

resource "aws_subnet" "test-subnet" {
  vpc_id            = aws_vpc.test-vpc.id
  cidr_block        = "10.40.0.0/24"
  availability_zone = "ap-northeast-1a"
  #map_public_ip_on_launch = true
  tags = {
    Name = "test-subnet"
  }
}
```

### ec2.tf

```
[yamanashi@ip-172-31-46-224 test01]$ cat ec2.tf
resource "aws_instance" "terraform-ec2-01" {
  ami               = "ami-034968955444c1fd9"
  availability_zone = "ap-northeast-1a"
  instance_type     = "t2.micro"
  key_name          = "test-key"
  subnet_id         = aws_subnet.test-subnet.id
  #vpc_security_group_ids      = ["sg-62486b04"]
  associate_public_ip_address = false
  private_ip                  = "10.40.0.74"
  root_block_device {
    volume_type           = "gp2"
    volume_size           = 8
    delete_on_termination = true
  }
  tags = {
    "Name" = "terraform-ec2-01"
  }
}

resource "aws_instance" "terraform-ec2-02" {
  ami                         = "ami-034968955444c1fd9"
  availability_zone           = "ap-northeast-1a"
  instance_type               = "t2.micro"
  key_name                    = "test-key"
  subnet_id                   = "subnet-953190dd"
  associate_public_ip_address = false
  private_ip                  = "172.31.46.10"
  root_block_device {
    volume_type           = "gp2"
    volume_size           = 8
    delete_on_termination = true
  }
  tags = {
    "Name" = "terraform-ec2-02"
  }
}
```

terraform-ec2-01はterraformコードで作ったvpcに建てる
terraform-ec2-02はデフォルトvpcに立てて、sshで入れるようにした。

`ssh -i ./test-key.pem ec2-user@172.31.46.10`

--------

### VPCの作成
名前なんでも良し
CIDRブロックは10.*.0.0/16

### subnetの作成
VPCにさっき作成したVPCを指定する
CIDRブロックは10.*.0.0/24

### IGWの作成
ssh接続するために作成する。
作成後、アクションから作成したVPCにアタッチする