使用 IAM 角色授予对的访问权AWS上的资源Amazon EC2 - AWS SDK for Java

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 IAM 角色授予对的访问权AWS上的资源Amazon EC2

所有请求Amazon Web Services(AWS)必须使用由AWS. 您可以使用IAM 角色以方便地授予安全访问AWS资源来自Amazon EC2实例。

本主题介绍如何使用 IAM 角色操作上运行的 Java 开发工具包应用程序。Amazon EC2. 有关 IAM 实例的更多信息,请参阅适用于 的 IAM 角色Amazon EC2 中的Amazon EC2用户指南(适用于 Linux 实例)。

默认提供程序链和 EC2 实例配置文件

如果您的应用程序将创建AWS客户端使用默认构造函数,则该客户端将使用默认凭据提供程序链,按以下顺序使用:

  1. Java 系统属性:aws.accessKeyIdaws.secretKey

  2. 系统环境变量:AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

  3. 默认凭证文件 (在不同平台上该文件位于不同位置)。

  4. 通过Amazon EC2容器服务,如果AWS_CONTAINER_CREDENTIALS_RELATIVE_URI环境变量,且安全管理器有权访问该变量。

  5. 实例配置文件凭证,包含在与 EC2 实例的 IAM 角色关联的实例元数据中。

  6. 来自环境或容器的 Web 身份令牌凭证。

这些区域有:实例配置文件凭证步骤仅在默认提供程序链中运行您的应用程序时可用。Amazon EC2实例,但在使用时,可提供最大的易用性和最高安全性。Amazon EC2实例。您还可以将 InstanceProfileCredentialsProvider 实例直接传递给客户端构造函数,这样无需执行整个默认提供程序链即可获取实例配置文件凭证。

例如:

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

使用此方法时,SDK 会检索临时AWS凭证具有相同权限的凭证与Amazon EC2实例。虽然这些证书是临时性的, 最终会过期,InstanceProfileCredentialsProvider定期为您刷新它们,以便获得的凭证继续允许访问AWS.

重要

在以下情况下执行自动凭证刷新:您使用默认客户端构造函数 (它会创建其自身的 InstanceProfileCredentialsProvider 作为默认提供程序链的内容) 时;或者您将 InstanceProfileCredentialsProvider 实例直接传递给客户端构造函数时。如果您使用其他方法获取或传送实例配置文件凭证,您将负责检查和刷新过期凭证。

如果客户端构造函数使用凭证提供程序链找不到凭证,它会引发 AmazonClientException

演练:将 IAM 角色用于 EC2 实例

以下演练说明如何从Amazon S3使用 IAM 角色管理访问权。

创建 IAM 角色

创建授予对 Amazon S3 的只读访问权的 IAM 角色。

  1. 打开 IAM 控制台

  2. 在导航窗格中,选择 RolesCreate New Role

  3. 输入角色名称,然后选择 Next Step。请记住此名称,因为在启动 Amazon EC2 实例时会用到它。

  4. 在存储库的Select 角色类型页面,在 AWS 服务 角色中,选择 Amazon EC2 .

  5. 在存储库的设置权限页面,在Select 策略模板中,选择 Amazon S3只读访问权限,然后下一步.

  6. Review 页面上,选择 Create Role

启动 EC2 实例并指定您的 IAM 角色

您可以启动Amazon EC2实例,并且使用 IAM 角色Amazon EC2控制台或AWS SDK for Java.

  • 要启动Amazon EC2实例,请按照入门Amazon EC2Linux 实例中的Amazon EC2用户指南(适用于 Linux 实例)。

    到达核查实例启动页面时,选择编辑实例详细信息。InIAM 角色下,选择您之前创建的 IAM 角色。按指示完成该过程。

    注意

    您需要创建或使用现有安全组和密钥对,才能连接到该实例。

  • 要启动Amazon EC2实例,并且使用 IAM 角色AWS SDK for Java,请参阅运行Amazon EC2实例.

创建您的应用程序

让我们来构建在 EC2 实例上运行的示例应用程序。首先,创建一个目录来用于保存教程文件 (例如,GetS3ObjectApp)。

然后,将 AWS SDK for Java 库复制到新创建的目录中。如果已将AWS SDK for Java下载到 ~/Downloads 目录中,可以使用以下命令进行复制:

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

打开一个新文件,将其命名为 GetS3Object.java 并添加以下代码:

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

打开一个新文件,将其命名为 build.xml 并添加以下行:

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

构建并运行修改后的程序。请注意,该程序中未存储凭证。因此,除非你有AWS凭证,则代码将引发AmazonServiceException. 例如:

$ 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

传输已编译的程序到您的 EC2 实例

使用安全复制 (Amazon EC2 ),将程序连同 库传输到 AWS SDK for Java 实例。该命令序列与以下序列相似。

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

根据您使用的 Linux 版本,用户名 可能是“ec2-user”、“root”或“ubuntu”。要获得实例的公有 DNS 名称,请打开EC2 控制台并查找公有 DNS DNS中的值说明选项卡(例如ec2-198-51-100-1.compute-1.amazonaws.com)。

在上述命令中:

  • GetS3Object.class 是已编译的程序

  • build.xml 是用于构建和运行您的程序的 Ant 文件

  • libthird-party 目录是AWS SDK for Java中对应的库文件夹。

  • -r 开关指示 scp 应该对AWS SDK for Java版本的 librarythird-party 目录中的所有内容以递归方式进行复制。

  • -p 开关指示 scp 在将源文件复制到目标位置时,应保留对应文件的权限。

    注意

    这些区域有:-p开关仅在 Linux、macOS 或 Unix 上工作。如果您从 Windows 中复制文件,可能需要使用以下命令在实例上修复文件权限:

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

在 EC2 实例上运行示例程序

要运行程序,请连接到 Amazon EC2 实例。有关更多信息,请参阅 。连接到 Linux 实例中的Amazon EC2用户指南(适用于 Linux 实例)。

如果 ant 在您的实例上不可用,请使用以下命令安装它:

sudo yum install ant

然后使用 ant 运行程序,如下所示:

ant run

该程序会将 Amazon S3 对象的内容写入命令窗口。