本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 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客户端使用默认构造函数,则该客户端将使用默认凭证提供商链,按以下顺序操作:
-
Java 系统属性:
aws.accessKeyId
和aws.secretKey
。 -
系统环境变量:
AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
。 -
默认凭证文件 (在不同平台上该文件位于不同位置)。
-
通过Amazon EC2如果是容器服务
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
已设置环境变量,而且安全管理器有权访问该变量。 -
实例配置文件凭证,包含在与 EC2 实例的 IAM 角色关联的实例元数据中。
-
来自环境或容器的 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 角色。
-
打开 IAM 控制台
。 -
在导航窗格中,选择 Roles 和 Create New Role。
-
输入角色名称,然后选择 Next Step。请记住此名称,因为在启动 Amazon EC2 实例时会用到它。
-
在存储库的选择角色类型页面,下 AWS 服务角色,选择 Amazon EC2 .
-
在存储库的设置权限页面,下选择策略模板,选择 Amazon S3只读访问权限,那么下一步.
-
在 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 控制台ec2-198-51-100-1.compute-1.amazonaws.com
)。
在上述命令中:
-
GetS3Object.class
是已编译的程序 -
build.xml
是用于构建和运行您的程序的 Ant 文件 -
lib
和third-party
目录是AWS SDK for Java中对应的库文件夹。 -
-r
开关指示scp
应该对AWS SDK for Java版本的library
和third-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 对象的内容写入命令窗口。