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

Object Storage Service:OSS SDK for Java 1.0

最終更新日:Oct 30, 2025

Github | OSS SDK for Java API | mvnrepository

クイック統合

OSS SDK for Java 1.0 を迅速に統合するには、次の手順に従います。

環境準備

Java 7 以降をインストールする必要があります。java -version コマンドを実行して Java のバージョンを表示します。Java がインストールされていない場合、またはバージョンが Java 7 より前の場合は、Java をダウンロードしてください。

SDK のインストール

開発環境に基づいてインストール方法を選択します。サンプルコードが期待どおりに実行されるようにするには、OSS SDK for Java 1.0 の最新バージョンを使用してください。

次のセクションでは、OSS SDK for Java 1.0 3.17.4 のインストールを例として使用します。

Maven 依存関係の追加 (推奨)

Maven プロジェクトで OSS SDK for Java 1.0 を使用するには、対応する依存関係を pom.xml ファイルに追加します。

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>

Java 9 以降を使用する場合は、次の JAXB 関連の依存関係を追加します。

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

JAR パッケージを Eclipse プロジェクトにインポートする

  1. OSS SDK for Java 1.0 をダウンロードします

  2. パッケージを解凍します。

  3. 解凍したパッケージの lib フォルダから aliyun-sdk-oss-3.17.4.jar ファイルとすべてのファイルをプロジェクトにコピーします。

  4. Eclipse でプロジェクトを選択して右クリックし、[プロパティ] > [Java ビルド・パス] > [JAR の追加] を選択します。

  5. コピーしたすべての JAR ファイルを選択し、ライブラリにインポートします。

JAR パッケージを IntelliJ IDEA プロジェクトにインポートする

  1. OSS SDK for Java 1.0 をダウンロードします。

  2. パッケージを解凍します。

  3. 解凍したパッケージの lib フォルダから aliyun-sdk-oss-3.17.4.jar ファイルとすべての JAR ファイルをプロジェクトにコピーします。

  4. IntelliJ IDEA でプロジェクトを選択して右クリックし、[ファイル] > [プロジェクト構造] > [モジュール] > [依存関係] > [+] > [JAR またはディレクトリ] を選択します。

  5. コピーしたすべての JAR ファイルを選択し、外部ライブラリにインポートします。

アクセス資格情報の設定

RAM ユーザーの AccessKey ペアを使用してアクセス資格情報を設定します。

  1. RAM コンソールで、アクセスに [永続的な AccessKey ペア] を使用する RAM ユーザーを作成します。AccessKey ペアを保存し、ユーザーに AliyunOSSFullAccess 権限を付与します。

  2. RAM ユーザーの AccessKey ペアを使用して環境変数を設定します。

    Linux

    1. コマンドラインインターフェイスで次のコマンドを実行して、環境変数の設定を ~/.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)

クライアントの初期化

次のサンプルコードでは、中国 (杭州) リージョンのパブリックエンドポイントを使用してクライアントを初期化し、検証のためにそのリージョン内のバケットを一覧表示します。リージョンとエンドポイントの完全なリストについては、「リージョンとエンドポイント」をご参照ください。

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.Bucket;

import java.util.List;

/**
 * OSS SDK クイック統合の例
 * OSS クライアントを初期化し、すべてのバケットを一覧表示する方法を示します
 */
public class Test {

    public static void main(String[] args) {
        // 環境変数からアクセス資格情報を取得します
        String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");

        // OSS リージョンとエンドポイントを設定します
        String region = "cn-hangzhou";
        String endpoint = "oss-cn-hangzhou.aliyuncs.com";

        // 資格情報プロバイダーを作成します
        DefaultCredentialProvider provider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);

        // クライアントパラメーターを設定します
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズムの使用を明示的に宣言します
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);

        // OSS クライアントを初期化します
        OSS ossClient = OSSClientBuilder.create()
                .credentialsProvider(provider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .endpoint(endpoint)
                .build();

        // 現在のユーザーのすべてのバケットを一覧表示します
        List<Bucket> buckets = ossClient.listBuckets();
        System.out.println("Successfully connected to OSS. Buckets under the current account:");

        if (buckets.isEmpty()) {
            System.out.println("No buckets found under the current account.");
        } else {
            for (Bucket bucket : buckets) {
                System.out.println("- " + bucket.getName());
            }
        }

        // リソースを解放します
        ossClient.shutdown();
        System.out.println("OSS client has been shut down.");
    }
}

コードを実行すると、すべてのリージョンにある現在のアカウントのバケットが表示されます。

Successfully connected to OSS. Buckets under the current account:
- example-bucket
OSS client has been shut down.

クライアント設定

ClientConfiguration クラスを使用して、タイムアウト期間、リトライ、プロキシサーバーなど、OSSClient のパラメーターを設定します。

サポートされているクライアント設定を表示するにはクリックしてください

メソッド

説明

ClientConfiguration.setMaxConnections

許可されるオープン HTTP 接続の最大数を設定します。デフォルト値は 1024 です。

ClientConfiguration.setSocketTimeout

ソケットレイヤーでのデータ転送のタイムアウト期間をミリ秒単位で設定します。デフォルト値は 50000 ms です。

ClientConfiguration.setConnectionTimeout

接続を確立するためのタイムアウト期間をミリ秒単位で設定します。デフォルト値は 50000 ms です。

ClientConfiguration.setConnectionRequestTimeout

接続プールから接続を取得するためのタイムアウト期間をミリ秒単位で設定します。デフォルトでは、タイムアウトは設定されていません。

ClientConfiguration.setIdleConnectionTime

接続のアイドルタイムアウト期間をミリ秒単位で設定します。接続がこの期間を超えてアイドル状態になると、接続は閉じられます。デフォルト値は 60000 ms です。詳細については、「OSS Java SDK 1.0 のタイムアウト期間を設定する」をご参照ください。

ClientConfiguration.setSupportCname

CNAME レコードをエンドポイントとしてサポートするかどうかを指定します。CNAME はデフォルトでサポートされています。

ClientConfiguration.setCrcCheckEnabled

CRC チェックを有効にするかどうかを指定します。CRC チェックはデフォルトで有効になっています。

ClientConfiguration.setSLDEnabled

第 2 レベルドメイン経由のアクセスを有効にするかどうかを指定します。この機能はデフォルトで無効になっています。

ClientConfiguration.setProtocol

OSS への接続に使用されるプロトコル (HTTP または HTTPS)。デフォルトのプロトコルは HTTP です。

ClientConfiguration.setUserAgent

ユーザーエージェント。HTTP の User-Agent ヘッダーです。デフォルト値は aliyun-sdk-java です。

ClientConfiguration.setProxyHost

プロキシサーバーのホストアドレス。

ClientConfiguration.setProxyPort

プロキシサーバーのポート。

ClientConfiguration.setProxyUsername

プロキシサーバー認証のユーザー名。

ClientConfiguration.setProxyPassword

プロキシサーバー認証のパスワード。

ClientConfiguration.setRedirectEnable

HTTP リダイレクトを有効にするかどうかを指定します。

ClientConfiguration.setVerifySSLEnable

SSL 証明書検証を有効にするかどうかを指定します。

ClientConfiguration.setMaxErrorRetry

失敗したリクエストの最大リトライ回数。デフォルト値は 3 です。

ClientConfiguration.setRetryStrategy

カスタムリトライポリシーを設定します。このパラメーターの設定は推奨されません。

カスタムドメイン名の使用

デフォルトの OSS ドメイン名を使用すると、OSS のセキュリティポリシーが原因で、アクセス拒否やプレビューの失敗などの問題が発生する場合があります。OSS にアクセスするためにカスタムドメイン名をバインドすることで、これらのアクセス制限をバイパスして、直接的なファイルプレビューを有効にできます。また、CDN と統合してグローバルなコンテンツアクセラレーションを行い、ユーザーエクスペリエンスを向上させることもできます。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// CNAME オプションを有効にして、カスタムドメイン名によるアクセスをサポートします
clientBuilderConfiguration.setSupportCname(true);

OSS ossClient = new OSSClientBuilder()
    // 他の設定...      
    .clientConfiguration(clientBuilderConfiguration)
    // エンドポイントとしてカスタムドメイン名を使用します (例: https://static.example.com)
    .endpoint("https://static.example.com")
    .build();

内部エンドポイントの使用

アプリケーションが ECS や Container Service などの Alibaba Cloud サービスにデプロイされている場合は、内部エンドポイントを使用します。これにより、無料の内部データ転送、高速化、およびネットワークの安定性の向上が実現します。内部アクセスは、大規模なファイルのアップロード、バッチデータ処理、および高頻度のアクセスシナリオに最適です。コストを効果的に削減し、パフォーマンスを向上させます。リージョンと内部エンドポイントの完全なリストについては、「リージョンとエンドポイント」をご参照ください。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();

OSS ossClient = new OSSClientBuilder()
    // 他の設定...      
    .clientConfiguration(clientBuilderConfiguration)
    // 内部エンドポイントを使用します。例として中国 (杭州) リージョンを使用します。他のリージョンについては、実際のエンドポイントを指定してください。
    .endpoint("oss-cn-hangzhou-internal.aliyuncs.com")
    .build();

タイムアウト制御

ビジネスシナリオに基づいてタイムアウトパラメーターを設定します。大規模なファイル転送や不安定なネットワーク環境の場合は、タイムアウト期間を長くします。高同時実行性の軽量な操作の場合は、リソースを迅速に解放するために、より短いタイムアウト期間を設定します。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// 許可されるオープン HTTP 接続の最大数を設定します。デフォルトは 1024 です。
clientBuilderConfiguration.setMaxConnections(1024)
    // ソケットレイヤーでのデータ転送のタイムアウト期間をミリ秒単位で設定します。デフォルトは 50000 ms です。
    .setSocketTimeout(50000)
    // 接続を確立するためのタイムアウト期間をミリ秒単位で設定します。デフォルトは 50000 ms です。
    .setConnectionTimeout(50000)
    // 接続プールから接続を取得するためのタイムアウト期間をミリ秒単位で設定します。デフォルトでは、タイムアウト制限はありません。
    .setConnectionRequestTimeout(60 * 60 * 24 * 1000)
    // 接続のアイドルタイムアウト期間をミリ秒単位で設定します。接続がこの期間を超えてアイドル状態になると、接続は閉じられます。デフォルトは 60000 ms です。
    .setIdleConnectionTime(60000);

OSS ossClient = new OSSClientBuilder()
    // 他の設定...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

最大エラーリトライ回数

デフォルトでは、OSS クライアントは成功率を向上させるためにリクエストを 3 回リトライします。高同時実行性または不安定なネットワーク環境では、setMaxErrorRetry を使用してリトライ回数を増やします。これにより、サービスの可用性が大幅に向上します。ビジネスのレイテンシー許容度とネットワーク環境の品質に基づいて、リトライ回数を調整してください。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// 失敗したリクエストの最大リトライ回数を設定します。ネットワーク環境とビジネスニーズに基づいてこれを調整してください。
clientBuilderConfiguration.setMaxErrorRetry(5);

OSS ossClient = new OSSClientBuilder()
    // 他の設定...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

リトライポリシー

カスタムポリシーは予期しない動作を引き起こし、サービスの安定性に影響を与える可能性があるため、setRetryStrategy を使用してカスタムリトライポリシーを設定しないでください。OSS クライアントは、さまざまなリクエストタイプに対して実績のあるリトライポリシーを使用します。

  • POST リクエスト: 繰り返しの送信によるデータ不整合を避けるため、デフォルトではリトライされません。

  • 非 POST リクエスト: 次の条件が満たされた場合、最大 3 回リトライされます。

    • 次のいずれかのエラーコードで ClientException が発生した場合: ConnectionTimeoutSocketTimeoutConnectionRefusedUnknownHost、または SocketException

    • InvalidResponse 以外のエラーコードで OSSException が発生した場合。

    • HTTP ステータスコード 500、502、または 503 で一時的なサーバー側エラーが発生した場合。

プロキシサーバー

企業のネットワーク環境では、セキュリティ目的で外部リソースにアクセスするためにプロキシサーバーがよく使用されます。プロキシサーバーを設定すると、OSS クライアントは指定されたプロキシを介してすべての HTTP リクエストを転送し、OSS への安全なアクセスを確保します。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();

// ユーザーエージェントを設定します。これは HTTP の User-Agent ヘッダーです。デフォルト値は aliyun-sdk-java です。
clientBuilderConfiguration.setUserAgent("aliyun-sdk-java");
// プロキシサーバーの IP アドレスを設定します。"" を実際のプロキシサーバーの IP アドレス (例: "196.128.xxx.xxx") に置き換えます。
clientBuilderConfiguration.setProxyHost("");
// プロキシサーバーのポートを設定します (例: 8080)。
clientBuilderConfiguration.setProxyPort(8080);
// プロキシサーバー認証のユーザー名を設定します。"" を実際のユーザー名 (例: "admin") に置き換えます。
clientBuilderConfiguration.setProxyUsername("");
// プロキシサーバー認証のパスワードを設定します。"" を対応するパスワードに置き換えます。
clientBuilderConfiguration.setProxyPassword("");

OSS ossClient = new OSSClientBuilder()
    // 他の設定...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

HTTP/HTTPS プロトコル

setProtocol を使用して、クライアントと OSS サーバー間の通信プロトコルを設定します。デフォルトは HTTP です。安全なデータ転送を確保し、中間者攻撃やデータ漏洩を防ぐために、本番環境では HTTPS を使用することをお勧めします。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// 安全なデータ転送を確保するために、通信プロトコルを HTTPS に設定します。
clientBuilderConfiguration.setProtocol(Protocol.HTTPS);

OSS ossClient = new OSSClientBuilder()
    // 他の設定...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

署名バージョン

重要

Alibaba Cloud Object Storage Service Signature 1.0 は、以下のスケジュールに従って段階的に廃止されます。サービスに影響が出ないように、できるだけ早く署名 V4 にアップグレードすることをお勧めします。

  • 2025 年 3 月 1 日以降、新規ユーザーは Signature 1.0 を使用できなくなります。

  • 2025 年 9 月 1 日以降、Signature 1.0 は更新または保守されなくなり、新しいバケットは Signature V1 を使用できなくなります。

setSignatureVersion を使用して、署名アルゴリズムのバージョンを設定します。署名 V4 を使用する場合、region パラメーターを使用して正しいリージョン ID を指定する必要があります。V4 署名アルゴリズムは、より高いセキュリティを提供します。OSS SDK for Java 1.0 3.15.0 以降では、署名 V4 がサポートされています。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// より高いセキュリティのために、署名アルゴリズムのバージョンを V4 に設定します。
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);

OSS ossClient = new OSSClientBuilder()
    // 他の設定...
    // 署名 V4 を使用する場合は、リージョン ID を指定する必要があります。
    .region("cn-hangzhou")
    .clientConfiguration(clientBuilderConfiguration)
    .build();

IP アドレスの使用

エンドポイントとして IP アドレスを使用するのは、主に内部ネットワークアクセスや特殊なネットワーク環境向けです。CEN、Express Connect、専用回線、または VPN を使用してネットワーク接続を確立した後、IP アドレスを使用して OSS に直接アクセスします。これにより、DNS 解決プロセスがバイパスされ、アクセス効率が向上します。特定のルーティング設定については、「OSS の内部エンドポイントと VIP CIDR ブロック」をご参照ください。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// 第 2 レベルドメイン経由での OSS へのアクセスを有効にします。この機能はデフォルトで無効になっています。
// この値は、OSS Java SDK 1.0 2.1.2 以前で設定する必要があります。
// バージョン 2.1.2 以降では IP アドレスが自動的に検出されるため、この値は不要になりました。
clientBuilderConfiguration.setSLDEnabled(true);

OSS ossClient = new OSSClientBuilder()
    // 他の設定...
    .clientConfiguration(clientBuilderConfiguration)
    // IP アドレスを使用して OSS にアクセスする場合は、HTTP プロトコルを使用して SSL 証明書検証の問題を回避します。
    .endpoint("http://10.10.10.10")
    .build();

CRC チェック

OSS は、データ転送の完全性を確保するために、デフォルトで巡回冗長検査 (CRC) データチェックを有効にしています。これにより転送時間がわずかに増加しますが、データ整合性を確保するために本番環境では有効にしておくことをお勧めします。ライブプレビューストリーム、IoT デバイスからのリアルタイムデータ、軽微なデータ損失が許容される低品質の監視ビデオ、信頼性の高い内部ネットワークでのバッチデータ転送など、特定のシナリオでパフォーマンスを向上させるために CRC チェックを無効にすることを検討してください。CRC チェックを無効にする前に、データ整合性のリスクを十分に評価し、完全なテストを実行する必要があります。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// CRC データチェック機能を無効にします。注意して使用し、リスクを十分に評価してください。
clientBuilderConfiguration.setCrcCheckEnabled(false); 

OSS ossClient = new OSSClientBuilder()
    // 他の設定...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

シングルトンパターン

OSS SDK for Java 1.0 を使用する場合、シングルトンパターンを使用して OSSClient インスタンスを作成および使用します。

  • OSSClient はスレッドセーフであり、複数のスレッドが同じインスタンスにアクセスできます。ビジネスニーズに応じてシングルトンパターンを使用して OSSClient インスタンスを作成および再利用できます。これにより、インスタンスを頻繁に作成および破棄するオーバーヘッドを回避できます。

  • OSSClient インスタンスは、内部的に接続プールを維持します。OSSClient インスタンスが不要になった場合は、シャットダウンメソッドを呼び出してインスタンスを閉じ、インスタンスの作成が多すぎることによるリソースの枯渇を防ぐ必要があります。

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.*;
import java.io.ByteArrayInputStream;

public class OssClientSingleton {
    private OssClientSingleton() {}

    // 静的内部クラスでシングルトンを実装 (スレッドセーフ)
    private static class SingletonHolder {
        private static final OSS INSTANCE = create();

        private static OSS create() {
            try {
                // 例として中国 (杭州) リージョンを使用します。他のリージョンについては、実際のエンドポイントを指定してください。
                String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
                // バケットが配置されているリージョンを入力します。例として中国 (杭州) リージョンを使用します。リージョンを cn-hangzhou に設定します。
                String region = "cn-hangzhou";

                ClientBuilderConfiguration config = new ClientBuilderConfiguration();
                // V4 署名アルゴリズムの使用を明示的に宣言します。
                config.setSignatureVersion(SignVersion.V4);

                // 環境変数からアクセス資格情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
                CredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

                // OSS クライアントをビルドします。
                return OSSClientBuilder.create()
                        .endpoint(endpoint)
                        .credentialsProvider(credentialsProvider)
                        .clientConfiguration(config)
                        .region(region)
                        .build();
            } catch (Exception e) {
                throw new RuntimeException("Failed to initialize OSS client", e);
            }
        }
    }

    // シングルトンインスタンスを取得します。
    public static OSS getInstance() {
        return SingletonHolder.INSTANCE;
    }

    // main 関数で PutObject 操作をテストします。
    public static void main(String[] args) {
        // シングルトン OSS クライアントを取得します。
        OSS ossClient = OssClientSingleton.getInstance();

        // バケット名を入力します (例: examplebucket)。
        String bucketName = "examplebucket";
        // オブジェクトの完全なパスを入力します (バケット名を除く)。例: testfolder/exampleobject.txt。
        String objectKey = "testfolder/exampleobject.txt";

        try {
            // 文字列を入力します。
            String content = "Hello OSS";

            // PutObjectRequest オブジェクトを作成します。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, new ByteArrayInputStream(content.getBytes()));

            // アップロード中にストレージクラスとアクセス権限を設定するには、次のサンプルコードを参照してください。
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            metadata.setObjectAcl(CannedAccessControlList.Private);
            putObjectRequest.setMetadata(metadata);

            // 文字列をアップロードします。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            // アップロード結果を出力します。
            System.out.println("File uploaded successfully!");
            System.out.println("ETag: " + result.getETag());
            System.out.println("Request ID: " + result.getRequestId());
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            // シングルトンモードでは、各操作後にクライアントを閉じないでください (接続を再利用するため)。これは後続の使用に影響を与える可能性があります。
            // OSSClient インスタンスが不要になった場合 (たとえば、アプリケーションが終了する前)、shutdown メソッドを一度呼び出してリソースを解放します。
            // ossClient.shutdown();
        }
    }
}

例外処理

OSS SDK for Java 1.0 には、ClientException と OSSException の 2 種類の例外が含まれています。どちらも RuntimeException を継承しています。

クライアント例外 (ClientException)

クライアント例外は、リクエストの構築、送信、またはデータ転送中に発生します。一般的なシナリオは次のとおりです。

  • ネットワーク接続が利用できず、リクエストをサーバーに送信できません。

  • ファイルのアップロード中に IO 例外が発生します。

  • リクエストのタイムアウトや証明書検証の失敗など、基盤となるネットワーク例外が発生します。

ClientException は、リクエストが OSS サーバーに正常に送信されなかったか、クライアント側の処理中にエラーが発生したことを示します。これには通常、ネットワーク接続の状態、クライアント設定、またはリトライメカニズムの確認が必要です。

サーバー例外 (OSSException)

サーバー例外は OSS サーバーから返されます。これは、リクエストが正常に送信され、サーバーで受信されたものの、何らかの理由で処理できなかったことを意味します。OSS サーバー例外には次の特徴があります。

  • 正確な問題特定のための詳細なエラーコードとエラーメッセージが含まれています。

  • 一般的なエラーには、SignatureDoesNotMatch、AccessDenied、NoSuchKey などがあります。

  • エラーコードに基づいてこれらの例外を処理することで、プログラムの堅牢性とユーザーエクスペリエンスを大幅に向上させることができます。

開発中にこれら 2 種類の例外を個別にキャッチして、問題の原因をより正確に特定し、対応する処理戦略を作成することをお勧めします。

// クライアント操作を作成...

try {
    // ファイルのアップロード、ファイルのダウンロード、オブジェクトの一覧表示など、OSS 操作を実行します。
    // これらの操作は、OSS 関連の例外をスローする可能性があります。
    ossClient.putObject(...);
    
} catch (OSSException oe) {
    // OSS サーバーから返された例外をキャッチします。
    // この例外は、リクエストが OSS サーバーに正常に到達したが、サーバーがリクエストを拒否した場合にスローされます。
    // 一般的な原因: 権限不足、不正なパラメーター、リソースが存在しないなど。
    System.out.println("Caught an OSSException, which means your request made it to OSS, "
            + "but was rejected with an error response for some reason.");
    
    // 問題の特定とデバッグのために詳細なエラー情報を出力します。
    System.out.println("Error Message: " + oe.getErrorMessage());   
    System.out.println("Error Code:       " + oe.getErrorCode());  
    System.out.println("Request ID:      " + oe.getRequestId());     
    System.out.println("Host ID:           " + oe.getHostId());      
    
} catch (ClientException ce) {
    // クライアント例外をキャッチします。
    // この例外は、クライアントが OSS との通信中に重大な内部問題に遭遇した場合にスローされます。
    // 一般的な原因: ネットワーク接続の問題、SSL 証明書の問題、DNS 解決の失敗など。
    System.out.println("Caught an ClientException, which means the client encountered "
            + "a serious internal problem while trying to communicate with OSS, "
            + "such as not being able to access the network.");
    
    // クライアント例外に関する詳細情報を出力します。
    System.out.println("Error Message: " + ce.getMessage());  
    
} finally {
    // 操作が成功したか失敗したかに関係なく、クライアントリソースを解放します。
    // これは、リソースリークや接続プールの枯渇を避けるためのベストプラクティスです。
    if (ossClient != null) {
        ossClient.shutdown();  // クライアントを閉じて、ネットワーク接続やその他のリソースを解放します。
    }
}

サンプルコード

OSS SDK for Java 1.0 は、バケット管理、ファイル操作、アクセス制御、暗号化転送などのコア機能をカバーする豊富なサンプルコードを提供しており、参照または直接使用できます。サンプルコードには次のものが含まれます。

サンプルファイル

サンプルコンテンツ

BucketOperationsSample.java

BucketTaggingSample.java

バケットのタグ付け (Java SDK)

BucketInventorySample.java

バケットインベントリ (Java SDK)

BucketPolicySample.java

バケットポリシー (Java SDK)

BucketWormSample.java

保持ポリシー (Java SDK)

SetRequestPaymentSample.java

リクエスタ支払い (Java SDK)

BucketReplicationSample.java

データレプリケーション (Java SDK)

BucketTransferAccelerationSample.java

転送アクセラレーション (Java SDK)

CreateFolderSample.java

シンプルアップロード (Java SDK)

PostObjectSample.java

フォームアップロード (Java SDK)

説明

PostObject の実装は Java SDK に依存しません。

AppendObjectSample.java

追加アップロード (Java SDK)

UploadSample.java

再開可能アップロード (Java SDK)

MultipartUploadSample.java

マルチパートアップロード (Java SDK)

CallbackSample.java

アップロードコールバック (Java SDK)

SimpleGetObjectSample.java

ファイルのダウンロード (Java SDK)

DownloadSample.java

再開可能ダウンロード (Java SDK)

ConcurrentGetObjectSample.java

再開可能ダウンロード (Java SDK)

GetProgressSample.java

GetStartedSample.java

ObjectMetaSample.java

ファイルメタデータの管理 (Java SDK)

StorageTypeSample.java

ファイルのストレージクラスの変換 (Java SDK)

ListObjectsSample.java

ファイルの一覧表示 (Java SDK)

BucketMetaQuerySample.java

スカラー取得 (Java SDK)

SelectObjectSample.java

ファイルのクエリ (Java SDK)

DeleteObjectsSample.java

ファイルの削除 (Java SDK)

UploadPartCopySample.java

ファイルのコピー (Java SDK)

ObjectOperationSample.java

同名ファイルの上書き防止 (Java SDK)

RestoreObjectSample.java

ファイルの復元 (Java SDK)

SymLinkSample.java

シンボリックリンクの管理 (Java SDK)

BucketVersioningSample.java

バージョン管理 (Java SDK)

ObjectTaggingSample.java

TrafficLimitSample.java

単一接続の帯域幅調整 (Java SDK)

クライアントベースの暗号化 (Java SDK)

EncryptionServiceSample.java

サーバーサイド暗号化 (Java SDK)

AuthorizedAccessSample.java

署名付き URL を使用したダウンロード (Java SDK)

CRCSample.java

データ検証 (Java SDK)

ImageSample.java

画像処理 (Java SDK)

アクセス資格情報の設定

OSS は、資格情報を初期化するための複数の方法を提供しています。認証と権限付与のニーズに基づいて初期化方法を選択してください。

アクセス資格情報の選択方法

資格情報プロバイダーの初期化メソッド

シナリオ

既存の AccessKey ペアまたは STS トークンが必要

基盤となる資格情報

資格情報の有効性

資格情報のローテーションまたはリフレッシュ方法

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

安全で安定した環境にデプロイされ、外部攻撃に対して脆弱ではなく、頻繁な資格情報のローテーションなしで Alibaba Cloud サービスへの長期アクセスが必要なアプリケーション。

はい

Access Key (AK)

長期

手動ローテーション

STS トークンを使用する

信頼できない環境にデプロイされ、制御されたアクセス期間と権限が必要なアプリケーション。

はい

Security Token Service トークン

一時的

手動リフレッシュ

RAMRoleARN を使用する

クロスアカウントアクセスなど、Alibaba Cloud サービスへの承認済みアクセスが必要なアプリケーション。

はい

Security Token Service トークン

一時的

自動リフレッシュ

ECSRAMRole を使用する

Alibaba Cloud ECS インスタンス、ECI インスタンス、または Container Service for Kubernetes のワーカーノードにデプロイされたアプリケーション。

いいえ

Security Token Service トークン

一時的

自動リフレッシュ

OIDCRoleARN を使用する

Alibaba Cloud Container Service for Kubernetes のワーカーノードにデプロイされた信頼できないアプリケーション。

いいえ

Security Token Service トークン

一時的

自動リフレッシュ

Function Compute コンテキストから資格情報を使用する

Alibaba Cloud Function Compute にデプロイされたアプリケーションの関数。

いいえ

Security Token Service トークン

一時的

リフレッシュ不要

CredentialsURI を使用する

外部システムからアクセス資格情報を取得する必要があるアプリケーション。

いいえ

Security Token Service トークン

一時的

自動リフレッシュ

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

AccessKey ペアの漏洩リスクがある環境にデプロイされ、頻繁な資格情報のローテーションを伴う Alibaba Cloud サービスへの長期アクセスが必要なアプリケーション。

いいえ

AccessKey (AK)

長期

自動ローテーション

カスタムアクセス資格情報を使用する

前述の資格情報設定方法のいずれも要件を満たさない場合は、資格情報を取得する方法をカスタマイズします。

カスタム

AccessKey ペアまたは Security Token Service トークン

カスタム

カスタム

デフォルトの資格情報チェーンを使用する

パラメーターを渡さずに資格情報クライアントを初期化すると、Credentials ツールはデフォルトの資格情報チェーンを使用してクライアントを初期化します。

いいえ

AccessKey ペアまたは Security Token Service トークン

カスタム

自動リフレッシュ

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

この方法は、安全で安定した環境にデプロイされ、外部攻撃に対して脆弱ではなく、OSS への長期アクセスが必要で、資格情報を頻繁にローテーションできないアプリケーション向けです。Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey シークレット) を使用して資格情報プロバイダーを初期化できます。この方法では、AccessKey ペアを手動で維持する必要があり、セキュリティリスクとメンテナンスの複雑さが増します。

重要
  • Alibaba Cloud アカウントは、そのリソースに対する完全な権限を持っています。AccessKey ペアが漏洩した場合、システムに重大なリスクをもたらします。Alibaba Cloud アカウントの AccessKey ペアを使用することはお勧めしません。代わりに、最小限の必要な権限を持つ RAM ユーザーの AccessKey ペアを使用してください。

  • RAM ユーザーの AccessKey ペアを作成するには、「AccessKey ペアの作成」をご参照ください。RAM ユーザーの AccessKey ID と AccessKey シークレットは、AccessKey ペアが作成されたときにのみ表示されます。忘れた場合は、新しい AccessKey ペアを作成して古いものを置き換える必要があります。

環境変数

  1. RAM ユーザーの AccessKey ペアを使用して環境変数を設定します。

    Linux

    1. コマンドラインインターフェイスで次のコマンドを実行して、環境変数の設定を ~/.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.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.CredentialsProviderFactory;
    import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
    import com.aliyun.oss.common.comm.SignVersion;
    
    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 インスタンスを作成します。
            // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
                    
            ossClient.shutdown();
        }
    }

静的資格情報

次のサンプルコードは、アクセス資格情報をハードコーディングし、使用する AccessKey ペアを明示的に設定する方法を示しています。

重要

本番環境のアプリケーションにアクセス資格情報を埋め込まないでください。この方法はテスト目的でのみ使用します。

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;

public class AkDemoTest {
    public static void main(String[] args) throws Exception {
        // RAM ユーザーの AccessKey ID と AccessKey シークレットを入力します。
        String accessKeyId = "yourAccessKeyID";
        String accessKeySecret = "yourAccessKeySecret";
        
        // DefaultCredentialProvider メソッドを使用して、AccessKey ID と AccessKey シークレットを直接設定します。
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);

        // credentialsProvider を使用してクライアントを初期化します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズムの使用を明示的に宣言します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
        OSS ossClient = OSSClientBuilder.create()
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("region")
                .build();

        ossClient.shutdown();

    }
}

STS トークンを使用する

この方法は、OSS への一時的なアクセスが必要なアプリケーション向けです。Security Token Service (STS) から取得した一時的な ID 資格情報 (AccessKey ID、AccessKey シークレット、およびセキュリティトークン) を使用して資格情報プロバイダーを初期化します。この方法では、STS トークンを手動で維持する必要があり、セキュリティリスクとメンテナンスの複雑さが増します。OSS に複数回一時的にアクセスするには、STS トークンを手動で更新する必要があります。

重要

環境変数

  1. 一時的な ID 資格情報を使用して環境変数を設定します。

    Mac OS/Linux/Unix

    重要
    • ここでは、RAM ユーザーの AccessKey ペアではなく、STS サービスから取得した一時的な ID 資格情報 (AccessKey ID、AccessKey シークレット、およびセキュリティトークン) が使用されることに注意してください。

    • STS サービスから取得した AccessKey ID は「STS」で始まることに注意してください (例: 「STS.****************」)。

    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 サービスから取得した一時的な ID 資格情報 (AccessKey ID、AccessKey シークレット、およびセキュリティトークン) が使用されることに注意してください。

    • STS サービスから取得した AccessKey ID は「STS」で始まることに注意してください (例: 「STS.****************」)。

    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.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.CredentialsProviderFactory;
    import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
    import com.aliyun.oss.common.comm.SignVersion;
    
    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 インスタンスを作成します。
            // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

静的資格情報

アプリケーションに資格情報をハードコーディングし、使用する一時的なアクセスキーを明示的に設定します。

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;

public class StsDemoTest {
    public static void main(String[] args) throws Exception {
        // これを、STS サービスから取得した一時的な AccessKey ID、AccessKey シークレット、およびセキュリティトークンに設定します。RAM ユーザーの資格情報ではありません。
        // STS サービスから取得した AccessKey ID は、以下に示すように「STS」で始まることに注意してください。
        String accessKeyId = "STS.****************";
        String accessKeySecret = "yourAccessKeySecret";
        String stsToken= "yourSecurityToken";

        // DefaultCredentialProvider メソッドを使用して、AccessKey ID と AccessKey シークレットを直接設定します。
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);

        // credentialsProvider を使用してクライアントを初期化します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズの使用を明示的に宣言します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
        OSS ossClient = OSSClientBuilder.create()
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("region")
                .build();

        ossClient.shutdown();
    }
}

RAMRoleARN を使用する

この方法は、クロスアカウントアクセスなど、OSS への承認済みアクセスが必要なアプリケーション向けです。RAM ロールの Alibaba Cloud リソースネーム (ARN) を指定して資格情報プロバイダーを初期化します。基盤となる実装は STS トークンに基づいています。Credentials ツールは、STS サービスから STS トークンを取得し、AssumeRole API 操作を呼び出して、現在のトークンが期限切れになる前に新しい STS トークンを要求します。policy パラメーターに値を割り当てて、RAM ロールをより小さな権限セットに制限することもできます。

重要
  • Alibaba Cloud アカウントは、そのリソースに対する完全な権限を持っています。AccessKey ペアが漏洩した場合、システムに重大なリスクをもたらします。Alibaba Cloud アカウントの AccessKey ペアを使用することはお勧めしません。代わりに、最小限の必要な権限を持つ RAM ユーザーの AccessKey ペアを使用してください。

  • RAM ユーザーの AccessKey ペアを作成するには、「AccessKey ペアの作成」をご参照ください。RAM ユーザーの AccessKey ID と AccessKey シークレットは、AccessKey ペアが作成されたときにのみ表示されます。速やかに保存する必要があります。忘れた場合は、新しい AccessKey ペアを作成して古いものを置き換える必要があります。

  • RAMRoleARN を取得するには、「CreateRole - RAM ロールの作成」をご参照ください。

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

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. AccessKey ペアと RAMRoleARN をアクセス資格情報として設定します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    
    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。例: acs:ram::123456789012****:role/adminrole。ALIBABA_CLOUD_ROLE_ARN 環境変数を介して RoleArn を設定できます。
            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 環境変数を介して RoleSessionName を設定できます。
            config.setRoleName("<RoleSessionName>");
            // より小さな権限ポリシーを設定します。これはオプションです。例: {"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 インスタンスを作成します。
            // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

ECSRAMRole を使用する

この方法は、ECS インスタンス、ECI インスタンス、または Container Service for Kubernetes (CSK) のワーカーノードで実行されるアプリケーション向けです。ECSRAMRole を使用して資格情報プロバイダーを初期化することをお勧めします。基盤となる実装は STS トークンに基づいています。ECSRAMRole を使用すると、ECS インスタンス、ECI インスタンス、または CSK のワーカーノードにロールをアタッチでき、インスタンス内で STS トークンを自動的に更新できます。この方法では、AccessKey ペアや STS トークンを提供する必要がないため、手動で維持するリスクがなくなります。ECSRAMRole を取得するには、「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. ECSRAMRole をアクセス資格情報として設定します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    
    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 インスタンスを作成します。
            // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

OIDCRoleARN を使用する

Container Service for Kubernetes (CSK) でワーカーノードの RAM ロールを設定した後、対応するノード上の Pod 内のアプリケーションは、ECS にデプロイされたアプリケーションと同様に、Metadata Server を介してアタッチされたロールの STS トークンを取得できます。ただし、信頼できないアプリケーションがコンテナクラスターにデプロイされている場合 (たとえば、コードが公開されていない顧客から提出されたアプリケーション)、それらのアプリケーションが Metadata Server を介してワーカーノードのアタッチされたインスタンス RAM ロールの STS トークンを取得することを望まない場合があります。これらの信頼できないアプリケーションがクラウドリソースのセキュリティに影響を与えることなく、必要な STS トークンを安全に取得し、アプリケーションレベルの権限最小化を実現するには、RAM Roles for Service Accounts (RRSA) 機能を使用します。この方法の基盤となる実装は STS トークンに基づいています。Alibaba Cloud コンテナクラスターは、さまざまなアプリケーション Pod に対して対応するサービスアカウントの OpenID Connect (OIDC) トークンファイルを作成およびマウントし、関連する設定情報を環境変数に注入します。Credentials ツールは、環境変数からの設定情報を使用して STS サービスの AssumeRoleWithOIDC API 操作を呼び出すことにより、バインドされたロールの STS トークンを取得します。この方法では、AccessKey ペアや STS トークンを提供する必要がないため、手動で維持するリスクがなくなります。詳細については、「RRSA を介して ServiceAccount の RAM 権限を設定し、Pod の権限分離を実現する」をご参照ください。

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

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. OIDC RAM ロールをアクセス資格情報として設定します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    
    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 環境変数を介して RoleArn を設定できます。
            config.setRoleArn("<RoleArn>");
            // OIDC プロバイダーの ARN。ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を介して OidcProviderArn を設定できます。
            config.setOidcProviderArn("<OidcProviderArn>");
            // OIDC トークンファイルのパス。ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を介して OidcTokenFilePath を設定できます。
            config.setOidcTokenFilePath("<OidcTokenFilePath>");
            // ロールセッションの名前。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を介して RoleSessionName を設定できます。
            config.setRoleSessionName("<RoleSessionName>");
            // より小さな権限ポリシーを設定します。これはオプションです。例: {"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 インスタンスを作成します。
            // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

Function Compute コンテキストから資格情報を使用する

この方法は、Function Compute にデプロイされたアプリケーションの関数向けです。Function Compute コンテキストからの資格情報を使用して資格情報プロバイダーを初期化します。基盤となる実装は STS トークンに基づいています。Function Compute は、関数に設定されたサービスロールを引き受けることで STS トークンを取得し、その後、コンテキストの Credentials パラメーターを介して STS トークンをアプリケーションに渡します。この 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 コンテキストからの資格情報を使用して資格情報プロバイダーを初期化します。

    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.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.common.comm.SignVersion;
    
    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 インスタンスを作成します。
            // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
    
            outputStream.write(new String("done").getBytes());
        }
    }

CredentialsURI を使用する

この方法は、柔軟な資格情報管理とキーレスアクセスのために外部システムから Alibaba Cloud 資格情報を取得する必要があるアプリケーション向けです。CredentialsURI を使用して資格情報プロバイダーを初期化できます。基盤となる実装は STS トークンに基づいています。Credentials ツールは、提供された URI から STS トークンを取得して資格情報クライアントを初期化します。この方法では、AccessKey ペアや 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. CredentialsURI をアクセス資格情報として設定します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    
    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。これは STS トークンを生成するサーバーのアドレスで、http://local_or_remote_uri/ の形式です。ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を介して CredentialsUri を設定できます。
            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 インスタンスを作成します。
            // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

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

この方法は、OSS への長期アクセスが必要でありながら、AccessKey ペアの漏洩リスクがある環境にデプロイされ、頻繁な手動ローテーションが必要なアプリケーション向けです。ClientKey を使用して資格情報プロバイダーを初期化します。基盤となる実装は AccessKey ペアに基づいています。ClientKey を使用すると、Key Management Service (KMS) が管理対象の RAM ユーザーの AccessKey ペアを自動的かつ定期的にローテーションし、静的な RAM ユーザーの AccessKey ペアを動的なものに変えることで、漏洩のリスクを低減します。定期的なローテーションに加えて、KMS は即時ローテーションもサポートしており、漏洩が発生した場合に AccessKey ペアを迅速に交換できます。この方法では、手動で AccessKey ペアを維持するリスクと複雑さがなくなります。ClientKey を取得するには、「アプリケーションアクセスポイントの作成」をご参照ください。

  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 の読み取り用復号パスワード: 環境変数またはファイルからの読み取りをサポート、どちらか一方を設定するだけでよい
    client_key_password_from_env_variable=<your client key private key password environment variable name>
    client_key_password_from_file_path=<your client key private key password file path>
    
    # Client Key の秘密鍵ファイルのパス
    client_key_private_key_path=<your client key private key file path>
    
    # 関連する KMS サービスのリージョン
    cache_client_region_id=[{"regionId":"<regionId>"}]
  3. 設定ファイルを使用して資格情報情報を渡します。

    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    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 インスタンスを作成します。
            // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }
    

カスタムアクセス資格情報を使用する

前述の資格情報設定方法のいずれも要件を満たさない場合は、CredentialProviders インターフェイスを実装して資格情報プロバイダーをカスタマイズします。基盤となる実装が STS トークンに基づいている場合、資格情報の更新をサポートする必要があることに注意してください。

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentials;
import com.aliyun.oss.common.comm.SignVersion;

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
                //アクセス資格情報を取得する方法をカスタマイズします。

                // 長期的な資格情報を返す: access_key_id, access_key_secrect  
                return new DefaultCredentials(accessKeyId, accessKeySecrect);

                // 一時的な資格情報を返す: access_key_id, access_key_secrect, token
                // 一時的な資格情報の場合、有効期限に基づいて更新する必要があります。
                // return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
            }
        };
        // credentialsProvider を使用してクライアントを初期化します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズムの使用を明示的に宣言します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
        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;
    import com.aliyun.oss.common.comm.SignVersion;
    
    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 インスタンスを作成します。
            // OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してリソースを解放します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
            ossClient.shutdown();
        }
    }

よくある質問

パッケージの競合

  • 原因

    OSS SDK for Java 1.0 を使用すると、次のようなエラーはプロジェクト内のパッケージの競合を示します。

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy
        at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
        at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
        at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:77)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.ssl.TrustStrategy
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 3 more
                        

    または

    Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:82)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:95)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:104)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:62)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:572)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:174)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:158)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:149)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:125)
     at com.aliyun.oss.common.comm.DefaultServiceClient.createHttpClientConnectionManager(DefaultServiceClient.java:237)
     at com.aliyun.oss.common.comm.DefaultServiceClient.<init>(DefaultServiceClient.java:78)
     at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
     at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
     at OSSManagerImpl.upload(OSSManagerImpl.java:42)
     at OSSManagerImpl.main(OSSManagerImpl.java:63)
                        

    このエラーは、OSS SDK for Java 1.0 が Apache HttpClient 4.4.1 を使用しているのに対し、プロジェクトが競合するバージョンの Apache HttpClient または commons-httpclient JAR パッケージを使用しているために発生します。プロジェクトディレクトリで mvn dependency:tree コマンドを実行して、プロジェクトで使用されている JAR パッケージとそのバージョンを表示します。次の図に示すように、プロジェクトは Apache HttpClient 4.3 を使用しており、これは標準バージョンと競合します。

  • ソリューション

    次の 2 つの方法のいずれかでパッケージの競合を解決します。

    • 統一されたバージョンの使用: プロジェクトが Apache HttpClient 4.4.1 と競合するバージョンを使用している場合は、バージョン 4.4.1 を使用し、pom.xml ファイルから他のバージョンの Apache HttpClient への依存関係を削除します。プロジェクトが commons-httpclient を使用している場合も、競合が存在する可能性があります。commons-httpclient の依存関係を削除してください。

    • 依存関係の競合の解決: プロジェクトが複数のサードパーティパッケージに依存しており、これらのパッケージが異なるバージョンの Apache HttpClient に依存している場合、プロジェクトには依存関係の競合が発生します。exclusion タグを使用して解決します。詳細については、「Maven ガイド」をご参照ください。

    OSS SDK for Java 1.0 は、次のパッケージバージョンに依存しています。競合解決方法は HttpClient の場合と同様です。

パッケージの欠落

  • 原因

    OSS SDK for Java 1.0 を使用すると、次のようなエラーは、プロジェクトに OSS SDK for Java 1.0 をコンパイルまたは実行するために必要なパッケージが欠落していることを示します。

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/auth/Credentials
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:76)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.auth.Credentials
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 3 more
                        

    または

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/protocol/HttpContext
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:76)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.protocol.HttpContext
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 3 more
                        

    または

    Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder
            at com.aliyun.oss.internal.ResponseParsers.getXmlRootElement(ResponseParsers.java:645)
            at … … 
            at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:471)
            at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:465)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:82)
    Caused by: java.lang.ClassNotFoundException: org.jdom.input.SAXBuilder
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 11 more
                        

    OSS SDK for Java 1.0 は、次のパッケージに依存しています。

    • aliyun-sdk-oss-2.2.1.jar

    • hamcrest-core-1.1.jar

    • jdom-1.1.jar

    • commons-codec-1.9.jar

    • httpclient-4.4.1.jar

    • commons-logging-1.2.jar

    • httpcore-4.4.1.jar

    • log4j-1.2.15.jar

    これらのうち、log4j-1.2.15.jar はオプションの依存関係です。このパッケージは、ロギング機能が必要な場合にのみ追加してください。他のパッケージは必須です。

  • ソリューション

    OSS SDK for Java 1.0 が依存するパッケージをプロジェクトに追加します。次のいずれかの方法を使用できます。

    • Eclipse プロジェクト: 詳細については、「SDK のインストール」をご参照ください。

    • Ant プロジェクト: OSS SDK for Java 1.0 が依存するパッケージをプロジェクトの lib ディレクトリに配置します。

    • 直接コンパイル: -classpath または -cp コマンドを使用して、OSS SDK for Java 1.0 が依存するパッケージのパスを指定するか、これらのパッケージをクラスパスに配置します。

接続タイムアウト

  • 原因

    OSS SDK for Java 1.0 プログラムを実行すると、エンドポイントが正しくないか、ネットワーク接続の問題が原因で、次のようなエラーが発生する場合があります。

    com.aliyun.oss.ClientException: SocketException
        at com.aliyun.oss.common.utils.ExceptionFactory.createNetworkException(ExceptionFactory.java:71)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:116)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:121)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:67)
        at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:92)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:140)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:111)
        at com.aliyun.oss.internal.OSSBucketOperation.getBucketInfo(OSSBucketOperation.java:1152)
        at com.aliyun.oss.OSSClient.getBucketInfo(OSSClient.java:1220)
        at com.aliyun.oss.OSSClient.getBucketInfo(OSSClient.java:1214)
        at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:94)
    Caused by: org.apache.http.conn.HttpHostConnectException: Connect to oss-test.oss-cn-hangzhou-internal.aliyuncs.com:80 [oss-test.oss-cn-hangzhou-internal.aliyuncs.com/10.84.135.99] failed: Connection timed out: connect
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
        ... 9 more
                        
  • ソリューション

    ossutil ツールを使用して、エラーの原因を迅速に特定し、問題を解決できます。

SignatureDoesNotMatch エラー

  • 原因 1: AccessKey ペア情報の不一致

    AccessKey ID と AccessKey シークレットが一致しません。AccessKey ID と AccessKey シークレットの取得方法については、「AccessKey ペアの作成」をご参照ください。

  • 原因 2: 署名付き URL の不正な使用

    以下は、署名付き URL の不正な使用例です。

    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, object);
    request.setExpiration( new Date(new Date().getTime() + 3600 * 1000));
    request.addUserMetadata("author");
    URL url = ossClient.generatePresignedUrl(request);
    
    Map<String, String> header = new HashMap<String, String>();
    header.put("author");
    ossClient.putObject(url, new ByteArrayInputStream("Hello OSS".getBytes()), -1, header);

    Method パラメーターが指定されていない場合、デフォルトで GET メソッドが使用されます。しかし、上記の例は PutObject リクエストです。したがって、Method パラメーターを指定し、PUT に設定する必要があります。

    PutObject リクエストを送信する場合、リクエストヘッダーのカスタムメタデータには x-oss-meta- というプレフィックスを付ける必要があります。上記の例では、カスタムメタデータは x-oss-meta-author に変更する必要があります。

    ソリューション:

    Method パラメーターを指定し、ヘッダーのプレフィックスを変更します。

    request.addUserMetadata("author");
    request.setMethod(HttpMethod.PUT);
    URL url = ossClient.generatePresignedUrl(request);
    
    Map<String, String> header = new HashMap<String, String>();
    header.put("x-oss-meta-" + "author");
    ossClient.putObject(url, new ByteArrayInputStream("Hello OSS".getBytes()), -1, header);
  • 原因 3: HttpClient バージョンの互換性の問題

    • 3.7.0 より前の OSS SDK バージョンが使用されており、プロジェクトに HttpClient 4.5.9 以降が導入されています。

    • アップロードされたファイルの名前に + 文字が含まれており、HttpClient 4.5.9 は + 文字を URL エンコードしません。これにより、クライアントとサーバーで計算された署名が一致しなくなります。

    1

    ソリューション:

    • OSS SDK をバージョン 3.11.1 以降にアップグレードして、HttpClient 4.5.9 との互換性を確保します。

    • 冗長な HttpClient 依存関係を削除します。OSS SDK を導入すると、HttpClient 依存関係が自動的に導入されます。サードパーティライブラリも HttpClient を導入している場合は、「パッケージの競合」の解決策を参照してください。

  • 原因 4: HttpClient 文字セットの互換性の問題

    HttpClient 4.5.10 は、ヘッダー内の ISO-8859-1 標準外の文字をサポートしていません。しかし、プロジェクトには 4.5.10 より後のバージョンの HttpClient が導入されており、リクエストヘッダーには x-oss-meta- で始まるカスタムメタデータ内の中国語文字など、ISO-8859-1 標準外の文字が含まれています。3

    ソリューション:

    • パッケージの競合」の解決策を参照して、競合する HttpClient バージョンを削除します。

    • リクエストヘッダーには、ISO-8859-1 標準に準拠した文字のみを渡します。

「応答結果の解析に失敗しました」例外

FAQ3

  • 原因

    クライアント側の一部の特殊なソフトウェアが HTTP リクエストを傍受するか、パブリックネットワークルートが HTTP リクエストをハイジャックします。

    Java 9 以降で OSS SDK for Java 1.0 を使用しており、pom.xml ファイルに JAXB 関連の依存関係を追加していません。

  • ソリューション

    HTTPS リクエストに切り替えます。

    JAXB 関連の依存関係を追加します。手順については、「SDK のインストール」をご参照ください。

org.apache.http.NoHttpResponseException: ターゲットサーバーが応答しませんでした

  • 原因

    OSS SDK for Java 1.0 プログラムを実行すると、次のようなエラーが報告されます。

    期限切れの接続を使用すると、上記のエラーが発生します。このエラーは、Java SDK バージョン 2.1.2 より前でのみ発生します。

  • ソリューション

    OSS SDK for Java 1.0 をバージョン 2.1.2 以降にアップグレードします。

JVM に多数の org.apache.http.impl.conn.PoolingHttpClientConnectionManager インスタンスが存在する

  • 原因

    ossClient が正しく閉じられていませんでした。

  • ソリューション

    ossClient が実行を終了した後に閉じるか、シングルトンパターンを使用します。

OSS SDK for Java 1.0 の呼び出しが応答しない

  • 原因

    OSS SDK for Java 1.0 の呼び出しが応答しません。jstack -l pid コマンドを実行してスタックを表示すると、問題は次の場所にあります。

    "main" prio=6 tid=0x000000000291e000 nid=0xc40 waiting on condition [0x0000000002dae000]
    java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007d85697f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
        at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:138)
        at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:306)
        at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64)
        at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:192)
        at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:185)
        at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:107)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:276)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:263)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:123)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:68)
        at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:94)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:146)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
        at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:229)
        at com.aliyun.oss.OSSClient.getObject(OSSClient.java:629)
        at com.aliyun.oss.OSSClient.getObject(OSSClient.java:617)
        at samples.HelloOSS.main(HelloOSS.java:49)
                        

    原因は接続プール内の接続リークであり、おそらく ossObject が使用後に正しく閉じられなかったためです。

  • ソリューション

    プログラムをチェックして、接続リークがないことを確認します。次の方法を使用して、接続を正しく閉じます。

    // ファイルを読み取ります。
    OSSObject ossObject = ossClient.getObject(bucketName, objectName);
    // OSS 操作
    // ossObject を閉じます。
    ossObject.close();                

    詳細なトラブルシューティング手順については、「応答しない OSS SDK for Java 1.0 のトラブルシューティング」をご参照ください。

接続が閉じられました

  • 原因

    ossClient.getObject を使用するときに次のようなエラーが発生した場合:

    Exception in thread "main" org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 11990526; received: 202880)
        at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:180)
        at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:200)
        at org.apache.http.impl.io.ContentLengthInputStream.close(ContentLengthInputStream.java:103)
        at org.apache.http.impl.execchain.ResponseEntityProxy.streamClosed(ResponseEntityProxy.java:128)
        at org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:228)
        at org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:174)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at com.aliyun.oss.event.ProgressInputStream.close(ProgressInputStream.java:147)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at samples.HelloOSS.main(HelloOSS.java:39)
                        

    原因は、2 つのデータ読み取りの間隔が 1 分を超えていることです。OSS は、1 分以上アイドル状態の接続を閉じます。

  • ソリューション

    毎回一部のデータのみを読み取り、データ処理時間が固定されていない場合は、範囲のダウンロードを使用して、データ読み取り中の接続の切断を回避します。範囲のダウンロードが完了すると、接続は自動的に閉じられます。詳細については、「範囲のダウンロード (Java SDK)」をご参照ください。

メモリリーク

  • 原因

    OSS SDK for Java 1.0 を呼び出すプログラムは、一定期間 (ビジネス量に応じて数時間から数日) 実行するとメモリリークが発生します。Eclipse Memory Analyzer (MAT) を使用してメモリ使用量を分析することをお勧めします。詳細については、「MAT を使用してヒープダンプファイルを分析する」をご参照ください。

    分析結果が下の図のようになっている場合 (PoolingHttpClientConnectionManager がメモリの 96% を占有している)、原因はプログラム内で new OSSClient が複数回実行された可能性がありますが、ossClient.shutdown が呼び出されなかったため、メモリリークが発生しました。

  • ソリューション

    new OSSClient 操作が完了したら、shutdown メソッドを呼び出して閉じます。new OSSClientossClient.shutdown がペアで使用されていることを確認してください。

ossClient.shutdown を呼び出すと InterruptedException が報告される

  • 原因

    2.3.0 より前のバージョンの OSS SDK for Java 1.0 は、ossClient.shutdown を呼び出すと次の例外を報告します。

    java.lang.InterruptedException: sleep interrupted
            at java.lang.Thread.sleep(Native Method)
            at com.aliyun.oss.common.comm.IdleConnectionReaper.run(IdleConnectionReaper:76)      

    原因は、ossClient バックエンドスレッド IdleConnectionReaper が定期的にアイドル接続を閉じるためです。IdleConnectionReaper が Sleep 中に ossClient.shutdown が呼び出されると、上記の例外が報告されます。

  • ソリューション

    次のコードを使用して例外を無視します。

    try {
        ossClient.shutdown();
    } catch(Exception e) {
    }                  

「SDK.ServerUnreachable : 指定されたエンドポイントまたは URI が無効です」例外

  • 原因

    • クライアントが STS に送信する同時リクエストが多すぎます。

    • サーバーへのネットワーク接続がタイムアウトしました。

    • 使用されている STS SDK と SDK コアが最新バージョンではありません。

  • ソリューション

    • クライアントが STS に送信する同時リクエストが多すぎて、クライアントの ECS インスタンスまたはローカルコンピューターが同時実行を処理できません。OSS の同時実行数を減らしてください。

    • ユーザーからサーバーへのネットワーク接続がタイムアウトしました。パケットをキャプチャしてこれを確認してください。

    • STS SDK と SDK コアを最新バージョンにアップグレードしてください。

NoSuchKey

  • 原因

    ソースファイルが存在しません。

  • ソリューション

    詳細については、「404 エラー」をご参照ください。

SocketException

  • 原因

    初期化フェーズ中にソケットが失敗し、リクエストが OSS に到達する前に失敗した可能性があります。

  • ソリューション

    次の点を確認することをお勧めします。

    • 問題が発生したときにネットワークジッターが発生したかどうか。

    • ホストのソケット接続数が最大に達しているかどうか。

    • 問題が発生したときに接続数が SDK の maxconnection 設定を超えていたかどうかを確認します。接続数が maxconnection 設定を超えると、ソケット例外も発生します。

    上記に問題がない場合は、tcpdump または Wireshark をデプロイしてパケットをキャプチャし、問題が再発した後にデータパケットを分析することをお勧めします。

OSS PostObject のコールバックがトリガーされない

OSS PostObject のコールバックはトリガーされませんが、同じコールバックが PutObject によってトリガーされます。通常、JSON 形式が正しくないか、コールバックが失敗した場合、対応するメッセージが返されます。この場合、Put と Post のコールバック効果を個別にテストする必要があります。

  • 原因

    リクエストを送信するとき、コールバックパラメーターはファイルパラメーターの下にあります。image

  • ソリューション

    コールバックとファイルパラメーターの位置を調整します。

    この時点で、テスト結果はビジネスサーバーがリクエストを正常にキャプチャしたことを示しています。

接続プールがシャットダウンされました

Caused by: java.lang.IllegalStateException: Connection pool shut down
  at org.apache.http.util.Asserts.check(Asserts.java:34)
  at org.apache.http.pool.AbstractConnPool.lease(AbstractConnPool.java:184)
  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.requestConnection(PoolingHttpClientConnectionManager.java:251)
  at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:175)
  at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
  at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
  at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
  at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
  at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:124)
  at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:133)
  ... 8 more
  • 原因

    ossClient.shutdown() メソッドを呼び出した後も、ossClient を介してリクエストを送信し続けています。

  • ソリューション

    呼び出しロジックを確認して、ossClient.shutdown() メソッドを呼び出した後、ossClient を介してリクエストを送信しないようにしてください。

Java SDK の generatePresignedUrl によって生成されたリクエストで「リクエストの有効期限が切れました」というエラーが発生する

  • 原因

    整数オーバーフローにより、2038 年問題に関連するタイムスタンプの問題が発生します。

    URL に設定された有効期限後にアップロードリクエストが開始されます。

  • ソリューション

    整数オーバーフローの場合は、Java SDK の有効期限が 2038 年を超えないようにすることをお勧めします。

    URL に設定された有効期限後にアップロードリクエストが開始された場合は、有効期限がリクエストを開始する時刻より後になるように、適切な有効期限を設定してください。

「無効な応答」または「JAXB-API の実装がモジュールパスまたはクラスパスに見つかりません」エラー

  • 原因

    Java 9 以降を使用していて、JAXB 依存関係を追加していません。

  • ソリューション

    JAXB 依存関係を追加する方法については、「SDK のインストール」をご参照ください。

OSS SDK for Java 1.0 の OSSClient はスレッドセーフですか?

  1. はい、そうです。OSSClient はスレッドセーフであり、複数のスレッドが同じインスタンスにアクセスできます。ビジネスニーズに応じて、同じ OSSClient インスタンスを再利用するか、複数の OSSClient インスタンスを作成して個別に使用できます。

  2. OSSClient インスタンスは、内部的に接続プールを維持します。OSSClient インスタンスが不要になった場合は、シャットダウンメソッドを呼び出してインスタンスを閉じ、OSSClient インスタンスの作成が多すぎることによるリソースの枯渇を避ける必要があります。

「AccessDenied Hierarchical namespace is disabled」というエラーが報告される

  • 原因

    CreateDirectory、Rename、または DeleteDirectory API 操作を呼び出す前に、階層型名前空間が有効になっていませんでした。

  • ソリューション

    バケットを作成するときに階層型名前空間を有効にします。具体的な手順については、「バケットの作成」をご参照ください。

クライアントネットワークは正常ですが、HTTP アクセス中に「接続がリセットされました」というエラーが報告されます。どうすればよいですか?

一部の地域の通信事業者は、OSS ドメイン名をハイジャックする可能性があります。エンドポイントを介してプロトコルを HTTPS に設定することをお勧めします。詳細については、「クライアントの設定」をご参照ください。

Java 17 で「java.lang.reflect.Method.invoke(Object, Object[])」を呼び出せません。なぜなら「com.sun.xml.bind.v2.runtime.reflect.opt.Injector.defineClass」が null だからです

  • 原因

    JAXB は Java 9 で非推奨とマークされ、Java 11 で削除されました。

  • ソリューション

    次の依存関係を追加します。

        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.messaging.saaj</groupId>
            <artifactId>saaj-impl</artifactId>
            <version>1.5.1</version>
        </dependency>

Java SDK の内部ログ出力を設定するにはどうすればよいですか?

Java SDK は、ログ出力に Apache Commons Logging (JCL) フレームワークを使用します。JCL は複数のロギング実装フレームワークを使用できます。詳細については、「JCL-Configuration」をご参照ください。最も一般的なものは、JCL over log4j または JCL over SLF4j です。実装方法は次のとおりです。

  • JCL over log4j: log4j 依存関係 (log4j 2.x には複数の実装フレームワークから選択できます。デフォルトは log4j-api+log4j-core です) を導入し、log4j 設定方法に従って設定する必要があります。具体的なプロセスについては、「APACHE LOG4J-API 分離」をご参照ください。

  • JCL over slf4j: jcl-over-slf4j および slf4j 依存関係 (slf4j にも複数の実装フレームワークから選択できます。たとえば、slf4j-api+logback-classic) を導入し、slf4j 設定方法に従って設定する必要があります。具体的なプロセスについては、「SJF4J-レガシー API のブリッジング」をご参照ください。

Apache Log4j は、OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL など、さまざまなレベルのログを定義します。

log4j プロパティを設定して、SDK ログを有効または無効にします。

FAQ1