中的預設登入資料提供者鏈結 AWS SDK for Java 2.x - AWS SDK for Java 2.x

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

中的預設登入資料提供者鏈結 AWS SDK for Java 2.x

中的預設登入資料提供者鏈結 AWS SDK for Java 2.x 會自動在預先定義的位置序列中搜尋 AWS 登入資料,允許應用程式使用 進行身分驗證, AWS 服務 而無需明確指定登入資料來源。

預設登入資料提供者鏈結由 DefaultCredentialsProvider 類別實作。它會依序委派給其他登入資料提供者實作,以檢查不同位置中的組態。第一個可以尋找所有必要組態元素的登入資料提供者會導致鏈結結束。

若要使用預設登入資料提供者鏈來提供臨時登入資料,請建立服務用戶端建置器,但不指定登入資料提供者。下列程式碼片段會建立DynamoDbClient使用預設登入資料提供者鏈結來尋找和擷取組態設定的 。

// Any external Region configuration is overridden. // The SDK uses the default credentials provider chain because no specific credentials provider is specified. Region region = Region.US_WEST_2; DynamoDbClient ddb = DynamoDbClient.builder() .region(region) .build();

登入資料設定擷取順序

適用於 Java 的 SDK 2.x 的預設登入資料提供者鏈結會使用預先定義的序列搜尋您環境中的組態。

  1. Java 系統屬性

    • SDK 使用 SystemPropertyCredentialsProvider 類別從 aws.accessKeyIdaws.secretAccessKeyaws.sessionToken Java 系統屬性載入臨時憑證。

      注意

      如需有關如何設定 Java 系統屬性的資訊,請參閱官方 Java 教學課程網站上的系統屬性教學課程。

  2. 環境變數

  3. Web 身分字符和 IAM 角色 ARN

    • SDK 使用 WebIdentityTokenFileCredentialsProvider 類別,透過使用 Web 身分字符擔任角色來載入憑證。

    • 登入資料提供者會尋找下列環境變數或 JVM 系統屬性:

      • AWS_WEB_IDENTITY_TOKEN_FILE or aws.webIdentityTokenFile

      • AWS_ROLE_ARNaws.roleArn

      • AWS_ROLE_SESSION_NAMEaws.roleSessionName(選用)

    • 開發套件取得值後,它會呼叫 AWS Security Token Service (STS),並使用其傳回的臨時登入資料來簽署請求。

    • Amazon Elastic Kubernetes Service (EKS) 等執行期環境會自動提供 Web 身分字符給 AWS SDKs,讓應用程式能夠取得臨時 AWS 憑證。

  4. 共用 credentialsconfig 檔案

    • SDK 使用 ProfileCredentialsProvider 從共用 credentialsconfig 檔案中的[default]設定檔載入 IAM Identity Center 單一登入設定或暫時登入資料。

      適用於 Java AWS SDKs SDK 如何與 IAM Identity Center 單一登入字符搭配使用,以取得開發套件用於呼叫的臨時登入資料之詳細資訊 AWS 服務。

      注意

      credentialsconfig 檔案由 AWS SDKs和工具共用。如需詳細資訊,請參閱 SDK 和工具參考指南中的 .aws/credentials 和 .aws/config 檔案。 AWS SDKs

    • 由於共用 credentialsconfig 檔案中的設定檔可以包含許多不同的設定集,因此ProfileCredentialsProvider委派給一系列其他供應商,以在[default]設定檔下尋找設定:

      • 基本登入資料 (類別 StaticCredentialsProvider):當設定檔包含 aws_access_key_id和 時aws_secret_access_key

      • 工作階段登入資料 (類別 StaticSessionCredentialsProvider):當設定檔包含 aws_access_key_idaws_secret_access_key和 時aws_session_token

      • 處理登入資料 (類別 ProcessCredentialsProvider):當設定檔包含 時credential_process

      • SSO 登入資料 (類別 SsoCredentialsProvider):當設定檔包含 SSO 相關屬性時,例如 sso_role_namesso_account_id

      • Web 身分字符登入資料 (類別 WebIdentityTokenCredentialsProvider):當設定檔包含 role_arn和 時web_identity_token_file

      • 具有來源描述檔的角色型登入資料 (類別 StsAssumeRoleCredentialsProvider):當描述檔包含 role_arn和 時source_profile

      • 具有登入資料來源的角色型登入資料 (類別 StsAssumeRoleWithSourceCredentialsProvider):當設定檔包含 role_arn和 時credential_source

        • credential_source = Environment:它使用 SystemPropertyCredentialsProvider和 的鏈 EnvironmentVariableCredentialsProvider

        • credential_source = Ec2InstanceMetadata:它使用 InstanceProfileCredentialsProvider

        • credential_source = EcsContainer:它使用 ContainerCredentialsProvider

  5. Amazon ECS 容器憑證

    • SDK 使用 ContainerCredentialsProvider 類別,使用以下環境變數載入臨時憑證:

      1. AWS_CONTAINER_CREDENTIALS_RELATIVE_URIAWS_CONTAINER_CREDENTIALS_FULL_URI

      2. AWS_CONTAINER_AUTHORIZATION_TOKEN_FILEAWS_CONTAINER_AUTHORIZATION_TOKEN

    ECS 容器代理程式會自動設定 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI環境變數,指向 ECS 登入資料端點。其他環境變數通常會在不使用標準 ECS 登入資料端點的特定案例中設定。

  6. Amazon EC2 執行個體 IAM 角色提供的登入資料

  7. 如果軟體開發套件無法透過上述所有步驟找到必要的組態設定,則會擲回例外狀況,其輸出類似如下:

    software.amazon.awssdk.core.exception.SdkClientException: Unable to load credentials from any of the providers in the chain AwsCredentialsProviderChain(credentialsProviders=[SystemPropertyCredentialsProvider(), EnvironmentVariableCredentialsProvider(), WebIdentityTokenCredentialsProvider(), ProfileCredentialsProvider(), ContainerCredentialsProvider(), InstanceProfileCredentialsProvider()])

在程式碼DefaultCredentialsProvider中使用

您可以在程式碼中明確使用預設登入資料提供者鏈結。這功能等同於您完全不指定登入資料提供者,因為 SDK DefaultCredentialsProvider 預設會使用 。不過,明確使用它可以讓您的程式碼更易於讀取和自我記錄。它清楚地顯示您使用預設登入資料鏈的意圖。

import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; public class ExplicitDefaultCredentialsExample { public static void main(String[] args) { // Explicitly create the DefaultCredentialsProvider. DefaultCredentialsProvider defaultCredentialsProvider = DefaultCredentialsProvider .builder().build(); // Use it with any service client. S3Client s3Client = S3Client.builder() .region(Region.US_WEST_2) .credentialsProvider(defaultCredentialsProvider) .build(); // Now you can use the client with the default credentials chain. s3Client.listBuckets(); } }

當您建置預設登入資料提供者時,您可以提供更多組態:

DefaultCredentialsProvider customizedProvider = DefaultCredentialsProvider.builder() .profileName("custom-profile") // Use a specific profile if the chain gets to the `ProfileCredentialsProvider` stage. .asyncCredentialUpdateEnabled(true) // Enable async credential updates. .build();

此方法可讓您擁有更多控制權,同時仍提供預設登入資料鏈的便利性。