■ はじめに
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)対応案
* あくまで、開発時であれば、いくつかの方法が取れる
# オプション「--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
Scala ~ AWS 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