AWS CLI 使用時にaws loginを自動実行する

AWS CLI 使用時にaws loginを自動実行する

セキュリティは高めたいけど手間は増やしたくない。
2025.12.08

こんにちは、なおにしです。

aws loginコマンドを使用してAWS CLIを使用する際、どうすればより快適に操作可能になるか検討する機会がありましたのでご紹介します。

はじめに

2025年11月19日に、aws loginコマンドがリリースされました。

https://dev.classmethod.jp/articles/aws-cli-aws-login/

https://docs.aws.amazon.com/ja_jp/cli/latest/reference/login/index.html

aws loginコマンドを利用する主なメリットは、非 IAM Identity Center 環境でもIAMユーザーで発行する長期利用可能なアクセスキーとシークレットアクセスキー(長いので以降の記述では適宜クレデンシャルと表記します)を使用せずにAWS CLIを利用できるようになることです。

昨今ではローカル端末に平文で保存されたクレデンシャルが、悪意のあるプログラムによって意図せず利用・公開されるケースも増えてきており、直近ではその対策として弊社からも以下のような記事が公開されています。

https://dev.classmethod.jp/articles/1password-cli-credential/

1Password を利用できる環境であれば、上記の記事に記載のとおりAWS CLIのコマンドawsを1Passwordのop plugin run -- awsのエイリアスにすることによって、クレデンシャルの読み込みを1Password経由にすることが可能です。

op plugin run -- awsを実行する時に1Passwordによる認証処理が実行され、そのタイミングは1Passwordへのクレデンシャル情報追加時に以下のとおり選択可能です。

? Configure when the chosen credential(s) will be used to authenticate:  [Use arrows to move, type to filter, ? for more help]
> Prompt me for each new terminal session
  Use automatically when in this directory or subdirectories
  Use as global default on my system

(和訳)
? 選択した認証情報で認証を使用するタイミングを設定します: [矢印キーで移動、入力で絞り込み、? で詳細ヘルプを表示]
> 新しいターミナルセッションごとに確認する
このディレクトリまたはサブディレクトリにいる場合は自動的に使用する
システム全体のデフォルトとして使用する

セキュリティを鑑みるとPrompt me for each new terminal session(新しいターミナルセッションごとに確認する)を選択することになるかと思いますが、この場合、新規セッションを開く度に認証(Mac であればTouch ID等)することになります。

一方、awsコマンドをエイリアス化する処理については、シェル設定ファイル(rcファイル。.zshrc等)を用いて新規セッションが開かれる度に設定しています。

以上より、1Passwordによる認証とエイリアス設定が適用済みの同一セッション内でAWS CLI を実行する場合は、ローカル端末に平文でクレデンシャルを保存している時と同じようにストレス無く操作可能です。

困ったこと

awsコマンドがop plugin run -- awsのエイリアスである必要があるので、記事にも記載のsource /Users/<Username>/.config/op/plugins.shがセッション開始時に実行されている必要があります。

.zshrcに上記を記載した場合、例えばAWS CLI をシェルスクリプト内に記載して実行するケースでは、シェル設定ファイルが読み込まれないため、クレデンシャル未定義としてエラーが出力されます。

上記のようなケースであれば、例えばzsh であれば.zshrcではなく.zshenvに同様のsourceコマンドを追記した上で、シェルスクリプト実行時に以下のように対応すればawsコマンドがop plugin run -- awsのエイリアスになった状態になります。

  • 明示的にzsh コマンドでスクリプトを呼び出す

    •   $ zsh ./test-script.sh
      
  • スクリプト内にシバン(shebang)を記載しておく

    •   $ head -1 ./test-script.sh
        #!/bin/zsh
      

問題はシェルスクリプト以外でAWS CLI が実行される(= プロファイルが読み込まれる)というケースです。

例として、以下の記事のように私もAWSの利用料金をざっくり試算する際は、AWS Pricing Calculator ではなくAWS Pricing MCP Server を Claude Desktop から実行することがあります。

https://dev.classmethod.jp/articles/model-context-protocol-server-price-list/

上記の記事に言及がありますが、Pricing MCP Server は実行の際にIAMの権限が必要なので、当該権限をもった AWS Profile をローカル端末で設定しておく必要があります。

従来どおり.aws/configファイルにプロファイルを指定して.aws/credentialsファイルに対応するクレデンシャル情報を記載しているのであれば問題ありませんが、Claude Desktop からの Pricing MCP Server 呼び出しでzsh を経由するわけではないので、.zshenvからエイリアス設定をするように指定していてもそのまま雑なプロンプトを実行すると以下のようにエラーが発生します。

20251208_naonishi_aws-cli-auto-login-with-aws-login-command_1.png

解決方法としては、記事内の末尾にある【追記】1Passwordのプロファイルをターミナル内で切り替えるに記載の内容を利用することです。

以下のように設定してしまえば、シェル設定ファイルでawsコマンドのエイリアスを設定する必要も無くなり、Claude Desktop でも必要な時に認証を促されるようになります。

$ cat ~/.aws/config                                               
[default]
region = ap-northeast-1
output = json
credential_process = sh -c 'echo "{\"Version\": 1, \"AccessKeyId\": \"$(op read "op://<Vault-Name>/<Item-Name>/access key id")\", \"SecretAccessKey\": \"$(op read "op://<Vault-Name>/<Item-Name>/secret access key")\"}"'

aws login の場合

標題に反して 1Password での設定ばかりを書いてしまいましたが、aws loginコマンドでも同様のことができないか検討してみます。

まず、改めて1Password とaws loginコマンドによるクレデンシャル管理の違いをまとめると以下のとおりです。

比較項目 aws login 1Password
.aws/credentialsファイルの排除 可能 可能
長期有効なアクセスキー/シークレットアクセスキーの発行 不要 必要
クレデンシャルの保管方式 一時的なクレデンシャルがキャッシュファイルとして平文保存される opコマンドを使うことで平文保管を排除できる
料金 無料 有料

こうやって見るとそれぞれ一長一短あるので、一概にどちらが良いとは言えないのではないかなと思います。

aws loginコマンドの一時的なクレデンシャルについて深掘りすると、具体的には以下のようにデフォルトでは.aws/login/cache/フォルダに json ファイルとして格納されます。

$ cat ~/.aws/login/cache/aaa08bc690cba3f7c8567fc65498eb0c45e3613a2d85b07b8f7af75b7476110d.json | jq
{
  "accessToken": {
    "accessKeyId": "ASIADRUVSTL4J6CP7FKM",
    "secretAccessKey": "YLZF2lIOt+E18cs81a4T8oDB/ogSSTsktR2MtW1J",
    "sessionToken": "IQoJb3JpZ2luX2VjEJL/////////(略)==",
    "accountId": "123456789012",
    "expiresAt": "2025-12-05T10:51:31Z"
  },
  "tokenType": "urn:aws:params:oauth:token-type:access_token_sigv4",
  "clientId": "arn:aws:signin:::devtools/same-device",
  "refreshToken": "eyJ6aXAiOiJ(略)RXAOXskNPfA",
  "idToken": "eyJraWQiOiJ(略)8RkdmWMb",
  "dpopKey": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEE(略)l5GrXRC5ig==\n-----END EC PRIVATE KEY-----\n"
}

「一時的」とはどのくらいなのかというと、ドキュメントには以下のとおり記載されています。

The AWS CLI and SDKs will automatically refresh the cached credentials every 15 minutes as needed. The overall session will be valid for up to the set session duration of the IAM principal (maximum of 12 hours), after which you must run aws login again.

(和訳)
AWS CLI と SDK は、必要に応じて 15 分ごとにキャッシュされた認証情報を自動的に更新します。セッション全体は、IAM プリンシパルに設定されたセッション期間(最大 12 時間)まで有効です。セッション期間が過ぎると、aws login を再度実行する必要があります。

したがって、クレデンシャル情報がキャッシュファイルに平文保存されているとはいえ15分間隔で更新されているので、悪意のあるプログラムによってよほど即座に悪用されない限りは、例え公開されたとしても意味を為しません(15分というリフレッシュ間隔を許容できるかどうかだと思います)。

IAMプリンシパルに設定されたセッション期間については、以下のドキュメントをご参照ください。

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-settings.html

つまり、マネジメントコンソールにIAMユーザーでログインしているセッションを使うのであればデフォルト: 12時間、IAMロールでログインしているセッションを使うのであればデフォルト: 1時間(設定すれば最大12時間)、一度ログインした後は自動的に一時的なクレデンシャルを更新し続けます。

一時的なクレデンシャルの更新を止めるにはaws logout コマンドを使用します。

公式ブログでは触れられていませんでしたが、aws loginコマンドのリリースと併せてaws logoutコマンドもリリースされており、ドキュメントにも記載があります。

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sign-in.html

https://docs.aws.amazon.com/ja_jp/cli/latest/reference/logout/index.html

実際にaws logoutコマンドを実行した結果は以下のとおりです。

$ aws logout                 
Removed cached login credentials for profile 'default'. Note, any local developer tools that have already loaded the access token may continue to use it until its expiration. Access tokens expire in 15 minutes.

ログアウトしても何らかの開発ツールが既にクレデンシャル情報を読み込んでいたのであれば、それは最大で15分間有効ですよという注意書きが出力されています。なお、.aws/login/cache/フォルダの json ファイルはaws logoutコマンド実行時に削除されます。

それでは実際に、aws loginコマンドでも.aws/configファイルを工夫することで、1Password と同様にAWS CLI 使用時に認証されるようにできるかやってみます。

先に結論

.aws/credentialsファイルを削除した上で、以下のとおり設定します。

プロファイルの切り替えはブラウザ操作によるセッションの選択で問題ない場合

  • .aws/configファイルに以下のように設定する

    •   $ cat ~/.aws/config
        [default]
        credential_process = sh -c 'aws configure export-credentials --profile signin 2>/dev/null || (aws login --profile signin >/dev/null 2>&1 && aws configure export-credentials --profile signin)'
        region = ap-northeast-1
      
        [profile signin]
        region = ap-northeast-1
      
  • 対象セッションでの操作が終わったら以下のコマンドでログアウトする

    •   $ aws logout --profile signin
      

プロファイルの切り替えはローカルで指定したい場合

  • .aws/configファイルに以下のように設定する

    •   $ cat ~/.aws/config
        [profile foo]
        credential_process = sh -c 'aws configure export-credentials --profile foo-signin 2>/dev/null || (aws login --profile foo-signin >/dev/null 2>&1 && aws configure export-credentials --profile foo-signin)'
        region = ap-northeast-1
      
        [profile bar]
        credential_process = sh -c 'aws configure export-credentials --profile bar-signin 2>/dev/null || (aws login --profile bar-signin >/dev/null 2>&1 && aws configure export-credentials --profile bar-signin)'
        region = ap-northeast-1
      
        [profile foo-signin]
        region = ap-northeast-1
      
        [profile bar-signin]
        region = ap-northeast-1
      
  • 特定のセッションを切り替えたい場合はプロファイルを指定してログアウトする

    •   $ aws logout --profile bar-signin
      
  • 全セッションでの操作が終わったら以下のコマンドで一括ログアウト可能

    •   $ aws logout --all
      

やってみた

結論に記載したコマンドが微妙に複雑になったのはaws loginaws logoutコマンドの挙動に理由があります。

以下のようなシンプルな.aws/config ファイルで確認します。

$ cat ~/.aws/config     
[default]
region = ap-northeast-1

この状態でAWS CLI コマンドを実行しようとすると、.aws/credentialsファイルが無いのでaws loginコマンドの実行を促されます。

$ aws s3 ls 

Unable to locate credentials. You can configure credentials by running "aws login".

そこでaws loginコマンドを実行して認証すると、以下のようにlogin_sessionの記述が追加されます。

$ cat ~/.aws/config
[default]
region = ap-northeast-1

login_session = arn:aws:sts::123456789012:assumed-role/naonishi/naonishi

その後、aws logoutコマンドを実行すると.aws/login/cache/フォルダの json ファイルは削除されますが、login_sessionの記述は削除されません。

このため、aws logoutコマンド実行後に改めてAWS CLI コマンドを実行すると以下のようにエラーメッセージが変わります。

$ aws s3 ls 

Error loading login session token: Unable to load a existing login session for session arn:aws:sts::123456789012:assumed-role/naonishi/naonishi, Please reauthenticate with 'aws login'.

この挙動を踏まえ、まずは以下のように単純にcredential_processaws loginコマンドを指定してみます。

$ cat ~/.aws/config
[default]
credential_process = aws login
region = ap-northeast-1

上記の設定でAWS CLI コマンドを実行すると、以下のように一度コマンドが終わってしまい、再度実行すれば正常に結果が出力されるという状態になります。

$ aws s3 ls 
(ブラウザでセッションを選択すると以下が出力される)
Expecting value: line 1 column 1 (char 0)

$ aws s3 ls
2024-11-09 09:25:14 123456789012-hoge
2025-10-09 20:04:05 123456789012-fuga
・
・

コマンドの再実行が許容できるのであればこのままでも良いですが、シェルスクリプト内での実行等を想定すると、可能であれば認証が間に入ったとしても一度のAWS CLI コマンド実行で結果が取得できるようにしたいところです。

一方、もう一つの問題として、この状態でaws logoutコマンドを実行し、再度AWS CLI コマンドを実行すると以下のようにcredential_processではなく残存しているlogin_sessionの記述が先に読み込まれ、aws loginコマンドによる認証が実行されなくなってしまいます。

$ aws logout                 
Removed cached login credentials for profile 'default'. Note, any local developer tools that have already loaded the access token may continue to use it until its expiration. Access tokens expire in 15 minutes.
$ aws s3 ls 

Error loading login session token: Unable to load a existing login session for session arn:aws:sts::123456789012:assumed-role/naonishi/naonishi, Please reauthenticate with 'aws login'.

そこで、aws configure export-credentialsコマンドを組み合わせます。

https://docs.aws.amazon.com/cli/latest/reference/configure/export-credentials.html

この方法はドキュメントSharing Login credentials as process credentialsの部分にも類似の内容が記載されています。

以下のようにプロファイルを分割し、aws configure export-credentialsコマンドでクレデンシャルが取得できなければaws loginコマンドを実行して、再度aws configure export-credentialsコマンドを実行するという処理にします。

$ cat ~/.aws/config
[default]
credential_process = sh -c 'aws configure export-credentials --profile signin 2>/dev/null || (aws login --profile signin >/dev/null 2>&1 && aws configure export-credentials --profile signin)'
region = ap-northeast-1

[profile signin]
region = ap-northeast-1

こうすることで、期待どおり認証を挟んでも AWS CLI コマンドが一度終了することなく結果を返してくれるようになりました。

認証後は以下のとおりsigninの方のプロファイルにlogin_sessionの記述が追加されます。

$ cat ~/.aws/config
[default]
credential_process = sh -c 'aws configure export-credentials --profile signin 2>/dev/null || (aws login --profile signin >/dev/null 2>&1 && aws configure export-credentials --profile signin)'
region = ap-northeast-1

[profile signin]
region = ap-northeast-1
login_session = arn:aws:sts::123456789012:assumed-role/naonishi/naonishi

このため、aws logoutコマンド実行後はaws configure export-credentialsコマンドが失敗するようになるため、未認証の時と同じようにaws loginコマンドが実行されるようになります。

まとめ

AWS CLI コマンドを実行する前にaws loginコマンドを実行するという文化が根付いていないため、従来どおりAWS CLI コマンドをそのまま実行した時に自動でaws loginコマンドが実行されて認証できる方法を模索してみました。

本記事がどなたかのお役に立てれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事