IAMユーザーもアクセスキー無しでaws-cliやSDKが利用可能に
aws-cliに、IAMユーザーでも永続アクセスキー無しでaws-cliやAWS SDKが使用可能になるaws loginコマンドが搭載されました。OpenID Connectを使用したコンソールの認証/認可を利用してaws-cli自身で一時クレデンシャルを生成できます。aws-cli v2.32.0以降で利用可能です。
使用手順
-
aws login [--profile PROFILE]を実行するプロファイル名 (下記例では
login) は新規のもので大丈夫です。認証後~/.aws/configが自動構成され、このプロファイル名でクレデンシャルアクセスできるようになります。$ aws login --region ap-northeast-1 --profile login Attempting to open your default browser. If the browser does not open, open the following URL: https://ap-northeast-1.signin.aws.amazon.com/v1/authorize?response_type=code&(...略...) -
PCのブラウザが立ち上がりサインイン画面が表示されるので、指示に従い認証を進める
※既に認証済みセッションがある場合は、以下の画面がされアクティブなセッションを選択することもできます。この場合、再認証は不要です。
認証が完了すると、CLI側に以下のメッセージが表示される。
Updated profile login to use arn:aws:iam::012345678901:user/username credentials. Use "--profile login" to use the new credentials, such as "aws sts get-caller-identity --profile login" -
AWSアクセスを試す!
$ aws sts get-caller-identity --profile login --region ap-northeast-1 { "UserId": "AIDAZD4EXAMPLEEXAMPLE", "Account": "012345678901", "Arn": "arn:aws:iam::012345678901:user/username" }無事アクセスできました!
※
aws loginにより~/.aws/configのプロファイルが自動構成されますが、なぜかリージョンが反映されないので今回は手動で追記しました。今後改善されるものと思われます。[profile login] login_session = arn:aws:iam::012345678901:user/username + region = ap-northeast-1 -
ログアウトする
作業が終了すれば、ログアウトしてセッションをクローズしましょう。
aws logout [--profile PROFILE]でログアウトできます。$ aws logout --profile login Removed cached login credentials for profile 'login'. 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 logout --allですべてログアウトできます。
WSLからログインする
開発作業にWSLを利用されている方は多いでしょう。aws loginは、Python標準ライブラリの webbrowerモジュールを使用してブラウザを制御していますが、webbrowserモジュールは本稿執筆時点でWSLをサポートしていません。幸い回避策があります。環境変数 BROWSER にWindowsホスト側のブラウザのパスを指定することで、WSLからでもWindows起動ラウザを起動してaws loginでログイン可能になります。※wslviewを使うことも可能らしいですが、筆者は利用していないので未確認です。
お使いのブラウザに応じて以下のような設定をすれば、あとはaws loginを実行するだけです。
# Chromeの場合
export BROWSER='/mnt/c/Program Files/Google/Chrome/Application/chrome.exe'
# Edgeの場合
export BROWSER='/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe'
# Firefoxの場合
export BROWSER='/mnt/c/Program Files/Mozilla Firefox/firefox.exe'
リモートマシンからログインする
sshで接続した、ブラウザが全く利用できないリモートマシンの場合は、aws login --remote オプションでログイン可能です。
-
aws login --remoteを実行する$ aws login --remote --profile login --region ap-northeast-1 Browser will not be automatically opened. Please visit the following URL: https://ap-northeast-1.signin.aws.amazon.com/v1/authorize?response_type=code&(...略...) Enter the authorization code displayed in your browser:※このあと対話的に操作するのでコマンドは終了せずに保持しておいてください。
-
メッセージの指示に従い、コマンドが出力したURLをコピーしてローカルPCのWebブラウザで開き、認証画面にアクセスする
※画面は冒頭の例と同一なので省略
-
認証後、ブラウザに検証コードが表示されるので、「検証コードをコピー」を選択してクリップボードにコピーする
-
リモートマシン側のコマンドに戻り、コピーした検証コードを貼り付ける
Enter the authorization code displayed in your browser: <ここに検証コード貼り付け...> Updated profile login to use arn:aws:iam::012345678901:user/username credentials. Use "--profile login" to use the new credentials, such as "aws sts get-caller-identity --profile login"以上で完了です。
-
AWSアクセスを試す!
$ aws sts get-caller-identity --profile login { "UserId": "AIDAZD4EXAMPLEEXAMPLE", "Account": "012345678901", "Arn": "arn:aws:iam::012345678901:user/username" }無事アクセスできました。
古いSDKからaws loginの一時クレデンシャルを使用する
aws loginによる一時クレデンシャル (以下「loginクレデンシャル」) は~/.aws/login/cache/ 配下にキャッシュされます。AWS SDKでこのクレデンシャルを利用するには、loginクレデンシャルに対応した最新のSDKが必要になります。残念ながら古いSDKはloginクレデンシャルを認識できません。しかし、プロセス・クレデンシャル・プロバイダー (credential_process) を使用することで、loginクレデンシャルを古いSDKで利用することができます。
aws login実行後に、~/.aws/config に下記例の[profile process]の設定を追加します。プロファイル名は任意です ([profile login]のlogin_sessionはaws loginによって自動作成されたものです)。
[profile login]
login_session = arn:aws:iam::012345678901:user/username
region = ap-northeast-1
[profile process]
credential_process = aws configure export-credentials --profile login --format process
region = ap-northeast-1
この設定は、aws-cli自身をクレデンシャル・プロバイダーとして使用し、loginクレデンシャルをソースとしてプロセスクレデンシャル (例ではprocessプロファイル) を出力します。loginクレデンシャルを認識できない古いSDKでもprocessプロファイルを通じてクレデンシャルをにアクセスできるようになります。
以下は、boto3 v1.40.76を利用した例です。boto3はv1.41.0からaws loginクレデンシャルに対応しています。
まずは、loginクレデンシャルでアクセスできないことの確認です。
$ grep boto pyproject.toml
"boto3==1.40.76"
$ AWS_PROFILE=login python3 -c 'import boto3; print(boto3.client("sts").get_caller_identity())'
Traceback (most recent call last):
File "<string>", line 1, in <module>
import boto3; print(boto3.client("sts").get_caller_identity())
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
(...略...)
raise NoCredentialsError()
botocore.exceptions.NoCredentialsError: Unable to locate credentials
クレデンシャルが見つからず失敗しました。
続いて、processプロファイルを経由してloginクレデンシャルにアクセスできることを確認します。
$ AWS_PROFILE=process python3 -c 'import boto3; print(boto3.client("sts").get_caller_identity())'
{'UserId': 'AIDAZD4EXAMPLEEXAMPLE', 'Account': '012345678901', 'Arn': 'arn:aws:iam::012345678901:user/username', (...略...)}
アクセスできました。
以下は比較サンプルとして、loginクレデンシャルに対応したboto3 v1.41.0を使って、直接loginクレデンシャルを使用する例です。
$ grep boto pyproject.toml
"boto3>=1.41.0",
"botocore[crt]>=1.41.0",
$ AWS_PROFILE=login python3 -c 'import boto3; print(boto3.client("sts").get_caller_identity())'
{'UserId': 'AIDAZD4EXAMPLEEXAMPLE', 'Account': '012345678901', 'Arn': 'arn:aws:iam::012345678901:user/username', (...略...)}
※boto3 v1.41.0でloginクレデンシャルを使用するには、botocore[crt] パッケージも必要になります。
さいごに
aws-cliの新機能 aws login により、IAMユーザーがアクセスキー無しでaws-cliやSDKを使用できることを確認しました。
IAMユーザーの永続アクセスキーはセキュリティリスクが高いので、AWSはその使用を公式に非推奨としています。aws login により、アクセスキーを使う理由がまた一つ減りました。AWSが本気でアクセスキーを無くそうとしていることがうかがえます。現在アクセスキーを有効化している方は、aws loginで代替できないか、ぜひご検討ください。



