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

Object Storage Service:OSS Java SDK V1

最終更新日:May 28, 2026

GitHub | OSS SDK for Java API | mvnrepository

クイックスタート

OSS Java SDK V1 を統合するには、次の手順を実行します。

image

環境の準備

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

SDK のインストール

お使いの環境に基づいてインストール方法を選択してください。OSS Java SDK V1 の最新バージョンを使用することを推奨します。

次の例では、OSS Java SDK V1 3.18.4 を使用します。

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

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

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.18.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>
<!-- 2.3.3 以下 -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

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

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

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

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

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

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

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

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

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

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

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

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

アクセス認証情報の設定

RAM ユーザーのアクセスキーペアを使用してアクセス認証情報を設定します。

  1. RAM コンソールで、[永続的な AccessKey ペア] を持つ RAM ユーザーを作成します。 AccessKey ペアを保存し、そのユーザーに AliyunOSSFullAccess 権限を付与します。

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

    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)

クライアントの初期化

次のサンプルコードでは、China (Hangzhou) リージョンのパブリックエンドポイントを使用してクライアントを初期化します。次に、アカウントが所有するすべてのバケットを一覧表示して、セットアップを検証します。リージョンとエンドポイントの完全なリストについては、「リージョンとエンドポイント」をご参照ください。

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 V1 のタイムアウト期間の設定をご参照ください。

ClientConfiguration.setSupportCname

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

ClientConfiguration.setCrcCheckEnabled

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

ClientConfiguration.setSLDEnabled

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

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 のセキュリティポリシーによりアクセス拒否やプレビュー失敗をトリガーする可能性があります。カスタムドメイン名のバインドにより、これらの制限を回避し、ファイルプレビューを直接有効化できるほか、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)
    // 内部エンドポイントを使用します。ここでは例として China (Hangzhou) リージョンを使用します。他のリージョンの場合は、実際のエンドポイントを指定してください。
    .endpoint("oss-cn-hangzhou-internal.aliyuncs.com")
    .build();

タイムアウト制御

ユースケースに応じてタイムアウト パラメータを調整します。大容量ファイルの転送や不安定なネットワークの場合は、タイムアウトを長く設定します。高同時実行で軽量な操作の場合は、リソースを迅速に解放するために、より短いタイムアウトを使用します。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// 許可される HTTP 接続の最大数を設定します。デフォルトは 1024 です。
clientBuilderConfiguration.setMaxConnections(1024)
    // ソケット層でのデータ転送のタイムアウト期間 (ミリ秒) を設定します。デフォルトは 50000 ミリ秒です。
    .setSocketTimeout(50000)
    // 接続確立のタイムアウト期間 (ミリ秒) を設定します。デフォルトは 50000 ミリ秒です。
    .setConnectionTimeout(50000)
    // コネクションプールから接続を取得する際のタイムアウト期間 (ミリ秒) を設定します。デフォルトでは、タイムアウト制限はありません。
    .setConnectionRequestTimeout(60 * 60 * 24 * 1000)
    // 接続のアイドルタイムアウト期間 (ミリ秒) を設定します。接続がこの期間よりも長くアイドル状態の場合、接続は閉じられます。デフォルトは 60000 ミリ秒です。
    .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 リクエストをプロキシサーバー経由で転送します。

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 を使用して通信プロトコルを設定します。デフォルトは HTTP です。本番環境では、安全なデータ転送を確保し、中間者攻撃を防ぐために HTTPS を使用してください。

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

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

署名バージョン

重要

Alibaba Cloud Object Storage Service (OSS) の署名 V1 は、次のスケジュールに従って段階的に廃止されます。サービスに影響が出ないよう、できるだけ早く 署名 V4 へのアップグレード を推奨します。

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

  • 2025 年 9 月 1 日以降、署名 V1 の更新とメンテナンスは終了し、新しいバケットでは署名 V1 を使用できなくなります。

setSignatureVersion を使用して、署名アルゴリズムのバージョンを設定できます。署名 V4 を使用する場合は、region パラメーターを使用して正しい リージョン ID を指定する必要があります。V4 署名アルゴリズムにより、セキュリティが向上します。OSS Java SDK V1 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 アドレスによる直接アクセスは DNS 名前解決をバイパスするため、効率が向上します。ルーティング設定については、「OSS の内部エンドポイントと VIP CIDR ブロック」をご参照ください。

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

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

CRC チェック

転送の整合性を確保するため、CRC データチェックはデフォルトで有効になっています。本番環境では CRC を有効のままにしてください。ライブプレビューストリーム、IoT デバイスのデータ、低品質の監視ビデオ、または信頼性が非常に高い内部ネットワークでのバッチ転送など、軽微なデータ損失が許容されるシナリオでのみ、無効化を検討してください。無効化する前に、データ整合性のリスクを十分に評価してください。

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

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

シングルトンパターン

シングルトンパターンを使用して OSSClient インスタンスを作成および管理します。

  • OSSClient はスレッドセーフです。シングルトンパターンを使用して単一の OSSClient インスタンスを再利用し、頻繁な作成と破棄によるオーバーヘッドを回避します。

  • OSSClient は内部コネクションプールを維持します。不要になったら、shutdown メソッドを呼び出してリソースを解放します。

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 Java SDK V1 は、2 つの例外タイプをスローします。 ClientException と OSSException は、どちらも RuntimeException を継承しています。

クライアント例外 (ClientException)

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

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

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

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

ClientException は、リクエストが OSS サーバーに送信されなかったか、クライアント側の処理中にエラーが発生したことを意味します。 ネットワーク接続とクライアント設定を確認してください。

サーバー例外 (OSSException)

サーバー例外は、リクエストが OSS に到達したものの、拒否されたことを意味します。 OSSException には、次の情報が含まれます。

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

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

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

これら 2 つの例外タイプを個別にキャッチして、エラーを正確に特定し、処理してください。

// OSS 操作の実行

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 Java SDK V1 には、バケット管理、ファイル操作、アクセス制御、暗号化転送を対象としたサンプルコードが用意されています:

サンプルファイル

サンプル内容

BucketOperationsSample.java

BucketTaggingSample.java

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

BucketInventorySample.java

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

BucketPolicySample.java

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

BucketWormSample.java

保持ポリシー (OSS Java SDK V1)

SetRequestPaymentSample.java

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

BucketReplicationSample.java

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

BucketTransferAccelerationSample.java

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

CreateFolderSample.java

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

PostObjectSample.java

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

説明

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

AppendObjectSample.java

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

UploadSample.java

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

MultipartUploadSample.java

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

CallbackSample.java

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

SimpleGetObjectSample.java

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

DownloadSample.java

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

ConcurrentGetObjectSample.java

並行ダウンロード (OSS Java SDK V1)

GetProgressSample.java

GetStartedSample.java

ObjectMetaSample.java

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

StorageTypeSample.java

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

ListObjectsSample.java

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

BucketMetaQuerySample.java

スカラー検索 (OSS Java SDK V1)

SelectObjectSample.java

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

DeleteObjectsSample.java

ファイルの削除 (OSS Java SDK V1)

UploadPartCopySample.java

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

ObjectOperationSample.java

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

RestoreObjectSample.java

ファイルの復元 (OSS Java SDK V1)

SymLinkSample.java

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

BucketVersioningSample.java

バージョニングの管理 (OSS Java SDK V1)

ObjectTaggingSample.java

TrafficLimitSample.java

単一接続の帯域制限 (OSS Java SDK V1)

クライアント側の暗号化 (OSS Java SDK V1)

EncryptionServiceSample.java

サーバー側の暗号化 (OSS Java SDK V1)

AuthorizedAccessSample.java

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

CRCSample.java

データ検証 (OSS Java SDK V1)

ImageSample.java

画像処理 (OSS Java SDK V1)

アクセス認証情報の設定

OSS では、複数の認証情報の初期化方法を利用できます。認証要件に応じていずれかを選択してください。

アクセス認証情報の選択方法

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

シナリオ

既存のアクセスキーペアまたは STS トークンの要否

基礎となる認証情報

認証情報の有効期間

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

RAM ユーザーのアクセスキーペアを使用

外部攻撃の影響を受けにくい安全で安定した環境にデプロイされており、認証情報を頻繁にローテーションせずに Alibaba Cloud サービスへ長期アクセスする必要があるアプリケーション。

はい

AccessKey

長期

手動ローテーション

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 トークン

一時的

自動更新

自動ローテーションされるアクセスキーペアを使用

アクセスキーペアの漏洩リスクがある環境にデプロイされており、認証情報を頻繁にローテーションしながら Alibaba Cloud サービスへ長期アクセスする必要があるアプリケーション。

いいえ

AccessKey

長期

自動ローテーション

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

前述の認証情報の設定方法が要件を満たさない場合は、認証情報の取得方法をカスタマイズします。

カスタム

アクセスキーペアまたは Security Token Service トークン

カスタム

カスタム

デフォルトの認証情報チェーンを使用

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

いいえ

アクセスキーペアまたは Security Token Service トークン

カスタム

カスタム

RAM ユーザーのアクセスキーペアの使用

セキュアな環境で、頻繁な認証情報のローテーションを行わずに OSS へ長期アクセスする必要があるアプリケーションに適しています。RAM ユーザーのアクセスキーペア (AccessKey ID と AccessKey シークレット) を使用して認証情報プロバイダーを初期化します。この方法では、アクセスキーペアを手動でメンテナンスする必要があるため、セキュリティリスクが高まります。

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

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

環境変数

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

    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();
        }
    }

静的認証情報

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

重要

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

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 への一時的なアクセスを必要とするアプリケーションに適しています。STS から取得した一時的な認証情報 (AccessKey ID、AccessKey シークレット、セキュリティトークン) を使用して認証情報プロバイダーを初期化します。繰り返しアクセスする場合は、STS トークンを手動で更新する必要があります。

重要

環境変数

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

    Mac OS/Linux/Unix

    重要
    • ここでは、STS サービスから取得した一時的な ID 認証情報 (AccessKey ID、AccessKey シークレット、セキュリティトークン) を使用します。RAM ユーザーの 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

    重要
    • ここでは、STS サービスから取得した一時的な ID 認証情報 (AccessKey ID、AccessKey シークレット、セキュリティトークン) を使用します。RAM ユーザーの AccessKey ペア (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 {
        // RAM ユーザーの認証情報ではなく、STS サービスから取得した一時的な AccessKey ID、AccessKey シークレット、セキュリティトークンを設定してください。
        // 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 ロールの ARN を指定して認証情報プロバイダーを初期化します。SDK は AssumeRole API を呼び出すことで、STS トークンを自動的に取得および更新します。policy パラメーターを使用して、RAM ロールの権限をより限定的にすることもできます。

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

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

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

  1. credentials 依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. アクセスキーペアと 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。RoleArn は ALIBABA_CLOUD_ROLE_ARN 環境変数を介して設定できます。
            config.setRoleArn("<RoleArn>");
            // 環境変数からアクセスキー ID を取得します。
            config.setAccessKeyId(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_ID"));
            // 環境変数からシークレットアクセスキーを取得します。
            config.setAccessKeySecret(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // ロールセッション名。RoleSessionName は ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を介して設定できます。
            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 (ACK) のワーカーノード上のアプリケーションに適しています。RAM ロールをインスタンスにアタッチすることで、手動での認証情報管理なしで、ACK または ECS 内で STS トークンが自動的に取得および更新されます。ECSRAMRole を取得するには、「RAM ロールの作成」をご参照ください。ロールをアタッチするには、「インスタンス RAM ロール」をご参照ください。

  1. credentials の依存関係を追加します。

    <!-- 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 (ACK) でワーカーノードの RAM ロールを設定すると、対応するノード上のポッド内のアプリケーションは、ECS にデプロイされたアプリケーションと同様に、グローバルメタサービスを介してアタッチされたロールの STS トークンを取得できます。ただし、信頼できないアプリケーションがコンテナクラスターにデプロイされている場合 (例えば、お客様から提供された、コードが公開されていないアプリケーション)、これらのアプリケーションがグローバルメタサービスを介してワーカーノードにアタッチされたインスタンス RAM ロールの STS トークンを取得することを望まない場合があります。クラウドリソースのセキュリティに影響を与えることなく、これらの信頼できないアプリケーションが必要な STS トークンを安全に取得し、アプリケーションレベルでの権限の最小化を実現できるようにするには、サービスアカウント用の RAM ロール (RRSA) 機能を使用できます。この方法の基盤となる実装は STS トークンに基づいています。Alibaba Cloud コンテナクラスターは、異なるアプリケーションポッドに対応するサービスアカウント OIDC トークンファイルを作成してマウントし、関連する設定情報を環境変数に設定します。SDK は、環境変数からの設定情報を使用して STS サービスの AssumeRoleWithOIDC API を呼び出すことで、バインドされたロールの STS トークンを取得します。この方法では、AccessKey ペアまたは STS トークンを提供する必要がないため、手動でこれらを管理するリスクがなくなります。詳細については、「RRSA を使用してサービスアカウントに RAM 権限を設定し、ポッドの権限分離を実現する」をご参照ください。

  1. credentials 依存関係を追加します。

    <!-- 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。RoleArn は ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
            config.setRoleArn("<RoleArn>");
            // OIDC プロバイダーの ARN。OidcProviderArn は ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を使用して設定できます。
            config.setOidcProviderArn("<OidcProviderArn>");
            // OIDC トークンファイルへのパス。OidcTokenFilePath は ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を使用して設定できます。
            config.setOidcTokenFilePath("<OidcTokenFilePath>");
            // ロールセッションの名前。RoleSessionName は ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して設定できます。
            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 の使用

柔軟な認証情報管理のために外部システムから認証情報を取得するアプリケーションに適しています。STS トークンを返す URI を使用して、認証情報プロバイダーを初期化します。SDK は、指定された URI からトークンを自動的に取得し、更新します。

  1. SDK が 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/` という形式です。`CredentialsURI` は `ALIBABA_CLOUD_CREDENTIALS_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` インスタンスを作成します。
            // `OSSClient` インスタンスが不要になったら、`shutdown` メソッドを呼び出してリソースを解放します。
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

AccessKey ペアの自動ローテーションの使用

AccessKey の漏洩リスクがある環境で、OSS への長期アクセスを必要とするアプリケーションに適しています。ClientKey を使用して認証情報プロバイダーを初期化します。KMS は、マネージド RAM ユーザーの AccessKey ペアを自動的にローテーションし、静的認証情報を動的化して漏洩リスクを低減します。KMS は即時ローテーションもサポートしています。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 に固定
    # ClientKey 読み取り用の復号化パスワード:環境変数またはファイルからの読み取りをサポート。いずれか一方のみを設定する必要があります
    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>
    
    # ClientKey の秘密鍵ファイルへのパス
    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();
        }
    }
    

カスタムアクセス認証情報の使用

上記のいずれの認証情報の設定方法も要件を満たさない場合、Credential Providers インターフェイスを実装することで、認証情報プロバイダーをカスタマイズできます。基盤となる実装が 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 accessKeySecret = null;
            // 変数を初期化します
            // String token = null;

            @Override
            public void setCredentials(Credentials credentials) {
            }

            @Override
            public Credentials getCredentials() {
                // TODO
                // アクセス認証情報を取得するメソッドをカスタマイズします。

                // 長期的な認証情報を返します: access_key_id, access_key_secret  
                return new DefaultCredentials(accessKeyId, accessKeySecret);

                // 一時的な認証情報を返します: access_key_id, access_key_secret, token
                // 一時的な認証情報の場合、有効期限に基づいて更新する必要があります。
                // return new DefaultCredentials(accessKeyId, accessKeySecret, 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-java SDK はデフォルトの認証情報チェーンを使用します。認証情報チェーンのロジックについては、「デフォルトの認証情報チェーン」をご参照ください。

  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 Java SDK V1 を使用する際、以下のようなエラーはプロジェクト内のパッケージの競合を示します。

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

  • 解決策

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

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

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

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

パッケージの欠落

  • 原因

    OSS Java SDK V1 を使用する際、以下のようなエラーは、プロジェクトに OSS Java SDK V1 のコンパイルまたは実行に必要なパッケージが欠落している可能性があることを示します。

    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 Java SDK V1 は、以下のパッケージに依存しています:

    • 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 Java SDK V1 が依存するパッケージをプロジェクトに追加してください。次のいずれかの方法を使用できます。

    • Eclipse プロジェクト:「SDK のインストール」をご参照ください。

    • Ant プロジェクト:OSS Java SDK V1 が依存するパッケージをプロジェクトの lib ディレクトリに配置してください。

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

接続タイムアウト

  • 原因

    OSS Java SDK V1 プログラムを実行すると、エンドポイントが正しくないか、ネットワーク接続の問題により、以下のようなエラーが発生することがあります。

    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 シークレットの取得方法については、「アクセスキーペアの作成」をご参照ください。

  • 原因 2:署名付き URL の誤った使用方法

    以下は、署名付き URL の誤った使用例です。

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

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

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

    解決策

    Method パラメーターを指定し、ヘッダーのプレフィックスを修正してください。

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

    • OSS SDK のバージョンが 3.7.0 より前で、プロジェクトに 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 標準に準拠した文字のみを渡してください。

「Failed to parse the response result」例外

FAQ3

  • 原因

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

    Java 9 以降で OSS Java SDK V1 を使用していて、pom.xml ファイルに JAXB 関連の依存関係を追加していない場合。

  • 解決策

    HTTPS リクエストに切り替えてください。

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

org.apache.http.NoHttpResponseException: The target server failed to respond

  • 原因

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

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

  • 解決策

    OSS Java SDK V1 をバージョン 2.1.2 以降にアップグレードしてください。

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

  • 原因

    ossClient が正しくクローズされていません。

  • 解決策

    実行が終了した後に ossClient をクローズするか、シングルトンパターンを使用してください。

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

  • 原因

    OSS Java SDK V1 の呼び出しが応答しません。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 Java SDK V1 のトラブルシューティング」をご参照ください。

接続のクローズ

  • 原因

    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 分以上アイドル状態の接続をクローズします。

  • 解決策

    毎回データの一部のみを読み取り、処理時間が変動する場合は、接続のクローズを避けるために範囲指定ダウンロードを使用してください。範囲指定ダウンロードが完了すると、接続は自動的にクローズされます。「範囲指定ダウンロード (OSS Java SDK V1)」をご参照ください。

メモリリーク

  • 原因

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

    分析結果が下の図のようになる場合(PoolingHttpClientConnectionManager がメモリの 96% を占有)、原因はプログラム内で new OSSClient が複数回実行されたにもかかわらず、ossClient.shutdown が呼び出されなかったことです。

  • 解決策

    new OSSClient 操作が完了した後、shutdown メソッドを呼び出してクローズしてください。new OSSClientossClient.shutdown がペアで使用されていることを確認してください。

ossClient.shutdown の呼び出し時に InterruptedException が報告される

  • 原因

    2.3.0 より前のバージョンの OSS Java SDK V1 は、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 : Speicified endpoint or uri is not valid」例外

  • 原因

    • クライアントから STS への同時リクエストが多すぎること。

    • サーバーへのネットワーク接続がタイムアウトすること。

    • 使用している STS SDK と SDK コアが最新バージョンではないこと。

  • 解決策

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

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

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

NoSuchKey

  • 原因

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

  • 解決策

    404 エラー」をご参照ください。

SocketException

  • 原因

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

  • 解決策

    以下の点を確認することを推奨します。

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

    • ホストのソケット接続数が上限に達していないかどうか。

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

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

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

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

  • 原因

    リクエストを送信する際、callback パラメーターが誤って file パラメーター内に配置されています。image

  • 解決策

    callback と file パラメーターの位置を調整してください。

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

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

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 によって生成されたリクエストで「Request has expired」エラーが発生する

  • 原因

    整数オーバーフローが原因で、2038年問題に関連するタイムスタンプの問題が発生すること。

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

  • 解決策

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

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

「Invalid Response」または「Implementation of JAXB-API has not been found on module path or classpath」エラー

  • 原因

    Java 9 以降を使用しているにもかかわらず、JAXB の依存関係が追加されていないこと。

  • 解決策

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

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

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

  2. OSSClient インスタンスは内部で接続プールを維持します。OSSClient インスタンスが不要になった場合は、shutdown メソッドを呼び出してクローズし、OSSClient インスタンスを多数作成することによるリソースの枯渇を避ける必要があります。

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

  • 原因

    CreateDirectory、Rename、または DeleteDirectory API を呼び出す前に、階層型名前空間が有効にされていません。

  • 解決策

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

クライアントネットワークは正常なのに、HTTP アクセス中に「Connection reset」エラーが報告されます。どうすればよいですか?

一部の地域の通信事業者が OSS ドメイン名をハイジャックする可能性があります。エンドポイントを通じて HTTPS を設定してください。「クライアントの設定」をご参照ください。

Java 17 で「Cannot invoke "java.lang.reflect.Method.invoke(Object, Object[])" because "com.sun.xml.bind.v2.runtime.reflect.opt.Injector.defineClass" is 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 Separation」をご参照ください。

  • JCL over slf4j:jcl-over-slf4j と slf4j の依存関係 (slf4j も slf4j-api+logback-classic など複数の実装フレームワークから選択可能) を導入し、slf4j の設定方法に従って設定する必要があります。具体的なプロセスについては、「SLF4J-Bridging legacy APIs」をご参照ください。

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

log4j のプロパティを設定することで、SDK のログを有効または無効にできます。

FAQ1