Utilizzo di ruoli IAM per concedere l'accesso aAWSRisorse suAmazon EC2 - AWS SDK for Java 1. x

Abbiamo annunciato l'imminente versione end-of-support di AWS SDK for Java (v1). Ti consigliamo di migrare alla AWS SDK for Java v2. Per date, dettagli aggiuntivi e informazioni su come effettuare la migrazione, consulta l'annuncio collegato.

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à.

Utilizzo di ruoli IAM per concedere l'accesso aAWSRisorse suAmazon EC2

Tutte le richieste aAmazon Web Services(AWS) deve essere firmato crittograficamente utilizzando le credenziali rilasciate daAWS. È possibile utilizzareRuoli IAMper garantire comodamente un accesso sicuro aAWSrisorse dal tuoAmazon EC2istanze.

In questo argomento vengono fornite le informazioni su come utilizzare i ruoli IAM con applicazioni Java SDK in esecuzione suAmazon EC2. Per ulteriori informazioni sulle istanze IAM, consultaRuoli IAM perAmazon EC2nellaAmazon EC2Guida per l'utente per istanze Linux.

La catena di provider predefinita e i profili di istanza EC2

Se la tua applicazione crea unAWSclient che utilizza il costruttore predefinito, quindi il client cercherà le credenziali utilizzando ilcatena di provider di credenziali predefinite, nel seguente ordine:

  1. Nelle proprietà del sistema Java: aws.accessKeyId e aws.secretKey.

  2. Nelle variabili di ambiente del sistema: AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY.

  3. Nel file delle credenziali predefinito (il percorso di questo file varia in base alla piattaforma).

  4. Credenziali consegnate tramite ilAmazon EC2servizio container se il servizio containerAWS_CONTAINER_CREDENTIALS_RELATIVE_URIè impostata la variabile di ambiente e security manager ha il permesso di accedere alla variabile.

  5. Nelle credenziali del profilo di istanza, disponibili all'interno dei metadati dell'istanza associati al ruolo IAM per l'istanza EC2.

  6. Credenziali Web Identity Token dall'ambiente o dal contenitore.

Lacredenziali dell'istanzanella catena di provider predefinita è disponibile solo quando si esegue l'applicazione su unAmazon EC2ma offre la massima semplicità di utilizzo e la massima sicurezza durante l'utilizzo conAmazon EC2istanze. Puoi anche passare un'istanza InstanceProfileCredentialsProvider direttamente al costruttore client per ottenere le credenziali del profilo di istanza senza passare attraverso l'intera catena di provider predefinita.

Ad esempio:

AmazonS3 s3 = AmazonS3ClientBuilder.standard() .withCredentials(new InstanceProfileCredentialsProvider(false)) .build();

Quando si utilizza questo approccio, l'SDK recupera temporaneamenteAWScredenziali che hanno le stesse autorizzazioni di quelle associate al ruolo IAM associato al ruolo IAM associato alAmazon EC2Istanza nel suo profilo dell'istanza. Sebbene queste credenziali siano temporanee e alla fine scadano,InstanceProfileCredentialsProviderLe aggiorna periodicamente da per l'utente, affinché le credenziali ottenute continuino a consentire l'accesso aAWS.

Importante

L'aggiornamento automatico delle credenziali avvienesoloquando si utilizza il costruttore client predefinito, che ne crea unoInstanceProfileCredentialsProvidercome parte della catena di provider predefinita o quando si passa unInstanceProfileCredentialsProvideristanza direttamente al costruttore client. Se si utilizza un altro metodo per ottenere o passare le credenziali del profilo di istanza, è responsabile del controllo e dell'aggiornamento delle credenziali scadute.

Se il costruttore client non riesce a trovare le credenziali utilizzando la catena del provider di credenziali, verrà generato unAmazonClientException.

Procedura guidata: Utilizzo di ruoli IAM per istanze EC2

Le procedure guidate seguenti illustrano come recuperare un oggetto daAmazon S3utilizzo di un ruolo IAM per gestire l'accesso.

Creare un ruolo IAM

Crea un ruolo IAM che concede accesso in sola lettura a Amazon S3.

  1. Aprire la console IAM.

  2. Nel riquadro di navigazione selezionareRuoli, quindiCreazione di nuovo ruolo.

  3. Inserisci un nome per il ruolo, quindi seleziona Next Step (Fase successiva). Ricorda questo nome, poiché sarà necessario all'avvio del tuoAmazon EC2istanza.

  4. SulSeleziona il tipo di ruolopagina, sotto Servizio AWSRuoli, seleziona Amazon EC2 .

  5. SulImpostazione delle autorizzazionipagina, sottoSeleziona modello di policy, seleziona Amazon S3Read Only Access (Accesso in sola lettura a ), quindiFase successiva.

  6. SulReview (Revisione)page, selezionaCreazione di ruolo.

Avvio di un'istanza EC2 e specifica del ruolo IAM

È possibile lanciare unAmazon EC2istanza con un ruolo IAM utilizzando ilAmazon EC2console o ilAWS SDK for Java.

  • Per lanciare unAmazon EC2utilizzando la console, segui le indicazioni fornite inNozioni di base suAmazon EC2Istanze LinuxnellaAmazon EC2Guida per l'utente per istanze Linux.

    Quando raggiungi la pagina Review Instance Launch (Verifica del lancio dell'istanza), seleziona Edit instance details (Modifica dettagli istanza). Nello statoRuolo IAM, selezionare il ruolo IAM creato in precedenza. Completa la procedura come descritto.

    Nota

    Dovrai creare o utilizzare un gruppo di sicurezza e una coppia di chiavi esistenti per connetterti all'istanza.

  • Per lanciare unAmazon EC2istanza con un ruolo IAM utilizzando ilAWS SDK for Java, consultaEseguire una diAmazon EC2Istanza.

Crea la tua applicazione

Creiamo l'applicazione di esempio da eseguire sull'istanza EC2. Innanzitutto, crea una directory che puoi usare per contenere i tuoi file tutorial (ad esempio,GetS3ObjectApp).

Successivamente, copia del fileAWS SDK for Javalibrerie nella tua directory appena creata. Se è stata scaricata laAWS SDK for Javaal tuo~/Downloadsdirectory, è possibile copiarle utilizzando i comandi seguenti:

cp -r ~/Downloads/aws-java-sdk-{1.7.5}/lib . cp -r ~/Downloads/aws-java-sdk-{1.7.5}/third-party .

Apri un nuovo file, chiamaloGetS3Object.javae aggiungere il seguente codice:

import java.io.*; import com.amazonaws.auth.*; import com.amazonaws.services.s3.*; import com.amazonaws.services.s3.model.*; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; public class GetS3Object { private static final String bucketName = "text-content"; private static final String key = "text-object.txt"; public static void main(String[] args) throws IOException { AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); try { System.out.println("Downloading an object"); S3Object s3object = s3Client.getObject( new GetObjectRequest(bucketName, key)); displayTextInputStream(s3object.getObjectContent()); } catch(AmazonServiceException ase) { System.err.println("Exception was thrown by the service"); } catch(AmazonClientException ace) { System.err.println("Exception was thrown by the client"); } } private static void displayTextInputStream(InputStream input) throws IOException { // Read one text line at a time and display. BufferedReader reader = new BufferedReader(new InputStreamReader(input)); while(true) { String line = reader.readLine(); if(line == null) break; System.out.println( " " + line ); } System.out.println(); } }

Apri un nuovo file, chiamalobuild.xmle aggiungere le seguenti righe:

<project name="Get {S3} Object" default="run" basedir="."> <path id="aws.java.sdk.classpath"> <fileset dir="./lib" includes="**/*.jar"/> <fileset dir="./third-party" includes="**/*.jar"/> <pathelement location="lib"/> <pathelement location="."/> </path> <target name="build"> <javac debug="true" includeantruntime="false" srcdir="." destdir="." classpathref="aws.java.sdk.classpath"/> </target> <target name="run" depends="build"> <java classname="GetS3Object" classpathref="aws.java.sdk.classpath" fork="true"/> </target> </project>

Creare ed eseguire il programma modificato. Notare che nel programma non sono presenti credenziali. Pertanto, a meno che tu non abbia il tuoAWScredenziali già specificate, il codice verrà generatoAmazonServiceException. Ad esempio:

$ ant Buildfile: /path/to/my/GetS3ObjectApp/build.xml build: [javac] Compiling 1 source file to /path/to/my/GetS3ObjectApp run: [java] Downloading an object [java] AmazonServiceException BUILD SUCCESSFUL

Trasferisci il programma compilato all'istanza EC2

Trasferisci il programma sul tuoAmazon EC2istanza che utilizza la copia sicura ( ), insieme alAWS SDK for JavaLibrerie . La sequenza di comandi è simile alla seguente.

scp -p -i {my-key-pair}.pem GetS3Object.class ec2-user@{public_dns}:GetS3Object.class scp -p -i {my-key-pair}.pem build.xml ec2-user@{public_dns}:build.xml scp -r -p -i {my-key-pair}.pem lib ec2-user@{public_dns}:lib scp -r -p -i {my-key-pair}.pem third-party ec2-user@{public_dns}:third-party
Nota

A seconda della distribuzione Linux utilizzata,nome utentepotrebbe essere «ec2-user», «root» o «ubuntu». Per ottenere il nome DNS pubblico dell'istanza, aprire laConsole EC2e cerca ilDNS pubblicovalore nellaDescription (Descrizione)tab (ad esempio,ec2-198-51-100-1.compute-1.amazonaws.com).

Nei comandi precedenti:

  • GetS3Object.classè il tuo programma compilato

  • build.xmlè il file ant utilizzato per creare ed eseguire il programma

  • lolibethird-partyle directory sono le cartelle di libreria corrispondenti dalAWS SDK for Java.

  • La-rl'interruttore indica chescpdovrebbe fare una copia ricorsiva di tutti i contenuti dellibraryethird-partydirectory nelAWS SDK for Javadistribuzione.

  • La-pl'interruttore indica chescpdovrebbe preservare le autorizzazioni dei file di origine quando li copia nella destinazione.

    Nota

    La-pfunziona solo su Linux, macOS o Unix. Se si copiano file da Windows, potrebbe essere necessario correggere le autorizzazioni del file sull'istanza utilizzando il seguente comando:

chmod -R u+rwx GetS3Object.class build.xml lib third-party

Eseguire il programma di esempio sull'istanza EC2

Per eseguire il programma, connettiti al tuoAmazon EC2istanza. Per ulteriori informazioni, consultaConnessione a un'istanza LinuxnellaAmazon EC2Guida per l'utente per istanze Linux.

Se ant non è disponibile nell'istanza, installarla utilizzando il seguente comando:

sudo yum install ant

Quindi, esegui il programma utilizzandoantcome segue:

ant run

Il programma scriverà il contenuto del tuoAmazon S3passare alla finestra dei comandi.