- AWS
aws sso login設定|Identity Centerプロファイルの書き方
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期連続の黒字決算。