Pubblicato il 16/03/2024 da alnao nella categoria AWS

I metadati di una istanza EC2 sono delle informazioni che l’istanza stessa può recuperare sulla sua natura e sulla sua posizione nel Cloud, infatti di default le istanze non conoscono alcune informazioni che possono essere utili alle esecuzioni delle applicazioni come il nome host, il security group, l’indirizzo di rete. Si rimanda alla documentazione ufficiale per tutte le informazioni riguardanti questo sottoservizio, a volte chiamato anche IMDS.  AWS ha fatto un po’ confusione con i nomi: “user-data” e “mata-data” hanno nomi assonanti ma sono due sottoservizi molto diversi, bisogna prestare sempre attenzione alla differenza tra questi due concetti del servizio EC2.

Come indicato nella documentazione queste informazioni sono disponibili all’interno di una istanza ma chiunque acceda all’istanza può recuperare le informazioni quindi è sconsigliato usare l’usera data per salvare password o altre informazioni critiche che possono essere recuperate con i meta-data. L’elenco completo dei dati disponibili è elencati nel sito ufficiale ed è presente una pagina specifica che descrive le regole di utilizzo di questa tecnica, in particolare bisogna ricordare che ogni istanza ha un “identity role” in IAM che rappresenta la stessa istanza e quello che può fare, questo definisce la regola di accesso al Instance Metadata Service (IMDS) identificato come tipo di risorsa:

/identity-credentials/ec2/security-credentials/ec2-instance

Esistono due tipi di possibilità di accesso al servizio IMDS la prima versione permette l’accesso diretto mentre la seconda versione prevede l’uso di un token autenticato, per ottenere il token bisogna richiamare un istruzione specifica

$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`

Per poi usare il token per accedere ai medatati si usa il comando

$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/

con questo comando si ottengono tutti i dati disponibili, per poi accedere e recuperare un dati specifico si può usare lo stesso comando aggiungendo il nome del parametro

$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-id

La libreria SDK mette a disposizione una libreria specifica per l’uso e il recupero dei meta-dati, si rimanda alla documentazione ufficiale per il linguaggio Java o per gli altri linguaggi. Il codice di esempio per il recupero delle ami-id di una istanza è

public static void main( String[] args ) {
  Ec2MetadataClient client = Ec2MetadataClient.create();
  Ec2MetadataResponse response = client.get("/latest/meta-data/ami-id");
  System.out.println(response.asString());
  client.close(); // Closes the internal resources used by the Ec2MetadataClient class.
}

ovviamente questo codice deve essere eseguito da una istanza EC2, al di fuori questo codice genera errore.
L’esempio completo e funzionante è disponibile nel solito repository:

https://github.com/alnao/JavaExamples/tree/master/AwsSdkJava/04_MetadataEc2

Su CloudFormation il concetto di Metadata può essere confuso, per assonanza, con altri tipi specifici previsti dal servizio, in ogni caso è possibile usare i Metadati messi a disposizione da EC2 per alcuni casi d’uso specifici, uno dei più semplici e utili è la definizione di uno script di avvio di un AutoScaling e un comando per la “verifica dello stato dell’istanza”:

LaunchConfig:
  Type: AWS::AutoScaling::LaunchConfiguration
  Metadata:
    AWS::CloudFormation::Init:
      configSets:
        full_install: [install_cfn, install_app, verify_instance_health]
        ...
      verify_instance_health:
        commands:
          ELBHealthCheck:
            command: !Sub
             'until [ "$state" == "\"InService\"" ]; do state=$(aws --region ${AWS::Region} elb describe-instance-health
             --load-balancer-name ${ElasticLoadBalancer}
             --instances $(curl -s http://169.254.169.254/latest/meta-data/instance-id)
             --query InstanceStates[0].State); sleep 10; done'

L’esempio completo può essere trovato nel repository ufficiale di awslabs.

MENU