teraformを試す

## 参考
https://zenn.dev/umatoma/articles/9fb6e2b8481838

https://www.terraform.io/

これが公式ページ。英語なので、まずは見る気にならない。日本語ページで概要を理解しよう。

https://registry.terraform.io/

なんだろうか？


https://blog.dcs.co.jp/aws/20210401-terraformaws.html
わかりやすそう

https://qiita.com/sasshi_i/items/f4f65e18923d856be256

https://github.com/sasshi-i/terraform_ec2_rds/blob/master/modules/vpc/main.tf#L44-L62

## git pushが覚えられない
https://github.com/settings/profile
https://qiita.com/shiro01/items/e886aa1e4beb404f9038

## 概要
aws cloudformaitonでやったことをteraformでやってみる。

Terraformでは TFConfig という名の設定ファイルでインフラを定義する。
その TFConfig を現実世界に反映する時、大きく３つのステップがある。

Refresh
現実世界をインフラ定義に反映する（git pullする的な感じ）
Plan
現実世界の内容を元に、どのような変更を加えるか計画する（PR出す的な感じ）
Apply
計画した内容を元に、現実世界へと計画を反映する（mergeする的な感じ）

- パラメタを与える
- vpc作成、設定

https://y-ohgi.com/introduction-terraform/handson/vpc/

- インスタンス作成
- ansible連携できるかな？できるみたい

https://qiita.com/hayaosato/items/ee0d6eabb7b3d0a22136


## 作業ディレクトリ
```
mkdir terraform_sample
cd terraform_sample
```

## 実行方法
```
# tfファイルが揃った時点で必要と思われる。追加したときなど。
terraform init  

# rfファイルの検証コマンド
terraform validate

# テスト実行
terraform plan

# 環境作成コマンド
terraform apply -auto-approve

# 環境削除コマンド
terraform destroy -auto-approve

# 設定確認
terraform show
```

## ファイル
rfファイルに記述する

### コメントアウト
Terraformの設定ファイルでは/* 〜 */を使ってコメントを表すことができます。（1行コメントでは#、//も使用可）

### ファイルの分割

https://higelog.brassworks.jp/2944

同じディレクトリにあればいいらしい。

### コマンドオプション
https://qiita.com/takkii1010/items/082c0854fd41bc0b26c3

### gitに管理すべきか
.terraform.lock.hcl
gitに必要らしい。gitignore、terraform用がある
https://qiita.com/asdasda/items/b8becb672ad572897c25

### 変数
https://blog.naoty.dev/375/

# ノーマルパターン
## providers.tf
```providers.tf
# これは固定で良いと思う
terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

# 自分の.awsを見ればわかる。東京ならこの設定で固定で良いと思う
provider "aws" {
  profile = "default"
  region = "ap-northeast-1"
}
```

## instance.tf
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance

```instance.tf
# ここはインスタンスの設定。自分の好みの設定に変える。
# aws_instanceは固定
# 他にも設定可能
resource "aws_instance" "PrometheusEC2" {
  ami = "ami-08a8688fb7eacb171"
  instance_type = "t2.micro"
  tags = {
    "Name" = "prometheus.host"
  }
}
```

## ここまでで一度動作確認しておこう

## vpc.tf
```vpc.tf
# VPC
# https://www.terraform.io/docs/providers/aws/r/vpc.html
resource "aws_vpc" "terraformVpc" {
  cidr_block = "10.0.0.0/16"

  tags = {
    "Name" = "terraformVpc"
  }
}

# Subnet
# https://www.terraform.io/docs/providers/aws/r/subnet.html
resource "aws_subnet" "PublicSubnetA" {
  # 先程作成したVPCを参照し、そのVPC内にSubnetを立てる
  vpc_id = "${aws_vpc.terraformVpc.id}"

  # Subnetを作成するAZ
  availability_zone = "ap-northeast-1a"

  cidr_block        = "10.1.10.0/24"

  tags = {
    "Name" = "PublicSubnetA"
  }
}

resource "aws_subnet" "PublicSubnetCCIDR" {
  vpc_id = "${aws_vpc.terraformVpc.id}"

  availability_zone = "ap-northeast-1c"

  cidr_block        = "10.1.20.0/24"

  tags = {
    "Name" = "PublicSubnetCCIDR"
  }
}

# Private Subnets
resource "aws_subnet" "PrivateSubnetACIDR" {
  vpc_id = "${aws_vpc.terraformVpc.id}"

  availability_zone = "ap-northeast-1a"
  cidr_block        = "10.1.100.0/24"

  tags = {
    "Name" = "PrivateSubnetACIDR"
  }
}

resource "aws_subnet" "PrivateSubnetCCIDR" {
  vpc_id = "${aws_vpc.terraformVpc.id}"

  availability_zone = "ap-northeast-1c"
  cidr_block        = "10.1.200.0/24"

  tags = {
    "Name" = "PrivateSubnetCCIDR"
  }
}


# ここまでで一度動作確認しよう


# Internet Gateway
# https://www.terraform.io/docs/providers/aws/r/internet_gateway.html
resource "aws_internet_gateway" "terraformInternetGateway" {
  vpc_id = "${aws_vpc.terraformVpc.id}"

  tags = {
    "Name" = "terraformInternetGateway"
  }
}

# Route Table
# https://www.terraform.io/docs/providers/aws/r/route_table.html
resource "aws_route_table" "public" {
  vpc_id = "${aws_vpc.terraformVpc.id}"

  tags = {
    "Name" = "terraformPublicRouteTable"
  }
}

# Route　routeテーブルとVPCの関連付け
# https://www.terraform.io/docs/providers/aws/r/route.html
resource "aws_route" "public" {
  destination_cidr_block = "0.0.0.0/0"
  route_table_id         = "${aws_route_table.public.id}"
  gateway_id             = "${aws_internet_gateway.main.id}"
}

# Association routeテーブルとサブネットの関連付け
# https://www.terraform.io/docs/providers/aws/r/route_table_association.html
resource "aws_route_table_association" "PublicRouteA" {
  subnet_id      = "${aws_subnet.PublicSubnetA.id}"
  route_table_id = "${aws_route_table.public.id}"
}

resource "aws_route_table_association" "PublicRouteC" {
  subnet_id      = "${aws_subnet.PublicSubnetC.id}"
  route_table_id = "${aws_route_table.public.id}"
}
```

## セキュリティグループ
https://qiita.com/Canon11/items/c1ee988516a6492dfb74

## yum　updateができない
- アウトバウンドのルールがない -> コードに追加
- アウトバウンドルール追加するだけでよかった。s3を許可するエンドポイントがなかった。以下は未実施
https://go-journey.club/archives/14364

```
[ec2-user@ip-10-1-10-100 ~]$ sudo yum install git
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
Could not retrieve mirrorlist https://amazonlinux-2-repos-ap-northeast-1.s3.dualstack.ap-northeast-1.amazonaws.com/2/core/latest/x86_64/mirror.list error was
12: Timeout on https://amazonlinux-2-repos-ap-northeast-1.s3.dualstack.ap-northeast-1.amazonaws.com/2/core/latest/x86_64/mirror.list: (28, 'Failed to connect to amazonlinux-2-repos-ap-northeast-1.s3.dualstack.ap-northeast-1.amazonaws.com port 443 after 2702 ms: Connection timed out')

```


# 環境変数を使うパターン