Amazon web services Spark凭证链订购-禁止S3异常

Amazon web services Spark凭证链订购-禁止S3异常,amazon-web-services,apache-spark,amazon-s3,Amazon Web Services,Apache Spark,Amazon S3,我正在EC2实例上运行Spark 2.4。我将担任IAM角色,并在sparkSession.sparkContext.hadoop配置中设置密钥/密钥/令牌,同时将凭据提供程序设置为“org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider” 当我尝试从s3读取数据集时(使用s3a,它也是在hadoop配置中设置的),我得到一个错误 com.amazonaws.services.s3.model.amazons3异常:状态代码:403,AW

我正在EC2实例上运行Spark 2.4。我将担任IAM角色,并在sparkSession.sparkContext.hadoop配置中设置密钥/密钥/令牌,同时将凭据提供程序设置为“org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider”

当我尝试从s3读取数据集时(使用s3a,它也是在hadoop配置中设置的),我得到一个错误

com.amazonaws.services.s3.model.amazons3异常:状态代码:403,AWS服务:Amazon s3,AWS请求ID:7376FE009AD36330,AWS错误代码:null,AWS错误消息:禁止

读取命令:

val myData = sparkSession.read.parquet("s3a://myBucket/myKey")
我反复检查了S3路径,它是正确的。我假定的IAM角色在S3存储桶上具有正确的权限。在这一点上,我唯一能想到的是spark有某种隐藏的凭证链顺序,即使我在hadoop配置中设置了凭证,它仍然从其他地方获取凭证(我的实例配置文件??)。但我没有办法诊断

感谢您的帮助。很高兴提供更多细节

  • spark submit将获取您的环境变量并将其设置为fs.s3a access+secret+会话密钥,覆盖您已经设置的任何密钥
  • 如果您只想使用IAM凭据,只需将
    fs.s3a.aws.credentials.provider
    设置为
    com.amazonaws.auth.InstanceProfileCredentialsProvider
    ;这将是唯一使用的

  • 进一步阅读:

    您可以使用CloudTrail查看被拒绝的请求。然后,它将向您提供所使用的访问密钥,以便您可以确定它正在使用哪些凭据。这将有助于您跟踪它的来源。凭据在spark submit执行时在我的代码中设置,以便在启动时覆盖它从环境变量中获取的任何内容。InstanceProfileCredentialsProvider提供与您所在实例关联的凭据。如前所述,我使用的是在担任角色时获得的凭据,而不是实例角色。请确保凭据列表中的某些内容查找hadoop 2.x中的该组(帐户、会话ID、会话机密),默认情况下不查找。您需要将{{org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider}}添加到ProvidersHanks列表中。正如在原始帖子中提到的,我已经将org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider设置为提供者。