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

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 の日時のリファレンスをご覧ください。

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

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

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

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

Console

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

    Secret Manager に移動

  2. [Secret Manager] ページで、[リージョン シークレット] タブをクリックし、[リージョン シークレットを作成] をクリックします。

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

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

  5. [リージョン] リストから、リージョン シークレットを保存するロケーションを選択します。

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

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

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

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

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

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

    Secret Manager に移動

  2. [Secret Manager] ページで、[リージョン シークレット] タブをクリックします。

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

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

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

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

    Secret Manager に移動

  2. [Secret Manager] ページで、[リージョン シークレット] タブをクリックします。

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

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

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_timerotation_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\""
}

次のステップ