JavaからAWS CLIのcredentialsを参照してS3にアクセスする方法

JavaからAWS CLIのcredentialsを参照してS3にアクセスする方法

Javaファイルに直接credentials情報を書きたくない場合に、C:\Users\ユーザ名.aws\credentialsファイルの情報にアクセスしてJavaから参照する方法です。

credentialsの中身は以下のような感じです。

[default]
aws_access_key_id = KAI------------------------------
aws_secret_access_key = XIq0------------------------------

Javaからアクセスするには以下のように記述します。

public class Sample {
  public static void main(String[] args) {
    AWSCredentials credentials = new ProfileCredentialsProvider("default").getCredentials(); // credentialsに合わせてdefaultをべた書きしてます
    System.out.println(credentials.getAWSAccessKeyId()); // aws_access_key_idを取得できる
    System.out.println(credentials.getAWSSecretKey()); // aws_secret_access_keyが取得できる
  }
}

これでcredentialsの情報が取得できます。このcredentialsオブジェクトを使用してS3にアクセスしてみます。

S3にアクセスするためにS3オブジェクトを作成します。東京リージョンを指定します。

AmazonS3 s3 = AmazonS3ClientBuilder
  .standard()
  .withCredentials(new AWSStaticCredentialsProvider(credentials))
  .withRegion("ap-northeast-1")
  .build();

このs3オブジェクトでバケットを作成したりバケット内を見たりバケットを削除することができます。

バケットを作成する

public class Sample {
  public static void main(String[] args) {
  AWSCredentials credentials = new ProfileCredentialsProvider("default").getCredentials();
  AmazonS3 s3 = AmazonS3ClientBuilder
    .standard()
    .withCredentials(new AWSStaticCredentialsProvider(credentials))
    .withRegion("ap-northeast-1")
    .build();
    String bucketName = "saba6seimenjo"; // バケット名を指定します
    s3.createBucket(bucketName); // バケットを作成します
  }
}

これでバケットが作成されます。

JavaからAWS CLIのcredentialsを参照してS3にアクセスする方法

バケット一覧を取得する

バケット一覧を取得するにはlistBuckets()メソッドを使用します。

public class Sample {
  public static void main(String[] args) {
  AWSCredentials credentials = new ProfileCredentialsProvider("default").getCredentials();
  AmazonS3 s3 = AmazonS3ClientBuilder
    .standard()
    .withCredentials(new AWSStaticCredentialsProvider(credentials))
    .withRegion("ap-northeast-1")
    .build();

    for (Bucket bucket : s3.listBuckets()) {
      System.out.println(bucket.getName()); // 全てのバケット名が取得できます
    }
  }
}

バケットにオブジェクトをアップロードする

バケットにオブジェクトをアップロードするにはputObject()メソッドを使用します。

public class Sample {
  public static void main(String[] args) {
    AWSCredentials credentials = new ProfileCredentialsProvider("default").getCredentials();
    AmazonS3 s3 = AmazonS3ClientBuilder
      .standard()
      .withCredentials(new AWSStaticCredentialsProvider(credentials))
      .withRegion("ap-northeast-1")
      .build();

    String bucketName = "saba6seimenjo";
    String key = "minamisenba";
    s3.putObject(new PutObjectRequest(bucketName, key, new File("C:\\Users\\takahashi\\Documents\\test.txt")));
  }
}

バケットのオブジェクトを取得する

バケットのオブジェクトを取得するにはgetObject()メソッドを使用します。

public class S3Sample {
  public static void main(String[] args) {
    AWSCredentials credentials = new ProfileCredentialsProvider("default").getCredentials();
    AmazonS3 s3 = AmazonS3ClientBuilder
      .standard()
      .withCredentials(new AWSStaticCredentialsProvider(credentials))
      .withRegion("ap-northeast-1")
      .build();

    String bucketName = "saba6seimenjo";
    String key = "minamisenba";
    S3Object object = s3.getObject(new GetObjectRequest(bucketName, key));
    System.out.println(object); // S3Object [key=minamisenba,bucket=saba6seimenjo]
    System.out.println(object.getObjectMetadata().getContentType()); // text/plain
  }
}

バケットのオブジェクト一覧を取得する

バケットのオブジェクト一覧を取得するには、listObjects()メソッドを使用します。

ObjectListing objectListing = s3.listObjects(new ListObjectsRequest()
  .withBucketName(bucketName));

バケット名で指定してもよいですし、プレフィックスを指定しても取得することができます。

ObjectListing objectListing = s3.listObjects(new ListObjectsRequest()
  .withBucketName(bucketName)
  .withPrefix("minami"));

OjbectListing#getObjectSummaries()メソッドでList<S3ObjectSummary>を取得することができます。

public class Sample {
  public static void main(String[] args) {
    AWSCredentials credentials = new ProfileCredentialsProvider("default").getCredentials();
    AmazonS3 s3 = AmazonS3ClientBuilder
      .standard()
      .withCredentials(new AWSStaticCredentialsProvider(credentials))
      .withRegion("ap-northeast-1")
      .build();
    String bucketName = "saba6seimenjo";
    ObjectListing objectListing = s3.listObjects(new ListObjectsRequest()
      .withBucketName(bucketName)
      .withPrefix("minami"));
    for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
      System.out.println(objectSummary.getKey() + " " + "(size = " + objectSummary.getSize() + ")"); // オブジェクトのkeyとサイズを取得します
    }
  }
}

バケットのオブジェクトを削除する

バケットのオブジェクトを削除するにはdeleteObject()メソッドを使用します。

public class Sample {
  public static void main(String[] args) {
    AWSCredentials credentials = new ProfileCredentialsProvider("default").getCredentials();
    AmazonS3 s3 = AmazonS3ClientBuilder
      .standard()
      .withCredentials(new AWSStaticCredentialsProvider(credentials))
      .withRegion("ap-northeast-1")
      .build();
    String bucketName = "saba6seimenjo";
    String key = "minamisenba";
    s3.deleteObject(bucketName, key);
  }
}

バケットを削除する

バケットを削除するにはdeleteBucket()メソッドを使用します。この時バケット内にオブジェクトが存在する場合はエラーとなります。これはS3の仕様です。

public class Sample {
  public static void main(String[] args) {
    AWSCredentials credentials = new ProfileCredentialsProvider("default").getCredentials();
    AmazonS3 s3 = AmazonS3ClientBuilder
      .standard()
      .withCredentials(new AWSStaticCredentialsProvider(credentials))
      .withRegion("ap-northeast-1")
      .build();
    String bucketName = "saba6seimenjo";
    s3.deleteBucket(bucketName); // バケット削除する
  }
}

LinkedHashMapをString型に変換してアップロード

MapをJSON形式に変換してS3アップロードする例です。

jacksonのObjectMapperクラスのwriterWithDefaultPrettyPrinter().writeValueAsString()メソッドを使用します。

package aws.s3put;

import java.util.LinkedHashMap;
import java.util.Map;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class S3put {
  public static void main(String[] args) throws JsonProcessingException {
    AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion("ap-northeast-1").build();

    final ObjectMapper objectMapper = new ObjectMapper();
    // MapをJSONに変換
    Map<String, String> map = new LinkedHashMap<String, String>();
    map.put("test1", "val1");
    map.put("test2", "val2");

    var jsonstring = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
    s3Client.putObject("saba6seimenjo", "var/data/a:test.json", jsonstring);
  }
}

コメント

タイトルとURLをコピーしました