想定
アプリから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をサーバーから発行してもらうのが一番安全っぽそう。
他方法
- バケット名とオブジェクトキーを指定する方法
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html - cognitoのユーザープール認証から作成する方法
https://aws.amazon.com/jp/blogs/mobile/using-android-sdk-with-amazon-cognito-your-user-pools/