aws-vaultでTerraform環境を安全に使う

## 背景


今後、Terraformを使っていくわけですが、調べていくと<span style="color: #d61b09">Terraformは公式にAssumeRoleへの対応をしていますが、MFAへの対応はされてい</span>ないそうです。

また毎回、aws stsを利用して一時的なクレデンシャルを取得して作業は有効期限などあって大変だったり、通常 ~/.aws/credentials にアクセスキーを保存しますが、平文で保存しているためディスクが盗難にあった場合に少し怖わかったりと管理方法に懸念事項があります。

aws-vault は KeyChain にアクセスキーを保存するので、ディスクが暗号していない場合でも安心して使えます。ということで、aws-vaultをセットアップしてみました。

## 検証環境
- Microsoft Windows 10 Pro
- Git for windows 2.25.1
- aws-cli 2.0.3
- Chocolatey 0.10.15
- aws-vault v5.3.2


## chocolateyをインストール

powershellを管理者権限で開いてインストール

```
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

## aws-vaultをインストール

powershellでインストール

```
choco install aws-vault
```

## 確認

Git bashを開いている場合はアプリを再起動したのち、コマンドが実行できるか確認

```
$ choco --version
0.10.15

$ aws-vault --version
v5.3.2
```

configファイルを以下のように設定します。
検証環境はAssume Roleを設定していないのでコメントアウトしておきます。


```
$ vi ~/.aws/config

[default]
region = ap-northeast-1

[profile mfa]
region=ap-northeast-1
mfa_serial=arn:aws:iam::XXXXXXXXXXXX:mfa/test_ichimura # MFAしている端末
#role_arn=arn:aws:iam::XXXXXXXXXXXX:role/Role # Assume Roleを想定しているロール
source_profile=default
```

またaws configureするとできる~/.aws/credentialsは使わないので空にしておけばよいです。
 以下のようになっていることを確認します。

```
$ aws s3 ls
Unable to locate credentials. You can configure credentials by running "aws configure".
```

### Access Keys、Secret Access Keyをaws-vaultに登録

この設定を行うことで、
credentialsにAccess Keys、Secret Access Keyを直接記述することは不要になります。

```
$ aws-vault add default
Enter Access Key ID: AKXXXXXXXXXXXXXXXXXX
Enter Secret Access Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Added credentials to profile "default" in vault

$ aws-vault exec mfa -- aws s3 ls
Enter token for arn:aws:iam::431708598374:mfa/test_ichimura: 689021
2020-03-26 18:16:37 cloudfrontcachetest1

$ aws-vault ls
Profile                  Credentials              Sessions
=======                  ===========              ========
default                  default                  -
mfa                      -                        1585537646 (mfa)
```

登録するとwindows資格情報に情報が保存されます。
このため平文でcredentialファイルや環境変数にセットするなどの必要がないため安全です。


## 認証ができているか確認

AMIからEC2を作成するサンプルで試してみます。

```aws.tf
provider "aws" {
  region = var.region
}

resource "aws_instance" "example" {
  ami = lookup(var.amis, var.region)
  instance_type = var.instance_type
}

```

```variables.tf
variable "region" {
  description = "AWS region to host your network"
  default     = "us-east-1"
}

variable "instance_type" {
  default = "t2.micro"
}

variable "amis" {
  default = {
    "us-east-1" = "ami-08fde2f5d23ea87aa"
  }
}
```

```
$ aws-vault exec mfa -- terraform init
$ aws-vault exec mfa -- terraform plan
$ aws-vault exec mfa -- terraform apply
```


Acces keys、Secret Acceess keyを記述しなくても、MFA設定しているアカウントでEC2が作成できています。


## 余談

こちらaws-vaultにloginコマンドを使うとログインした状態でマネジメントコンソールが開きます。

```
$ aws-vault login default
```

これだけでも効率的ですね。


## 追記

IAMを扱う際はsession情報を渡さないように(--no-session)しないといけないと以下の現象になりました。
https://github.com/99designs/aws-vault/issues/260

```
aws-vault exec test_env --no-session -- terraform apply
```

## 参考

https://labs.septeni.co.jp/entry/2018/01/12/113000
https://tech.smartcamp.co.jp/entry/2019/03/13/113021
https://qiita.com/kangaechu/items/cb8f68e3866ee5af71c8