Secret Manager では、シークレットの定期的なローテーションをスケジュールできます。Secret Manager は、指定したローテーション頻度と時間に基づいて、シークレットに関連付けられた Pub/Sub トピックに通知を送信します。このページでは、これらのローテーション スケジュールを設定する方法について説明します。
シークレット ローテーション通知の仕組み
Secret Manager は、シークレットの next_rotation_time
で指定された Pub/Sub トピックに SECRET_ROTATE
メッセージをトリガーします。このタイムスタンプを指定する方法は 2 つあります。
-
ユーザー定義: シークレットの作成時または更新時に
next_rotation_time
を指定できます。 -
ローテーション期間:
rotation_period
を定義すると、Secret Manager によってnext_rotation_time
が自動的に計算されます。Secret Manager は、指定されたrotation_period
が経過した後にSECRET_ROTATE
メッセージを送信し、next_rotation_time
を更新して次のローテーションをスケジュールします。
SECRET_ROTATE
メッセージを受信して処理するように Pub/Sub サブスクライバーを構成する必要があります。
また、これらの通知に応じて、新しいバージョンのシークレットの作成や、変更をアプリケーションにデプロイするなど、追加のワークフローを設定することも必要になる場合があります。
シークレット ローテーション スケジュールの要件と考慮事項
-
Pub/Sub トピックはシークレットに構成する必要があります。Pub/Sub のトピックとサブスクリプションを作成する方法については、Pub/Sub のクイックスタートをご覧ください。シークレットにトピックを構成する方法については、Secret Manager のイベント通知をご覧ください。
-
rotation_period
が指定されている場合は、next_rotation_time
を設定する必要があります。 -
next_rotation_time
は以降 5 分未満には設定できません。 -
rotation_period
は 1 時間以上にする必要があります。タイムスタンプのフォーマットに関するガイダンスについては、Google Cloud の日時のリファレンスをご覧ください。 -
Secret Manager は、失敗したメッセージ配信を自動的に再試行しますが、シークレット、トピック構成、権限、割り当てに関連する構成ミスがある場合、配信の成功を保証することはできません。
-
処理中のローテーションは、同時実行ローテーションによって予期しない動作が発生しないように、別のローテーションを開始する前に完了する必要があります。Secret Manager が Pub/Sub にメッセージを送信しようとしている間は、通知は処理中とみなされます。処理中のローテーションがある場合、スケジュールされたローテーションはスキップされます。 Secret Manager は、失敗したメッセージ送信を最大 7 日間、自動的に再試行します。その後、ローテーションはキャンセルされます。
シークレットのローテーションを構成する
ローテーション スケジュールは、Google Cloud コンソール、Google Cloud CLI、または Secret Manager API を使用して構成できます。
Console
-
Google Cloud コンソールの [Secret Manager] ページに移動します。
-
[Secret Manager] ページで、[リージョン シークレット] タブをクリックし、[リージョン シークレットを作成] をクリックします。
-
[リージョン シークレットを作成] ページの [名前] フィールドに、シークレットの名前を入力します。
-
シークレットの値を入力します(例:
abcd1234
)。[ファイルをアップロード] オプションを使用して、シークレット値を含むテキスト ファイルをアップロードすることもできます。この操作により、シークレット バージョンが自動的に作成されます。 -
[リージョン] リストから、リージョン シークレットを保存するロケーションを選択します。
-
[ローテーション] セクションに移動し、[ローテーション期間を設定] チェックボックスをオンにします。
-
[ローテーション期間] リストで、デフォルトのオプションから選択するか、[カスタム] を選択して独自のローテーション スケジュールを構成します。
-
[開始日] フィールドに、ローテーション期間の開始日時を入力します。
-
[シークレットの作成] をクリックします。
gcloud
後述のコマンドデータを使用する前に、次のように置き換えます。
- SECRET_ID: シークレットの ID またはシークレットの完全修飾識別子。
- LOCATION: シークレットの Google Cloud ロケーション。
- NEXT_ROTATION_TIME: 最初のローテーションが完了する時点のタイムスタンプ(ISO 8601 形式)。例:
2021-06-01T09:00:00Z
。 - ROTATION_PERIOD: 鍵をローテーションする間隔(秒単位)。たとえば、2592000 秒ごとにキーをローテーションするには、値を
2592000s
に設定します。 - FULL_TOPIC_NAME: Pub/Sub トピックのフルネーム(
projects/your-project-id/topics/your-topic-name
形式)。
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud secrets create SECRET_ID --location=LOCATION \ --next-rotation-time="NEXT_ROTATION_TIME" \ --rotation-period="ROTATION_PERIOD" \ --topics="FULL_TOPIC_NAME"
Windows(PowerShell)
gcloud secrets create SECRET_ID --location=LOCATION ` --next-rotation-time="NEXT_ROTATION_TIME" ` --rotation-period="ROTATION_PERIOD" ` --topics="FULL_TOPIC_NAME"
Windows(cmd.exe)
gcloud secrets create SECRET_ID --location=LOCATION ^ --next-rotation-time="NEXT_ROTATION_TIME" ^ --rotation-period="ROTATION_PERIOD" ^ --topics="FULL_TOPIC_NAME"
REST
リクエストのデータを使用する前に、次のように置き換えます。
- LOCATION: シークレットの Google Cloud ロケーション
- PROJECT_ID: Google Cloud プロジェクト ID
- SECRET_ID: シークレットの ID またはシークレットの完全修飾識別子
- TOPIC_NAME: トピック名
HTTP メソッドと URL:
POST https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?secretId=SECRET_ID
リクエストの本文(JSON):
{ "topics": {"name" : "projects/$PROJECT_ID/topics/$TOPIC_NAME"}, "rotation": { "next_rotation_time": "2021-06-01T09:00:00Z", "rotation_period" : '2592000s' }, }
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?secretId=SECRET_ID"
PowerShell
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?secretId=SECRET_ID" | Select-Object -Expand Content
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID", "createTime": "2024-09-04T04:06:00.660420Z", "topics": [ { "name": "projects/PROJECT_ID/topics/TOPIC_NAME" } ], "etag": "\"1621434abc8dc4\"", "rotation": { "nextRotationTime": "2024-09-10T09:00:00Z", "rotationPeriod": "2592000s" } }
シークレットのローテーション設定を更新する
更新リクエストを行うときに、次のローテーション設定を更新できます。
-
rotation
: シークレットのローテーション構成全体を指します。 -
rotation.next_rotation_time
: 特に、次のローテーションが発生する可能性があるタイムスタンプをターゲットにします。 -
rotation.rotation_period
: 各ローテーション間の時間を指定します。
シークレットのローテーション設定を更新するには、次のいずれかの方法を使用します。
Console
-
Google Cloud コンソールの [Secret Manager] ページに移動します。
-
[Secret Manager] ページで、[リージョン シークレット] タブをクリックします。
-
編集するシークレットを探し、そのシークレットに関連付けられた
[操作] メニューをクリックします。[操作] メニューで [編集] をクリックします。 -
[ローテーション] セクションに移動します。必要に応じてローテーション期間を更新し、[シークレットを更新] をクリックします。
gcloud
後述のコマンドデータを使用する前に、次のように置き換えます。
- SECRET_ID: シークレットの ID またはシークレットの完全修飾識別子。
- LOCATION: シークレットの Google Cloud ロケーション。
- NEXT_ROTATION_TIME: 最初のローテーションが完了する時点のタイムスタンプ(ISO 8601 形式)。例:
2021-06-01T09:00:00Z
。
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud secrets update SECRET_ID --location=LOCATION \ --next-rotation-time="NEXT_ROTATION_TIME"
Windows(PowerShell)
gcloud secrets update SECRET_ID --location=LOCATION ` --next-rotation-time="NEXT_ROTATION_TIME"
Windows(cmd.exe)
gcloud secrets update SECRET_ID --location=LOCATION ^ --next-rotation-time="NEXT_ROTATION_TIME"
REST
リクエストのデータを使用する前に、次のように置き換えます。
- LOCATION: シークレットの Google Cloud ロケーション。
- PROJECT_ID: Google Cloud プロジェクト ID。
- SECRET_ID: シークレットの ID またはシークレットの完全修飾識別子。
- NEXT_ROTATION_TIME: 最初のローテーションが完了する時点のタイムスタンプ(ISO 8601 形式)。例:
2021-06-01T09:00:00Z
。
HTTP メソッドと URL:
PATCH https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/$PROJECT_ID/locations/LOCATION/secrets/$SECRET_ID?updateMask=rotation.next_rotation_time
リクエストの本文(JSON):
{ "rotation": {"next_rotation_time": "NEXT_ROTATION_TIME"} }
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/$PROJECT_ID/locations/LOCATION/secrets/$SECRET_ID?updateMask=rotation.next_rotation_time"
PowerShell
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/$PROJECT_ID/locations/LOCATION/secrets/$SECRET_ID?updateMask=rotation.next_rotation_time" | Select-Object -Expand Content
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID", "createTime": "2024-09-04T04:06:00.660420Z", "topics": [ { "name": "projects/PROJECT_ID/topics/TOPIC_NAME" } ], "etag": "\"1621434abc8dc4\"", "rotation": { "nextRotationTime": "2024-09-10T09:00:00Z", "rotationPeriod": "2592000s" } }
シークレットのローテーションを無効にする
シークレットのローテーションを無効にするには、次のいずれかの方法を使用します。
Console
-
Google Cloud コンソールの [Secret Manager] ページに移動します。
-
[Secret Manager] ページで、[リージョン シークレット] タブをクリックします。
-
編集するシークレットを探し、そのシークレットに関連付けられた
[操作] メニューをクリックします。[操作] メニューで [編集] をクリックします。 -
[ローテーション] セクションに移動します。[ローテーション期間を設定する] チェックボックスをオフにして、[シークレットを更新] をクリックします。
gcloud
シークレットの next_rotation_time
を削除します。
後述のコマンドデータを使用する前に、次のように置き換えます。
- SECRET_ID: シークレットの ID またはシークレットの完全修飾識別子
- LOCATION: シークレットの Google Cloud ロケーション
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud secrets update SECRET_ID --location=LOCATION \ --remove-next-rotation-time
Windows(PowerShell)
gcloud secrets update SECRET_ID --location=LOCATION ` --remove-next-rotation-time
Windows(cmd.exe)
gcloud secrets update SECRET_ID --location=LOCATION ^ --remove-next-rotation-time
シークレットのローテーション スケジュールを削除する。これにより、next_rotation_time
と rotation_period
の両方が削除されます。
後述のコマンドデータを使用する前に、次のように置き換えます。
- SECRET_ID: シークレットの ID またはシークレットの完全修飾識別子
- LOCATION: シークレットの Google Cloud ロケーション
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud secrets update SECRET_ID --location=LOCATION \ --remove-rotation-schedule
Windows(PowerShell)
gcloud secrets update SECRET_ID --location=LOCATION ` --remove-rotation-schedule
Windows(cmd.exe)
gcloud secrets update SECRET_ID --location=LOCATION ^ --remove-rotation-schedule
REST
シークレットの次のローテーション時間を削除する
リクエストのデータを使用する前に、次のように置き換えます。
- LOCATION: シークレットの Google Cloud ロケーション
- PROJECT_ID: Google Cloud プロジェクト ID
- SECRET_ID: シークレットの ID またはシークレットの完全修飾識別子
HTTP メソッドと URL:
PATCH https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/$PROJECT_ID/locations/LOCATION/secrets/$SECRET_ID?updateMask=rotation.next_rotation_time
リクエストの本文(JSON):
{}
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/$PROJECT_ID/locations/LOCATION/secrets/$SECRET_ID?updateMask=rotation.next_rotation_time"
PowerShell
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/$PROJECT_ID/locations/LOCATION/secrets/$SECRET_ID?updateMask=rotation.next_rotation_time" | Select-Object -Expand Content
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID", "createTime": "2024-09-04T04:06:00.660420Z", "topics": [ { "name": "projects/PROJECT_ID/topics/TOPIC_NAME" } ], "etag": "\"16214530fa18d3\"" }
シークレットのローテーション スケジュールを削除する。これにより、次のローテーション時間とローテーション期間の両方が削除されます。
リクエストのデータを使用する前に、次のように置き換えます。
- LOCATION: シークレットの Google Cloud ロケーション
- PROJECT_ID: Google Cloud プロジェクト ID
- SECRET_ID: シークレットの ID またはシークレットの完全修飾識別子
HTTP メソッドと URL:
PATCH https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/$PROJECT_ID/locations/LOCATION/secrets/$SECRET_ID?updateMask=rotation
リクエストの本文(JSON):
{}
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/$PROJECT_ID/locations/LOCATION/secrets/$SECRET_ID?updateMask=rotation"
PowerShell
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/$PROJECT_ID/locations/LOCATION/secrets/$SECRET_ID?updateMask=rotation" | Select-Object -Expand Content
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID", "createTime": "2024-09-04T04:06:00.660420Z", "topics": [ { "name": "projects/PROJECT_ID/topics/TOPIC_NAME" } ], "etag": "\"16214530fa18d3\"" }