アクセスキー有りのIAMユーザー作成 (Terraform)

## 概要
terraformでIAMユーザーを作成＆管理するように設定したかったので調べた内容をメモしておく。

## 前提条件
* windows10 (macOSでもいけると思う)
* Git for windows (git bashを使う -> macであればターミナル)
* Docker Toolbox ( Docker for mac )

## GPG鍵 - GNU Privacy Guard
アクセスキーを作成するのに必要なため、作成しておきます。
※ 今回はwindows環境なので`git for windows`に付属されている`Git Bash`で作業します。

### GPG鍵を作成する
下記のコマンドで新規にGPG鍵を作成する

```bash:ターミナル
$ gpg --gen-key
Real name: app-user                          <- 識別する名前を入力（任意）
Email address: hoge@example.com              <- メールアドレスを入力（任意）
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O  <- 「O」を入力してEnterキーを押す
```
※ `$ gpg --full-generate-key`というコマンドもあります

### GPG鍵を確認する
作成した鍵を下記のコマンドで確認する

```bash:ターミナル
$ gpg --list-keys
```

### GPG鍵をファイルに出力する

```bash:ターミナル
$ gpg -o ./app-user.public.gpg  --export app-user
$ gpg -o ./app-user.private.gpg --export-secret-key app-user
```
※ `app-user`の部分は作成時に指定した名前にします

### 公開鍵をBase64エンコードする
公開鍵をBase64エンコードする必要があるようです。
作成した公開鍵をエンコードし、改行を取り除きファイルに出力しておきます。

```bash:ターミナル
$ cat app-user.public.gpg | base64 | tr -d '\n' > app-user.public.gpg.base64
```

ここで作成した文字列をterraformで使うのでコピーしておく。

```bash:ターミナル
$ cat app-user.public.gpg.base64
mQENB5Tdm6wBCADXaA5u*******************************************************
   ...
*************************************************************aF3KW4LXw=
```

作成したGPG鍵をどこかに保存して削除しておく。

```bash:ターミナル
rm -f app-user.public.gpg
rm -f app-user.private.gpg
```
※ 復号化する際などに使うので大切に保管しておく

## terraformの作業について
dockerコンテナでterraformコマンドが使える環境を作成します。
ここからは、terraformに関する作業になります。

### terraform環境構築
下記のようなファイルを作成します。

```:ファイル構成
opt
　├ docker
　│　└ terraform
　│　   ├ .aws
　│　   │  ├ config.default
　│　   │  └ credentials.default
　│　   ├ Dockerfile
　│　   └ init.sh
　├ src
　│  └ main.tf
　└ docker-compose.yml
```

※ 本題の説明のみにしたいので、解説は省略します。
　 ( 構築方法は、「 [Qiita - dockerでterraform環境を作る](https://qiita.com/reflet/items/de57ae767c8f368372ba#terraform%E6%A7%8B%E7%AF%89) 」を参照ください )

### main.tfを作成する
下記の内容にて作成します。
※ pgp_keyの値に`Base64エンコードした公開鍵の文字列`を挿入する

```tf:src/main.tf
# GPG鍵
variable "pgp_key" {
  default = "mQENB5******* ... ******LXw="
}

# IAMユーザー
resource "aws_iam_user" "AppUser" {
  name = "app-user"
  path = "/system/"
}

# アクセスキー
resource "aws_iam_access_key" "AppUser" {
  user    = "${aws_iam_user.AppUser.name}"
  pgp_key = "${var.pgp_key}"
}

# シークレットキーを出力する
output "app_user_secret" {
  value = "${aws_iam_access_key.AppUser.encrypted_secret}"
}
```

### dockerコンテナ起動
下記コマンドにてterraformコンテナを起動する。

```bash:ターミナル
$ docker-compose run --rm terraform bash
```

### terraform実行
dockerコンテナ内で下記コマンドを実行し、terraformを実行します。

```bash:ターミナル
$ terraform init
$ terraform plan
$ terraform apply
```

生成されたシークレットキーを取得します。

```bash:ターミナル
$ terraform output app_user_secret
wcBMA********* ... **********wFAA==
```
※ gpgコマンドが使える環境にテキストファイル(`secret.gpg`)を作成して保管する


## シークレットキーの復号化
`Git Bash`に戻り、下記コマンドにて復号化する。

```bash:ターミナル
$ cat secret.gpg | base64 -d | gpg -r app-user
********************************
```
※ `******`の部分に復号化されたシークレットキーが表示されます
※ `app-user`の部分は、GPG鍵の作成時に設定した名前に差し替える

### GPG鍵の削除
GPG鍵は、`app-user.public.gpg`と`app-user.private.gpg`という名前のファイルに出力して然るべき場所に保管しました。

そのため、下記コマンドにて削除しておきます。
※ 必要になったらimportコマンドで取り込める

```bash:ターミナル
$ gpg --delete-secret-keys app-user
$ gpg --delete-keys app-user
```
※ `app-user`の部分は、GPG鍵の作成時に設定した名前に差し替える

### GPGの秘密鍵のインポート
別環境で復号化したい場合は、下記コマンドにて秘密鍵をインポートして、復号化に利用できます。

```bash:ターミナル
$ gpg --import app-user.private.gpg
```

以上

## 参考サイト
* [HashiCorp Terraformドキュメント - Resource: aws_iam_access_key](https://www.terraform.io/docs/providers/aws/r/iam_access_key.html)
* [Terraform＋GPG で IAM User にログインパスワードを設定](http://blog.father.gedow.net/2016/12/16/terraform-iam-user-password/)
* [gpg (GNU Privacy Guard)の使い方](https://qiita.com/moutend/items/5c22d6e57a74845578f6)
* [macOS で GitHub にGPG署名付きでコミットできるようにする](https://qiita.com/Ress/items/caf53a82b91103552c0e)