Использование aw scala с STS - PullRequest
0 голосов
/ 16 января 2020

У меня есть очень простой 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.

1 Ответ

0 голосов
/ 27 апреля 2020

У вас есть правильный фрагмент кода java, вы должны принять на себя роль учетной записи службы. Я могу подтвердить java библиотеки 1.11.719 и выше работать правильно.

Я также наблюдал такое же поведение, когда CLI AWS завершается успешно, но код JAVA завершается с ошибкой прав доступа.

import software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider;
...
S3Client s3 = S3Client.builder()
                              .credentialsProvider(WebIdentityTokenFileCredentialsProvider.create())
                              .region(region)
                              .build();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...