4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

aws loginのクレデンシャルがcdk deployで読み込まれない問題を解決した話

4
Posted at

はじめに

前回の記事「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.jsonaws-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のバージョンを確認してみてください。

関連記事

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?