【Terraform】Terraform ~ AWS Secrets Manager ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/04/05/000224
https://dk521123.hatenablog.com/entry/2023/04/09/104204
https://dk521123.hatenablog.com/entry/2023/04/08/220411

の続き。

今回は、Terraform で AWS Secrets Manager について扱う。

目次

【1】Secrets Manager
【2】公式ドキュメント
【3】サンプル
【4】補足1:ランダム文字列生成「random_password」「random_string」
 1)使用上の注意
 2)サンプル
【5】補足2:エラー「You can’t create ... already scheduled deletion」
 1)エラー内容
 2)原因
 3)解決案

【1】Secrets Manager

* Secrets Manager については、以下の関連記事を参照のこと

機密データの管理 ~ Secrets Manager 編 ~
https://dk521123.hatenablog.com/entry/2020/03/12/220717

【2】公式ドキュメント

* 以下のAPI を使う

aws_secretsmanager_secret
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret
aws_secretsmanager_secret_version
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret_version

【3】サンプル

# [0]-1 To define setting values
locals {
  env = "dev" # or stage or prod
  aws_region = "us-west-2"
}

# [0]-2:To specify AWS
provider "aws" {
  region = local.aws_region
  default_tags {
    tags = {
      env = local.env
    }
  }
}

# [Option] Create password
resource "random_password" "demo_password" {
  length  = 20
  special = false
}

# Set your secret values
variable "demo_secret_values" {
  default = {
    key1 = "secret_value1"
    key2 = "secret_value2"
    key3 = random_password.demo_password.result
  }

  type = map(string)
}

# aws_secretsmanager_secret
resource "aws_secretsmanager_secret" "your_secret" {
  name = "your_secret_name"
  description = "This is a just sample secret..."
}

# aws_secretsmanager_secret_version
resource "aws_secretsmanager_secret_version" "your_secret_version" {
  secret_id     = aws_secretsmanager_secret.your_secret.id
  secret_string = jsonencode(var.demo_secret_values)
}

【4】補足1:ランダム文字列生成「random_password」「random_string」

random_password
https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/password
random_string
https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string

1)使用上の注意

* random_stringは、パスワードには使用しないこと
 => 生成結果が標準出力として表示されるため

https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string

より抜粋
~~~~~
This resource does use a cryptographic random number generator.
~~~~~

2)サンプル

# 実験コード
resource "random_string" "experiment1" {
  length = 16
  special = false
  override_special = "_%@"
}

resource "random_password" "experiment2" {
  length = 16
  special = true
  override_special = "_%@"
}

output "experiment1" {
  value = random_string.experiment1.result
  sensitive = false
}

output "experiment2" {
  value = random_password.experiment2.result
  sensitive = true
}

出力例

# 事前に「terraform init」「terraform plan」は行っておくこと
#  => ★1は、random_stringを使っていて内容が出力される
#  => ★2は、random_passwordを使っており出力されない

$ terraform apply

・・・略・・・
random_string.experiment1: Refreshing state... [id=idl8DgafJYy8S9Nf] << ★1
random_password.experiment2: Refreshing state... [id=none] << ★2
・・・略・・・

Outputs:

experiment1 = "idl8DgafJYy8S9Nf" << ★1
experiment2 = <sensitive> << ★2

【5】補足2:エラー「You can’t create ... already scheduled deletion」

 開発時に、Terraform apply/destroy を繰り返していると、
以下「エラー内容」になる可能性があるので注意

1)エラー内容

You can’t create this secret because a secret with this name is already scheduled for deletion.

2)原因

https://dev.classmethod.jp/articles/secrets-manager-error-recovery-window/

に詳しく書いてあるが、
terraform destroy すると、シークレットが削除されるが、
Secrets Managerの仕様上、シークレットの 復旧期間があり、
すぐに削除される訳じゃない

3)対応案

* あくまで、開発時であれば、いくつかの方法が取れる

案1:AWS CLI で無理やり削除後に実行

# オプション「--force-delete-without-recovery」で無理やり消す
aws secretsmanager delete-secret \
    --secret-id your_secret_name \
    --force-delete-without-recovery  --region <aws region>

https://medium.com/geekculture/aws-secrets-manager-and-terraform-state-delete-issue-d740f66cbcb9

案2:「recovery_window_in_days=0」を設定する
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret

recovery_window_in_days - (Optional)
Number of days that AWS Secrets Manager waits before it can delete the secret.
This value can be 0 to force deletion without recovery
 or range from 7 to 30 days. The default value is 30.

案3:「force_overwrite_replica_secret = true」にする

force_overwrite_replica_secret - (Optional)
 Accepts boolean value to specify whether to overwrite a secret
 with the same name in the destination Region.

参考文献

https://ahyt910.hateblo.jp/entry/2021/07/04/142112
https://engineering.mobalab.net/2021/03/25/handling-secrets-with-terraform/

関連記事

Terraform ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/05/000224
Terraform ~ AWS S3 ~
https://dk521123.hatenablog.com/entry/2023/04/09/104204
Terraform ~ AWS IAM ~
https://dk521123.hatenablog.com/entry/2023/04/12/214311
Terraform ~ AWS Glue ~
https://dk521123.hatenablog.com/entry/2023/04/08/220411
Terraform ~ AWS KMS ~
https://dk521123.hatenablog.com/entry/2023/05/26/000000
Terraform ~ Docker ~
https://dk521123.hatenablog.com/entry/2023/04/10/193239
Terraform ~ 機密情報の扱いを考える ~
https://dk521123.hatenablog.com/entry/2023/05/18/005103
機密データの管理 ~ Secrets Manager 編 ~
https://dk521123.hatenablog.com/entry/2020/03/12/220717
ScalaAWS SDK / Secrets Managerサンプル ~
https://dk521123.hatenablog.com/entry/2023/04/03/012600
機密データの管理 ~ Secrets Manager / AWS CLI 編 ~
https://dk521123.hatenablog.com/entry/2022/06/14/110641