使用 IAM 角色授予AWS上的資源Amazon EC2 - AWS SDK for Java 1.x

截至 2024 年 7 月 31 日, AWS SDK for Java 1.x 已進入維護模式,並將end-of-support在 2025 年 12 月 31 日送達。我們建議您遷移至 AWS SDK for Java 2.x,以繼續接收新功能、可用性改進和安全性更新。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 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客户端使用默認構造函數,則客户端將使用默認憑據提供程序鏈(按照以下順序):

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

建立 IAM 角色,授與 Amazon S3 的唯讀存取權。

  1. 開啟 IAM 主控台

  2. 在導覽窗格中,選擇角色,然後建立新的角色

  3. 輸入角色的名稱,然後選擇 Next Step (下一步)。請記住此名稱,因為當您啟動Amazon EC2實例。

  4. 選取角色類型頁面,在 AWS 服務角色,選擇 Amazon EC2

  5. 設定許可頁面,在選取政策範本,選擇 Amazon S3唯讀存取,然後後續步驟

  6. 檢閱頁面上,選擇建立角色

啟動 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 主控台並查找公有 DNS值 (位於)描述選項卡(例如ec2-198-51-100-1.compute-1.amazonaws.com

在上述命令中:

  • GetS3Object.class是你編譯的程序

  • build.xml是使用於建置和執行程式的 ant 文件

  • libthird-party目錄是相應的庫文件夾來自AWS SDK for Java。

  • 所以此-r切換指示scp應該執行遞歸副本的所有內容librarythird-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對象拖入命令視窗。