Amazon S3にファイルをアップロード及びAmazon S3からファイルをダウンロードする

Spring Cloud AWS を使用して、Amazon S3にファイルをアップロード及びAmazon S3からファイルをダウンロードする実装方法を説明します。

サンプルコードの動作確認環境については、 動作確認環境と依存ライブラリについて を参照してください。

サンプル全体は aws-s3 を参照してください。

Amazon S3を使用するための設定例

pom.xml

依存ライブラリにspring-cloud-aws-starter-s3を追加します。

    <dependency>
      <groupId>io.awspring.cloud</groupId>
      <artifactId>spring-cloud-aws-starter-s3</artifactId>
    </dependency>

Tip

spring-cloud-aws-starter-s3version を指定していませんが、 サンプルでは Spring Cloud AWSが提供するBOM を使用してSpring Cloud AWS関連ライブラリのバージョンを制御しています。

AWSのリージョン

AWSのリージョンを実行環境に設定します。 デフォルトのリージョンはAWS SDKが提供する DefaultAwsRegionProviderChain により決定され、実行環境に設定されたAWSアカウント情報や、EC2のメタデータからリージョンを取得します。

明示的に指定する場合は、 spring.cloud.aws.region.static 、または spring.cloud.aws.s3.region プロパティにリージョンを設定します。

設定可能な値の詳細については Spring Cloud AWS Core - Region および S3 Integration - Configuration を参照してください。

AWSアカウントのクレデンシャル情報

AWSアカウントのクレデンシャル情報を実行環境に設定します。 クレデンシャル情報の設定方法はいくつかありますが、例えば環境変数を使用する方法であれば、以下の環境変数にクレデンシャル情報を設定します。

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

クレデンシャル情報の設定方法の詳細については Spring Cloud AWS Core - Credentials を参照してください。

Tip

IAMによるアクセス制御を行う場合、実行環境には必要な権限を付与する必要があります。 必要な権限の詳細については SES Integration - IAM Permissions を参照してください。

Amazon S3にファイルをアップロードする実装例

この例では、 Spring Cloud AWSが提供する S3Template を使用して指定したファイルをアップロードします。

アップロード先のバケット名については環境によって異なることが想定されるため、ここではプロパティファイルで設定可能にします。

s3.bucket-name=keel-s3-bucket-test

プロパティファイルに合わせて、プロパティ値をバインドするためのBeanを定義します。

package keel.aws.s3;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "s3")
public class AwsS3Properties {
    
    private String bucketName;

    public String getBucketName() {
        return bucketName;
    }

    public void setBucketName(String bucketName) {
        this.bucketName = bucketName;
    }
}

S3Template を使用してAmazon S3にファイルをアップロードします。

@Service
public class AwsS3UploadService {

    private final Logger logger = LoggerFactory.getLogger(AwsS3UploadService.class);

    private final S3Template s3Template;

    private final AwsS3Properties properties;

    public AwsS3UploadService(S3Template s3Template, AwsS3Properties properties) {
        this.s3Template = s3Template;
        this.properties = properties;
    }

    public void uploadFile(Path path) {
        logger.info("{}をS3にアップロードします。", path.getFileName());

        try (InputStream inputStream = Files.newInputStream(path)) {
            s3Template.upload(properties.getBucketName(), Objects.toString(path.getFileName()), inputStream);
            logger.info("ファイルのアップロードに成功しました。");
        } catch (IOException e) {
            throw new UncheckedIOException("S3へのファイルアップロードに失敗しました。", e);
        }
    }
}

Amazon S3からファイルをダウンロードする実装例

この例では、Spring Cloud AWSが提供する S3Template を使用して指定したファイルをダウンロードします。

バケット名の設定については、 Amazon S3へのアップロード実装例 と同じになります。

@Service
public class AwsS3DownloadService {

    private final Logger logger = LoggerFactory.getLogger(AwsS3DownloadService.class);

    private final S3Template s3Template;

    private final AwsS3Properties properties;

    public AwsS3DownloadService(S3Template s3Template, AwsS3Properties properties) {
        this.s3Template = s3Template;
        this.properties = properties;
    }

    public void downloadFile(Path path) {
        Path downloadPath = Path.of("download-" + path.getFileName());
        logger.info("アップロードされた{}をダウンロードし、{}に保存します。", path.getFileName(), downloadPath.getFileName());

        if (Files.exists(downloadPath)) {
            logger.info("既に{}が存在するためファイルの保存をスキップします。", downloadPath.getFileName());
            return;
        }

        try (InputStream inputStream = s3Template.download(
                properties.getBucketName(), Objects.toString(path.getFileName())).getInputStream()) {
            Files.copy(inputStream, downloadPath);
            logger.info("ファイルの保存に成功しました。");
        } catch (IOException e) {
            throw new UncheckedIOException("S3からのファイルダウンロードに失敗しました。", e);
        }
    }
}