このトピックでは、Amazon Simple Storage Service (S3) API for Javaを使用してLindormTableに接続し、使用する方法について説明し、例を示します。
前提条件
Java Development Kit (JDK) V1.8以降がインストールされていること。
Lindormコンソールのワイドテーブルエンジンタブにある[S3互換アドレス]に対応するエンドポイントを取得していること。詳細については、「エンドポイントの表示」をご参照ください。
クライアントのIPアドレスがLindormインスタンスのホワイトリストに追加されていること。詳細については、「ホワイトリストの設定」をご参照ください。
手順
S3 SDK for Javaをインストールします。Eclipseクライアントを開き、プロジェクトを作成し、pom.xmlファイルでJavaのMaven依存関係を設定します。
Java SDK V1.xの場合は、設定ファイルに次のMaven依存関係を追加します。
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>1.11.655</version> </dependency>
Java SDK V2.xの場合は、設定ファイルに次のMaven依存関係を追加します。
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-sdk-java</artifactId> <version>2.17.32</version> </dependency>
要件に基づいて、プロジェクトで次のサンプルコードを使用してLindormTableに接続します。
Java SDK V1.xのサンプルコード
接続を作成します。
String s3Endpoint = "http://ld-bp17j28j2y7pm****-proxy-blob.lindorm.rds.aliyuncs.com:9053"; // S3プロトコルを使用してLindormTableに接続するために必要なエンドポイントを指定します。 String bucketName = "testbucket"; // 接続を確立します。 AmazonS3 client = AmazonS3ClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(s3Endpoint, null)) .withPathStyleAccessEnabled(true) .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("AK", "SK"))) .build();
説明サンプルコードのAKフィールドとSKフィールドを、LindormTableへの接続に実際に使用するAccessKey IDとAccessKeyシークレットに置き換えます。 AccessKey IDとAccessKeyシークレットは、ハードコーディングするのではなく、環境変数として設定するか、設定ファイルで指定することをお勧めします。
バケットに対する操作を実行します。
// バケットを作成します。 Bucket bucket = client.createBucket(bucketName); // バケットが存在するかどうかを確認します。 HeadBucketResult result = client.headBucket(new HeadBucketRequest(bucketName)); // すべてのバケットを一覧表示します。 List<Bucket> buckets = client.listBuckets(new ListBucketsRequest());
説明新しいユーザーを作成し、そのユーザーにバケットを管理する権限を付与する方法については、「ユーザーの管理」および「S3プロトコル互換における権限の管理」をご参照ください。
オブジェクトに対する操作を実行します。
String content = "content"; // オブジェクトをアップロードします。 client.putObject(bucketName, key_name, content); // オブジェクトからデータを読み取ります。 S3Object object = client.getObject(bucketName, keyName); // バケット内のすべてのオブジェクトを一覧表示します。 // list v1 ObjectListing objects = client.listObjects(bucketName); // list v2 ListObjectsV2Result results = client.listObjectsV2(bucketName); // オブジェクトを削除します。 client.deleteObject(bucketName, keyName); // 複数のオブジェクトを一度に削除します。 client.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keyName));
マルチパートアップロードタスクを実行します。
// アップロードするファイルを構成します。 File file = new File(filePath); long contentLength = file.length(); long partSize = 5 * 1024 * 1024; // 各パートのサイズを 5 MBに設定します。 List<PartETag> partETags = new ArrayList<PartETag>(); // マルチパートアップロードタスクを初期化します。 InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, keyName); InitiateMultipartUploadResult initResponse = client.initiateMultipartUpload(initRequest); // パートをアップロードします。 long filePosition = 0; for (int i = 1; filePosition < contentLength; i++) { partSize = Math.min(partSize, (contentLength - filePosition)); // マルチパートアップロードリクエストを送信します。 UploadPartRequest uploadRequest = new UploadPartRequest() .withBucketName(bucketName) .withKey(keyName) .withUploadId(initResponse.getUploadId()) .withPartNumber(i) .withFileOffset(filePosition) .withFile(file) .withPartSize(partSize); UploadPartResult uploadResult = client.uploadPart(uploadRequest); partETags.add(uploadResult.getPartETag()); filePosition += partSize; } // マルチパートアップロードタスクを完了します。タスクが完了すると、オブジェクトが表示されます。 CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucketName, keyName, initResponse.getUploadId(), partETags); client.completeMultipartUpload(compRequest);
Java SDK V2.xのサンプルコード
接続を作成します。
String s3Endpoint = "http://ld-bp17j28j2y7pm****-proxy-blob.lindorm.rds.aliyuncs.com:9053"; // S3プロトコルを使用してLindormTableに接続するために必要なエンドポイントを指定します。 String bucketName = "testbucket"; // 接続を作成します。 AwsBasicCredentials creds = AwsBasicCredentials.create("AK", "SK"); S3Client client = S3Client.builder() .serviceConfiguration(b -> b.checksumValidationEnabled(false)) .region(Region.AP_EAST_1) .credentialsProvider(StaticCredentialsProvider.create(creds)) .endpointOverride(new URI(s3Endpoint)) .build(); // 接続を閉じます。 client.close();
説明サンプルコードのAKフィールドとSKフィールドを、LindormTableへの接続に実際に使用するAccessKey IDとAccessKeyシークレットに置き換えます。 AccessKey IDとAccessKeyシークレットは、ハードコーディングするのではなく、環境変数として設定するか、設定ファイルで指定することをお勧めします。
バケットに対する操作を実行します。
// バケットを作成します。 S3Waiter s3Waiter = client.waiter(); CreateBucketRequest bucketRequest = CreateBucketRequest.builder() .bucket(bucketName) .build(); // バケットが存在するかどうかを確認します。 client.createBucket(bucketRequest); HeadBucketRequest bucketRequestWait = HeadBucketRequest.builder() .bucket(bucketName) .build(); WaiterResponse<HeadBucketResponse> waiterResponse = s3Waiter.waitUntilBucketExists(bucketRequestWait); waiterResponse.matched().response().ifPresent(System.out::println);
説明新しいユーザーを作成し、そのユーザーにバケットを管理する権限を付与する方法については、「ユーザーの管理」および「S3プロトコル互換における権限の管理」をご参照ください。
オブジェクトに対する操作を実行します。
// オブジェクトにデータを書き込みます。 PutObjectRequest putOb = PutObjectRequest.builder() .bucket(bucketName) .key(keyName) .build(); PutObjectResponse response = client.putObject(putOb, RequestBody.fromString("content")); // オブジェクトからデータを読み取ります。 GetObjectRequest objectRequest = GetObjectRequest .builder() .key(keyName) .bucket(bucketName) .build(); ResponseBytes<GetObjectResponse> objectBytes = client.getObjectAsBytes(objectRequest); byte[] data = objectBytes.asByteArray(); // オブジェクトを一覧表示します。 ListObjectsRequest listObjects = ListObjectsRequest .builder() .bucket(bucketName) .build(); ListObjectsResponse res = client.listObjects(listObjects); List<S3Object> objects = res.contents();
マルチパートアップロードタスクを実行します。
// マルチパートアップロードタスクを初期化します。 CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder() .bucket(bucketName) .key(keyName) .build(); CreateMultipartUploadResponse response = client.createMultipartUpload(createMultipartUploadRequest); String uploadId = response.uploadId(); System.out.println(uploadId); // オブジェクトのパート 1 をアップロードします。 UploadPartRequest uploadPartRequest1 = UploadPartRequest.builder().bucket(bucketName).key(keyName) .uploadId(uploadId) .partNumber(1).build(); String etag1 = client.uploadPart(uploadPartRequest1, RequestBody.fromString("content1")).eTag(); CompletedPart part1 = CompletedPart.builder().partNumber(1).eTag(etag1).build(); // オブジェクトのパート 2 をアップロードします。 UploadPartRequest uploadPartRequest2 = UploadPartRequest.builder().bucket(bucketName).key(keyName) .uploadId(uploadId) .partNumber(2).build(); String etag2 = client.uploadPart(uploadPartRequest2, RequestBody.fromString("content2")).eTag(); CompletedPart part2 = CompletedPart.builder().partNumber(2).eTag(etag2).build(); // マルチパートアップロードタスクを完了します。タスクが完了すると、オブジェクトが表示されます。 CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder() .parts(part1, part2) .build(); CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder() .bucket(bucketName) .key(keyName) .uploadId(uploadId) .multipartUpload(completedMultipartUpload) .build(); client.completeMultipartUpload(completeMultipartUploadRequest);