You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Scala实现S3存储桶间大文件的每日复制?

使用Scala复制S3对象的简便方法

刚接触Scala的话,直接用AWS官方的SDK for Scala就能快速实现S3对象复制,不用自己折腾底层逻辑。以下是具体实现步骤:

1. 引入依赖(SBT示例)

在你的build.sbt里添加AWS S3 SDK的依赖:

libraryDependencies += "software.amazon.awssdk" % "s3" % "2.20.0"

如果需要更高效的大文件传输,可以加上Transfer Manager:

libraryDependencies += "software.amazon.awssdk" % "s3-transfer-manager" % "2.20.0"

2. 核心复制代码

基础单对象复制

如果只是复制单个对象,用S3客户端的copyObject方法就行:

import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.s3.S3Client
import software.amazon.awssdk.services.s3.model.CopyObjectRequest

object S3CopyExample {
  def main(args: Array[String]): Unit = {
    val sourceBucket = "your-source-bucket"
    val sourceKey = "path/to/source-object.txt"
    val destBucket = "your-destination-bucket"
    val destKey = "path/to/dest-object.txt"

    // 初始化S3客户端(默认读取本地AWS凭证,比如~/.aws/credentials)
    val s3Client = S3Client.builder().region(Region.US_EAST_1).build()

    try {
      val copyRequest = CopyObjectRequest.builder()
        .sourceBucket(sourceBucket)
        .sourceKey(sourceKey)
        .destinationBucket(destBucket)
        .destinationKey(destKey)
        .build()

      s3Client.copyObject(copyRequest)
      println(s"成功复制对象:$sourceKey -> $destKey")
    } finally {
      s3Client.close() // 记得关闭客户端
    }
  }
}

批量/大文件复制(推荐Transfer Manager)

如果要复制多个对象或者大文件,用Transfer Manager更高效,支持断点续传:

import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.s3.model.CopyObjectRequest
import software.amazon.awssdk.transfer.s3.S3TransferManager
import java.util.concurrent.CompletableFuture

object S3BatchCopyExample {
  def main(args: Array[String]): Unit = {
    val sourceBucket = "your-source-bucket"
    val destBucket = "your-destination-bucket"
    val objectsToCopy = List("file1.jpg", "docs/report.pdf", "data/archive.zip")

    val transferManager = S3TransferManager.builder()
      .s3ClientConfiguration(config => config.region(Region.US_EAST_1))
      .build()

    try {
      val futures = objectsToCopy.map { key =>
        val copyRequest = CopyObjectRequest.builder()
          .sourceBucket(sourceBucket)
          .sourceKey(key)
          .destinationBucket(destBucket)
          .destinationKey(key) // 保持相同的路径
          .build()

        transferManager.copy(copyRequest).completionFuture()
      }

      // 等待所有复制任务完成
      CompletableFuture.allOf(futures: _*).join()
      println("所有对象复制完成")
    } finally {
      transferManager.close()
    }
  }
}

3. 每日定时执行

要实现每日自动执行,Scala生态里常用的方案有两种:

  • Akka Scheduler:适合已经用Akka的项目,配置简单:
    import akka.actor.ActorSystem
    import scala.concurrent.duration._
    
    object ScheduledCopy {
      def main(args: Array[String]): Unit = {
        val system = ActorSystem("S3CopyScheduler")
        import system.dispatcher
    
        // 每天执行一次(这里示例是每24小时,你可以调整时间)
        system.scheduler.scheduleAtFixedRate(
          initialDelay = 0.seconds,
          interval = 24.hours
        ) { () =>
          // 调用上面的复制方法
          S3CopyExample.main(Array.empty)
        }
      }
    }
    
  • Quartz Scheduler:适合更复杂的定时需求(比如指定具体时间点),需要引入Quartz的Scala绑定依赖。

注意事项

  • 确保你的AWS凭证有S3的s3:GetObject(源桶)和s3:PutObject(目标桶)权限。
  • 如果跨区域复制,注意S3的跨区域复制费用,也可以考虑用S3自带的跨区域复制(CRR)功能,但如果需要自定义逻辑还是用代码更灵活。
  • 记得处理异常,比如网络错误、对象不存在等,在代码里添加try-catch块。

内容的提问来源于stack exchange,提问作者PythonDeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:02:22