はじめに
前回の記事「aws loginのクレデンシャルが15分で切れる問題を解決した話」では、Python(boto3)側でクレデンシャルの自動リフレッシュが失敗する問題について書きました。
今回は、aws loginで認証しているのにcdk deployで「Unable to resolve AWS account to use」エラーが出る問題について、原因と解決方法を共有します。
aws loginとは?
aws loginはAWS CLI 2.15.0以降で追加されたコマンドで、AWS Management Consoleの認証情報を使ってプログラムからAWSにアクセスするための短期クレデンシャルを取得できます。
aws login
取得したクレデンシャルは~/.aws/login/cache/にキャッシュされ、各AWS SDKが自動的に読み込んで使用します。有効期限は15分ですが、SDKがリフレッシュトークンを使って自動更新してくれます(最大12時間)。
発生した問題
症状
aws loginで認証した後、cdk deployを実行すると以下のエラーが発生しました。
$ cdk deploy
✨ Synthesis time: 6.83s
Unable to resolve AWS account to use. It must be either configured when you define your CDK Stack, or through the environment
CDKのスタック定義では、一般的な方法で環境を指定していました。
const app = new cdk.App()
new MyStack(app, 'MyStack', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION
},
})
不思議な挙動
ところが、aws sts get-caller-identityを先に実行すると、その後のcdk deployは成功しました。
# これは成功する
$ aws sts get-caller-identity
{
"UserId": "AROAXXXXXXXXXXXXXXXXX:user@example.com",
"Account": "123456789012",
"Arn": "arn:aws:sts::123456789012:assumed-role/MyRole/user@example.com"
}
# 直後のcdk deployは成功する
$ cdk deploy
✨ Synthesis time: 6.83s
# デプロイ開始...
AWS CLIは認証できている
aws configure listで確認すると、AWS CLIはloginタイプのクレデンシャルを正しく認識していました。
$ aws configure list
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************XXXX login
secret_key ****************YYYY login
region ap-northeast-1 config-file ~/.aws/config
原因の調査
aws loginのクレデンシャルプロバイダー
AWS SDKには「クレデンシャルプロバイダーチェーン」という仕組みがあり、複数のソースから順番にクレデンシャルを探します。aws loginのクレデンシャルは、credential-provider-loginというプロバイダーが~/.aws/login/cache/から読み込みます。
AWS公式ドキュメントによると、SDK for JavaScript 3.xはこのプロバイダーに対応しています。
CDK CLIのバンドルされたSDK
CDK CLIは内部にAWS SDK for JavaScript v3をバンドルしています。ここで問題だったのは、使用していたCDK CLIのバージョン(2.1031.0)にバンドルされたSDKにcredential-provider-loginが含まれていなかったことです。
# CDK 2.1031.0 → 含まれていない
$ grep -r "fromLoginCredentials\|credential-provider-login\|login/cache" node_modules/aws-cdk/ --include="*.js" -l
(結果なし)
@aws-sdk/credential-provider-loginパッケージは2026年1月27日にリリースされた比較的新しいパッケージです。CDK CLI 2.1031.0のリリース時点ではまだ存在していなかったため、バンドルに含まれていませんでした。
なぜaws sts get-caller-identityの後は成功したのか
aws sts get-caller-identityはPython(boto3)経由で実行されます。boto3側はcredential-provider-loginに対応しているため、このコマンド実行時にクレデンシャルのリフレッシュが行われ、キャッシュファイルが更新されます。
更新されたキャッシュの内容が、CDKのSDKでも読める形式になっていたため、直後のcdk deployが成功していたと考えられます。
解決方法
CDK CLIを最新版にアップグレード
# プロジェクトのdevDependenciesを更新
npm install aws-cdk@latest --save-dev
最新版のCDK CLIにはcredential-provider-loginが含まれています。
# 最新版 → 含まれている
$ grep -r "fromLoginCredentials\|credential-provider-login\|login/cache" node_modules/aws-cdk/ --include="*.js" -l
node_modules/aws-cdk/lib/index.js
これにより、aws sts get-caller-identityを挟まなくてもcdk deployが直接成功するようになりました。
補足:グローバルインストールだけでは不十分
npm install -g aws-cdk@latestでグローバルにインストールしても、プロジェクトのpackage.jsonにaws-cdkが指定されている場合はnode_modules内のバージョンが優先されます。必ずプロジェクト内のパッケージも更新してください。
まとめ
| 項目 | 内容 |
|---|---|
| 問題 |
aws loginで認証後、cdk deployで「Unable to resolve AWS account」エラー |
| 原因 | CDK CLIにバンドルされたSDKにcredential-provider-loginが含まれていなかった |
| 解決 |
npm install aws-cdk@latest --save-devでCDK CLIを最新版に更新 |
| ポイント |
@aws-sdk/credential-provider-loginは2026年1月リリースの新しいパッケージ |
aws loginは便利なコマンドですが、まだ新しい機能のため、ツール側の対応が追いついていないケースがあります。CDKに限らず、aws loginで認証エラーが出る場合は、ツールが使っているSDKのバージョンを確認してみてください。