terraformを使ってAWS上にVPCを構築する。docker-composeを知った時と同じくらいの感動を覚えている。

<h2>注意</h2>
<p>特になし</p>
<h2>環境</h2>
<ul>
<li>AWS</li>
<li>WSL2</li>
<li>terraform 1.6.0</li>
</ul>
<h2>背景</h2>
<p>Terraformを使って、VPCの設計に再現性を持たせたい。</p>
<h2>結論</h2>
<p>作業ディレクトリにmain.tfファイルを作成する。次に、terraform applyなどのコマンドを実行する。</p>
<p>今回は、VPCの中に一つのEC2インスタンスを配置します。</p>

<h2>terraformを使ってVPCを設計する</h2>
<h3>概要</h3>
<p>WSL2にAmazon CLIをインストールして、terraformを使ってAWS上にVPCを構築する。</p>

<h3>手順（WSL2にAmazon CLIをインストールする）</h3>
<p>公式ドキュメントは下記です。</p>

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

<h4>初めてのインストールの場合</h4>
<p>下記のコマンドを実行してください。</p>

```WSL2
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
```

<h4>アップグレードの場合</h4>
<p>アップグレードの場合、「sudo ./aws/install」ではなく、下記のコマンドを実行してください。最初二つのコマンドでディレクトリの位置を把握して、それに対して、アップグレードを行います。</p>

```WSL2
$ which aws
/usr/local/bin/aws
$ ls -l /usr/local/bin/aws
lrwxrwxrwx 1 root root 37 Oct 31 16:39 /usr/local/bin/aws -> /usr/local/aws-cli/v2/current/bin/aws
$ sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update
```

<h4>アクセスキーの設定</h4>
<p>アクセスキーを設定する。</p>

```WSL2
$ aws configure
AWS Access Key ID: YourKeyID
AWS Secret Access Key: YourAccessKey
Default region name: ap-northeast-1
Default output format: json
$ cat  ~/.aws/credentials
...
$ cat ~/.aws/config
...
```

<h4>インストールの確認</h4>
<p>正確にインストールされたかどうかの確認をする。</p>

```WSL2
$ aws --version
$ aws ec2 describe-instances | grep InstanceId
```

<h3>手順（WSL2にterraform管理ソフト(tfenv)をインストールする）</h3>
<p>公式ドキュメントは下記です。</p>

https://github.com/tfutils/tfenv

<h4>インストール</h4>
<p>下記のコマンドを実行してください。</p>

```WSL2
$ git clone --depth=1 https://github.com/tfutils/tfenv.git ~/.tfenv
$ echo 'export PATH=$PATH:$HOME/.tfenv/bin' >> ~/.bashrc
$ source ~/.bashrc #ターミナルを開き直すか、このコマンドを使うことでPATH環境変数がリロードされる。
```
<p>「echo 'export PATH=\$PATH:$HOME/.tfenv/bin' >> ~/.bashrc」ではなくて、「ln -s ~/.tfenv/bin/* /usr/local/bin」でも問題ないです。前者は、対象ディレクトリをPATH環境変数に直接加える方法で、後者は、すでにPATH環境変数に含まれている場所にシンボリックリンクとして対象ディレクトリを加える方法です。</p>

<p>次に、下記のコマンドを実行してください。今回は、terraformのバージョンとして、1.6.0を使用しました。</p>


```WSL2
$ tfenv --version
$ tfenv list-remote
$ tfenv install 1.6.0
$ tfenv list
$ tfenv use 1.6.0
$ terraform --version
```

<h3>手順（terraform管理ソフト(tfenv)で、WSL2からVPCを構築する）</h3>

<p>作業用のプロジェクトにmain.tfを配置して、terraform applyなどのコマンドを実行してください。</p>
<p>terraform applyなどのコマンドは、権限の問題でエラーになる可能性があります。その場合、「sudo」をつけてください。しかし、「sudo」を加えると、現セッションのPATH環境変数が引き継がれないので、今度はそれが原因でエラーになることがあります。 その場合、PATH環境変数を引き継ぎつつ、sudo権限で実行するために、「sudo -E」をつけて実行して下さい。</p>


```main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "4.22.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_vpc" "my_vpc" {
  cidr_block = "10.0.0.0/16"
  enable_dns_support = true
  enable_dns_hostnames = true

  tags = {
    Name = "my-vpc"
  }
}

resource "aws_subnet" "my_subnet" {
  vpc_id     = aws_vpc.my_vpc.id
  cidr_block = "10.0.1.0/24"

  tags = {
    Name = "my-subnet"
  }
}

resource "aws_instance" "my_instance" {
  ami           = "ami-09a81b370b76de6a2"
  instance_type = "t2.micro"
  subnet_id     = aws_subnet.my_subnet.id

  tags = {
    Name = "my-instance"
  }
}
```
```WSL2
~/terraform_practice$ ls -l
total 16
-rw-r--r-- 1 root root  684 Oct 31 18:44 main.tf
~/terraform_practice$ terraform init
~/terraform_practice$ terraform plan
~/terraform_practice$ terraform apply
```

<h4>VPCを破壊する</h4>

<p>下記のコマンドで、vpcを破壊してください。</p>

```WSL2
~/terraform_practice$ terraform destory
```


<h2>今後の展望</h2>
<p>次は、Amazon EKS(kubernetes)とか使ってみる。</p>



<h2>参考</h2>
<ul>
<li>https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html</li>
<li>https://github.com/tfutils/tfenv</li>
<li>https://qiita.com/onishi_820/items/18f2f8cc61f6b54f9433</li>
<li>https://qiita.com/If_it_bleeds-we_can_kill_it/items/1ecf36e87a8b616e0c4c</li>
</ul>