LoginSignup
6
4

More than 5 years have passed since last update.

Terraform の Vault Provider を試す on AWS

Last updated at Posted at 2017-10-30

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 Registryec2-instance モジュールを使用して、EC2を起動しました。

main.tf
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

以上です。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4