Secret Manager でローテーション スケジュールを作成する

Secret Manager を使用すると、シークレットの定期的なローテーションをスケジュールできます。Secret Manager は、指定したローテーションの頻度と時刻に基づいて、シークレットに関連付けられた Pub/Sub トピックに通知を送信することで、これを行います。このページでは、これらのローテーション スケジュールを設定する方法について説明します。

シークレット ローテーション通知の仕組み

Secret Manager は、シークレットの next_rotation_time で指定された Pub/Sub トピックに SECRET_ROTATE メッセージをトリガーします。このタイムスタンプを指定する方法は 2 つあります。

  1. ユーザー定義: シークレットの作成または更新時に next_rotation_time を指定できます。

  2. ローテーション期間: 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 datetime リファレンスをご覧ください。

  • Secret Manager は、失敗したメッセージ配信の試行を自動的に再試行しますが、シークレット、トピック構成、権限、割り当てに関連する構成ミスがある場合、配信の成功は保証できません。

  • 処理中のローテーションは、同時実行ローテーションによって予期しない動作が発生しないように、別のローテーションを開始する前に完了する必要があります。Secret Manager が Pub/Sub にメッセージを送信しようとしている間は、通知は処理中とみなされます。処理中のローテーションがある場合、スケジュールされたローテーションはスキップされます。 Secret Manager は、失敗したメッセージ送信を最大 7 日間、自動的に再試行します。その後、ローテーションはキャンセルされます。

シークレットのローテーションを構成する

ローテーション スケジュールは、 Google Cloud コンソール、Google Cloud CLI、または Secret Manager API を使用して構成できます。

コンソール

  1. Google Cloud コンソールで、[Secret Manager] ページに移動します。

    Secret Manager に移動

  2. [シークレット マネージャー] ページで、[シークレットを作成] をクリックします。

  3. [シークレットを作成] ページの [名前] フィールドに、シークレットの名前を入力します。

  4. シークレットの値を入力します(例: abcd1234)。[ファイルをアップロード] オプションを使用して、シークレット値を含むテキスト ファイルをアップロードすることもできます。このアクションにより、シークレット バージョンが自動的に作成されます。

  5. [ローテーション] セクションに移動し、[ローテーション期間を設定する] チェックボックスをオンにします。

  6. [ローテーション期間] リストで、デフォルトのオプションから選択するか、[カスタム] を選択して独自のローテーション スケジュールを構成します。

  7. [開始日] フィールドに、ローテーション期間の開始日時を入力します。

  8. [シークレットの作成] をクリックします。

gcloud

後述のコマンドデータを使用する前に、次のように置き換えます。

  • SECRET_ID: Secret の ID。
  • NEXT_ROTATION_TIME: 最初のローテーションが完了するタイムスタンプ。ISO 8601 形式で指定します(例: 2021-06-01T09:00:00Z)。
  • ROTATION_PERIOD: 鍵をローテーションする間隔(秒単位)。たとえば、2,592,000 秒ごとに鍵をローテーションするには、2592000s の値を設定します。
  • FULL_TOPIC_NAME: projects/your-project-id/topics/your-topic-name 形式の Pub/Sub トピックの完全名。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud secrets create SECRET_ID \
  --replication-policy "automatic" \
  --next-rotation-time="NEXT_ROTATION_TIME" \
  --rotation-period="ROTATION_PERIOD" \
  --topics="FULL_TOPIC_NAME"

Windows(PowerShell)

gcloud secrets create SECRET_ID `
  --replication-policy "automatic" `
  --next-rotation-time="NEXT_ROTATION_TIME" `
  --rotation-period="ROTATION_PERIOD" `
  --topics="FULL_TOPIC_NAME"

Windows(cmd.exe)

gcloud secrets create SECRET_ID ^
  --replication-policy "automatic" ^
  --next-rotation-time="NEXT_ROTATION_TIME" ^
  --rotation-period="ROTATION_PERIOD" ^
  --topics="FULL_TOPIC_NAME"

REST

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID
  • SECRET_ID: シークレットの ID
  • TOPIC_NAME: トピック名

HTTP メソッドと URL:

POST https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets?secretId=SECRET_ID

リクエストの本文(JSON):

{
  "replication":{
    "automatic":{}
  },
  "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.googleapis.com/v1/projects/PROJECT_ID/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.googleapis.com/v1/projects/PROJECT_ID/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: 各ローテーション間の時間を指定します。

シークレットのローテーション設定を更新するには、次のいずれかの方法を使用します。

コンソール

  1. Google Cloud コンソールで、[Secret Manager] ページに移動します。

    Secret Manager に移動

  2. 編集するシークレットを探し、そのシークレットに関連付けられた [操作] メニューをクリックします。[操作] メニューで [編集] をクリックします。

  3. [回転] セクションに移動します。必要に応じてローテーション期間を更新し、[シークレットを更新] をクリックします。

gcloud

後述のコマンドデータを使用する前に、次のように置き換えます。

  • SECRET_ID: Secret の ID。
  • NEXT_ROTATION_TIME: 最初のローテーションが完了するタイムスタンプ。ISO 8601 形式で指定します(例: 2021-06-01T09:00:00Z)。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud secrets update SECRET_ID \
  --next-rotation-time="NEXT_ROTATION_TIME"

Windows(PowerShell)

gcloud secrets update SECRET_ID `
  --next-rotation-time="NEXT_ROTATION_TIME"

Windows(cmd.exe)

gcloud secrets update SECRET_ID ^
  --next-rotation-time="NEXT_ROTATION_TIME"

REST

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。
  • SECRET_ID: Secret の ID。
  • NEXT_ROTATION_TIME: 最初のローテーションが完了するタイムスタンプ。ISO 8601 形式で指定します(例: 2021-06-01T09:00:00Z)。

HTTP メソッドと URL:

PATCH https://secretmanager.googleapis.com/v1/projects/$PROJECT_ID/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.googleapis.com/v1/projects/$PROJECT_ID/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.googleapis.com/v1/projects/$PROJECT_ID/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"
  }
}

シークレットのローテーションを無効にする

シークレットのローテーションを無効にするには、次のいずれかの方法を使用します。

コンソール

  1. Google Cloud コンソールで、[Secret Manager] ページに移動します。

    Secret Manager に移動

  2. 編集するシークレットを探し、そのシークレットに関連付けられた [操作] メニューをクリックします。[操作] メニューで [編集] をクリックします。

  3. [回転] セクションに移動します。[ローテーション期間を設定] チェックボックスをオフにして、[シークレットを更新] をクリックします。

gcloud

シークレットの next_rotation_time を削除します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • SECRET_ID: シークレットの ID

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud secrets update SECRET_ID \
    --remove-next-rotation-time

Windows(PowerShell)

gcloud secrets update SECRET_ID `
    --remove-next-rotation-time

Windows(cmd.exe)

gcloud secrets update SECRET_ID ^
    --remove-next-rotation-time

シークレットのローテーション スケジュールを削除する。これにより、next_rotation_timerotation_period の両方が削除されます。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • SECRET_ID: シークレットの ID

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud secrets update SECRET_ID \
    --remove-rotation-schedule

Windows(PowerShell)

gcloud secrets update SECRET_ID `
    --remove-rotation-schedule

Windows(cmd.exe)

gcloud secrets update SECRET_ID ^
    --remove-rotation-schedule

REST

シークレットの次のローテーション時間を削除する

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID
  • SECRET_ID: シークレットの ID

HTTP メソッドと URL:

PATCH https://secretmanager.googleapis.com/v1/projects/$PROJECT_ID/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.googleapis.com/v1/projects/$PROJECT_ID/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.googleapis.com/v1/projects/$PROJECT_ID/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\""
}

シークレットのローテーション スケジュールを削除する。これにより、次のローテーション時間とローテーション期間の両方が削除されます。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID
  • SECRET_ID: シークレットの ID

HTTP メソッドと URL:

PATCH https://secretmanager.googleapis.com/v1/projects/$PROJECT_ID/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.googleapis.com/v1/projects/$PROJECT_ID/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.googleapis.com/v1/projects/$PROJECT_ID/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\""
}

次のステップ