はじめに
AWS Secrets Manager を使用して RDS のパスワードを管理している際に、「シークレットが削除予定のため作成できない」というエラーに遭遇しました。
これは Secrets Manager の仕様によるものですが、削除を強制的に実行する方法や、別名で作成する回避策があります。
本記事では、エラーの原因と解決策について解説します。
書こうと思ったきっかけ
Terraform を使ってインフラを構築する際に、RDS のシークレットが作成できないエラーに直面しました。
調査すると、Secrets Manager には削除保留期間があるため、同じ名前のシークレットをすぐに作成できないことがわかりました。
コンソール上で削除されたと思っていたシークレットが、実は復旧期間中だったため、同様の問題を避けるために情報をまとめました。
発生していたエラー
Error: creating Secrets Manager Secret (rds_password): operation error Secrets Manager: CreateSecret, https response error StatusCode: 400, RequestID: bc3c46c7-3650-4b61-bda9-0d2431cc35ee, InvalidRequestException: You can't create this secret because a secret with this name is already scheduled for deletion.
on main.tf line 466, in resource "aws_secretsmanager_secret" "rds_password":
466: resource "aws_secretsmanager_secret" "rds_password" {
このエラーの原因は、同じ名前のシークレットが既に削除予定状態になっているため、新しく作成できないこと です。
AWS Secrets Manager では、シークレットを削除する際に 一定の待機期間(デフォルトは 7 日間、最大 30 日) があり、その間は同じ名前のシークレットを作成できません。
AWS Secrets Manager における削除の仕組み
シークレットが持つ重要な特性から、AWS Secrets Manager では、シークレットの削除を故意に困難にしています。Secrets Manager は、シークレットをすぐには削除しません。Secrets Manager は、シークレットをすぐにアクセス不能にし、最短で 7 日間の復旧期間が経過した後に削除されるようスケジュールを設定します。復旧期間が終了するまで、以前に削除したシークレットを復旧することができます。
引用:https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/manage_delete-secret.html
この仕様のため、Terraform などで同じ名前のシークレットを作成しようとすると、上記のエラーが発生する可能性があります。
実態を確認してみた
AWS Secrets Manager のコンソールでは、デフォルトの設定では 削除が保留されているシークレットは表示されません。
削除が保留されているシークレットを一覧に表示するには、以下の手順でコンソールの設定を変更してください。
-
Secrets Manager のコンソールを開きます。
-
画面右側の歯車アイコンをクリックし、削除予定にチェックを入れます。
エラーを解消してシークレットを再作成する方法
エラーを解消し、すぐにシークレットを再作成したい場合は、復旧期間を待たずにシークレットを完全に削除 することができます。
この操作は AWS CLI を使用して実行可能です。
削除を強制する
以下のコマンドを実行すると、削除の待機期間なしで 即時削除 されます。
aws secretsmanager delete-secret --secret-id 削除したいシークレット --force-delete-without-recovery
実行時の注意点
- この操作を実行すると、シークレットを元に戻すことはできません。
-
--force-delete-without-recovery
オプションを使用すると、復旧期間なしで即時削除されます。
別の名前で Secret を作成する方法
もし rds_password
を完全に削除せず、エラーを回避したい場合は、Terraform のコードを修正し、別の名前で Secret を作成する方法 もあります。
Terraform のコードを以下のように変更すると、新しいシークレットを作成できます。
resource "aws_secretsmanager_secret" "rds_password_v2" {
name = "rds_password_v2"
}
この方法なら、既存の rds_password
に影響を与えず、新しいシークレットとして管理 できます。
まとめ
Secrets Manager では、シークレット削除後に一定の復旧期間があり、その間は同じ名前で新たに作成できません。
エラーを解消するには、CLI で強制削除するか、別の名前でシークレットを作成する方法があります。
Terraform での運用時には、削除の仕様を考慮し、適切な対応を行うことが重要です。
参考文献