Secrets Managerの自動ローテーションのタイミングを詳細に指定出来るようになりました

2022.02.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

AWS Secrets Managerではシークレットをローテーションすることが可能です。
そして、Secrets Managerベストプラクティスでは30日ごとにローテーションすることが推奨されています。
厳密には認証情報の最大有効期間とローテーション戦略によって推奨日数が変わってきます。

これまでも自動ローテーションを有効化する機能はありましたが、ローテーション間隔として1~365日の日数を指定出来るのみでした。

今回のアップデートで自動ローテーションの設定時により詳細なスケジューリング設定が出来るようになりました。

なにが嬉しいのか

通常Secrets Managerのペストプラクティスに則っている場合は使用するたびにSecret Managerへアクセスせずにシークレットを何らかの方法でキャッシュさせて利用すること、あるいはリトライ処理を組み込むと思います。
これらによって通常はシークレット取得のための高頻度のリソース使用は行われないかと思いますが、シークレットのローテーションが発生したタイミングでキャッシュの更新やリトライ処理が発生します。

従来まではローテーションされるタイミングは日数しか指定できなかったので、特定の高負荷のタイミングでローテーションが発生し、アプリケーションに影響が出る可能性がありました。
今後はローテーションのタイミングを深夜などにスケジューリングしておくことで、そういったリスクを回避することが出来るようになります。

設定方法

従来

従来は以下のように、自動ローテーションの有効/無効の設定と、間隔を日数で指定する形でした。
あとは、こちらに加えてローテーション関数の設定が可能です。

これから

これからは、スケジュール式ビルダーとスケジュール式での設定を行う形となります。

スケジュール式ビルダーでは単位が日・週・月で設定が可能です。
そして、オプションでウィンドウ期間を指定することが出来ます。

週の場合は曜日と開始時刻、月の場合は開始日と開始時刻が指定出来ます。 これらを組み合わせて詳細なスケジューリングを行うことが出来ます。

ウィンドウ期間設定時の注意点ですが、UTC日付を跨ぐウィンドウ期間を設定することは出来ません。
開始時刻が20時(UTC)であれば、ウィンドウ期間は4時間以下とする必要があります。

スケジュールビルダーで設定した内容はCronかRateいずれかのスケジュール式に変換されます。
スケジュール式では直接CronとRateを使って指定することが可能です。

Rate使用時の実行タイミング

Rateの場合は細かい時間の指定が出来ませんが、自動で深夜に実行されます。

With a rate expression, the rotation window automatically starts at midnight.

1日間隔の1時間枠で設定し、ローテーション関数のメトリクスを確認したところ、UTCの0:00を過ぎて少し経過したタイミングで実行されていました。JSTだと9:00です。

Cron使用時の実行タイミング

Cronの場合はより細かい開始日時を指定出来ます。
ただし分の指定は出来ず、0を指定する必要があります。

A cron expression for Secrets Manager must have 0 in the minutes field because Secrets Manager rotation windows open on the hour.

とはいえ、開始時間の指定は出来るので、Rateの挙動とJSTでの利用を考えると、Cronのほうが良いケースが多そうですね。

設定例

Cron式を使って、例えば10日ごとに日本時間の深夜2時開始で2時間のローテーション枠を設定したい場合は以下でしょうか。

さいごに

本日はSecrets Managerの新しくなった自動ローテーション機能を紹介しました。

メンテナンスウィンドウやバックアップ取得などを深夜に設定することが多いと思いますが、今後はシークレットローテーションについてもそういった運用が出来そうですね。というかそうなっていきそうな気がします。