Come posso risolvere l'errore AWS STS "il token di sicurezza incluso nella richiesta è scaduto" quando si utilizza l'interfaccia a riga di comando di AWS per assumere un ruolo IAM?
Ho provato ad assumere un ruolo AWS Identity and Access Management (IAM) attraverso AWS Command Line Interface (AWS CLI). Ho ricevuto un errore simile al seguente: "Il token di sicurezza incluso nella richiesta è scaduto".
Breve descrizione
Le credenziali di sicurezza temporanee per gli utenti IAM vengono richieste utilizzando il servizio AWS Security Token Service (AWS STS). Per impostazione predefinita, le credenziali temporanee create con l'operazione API AssumeRole durano un'ora. Dopo la loro scadenza, le credenziali temporanee non possono essere riutilizzate. Per ulteriori informazioni, consulta Credenziali di sicurezza temporanee in IAM.
Risoluzione
Completa i seguenti passaggi per la risoluzione dei problemi del tuo caso d'uso.
Se ricevi un messaggio di errore durante l'esecuzione dei comandi di AWS CLI, assicurati di utilizzare la versione più recente di AWS CLI.
Assicurati che le tue richieste di credenziali di sicurezza temporanee possano raggiungere gli endpoint AWS
La definizione delle credenziali per un ruolo richiede un ID chiave di accesso, una chiave di accesso segreta e un token di sessione. Le richieste inviate devono raggiungere l'endpoint AWS entro cinque minuti dal timestamp sulla richiesta altrimenti la richiesta verrà negata. Per ulteriori informazioni, consulta Perché le richieste sono firmate.
Uso dei profili per assumere un ruolo IAM
Un profilo denominato è una raccolta di impostazioni e credenziali che è possibile applicare a un comando di AWS CLI. Verifica sempre di utilizzare le credenziali corrette.
Il seguente comando di AWS CLI utilizza le credenziali di profilo di default:
aws s3 ls
Questo comando di esempio utilizza le credenziali del profilo project1 configurate nel file .config:
aws s3 ls --profile project1
Output di esempio in cui sono utilizzate credenziali scadute:
"An error occurred (ExpiredToken) when calling the ListBuckets operation: The provided token has expired."
Questi profili sono definiti nella cartella .aws contenente i file .credentials e .config.
Il file di configurazione si trova in ~/.aws/config per Linux/macOS e C:\Users%USERPROFILE%.aws\config per Windows. Il file delle credenziali si trova in ~/.aws/credentials per Linux/macOS e C:\Users%USERPROFILE%.aws\credentials per Windows.
Per verificare le credenziali del profilo di default, emetti il seguente comando:
aws configure list --profile default
Output di esempio:
Name Value Type Location ---- ----- ---- -------- profile default manual —profile access_key TGN7 shared-credentials-file secret_key SbXb shared-credentials-file region us-east-1 config-file ~/.aws/config
Per confermare che le stesse credenziali siano utilizzate per il profilo project1, emetti il seguente comando:
aws configure list --profile project1
Output di esempio:
Name Value Type Location ---- ----- ---- -------- profile project1 manual —profile access_key QN2X config-file secret_key LPYI config-file region eu-west-1 config-file ~/.aws/config
Nell'output di esempio, tieni presente che è possibile che configurare credenziali diverse per i profili di default e project1.
Puoi creare un profilo nel tuo file .aws/config utilizzando il seguente formato:
[profile project1] region = eu-west-1 aws_access_key_id = <access-Key-for-an-IAM-role> aws_secret_access_key = <secret-access-Key-for-an-IAM-role> aws_session_token = <session-token>
Queste credenziali vengono fornite quando esegui il comando assume-role di AWS STS in modo simile al seguente:
aws sts assume-role --role-arn arn:aws:iam::<account-number>:role/Prod-Role --role-session-name environment-prod
Output di esempio:
{ "AssumedRoleUser": { "AssumedRoleId": "AROAXXXXXXXXXXXX:environment-prod", "Arn": "arn:aws:sts::<account-number>:assumed-role/Prod-Role/environment-prod" }, "Credentials": { "SecretAccessKey": "<secret-access-Key-for-an-IAM-role>, "SessionToken": "<session-token>", "Expiration": "2020-03-31T17:17:53Z", "AccessKeyId": "<access-Key-for-an-IAM-role>" }
Nota: puoi aumentare la scadenza della durata massima di una sessione per le credenziali temporanee per i ruoli IAM utilizzando il parametro DurationSeconds per il tuo caso d'uso.
La nuova chiamata API assume-role recupera quindi un nuovo set di credenziali valide. Dopo la chiamata API, dovrai aggiornare manualmente il file ~/.aws/config con le nuove credenziali temporanee.
Puoi evitare di aggiornare il file di configurazione ogni volta che scade una sessione. Definisci un profilo per il ruolo IAM insieme all'utente che assume il ruolo nel file ~/.aws/config o ~/.aws/credentials come riportato di seguito:
[profile project1] role_arn = <arn-of-IAM-role> source_profile = user1 region = <region>
Tieni presente che user1 è definito nel tuo file ~/.aws/credentials in modo simile al seguente:
[user1] aws_access_key_id=AKIAIOSFODNN7EXAMPLE aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Definire source_profile significa che non è necessario aggiornare le credenziali temporanee nel file ~/.aws/config o ~/.aws/credentials.
Il seguente comando di AWS CLI elenca i bucket Amazon Simple Storage Service (Amazon S3) con le credenziali per user1 che si trovano nel file ~/.aws/credentials.
aws s3 ls --profile project1
Se utilizzi AWS CLI con un elemento source_profile, la chiamata API assume-role inserisce le credenziali nel file .aws/cli/cache. Le credenziali scadute vengono aggiornate automaticamente nel file .aws/cli/cache. Se ricevi un errore di credenziali scadute, puoi cancellare la cache con i seguenti comandi:
Linux/macOS:
$ rm -r ~/.aws/cli/cache
Windows:
C:\> del /s /q %UserProfile%\.aws\cli\cache
AWS CLI crea nuove credenziali nella cache.
Crea variabili d'ambiente per assumere il ruolo IAM e verifica l'accesso
Puoi utilizzare le credenziali del ruolo IAM per creare tre variabili di ambiente per assumere il ruolo IAM come riportato di seguito:
Linux/macOS:
export AWS_ACCESS_KEY_ID=RoleAccessKeyID export AWS_SECRET_ACCESS_KEY=RoleSecretKey export AWS_SESSION_TOKEN=RoleSessionToken
Windows:
C:\> setx AWS_ACCESS_KEY_ID RoleAccessKeyID C:\> setx AWS_SECRET_ACCESS_KEY RoleSecretKey C:\> setx AWS_SESSION_TOKEN RoleSessionToken
Per verificare di aver assunto il ruolo IAM corretto, emetti il seguente comando:
aws sts get-caller-identity
Il comando get-caller-identity visualizza informazioni sull'identità IAM utilizzata per autenticare la richiesta. Per ulteriori informazioni, vedi Come posso assumere un ruolo IAM utilizzando AWS CLI?
Le variabili di ambiente contengono credenziali temporanee memorizzate nella cache anche dopo la loro scadenza e non vengono rinnovate automaticamente. Utilizza i seguenti comandi per verificare se le variabili di ambiente delle credenziali sono impostate:
Linux/macOS:
$ printenv | grep AWS
Windows:
C:\>set AWS
Puoi rimuovere le variabili d'ambiente scadute con i seguenti comandi:
Linux/macOS:
$ unset AWS_ACCESS_KEY_ID $ unset AWS_SECRET_ACCESS_KEY $ unset AWS_SESSION_TOKEN
Windows:
C:\>set AWS_ACCESS_KEY_ID= C:\>set AWS_SECRET_ACCESS_KEY= C:\>set AWS_SESSION_TOKEN=
Ora puoi utilizzare nuovamente la chiamata API assume-role per ottenere nuove credenziali valide e impostare di nuovo le variabili di ambiente.
Importante: i file .aws/credentials e .aws/config contengono i dettagli delle credenziali per le tue entità IAM. Quando gestisci le tue credenziali, assicurati di seguire le best practice di sicurezza in IAM.
Informazioni correlate

Contenuto pertinente
- Come posso risolvere gli errori di limitazione dell'API o di "Frequenza superata" per IAM e AWS STS?AWS UFFICIALEAggiornata 9 mesi fa
- AWS UFFICIALEAggiornata un anno fa