У меня есть очень простой scala проект, в котором я пытаюсь скопировать файлы в s3 и обратно в рамках теста perf. Мой код работает в kubernetes, и моя организация использует STS. У меня есть рабочая служебная учетная запись, которая применяется к моему контейнеру с помощью helm. Из командной строки я могу успешно скопировать файлы, используя «aws s3 cp», но не могу заставить его работать с aw scala.
Вот мой код:
package util
import java.io.{File}
import java.nio.file.{Files, Path, StandardCopyOption}
import awscala._, s3._, sts._
import scala.util.Properties
trait AWSStorageClient {
val bucketName: String = "bucketName"
val fileNameSuffix: String = java.net.InetAddress.getLocalHost().getHostName()
val downloadPath: String = "src/gatling/resources"
implicit val s3 = S3.at(Region.US_WEST_2)
}
trait fsUtils {
def getListOfDirs(dir: String): List[File] = {
val d = new File(dir)
if (d.exists && d.isDirectory) {
d.listFiles.filter(_.isDirectory).toList
} else {
List[File]()
}
}
}
object LogUploader extends AWSStorageClient with fsUtils {
@throws[Exception]
def main(args: Array[String]): Unit = {
val fileList = getListOfDirs("build/reports/gatling")
val reportDir = fileList.head
println("fileList: " + fileList)
val bucket = s3.bucket(bucketName).get
bucket.put(s"simulation-$fileNameSuffix.log",
new java.io.File((s"$reportDir/simulation.log"))
)
}
}
object DataFileDownloader extends AWSStorageClient with fsUtils {
@throws[Exception]
def main(args: Array[String]): Unit = {
val bucket = s3.bucket(bucketName).get
bucket.get("7500.csv")
val d1 = new File("/7500.csv").toPath
val d2 = new File("/src/gatling/resources/7500.csv").toPath
Files.move(d1, d2, StandardCopyOption.ATOMIC_MOVE)
}
}
Это ошибка:
Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied
Предполагается, что DataFileDownloader и LogUploader запускаются из gradle до и после имитации гатлинга соответственно.
Есть ли у кого-нибудь какие-либо идеи относительно того, как получить мой код для работы с стс? Нужно ли мне как-то взять на себя роль или предоставить свою учетную запись службы в моем коде где-нибудь?
Любая помощь очень ценится.
Дополнительное примечание: Исходя из этого: https://github.com/aws/aws-sdk-java-v2/issues/1470
Я думаю, что мне может понадобиться что-то подобное :
import software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider;
...
S3Client s3 = S3Client.builder()
.credentialsProvider(WebIdentityTokenFileCredentialsProvider.create())
.region(region)
.build();
Но я не уверен. Я новичок в Scala и Aw scala.