当前位置: 首页 > 知识库问答 >
问题:

从胶水运行时在两个AWS帐户之间写入时设置S3存储桶权限

古扬
2023-03-14

我有一个scala jar,我正在从AWS胶水工作调用它。我的jar写入将数据帧写入另一个AWS帐户中的S3桶,该帐户已打开KMS加密。我可以写入桶,但我不能添加目标桶所有者访问文件的权限。我可以做到这一点,如果简单地使用胶水作家,但与直火花,它只是不工作。我已经阅读了所有文档,并且正在hadoop配置中设置以下bucket策略。

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={

if(encryptionkey.isdefined){val region=if(kms_region.isdefined)kms_region.getorelse(“us-west-2”)else“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)
    }

共有1个答案

汪皓
2023-03-14

您可能正在为“s3”方案(即“s3:/...”形式的URL)使用S3AFileSystem实现。您可以通过查看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

 类似资料:
  • 我有2个AWS帐户。我试图复制文件从帐户1到帐户2在桶2在美国西部2地区。我有所有必要的IAM政策,相同的凭据适用于两个帐户。我使用python boto3库。 如图所示,复制函数在指向目标帐户2/us-west-2的客户端对象上执行。它是如何获取帐户1/us-east1中的源文件的?我应该提供作为复制函数的输入吗?

  • 我有一个aws组织,有几个S3桶和成员帐户。我在其中一个S3 bucket中添加了bucket策略,允许根据aws在下面URL中提供的文档从成员帐户访问它。 但是在登录了特定的会员账号之后,我仍然无法在那里看到S3的bucket。所以请告诉我这里出了什么问题。

  • 我正在尝试使用boto3将文件从一个S3存储桶传输到我的S3存储桶。我使用sts服务来承担访问供应商s3 bucket的角色。我能够连接到供应商bucket并获得bucket的列表。复制到我的存储桶时,我遇到

  • 如果我能知道根本原因是什么就好了。

  • 我已经用AWS创建了一个PREMIUM trail Databricks帐户。我已经用用户访问密钥设置了< code>AWS帐户。 对于配置,请在URL中遵循以下说明(在以下URL中设置存储桶策略如下)。 https://docs.databricks.com/administration-guide/account-settings/aws-storage.html 但是,我得到了如下的错误。

  • 我是新来的aws cli,我花了相当多的时间在留档,但我不知道如何设置权限的文件后,我已经上传他们。所以如果我上传了一个文件: aws s3 cp资产/js/d3-4.3.0。js s3://示例。实例com/assets/js/ 没有设置访问权限,我需要一种方法来设置它们。aws cli中是否有与chmod 644相当的版本? 就这一点而言,有没有办法查看访问权限? 我知道我可以使用标志与但是如