概要
2025年末、AWS CLIがアップデートして、loginコマンドを使ってAWSのログインを行うことができるようになった。
https://dev.classmethod.jp/articles/aws-cli-aws-login/
この結果、ブラウザによる認証を経由することでAWS CLI実行時にアクセスキーを設定することなく、コマンドが実行できるようになった。
環境
- MacOS 15.4.1
- AWS CLI Version 2.32.1
- AWS SSOは未使用
- AWSアカウントを個人で払い出ししており、MFAを設定している
- 個人AWSアカウントを使って、別のAWSアカウントへ接続することがある
AWS Loginのメリット
まず何が嬉しいのかを記載する。
- 無期限なアクセスキーが不要になる
- サードパーティのツールが不要になる
手元からAWS CLIを実行するにあたり、最も簡単な方法はIAMユーザーに紐つくアクセスキーを発行してそのアクセスキーを~/.aws/credentialsに記載して、AWS CLIを実行することである。
これがまず不要になる。
また、aws-vaultなどを使って、踏み台などを行っている場合もあるかもしれないが、そういったことも不要になる。
AWS SSOの場合
企業などでAWS SSOなどをすでに使っていればこのような作業は元々不要ではある。
AWS SSOを使っている場合 aws sso login コマンドを使って、SAML認証などで期限付きアクセスキーを払い出すことになる。
GoogleWorkspaceやOkta、EntraIDでSSOを行っている場合などは殆どがこのパターンだと思われる。
個人アカウントの場合
個人アカウントなどでAWS SSO環境を使用していないことが殆どだと思われる。
その場合、どうしてもアクセスキーを使うことになるが、アクセスキーは期限を設定せずに永的に使用できてしまう。
これは本当は望ましくない。
Administrator権限を持つIAMユーザーのアクセスキーなので、なにかの原因で漏洩してしまうと、個人のAWSアカウントが乗っ取られたら勝手にAWSアカウントが使われて気がついたら請求額がX百万円なんてことになりかねない。
そこでaws loginを使うと、デフォルトでは15分しか使えない期限付きのアクセスキーが払い出されてそれを使うことになる。
この結果、万が一なにかしらの理由でPCが乗っ取られても、AWSアカウントへログインする認証情報がわからなければ、AWSへアクセスすることができず被害を防ぐことができる。
- アクセスキーを取得するのに、AWSへログインが必要(IAMのメールアドレスとパスワード)
- MFAの一時トークンが必要
- aws loginを使って上記を取得する必要がある(期限付き)
となり、アクセスキーがもし漏れたとしても、期限までしか使用できない。
AWS Loginの使い方
まず、~/.aws/credentialsは記載が不要となるので、他に使用していなければファイルごと消してしまう。※不安であればまずはコメントアウトでも良い。
$ cat ~/.aws/credentials
cat: /Users/XXXXX/.aws/credentials: No such file or directory
この状態で、下記を実行する
aws login
通常通り、IAMユーザーとMFAでログインすると、~/.aws/configが書き換えられて下記のようになる。
$ cat ~/.aws/config
[default]
output=json
region=ap-northeast-1
login_session = arn:aws:iam::{AWSアカウントID}:user/IAMユーザー名
権限を確認すると下記のようになり、AWS CLIが実行できるようになったことがわかる。
$ aws sts get-caller-identity --no-cli-pager
{
"UserId": "ABCDEFGTZ123ABC4ABCD5",
"Account": "{AWSアカウントID}",
"Arn": "arn:aws:iam::{AWSアカウントID}:user/{IAMユーザー}"
}
これでアクセスができたらIAMユーザーのアクセスキーをコンソールから削除して、~/.aws/credentials にアクセスキーを書いている場合はこちらも削除してしまおう。
踏み台の個人のAWSアカウントから別のAWSアカウントへアクセスする(AWS CLIのみ)
もともとアクセスキーなしにaws-vaultなどサードパーティのツールを使ってログインしていた人もいるかもしれない。
しかし、aws loginを使うことで、aws-vaultなどを使わなくても、セキュアなアクセスキーで余計なコマンドを使わなくても良くなる。
イメージ的には下記のようになる。
アクセス先AWSアカウントの準備
事前にアクセス先のAWSアカウントではAssumeRoleするためのIAMロールを用意しておく。
IAMロール名は適当にexample_AssumeRoleのようなものにする。
信頼関係を下記のようにする。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:{AWSアカウントID}:user/{IAMユーザー名}" # 踏み台AWSアカウントのIAMユーザーのARN
},
"Action": "sts:AssumeRole",
"Condition": { # MFAを有効化しているならいれておく
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
IAMポリシーは付与したい権限とする。Terraformで使うなら必然的にAdministratorAccessにせざるをえないと思われる。そうでないなら適切なポリシーとする。
aws config 記載内容
AWS CLIだけであればPCの ~/.aws/configに下記を記載する
$ cat ~/.aws/config
[default]
output=json
region=ap-northeast-1
### わかりやすい名前を書いておく
[profile exampleB]
region=ap-northeast-1
source_profile=default
mfa_serial=arn:aws:iam::{AWSアカウントID}:mfa/{IAMユーザー名} #踏み台用のIAMユーザーのARN
なお、aws loginを実行すると、logion_sessionという項目が自動的に追記される。
$ cat ~/.aws/config
[default]
output=json
region=ap-northeast-1
login_session = arn:aws:iam::{AWSアカウントID}:user/{IAMユーザー名} <- 自動的に追記されるので書かなくてもOK
この状態で、aws login --profile exampleB を実行する。
そうするとAssumeRoleするIAMロールが表示されるのでそれを選択する。
そうするとexampleBアカウントへAWS CLI使ってアクセスができるようになる。
$ aws sts get-caller-identity --no-cli-pager --profile exampleB
{
"UserId": "ABCDEFG123445:xxxx",
"Account": "{AWSアカウントID}",
"Arn": "arn:aws:sts::{AWSアカウントID}:assumed-role/example_AssumeRole/{IAMユーザー名}"
}
踏み台のAWSアカウントから別のAWSアカウントへアクセスする(Terraform編)
terraformでも下記のようにすることで、踏み台経由でAssumeRoleしてterraformが実行できるようになる。
$ cat ~/.aws/config
[default]
output=json
region=ap-northeast-1
login_session = arn:aws:iam::{AWSアカウントID}:user/{IAMユーザー名}
### exampleB
[profile exampleB]
region=ap-northeast-1
source_profile=default
role_arn=arn:aws:iam::{AWSアカウントID}:role/exampleB_AssumeRole/{IAMユーザー名}
[profile exampleB-terraform] <-- これを追記する
credential_process = aws configure export-credentials --profile exampleB <-- profileは上と同じ名前のexampleBとする
terraformのbackend.tfは下記のように、exampleB-terraformを指定する。
$ cat backend.tf
provider "aws" {
region = "ap-northeast-1"
profile = "exampleB-terraform"
default_tags {
tags = {
Name = "exampleB"
}
}
}
terraform {
required_version = "~> 1.14.0"
backend "s3" {
bucket = "exampleB-terraform"
key = "terraform.tfstate"
region = "ap-northeast-1"
profile = "exampleB-terraform"
}
}
このようにすることで、Terraformを実行する際も踏み台のAWSアカウントに対して、aws loginを行うことでログインができるようになる。

