開発者ブログ

ユーザー目線に立った使い心地の良いユーザビリティの設計と、Javaのオブジェクト指向を駆使して、パフォーマンスの最大化を追及。STSD株式会社の開発エンジニアによるブログです。

[AWS] JavaからAmazon S3に置かれたファイルのダウンロードなどを行う

Javaを使用してAmazon S3のファイルの一覧取得、ダウンロード、アップロード、削除を行ってみました。

AWS上に何らかのファイルを置きたいとなった場合はS3を使用するのが一般的ですが、このS3も用意されているAPIを使用してファイルのダウンロードやアップロードといったことを行うことが可能です。
今回はJavaからAWSのAPIを使用して、実際にファイルの操作を行ってみました。

ユーザーのアクセス権限設定

S3のAPIを使用するには、APIを使用するユーザー側と、S3側にアクセス権限の設定を行う必要があります。
まずはユーザー側にアクセス権限を設定します。

AWSのコンソールからIAMを開いて、APIを使用するユーザーの設定画面を開きます。
次に「アクセス権限の追加」ボタンをクリックします。


「既存のポリシーを直接アタッチ」を選択して、「ポリシーの作成」ボタンをクリックします。


「JSON」にJSON形式でポリシーの設定をセットします。


下記がセットするJSONです。

この例では「Action」でPutObject(ファイルのアップロード), GetObject(ファイルの取得), ListBucket(ファイル一覧の取得)を許可しています。
「Resource」で対象のS3のバケットを指定します。使用するS3のバケットに合わせて[S3バケット名]を置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Example01",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::[S3バケット名]"
            ]
        }
    ]
}

S3のアクセス権限設定

ユーザーに加えて、S3側にもアクセス権限の設定を行います。

まずはバケットの「アクセス権限」タブを開きます。
次に「バケットポリシーエディター」にJSON形式でアクセス権限の設定を行います。


下記のJSONをセットします。
[アカウントID]はAWSのアカウントのID、[ユーザー名]はIAMで追加したユーザー名、[S3のバケット名]はアクセスを許可するS3のバケット名に置き換えてください。
{
    "Version": "2012-10-17",
    "Id": "Policy01",
    "Statement": [
        {
            "Sid": "Stmt01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[アカウントID]:user/[ユーザー名]"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::[S3のバケット名]/*"
        }
    ]
}
権限の設定はこれで完了です。

クライアントの生成・認証処理

ここからはJavaの実装例になります。

まずはS3にアクセスするためのクライアントを用意します。
このクライアントからS3に関するAPIの使用が可能となります。

// 認証情報を用意
AWSCredentials credentials = new BasicAWSCredentials(
	// アクセスキー
	"AKI*************",
	// シークレットキー
	"fd7**************************************"
);

// クライアントを生成
AmazonS3 client = AmazonS3ClientBuilder
	.standard()
	// 認証情報を設定
	.withCredentials(new AWSStaticCredentialsProvider(credentials))
	// リージョンを AP_NORTHEAST_1(東京) に設定
	.withRegion(Regions.AP_NORTHEAST_1)
	.build();
以降はこのクライアントを使用して行きます。

ファイル一覧の取得

ファイルの一覧は listObject メソッドで取得します。

// ファイル一覧を取得
ObjectListing objListing = client.listObjects("stsd-devblog"); // バケット名を指定
List<S3ObjectSummary> objList = objListing.getObjectSummaries();

// ファイル一覧を出力
for (S3ObjectSummary obj : objList) {
	// キー(ファイルパス)・サイズ・最終更新日
	System.out.println("Key [" + obj.getKey() + "] / Size [" + obj.getSize() + " B] / Last Modified [" + obj.getLastModified() + "]");
}

ファイルのダウンロード

ファイルのダウンロードは getObject メソッドで行います。
ファイルに直接書き込む方法と、InputStream を経由する方法があります。

// 取得するファイルのバケット名とキー名(ファイルパス)を用意
GetObjectRequest request = new GetObjectRequest("stsd-devblog", "sample/001.txt");

// === ファイルに直接保存する場合 ===
// 格納先のファイル
File file = new File("c:/temp/devblog/001.txt");

// オブジェクトの取得
client.getObject(request, file);

//=== InputStreamを経由する場合 ===
// オブジェクトの取得
S3Object object = client.getObject(request);

// InputStreamを取得して何か処理をする
try (S3ObjectInputStream input = object.getObjectContent()) {
	int len = 0;
	byte buff[] = new byte[1024];
	while ((len = input.read(buff)) != -1) {
		// ファイルに書き込むなど
	}
}

ファイルのアップロード

ファイルのアップロードは putObject メソッドで行います。
ファイルから直接アップロードする方法と、InputStream を経由する方法があります。

// === ファイルから直接アップロードする場合 ===
// アップロードするファイル
File file = new File("c:/temp/devblog/example.txt");
// ファイルをアップロード
client.putObject(
		// アップロード先バケット名
		"stsd-devblog",
		// アップロード後のキー名
		"upload/example.txt",
		// ファイルの実体
		file
);

// === InputStreamからアップロードする場合 ===
try (FileInputStream input = new FileInputStream(file)) {
	// メタ情報を生成
	ObjectMetadata metaData = new ObjectMetadata();
	metaData.setContentLength(file.length());
	
	// リクエストを生成
	PutObjectRequest request = new PutObjectRequest(
			// アップロード先バケット名
			"stsd-devblog",
			// アップロード後のキー名
			"upload/example.txt",
			// InputStream
			input,
			// メタ情報
			metaData
	);
	
	// アップロード
	client.putObject(request);
}

ファイルの削除

ファイルの削除は deleteObject メソッドで行います。

client.deleteObject(
	// バケット名
	"stsd-devblog",
	// 削除するファイルのキー名
	"example/005.txt"
);
以上が今回やってみたJavaによる主なS3のファイル操作です。