lambda 函数内的 S3 身份验证/无法初始化 class com.amazonaws.ClientConfiguration

S3 authentication inside lambda function / Could not initialize class com.amazonaws.ClientConfiguration

我有一个 scala play 应用程序,我正在尝试 运行 作为 lambda 函数。它从 s3 存储桶接收新对象的通知,然后获取该对象并对其进行处理。当我 运行 S3 放置测试以及从 s3 事件获取存储桶详细信息时,它工作正常。但是,当我尝试根据事件中的信息获取对象时,它失败了。

private val awsCredentialsProvider = new DefaultAWSCredentialsProviderChain()
private val amazonS3Client = new AmazonS3Client(awsCredentialsProvider)
private val bucketName = play.Play.application.configuration.getString("aws.s3.BUCKET")
val s3object = amazonS3Client.getObject(new GetObjectRequest(bucket, objectKey))

还有这个

val amazonS3Client = new AmazonS3Client()

但是我得到以下错误。

    java.lang.ExceptionInInitializerError 
at com.amazonaws.util.VersionInfoUtils.userAgent(VersionInfoUtils.java:139) 
at com.amazonaws.util.VersionInfoUtils.initializeUserAgent(VersionInfoUtils.java:134) 
at com.amazonaws.util.VersionInfoUtils.getUserAgent(VersionInfoUtils.java:95) 
at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:60) 
at com.amazonaws.ClientConfigurationFactory.getDefaultConfig(ClientConfigurationFactory.java:46) 
at com.amazonaws.ClientConfigurationFactory.getConfig(ClientConfigurationFactory.java:35) 
at com.amazonaws.services.s3.AmazonS3Client.<init>(AmazonS3Client.java:339) 
at com.amazonaws.services.s3.AmazonS3Client.<init>(AmazonS3Client.java:279) at controllers.Main.getSourceBuckets(Main.scala:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) Caused by: java.lang.IllegalArgumentException at com.amazonaws.internal.config.InternalConfig.loadfrom(InternalConfig.java:235) at com.amazonaws.internal.config.InternalConfig.load(InternalConfig.java:249) at com.amazonaws.internal.config.InternalConfig$Factory.<clinit>(InternalConfig.java:304)

Could not initialize class com.amazonaws.ClientConfiguration:
    java.lang.NoClassDefFoundError java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.ClientConfiguration 
    at com.amazonaws.ClientConfigurationFactory.getDefaultConfig(ClientConfigurationFactory.java:46) 
    at com.amazonaws.ClientConfigurationFactory.getConfig(ClientConfigurationFactory.java:35) at com.amazonaws.services.s3.AmazonS3Client.<init>(AmazonS3Client.java:339) at com.amazonaws.services.s3.AmazonS3Client.<init>(AmazonS3Client.java:279) 
    at models.TabSpaceFileParser$.downloadAllFileFromS32(TabSpaceFileParser.scala:62) 
    at controllers.ParserTask$$anonfun$exec.apply(ParserTask.scala:49) 
    at controllers.ParserTask$$anonfun$exec.apply(ParserTask.scala:34) at controllers.ParserTask.WithApplication(ParserTask.scala:60) 
    at controllers.ParserTask.exec(ParserTask.scala:34) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498)

我在程序集包含行

的 built.sbt 文件中发现错误
assemblyMergeStrategy in assembly := {
  case PathList("javax", "servlet", xs@_*) => MergeStrategy.first
  case PathList(ps@_*) if ps.last endsWith ".html" => MergeStrategy.first
  case PathList(ps@_*) if ps.last endsWith ".properties" => MergeStrategy.first
  case PathList(ps@_*) if ps.last endsWith ".xml" => MergeStrategy.first
  case PathList(ps@_*) if ps.last endsWith ".types" => MergeStrategy.first
  case PathList(ps@_*) if ps.last endsWith ".class" => MergeStrategy.first
  case PathList(ps@_*) if ps.last endsWith ".json" => MergeStrategy.discard
  case "application.conf" => MergeStrategy.concat
  case "Unwanted.Txt" => MergeStrategy.discard
  case x => (assemblyMergeStrategy in assembly).value(x)
}

关于删除

case PathList(ps@_*) if ps.last endsWith ".json" => MergeStrategy.discard

问题已解决。显然它从导致上述错误的 aws 依赖项中丢弃了一些重要的 json 配置文件。