Terraform 0.8 から追加されている Vault Providerを使用して
AWS の Credential を tfvars や環境変数ではなく、Vault から読み込んでみます。
Vault とは
Hashicorp社がリリースしている機密情報(secret)を管理するためのツールです。
詳細についてはこちらのタグにわかりやすい記事がたくさんありますのでご参照ください。
https://qiita.com/tags/Vault
やってみる
Static Secretの作成
Vault を開発モードで起動します。
開発モードではメモリ上に secret が記録され、停止時には消去されます。
$ vault server -dev
※フォアグラウンドで実行され続けます
クライアントからvaultを操作するため、VAULT_ADDR環境変数を設定します。
$ export VAULT_ADDR=http://127.0.0.1:8200
※開発モードではTLSなし、また起動時点で Unseal、root でログインされた状態です。
実際の環境では Vaul tへのアクセスは Unseal Key よるロック解除とユーザ認証が必要になります。
このあたりのイメージは公式の Interactive Tutorial を体験していただくとよいかと思います。
AWS のアクセスキー/シークレットアクセスキーを静的に書き込みます。
$ vault write secret/aws_test access_key=xxxxxxxxxxxxxx secret_key=xxxxxxxxxxxxxxxxxxxx
Success! Data written to: secret/aws_test
shell の history に残したくない場合は、JSON で記述し、@ でファイルを指定します
$ vault write secret/aws_test @data.json
TFファイルを作成する
vault_generic_secret データソースを使用します。
Terraform Module Registry の ec2-instance モジュールを使用して、EC2を起動しました。
data "vault_generic_secret" "aws_test" {
path = "secret/aws_test"
}
provider "aws" {
access_key = "${data.vault_generic_secret.aws_test.data["access_key"]}"
secret_key = "${data.vault_generic_secret.aws_test.data["secret_key"]}"
region = "ap-northeast-1"
}
# fileter latest AMI
data "aws_ami" "amazon_linux" {
most_recent = true
filter {
name = "name"
values = [
"amzn-ami-hvm-*-x86_64-gp2",
]
}
filter {
name = "owner-alias"
values = [
"amazon",
]
}
}
module "ec2-instance" {
source = "terraform-aws-modules/ec2-instance/aws"
name = "aws_test_ec2"
count = 1
ami = "${data.aws_ami.amazon_linux.id}"
instance_type = "t2.micro"
key_name = "keyname"
vpc_security_group_ids = ["sg-12345678"]
}
実行
$ terraform init
$ terraform plan
$ terraform apply
plan結果の一部
$terraform plan
Refreshing Terraform state in-memory prior to plan...
T he refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
data.vault_generic_secret.aws_test: Refreshing state...
data.aws_ami.amazon_linux: Refreshing state...
以下略..
Vault が Unseal されていない状態では以下のようなエラーが出力されます
$ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
Error refreshing state: 1 error(s) occurred:
* provider.vault: failed to create limited child token: Error making API request.
URL: POST http://127.0.0.1:8200/v1/auth/token/create
Code: 503. Errors:
* Vault is sealed
注意点
Vault から読み取ったデータは tfstate には平文で記録されてします。。。
tfstate の管理は厳密に行う必要があります。
参考URL
https://www.vaultproject.io/intro/getting-started/dev-server.html
https://www.terraform.io/docs/providers/vault/d/generic_secret.html
https://www.hashicorp.com/blog/terraform-0-8.html#vault
以上です。