すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:Java 用 OSS SDK のアクセス認証情報を構成する

最終更新日:Mar 05, 2025

Java 用 Object Storage Service (OSS) SDK を使用してリクエストを開始するには、ID とアクセス権限を確認するために使用されるアクセス認証情報を構成する必要があります。認証と承認の要件に基づいて、さまざまな種類のアクセス認証情報を選択できます。

使用上の注意

認証情報プロバイダーの初期化

OSS は、認証情報プロバイダーを初期化するための複数のメソッドをサポートしています。実際の認証と承認の要件に基づいて、適切なメソッドを選択できます。

初期化メソッド

シナリオ

必要な AccessKey ペアまたは STS トークン

基盤となる認証情報

認証情報の有効期間

認証情報のローテーションまたは更新方法

RAM ユーザーの AccessKey ペアを使用する

アプリケーションは、外部攻撃に対して脆弱ではない安全で安定した環境にデプロイおよび実行され、頻繁な認証情報のローテーションなしでクラウドサービスへの長期アクセスを必要とします。

はい

AccessKey ペア

長期

手動ローテーション

STS によって提供される一時的なアクセス認証情報を使用する

アプリケーションは信頼されていない環境にデプロイおよび実行され、認証情報の有効期間とアクセスできるリソースを管理したいと考えています。

はい

Security Token Service (STS) トークン

一時的

手動更新

RAM ロールの ARN を使用する

アプリケーションは、アカウント間のアクセスなど、クラウドサービスへのアクセスを必要とします。

はい

Security Token Service (STS) トークン

一時的

自動更新

ECS インスタンスの RAM ロールを使用する

アプリケーションは、Elastic Compute Service (ECS) インスタンス、Elastic Container Instance、または Container Service for Kubernetes (ACK) ワーカーノードにデプロイおよび実行されます。

いいえ

Security Token Service (STS) トークン

一時的

自動更新

OIDC IdP の RAM ロールを使用する

信頼されていないアプリケーションは、ACK ワーカーノードにデプロイおよび実行されます。

いいえ

Security Token Service (STS) トークン

一時的

自動更新

Function Compute のコンテキストで Credentials パラメーターを使用する

アプリケーションの関数は、Function Compute にデプロイおよび実行されます。

いいえ

Security Token Service (STS) トークン

一時的

更新不要

認証情報 URI を使用する

アプリケーションは、外部システムからのアクセス認証情報を必要とします。

いいえ

Security Token Service (STS) トークン

一時的

自動更新

自動的にローテーションされる AccessKey ペアを使用する

アプリケーションは、AccessKey ペアの漏洩のリスクが高い環境にデプロイされ、クラウドサービスへの長期アクセスを得るためにアクセス認証情報の頻繁なローテーションを必要とします。

いいえ

AccessKey ペア

長期

自動ローテーション

カスタムアクセス認証情報を使用する

上記のいずれのメソッドも要件を満たしていない場合は、カスタムメソッドを使用してアクセス認証情報を取得できます。

カスタム

カスタム

カスタム

カスタム

デフォルトの認証情報プロバイダーチェーンを使用する

Credentials クライアントを初期化する方法を指定しない場合、デフォルトの認証情報プロバイダーチェーンが使用されます。

いいえ

カスタム

カスタム

自動更新

一般的なシナリオの構成例

RAM ユーザーの AccessKey ペアを使用する

アプリケーションがアクセス認証情報を頻繁にローテーションすることなく OSS への長期アクセスを必要とし、外部攻撃に対して脆弱ではない安全で安定した環境で実行されているとします。この場合、Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey シークレット) を使用して、認証情報プロバイダーを初期化できます。このメソッドでは、AccessKey ペアを手動で管理する必要があることに注意してください。これにより、セキュリティリスクが発生し、メンテナンスの複雑さが増します。

警告
  • Alibaba Cloud アカウントは、そのリソースに対するすべての権限を持っており、AccessKey ペアの漏洩は重大なセキュリティリスクをもたらします。したがって、最小限の必要な権限を持つ RAM ユーザーの AccessKey ペアを使用して、認証情報プロバイダーを初期化することをお勧めします。

  • RAM ユーザーの AccessKey ペアを作成する方法については、「RAM ユーザーの AccessKey ペアを作成する」をご参照ください。RAM ユーザーの AccessKey ペアは、RAM ユーザーの作成時にのみ表示されます。 AccessKey ペアをタイムリーに保存してください。 AccessKey ペアを忘れた場合は、ローテーションのために新しい AccessKey ペアを作成します。

環境変数

  1. RAM ユーザーの AccessKey ペアの環境変数を構成します。

    Linux
    1. CLI で次のコマンドを実行して、環境変数の構成を ~/.bashrc ファイルに追加します。

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. 次のコマンドを実行して変更を適用します。

      source ~/.bashrc
    3. 次のコマンドを実行して、環境変数が有効になっているかどうかを確認します。

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET
    macOS
    1. ターミナルで次のコマンドを実行して、デフォルトのシェルタイプを表示します。

      echo $SHELL
    2. デフォルトのシェルタイプに基づいて環境変数を構成します。

      Zsh
      1. 次のコマンドを実行して、環境変数の構成を ~/.zshrc ファイルに追加します。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. 次のコマンドを実行して変更を適用します。

        source ~/.zshrc
      3. 次のコマンドを実行して、環境変数が有効になっているかどうかを確認します。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
      Bash
      1. 次のコマンドを実行して、環境変数の構成を ~/.bash_profile ファイルに追加します。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. 次のコマンドを実行して変更を適用します。

        source ~/.bash_profile
      3. 次のコマンドを実行して、環境変数が有効になっているかどうかを確認します。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
    Windows
    CMD
    1. CMD で次のコマンドを実行します。

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. 次のコマンドを実行して、環境変数が有効になっているかどうかを確認します。

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%
    PowerShell
    1. PowerShell で次のコマンドを実行します。

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. 次のコマンドを実行して、環境変数が有効になっているかどうかを確認します。

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
  2. 設定が読み込まれていることを確認するために、IDE、コマンドラインツール、デスクトップアプリケーション、バックグラウンドのサービスなど、コンパイル環境とランタイム環境を再起動または更新します。

  3. 環境変数を使用して認証情報を渡します。

    import com.aliyun.oss.common.auth.CredentialsProviderFactory;
    import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
    
    public class AkDemoTest {
        public static void main(String[] args) throws Exception {
            // 環境変数からアクセス認証情報を取得します。
            EnvironmentVariableCredentialsProvider credentialsProvider =  CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // 後続の操作に credentialsProvider を使用します。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);   
            // OSSClient インスタンスを作成します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
                    
            ossClient.shutdown();
        }
    }

静的認証情報

コード内の変数を使用して認証情報を定義できます。コードの実行中に、これらの変数には、環境変数、構成ファイル、またはその他の外部の場所から取得された実際の認証情報の値が設定されます。

次の手順では、構成ファイルを使用して認証情報を提供する方法について説明します。

  1. config.ini という名前の構成ファイルを作成します。

    [credentials]
    alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID>
    alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET>
  2. 構成ファイルを使用して認証情報を渡します。

    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentialProvider;
    import java.io.FileInputStream;
    import java.util.Properties;
    
    public class AkDemoTest {
        public static void main(String[] args) throws Exception {
            Properties properties = new Properties();
            // 構成ファイルのパスを指定します。
            String configFilePath = "config.ini";
    
            // 構成ファイルを読み取ります。
            FileInputStream input = new FileInputStream(configFilePath);
            properties.load(input);
            input.close();
    
            // 構成ファイルから AccessKey ペアを取得します。
            String accessKeyId = properties.getProperty("alibaba_cloud_access_key_id");
            String accessKeySecret = properties.getProperty("alibaba_cloud_access_key_secret");
            
            // AccessKey ID と AccessKey シークレットを出力して、読み取られているかどうかを確認します。
            System.out.println("Access Key ID: " + accessKeyId);
            System.out.println("Access Key Secret: " + accessKeySecret);
            
            // AccessKey ID とシークレットを DefaultCredentialProvider に渡して、認証情報プロバイダーを初期化します。
            CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
    
            // credentialsProvider を使用してクライアントを初期化します。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // V4 署名アルゴリズムの使用を明示的に宣言します。
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // OSSClient インスタンスを作成します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
    
        }
    }

STS によって提供される一時的なアクセス認証情報を使用する

アプリケーションが OSS に一時的にアクセスする必要がある場合は、STS によって提供される一時的なアクセス認証情報を使用できます。これは、AccessKey ペアと STS トークンで構成されます。このメソッドでは、STS トークンを手動で管理する必要があることに注意してください。これにより、セキュリティリスクが発生し、メンテナンスの複雑さが増します。既存の STS トークンの有効期限が切れた後にアクセスを延長する場合は、STS トークンを手動で更新する必要があります。

重要
  • AssumeRole API オペレーションを呼び出すことによって、一時的なアクセス認証情報を取得できます。詳細については、「AssumeRole」をご参照ください。

  • SDK を使用して一時的なアクセス認証情報を取得することもできます。詳細については、「STS によって提供される一時的なアクセス認証情報を使用して OSS にアクセスする」をご参照ください。

  • トークンを生成するときに、STS トークンの有効期間を指定する必要があります。期限切れの STS トークンは使用できません。

  • STS エンドポイントの一覧については、「エンドポイント」をご参照ください。

環境変数

  1. 一時的なアクセス認証情報の環境変数を構成します。

    Mac OS X/Linux/Unix

    警告
    • RAM ユーザーの AccessKey ID と AccessKey シークレットの代わりに、STS によって提供される一時的なアクセス認証情報 (AccessKey ID、AccessKey シークレット、STS トークン) が使用されることに注意してください。

    • STS によって提供される AccessKey ID は、STS で始まります。例: STS.L4aBSCSJVMuKg5U1****。

    export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>

    Windows

    警告
    • RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey シークレット) の代わりに、STS によって提供される一時的なアクセス認証情報 (AccessKey ID、AccessKey シークレット、STS トークン) が使用されることに注意してください。

    • STS によって提供される AccessKey ID は、STS で始まります。例: STS.L4aBSCSJVMuKg5U1****。

    set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
  2. 環境変数を使用して認証情報を渡します。

    import com.aliyun.oss.common.auth.CredentialsProviderFactory;
    import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
    
    public class StsDemoTest {
        public static void main(String[] args) throws Exception {
            // 環境変数からアクセス認証情報を取得します。
            EnvironmentVariableCredentialsProvider credentialsProvider =  CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            
            // credentialsProvider を使用してクライアントを初期化します。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // V4 署名アルゴリズムの使用を明示的に宣言します。
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // OSSClient インスタンスを作成します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

静的認証情報

アプリケーションに認証情報をハードコーディングして、OSS へのアクセスに使用する AccessKey ペアを明示的に指定できます。

import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;

public class StsDemoTest {
    public static void main(String[] args) throws Exception {
        // RAM ユーザーの AccessKey ID と AccessKey シークレットではなく、STS によって提供される AccessKey ID、AccessKey シークレット、および STS トークンを指定します。
        // STS によって提供される AccessKey ID は、STS で始まります。
        String accessKeyId = "STS.NTZdStF79CVRTQuWCfXTT****";
        String accessKeySecret = "5rm8PfEiK8enp56zzAMX4RbZUraoKbWXvCf1xAuT****";
        String stsToken= "********";
        
        // AccessKey ID とシークレットを DefaultCredentialProvider に渡して、認証情報プロバイダーを初期化します。
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);

        // credentialsProvider を使用してクライアントを初期化します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズムの使用を明示的に宣言します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
        // OSSClient インスタンスを作成します。
        OSS ossClient = OSSClientBuilder.create()
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("region")
                .build();

        ossClient.shutdown();
    }
}

その他のシナリオの構成例

RAM ロールの ARN を使用する

クロスアカウントアクセスシナリオなどで、アプリケーションに OSS へのアクセスを承認する必要がある場合は、RAM ロールの Alibaba Cloud Resource Name (ARN) を使用して認証情報プロバイダーを初期化できます。このメソッドの基盤となるロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。Credentials ツールは、RAM ロールの ARN に基づいて STS トークンを取得し、セッションの有効期限が切れる前に AssumeRole オペレーションを呼び出すことによって STS トークンを更新します。policy を指定して、RAM ロールに付与される権限を制限できます。

重要
  • Alibaba Cloud アカウントは、そのリソースに対するすべての権限を持っており、AccessKey ペアの漏洩は重大なセキュリティリスクをもたらします。したがって、最小限の必要な権限を持つ RAM ユーザーの AccessKey ペアを使用して、認証情報プロバイダーを初期化することをお勧めします。

  • RAM ユーザーの AccessKey ペアを作成する方法については、「RAM ユーザーの AccessKey ペアを作成する」をご参照ください。RAM ユーザーの AccessKey ペアは、RAM ユーザーの作成時にのみ表示されます。 AccessKey ペアをタイムリーに保存してください。 AccessKey ペアを忘れた場合は、ローテーションのために新しい AccessKey ペアを作成します。

  • CreateRole オペレーションを呼び出すことによって、RAM ロールを作成できます。RAM ロールの ARN はレスポンスに含まれています。詳細については、「CreateRole」をご参照ください。

  1. 認証情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. AccessKey ペアと RAM ロールの ARN をアクセス認証情報として使用します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    
    public class RamRoleArnAkDemoTest {
    
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // 認証情報タイプを ram_role_arn に設定します。
            config.setType("ram_role_arn");
            // アプリケーションにアシュームさせる RAM ロールの ARN を指定します。 ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して RAM ロールの ARN を指定できます。例: acs:ram::123456789012****:role/adminrole。
            config.setRoleArn("<RoleArn>");
            // 環境変数から AccessKey ID を取得します。
            config.setAccessKeyId(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_ID"));
            // 環境変数から AccessKey シークレットを取得します。
            config.setAccessKeySecret(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // ロールセッション名を指定します。 ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数から値を取得できます。
            config.setRoleName("<RoleSessionName>");
            // (オプション)RAM ロールの制限付き権限を指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
            config.setPolicy("<Policy>");
            // (オプション) ロールセッションの有効期間を指定します。
            config.setRoleSessionExpiration(3600);
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // credentialsProvider を使用してクライアントを初期化します。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // V4 署名アルゴリズムの使用を明示的に宣言します。
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // OSSClient インスタンスを作成します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

ECS インスタンスの RAM ロールを使用する

アプリケーションが ECS インスタンス、Elastic Container Instance、または ACK ワーカーノードで実行されている場合は、ECS インスタンスの RAM ロールを使用して認証情報プロバイダーを初期化することをお勧めします。このメソッドの基盤となるロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。RAM ロールを ECS インスタンス、Elastic Container Instance、または ACK ワーカーノードにアタッチして、インスタンスの STS トークンを自動的に更新できます。このメソッドでは、AccessKey ペアまたは STS トークンは必要ないため、これらの認証情報の手動管理に関連するリスクがなくなります。 CreateRole オペレーションを呼び出すことによって、RAM ロールを作成できます。ARN はレスポンスに含まれています。詳細については、「CreateRole」をご参照ください。RAM ロールを ECS インスタンスにアタッチする方法については、「インスタンス RAM ロール」をご参照ください。

  1. 認証情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. RAM ロールを使用してアクセス認証情報を提供します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    
    public class EcsRamRoleDemoTest {
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // 認証情報タイプを ecs_ram_role に設定します。
            config.setType("ecs_ram_role");
            // ECS インスタンスにアタッチされている RAM ロールの名前を指定します。
            config.setRoleName("<RoleName>");
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // credentialsProvider を使用してクライアントを初期化します。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // V4 署名アルゴリズムの使用を明示的に宣言します。
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // OSSClient インスタンスを作成します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

OIDC IdP の RAM ロールを使用する

RAM ロールが ACK ワーカーノードで構成されると、そのノードのポッド内のアプリケーションは、ECS インスタンスにデプロイされたアプリケーションと同様に、メタデータサーバーを使用してアタッチされたロールの STS トークンを取得できます。ただし、アプリケーションコードを開示せずに顧客が送信したアプリケーションなど、信頼されていないアプリケーションが、ワーカーノードにアタッチされた RAM ロールの STS トークンを取得するためにメタデータサーバーにアクセスすることを許可したくない場合があります。クラウドリソースのセキュリティを確保し、信頼されていないアプリケーションが必要な STS トークンを安全に取得できるようにし、アプリケーションレベルの権限を最小限に抑えるには、サービスアカウントの RAM ロール (RRSA) 機能を使用できます。このメソッドの基盤となるロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。ACK は、さまざまなアプリケーションポッドに対応する OpenID Connect (OIDC) トークンファイルを作成およびマウントし、関連する構成情報を環境変数に渡します。Credentials ツールは、環境変数から構成情報を取得し、STS の AssumeRoleWithOIDC オペレーションを呼び出して、アタッチされたロールの STS トークンを取得します。このメソッドでは、AccessKey ペアまたは STS トークンは必要ないため、これらの認証情報の手動管理に関連するリスクがなくなります。詳細については、「RRSA を使用してさまざまなポッドにさまざまなクラウドサービスへのアクセスを承認する」をご参照ください。

  1. 認証情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  1. OIDC IdP の RAM ロールを使用してアクセス認証情報を提供します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    
    public class OidcRoleArnDemoTest {
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // 認証情報タイプを oidc_role_arn に設定します。
            config.setType("oidc_role_arn");
            // RAM ロールの ARN を指定します。 ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して指定できます。
            config.setRoleArn("<RoleArn>");
            // OIDC IdP の ARN を指定します。 ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数から値を取得できます。
            config.setOidcProviderArn("<OidcProviderArn>");
            // OIDC トークンファイルのパスを指定します。 ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数から値を取得できます。
            config.setOidcTokenFilePath("<OidcTokenFilePath>");
            // ロールセッション名を指定します。 ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数から値を取得できます。
            config.setRoleSessionName("<RoleSessionName>");
            // (オプション) RAM ロールの制限付き権限を指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
            config.setPolicy("<Policy>");
            // セッションの有効期間を指定します。
            config.setRoleSessionExpiration(3600);
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // credentialsProvider を使用してクライアントを初期化します。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // V4 署名アルゴリズムの使用を明示的に宣言します。
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // OSSClient インスタンスを作成します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

Function Compute のコンテキストで Credentials を使用する

アプリケーションの関数が Function Compute にデプロイおよび実行されている場合は、Function Compute コンテキストの Credentials を使用して認証情報プロバイダーを初期化できます。このメソッドの基盤となるロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。Function Compute は、関数に構成されているロールに基づいてサービスロールをアシュームすることによって、STS トークンを取得します。次に、STS トークンはコンテキストの Credentials を使用してアプリケーションに渡されます。STS トークンは 36 時間有効です。有効期間を変更することはできません。関数は最大 24 時間実行できます。関数の有効期限が切れるまで有効であるため、関数の実行中に STS トークンを更新する必要はありません。このメソッドでは、AccessKey ペアまたは STS トークンは必要ないため、これらの認証情報の手動管理に関連するリスクがなくなります。Function Compute に OSS へのアクセスを承認する方法の詳細については、「Function Compute に他の Alibaba Cloud サービスにアクセスするための権限を付与する」をご参照ください。

  1. Function Compute コンテキストの依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun.fc.runtime/fc-java-core -->
    <dependency>
        <groupId>com.aliyun.fc.runtime</groupId>
        <artifactId>fc-java-core</artifactId>
        <version>1.4.1</version>
    </dependency>
  2. Function Compute コンテキストの Credentials を使用して認証情報プロバイダーを初期化します。

    package example;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import com.aliyun.fc.runtime.Context;
    import com.aliyun.fc.runtime.Credentials;
    import com.aliyun.fc.runtime.StreamRequestHandler;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentialProvider;
    
    public class App implements StreamRequestHandler {
    
        @Override
        public void handleRequest(
            InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
    
            // 主要な情報を取得します。関数を実行する前に、関数が属するサービスのロールが構成されており、そのロールに OSS にアクセスするために必要な権限があることを確認してください。AliyunFCDefaultRole ロールを使用することをお勧めします。
            Credentials creds = context.getExecutionCredentials();
    
            // 取得した認証情報を使用して、認証情報プロバイダーインスタンスを作成します。
            CredentialsProvider credentialsProvider = new DefaultCredentialProvider(creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken());
    
            // credentialsProvider を使用してクライアントを初期化します。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // V4 署名アルゴリズムの使用を明示的に宣言します。
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // OSSClient インスタンスを作成します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
    
            outputStream.write(new String("done").getBytes());
        }
    }

認証情報 URI を使用する

アプリケーションが外部システムから Alibaba Cloud 認証情報を取得して柔軟な認証情報管理とキーレスアクセスを実装する必要がある場合は、CredentialsURI を使用して認証情報プロバイダーを初期化できます。このメソッドの基盤となるロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。Credentials ツールは、指定された URI を使用してクライアントを初期化することによって、STS トークンを取得します。このメソッドでは、AccessKey ペアまたは STS トークンは必要ないため、これらの認証情報の手動管理に関連するリスクがなくなります。

重要
  • CredentialsURI は、STS トークンを生成するサーバーのアドレスを指すことに注意してください。

  • 認証情報 URI レスポンスを提供するバックエンドサービスは、アプリケーションが常に有効な認証情報を取得できるように、STS トークンを自動的に更新する必要があります。

  1. Credentials ツールが STS トークンを正しく解析して使用できるようにするには、URI が次の要件に準拠している必要があります。

    • レスポンスステータスコード: 200

    • レスポンスボディ構造:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2021-09-26T03:46:38Z",
          "SecurityToken": "SecurityToken"
      }
  2. 認証情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  3. アクセス認証情報として認証情報 URI を構成します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    
    public class CredentialsUriDemoTest {
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // 認証情報タイプを credentials_uri に設定します。
            config.setType("credentials_uri");
            // 認証情報 URI を指定します。URI は、http://local_or_remote_uri/ 形式の STS トークンを生成するサーバーのアドレスです。 ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を使用して URI を指定できます。
            config.setCredentialsUri("<CredentialsUri>");
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // credentialsProvider を使用してクライアントを初期化します。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // V4 署名アルゴリズムの使用を明示的に宣言します。
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // OSSClient インスタンスを作成します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

自動的にローテーションされる AccessKey ペアを使用する

アプリケーションが OSS に長期アクセスする必要がある場合は、認証情報の漏洩リスクを軽減するために、AccessKey ペアを手動でローテーションする必要があります。この場合、クライアントキーを使用して認証情報プロバイダーを初期化できます。このメソッドの基盤となるロジックは、AccessKey ペアを使用して OSS リソースにアクセスすることです。クライアントキーを使用すると、Key Management Service (KMS) は管理対象 RAM ユーザーの AccessKey ペアを自動的かつ定期的にローテーションし、RAM ユーザーの静的 AccessKey ペアを動的に変更できます。これにより、AccessKey ペアの漏洩のリスクが軽減されます。KMS は、漏洩した AccessKey ペアを迅速に無効にするための即時ローテーションもサポートしています。これにより、AccessKey ペアを手動で管理する必要がなくなり、セキュリティリスクとメンテナンスの複雑さが軽減されます。クライアントキーの取得方法の詳細については、「AAP を作成する」をご参照ください。

  1. 認証情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/alibabacloud-secretsmanager-client -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>alibabacloud-secretsmanager-client</artifactId>
        <version>1.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.7.0</version>
    </dependency>
  2. secretsmanager.properties という名前の構成ファイルを作成します。

    # 認証情報タイプを client_key に設定します。
    credentials_type=client_key
    
    # クライアントキーの復号化パスワードを指定します。復号化パスワードは、環境変数またはファイルから読み取ることができます。
    client_key_password_from_env_variable=<クライアントキーの秘密キーのパスワードの環境変数名>
    client_key_password_from_file_path=<クライアントキーの秘密キーのパスワードのファイルパス>
    
    # クライアントキーの秘密キーファイルのパスを指定します。
    client_key_private_key_path=<クライアントキーの秘密キーのファイルパス>
    
    # KMS を使用するリージョンの ID を指定します。
    cache_client_region_id=[{"regionId":"<regionId>"}]
  3. 構成ファイルを使用して認証情報を渡します。

    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyuncs.kms.secretsmanager.client.SecretCacheClient;
    import com.aliyuncs.kms.secretsmanager.client.SecretCacheClientBuilder;
    import com.aliyuncs.kms.secretsmanager.client.exception.CacheSecretException;
    import com.aliyuncs.kms.secretsmanager.client.model.SecretInfo;
    import org.codehaus.jettison.json.JSONException;
    import org.codehaus.jettison.json.JSONObject;
    
    public class ClientKeyDemoTest {
        public static void main(String[] args) throws CacheSecretException {
            final SecretCacheClient client = SecretCacheClientBuilder.newClient();
            CredentialsProvider credentialsProvider = new CredentialsProvider() {
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    try {
                        SecretInfo secretInfo = client.getSecretInfo("<secretName>");
                        JSONObject jsonObject = new JSONObject(secretInfo.getSecretValue());
    
                        String accessKeyId = jsonObject.getString("AccessKeyId");
                        String accessKeySecret = jsonObject.getString("AccessKeySecret");
    
                        return new DefaultCredentials(accessKeyId, accessKeySecret);
                    } catch (CacheSecretException | JSONException e) {
                        return null;
                    }
                }
            };
            // credentialsProvider を使用してクライアントを初期化します。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // V4 署名アルゴリズムの使用を明示的に宣言します。
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // OSSClient インスタンスを作成します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }
    

カスタムアクセス認証情報を使用する

上記のいずれのメソッドも要件を満たしていない場合は、CredentialsProvider オペレーションを呼び出すことによって、カスタムメソッドを指定してアクセス認証情報を取得できます。基盤となる実装が STS トークンに基づいている場合は、認証情報の更新サポートを提供する必要があることに注意してください。

import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentials;

public class CustomCredentialProviderDemoTest {

    public static void main(String[] args) {

        CredentialsProvider credentialsProvider = new CredentialsProvider(){

            // 変数を初期化します。
            String accessKeyId = null;
            // 変数を初期化します。
            String accessKeySecrect = null;
            // 変数を初期化します。
            // String token = null;

            @Override
            public void setCredentials(Credentials credentials) {
            }

            @Override
            public Credentials getCredentials() {
                //TODO
                // カスタムメソッドを指定してアクセス認証情報を取得します。

                // AccessKey ID と AccessKey シークレットで構成される長期アクセス認証情報を返します。
                return new DefaultCredentials(accessKeyId, accessKeySecrect);

                // AccessKey ID、AccessKey シークレット、および STS トークンで構成される一時的なアクセス認証情報を返します。
                // 有効期限に基づいて一時的なアクセス認証情報を更新します。
                // return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
            }
        };
        // credentialsProvider を使用してクライアントを初期化します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズムの使用を明示的に宣言します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
        // OSSClient インスタンスを作成します。
        OSS ossClient = OSSClientBuilder.create()
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("region")
                .build();

        ossClient.shutdown();
    }
}

デフォルトの認証情報プロバイダーチェーンを使用する

Credentials クライアントを初期化する方法を指定しない場合、デフォルトの認証情報プロバイダーチェーンが使用されます。詳細については、「デフォルトの認証情報プロバイダーチェーン」をご参照ください。

  1. 認証情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. Credentials を使用してアクセス認証情報を提供します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.*;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    
    public class Demo {
        public static void main(String[] args) {
            com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client();
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // V4 署名アルゴリズムの使用を明示的に宣言します。
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // credentialsProvider を使用してクライアントを初期化します。
            // OSSClient インスタンスを作成します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
            ossClient.shutdown();
        }
    }

FAQ

認証情報プロバイダーを初期化するときに、STS によって提供される一時的なアクセス認証情報と RAM ユーザーの AccessKey ペアをどのように区別できますか?

STS から取得した一時的なアクセス認証情報 (AccessKey ID、AccessKey シークレット、STS トークン) を使用して認証情報プロバイダーを初期化する場合、STS によって返される AccessKey ID と RAM ユーザーの AccessKey ID を混同しないでください。STS から取得した AccessKey ID は、STS で始まります。例:

image

RAM ユーザーの AccessKey ID を表示するにはどうすればよいですか? AccessKey ペアの AccessKey シークレットを表示できますか?

  1. RAM ユーザーの AccessKey ペアに関する情報を表示する」で説明されている手順に従って、RAM ユーザーの AccessKey ペアを表示できます。

  2. RAM ユーザーの AccessKey シークレットは、AccessKey ペアの作成時にのみ表示されます。後で AccessKey ペアを表示することはできません。 AccessKey シークレットを忘れた場合は、AccessKey シークレットを取得できません。この場合、[RAM コンソール] でローテーションのために新しい AccessKey ペアを直接作成できます。詳細については、「AccessKey ペアを作成する」をご参照ください。

RAM ユーザーの AccessKey ペアを使用してファイルをアップロードするときに発生する AccessDenied エラーを修正するにはどうすればよいですか?

AccessDenied エラーは通常、間違った AccessKey ペアまたはアップロード権限の不足の 2 つの理由で発生します。 AccessDenied エラーのトラブルシューティングを行うには、次の手順を実行します。

  1. RAM ユーザーの AccessKey ペアに関する情報を表示する」で説明されている手順に従って、提供された AccessKey ペアが正しいかどうかを確認します。

  2. RAM ユーザーの AccessKey シークレットは、AccessKey ペアの作成時にのみ表示されます。後で AccessKey ペアを表示することはできません。 AccessKey シークレットを忘れた場合は、AccessKey シークレットを取得できません。この場合、[RAM コンソール] でローテーションのために新しい AccessKey ペアを直接作成できます。詳細については、「AccessKey ペアを作成する」をご参照ください。

  3. [RAM コンソール] で、RAM ユーザーに OSS にファイルをアップロードする権限があるかどうかを確認します。ない場合は、必要な権限を付与します。

パブリック OSS エンドポイントを使用して OSS にアクセスするときに接続エラーを修正するにはどうすればよいですか?

パブリックエンドポイント経由で OSS にアクセスするときに接続エラーが発生した場合は、エンドポイントが正しくないことが原因である可能性があります。エラーを修正するには、次の確認を実行します。

  1. OSS コンソールでバケットのリージョンを確認します。

  2. 指定されたエンドポイントがリージョンに対して正しいものであるかどうかを確認します。たとえば、バケットが China (杭州) リージョンにある場合は、oss-cn-hangzhou.aliyuncs.com エンドポイントを使用してパブリックネットワークアクセスを有効にします。OSS エンドポイントの一覧については、「リージョンとエンドポイント」をご参照ください。

  3. お使いの環境がインターネットに接続できるかどうかを確認します。

エラーが報告された場合、エラーのタイプを特定するにはどうすればよいですか?

OSS は、エラーの特定のタイプを特定するのに役立つ エラーコード を提供します。たとえば、一般的な認証エラーについては、02-AUTH を参照できます。