調べていてわからない部分が多かったため、備忘録として残しておきます。
この記事では、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ファイルから環境変数へ設定します。
aws.bucketName="S3 bucket name" cloud.aws.credentials.access-key=AKI********** cloud.aws.credentials.secret-key=81Hg***********************5
これらの環境変数を呼び出す際は、Lombockの@Valueアノテーションを利用します。以下コード参照。
S3認証用クラス
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からファイルをダウンロード
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
コードはほぼこちらを参考にさせていただきました!