調べていてわからない部分が多かったため、備忘録として残しておきます。
この記事では、JavaとSpring bootを用いて、AWSのS3へファイルを読み書きする方法をまとめます。
コードを張り付けただけではわからない部分も多いと思うので、AWSのSDK導入も一緒に解説します。
なお、以下を前提条件としていますので、この記事を読む前に確認ください。
・認証キー発行済み
・統合開発環境:Eclipse
・Maven
・AWS SDK:v2を利用
AWS SDK for Javaはv1, v2の2種類あります。v2の方が最新なので、この記事ではv2を導入します。v1とv2ではコードの記述がところどころ違う箇所がありますので、注意してください。
v2の場合はimport software.amazon.awssdk.***の形で呼び出します。
AWS 認証キーの設定
AWS S3へ接続するために、認証キーを設定します。
認証キーの設定方法はいろいろありますが、今回はSpring Frameworkを利用しているため、application.propertiesファイルから環境変数へ設定します。
1 2 3 |
aws.bucketName="S3 bucket name" cloud.aws.credentials.access-key=AKI********** cloud.aws.credentials.secret-key=81Hg***********************5 |
これらの環境変数を呼び出す際は、Lombockの@Valueアノテーションを利用します。以下コード参照。
S3認証用クラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; @Component @Configuration public class S3ClientConfig{ @Value("${aws.bucketName}") private String s3BucketName; @Value("${cloud.aws.credentials.access-key}") public String accessKey; @Value("${cloud.aws.credentials.secret-key}") public String secretKey; @PostConstruct public void init() { awsCreds = AwsBasicCredentials.create(accessKey,secretKey); } private AwsBasicCredentials awsCreds; @Bean S3Client s3Client() { return S3Client.builder() .region(Region.US_EAST_1) .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) .build(); } } |
18-25行目:環境変数に登録した認証キーを変数に格納する。
27-31行目:認証キーからCredentialsを作成。認証キーの形式ではS3の認証ができません。
33-39行目:S3を扱うClientを作成。Clientへダウンロードやアップロードのリクエストし、処理してもらいます。
S3からファイルをダウンロードする
S3からファイルをダウンロード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.GetObjectResponse; @Service public class S3Manager { @Value("${aws.bucketName}") private String s3BucketName; @Resource private S3Client s3Client; ///ファイルダウンロード/// public String readFile(String objectKey) { //s3objectを取得 GetObjectRequest getRequest = GetObjectRequest.builder().bucket(s3BucketName).key(objectKey).build(); ResponseInputStream<GetObjectResponse> response = s3Client.getObject(getRequest); BufferedReader br = new BufferedReader(new InputStreamReader(response)); StringBuilder sb = new StringBuilder(); int c; try { while ((c = br.read()) != -1) { sb.append((char) c); } br.close(); return sb.toString(); } catch (IOException e) { e.printStackTrace(); return null; } } } |
上記コードを実行すると、S3の指定バゲット内に格納されたファイルがString型で返ってきます。
今回は、JsonファイルをString型で取得しています。その後gsonライブラリでJson型へ戻して情報を取り扱う的なことをしています。
コードの内容については記事下の参考URLを確認してください。
コード利用時の要点だけ捕捉します。
S3 ファイルダウンロード時の注意点
objectKeyへ、S3のバケット内に保存したファイル名を指定します。
例として、testonionバケットに保存したsample.txtファイルをダウンロードしたいときは、以下のようになります。
s3BucketName=”testonion”
objectKey=”sample.txt”
※”/(スラッシュ)”いらないことに注意してください。
参考URL
コードはほぼこちらを参考にさせていただきました!