Secrets Manager で [You can’t create this secret because a secret with this name is already scheduled for deletion.]が表示された時の対応

AWS Secrets Manager のシークレットの新規作成時に[You can't create this secret because a secret with this name is already scheduled for deletion.]エラーが表示された時は、復旧期間にあるシークレットがないかを確認しましょう
2022.05.06

おはこんばんちは。オペレーション部のもっさんです。

Secrets Manager でシークレットの再作成を行おうとした時、 You can't create this secret because a secret with this name is already scheduled for deletion. というエラーが表示され、作成に失敗しました。

エラーメッセージからは「既にこのシークレットの削除がスケジュールされている」という状況が示されていますが、既にシークレットの削除コマンドは実行済みでした。本記事では、このエラーの原因と対処を記します。

エラーが発生した状況

既に存在するシークレット testsecret を 削除し、新たに同じ名前のシークレットを作成しました。

CloudShell から AWS CLI コマンドを使用して削除操作を実行しています。

// シークレットを削除する
$ aws secretsmanager delete-secret --secret-id testsecret

//削除したシークレットの情報が返される
{
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:xxxxxxxxxxxx:secret:himitsu-no-key",
    "Name": "testsecret",
    "DeletionDate": "2022-06-05T06:24:31.017000+00:00"
}
  
//シークレットを作成する
$ aws secretsmanager create-secret --name testsecret  --description "test secret" --secret-string himitsu
An error occurred (InvalidRequestException) when calling the CreateSecret operation: You can't create this secret because a secret with this name is already scheduled for deletion.
//シークレットの削除がスケジュールされているというエラーが表示される

Secrets Manager コンソールからシークレットの一覧を確認しましたが、作成できなかったシークレットの名前はリストにありませんでした。

エラーの原因:シークレットの復旧期間

An error occurred (InvalidRequestException) when calling the CreateSecret operation: You can't create this secret because a secret with this name is already scheduled for deletion.

このエラーの発生原因は、シークレットの 復旧期間 という仕組みにより、シークレットの削除が保留されていることが影響していました。

シークレットを誤って削除した場合、システムに大きな影響を及ぼす恐れがあります。そのため、Secrets Manager のデフォルト動作では、削除操作をされたシークレットは一定の復旧期間を経過した後に完全削除されます[1]。

シークレットが持つ重要な特性から、AWS Secrets Manager では、シークレットの削除を故意に困難にしています。Secrets Manager は、シークレットをすぐには削除しません。Secrets Manager は、シークレットをすぐにアクセス不能にし、最短で 7 日間の復旧期間が経過した後に削除されるようスケジュールを設定します。復旧期間が終了するまで、以前に削除したシークレットを復旧することができます。
引用[1]:シークレットの削除 - AWS Secrets Manager

復旧期間内にあるシークレットはアクセス不能となりますが、復旧可能な形で Secrets Manager 内に保持されます。利用はできませんがシークレット自体は残っている状態となるため、同じ名前で新しいシークレットを作成しようとするとエラーが発生していたのです。

もう一度、シークレットを削除したときのコマンドの応答を確認してみましょう。
DeletionDateの値には、復旧期間の終了日時が記録されています。AWS CLIのコマンドから削除操作を行った場合、デフォルトで復旧期間は30日に設定されます。

$ aws secretsmanager delete-secret --secret-id testsecret
{
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:<aws-account-id>:secret:himitsu-no-key",
    "Name": "testsecret",
    "DeletionDate": "2022-06-05T06:24:31.017000+00:00"
}

Secrets Manager のコンソールからは、デフォルトでは削除が保留されているシークレットを表示することができません。削除が保留されている状態のシークレットを一覧に表示する場合、次の手順でコンソールの設定を変更してください。
Secrets Manager のコンソールを開き、画面右側の歯車マークをクリックします。

[設定]ポップアップが開きます。[削除予定のシークレットを表示する]のチェックを入れ、[保存]をクリックします。

削除保留中のシークレットもリストに表示されました。

エラーを解消してシークレットを再作成するには

エラーを解消して今すぐシークレットを再作成したい場合は、復旧期間の経過を待たずにシークレットを削除することができます。

操作は AWS CLI から実行可能です。シークレットを削除する delete-secret コマンドの実行時に、復旧期間なしで強制的に削除する--force-delete-without-recovery オプションを付与します。

$ aws secretsmanager delete-secret --secret-id testsecret --force-delete-without-recovery

//削除したシークレットの情報が返される
{
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:<aws-account-id>:secret:himitsu-no-key",
    "Name": "testsecret",
    "DeletionDate": "2022-05-06T13:37:56.667000+00:00"
}

//シークレットが削除されているか確認
$ aws secretsmanager describe-secret --secret-id testsecrets

//指定されたシークレットは存在しない、というエラーが返される
An error occurred (ResourceNotFoundException) when calling the DescribeSecret operation: Secrets Manager can't find the specified secret.

//削除したシークレットと同じ名前 "testsecrets" で再度シークレットを作成
$ aws secretsmanager create-secret --name testsecret  --description "test secret" --secret-string himitsu
//エラーが表示されず、作成したシークレットの情報が返されることを確認
{
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:<aws-account-id>:secret:himitsu-no-key",
    "Name": "testsecret",
    "VersionId": "<バージョンID>"
}

備考

シークレットの復旧期間は、7日〜30日の間で設定することが可能です。AWS CLI で復旧期間を指定しない場合、デフォルトでは30日の復旧期間が設定されます[2]。Secrets Manager のコンソールでは、シークレットの削除を行うとポップアップで復旧期間を指定するよう要求されます。

You can specify a recovery window during which you can restore the secret. The minimum recovery window is 7 days. The default recovery window is 30 days. Secrets Manager attaches a DeletionDate stamp to the secret that specifies the end of the recovery window.
引用[2]:delete-secret — AWS CLI 2.6.2 Command Reference

参考