OSS SDK for Java V2 を使用すると、Alibaba Cloud Object Storage Service (OSS) を Java アプリケーションに統合できます。この SDK を使用して、ファイルのアップロード、ダウンロード、管理ができます。この SDK は、クラウドベースのファイルストレージを必要とする開発者、ウェブサイト、企業に最適です。
クイック統合
以下の手順に従って、OSS SDK for Java V2 を統合します。
前提条件
Java 8 以降。
java -version コマンドを実行して、Java バージョンを確認できます。Java がインストールされていない場合、またはバージョンが Java 8 より前の場合は、Java をダウンロードしてインストールしてください。SDK のインストール
Maven を使用して OSS SDK for Java V2 をインストールできます。
Maven
pom.xml ファイルに以下の依存関係を追加します。<version> を Maven リポジトリの最新のバージョン番号に置き換えてください。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibabacloud-oss-v2</artifactId>
<version><!-- 最新のバージョン番号を指定します --></version>
</dependency>ソースコード
Github から OSS SDK for Java V2 の最新バージョンを取得し、Maven を使用してビルドおよびインストールします。
mvn clean install -DskipTests -Dgpg.skip=trueアクセス認証情報の設定
RAM ユーザーの AccessKey ペアを環境変数として設定し、認証情報として使用します。
RAM コンソールで、アクセス用に RAM ユーザーと [永続的な AccessKey ペア] を作成します。 AccessKey ペアを保存し、ユーザーに AliyunOSSFullAccess 権限を付与します。Linux
コマンドラインインターフェイスで以下のコマンドを実行し、環境変数の設定を
~/.bashrcファイルに追加します。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc以下のコマンドを実行して、変更を適用します。
source ~/.bashrc以下のコマンドを実行して、環境変数が設定されていることを確認します。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
ターミナルで以下のコマンドを実行して、デフォルトのシェルタイプを確認します。
echo $SHELLデフォルトのシェルタイプに応じた手順に従います。
Zsh
以下のコマンドを実行して、環境変数の設定を
~/.zshrcファイルに追加します。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc以下のコマンドを実行して、変更を適用します。
source ~/.zshrc以下のコマンドを実行して、環境変数が設定されていることを確認します。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
以下のコマンドを実行して、環境変数の設定を
~/.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以下のコマンドを実行して、変更を適用します。
source ~/.bash_profile以下のコマンドを実行して、環境変数が設定されていることを確認します。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Windows
CMD
コマンドプロンプトで以下のコマンドを実行します。
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"以下のコマンドを実行して、環境変数が設定されていることを確認します。
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
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)以下のコマンドを実行して、環境変数が設定されていることを確認します。
[Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
クライアントの初期化
リージョンを指定して OSSClient を初期化します。
OSSClient は AutoCloseable を実装しています。try-with-resources 文を使用してインスタンスを作成すると、リソースは自動的に解放されるため、手動で close() を呼び出す必要はありません。
OSSClient インスタンスの作成と破棄には時間がかかる場合があります。シングルトンパターンを使用して OSSClient インスタンスを再利用することを推奨します。このパターンを使用する場合、リソースリークを防ぐために、アプリケーションが終了する前に手動で close() を呼び出す必要があります。
同期 OSSClient
操作が完了するのを待ってから次に進みたい場合は、同期 OSSClient を使用します。
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.OSSClientBuilder;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.exceptions.ServiceException;
import com.aliyun.sdk.service.oss2.models.*;
import com.aliyun.sdk.service.oss2.paginator.ListBucketsIterable;
public class Example {
public static void main(String[] args) {
String region = "cn-hangzhou";
CredentialsProvider provider = new EnvironmentVariableCredentialsProvider();
OSSClientBuilder clientBuilder = OSSClient.newBuilder()
.credentialsProvider(provider)
.region(region);
try (OSSClient client = clientBuilder.build()) {
ListBucketsIterable paginator = client.listBucketsPaginator(
ListBucketsRequest.newBuilder()
.build());
for (ListBucketsResult result : paginator) {
for (BucketSummary info : result.buckets()) {
System.out.printf("bucket: name:%s, region:%s, storageClass:%s\n", info.name(), info.region(), info.storageClass());
}
}
} catch (Exception e) {
// ServiceException se = ServiceException.asCause(e);
// if (se != null) {
// System.out.printf("ServiceException: requestId:%s, errorCode:%s\n", se.requestId(), se.errorCode());
// }
System.out.printf("error:\n%s", e);
}
}
}非同期 OSSClient
各操作の結果を待たずに複数の OSS 操作を同時に処理したい場合は、非同期 OSSClient を使用します。
import com.aliyun.sdk.service.oss2.OSSAsyncClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.exceptions.ServiceException;
import com.aliyun.sdk.service.oss2.models.*;
import java.util.concurrent.CompletableFuture;
public class ExampleAsync {
public static void main(String[] args) {
String region = "cn-hangzhou";
CredentialsProvider provider = new EnvironmentVariableCredentialsProvider();
try (OSSAsyncClient client = OSSAsyncClient.newBuilder()
.region(region)
.credentialsProvider(provider)
.build()) {
CompletableFuture<ListBucketsResult> future = client.listBucketsAsync(
ListBucketsRequest.newBuilder().build()
);
future.thenAccept(result -> {
for (BucketSummary info : result.buckets()) {
System.out.printf("bucket: name:%s, region:%s, storageClass:%s\n",
info.name(), info.region(), info.storageClass());
}
})
.exceptionally(e -> {
// ServiceException se = ServiceException.asCause(e);
// if (se != null) {
// System.out.printf("Async ServiceException: requestId:%s, errorCode:%s\n",
// se.requestId(), se.errorCode());
// }
System.out.printf("async error:\n%s\n", e);
return null;
});
future.join();
} catch (Exception e) {
System.out.printf("main error:\n%s\n", e);
}
}
}コードを実行すると、アカウントに関連付けられているすべてのリージョンのバケットがリスト表示されます。
bucket: name: examplebucket01, region: cn-hangzhou, storageClass: Standard
bucket: name: examplebucket02, region: cn-hangzhou, storageClass: Standardクライアント設定
カスタムドメイン名の使用
デフォルトの OSS ドメイン名でアクセスすると、ファイルにアクセスできない、またはプレビューに失敗するなどの問題が発生する可能性があります。カスタムドメイン名を使用して OSS にアクセスすると、ブラウザで直接ファイルをプレビューしたり、CDN を使用してコンテンツ配信を高速化したりできます。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 環境変数から認証情報を読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンを指定します。例えば、中国 (杭州) の場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// カスタムドメイン名を指定します。例えば、www.example-***.com。
String endpoint = "https://www.example-***.com";
// 設定情報を使用して OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.endpoint(endpoint)
// 注意:useCName を true に設定して CNAME オプションを有効にしないと、カスタムドメイン名を使用できません。
.useCName(true)
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}タイムアウト制御
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
import java.time.Duration;
public class Example {
public static void main(String[] args) {
// 環境変数から認証情報を読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンを指定します。例えば、中国 (杭州) の場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// 設定情報を使用して OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
// 接続確立のタイムアウトを設定します。デフォルト値は 5 秒です。
.connectTimeout(Duration.ofSeconds(30))
// データの読み書きのタイムアウトを設定します。デフォルト値は 20 秒です。
.readWriteTimeout(Duration.ofSeconds(30))
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}リトライポリシー
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
import com.aliyun.sdk.service.oss2.retry.*;
import java.time.Duration;
public class Example {
public static void main(String[] args) {
/*
* SDK リトライポリシー設定の説明:
*
* デフォルトのリトライポリシー:
* リトライポリシーが設定されていない場合、SDK は StandardRetryer をデフォルトのクライアント実装として使用します。
* そのデフォルト設定は以下の通りです:
* - maxAttempts: 最大試行回数を設定します。デフォルトは 3 です。
* - maxBackoff: 最大バックオフ時間を秒単位で設定します。デフォルトは 20 秒です。
* - baseDelay: 基本遅延時間を秒単位で設定します。デフォルトは 0.2 秒です。
* - backoffDelayer: バックオフアルゴリズムを設定します。デフォルトは FullJitter バックオフアルゴリズムです。
* 計算式:[0.0, 1.0) * min(2^attempts * baseDelay, maxBackoff)
* - errorRetryables: リトライ可能なエラータイプ。HTTP ステータスコード、サービスエラーコード、クライアントエラーが含まれます。
*
* リトライ可能なエラーが発生した場合、提供された設定を使用して遅延させ、リクエストを再試行します。
* リクエストの全体的なレイテンシは、リトライ回数とともに増加します。デフォルト設定が
* シナリオの要件を満たさない場合は、リトライパラメーターを設定するか、リトライ実装を変更できます。
*/
// 環境変数から認証情報を読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンを指定します。例えば、中国 (杭州) の場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// リトライポリシー設定の例:
// 1. 最大リトライ回数をカスタマイズします (デフォルトは 3、ここでは 5 に設定)。
Retryer customRetryer = StandardRetryer.newBuilder()
.maxAttempts(5)
.build();
// 2. バックオフ遅延時間をカスタマイズします。
// baseDelay を 0.5 秒 (デフォルト 0.2 秒)、maxBackoff を 25 秒 (デフォルト 20 秒) に調整します。
// Retryer customRetryer = StandardRetryer.newBuilder()
// .backoffDelayer(new FullJitterBackoff(Duration.ofMillis(500), Duration.ofSeconds(25)))
// .build();
// 3. バックオフアルゴリズムをカスタマイズします。
// デフォルトの FullJitter アルゴリズムの代わりに、固定遅延バックオフアルゴリズムを使用し、毎回 2 秒遅延させます。
// Retryer customRetryer = StandardRetryer.newBuilder()
// .backoffDelayer(new FixedDelayBackoff(Duration.ofSeconds(2)))
// .build();
// 4. リトライポリシーを無効にします。
// すべてのリトライ試行を無効にするには、NopRetryer 実装を使用します。
// Retryer customRetryer = new NopRetryer();
// 設定情報を使用して OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.retryer(customRetryer)
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}HTTP/HTTPS プロトコル
disableSsl(true) を使用して HTTPS プロトコルを無効にできます。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 環境変数から認証情報を読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンを指定します。例えば、中国 (杭州) の場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// 設定情報を使用して OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
// HTTPS リクエストを使用しないように設定します。
.disableSsl(true)
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}内部エンドポイントの使用
内部エンドポイントを使用して同じリージョン内の OSS リソースにアクセスすることで、トラフィックコストを削減し、アクセス速度を向上させることができます。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 環境変数から認証情報を読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 方法 1:リージョンを指定し、useInternalEndpoint を true に設定します。
// バケットが配置されているリージョンを指定します。例えば、中国 (杭州) の場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// // 方法 2:リージョンとエンドポイントを直接指定します。
// // バケットが配置されているリージョンを指定します。例えば、中国 (杭州) の場合は、リージョンを cn-hangzhou に設定します。
// String region = "cn-hangzhou";
// // バケットのリージョンの内部エンドポイントを指定します。中国 (杭州) の場合、エンドポイントは 'oss-cn-hangzhou-internal.aliyuncs.com' です。
// String endpoint = "oss-cn-hangzhou-internal.aliyuncs.com";
// 設定情報を使用して OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.useInternalEndpoint(true)
// .endpoint(endpoint) // 方法 2 を使用する場合は、この行のコメントを解除し、前の行をコメントアウトします。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}転送アクセラレーションエンドポイントの使用
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 環境変数から認証情報を読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 方法 1:リージョンを指定し、useAccelerateEndpoint を true に設定します。
// バケットが配置されているリージョンを指定します。例えば、中国 (杭州) の場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// // 方法 2:リージョンと転送アクセラレーションエンドポイントを直接指定します。
// // バケットが配置されているリージョンを指定します。例えば、中国 (杭州) の場合は、リージョンを cn-hangzhou に設定します。
// String region = "cn-hangzhou";
// // バケットのリージョンの転送アクセラレーションエンドポイントを指定します。例えば、'https://oss-accelerate.aliyuncs.com'。
// String endpoint = "https://oss-accelerate.aliyuncs.com";
// 設定情報を使用して OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.useAccelerateEndpoint(true)
// .endpoint(endpoint) // 方法 2 を使用する場合は、この行のコメントを解除し、前の行をコメントアウトします。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}プライベートドメインの使用
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 環境変数から認証情報を読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンを指定します。例えば、中国 (杭州) の場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// プライベートドメインを指定します。例えば:https://service.corp.example.com
String endpoint = "https://service.corp.example.com";
// 設定情報を使用して OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.endpoint(endpoint)
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}ガバメントクラウドのドメイン名の使用
次のサンプルコードは、Alibaba Gov Cloud ドメイン名を使用して OSSClient を設定する方法を示します。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 環境変数から認証情報を読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// リージョンとエンドポイントを指定します。
// バケットが配置されているリージョンを指定します。中国 (北京) ガバメントクラウド 1 の場合、リージョンを cn-north-2-gov-1 に設定します。
String region = "cn-north-2-gov-1";
// バケットのリージョンの内部エンドポイントを指定します。中国 (北京) ガバメントクラウド 1 の場合、エンドポイントは 'https://oss-cn-north-2-gov-1-internal.aliyuncs.com' です。
// HTTP プロトコルを指定するには、ドメインを 'http://oss-cn-north-2-gov-1-internal.aliyuncs.com' に設定します。
String endpoint = "https://oss-cn-north-2-gov-1-internal.aliyuncs.com";
// 設定情報を使用して OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.endpoint(endpoint)
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}カスタム HTTPClient の使用
標準の設定パラメーターが要件を満たさない場合は、カスタム HTTP クライアントを使用できます。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
import com.aliyun.sdk.service.oss2.transport.HttpClient;
import com.aliyun.sdk.service.oss2.transport.HttpClientOptions;
import com.aliyun.sdk.service.oss2.transport.apache5client.Apache5HttpClientBuilder;
import java.time.Duration;
public class Example {
public static void main(String[] args) {
// 環境変数から認証情報を読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンを指定します。例えば、中国 (杭州) の場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// HTTP クライアントのパラメーターを設定します。
HttpClientOptions httpClientOptions = HttpClientOptions.custom()
// 接続タイムアウト。デフォルト値は 5 秒です。
.connectTimeout(Duration.ofSeconds(30))
// データの読み書きのタイムアウト。デフォルト値は 20 秒です。
.readWriteTimeout(Duration.ofSeconds(30))
// 最大接続数。デフォルト値は 1024 です。
.maxConnections(2048)
// 証明書検証をスキップするかどうかを指定します。デフォルトでは false です。
.insecureSkipVerify(false)
// HTTP リダイレクトを有効にするかどうかを指定します。デフォルトでは無効です。
.redirectsEnabled(false)
// プロキシサーバーを設定します。
// .proxyHost("http://user:passswd@proxy.example-***.com")
.build();
// HTTP クライアントを作成し、HTTP クライアントパラメーターを渡します。
HttpClient httpClient = Apache5HttpClientBuilder.create()
.options(httpClientOptions)
.build();
// 設定情報を使用して OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.httpClient(httpClient)
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}アクセス認証情報の種類と設定
OSS SDK for Java V2 は、アクセス認証情報を設定するための複数の方法を提供します。認証と権限付与のニーズに応じて、適切な初期化方法を選択できます。
アクセス認証情報の選択方法
RAM ユーザーの AccessKey ペアの使用
Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey Secret) を使用して、認証情報プロバイダーを初期化できます。この方法は、アプリケーションが安全で安定した環境にデプロイされており、外部からの攻撃に脆弱でなく、OSS への長期的なアクセスが必要で、頻繁な認証情報のローテーションが許容されない場合に適しています。ただし、この方法では AccessKey ペアを手動で管理する必要があり、セキュリティリスクとメンテナンスの複雑さが増します。
Alibaba Cloud アカウントは、そのリソースに対する完全な権限を持っています。AccessKey ペアが漏洩すると、システムに重大なセキュリティリスクをもたらします。Alibaba Cloud アカウントの AccessKey ペアを使用せず、最小限の必要な権限を持つ RAM ユーザーの AccessKey ペアを使用することを推奨します。
RAM ユーザーの AccessKey ペアを作成する方法については、「AccessKey の作成」をご参照ください。RAM ユーザーの AccessKey ペアは、作成時にのみ表示されます。AccessKey ペアを保存する必要があります。AccessKey ペアを忘れた場合は、新しく作成する必要があります。
環境変数の設定
Linux/macOS
RAM ユーザーの AccessKey ペアで環境変数を設定します。
export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID' export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'以下のコマンドを実行して、環境変数が設定されていることを確認します。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Windows
CMD
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"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)コードサンプル
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
public class OSSExample {
public static void main(String[] args) {
// 環境変数から認証情報を読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // バケットが配置されているリージョンを指定します。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Operation failed: " + e.getMessage());
}
}
}静的な認証情報の設定
以下のコードは、AccessKey ペアを明示的に設定してアクセス認証情報をハードコーディングする方法を示しています。
本番アプリケーションにアクセス認証情報を埋め込まないでください。この方法はテスト目的でのみ使用します。
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.StaticCredentialsProvider;
public class OSSExample {
public static void main(String[] args) {
// 静的な認証情報プロバイダーを作成し、AccessKey ペアを明示的に設定します。
// ご利用の RAM ユーザーの AccessKey ID と AccessKey Secret に置き換えてください。
CredentialsProvider credentialsProvider = new StaticCredentialsProvider(
"YOUR_ACCESS_KEY_ID",
"YOUR_ACCESS_KEY_SECRET"
);
// OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // バケットが配置されているリージョンを指定します。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Operation failed: " + e.getMessage());
}
}
}STS トークンの使用
アプリケーションが OSS への一時的なアクセスを必要とする場合、Security Token Service (STS) から取得した一時的な認証情報 (AccessKey ID、AccessKey Secret、およびセキュリティトークン) を使用して認証情報プロバイダーを初期化できます。ただし、この方法では STS トークンを手動で管理する必要があり、セキュリティリスクとメンテナンスの複雑さが増します。さらに、OSS に複数回一時的にアクセスするには、STS トークンを手動でリフレッシュする必要があります。
OpenAPI を使用して STS トークンを迅速に取得する方法については、「AssumeRole - RAM ロールの一時的な認証情報を取得する」をご参照ください。
SDK を使用して STS トークンを取得する方法については、「STS トークンを使用して OSS にアクセスする」をご参照ください。
STS トークンを生成する際には、有効期限を指定する必要があります。トークンは有効期限が切れると無効になり、使用できなくなります。
STS サービスエンドポイントのリストについては、「サービスエンドポイント」をご参照ください。
環境変数の設定
この方法では、RAM ユーザーの AccessKey ペアではなく、STS から取得した一時的な認証情報 (AccessKey ID、AccessKey Secret、およびセキュリティトークン) を使用します。
STS から取得した AccessKey ID は「STS」で始まります。例:「STS.L4aBSCSJVMuKg5U1****」。
Linux/macOS
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
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>コードサンプル
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
public class OSSExample {
public static void main(String[] args) {
// OSS へのアクセスに必要な認証情報を環境変数から読み込み、ID 検証を行います。
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // バケットが配置されているリージョンを指定します。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Operation failed: " + e.getMessage());
}
}
}静的な認証情報の設定
以下のコードは、一時的な AccessKey ペアを明示的に設定してアクセス認証情報をハードコーディングする方法を示しています。
本番アプリケーションにアクセス認証情報を埋め込まないでください。この方法はテスト目的でのみ使用します。
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.StaticCredentialsProvider;
public class OSSExample {
public static void main(String[] args) {
// 取得した一時的な AccessKey ID と AccessKey Secret を指定します。
// STS から取得した AccessKey ID は「STS」で始まることに注意してください。
String stsAccessKeyId = "STS.****************";
String stsAccessKeySecret = "yourAccessKeySecret";
String stsSecurityToken = "yourSecurityToken";
// 静的な認証情報プロバイダーを作成し、一時的な AccessKey ペアと STS トークンを明示的に設定します。
CredentialsProvider credentialsProvider = new StaticCredentialsProvider(
stsAccessKeyId,
stsAccessKeySecret,
stsSecurityToken
);
// OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // バケットが配置されているリージョンを指定します。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Operation failed: " + e.getMessage());
}
}
}RAM ロール ARN 認証情報の使用
アプリケーションがクロスアカウントアクセスなどのシナリオで OSS への認可されたアクセスを必要とする場合、RAM ロールの ARN を使用して認証情報プロバイダーを初期化できます。基盤となる実装では、Security Token Service (STS) のトークンを使用します。RAM ロールの ARN を指定すると、認証情報ツールは STS トークンを取得し、現在のトークンが期限切れになる前に AssumeRole API 操作を呼び出して新しいトークンを要求します。さらに、policy パラメーターを設定して RAM ロールの権限を制限できます。
Alibaba Cloud アカウントは、そのリソースに対する完全な権限を持っています。AccessKey ペアが漏洩すると、システムに重大なセキュリティリスクをもたらします。Alibaba Cloud アカウントの AccessKey ペアを使用せず、最小限の必要な権限を持つ RAM ユーザーの AccessKey ペアを使用することを推奨します。
RAM ユーザーの AccessKey ペアの作成方法の詳細については、「AccessKey の作成」をご参照ください。RAM ユーザーの AccessKey ID と AccessKey Secret は作成時にのみ表示されます。それらを保存する必要があります。忘れた場合は、新しい AccessKey ペアを作成する必要があります。
RAM ロール ARN の取得方法の詳細については、「CreateRole - RAM ロールの作成」をご参照ください。
依存関係の追加
Alibaba Cloud 認証情報管理の依存関係を pom.xml ファイルに追加します。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.4</version>
</dependency>AccessKey ペアと RAM ロール ARN をアクセス認証情報として設定
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.Credentials;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProviderSupplier;
// 注意:以下のインポートは外部依存関係 credentials-java からのものです
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
public class OSSExample {
public static void main(String[] args) {
// RAM ロール ARN 認証情報を設定します。
Config credentialConfig = new Config()
.setType("ram_role_arn")
// 環境変数から RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey Secret) を取得します。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
// 引き受ける RAM ロールの ARN。値の例:acs:ram::123456789012****:role/adminrole
// RoleArn は ALIBABA_CLOUD_ROLE_ARN 環境変数を介して設定できます。
.setRoleArn("acs:ram::123456789012****:role/adminrole")
// ロールセッション名。RoleSessionName は ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を介して設定できます。
.setRoleSessionName("your-session-name")
// より制限的な権限ポリシーを設定します。これはオプションです。値の例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
.setPolicy("{\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}")
// ロールセッションの有効期間を秒単位で設定します。デフォルトは 3600 秒 (1 時間) です。これはオプションです。
.setRoleSessionExpiration(3600);
Client credentialClient = new Client(credentialConfig);
// 動的な認証情報読み込みのための認証情報プロバイダーを作成します。
CredentialsProvider credentialsProvider = new CredentialsProviderSupplier(() -> {
try {
com.aliyun.credentials.models.Credentials cred = credentialClient.getCredential();
return new Credentials(
cred.getAccessKeyId(),
cred.getAccessKeySecret(),
cred.getSecurityToken()
);
} catch (Exception e) {
throw new RuntimeException("Failed to obtain credentials", e);
}
});
// OSS クライアントインスタンスを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // バケットが配置されているリージョンを指定します。例えば、中国 (杭州)。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Operation failed: " + e.getMessage());
}
}
}ECS RAM ロール認証情報の使用
アプリケーションが Elastic Compute Service (ECS) インスタンス、Elastic Container Instance (ECI) インスタンス、または Container Service for Kubernetes (ACK) のワーカーノードで実行される場合、ECS RAM ロールを使用して認証情報プロバイダーを初期化することを推奨します。基盤となる実装では STS トークンを使用します。ECS RAM ロールを使用すると、ロールを ECS インスタンス、ECI インスタンス、または ACK のワーカーノードに関連付けることができます。この関連付けにより、インスタンス内で STS トークンが自動的にリフレッシュされます。この方法では、AccessKey ペアや STS トークンを提供する必要がなく、手動メンテナンスのリスクを軽減します。ECS RAM ロールの取得方法の詳細については、「CreateRole - RAM ロールの作成」をご参照ください。
依存関係の追加
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.4</version>
</dependency>ECS RAM ロールをアクセス認証情報として設定
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.Credentials;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProviderSupplier;
// 注意:以下のインポートは外部依存関係 credentials-java からのものです
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
public class OSSExample {
public static void main(String[] args) {
// ECS RAM ロール認証情報を設定します。
Config credentialConfig = new Config()
.setType("ecs_ram_role") // アクセス認証情報の種類。ecs_ram_role に固定。
.setRoleName("EcsRoleExample"); // ECS インスタンスに付与された RAM ロールの名前。オプションのパラメーター。設定しない場合、自動的に取得されます。リクエストを減らすために設定することを強く推奨します。
Client credentialClient = new Client(credentialConfig);
// 動的な認証情報読み込みのための認証情報プロバイダーを作成します。
CredentialsProvider credentialsProvider = new CredentialsProviderSupplier(() -> {
try {
com.aliyun.credentials.models.Credentials cred = credentialClient.getCredential();
return new Credentials(
cred.getAccessKeyId(),
cred.getAccessKeySecret(),
cred.getSecurityToken()
);
} catch (Exception e) {
throw new RuntimeException("Failed to obtain credentials", e);
}
});
// OSS クライアントインスタンスを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // バケットが配置されているリージョンを指定します。例えば、中国 (杭州)。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Operation failed: " + e.getMessage());
}
}
}OIDC ロール ARN 認証情報の使用
Container Service for Kubernetes (ACK) でワーカーノードの RAM ロールを設定すると、そのノード上の Pod 内のアプリケーションは、ECS にデプロイされたアプリケーションと同様に、グローバルメタサービスを通じて関連付けられたロールの STS トークンを取得できます。ただし、コンテナクラスター上に信頼できないアプリケーション (例えば、ソースコードにアクセスできない顧客から提出されたアプリケーション) をデプロイする場合、それらがワーカーノードに関連付けられたインスタンス RAM ロールの STS トークンをグローバルメタサービスを通じて取得するのを防ぎたい場合があります。これらの信頼できないアプリケーションが必要な STS トークンを安全に取得し、アプリケーションレベルで最小権限の原則を実装しながらクラウドリソースを保護するために、RAM Roles for Service Account (RRSA) 機能を使用できます。基盤となる実装では STS トークンを使用します。Alibaba Cloud コンテナクラスターは、異なるアプリケーション Pod に対して対応するサービスアカウント OIDC トークンファイルを作成・マウントし、関連する設定情報を環境変数に注入します。認証情報ツールは、STS サービスの AssumeRoleWithOIDC API を呼び出し、環境変数からの設定情報を使用して、バインドされたロールの STS トークンを取得します。この方法では、AccessKey ペアや STS トークンを提供する必要がなく、手動メンテナンスのリスクを軽減します。詳細については、「RRSA を通じて ServiceAccount の RAM 権限を設定し、Pod の権限分離を実現する」をご参照ください。
依存関係の追加
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.4</version>
</dependency>OIDC ロール ARN をアクセス認証情報として設定
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.Credentials;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProviderSupplier;
// 注意:以下のインポートは外部依存関係 credentials-java からのものです
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
public class OSSExample {
public static void main(String[] args) {
// OIDC ロール ARN 認証情報を設定します。
Config credentialConfig = new Config()
// 認証情報の種類を指定します。oidc_role_arn に固定。
.setType("oidc_role_arn")
// RAM ロール ARN。RoleArn は ALIBABA_CLOUD_ROLE_ARN 環境変数を介して設定できます。
.setRoleArn(System.getenv("ALIBABA_CLOUD_ROLE_ARN"))
// OIDC プロバイダー ARN。OidcProviderArn は ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を介して設定できます。
.setOidcProviderArn(System.getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN"))
// OIDC トークンファイルパス。OidcTokenFilePath は ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を介して設定できます。
.setOidcTokenFilePath(System.getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE"))
// ロールセッション名。RoleSessionName は ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を介して設定できます。
.setRoleSessionName("your-session-name")
// より制限的な権限ポリシーを設定します。これはオプションです。値の例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
.setPolicy("{\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}")
// ロールセッションの有効期間を秒単位で設定します。デフォルトは 3600 秒 (1 時間) です。これはオプションです。
.setRoleSessionExpiration(3600);
Client credentialClient = new Client(credentialConfig);
// 動的な認証情報読み込みのための認証情報プロバイダーを作成します。
CredentialsProvider credentialsProvider = new CredentialsProviderSupplier(() -> {
try {
com.aliyun.credentials.models.Credentials cred = credentialClient.getCredential();
return new Credentials(
cred.getAccessKeyId(),
cred.getAccessKeySecret(),
cred.getSecurityToken()
);
} catch (Exception e) {
throw new RuntimeException("Failed to obtain credentials", e);
}
});
// OSS クライアントインスタンスを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // バケットが配置されているリージョンを指定します。例えば、中国 (杭州)。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Operation failed: " + e.getMessage());
}
}
}カスタムアクセス認証情報の使用
前述の認証情報設定方法が要件を満たさない場合、認証情報の取得方法をカスタマイズできます。Java SDK はこの目的のために複数の実装方法をサポートしています。
Supplier インターフェイスによる実装
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.Credentials;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProviderSupplier;
public class OSSExample {
public static void main(String[] args) {
// カスタム認証情報プロバイダーを作成します。
CredentialsProvider credentialsProvider = new CredentialsProviderSupplier(() -> {
// TODO: カスタムの認証情報取得ロジックを実装します。
// 長期的な認証情報を返します。
return new Credentials("access_key_id", "access_key_secret");
// STS トークンを返します (必要な場合)。
// return new Credentials("sts_access_key_id", "sts_access_key_secret", "security_token");
});
// OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // バケットが配置されているリージョンを指定します。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Operation failed: " + e.getMessage());
}
}
}CredentialsProvider インターフェイスの実装
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.Credentials;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
public class CustomCredentialsProvider implements CredentialsProvider {
@Override
public Credentials getCredentials() {
// TODO: カスタムの認証情報取得ロジックを実装します。
// 長期的な認証情報を返します。
return new Credentials("access_key_id", "access_key_secret");
// STS トークンを返します (必要な場合)。
// 一時的な認証情報の場合、有効期限に基づいてリフレッシュする必要があります。
// return new Credentials("sts_access_key_id", "sts_access_key_secret", "security_token");
}
}
public class OSSExample {
public static void main(String[] args) {
// カスタム認証情報プロバイダーを作成します。
CredentialsProvider credentialsProvider = new CustomCredentialsProvider();
// OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // バケットが配置されているリージョンを指定します。
.build()) {
// 作成したクライアントを後続の操作で使用します...
} catch (Exception e) {
System.err.println("Operation failed: " + e.getMessage());
}
}
}匿名アクセス
公開読み取り可能な OSS リソースにのみアクセスする必要がある場合は、認証情報を提供せずに匿名アクセスを使用できます。
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.AnonymousCredentialsProvider;
public class OSSExample {
public static void main(String[] args) {
// 匿名認証情報プロバイダーを作成します。
CredentialsProvider credentialsProvider = new AnonymousCredentialsProvider();
// OSS クライアントを作成します。
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // バケットが配置されているリージョンを指定します。
.build()) {
// 作成したクライアントを後続の操作で使用します...
// 注意:匿名アクセスは公開読み取り権限を持つリソースにのみ使用できます。
} catch (Exception e) {
System.err.println("Operation failed: " + e.getMessage());
}
}
}サンプルコード
機能分類 | サンプル説明 | 同期バージョン | 非同期バージョン |
バケット | バケットの作成 | ||
バケットのリスト表示 | |||
バケット情報の取得 | |||
バケットリージョンの取得 | |||
バケットストレージ統計の取得 | |||
バケットの削除 | |||
ファイルのアップロード | シンプルアップロード | ||
追加アップロード | |||
マルチパートアップロード | |||
マルチパートアップロードタスクのリスト表示 | |||
アップロード済みパートのリスト表示 | |||
マルチパートアップロードのキャンセル | |||
ファイルのダウンロード | シンプルダウンロード | ||
ファイル管理 | ファイルのコピー | ||
ファイルの存在確認 | |||
ファイルのリスト表示 | |||
ファイルのリスト表示 V2 | |||
ファイルの削除 | |||
複数ファイルの削除 | |||
ファイルメタデータの取得 | |||
アーカイブオブジェクト | ファイルの復元 | ||
復元されたファイルのクリーンアップ | |||
シンボリックリンク | シンボリックリンクの作成 | ||
シンボリックリンクの取得 | |||
オブジェクトタグ付け | オブジェクトタグの設定 | ||
オブジェクトタグの取得 | |||
オブジェクトタグの削除 | |||
Resource Access Management | バケット ACL の設定 | ||
バケット ACL の取得 | |||
オブジェクト ACL の設定 | |||
オブジェクト ACL の取得 | |||
バージョン管理 | バージョン管理の設定 | ||
バージョン管理ステータスの取得 | |||
オブジェクトバージョンのリスト表示 | |||
クロスドメインアクセス | CORS ルールの設定 | ||
CORS ルールの取得 | |||
CORS ルールの削除 | |||
プリフライトリクエスト | |||
システム機能 | エンドポイント情報のクエリ |