IAM Identity Center(旧 AWS SSO)で AWS CLI を使うには、~/.aws/config に [sso-session 名前] のセクションと、それを参照する [profile 名前] を書き、aws sso login でサインインします。 サインインで得たトークンは ~/.aws/sso/cache に保存され、CLI や SDK はそのトークンでロールの一時認証情報を受け取ります。アクセスキーをファイルに置く必要がなくなります。

[sso-session my-sso]
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_region = us-east-1
sso_registration_scopes = sso:account:access

[profile dev]
sso_session = my-sso
sso_account_id = 111111111111
sso_role_name = ReadOnly
region = ap-northeast-1
aws sso login --profile dev        # ブラウザでサインイン(1つの sso-session に1回)
aws s3 ls --profile dev            # 以降はそのまま使える
やりたいこと コマンド・設定
対話で設定を作る aws configure sso(CLI v2)
sso-session だけ作る aws configure sso-session(CLI v2)
サインイン aws sso login --profile dev または aws sso login --sso-session my-sso
ブラウザが無い端末から aws sso login --use-device-code --no-browser
サインアウト(キャッシュ削除) aws sso logout
今の認証を確かめる aws sts get-caller-identity --profile dev

確認環境:AWS CLI 1.46.1・boto3 1.43.111(botocore 1.43.111)・Python 3.11(Linux)。AWS には接続せず、IAM Identity Center の OIDC(RegisterClient・StartDeviceAuthorization・CreateToken)とポータル(GetRoleCredentials・ListAccounts・ListAccountRoles)と同じ形の応答を返すサーバーを手元に用意し、デバイスコードの流れでトークンを取り、~/.aws/sso/cache に保存したトークンを CLI v1・boto3 が読む動き、期限前の自動更新、期限切れのエラー、source_profile でのロールの引き受け(STS は moto 5.2.4 のサーバーモード)を確かめました。aws configure sso の対話と aws sso login の表示は CLI v2 の機能のため、AWS CLI ユーザーガイドと aws-cli(v2 ブランチ)のソースに基づいています。エラー文は botocore・aws-cli・AWS SDK for Java 2.x のソースの原文です(確認日 2026年10月13日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「aws sso login設定|Identity Centerプロファイルの書き方」

仕組み:トークンとロールの認証情報の2段構え

aws sso login
  ① OIDC:RegisterClient(CLI をクライアント登録)
  ② ブラウザでサインイン(PKCE か デバイスコード)
  ③ OIDC:CreateToken → アクセストークン(+リフレッシュトークン)
        └─ ~/.aws/sso/cache/<sha1>.json に保存
aws s3 ls --profile dev
  ④ ポータル:GetRoleCredentials(アカウントID・ロール名・トークン)
        └─ 一時認証情報(ASIA...)で S3 を呼ぶ
段 何の期限か 長さ(ドキュメント)
③ アクセスポータルのセッション aws sso login をやり直すまで 既定 8 時間。15 分〜90 日で変えられる
④ ロールの一時認証情報 許可セットのセッション期間 既定 1 時間。最大 12 時間

手元の擬似サーバーに届いた呼び出しは次の順でした。CreateToken の1回目は、ブラウザでの承認前を表す AuthorizationPendingException を返し、2回目でトークンが出ています。

POST /client/register {"clientName": "botocore-client-my-sso", "clientType": "public", "scopes": ["sso:account:access"]}
POST /device_authorization {"clientId": "cid-123", "clientSecret": "csecret", "startUrl": "https://my-sso-portal.awsapps.com/start"}
POST /token {"grantType": "urn:ietf:params:oauth:grant-type:device_code", "deviceCode": "dev-code-1", ...}   ← 承認待ち
POST /token {"grantType": "urn:ietf:params:oauth:grant-type:device_code", "deviceCode": "dev-code-1", ...}   ← トークン発行
GET  /federation/credentials?role_name=ReadOnly&account_id=111111111111   ← aws コマンドの実行時

一時認証情報とロールの関係は、関連記事「AWS STSの使い方 一時認証情報とassume-roleの違い早見表」で扱っています。

aws configure sso の対話

AWS CLI v2 の aws configure sso は、次の順に聞いてきます(ユーザーガイドの例)。

$ aws configure sso
SSO session name (Recommended): my-sso
SSO start URL [None]: https://my-sso-portal.awsapps.com/start
SSO region [None]: us-east-1
SSO registration scopes [None]: sso:account:access
(ここでブラウザが開き、サインインと許可)
There are 2 AWS accounts available to you.
> DeveloperAccount, developer-account-admin@example.com (123456789011)
  ProductionAccount, production-account-admin@example.com (123456789022)
Using the account ID 123456789011
There are 2 roles available to you.
> ReadOnly
  FullAccess
Default client Region [None]: us-west-2
CLI default output format (json if not specified) [None]: json
Profile name [123456789011_ReadOnly]: my-dev-profile
聞かれる項目 入れるもの 書き込まれる場所
SSO session name 任意の名前(例 my-sso)。空にすると旧形式になる [sso-session my-sso]
SSO start URL アクセスポータルの URL(https://xxxx.awsapps.com/start) sso_start_url
SSO region Identity Center を有効にしたリージョン。普段使うリージョンとは別 sso_region
SSO registration scopes sso:account:access sso_registration_scopes
アカウント・ロール 一覧から選ぶ。1つだけなら自動で選ばれる sso_account_id・sso_role_name
Default client Region ふだん使うリージョン region
Profile name プロファイル名。既定は「アカウントID_ロール名」 [profile ...]

SSO region には、ポータルのあるリージョンを入れます。たとえば Identity Center を東京で有効にしたなら ap-northeast-1 です。違うリージョンを入れると、サインインの段階でつながりません。

~/.aws/config の2つの形式

sso-session 形式(推奨)

[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 123456789011
sso_role_name = readOnly
region = us-west-2
output = json

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access

旧形式(レガシー)

[profile my-dev-profile]
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_region = us-east-1
sso_account_id = 123456789011
sso_role_name = readOnly
region = us-west-2
output = json
比べる点 sso-session 形式 旧形式
トークンの自動更新 あり(リフレッシュトークン) なし。8 時間で切れたら aws sso login をやり直す
複数プロファイルでのサインイン sso-session ごとに1回 start URL ごとに1回
キャッシュのファイル名 sha1(セッション名).json sha1(sso_start_url).json
aws sso login --sso-session 使える 使えない
対応(ドキュメント) CLI v2 2.9 以降・CLI v1 1.27.10 以降・boto3 1.26.10 以降・Java SDK 2.18.13 以降 ほぼすべての SDK

sso_registration_scopes に sso:account:access が無いと、リフレッシュトークンが返されないとドキュメントにあります。sso-session 形式にするなら、この行を入れておきます。

設定ファイルの全体と、プロファイルを切り替える優先順位は、関連記事「AWS CLI設定|aws configureとprofile切り替え・優先順位」で扱っています。

複数アカウント・複数ロールの雛形

sso-session を1つ書き、プロファイルを「アカウント × ロール」の数だけ並べます。サインインは sso-session に1回で、全プロファイルで使えます。

[sso-session corp]
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access

[default]
sso_session = corp
sso_account_id = 111111111111
sso_role_name = ReadOnly
region = ap-northeast-1

[profile dev]
sso_session = corp
sso_account_id = 111111111111
sso_role_name = PowerUserAccess
region = ap-northeast-1

[profile stg]
sso_session = corp
sso_account_id = 333333333333
sso_role_name = PowerUserAccess
region = ap-northeast-1

[profile prod-readonly]
sso_session = corp
sso_account_id = 222222222222
sso_role_name = ReadOnlyAccess
region = ap-northeast-1

[profile prod-admin]
sso_session = corp
sso_account_id = 222222222222
sso_role_name = AdministratorAccess
region = ap-northeast-1

# SSO のロールから、さらに別のロールを引き受ける
[profile prod-deploy]
source_profile = dev
role_arn = arn:aws:iam::222222222222:role/DeployRole
region = ap-northeast-1

sso_role_name は許可セットの名前です。ロールの ARN(AWSReservedSSO_...)ではありません。

手元で dev(111111111111・ReadOnly)と prod(222222222222・AdministratorAccess)の2つのプロファイルを boto3 で読むと、1つのトークンで、それぞれのアカウント・ロールの認証情報が取られました。

dev sso ASIAFAKE1111
prod sso ASIAFAKE2222

source_profile に SSO のプロファイルを指定した prod-deploy も、CLI v1 で AssumeRole まで進みました(STS は moto)。

$ aws sts get-caller-identity --profile prod-deploy --query Arn --output text
arn:aws:sts::222222222222:assumed-role/DeployRole/botocore-session-1791825808

使えるアカウントとロールを一覧する

ログインした後なら、自分に割り当てられたアカウントとロールを CLI で見られます。--access-token には、キャッシュの accessToken を渡します。

TOKEN=$(jq -r .accessToken ~/.aws/sso/cache/$(printf %s my-sso | sha1sum | cut -c1-40).json)
aws sso list-accounts --access-token "$TOKEN" --region us-east-1 --output table
aws sso list-account-roles --access-token "$TOKEN" --account-id 111111111111 \
  --region us-east-1 --query 'roleList[].roleName'
||  111111111111|  dev          |  dev@example.com   ||
||  222222222222|  prod         |  prod@example.com  ||
[
    "ReadOnly",
    "AdministratorAccess"
]

この結果から、プロファイルを並べる雛形を作れます。

トークンのキャッシュと期限

ファイル 中身
~/.aws/sso/cache/<sha1(セッション名)>.json sso-session 形式のトークン
~/.aws/sso/cache/<sha1(start URL)>.json 旧形式のトークン

botocore のソースでは、キャッシュのキーは「sso-session 名(無ければ start URL)の SHA-1」です。my-sso なら次のファイル名になりました。

0ad374308c5a4e22f723adf10145eafad7c4031c.json
{
  "startUrl": "https://my-sso-portal.awsapps.com/start",
  "region": "us-east-1",
  "accessToken": "at-1",
  "expiresAt": "2026-10-13T01:21:22Z",
  "clientId": "cid-123",
  "clientSecret": "csecret",
  "registrationExpiresAt": "2027-01-10T17:21:21Z",
  "refreshToken": "rt-1"
}
項目 意味
accessToken・expiresAt ポータルを呼ぶトークンと、その期限(UTC)
refreshToken 期限が近いときに新しいトークンをもらうためのもの(sso-session 形式)
clientId・clientSecret・registrationExpiresAt CLI をクライアントとして登録した情報と、その期限

自動更新は、残りが 15 分を切ったときに行われます。 botocore の SSOTokenProvider は、残りが 15 分(_REFRESH_WINDOW = 15 * 60)より短いと、refreshToken で CreateToken を呼び、キャッシュを書き換えます。手元で expiresAt を 10 分後にして aws sts get-caller-identity を動かすと、次の呼び出しが出て、キャッシュの accessToken が at-1 から at-2 に変わりました。

POST /token {"grantType": "refresh_token", "clientId": "cid-123", "clientSecret": "csecret", "refreshToken": "rt-1"}
GET  /federation/credentials?role_name=AdministratorAccess&account_id=222222222222 token=at-2

更新は、アクセスポータルのセッション期間(既定 8 時間)の中だけ続きます。セッションが終われば、aws sso login をやり直します。

~/.aws/sso/cache のファイルは、パスワードと同じ扱いが要ります。 accessToken があれば、割り当てられたアカウントの認証情報を取れるためです。

--no-browser・デバイスコードの流れ

AWS CLI v2 の aws sso login は、2.22.0 以降、PKCE(認可コードフロー)が既定です。手元でブラウザが開き、127.0.0.1 で待ち受けた CLI に認可コードが戻ってきます。

オプション aws-cli のヘルプ文 使う場面
(なし) — 手元にブラウザがある PC
--no-browser Disables automatically opening the verification URL in the default browser. URL だけ表示させたい
--use-device-code Uses the Device Code authorization grant and login flow instead of the Authorization Code flow. SSH 先のサーバー、コンテナ、WSL など、ブラウザが別の端末にある

PKCE の URL は、サインインするのと同じ端末のブラウザで開く必要があります。 SSH 先のサーバーなどで aws sso login するときは、デバイスコードを使います。

aws sso login --profile dev --use-device-code --no-browser
Browser will not be automatically opened.
Please visit the following URL:

https://device.sso.us-east-1.amazonaws.com/

Then enter the code:

QCFK-N451

Alternatively, you may visit the following URL which will autofill the code upon loading:
https://device.sso.us-east-1.amazonaws.com/?user_code=QCFK-N451

表示の文面は aws-cli のソース(PrintOnlyHandler)とユーザーガイドの例に基づいています。手元の PC やスマートフォンのブラウザで URL を開き、コードを入れて許可すると、サーバー側の CLI がポーリングでトークンを受け取ります。

PKCE で待ち受けができないとき、CLI v2 は次のエラーを出します(botocore の原文)。

Unable to initialize the OAuth 2.0 authorization callback handler: {error_msg}
 You may use --use-device-code to fall back to the device code flow which does not require the callback handler.

AWS CLI v1 で使えるところ

CLI v1 には aws configure sso と aws sso login がありません。 1.46.1 で打つと、次で終わりました。

aws: error: argument subcommand: Invalid choice, valid choices are:   ← aws configure sso
aws: error: argument operation: Invalid choice, valid choices are:    ← aws sso login
機能 CLI v1(1.46.1 で確認) CLI v2
aws configure sso なし あり
aws sso login・aws sso logout(ログイン管理) なし(aws sso logout は API の Logout で --access-token が必須) あり
SSO プロファイルで AWS を呼ぶ あり(キャッシュのトークンを読む) あり
トークンの自動更新(sso-session 形式) あり あり
aws sso list-accounts などの API あり あり

CLI v1 だけの環境でも、トークンを別の手段(CLI v2・SDK)で ~/.aws/sso/cache に置けば、SSO のプロファイルで AWS を呼べました。

よくあるエラーと原因

エラー文は botocore・aws-cli のソースの原文です。

エラー文 原因 対処
Error loading SSO Token: Token for my-sso does not exist まだログインしていない。キャッシュが無い aws sso login --profile ...
Error loading SSO Token: Token for https://... is invalid キャッシュに accessToken・expiresAt が無い キャッシュを消してログインし直す
The SSO session associated with this profile has expired or is otherwise invalid. To refresh this SSO session run aws sso login with the corresponding profile. トークンの期限切れ(旧形式)、またはポータルがトークンを受け付けない aws sso login
Error when retrieving token from sso: Token has expired and refresh failed sso-session 形式で期限が切れ、リフレッシュも失敗した aws sso login
The specified sso-session does not exist: "xxx" sso_session = の名前と [sso-session xxx] が合わない 名前をそろえる
The profile "dev" is configured to use SSO but is missing required configuration: sso_region プロファイルか sso-session に必須の項目が無い sso_start_url・sso_region・sso_account_id・sso_role_name
The value for sso_region is inconsistent between profile (...) and sso-session (...). プロファイルと sso-session の両方に違う値を書いた どちらか一方に書く
The pending authorization to retrieve an SSO token has expired. The login flow to retrieve an SSO token must be restarted. ブラウザで許可する前に待ち時間が過ぎた もう一度 aws sso login
... when calling the GetRoleCredentials operation: ... そのアカウント・許可セットが割り当てられていない、sso_role_name の綴り違い aws sso list-account-roles で名前を見る

手元で再現できたものの出力です。

$ aws sts get-caller-identity --profile dev      # ログイン前
Error loading SSO Token: Token for my-sso does not exist

$ aws sts get-caller-identity --profile broken   # sso_session = no-such-session
The specified sso-session does not exist: "no-such-session"

$ aws sts get-caller-identity --profile dev      # 期限切れ・リフレッシュ失敗(sso-session 形式)
Error when retrieving token from sso: Token has expired and refresh failed

$ aws sts get-caller-identity --profile legacy   # 期限切れ(旧形式)
The SSO session associated with this profile has expired or is otherwise invalid. To refresh this SSO session run aws sso login with the corresponding profile.

同じ「期限切れ」でも、形式によってエラー文が違います。 sso-session 形式はトークンの更新の段で失敗し、旧形式はロールの認証情報を取る段で失敗するためです。認証情報が見つからないときの全体の切り分けは、関連記事「AWS CLI Unable to locate credentialsの直し方」で扱っています。

boto3 から使う

boto3 は、~/.aws/config の SSO のプロファイルをそのまま読みます。ログイン自体は boto3 ではしないので、先に aws sso login を済ませます。

import boto3

session = boto3.Session(profile_name="dev")
creds = session.get_credentials()
print(creds.method)            # sso
s3 = session.client("s3")
print([b["Name"] for b in s3.list_buckets()["Buckets"]])
# 環境変数でも指定できる
AWS_PROFILE=dev python app.py

手元では creds.method が sso になり、アクセスキーは ASIA... の一時認証情報でした。認証の優先順位は、関連記事「boto3 client・resource・sessionの違いと認証の優先順位」で扱っています。

トークンが切れたときに例外を捕まえて案内を出す例です。

import boto3
from botocore.exceptions import SSOTokenLoadError, UnauthorizedSSOTokenError, TokenRetrievalError

try:
    boto3.Session(profile_name="dev").client("sts").get_caller_identity()
except (SSOTokenLoadError, UnauthorizedSSOTokenError, TokenRetrievalError) as e:
    raise SystemExit(f"SSO のトークンがありません。aws sso login --profile dev を実行します: {e}")

Java SDK 2.x から使う

SDK for Java 2.x の既定の認証情報プロバイダーは、SSO のプロファイルを読みます。ただし、sso と ssooidc のモジュールを依存に加える必要があります。 無いと、次のエラーになります(SDK のソースの原文)。

To use Sso related properties in the 'dev' profile, the 'sso' service module must be on the class path.
To use SSO OIDC related properties in the 'dev' profile, the 'ssooidc' service module must be on the class path.
<!-- BOM で版をそろえている前提 -->
<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>sso</artifactId>
</dependency>
<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>ssooidc</artifactId>
</dependency>
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sts.StsClient;

public class Main {
    public static void main(String[] args) {
        try (StsClient sts = StsClient.builder()
                .region(Region.AP_NORTHEAST_1)
                .credentialsProvider(ProfileCredentialsProvider.create("dev"))
                .build()) {
            System.out.println(sts.getCallerIdentity().arn());
        }
    }
}

SDK for Java 1.x は、ドキュメントの対応表では SSO の設定に対応していません。

よくある質問

Q. sso_region と region は何が違いますか。 A. sso_region は IAM Identity Center のポータルがあるリージョン、region は AWS のサービスを呼ぶリージョンです。ドキュメントでも両者は別で、違ってよいとされています。

Q. 毎朝ログインし直すのは避けられますか。 A. アクセスポータルのセッション期間(既定 8 時間、最大 90 日)を管理者が延ばすと、その間は sso-session 形式のリフレッシュでログインし直さずに使えます。延ばすかどうかは組織のセキュリティの方針で決めます。

Q. ロールの認証情報が 1 時間で切れます。 A. 許可セットのセッション期間が既定の 1 時間です。最大 12 時間まで延ばせます。CLI・SDK は、ポータルのトークンが有効なあいだは自動で取り直します。

Q. CI(GitHub Actions など)でも使えますか。 A. ログインにブラウザでの承認が要るため、人が操作しない CI では使いにくい方式です。CI では、IAM の OIDC ID プロバイダーを使ってジョブから IAM ロールを引き受ける方法があります。

Q. aws sso logout は何を消しますか。 A. ユーザーガイドでは、キャッシュされた認証情報を削除するコマンドとして説明されています。表示は Successfully signed out of all SSO profiles. です。

まとめ

  • [sso-session 名前] と、それを参照する [profile 名前] を書き、aws sso login で1回サインインする
  • sso_registration_scopes = sso:account:access を入れるとリフレッシュで自動更新(残り 15 分を切ったとき)
  • 複数アカウント・ロールは、sso-session 1つ+プロファイルを並べる。sso_role_name は許可セット名
  • トークンは ~/.aws/sso/cache/<sha1(セッション名)>.json。期限はポータル既定 8 時間、ロールは既定 1 時間
  • ブラウザが別の端末なら --use-device-code --no-browser
  • CLI v1 にはログインのコマンドが無いが、キャッシュがあれば SSO のプロファイルで呼べる
  • Java SDK 2.x は sso・ssooidc モジュールが要る

参考・出典

確認日はいずれも 2026年10月13日です。

  • AWS CLI ユーザーガイド「AWS CLI を使用した IAM アイデンティティセンター認証の設定」:https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/sso-configure-profile-token.html
  • AWS SDKs and Tools Reference Guide「IAM Identity Center credential provider」:https://docs.aws.amazon.com/sdkref/latest/guide/feature-sso-credentials.html
  • IAM Identity Center User Guide「User interactive sessions」:https://docs.aws.amazon.com/singlesignon/latest/userguide/user-interactive-sessions.html
  • IAM Identity Center User Guide「Session duration considerations for using identity sources, the AWS CLI, and AWS SDKs」:https://docs.aws.amazon.com/singlesignon/latest/userguide/user-session-duration-prereqs-considerations.html
  • IAM Identity Center User Guide「Set session duration」:https://docs.aws.amazon.com/singlesignon/latest/userguide/howtosessionduration.html
  • AWS SDK for Java 2.x Developer Guide「Authenticating with AWS using the AWS SDK for Java 2.x」:https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started-auth.html
  • aws-cli(v2)ソース awscli/customizations/sso/utils.py:https://github.com/aws/aws-cli/blob/v2/awscli/customizations/sso/utils.py
  • botocore ソース botocore/exceptions.py・botocore/tokens.py:https://github.com/boto/botocore
  • AWS SDK for Java 2.x ソース ProfileCredentialsUtils.java・ProfileTokenProviderLoader.java:https://github.com/aws/aws-sdk-java-v2

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「aws sso login設定|Identity Centerプロファイルの書き方」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?