【问题标题】:Setting S3 Bucket permissions when writing between 2 AWS Accounts while running from Glue从 Glue 运行时在 2 个 AWS 账户之间写入时设置 S3 存储桶权限
【发布时间】:2021-01-13 14:20:28
【问题描述】:

我有一个从 AWS Glue 作业中调用的 scala jar。我的 jar 写入将 DataFrame 写入另一个启用了 KMS 加密的 AWS 账户中的 S3 存储桶。我可以写入存储桶,但无法添加目标存储桶所有者访问文件的权限。如果简单地使用 Glue Writer 但直接使用 Spark,我可以实现这一点,它就是行不通。我已阅读所有文档,并在 hadoop 配置中设置了以下存储桶策略。

def writeDataFrameInTargetLocation( sparkContext:SparkContext = null, dataFrame: DataFrame, location: String, fileFormat: String,saveMode:String,encryptionKey:Option[String] = Option.empty,kms_region:Option[String]=Option("us-west-2")): Unit = {

如果(加密密钥.isDefined){ val region = if(kms_region.isDefined) kms_region.getOrElse("us-west-2") 别的 "us-west-2"

    sparkContext.hadoopConfiguration.set("fs.s3.enableServerSideEncryption", "false")
    sparkContext.hadoopConfiguration.set("fs.s3.cse.enabled", "true")
    sparkContext.hadoopConfiguration.set("fs.s3.cse.encryptionMaterialsProvider", "com.amazon.ws.emr.hadoop.fs.cse.KMSEncryptionMaterialsProvider")
    sparkContext.hadoopConfiguration.set("fs.s3.cse.kms.keyId", encryptionKey.get) // KMS key to encrypt the data with
      sparkContext.hadoopConfiguration.set("fs.s3.cse.kms.region", region) // the region for the KMS key
    sparkContext.hadoopConfiguration.set("fs.s3.canned.acl", "BucketOwnerFullControl")
    sparkContext.hadoopConfiguration.set("fs.s3.acl.default", "BucketOwnerFullControl")
    sparkContext.hadoopConfiguration.set("fs.s3.acl", "bucket-owner-full-control")
    sparkContext.hadoopConfiguration.set("fs.s3.acl", "BucketOwnerFullControl")
  }
  else {
    sparkContext.hadoopConfiguration.set("fs.s3.canned.acl", "BucketOwnerFullControl")
    sparkContext.hadoopConfiguration.set("fs.s3.acl.default", "BucketOwnerFullControl")
    sparkContext.hadoopConfiguration.set("fs.s3.acl", "bucket-owner-full-control")
    sparkContext.hadoopConfiguration.set("fs.s3.acl", "BucketOwnerFullControl")
  }

    val writeDF = dataFrame
      .repartition(5)
      .write

    
      writeDF
        .mode(saveMode)
        .option(Header, true)
        .format(fileFormat)
        .save(location)
    }

【问题讨论】:

  • 您遇到的错误是什么?
  • 添加数据源不仅仅是在代码上添加s3信息。
  • 没有收到任何错误,但我正在写入数据的帐户的所有者无法访问。它说拒绝访问。我阅读了文档以添加这些,但它似乎不起作用。 sparkContext.hadoopConfiguration.set("fs.s3.canned.acl", "BucketOwnerFullControl") sparkContext.hadoopConfiguration.set("fs.s3.acl.default", "BucketOwnerFullControl") sparkContext.hadoopConfiguration.set("fs.s3 .acl", "bucket-owner-full-control") sparkContext.hadoopConfiguration.set("fs.s3.acl", "BucketOwnerFullControl")

标签: amazon-web-services apache-spark amazon-s3 aws-glue


【解决方案1】:

您可能正在为“s3”方案使用 S3AFileSystem 实现(即“s3://...”形式的 URL)。您可以通过查看sparkContext.hadoopConfiguration.get("fs.s3.impl") 来检查。如果是这种情况,那么您实际上需要为“fs.s3a.*”而不是“fs.s3.*”设置 hadoop 属性。

那么正确的设置应该是:

sparkContext.hadoopConfiguration.set("fs.s3a.canned.acl", "BucketOwnerFullControl")
sparkContext.hadoopConfiguration.set("fs.s3a.acl.default", "BucketOwnerFullControl")

S3AFileSystem 实现未使用“fs.s3”下的任何属性。通过调查与以下 hadoop 源代码链接相关的代码可以看到: https://github.com/apache/hadoop/blob/43e8ac60971323054753bb0b21e52581f7996ece/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java#L268

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2018-10-12
    • 2022-01-03
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多