截至 2024 年 7 月 31 日, AWS SDK for Java 1.x 已進入維護模式,並將end-of-support
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 IAM 角色授予AWS上的資源Amazon EC2
所有請求Amazon Web Services(AWS) 必須使用由AWS。您可以使用IAM 角色以便方便地授予AWS來自您的資源Amazon EC2實例。
本主題提供如何使用 IAM 角色搭配上執行之 Java SDK 應用程式的相關資訊Amazon EC2。如需 IAM 執行個體的詳細資訊,請參的 IAM 角色Amazon EC2中的Amazon EC2Linux 執行個體使用者指南。
默認提供程序鏈和 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 角色
建立 IAM 角色,授與 Amazon S3 的唯讀存取權。
-
開啟 IAM 主控台
。 -
在導覽窗格中,選擇角色,然後建立新的角色。
-
輸入角色的名稱,然後選擇 Next Step (下一步)。請記住此名稱,因為當您啟動Amazon EC2實例。
-
在選取角色類型頁面,在 AWS 服務角色,選擇 Amazon EC2 。
-
在設定許可頁面,在選取政策範本,選擇 Amazon S3唯讀存取,然後後續步驟。
-
在檢閱頁面上,選擇建立角色。
啟動 EC2 執行個體時並指定 IAM 角色
您可以啟動Amazon EC2使用 IAM 角色使用Amazon EC2主控台或AWS SDK for Java。
-
要啟動Amazon EC2執行個體,請遵循入門Amazon EC2Linux 執行個體中的Amazon EC2Linux 執行個體使用者指南。
當您到達 Review Instance Launch (檢閱執行個體啟動) 頁面時,選取 Edit instance details (編輯執行個體詳細資訊)。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 用户」,「根」或「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
應該執行遞歸副本的所有內容library
和third-party
目錄AWS SDK for Java分發。 -
所以此
-p
切換指示scp
應該在源文件複製到目標時保留源文件的權限。注意
所以此
-p
切換僅適用於 Linux、macOS 或 Unix。如果要從 Windows 複製文件,則可能需要使用以下命令修復實例上的文件權限:
chmod -R u+rwx GetS3Object.class build.xml lib third-party
在 EC2 執行個體上執行範例程式
若要執行程式,請連接至Amazon EC2實例。如需詳細資訊,請參閱「」連線至您的 Linux 執行個體中的Amazon EC2Linux 執行個體使用者指南。
如果
ant
在您的執行個體上不可用,請使用下列命令進行安裝:
sudo yum install ant
然後,使用ant
命中率:
ant run
該程序將寫入Amazon S3對象拖入命令視窗。