AWS credentials expired or invalidの直し方 — Claude Codeで認証復旧
「AWS credentials expired or invalid」はv2.1.198以降、awsAuthRefresh設定時のみ出る401エラーです。設定の有無で対処が変わります。
「AWS credentials expired or invalid」が出る条件
このメッセージは誰にでも出るわけではありません。Claude Code v2.1.198以降で、かつ設定ファイルにawsAuthRefreshが設定されているときだけ表示されます。実体はAWSのセッショントークンが失効したか拒否された状態で、Claude Codeがすでに自動リフレッシュを試みたものの、APIが受け付ける認証情報を得られなかったことを意味します。
出どころは2つに絞られます。Claude Platform on AWSからの401、またはAmazon BedrockのMantleエンドポイントからの401です。どちらも、期限切れのセキュリティトークンをこの形で報告するプロバイダーです。標準のBedrock Invoke APIとは報告の仕方が異なる点も、覚えておくと切り分けが早くなります。
メッセージの読み方: 中央のヒントは環境ごとに違う
実際の表示は次のような形です。
AWS credentials expired or invalid · run /login and select "Claude Platform on AWS · refresh credentials", or run `aws sso login --profile myprofile` in another terminal · API Error: 401 ...中央のヒント部分には、設定ファイルのawsAuthRefreshに書いたコマンドがそのまま埋め込まれます。プロファイル名やコマンド自体は利用者ごとに違うため、固定なのは先頭のAWS credentials expired or invalidという文言だけです。検索するときはこの先頭部分を使うと、環境差に影響されずに同じ記事へたどり着けます。
awsAuthRefresh未設定だとこの文面は出ない
awsAuthRefreshを設定していない環境で同じ401が起きた場合、Claude Codeが表示するのは一般的なPlease run /loginというメッセージです。このメッセージはAWSの認証情報を更新する手立てにはなりません。
つまり、AWS credentials expired or invalidという具体的な文面自体が「この環境には自動リフレッシュの設定が入っている」という証拠になります。設定していないのに/loginを繰り返しても直らない場合は、先にawsAuthRefreshを設定するところから始める必要があります。
{
"awsAuthRefresh": "aws sso login --profile myprofile",
"env": {
"AWS_PROFILE": "myprofile"
}
}awsAuthRefreshには.awsディレクトリを更新するコマンドを指定します。コマンドの出力は画面に表示されますが、対話的な入力の受け付けはできません。ブラウザーでURLやコードを表示して完了させるタイプのSSOフローと相性がよい設計です。
似た名前の設定にawsCredentialExportがあります。トリガーの条件がまったく違うので混同しないよう注意します。awsAuthRefreshはAWS認証情報が失効したとClaude Codeが判断したときだけ動きます。一方awsCredentialExportはセッション開始時と認証情報の再読み込みのたびに、既存の認証情報がまだ有効でも毎回実行されます。.awsディレクトリを直接書き換えられない環境で、クロスアカウントの認証情報をJSON形式でその都度返す必要がある場合に使う設定で、awsAuthRefreshとは用途が分かれています。AWS credentials expired or invalidが出た場面で見直すべきは、基本的にawsAuthRefresh側です。
直し方: 3つの選択肢
aws sso login --profile myprofile- 別のターミナルで、設定ファイルに書いた
awsAuthRefreshのコマンド(上の例ならaws sso login --profile myprofile)を実行する。ブラウザーでのサインインを完了させてから、Claude Code側でリトライします - 対話セッション内なら
/loginを実行し、「3rd-party platform」を選ぶ。「Using 3rd-party platforms」の下にあるClaude Platform on AWS · refresh credentialsを選ぶと、Claude Codeを再起動せずに同じコマンドを裏側で実行してくれます - リフレッシュコマンドが成功したのにエラーが続く場合、同じシェル・同じプロファイルで次を実行し、AWS側から見て有効な身元かどうかを確認します
aws sts get-caller-identityこの3つ目の確認で身元自体が拒否される場合、問題はClaude Codeの設定ではなくAWS側のセッションにあります。IAM Identity Centerでの再認可や、プロファイルの見直しが必要です。
なお、Claude Codeは起動時に既存のAWS認証情報を検証できなかった場合も、自動でこのawsAuthRefreshコマンドを実行します。この間はターミナル上にAuthenticationという表示のパネルが出て、コマンドの出力とログインの完了を待つ状態になります。手作業でリフレッシュコマンドを打つ前に、まずこのパネルが自然に完了するかを数秒待ってみるのも選択肢の1つです。
そもそもなぜ「自動更新したのに失効」が起きるのか
Claude CodeはAWSの認証情報チェーンを毎回解決するのではなく、一度解決した結果をメモリに保持し、失効の5分前まで、あるいは失効時刻を持たない認証情報なら1時間、使い回します。SSOバックエンドのプロファイルであれば、認証情報の寿命1回につき1度だけIAM Identity Centerへ問い合わせる計算になり、無駄なリクエストを減らす設計です。
このキャッシュは、APIから認証情報エラーが返ってきた時点で破棄され、次のリトライで新しい認証情報を解決し直します。AWS credentials expired or invalidは、まさにこの「エラーを受けて再解決を試みたが、それでも受け入れられる認証情報が得られなかった」状態を指します。単なるキャッシュの古さではなく、再解決そのものが失敗しているという点が、待つだけでは直らない理由です。
社内プロキシで認証ループに陥る落とし穴
awsAuthRefreshを設定した環境で、ブラウザータブが次々に開いては閉じる無限ループに入ることがあります。これは認証情報の失効とは別の原因で起きる、よく踏まれる落とし穴です。
企業のVPNやTLS検査プロキシがSSOのブラウザーフローを途中で中断させると、Claude Codeはその接続断を認証失敗として扱い、awsAuthRefreshを再実行します。再実行してもまた同じプロキシに中断されるため、終わらないループになります。
この症状に当たった場合の対処は、awsAuthRefreshの設定を一旦外すことです。かわりに、Claude Codeを起動する前に手動でaws sso loginを済ませておく運用に切り替えると、自動リフレッシュに依存せずに済みます。自動化の便利さと引き換えに、ネットワーク環境によっては手動運用の方が結果的に安定します。
「AWS authentication failed」との見分け方
似た文面にAWS authentication failedの原因と対処があります。どちらもawsAuthRefresh設定時のみ、かつv2.1.198以降でしか出ない点は共通ですが、対応するHTTPステータスと原因の確度が違います。
| AWS credentials expired or invalid | AWS authentication failed | |
|---|---|---|
| ステータス | AWS credentials expired or invalid401 | AWS authentication failed403(Bedrockのみ401もあり得る) |
| 原因の確度 | AWS credentials expired or invalidほぼ確実にトークン失効 | AWS authentication failed失効・権限不足のどちらか判別できない |
| 出どころ | AWS credentials expired or invalidClaude Platform on AWS / Mantleエンドポイント | AWS authentication failedAWSプロバイダー全般 / Amazon Bedrock |
本記事で扱う401は「まず間違いなくトークンの失効」と読めるケースです。403、またはBedrockからの401でメッセージが変わる場合は、権限設定そのものを疑う必要が出てきます。AWS以外の認証エラーも含めて症状別に切り分けたい場合は、Claude Codeでよくあるエラー10選も参考になります。
よくある質問
awsAuthRefreshを設定していないのに401が出ました。同じ手順で直せますか
いいえ。awsAuthRefreshが未設定の状態で同じ401が起きると、Claude Codeは一般的なPlease run /loginを表示します。この表示のままではAWSの認証情報を更新できないため、先にawsAuthRefreshを設定ファイルへ追加する必要があります。
Amazon Bedrock API keyだけで使っている場合もこのエラーは出ますか
出にくい構成です。AWS_BEARER_TOKEN_BEDROCKによるAPIキー認証は、AWSのデフォルト認証情報チェーンを経由しません。awsAuthRefreshが前提とするSSOプロファイルやIAMロールの失効シナリオには当てはまらない構成です。
v2.1.198より前のバージョンではどう表示されますか
同じ状況でも自動リフレッシュの仕組み自体が無く、/loginを促すプロンプトで止まります。この/loginはAWSの認証情報を更新する手段にはならないため、awsAuthRefreshを活用したい場合はv2.1.198以降へのアップデートが前提になります。
awsCredentialExportを設定していれば、awsAuthRefreshは不要ですか
用途が違うため、状況によります。awsCredentialExportはセッション開始のたびに認証情報をJSONで返す設定で、.awsディレクトリを直接更新できない環境向けです。awsAuthRefreshを設定せずawsCredentialExportだけを使っている場合、Claude Codeはエクスポートされた認証情報をそのまま使います。AWSのデフォルト認証情報チェーンを起動時に再解決することもありません。この構成でセッション途中に認証情報が失効すると、awsAuthRefreshが無いため自動では復旧できず、セッションを再開する形で新しい認証情報を取得し直すことになります。
メッセージ内のaws sso login --profile myprofileという具体的なコマンドは共通ですか
いいえ。中央のヒント部分は、自分の設定ファイルに書いたawsAuthRefreshの中身がそのまま反映されます。固定されているのは先頭のAWS credentials expired or invalidという文言だけです。
まとめ
AWS credentials expired or invalidは、v2.1.198以降でawsAuthRefreshを設定している環境限定の401エラーです。中央のヒントは設定内容によって変わりますが、直し方は共通しています。別ターミナルでリフレッシュコマンドを実行するか、/loginからClaude Platform on AWS · refresh credentialsを選ぶかのいずれかを試します。それでも直らない場合は、aws sts get-caller-identityで身元そのものの有効性を確認します。社内プロキシでの認証ループに当たった場合は、awsAuthRefreshを外して手動サインインに切り替えるのが確実です。
裏側の仕組みとしては、Claude Codeが認証情報エラーを受けてキャッシュを破棄し、再解決を試みたのに受理される認証情報を得られなかった状態がこのエラーです。単に時間が経てば直るものではなく、リフレッシュコマンド自体が正しく完了しているかを確認する作業が対処の中心になります。
関連する記事
Claude Code をもっと見る →Claude Code(クロードコード)とは — CLI起点のエージェント型開発ツール
AWS authentication failedの原因と対処 — Claude CodeでAWS認証を切り分ける
organization has been disabledエラーの意味と対処 — Claude Code
「Invalid request header value」エラーの原因と対処 — Claude Code
「rejected the session token」エラーの対処 — Claude Codeで再ログインする手順
組織がサブスクリプションアクセスを無効化 — Claude Codeのエラー対処