はじめてみよう Terraformでインフラ構築


![ 2021-07-08 11.17.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/04e69249-4e78-2053-b363-45fc89e5b75d.png)


## この記事のゴール

この記事ではTerraformを使って、AWS上にVPCリソースの作成します。

## この記事の想定読者

- インフラのコード化（Infrastructure as Code)がどんなものか体験したい方
- Terraformをはじめて触る方
- AWSを触ったことがある方
- コンソールの操作ができる方

## Terraformってなに？

HashiCorp社が提供する[Terraform](https://registry.terraform.io/)は、クラウド上のインフラの構築を自動化します。

Terraformを使うと、いままで画面上で人力でポチポチ行っていたクラウドのインフラ構築作業を、コードで記述することができます。

またTerraformは特定のクラウドベンダーの製品ではないので、複数のクラウドサービスで利用することが可能です。

## メリットは？

Terraformを使うことで、以下のようなメリットがあります。

- インフラの構築作業が自動化され、効率的に行うことができる。
- インフラ構築手順書の作成・更新作業が低減される。
- Gitを利用することでインフラ構成のバージョン管理が行えるようになる。

## 環境

- macOS: v11.2.3
- Python: v3.9.5
- terraform: v1.0.0
- aws-cli: v2.2.16


## セットアップ

### AWS IAM

#### ユーザグループ作成

[aws iam](https://console.aws.amazon.com/iam/home)にアクセスし、グループを作成します。

![ 2021-07-08 16.37.09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/b7c72724-7e68-4c6f-a745-aa0a9aff625b.jpeg)

グループ名を`hello_terraform_group`と入力し、アクセス権に`AmazonEC2FullAccess`と`AmazonS3FullAccess`を追加し、`グループを作成`をクリックします。

![ 2021-07-08 16.46.50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/98ea2457-81e9-556d-2de0-c0b192ff144e.jpeg)

グループが作成されました。
![ 2021-07-08 16.47.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/76fbf54f-1c07-a49c-3e9d-745038e928f1.jpeg)



#### ユーザ作成

次にユーザーを作成します。
![ 2021-07-08 16.40.19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/26cf30f9-8e49-6b34-4c10-88d73c64d3a0.jpeg)

ユーザ名に`hello_terraform_user`と入力し、`プログラムによるアクセス`にチェックを入れて下さい。
![ 2021-07-08 16.40.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/1c194d3c-e08d-310e-b65b-777cdafa1312.jpeg)

先程の作成したグループ名にチェックをいれて、`次のステップ`をクリックします。
![ 2021-07-08 16.53.18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/708bf946-e2d9-3923-ca61-0ec108f93039.jpeg)

`次のステップ`をクリックします。

![ 2021-07-08 16.41.31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/16e42b73-4922-c9cd-4445-7b6d7fbf0a25.jpeg)

`ユーザーの作成`をクリックします。
![ 2021-07-08 16.53.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/ee936c1b-4a6a-467e-5030-221f963734a6.jpeg)

ユーザが作成されました。
画面に表示されたアクセスIDとシークレットアクセスキーの値は、次項のAWS CLIの設定で使用するので控えておいて下さい。


![ 2021-07-08 16.41.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/0ecb0d19-56a4-1bb5-0016-f5fb90b2b1ca.jpeg)







### AWS CLI

#### AWS CLIのインストール

以下のコマンドでAWS CLIをインストールします。

```shell
$ pip3 install awscli --upgrade
```

インストールが完了したら以下のコマンドでバージョンを確認します。

```shell
$ aws --version
```

#### AWS CLIにアクセスIDとシークレットアクセスキーの設定

下記のコマンドを実行し、先程入手したIAMユーザのアクセスIDとシークレットアクセスキーを追加します。

```shell
$ aws configure
 AWS Access Key ID [None]:      # AWSのアクセスIDを入力
 AWS Secret Access Key [None]:  # AWSのシークレットアクセスキーを入力
 Default region name [None]: ap-northeast-1
 Default output format [None]: json
```

AWS CLIの設定内容を確認する場合は、`aws configure list`コマンドを実行して下さい。実行すると設定値が表示されます。

```shell
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ******************** shared-credentials-file    
secret_key     ******************** shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
```

### git-secrets

AWSのキー情報流出防止のため、`git-secrest`をインストールします。

```shell
$ brew install git-secrets
```

gitに設定を追加します。

```shell
$ git secrets --register-aws --global
$ git secrets --install - /.git-templates/git-secrets
$ git config --global init.templatedir '~/.git-templates/git-secrets'
```

### Terraform

#### tfenv

tfenvは、terraformのバージョン管理ソフトです。
tfenvを導入することで、複数のバージョンの切り替えが可能になります。

以下のコマンドを実行し、インストールを実行して下さい。

```shell
$brew install tfenv

$ tfenv --version
tfenv 2.2.2
```

#### Terraform

Terraformのインストールを行います。
`list-remote`コマンドを実行し、インストールが可能なTerrafromのバージョンを確認します。

```shell
$ tfenv list-remote 
1.1.0-alpha20210630
1.1.0-alpha20210616
1.0.2
1.0.1
1.0.0
0.15.5
#...
```

リストから導入したいバージョンを指定し、インストールを行います。

```shell
$ tfenv install 1.0.2
```

使用するバージョンの切り替えは、`use`コマンドを使用します。

```shell
$ tfenv use 1.0.2
```

現在選択しているバージョンは、`list`コマンドを使用し確認できます。

```shell
$ tfenv list
* 1.0.0 (set by /tfenv/2.2.2/version)
```

以上でセットアップ作業は完了です。

## リソースの作成

### tfファイルの作成

適当な作業フォルダを作成し、フォルダ下に`main.tf`ファイルを作成して下さい。

```tf:main.tf
resource "aws_vpc" "hello" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"

  tags = {
    Name = "hello"
  }
}
```

Terraformは、HCL(HashiCorp Configuration Language)という言語で記述します。
上記のコードは、`hello`という名前で`10.0.0.0/16`のレンジのVPCネットワークを作成します、という内容を示しています。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc

### init

ｔｆファイルが作成できたら、`init`コマンドで初期化を行います。
`successfully initialized!`と表示されれば初期化は成功です。

```shell
$ terraform init

Initializing the backend...
Initializing provider plugins...
# ...

Terraform has been successfully initialized!
```

### plan

続いて`plan`コマンドを実行します。
`plan`コマンドを実行することで、AWSにリソースを追加する前に内容を確認することが出来ます。

```shell
$ terraform plan

Enter a value: ap-northeast-1

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
# ...
```

出力内容に問題がないか確認して下さい。

### apply

`apply`コマンドを実行し、リソースの追加を行います。
コマンドを実行すると、AWS上でリソースの追加処理が開始されます。

```shell
$ terraform apply

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

# ...
aws_vpc.hello: Creating...
aws_vpc.hello: Creation complete after 3s [id=vpc-***********************]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
``` 

`Apply complete!`と表示されればリソースの追加は成功です。

### 確認

指定したVPCリソースが追加されているか[AWSのサイト](https://aws.amazon.com/jp/console/)で確認してみましょう。
ブラウザでAWSのVPCの項目を開いて下さい。
画面上に`hello`という名前のVPCリソースが追加されていることが確認できます。

![ 2021-07-08 10.45.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/71913dc1-d847-2fc7-1656-47da490e4069.jpeg)

### リソースの削除

#### destroy

最後に追加したVPCリソースを削除してみます。
リソースを削除する場合は、`destroy`コマンドを実行します。

```shell
$ terraform destroy

# ...
Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

# ...
aws_s3_bucket.test: Destroying... [id=test-dtakkiy]
aws_s3_bucket.test: Destruction complete after 0s
aws_vpc.hello: Destruction complete after 0s

Destroy complete! Resources: 2 destroyed.
```

`Destroy complete! `と表示されれば削除は成功です。

awsのコンソール上でVPCリソースが削除されているか確認してみて下さい。

## さいごに

お疲れさまでした。
Terraformをより詳しく知りたい方は、[terraformのドキュメント](https://www.terraform.io/docs/index.html)を参照下さい。

## 参考

https://www.terraform.io