Recupero dei metadati dell'istanza - Amazon Elastic Compute Cloud

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Recupero dei metadati dell'istanza

Dal momento che i metadati dell'istanza sono disponibili dall'istanza in esecuzione, non devi utilizzare la console Amazon EC2 o AWS CLI. Ciò può risultare utile quando sta scrivendo script da eseguire dall'istanza. Ad esempio, puoi accedere all'indirizzo IP locale dell'istanza dai metadati dell'istanza per gestire una connessione a un'applicazione esterna.

I metadati dell'istanza sono suddivisi in categorie. Per una descrizione di ciascuna categoria di metadati dell'istanza, consulta Categorie di metadati dell'istanza.

Per visualizzare tutte le categorie dei metadati dell'istanza dall'interno di un'istanza in esecuzione, utilizza gli URI IPv4 o IPv6 seguenti.

IPv4

http://169.254.169.254/latest/meta-data/

IPv6

http://[fd00:ec2::254]/latest/meta-data/

Gli indirizzi IP sono indirizzi link-local e sono validi solo dall'istanza. Per ulteriori informazioni, consulta la sezione Indirizzi link local in questa guida per l'utente e Indirizzi link-local su Wikipedia.

Nota

Negli esempi riportati in questa sezione viene utilizzato l'indirizzo IPv4 del servizio di metadati dell'istanza (IMDS): 169.254.169.254. Se si recuperano i metadati per le istanze EC2 tramite l'indirizzo IPv6, accertarsi invece di abilitare e utilizzare l'indirizzo IPv6: [fd00:ec2::254]. L'indirizzo IPv6 del servizio di metadati dell'istanza (IMDS) è compatibile con i comandi IMDSv2. L'indirizzo IPv6 è accessibile solo sulle istanze create sul sistema Nitro. AWS

Il formato del comando è diverso, a seconda che si utilizzi IMDSv1 o IMDSv2. Per impostazione predefinita, puoi utilizzare entrambe le versioni dell'IMDS. Per richiedere l'utilizzo di IMDSv2, consulta Usa IMDSv2.

Puoi anche utilizzare uno strumento quale cURL, come mostrato nell'esempio seguente.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/

Per il comando per recuperare i metadati dell'istanza da un'istanza di Windows, consulta la sezione Recupero dei metadati dell'istanza nella Guida per l'utente di Amazon EC2 per le istanze Windows.

Costi

Non verrà addebitato alcun costo per le richieste HTTP utilizzate per recuperare i metadati dell'istanza e i dati utente.

Considerazioni

Per evitare problemi con il recupero dei metadati dell'istanza, considerare quanto segue:

  • In un ambiente container, consigliamo di impostare il limite di hop su 2.

    Gli AWS SDK utilizzano le chiamate IMDSv2 per impostazione predefinita. Se la chiamata IMDSv2 non riceve alcuna risposta, l'SDK ritenta la chiamata e, se ancora non riesce, utilizza IMDSv1. Ciò può comportare un ritardo, soprattutto in un ambiente del container. In un ambiente container, se il limite di hop è 1, la risposta IMDSv2 non viene restituita perché andare al container è considerato un hop di rete aggiuntivo. Per evitare il processo di fallback di IMDSv1 e il ritardo risultante, in un ambiente container si consiglia di impostare il limite di hop su 2. Per ulteriori informazioni, consulta Configura le opzioni dei metadati dell'istanza.

  • Per IMDSv2, devi utilizzare /latest/api/token durante il recupero del token.

    L'emissione di richieste PUT a qualsiasi percorso specifico della versione, ad esempio /2021-03-23/api/token, farà sì che il servizio metadati restituisca l'errore 403 Non consentito. Questo è il comportamento previsto.

  • Se IMDSv2 è richiesto, IMDSv1 non funziona.

    Puoi verificare se IMDSv2 è richiesto per un'istanza, come indicato di seguito: seleziona l'istanza per visualizzarne i dettagli e controlla il valore di IMDSv2. Il valore è Richiesto (è possibile utilizzare solo IMDSv2) o Facoltativo (È possibile utilizzare IMDSv2 e IMDSv1).

Risposte e messaggi di errore

Tutti i metadati dell'istanza vengono restituiti come testo (tipo di contenuto HTTP text/plain).

Una richiesta relativa a una risorsa di metadati specifica restituisce il valore appropriato o un codice di errore HTTP 404 - Not Found se la risorsa non è disponibile.

Una richiesta relativa a una risorsa di metadati generica (l'URI termina con /) restituisce l'elenco delle risorse disponibili o un codice di errore HTTP 404 - Not Found se la risorsa specificata non è disponibile. Le voci dell'elenco si trovano su righe distinte che terminano con caratteri di avanzamento riga (ASCII 10).

Per richieste effettuate mediante Servizio di metadati dell'istanza Versione 2, possono essere restituiti i seguenti codici di errore HTTP:

  • 400 - Missing or Invalid Parameters – La richiesta PUT non è valida.

  • 401 - Unauthorized – La richiesta GET utilizza un token non valido. L'operazione consigliata è quella di generare un nuovo token.

  • 403 - Forbidden: la richiesta non è consentita o l'IMDS è disattivato.

Esempi di recupero di metadati dell'istanza

Gli esempi seguenti forniscono comandi che è possibile utilizzare su un'istanza Linux. Per i comandi per recuperare i metadati dell'istanza da un'istanza di Windows, consulta la sezione Recupero dei metadati dell'istanza nella Guida per l'utente di Amazon EC2 per le istanze Windows.

Recupero delle versioni disponibili dei metadati dell'istanza

Questo esempio recupera le versioni disponibili dei metadati dell'istanza. Ogni versione fa riferimento a una build dei metadati dell'istanza quando sono state rilasciate nuove categorie di metadati dell'istanza. Le versioni di build dei metadati dell'istanza non sono correlate alle versioni dell'API di Amazon EC2. Le versioni precedenti sono disponibili in presenza di script basati sulla struttura e sulle informazioni presenti in una versione precedente.

Nota

Per evitare di dover aggiornare il codice ogni volta che Amazon EC2 rilascia una nuova build di metadati dell'istanza, ti consigliamo di utilizzare latest nel percorso e non nel numero di versione. Ad esempio, utilizza latest come segue:

curl http://169.254.169.254/latest/meta-data/ami-id

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/ 1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01 2009-04-04 2011-01-01 2011-05-01 2012-01-12 2014-02-25 2014-11-05 2015-10-20 2016-04-19 ... latest
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/ 1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01 2009-04-04 2011-01-01 2011-05-01 2012-01-12 2014-02-25 2014-11-05 2015-10-20 2016-04-19 ... latest

Recupero degli elementi di metadati di primo livello

Questo esempio recupera gli elementi di metadati di primo livello. Per ulteriori informazioni, consulta Categorie di metadati dell'istanza.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ ami-id ami-launch-index ami-manifest-path block-device-mapping/ events/ hostname iam/ instance-action instance-id instance-life-cycle instance-type local-hostname local-ipv4 mac metrics/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups services/
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ ami-id ami-launch-index ami-manifest-path block-device-mapping/ events/ hostname iam/ instance-action instance-id instance-type local-hostname local-ipv4 mac metrics/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups services/

Gli esempi seguenti consentono di recuperare i valori di alcuni degli elementi di metadati di primo livello che sono stati ottenuti nell'esempio precedente. Le richieste IMDSv2 utilizzano il token memorizzato che è stato creato nel comando di esempio precedente, ipotizzando che non sia scaduto.

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-id ami-0abcdef1234567890
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-id ami-0abcdef1234567890

 

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/reservation-id r-0efghijk987654321
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/reservation-id r-0efghijk987654321

 

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/local-hostname ip-10-251-50-12.ec2.internal
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-hostname ip-10-251-50-12.ec2.internal

 

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-hostname ec2-203-0-113-25.compute-1.amazonaws.com
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-hostname ec2-203-0-113-25.compute-1.amazonaws.com

Recupero dell'elenco di chiavi pubbliche disponibili

Questo esempio recupera l'elenco delle chiavi pubbliche disponibili.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key

Visualizzazione dei formati in cui è disponibile la chiave pubblica 0

Questo esempio mostra i formati in cui è disponibile la chiave pubblica 0.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/0/ openssh-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/ openssh-key

Recupero della chiave pubblica 0 (nel formato di chiave OpenSSH)

Questo esempio recupera la chiave pubblica 0 (nel formato di chiave OpenSSH).

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6 b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ 21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4 nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6 b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ 21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4 nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key

Recupero dell'ID della sottorete per un'istanza

In questo esempio viene recuperato l'ID della sottorete per un'istanza.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id subnet-be9b61d7
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id subnet-be9b61d7

Ottenere i tag dell'istanza per un'istanza

Negli esempi seguenti, l'istanza di esempio ha tag sui metadati delle istanze abilitati e i tag delle istanze Name=MyInstance e Environment=Dev.

In questo esempio vengono recuperate tutte le chiavi del tag di istanza per un'istanza.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/tags/instance Name Environment
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/tags/instance Name Environment

L'esempio seguente ottiene il valore della chiave Name ottenuta nell'esempio precedente. Le richieste IMDSv2 utilizzano il token memorizzato che è stato creato nel comando dell'esempio precedente, ipotizzando che non sia scaduto.

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/tags/instance/Name MyInstance
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/tags/instance/Name MyInstance

Throttling delle query

La limitazione (della larghezza di banda della rete) delle query viene applicata in base all'istanza, ovvero vengono applicate restrizioni al numero di connessioni simultanee da un'istanza all'IMDS.

Se utilizzi l'IMDS per recuperare le credenziali di AWS sicurezza, evita di richiedere le credenziali durante ogni transazione o contemporaneamente a un numero elevato di thread o processi, poiché ciò potrebbe comportare una limitazione. Consigliamo invece di memorizzare le credenziali nella cache fino all'approssimarsi della relativa data di scadenza. Per ulteriori informazioni sul ruolo IAM e sulle credenziali di sicurezza associate al ruolo, consulta Recupero delle credenziali di sicurezza dai metadati delle istanze.

Se si verifica tale limitazione (della larghezza di banda della rete) durante l'accesso all'IMDS, riprova a eseguire la query con un approccio basato sul backoff esponenziale.

Limitazione dell'accesso al servizio di metadati dell'istanza (IMDS)

Puoi valutare se utilizzare regole firewall locali per disabilitare l'accesso al'IMDS da alcuni processi o da tutti.

Nota

Per le istanze basate sul sistema AWS Nitro, l'IMDS può essere raggiunto dalla propria rete quando un dispositivo di rete all'interno del VPC, ad esempio un router virtuale, inoltra i pacchetti all'indirizzo IMDS e il controllo di origine/destinazione predefinito sull'istanza è disabilitato. Per evitare che una fonte esterna al tuo VPC raggiunga l'IMDS, ti consigliamo di modificare la configurazione dell'appliance di rete in modo da eliminare pacchetti con l'indirizzo IPv4 di destinazione dell'IMDS 169.254.169.254 e, se hai abilitato l'endpoint IPv6, l'indirizzo IPv6 dell'IMDS. [fd00:ec2::254]

Utilizzo di iptables per limitare l'accesso

L'esempio seguente utilizza iptables Linux e il relativo modulo owner per impedire al server Web Apache (basato sul suo ID utente di installazione predefinito di apache) di accedere a 169.254.169.254. Utilizza una regola di rifiuto per rifiutare tutte le richieste dei metadati dell'istanza (IMDSv1 o IMDSv2) da qualsiasi processo in esecuzione come tale utente.

$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner --uid-owner apache --jump REJECT

Oppure, puoi valutare di consentire l'accesso solo a utenti o gruppi particolari, utilizzando regole che autorizzano. Le regole che autorizzano potrebbero essere più facili da gestire dal punto di vista della sicurezza, perché richiedono di prendere una decisione sul software che deve poter accedere ai metadati dell'istanza. Se utilizzi regole che autorizzano, è meno probabile che venga accidentalmente concesso al software l'accesso al servizio di metadati (a cui non intendevi accedere) se in seguito modifichi il software o la configurazione su un'istanza. Puoi anche combinare l'utilizzo dei gruppi con le regole che autorizzano, in modo da poter aggiungere e rimuovere utenti da un gruppo autorizzato senza la necessità di modificare la regola firewall.

L'esempio seguente impedisce a tutti i processi di accedere all'IMDS, tranne a quelli in esecuzione nell'account utente trustworthy-user.

$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner ! --uid-owner trustworthy-user --jump REJECT
Nota
  • Per utilizzare regole firewall locali, è necessario adattare i comandi dell'esempio precedente in base alle proprie esigenze.

  • Per impostazione predefinita, le regole iptables non vengono mantenute tra riavvii del sistema. Possono essere rese persistenti utilizzando funzionalità del sistema operativo non descritte in questo argomento.

  • Il modulo owner iptables corrisponde all'appartenenza al gruppo solo se il gruppo è quello primario di un determinato utente locale. Altri gruppi non corrispondono.

Utilizzo di PF o IPFW per limitare l'accesso

Se utilizzi FreeBSD o OpenBSD, puoi anche valutare l'utilizzo di PF o IPFW. Gli esempi seguenti limitano l'accesso all'IMDS al solo utente root.

PF

$ block out inet proto tcp from any to 169.254.169.254
$ pass out inet proto tcp from any to 169.254.169.254 user root

IPFW

$ allow tcp from any to 169.254.169.254 uid root
$ deny tcp from any to 169.254.169.254
Nota

L'ordine dei comandi PF e IPFW è importante. PF è preimpostato sull'ultima regola corrispondente e IPFW è preimpostato sulla prima regola corrispondente.