Usar perfis do IAM para conceder acesso a recursos da AWS no Amazon EC2 - AWS SDK for Java 1.x

O AWS SDK for Java 1.x entrou no modo de manutenção em 31 de julho de 2024 e chegará end-of-supportem 31 de dezembro de 2025. Recomendamos que você migre para o AWS SDK for Java 2.xpara continuar recebendo novos recursos, melhorias de disponibilidade e atualizações de segurança.

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Usar perfis do IAM para conceder acesso a recursos da AWS no Amazon EC2

Todas as solicitações à Amazon Web Services (AWS) devem ser assinadas criptograficamente usando as credenciais emitidas pela AWS. Você pode usar perfis do IAM para conceder acesso seguro de maneira prática a recursos da AWS a partir das instâncias do Amazon EC2.

Este tópico fornece informações sobre como usar os perfis do IAM com aplicativos do Java SDK em execução no Amazon EC2. Para obter mais informações sobre instâncias do IAM, consulte Perfis do IAM para Amazon EC2 no Guia do usuário do Amazon EC2 para instâncias do Linux.

A cadeia de fornecedores padrão e os perfis de instância do EC2

Se o aplicativo criar um cliente da AWS usando o construtor padrão, o cliente vai procurar credenciais usando a cadeia de fornecedores de credenciais padrão, na seguinte ordem:

  1. Nas propriedades do sistema Java: aws.accessKeyId e aws.secretKey.

  2. Em variáveis de ambiente do sistema: AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY.

  3. No arquivo de credenciais padrão (o local desse arquivo varia de acordo com a plataforma).

  4. Credenciais entregues por meio do serviço de contêiner do Amazon EC2 se a variável de ambiente AWS_CONTAINER_CREDENTIALS_RELATIVE_URI estiver definida e o gerente de segurança tiver permissão para acessar a variável.

  5. Nas credenciais de perfil de instância, que existem dentro dos metadados da instância associados ao perfil do IAM para a instância do EC2.

  6. Credenciais de token de identidade da Web do ambiente ou contêiner.

A etapa credenciais de perfil de instância na cadeia de fornecedores padrão está disponível somente durante a execução do aplicativo em uma instância do Amazon EC2, mas proporciona a maior facilidade de uso e a melhor segurança durante o trabalho com instâncias do Amazon EC2. Você também pode passar uma instância InstanceProfileCredentialsProvider diretamente para o construtor cliente para obter as credenciais do perfil de instância sem avançar em toda a cadeia de fornecedores padrão.

Por exemplo:

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

Usando essa abordagem, o SDK recupera credenciais da AWS temporárias que tenham as mesmas permissões das associadas ao perfil do IAM ligada à instância do Amazon EC2 no perfil de instância. Embora essas credenciais sejam temporárias e acabem expirando, o InstanceProfileCredentialsProvider as atualiza periodicamente para você, de maneira que as credenciais obtidas continuem permitindo o acesso à AWS.

Importante

A atualização de credenciais automática acontece somente quando você usa o construtor de cliente padrão, que cria o próprio InstanceProfileCredentialsProvider como parte da cadeia de fornecedores padrão, ou quando passa uma instância InstanceProfileCredentialsProvider diretamente para o construtor de cliente. Se usar outro método para obter ou passar credenciais de perfil de instância, você será responsável por verificar e atualizar as credenciais expiradas.

Se não conseguir encontrar credenciais usando a cadeia de fornecedores de credenciais, o construtor de cliente lançará um AmazonClientException.

Demonstração: usar funções do IAM em instâncias do EC2

A demonstração a seguir mostra como recuperar um objeto do Amazon S3 usando um perfil do IAM para gerenciar acesso.

Criar um perfil do IAM

Crie um perfil do IAM que conceda acesso somente leitura ao Amazon S3.

  1. Abra o console do IAM.

  2. No painel de navegação, selecione Roles e Create New Role.

  3. Insira um nome para a função e selecione Next Step (Próxima etapa). Lembre-se desse nome, porque será necessário quando você executar a instância do Amazon EC2.

  4. Na página Selecionar tipo de função, em Funções do AWS service (Serviço da AWS), selecione Amazon EC2.

  5. Na página Definir permissões, em Selecionar modelo de política, selecione Acesso somente leitura do Amazon S3 e, em seguida, Próxima etapa.

  6. Na página Review, selecione Create Role.

Iniciar uma instância do EC2 e especificar o perfil do IAM

Você pode iniciar uma instância do Amazon EC2 com um perfil do IAM usando o console do Amazon EC2 ou o AWS SDK for Java.

  • Para ativar uma instância do Amazon EC2 usando o console, siga as orientações em Conceitos básicos das instâncias do Linux do Amazon EC2 no Guia do usuário do Amazon EC2 para instâncias do Linux.

    Quando você chegar à página Review Instance Launch (Revisar ativação da instância), selecione Edit instance details (Editar detalhes da instância). Em Perfil do IAM, escolha o perfil do IAM criado por você anteriormente. Conclua o procedimento conforme indicado.

    nota

    Será necessário criar ou usar um grupo de segurança existente e um par de chaves para se conectar à instância.

  • Para iniciar uma instância do Amazon EC2 com um perfil do IAM usando o AWS SDK for Java, consulte Executar uma instância do Amazon EC2.

Criar o aplicativo

Vamos criar o aplicativo de exemplo a ser executado na instância do EC2. Primeiro, crie um diretório que você possa usar para manter os arquivos de tutorial (por exemplo, GetS3ObjectApp).

Em seguida, copie as bibliotecas do AWS SDK for Java no diretório recém-criado. Se tiver obtido por download o AWS SDK for Java para o diretório ~/Downloads, você poderá copiá-lo usando os seguintes comandos:

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

Abra um novo arquivo, chame-o de GetS3Object.java e adicione o seguinte código:

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(); } }

Abra um novo arquivo, chame-o de build.xml e adicione as seguintes linhas:

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

Compile e execute o programa modificado. Não há credenciais armazenadas no programa. Por isso, a menos que você tenha as credenciais da AWS já especificadas, o código lançará AmazonServiceException. Por exemplo:

$ 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

Transferir o programa compilado para a instância do EC2

Transfira o programa para a instância do Amazon EC2 usando uma cópia segura ( ), com as bibliotecas do AWS SDK for Java. A sequência de comandos é semelhante à sequência a seguir.

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

Dependendo da distribuição do Linux usada por você, o nome de usuário pode ser "ec2-user", "root" ou "ubuntu". Para obter o nome DNS público da instância, abra o console do EC2 e procure o valor Public DNS (DNS público) na guia Description (Descrição) (por exemplo, ec2-198-51-100-1.compute-1.amazonaws.com).

Nos comandos anteriores:

  • GetS3Object.class é o programa compilado

  • build.xml é o arquivo ant usado para compilar e executar o programa

  • os diretórios lib e third-party são as pastas da biblioteca correspondente do AWS SDK for Java.

  • A opção -r indica que scp deve fazer uma cópia recursiva de todo o conteúdo dos diretórios library e third-party na distribuição do AWS SDK for Java.

  • A opção -p indica que scp deverá preservar as permissões dos arquivos de código-fonte quando copiá-los para o destino.

    nota

    A opção -p funciona somente no Linux, macOS ou Unix. Se estiver copiando arquivos do Windows, você precisará corrigir as permissões de arquivo na instância usando o seguinte comando:

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

Executar o programa de exemplo na instância do EC2

Para executar o programa, conecte-se à instância do Amazon EC2. Para obter mais informações, consulte Conectar-se à sua instância do Linux no Guia do usuário do Amazon EC2 para instâncias do Linux.

Se ant não estiver disponível na instância, instale-o usando o seguinte comando:

sudo yum install ant

Em seguida, execute o programa usando ant da seguinte maneira:

ant run

O programa gravará o conteúdo do objeto do Amazon S3 na janela de comando.