S3入門 — ファイルアップロードとアクセス制御の基本
はじめに
S3(Simple Storage Service)はAWSのオブジェクトストレージサービスです。
画像・PDF・CSV・ログなどあらゆるファイルを保存でき、URLでアクセスできます。Javaアプリで「ファイルをどこかに保存したい」という場面でよく使われます。
基本概念
| 用語 | 説明 |
|---|---|
| バケット(Bucket) | ファイルを入れる「箱」。名前はAWS全体でユニーク |
| オブジェクト(Object) | バケット内のファイル1つ1つ |
バケットの作成
- AWSコンソールでS3を開く
- 「バケットを作成」をクリック
- バケット名を入力(例:
my-app-uploads-2024) - リージョンを選択(例: ap-northeast-1 = 東京)
- 「パブリックアクセスをすべてブロック」はデフォルトでONのまま
- 作成完了
アクセス制御の基本
| 方法 | 用途 |
|---|---|
| バケットポリシー | バケット単位でアクセスを制御 |
| IAMポリシー | ユーザー・ロール単位でアクセスを制御 |
公開ファイル(画像など)の設定
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-app-uploads-2024/*"
}
]
}
JavaアプリからS3を操作する
依存関係(Maven)
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.25.0</version>
</dependency>
ファイルのアップロード
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.core.sync.RequestBody;
S3Client s3 = S3Client.builder()
.region(Region.AP_NORTHEAST_1)
.build();
PutObjectRequest request = PutObjectRequest.builder()
.bucket("my-app-uploads-2024")
.key("images/profile.jpg")
.contentType("image/jpeg")
.build();
s3.putObject(request, RequestBody.fromFile(Path.of("/tmp/profile.jpg")));
ファイルのダウンロード
GetObjectRequest request = GetObjectRequest.builder()
.bucket("my-app-uploads-2024")
.key("images/profile.jpg")
.build();
ResponseBytes<GetObjectResponse> response = s3.getObjectAsBytes(request);
byte[] data = response.asByteArray();
Spring Bootとの組み合わせ
# application.properties
aws.s3.bucket=my-app-uploads-2024
aws.region=ap-northeast-1
@Value("${aws.s3.bucket}")
private String bucketName;
まとめ
| やること | 方法 |
|---|---|
| バケット作成 | AWSコンソールから作成 |
| 公開ファイルの設定 | バケットポリシーで s3:GetObject を許可 |
| アップロード | AWS SDK の PutObjectRequest
|
| ダウンロード | AWS SDK の GetObjectRequest
|
JavaのFile I/OでローカルにファイルI/Oするのと同じ感覚で、クラウドのストレージを操作できます。