app/helpers/S3Helper.scala (33 lines of code) (raw):
package helpers
import java.net.URL
import com.amazonaws.HttpMethod
import com.amazonaws.services.s3.AmazonS3
import com.amazonaws.services.s3.model.{GeneratePresignedUrlRequest, ResponseHeaderOverrides}
import com.theguardian.multimedia.archivehunter.common.clientManagers.S3ClientManager
import com.theguardian.multimedia.archivehunter.common.{ArchiveEntry, ProxyLocation}
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.s3.S3Client
import software.amazon.awssdk.services.s3.model.GetObjectRequest
import software.amazon.awssdk.services.s3.presigner.S3Presigner
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest
import scala.util.Try
object S3Helper {
import com.theguardian.multimedia.archivehunter.common.cmn_helpers.S3ClientExtensions._
/**
* Generates a presigned URL to read the given object
* @param archiveEntry archive entry that we want to read
* @param s3Client implicitly provided S3 client
* @return a Try, containing either the presigned URL or an error
*/
def getPresignedURL(archiveEntry:ArchiveEntry, expireInSeconds:Int, defaultRegion:Region, profileName:Option[String])(implicit s3ClientMgr:S3ClientManager):Try[URL] = {
val s3Client = s3ClientMgr.getS3Client(profileName)
val credentialProvider = s3ClientMgr.newCredentialsProvider(profileName)
s3Client.generatePresignedUrl(archiveEntry.bucket,
archiveEntry.path,
expireInSeconds,
archiveEntry.region.map(Region.of).getOrElse(defaultRegion),
archiveEntry.maybeVersion,
credentialProvider
)
}
/**
* Generates a presigned URL to read the given object
* @param proxyLocation proxy entry that we want to read
* @param s3Client implicitly provided S3 client
* @return a Try, containing either the presigned URL or an error
*/
def getPresignedURL(proxyLocation:ProxyLocation, expireInSeconds:Int, defaultRegion:Region, profileName:Option[String])(implicit s3ClientMgr:S3ClientManager):Try[URL] = {
val region = proxyLocation.region.map(Region.of).getOrElse(defaultRegion)
val s3Client = s3ClientMgr.getS3Client(profileName, Some(region))
val credentialProvider = s3ClientMgr.newCredentialsProvider(profileName)
s3Client.generatePresignedUrl(proxyLocation.bucketName, proxyLocation.bucketPath, expireInSeconds, region, None, credentialProvider)
}
}