はじめに
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.
ローテーションの流れ
実運用でのシークレットローテーション手順は以下のようになります。
add-user-pool-client-secretで 2 つ目のシークレットを作成- アプリケーション側の設定を新しいシークレットに切り替え
- 新しいシークレットで正常に動作することを確認
delete-user-pool-client-secretで古いシークレットを削除
2 つのシークレットが同時にアクティブなので、切り替え中もダウンタイムが発生しません。
まとめ
- アプリクライアントあたり最大 2 つのシークレットを同時に保持でき、ダウンタイムなしのローテーションが可能
- カスタムシークレットを指定できるため、他の認証システムからの移行時に既存のシークレット値をそのまま使える
- マネジメントコンソール・CLI・SDK・CloudFormation のいずれからも操作可能
- シークレット作成時にコピーしておかないと後から確認できないので注意
定期的なクレデンシャルローテーションが求められる環境や、他の認証基盤から Cognito への移行シナリオで便利なアップデートです。
参考ドキュメント
- Application-specific settings with app clients - Amazon Cognito Developer Guide
- AddUserPoolClientSecret - API Reference
- DeleteUserPoolClientSecret - API Reference
- ListUserPoolClientSecrets - API Reference
余談
夏が恋しいです。(2回目)
