【AWS・Java】署名付きURLでS3にファイルをアップロードする方法!

AWS AWS

※この記事にはプロモーションが含まれています。

AWSのS3では署名付きURLというものが発行できます。

これはプライベートなバケットやオブジェクトに対して限定的にアクセス可能にすることの出来るURLです。

簡単に言うと、
基本見せないけど10分だけこのURLで見れるようにしてあげる、もしくはアップロードできるようにしてあげる。
っていう事ができるようになります。

基本非公開のバケットの設定にするのでセキュリティ的に担保されたS3になります。

今回はJavaからAWSのSDKを使って署名付きURLでファイルをアップロードする方法を説明してみます。

スポンサーリンク

まずはGradleの設定でSDKを入れる

Gradleに下記を追加して、SDKを入れます。

今回説明する書き方はバージョン2.10.12以降の書き方になるので、2.10.12以降での最新を指定してください。

implementation platform('software.amazon.awssdk:bom:2.15.0')
implementation 'software.amazon.awssdk:s3'

Javaでの書き方

Javaで署名付きURLを使ってファイルをS3にアップロードする手順としては

①署名付きURLを発行する

②発行した署名付きURLを使ってファイルをアップロードする

の2つの手順になります。

①署名付きURLを発行する

署名付きURLを発行するには下記のようにします。
アップロードしたいファイルのキー(S3のパス)とバケットを指定してリクエストします。

S3Presigner presigner = S3Presigner.builder()
                  .region(Region.AP_NORTHEAST_1)
                  .build();
           
String s3_key = "アップロードしたいS3のキー";
                            
PutObjectRequest objectRequest = PutObjectRequest.builder()
                         .bucket("バケット名")
                         .key(s3_key)
                         .contentType("text/plain")
                         .build();

// ここで指定しているsignatureDurationの10が10分間利用可能の時間設定です
PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
                                .signatureDuration(Duration.ofMinutes(10))
                                .putObjectRequest(objectRequest)
                                .build();

PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(presignRequest);

// 署名付きURLが取得できます
URL url = presignedRequest.url();

②発行した署名付きURLを使ってファイルをアップロードする

①で発行した署名付きURLを使ってファイルをアップロードするには下記のようにします。

// ①で取得した署名付きURL
URL url = presignedRequest.url();

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
onnection.setDoOutput(true);
connection.setRequestProperty("Content-Type","text/plain");
connection.setRequestMethod("PUT");

OutputStream out = connection.getOutputStream();

// アップロードしたいファイル                
FileInputStream file = new FileInputStream("C:\\work\\test.txt");
byte[] buffer = new byte[128];
int size = -1;
while (-1 != (size = file.read(buffer))) {
    out.write(buffer, 0, size);
}
                
out.close();
file.close();

connection.getResponseCode();

この書き方で、発行した署名付きURLを使って指定した10分間だけファイルをS3にアップロードすることができます。

コメント

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