iOS・Android

【Android Java】S3のプライベートバケットにアクセスする

iOS・Android
この記事は約5分で読めます。

想定

アプリからS3のプライベートバケットにアクセスしたい

準備するもの

署名付きURL

署名付きURLとは

オブジェクトに対して権限によらず、URLさえ知りえれば誰でもアクセスできる機能
有効期限などのオプションを設け、アクセスをより詳細に制御することができます。

署名付きURLの生成手順

build.gradleへの依存関係の記述

dependencies {
    implementation 'com.amazonaws:aws-android-sdk-core:x.xx.x'
    implementation 'com.amazonaws:aws-android-sdk-cognito:x.xx.x'
    implementation 'com.amazonaws:aws-android-sdk-s3:x.xx.x'
}

資格情報の作成

String bucketName = "xxxxxxx"; 
String objectKey = "xxxxxxxx";
String accessKey = "xxxxxxx"; 
String secretKey = "xxxxxxx"; 

// 認証オブジェクトを作成
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
// AmazonS3Clientをインスタンス化
AmazonS3 s3Client = new AmazonS3Client(credentials);

有効期限の設定

Date expiration = new Date();  
long msec = expiration.getTime();
msec += 1000 * 3600;
expiration.setTime(msec);

署名付きURLの作成

// 署名付きURLを生成するためのオプション設定

// バケットとオブジェクトキーのセット
GeneratePresignedUrlRequest generatePresignedUrlRequest = new 
GeneratePresignedUrlRequest(bucketName, objectKey);

// リクエストメソッド
generatePresignedUrlRequest.setMethod(HttpMethod.GET);

// 有効期限のセット
generatePresignedUrlRequest.setExpiration(expiration);

// 生成
URL presignedUrl = s3Client.generatePresignedUrl(generatePresignedUrlRequest);

ファイル全体

String bucketName = "xxxxxxx"; 
String objectKey = "xxxxxxxx";
String accessKey = "xxxxxxx"; 
String secretKey = "xxxxxxx"; 

// 認証オブジェクトを作成
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
// AmazonS3Clientをインスタンス化
AmazonS3 s3Client = new AmazonS3Client(credentials);

// 有効期限の設定
Date expiration = new Date();
long msec = expiration.getTime();
msec += 1000 * 3600;
expiration.setTime(msec);

// 署名付きURLを生成するためのオプション設定
// バケットとオブジェクトキーのセット
GeneratePresignedUrlRequest generatePresignedUrlRequest = new 
GeneratePresignedUrlRequest(bucketName, objectKey);

// リクエストメソッド
generatePresignedUrlRequest.setMethod(HttpMethod.GET);

// 有効期限のセット
generatePresignedUrlRequest.setExpiration(expiration);

// 生成
URL presignedUrl = s3Client.generatePresignedUrl(generatePresignedUrlRequest);

結果(動画の場合)

生成された署名付きURLを使用して、ブラウザで表示すると以下のような結果になります。

正常アクセスできた場合

動画が再生されます。


有効期限が切れた場合

アクセス不可となります。


最後に

何も気にしないのであれば、この作りで意外と簡単にできます。
セキュリティ面を考慮すると、署名付きURLをサーバーから発行してもらうのが一番安全っぽそう。

他方法

参考