Amazon Cognito でクライアントシークレットのローテーションとカスタムシークレットが使えるようになりました

記事タイトルとURLをコピーする

はじめに

2026 年 2 月 26 日に Amazon Cognito のアップデートがありました。

Amazon Cognito enhances client secret management with secret rotation and custom secrets

ユーザープールのアプリクライアントに対して、以下の機能が追加されています。

  • クライアントシークレットのオンデマンドローテーション
  • カスタムクライアントシークレットの指定(自分で値を決められる)
  • アプリクライアントあたり最大 2 つのシークレットを同時に保持

これまではシークレットの変更にはアプリクライアントの再作成が必要でしたが、今回のアップデートでダウンタイムなしのローテーションが可能になりました。

実際に試してみます。

マネジメントコンソールで試す

アプリクライアントの設定画面に「Client secrets」タブが追加されています。

「Create Secret」を押して 2 つ目のシークレットを作りましょう。

自分でカスタムシークレットを指定することもできます。

作成したシークレットをコピーしておかないと、マネジメントコンソールから後でコピーできない点に注意です。

できました。

最初のシークレットを削除したところ、マネジメントコンソールからシークレットがコピーできなくなっていました。

クライアントシークレットは 2 つが上限で、2 つ作ると「Create Secret」がグレーアウトします。

AWS CLI で試す

新しく 3 つの CLI コマンドが追加されています。

  • aws cognito-idp add-user-pool-client-secret — シークレットの追加
  • aws cognito-idp delete-user-pool-client-secret — シークレットの削除
  • aws cognito-idp list-user-pool-client-secrets — シークレットの一覧取得

シークレットの一覧取得

aws cognito-idp list-user-pool-client-secrets \
    --user-pool-id ap-northeast-1_XXXXXXXXX \
    --client-id 1a2b3c4d5e6f7g8h9i0j1k2l3m
{
    "ClientSecrets": [
        {
            "ClientSecretId": "1a2b3c4d5e6f7g8h9i0j1k2l3m--1772782711923",
            "ClientSecretCreateDate": "2026-03-06T16:38:31.923000+09:00"
        }
    ]
}

シークレットの追加(自動生成)

--client-secret を指定しなければ、Cognito が自動でシークレットを生成します。

aws cognito-idp add-user-pool-client-secret \
    --user-pool-id ap-northeast-1_XXXXXXXXX \
    --client-id 1a2b3c4d5e6f7g8h9i0j1k2l3m
{
    "ClientSecretDescriptor": {
        "ClientSecretId": "1a2b3c4d5e6f7g8h9i0j1k2l3m--1772782876724",
        "ClientSecretValue": "abcdefghij1234567890abcdefghij1234567890abcdefghij",
        "ClientSecretCreateDate": "2026-03-06T16:41:16.724000+09:00"
    }
}

自動生成の場合はレスポンスに ClientSecretValue が含まれます。

シークレットの追加(カスタム値を指定)

--client-secret パラメータで任意の値を指定できます。API リファレンスによると、24〜64 文字の英数字([\w+]+)が使えます。

aws cognito-idp add-user-pool-client-secret \
    --user-pool-id ap-northeast-1_XXXXXXXXX \
    --client-id 1a2b3c4d5e6f7g8h9i0j1k2l3m \
    --client-secret "mycustomsecretvaluefortesting12345"
{
    "ClientSecretDescriptor": {
        "ClientSecretId": "1a2b3c4d5e6f7g8h9i0j1k2l3m--1772783754675",
        "ClientSecretCreateDate": "2026-03-06T16:55:54.675000+09:00"
    }
}

カスタムシークレットの場合、自分で値を知っているため ClientSecretValue はレスポンスに含まれません。

シークレットの削除

古いシークレットを削除してローテーションを完了します。

aws cognito-idp delete-user-pool-client-secret \
    --user-pool-id ap-northeast-1_XXXXXXXXX \
    --client-id 1a2b3c4d5e6f7g8h9i0j1k2l3m \
    --client-secret-id "1a2b3c4d5e6f7g8h9i0j1k2l3m--1772782711923"

上限を超えるとエラー

2 つのシークレットがある状態で 3 つ目を追加しようとすると LimitExceededException になります。

aws cognito-idp add-user-pool-client-secret \
    --user-pool-id ap-northeast-1_XXXXXXXXX \
    --client-id 1a2b3c4d5e6f7g8h9i0j1k2l3m
An error occurred (LimitExceededException) when calling the AddUserPoolClientSecret operation:
Client secrets cannot exceed limit of 2 secrets.

ローテーションの流れ

実運用でのシークレットローテーション手順は以下のようになります。

  1. add-user-pool-client-secret で 2 つ目のシークレットを作成
  2. アプリケーション側の設定を新しいシークレットに切り替え
  3. 新しいシークレットで正常に動作することを確認
  4. delete-user-pool-client-secret で古いシークレットを削除

2 つのシークレットが同時にアクティブなので、切り替え中もダウンタイムが発生しません。

まとめ

  • アプリクライアントあたり最大 2 つのシークレットを同時に保持でき、ダウンタイムなしのローテーションが可能
  • カスタムシークレットを指定できるため、他の認証システムからの移行時に既存のシークレット値をそのまま使える
  • マネジメントコンソール・CLI・SDK・CloudFormation のいずれからも操作可能
  • シークレット作成時にコピーしておかないと後から確認できないので注意

定期的なクレデンシャルローテーションが求められる環境や、他の認証基盤から Cognito への移行シナリオで便利なアップデートです。

参考ドキュメント

余談

夏が恋しいです。(2回目)

山本 哲也 (記事一覧)

多分インフラエンジニアです。データ分析に興味あります。

山を走るのが趣味です。今年は 100 マイルレース完走します。