2

I'm trying to implement AWS Secrets Manager on a scala project, has anyone tried it?

I have added the dependency to the project on build.sbt like this

libraryDependencies ++= Seq(
  "com.databricks"            %% "spark-avro"         % "4.0.0",
  "com.amazonaws"             % "aws-java-sdk-core"   % "1.11.569",
  "com.amazonaws"             % "aws-java-sdk-s3"     % "1.11.569",
  "com.amazonaws"             % "aws-java-sdk-secretsmanager" % "1.11.569",
  "com.typesafe"              % "config"              % "1.3.4",
  "org.apache.spark"          %% "spark-core"         % "2.3.0" % "provided",
  "org.apache.spark"          %% "spark-sql"          % "2.3.0" % "provided",
  "org.apache.spark"          %% "spark-hadoop-cloud" % "2.3.2.3.1.0.6-1" % "provided",
  "org.apache.hadoop"         % "hadoop-common"       % "3.1.1.3.0.2.0-50" % "provided",
  "com.github.gphat"          %% "datadog-scala"      % "1.1.3" exclude ("org.json4s", "json4s-jackson") exclude ("org.json4s", "json4s-native"),
  "org.scalatest"             %% "scalatest"          % "3.0.5" % "test",
  "org.mockito"               % "mockito-core"        % "2.27.0" % "test",
  "com.github.tomakehurst"    % "wiremock-jre8"       % "2.23.2" % "test",
  "org.glassfish.jersey.core" % "jersey-common"       % "2.22.2" % "test",
  "org.glassfish.jersey.core" % "jersey-server"       % "2.22.2" % "test",
  "org.glassfish.jersey.core" % "jersey-client"       % "2.22.2" % "test"
)

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) =>
    xs map { _.toLowerCase } match {
      case "manifest.mf" :: Nil | "index.list" :: Nil | "dependencies" :: Nil =>
        MergeStrategy.discard
      case ps @ x :: xs if ps.last.endsWith(".sf") || ps.last.endsWith(".dsa") =>
        MergeStrategy.discard
      case "plexus" :: xs =>
        MergeStrategy.discard
      case "services" :: xs =>
        MergeStrategy.filterDistinctLines
      case "spring.com.conekta.schemas" :: Nil | "spring.handlers" :: Nil =>
        MergeStrategy.filterDistinctLines
      case _ => MergeStrategy.first
    }

And my implementation is like this

def getSecrets: Map[String,String] ={
    val secretName = "***********************"
    val endpoint = "secretsmanager.us-east-1.amazonaws.com"

    val config = new AwsClientBuilder.EndpointConfiguration(endpoint, Regions.US_EAST_1.getName)
    val clientBuilder = AWSSecretsManagerClientBuilder.standard()
    clientBuilder.setEndpointConfiguration(config)

    val client = clientBuilder.build()
    val getSecretValueRequest = new GetSecretValueRequest().withSecretId(secretName).withVersionStage("AWSCURRENT")
    val getSecretValueResult = client.getSecretValue(getSecretValueRequest)
    val secret = getSecretValueResult.getSecretString

    implicit val formats = DefaultFormats
    parse(secret).extract[Map[String, String]]
  }

It is working locally, but when i upload my jar to the server i'm working on i get this error:

java.lang.NoSuchMethodError: com.amazonaws.client.AwsSyncClientParams.getAdvancedConfig()Lcom/amazonaws/client/builder/AdvancedConfig;
    at com.amazonaws.services.secretsmanager.AWSSecretsManagerClient.<init>(AWSSecretsManagerClient.java:213)
    at com.amazonaws.services.secretsmanager.AWSSecretsManagerClient.<init>(AWSSecretsManagerClient.java:197)
    at com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder.build(AWSSecretsManagerClientBuilder.java:61)
    at com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder.build(AWSSecretsManagerClientBuilder.java:27)
    at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.java:46)
    at com.conekta.helpers.SecretManager.getSecrets(SecretManager.scala:21)

Has anyone succesfuly implemented aws secret manager on a sbt project Any help would be much apreccuated. Thanks.

Dharman
  • 30,962
  • 25
  • 85
  • 135
whiteskull
  • 67
  • 9
  • 1
    Are you building a fat jar? https://stackoverflow.com/questions/28459333/how-to-build-an-uber-jar-fat-jar-using-sbt-within-intellij-idea – Michael Curtis Oct 01 '19 at 18:50
  • 1
    yeah its a fat jar – whiteskull Oct 01 '19 at 20:00
  • 1
    Can you update with your full build.sbt file and the command you are using to build the jar? – Michael Curtis Oct 01 '19 at 20:06
  • i'm using sbt assembly to build the jar – whiteskull Oct 01 '19 at 20:20
  • can you use the AWS Java SDK to call secretsmanager? - This example uses AWS SDK for Java to create a Scala application to write data in Amazon Kinesis Firehose, https://aws.amazon.com/blogs/developer/tag/scala/ – committedandroider Oct 05 '19 at 17:42
  • @MichaelCurtis fat jar is an interesting name lol. But anyways aren't all jars fat jars using this definition - "also known as a fat JAR or JAR with dependencies—is a JAR file that contains not only a Java program, but embeds its dependencies as well" because you need the dependencies to run the java program – committedandroider Oct 05 '19 at 17:45

0 Answers0