はじめてのTerraform【セットアップ編】

# はじめに

AWSマネジメントコンソールでECS/Fargate構成でアプリをホストしていましたが
Terraformを使ってインフラをコード化できましたので
アプトプットとして、記事を投稿します。

当記事では、terraformのコードを書く前に行った
**`セットアップ作業`**をまとめています。

AWSリソース生成に関わるterraformコードは別の記事でまとめています。

https://qiita.com/Shuhei_Nakada/items/68bb082c0e5085b22a16


# 使用技術

* Terraform: 1.1.2
* MacOS: Catalina 10.15.7



# セットアップ手順

1. IAMユーザーの作成
2. AWS CLIに２つの認証情報を設定する
3. terraformのインストール
4. git secretsのインストール
5. VScode拡張機能を導入
6. ディレクトリ作成と基本コードの記述



#1. IAMユーザーの作成

はじめに、AWSマネジメントコンソールで
以下2つのIAMユーザーを作成します。

1. 管理者用ユーザー
2. Terraform用ユーザー

注意点ですが、
**`どちらのユーザーにもAdministratorAccessの権限を付与します。`**

以降では、すでに管理者用ユーザーは作成されている事とし、
Terraform用ユーザーのみ
AWSマネジメントコンソールで新しく作成しています。

では、IAM画面に移り、サイドバーから`ユーザー`を選択して
`ユーザーを追加`を押します。

![スクリーンショット 2022-01-02 8.14.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1380401/1b8aacea-8841-afe4-e9e5-c857d3ecdf24.png)

任意のユーザー名を入力して、認証情報タイプを`アクセスキー`とします。

![スクリーンショット 2022-01-02 8.15.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1380401/51c2ace4-4a7e-fb49-47af-698c568395e4.png)

ユーザーには、AWS公式の権限を付与するため、`既存のポリシーを直接アタッチ`を選び、
一番上に表示されている`AdministratorAcces`をチェックして
次に進めます。

![スクリーンショット 2022-01-02 8.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1380401/c58d17d4-63cc-98b7-f9ce-ec32f6e0bae5.png)

次の画面ではタグ名の設定がありますが、無視してそのまま次に進み
ユーザーの作成まで実行してください。

ユーザー作成完了後には、下記画面が表示されますので
`アクセスキーID`
`シークレットアクセスキー`
をテキストエディターなどに控えておきます。

![スクリーンショット 2022-01-02 8.20.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1380401/f48e769d-6c9c-9ec2-ab54-0f31560077bb.png)



2. AWS CLIに２つの認証情報を設定する

続いて、各ユーザーをAWS CLIに登録していきます。

私の場合は、管理者用ユーザーは登録済みでしたので
登録されているIDとKeyが表示されていました。

Terraform用ユーザーには、profileオプションを付けて
識別できるterraformという名称を入れています。

なお、各種の質問には下記のように答えていきます。

```shell:ターミナル

# 管理者用ユーザー
% aws configure

# 既に登録済みであれば、IDやKeyが表示されます。
AWS Access Key ID [****************AAAA]: 
AWS Secret Access Key [****************BBBB]: 
Default region name [ap-northeast-1]: 
Default output format [json]:


# Terraform用ユーザー
% aws configure --profile terraform

AWS Access Key ID [none]: アクセスキーIDをコピペ
AWS Secret Access Key [none]: シークレットアクセスキーをコピペ
Default region name [none]: ap-northeast-1
Default output format [none]: json

```

入力が完了したら、Finderから
`/Users/ユーザー名/.aws/credentials`と辿っていき
登録できていることが確認します。

```:/Users/ユーザー名/.aws/credentials

[default]
aws_access_key_id = AKI***************
aws_secret_access_key = ***********************
[terraform]
aws_access_key_id = AKI***************
aws_secret_access_key = ***********************

```



# 3. terraformのインストール

まず、Terraformのパッケージマネージャーであるtfenvをインストールします。

その後にTerraformのバージョンを指定した上で、インストールする流れです。

では、ターミナルで実行していきましょう。

```shell:ターミナル

# tfenvのインストール
% brew　install　tfenv

# tfenvがインストールできているか確認する
% tfenv　-v

# インストール可能なterraformバージョンを表示させる
% tfenv　list-remote

# terraformのバージョン1.1.2を指定してインストール
% tfenv　install　1.1.2

# インストール済みのterraformから指定バージョンを選ぶ
% tfenv　use　1.1.2

# 現在使用しているバージョンを確認する
% tfenv　list

# Terraform自体のバージョンも念のため確認する
% terraform -v

```



# 4. git secretsのインストール

次は、AWSのクレデンシャル情報が外部に漏れないように
git secretsをインストールします。

これを導入することで、GitHub上に
AWSシークレットアクセスキー等の秘匿情報が公開されないように
git commitコマンドを制限されます。

Macの場合は、Homebrew経由でインストールできます。

```shell:ターミナル

# git-secretsをインストール
% brew install git-secrets

# AWS秘匿情報の流失を阻止する設定
% git init
% git secrets --install
% git secrets --register-aws
```

検証として、
.gitが存在するリポジトリ内に
偽のcredencialファイルを入れてみます。

```shell:terraform/credentials

# git secretsが機能しそうな情報を入れてみる
[default]
aws_access_key_id = AKIAAAAAAAAAAAAAAAAA
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

```

検証ファイルを保存後に、コミットをしてみるとエラーが発生し、
git secretsがAWS秘匿情報を含んでいることを知らせてくれます。

```shell:ターミナル

# 検証としてコミットまでしてみる
% git add .
% git commit -m "AWS秘匿情報が含まれている為、commitできない"

[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive

```

`参考まで（任意）`
Gitのinit時に、自動的にsecretをinstallさせる設定

```shell:ターミナル

# git initコマンドを実行すると、git secret --installコマンドも動作する
% git secrets --install ~/.git-templates/git-secrets
% git config --global init.templatedir '~/.git-templates/git-secrets'

```



# 5. VScode拡張機能を導入

テキストエディタのVScodeに、Hashicorp社公式の拡張機能を導入します。

![スクリーンショット 2022-01-02 11.22.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1380401/e89ffd4e-931b-c30d-cdbd-0c041d1ec989.png)



# 6. ディレクトリ/ファイル作成

あとは、terraformコードを記述する前に
各ディレクトリ/ファイルを整理しておきます。

`1. main.tf:　terraform/プロバイダ/変数の設定`
`2. terraform.tfvars: 変数に入れる値を設定`
`3. .gitignore: Git履歴を無視する対象ファイルを設定`
`4. modules/各ディレクトリ/main.tf: IAMロール等の一部リソースは、モジュールで作成しやすくする`

上記ディレクトリとファイルを`terraform用ディレクトリの中に`作成します。

ディレクトリ構造を表すために
下記では、homebrew経由でtreeをインストールして
treeコマンドを実行しています。

```shell:ターミナル

# treeをインストール
% brew install tree

# 対象ディレクトリに対して、treeコマンドの実行
% tree terraform_directory

terraform_directory
├── main.tf
├── modules
│   ├── iam_role
│   │   └── main.tf
│   └── security_group
│       └── main.tf
└── terraform.tfvars

```

以上でterraformを実装する前の準備が完了です！



# 参考動画/書籍

https://www.udemy.com/course/iac-with-terraform/

https://www.amazon.co.jp/dp/B07XT7LJLC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1


# 終わりに

terraformでAWSリソース作っていると、削除する時もコマンドでまとめて削除できるし便利！

さすがに実務で自由に消したりはできないだろうけど、個人のポートフォリオには
無駄なAWSリソースを作らないためにも活用してる。

フロントにVue.jsを導入するなど、アプリ構成が複雑になると
terraformも編集が必要になるんだろうなー…