配置Databricks S3提交服务相关设置
Databricks运行一个提交服务,该服务协调从多个集群向Amazon S3的写入。这个服务运行在数据库里控制飞机.为了进一步提高安全性,您可以禁用服务的直接上传优化,如关闭直接上传优化功能.若要进一步限制对S3桶的访问,请参见额外的桶安全性限制.
如果您收到与S3提交服务相关的AWS GuardDuty警报,请参见AWS GuardDuty与S3提交服务相关的警报.
关于提交服务
在特定情况下,S3提交服务有助于保证在单个表上跨多个集群的写操作的一致性。例如,提交服务可以提供帮助三角洲湖实现ACID事务。
在默认配置中,Databricks在提交服务API调用中将临时AWS凭据从数据平面发送到控制平面。实例配置文件凭证的有效期为6小时。
数据平面直接将数据写入S3,然后控制平面中的S3提交服务通过完成提交日志上传(完成下面描述的多部分上传)提供并发控制。提交服务不从S3读取任何数据。如果一个新文件不存在,它会在S3中放置一个新文件。
Databricks提交服务写入S3的最常见数据是Delta日志,其中包含来自数据的统计聚合,例如列的最小值和最大值。大部分Delta日志数据从数据平面使用一个Amazon S3多部分上传.
在集群将多部分数据写入Delta日志到S3之后,Databricks控制平面的S3提交服务通过让S3知道它已经完成来完成S3的多部分上传。作为非常小的更新的性能优化,默认情况下,提交服务有时会直接将小的更新从控制平面推送到S3。这种直接更新优化可以被禁用。看到关闭直接上传优化功能.
除了Delta Lake,以下Databricks特性使用相同的S3提交服务:
提交服务是必要的,因为Amazon没有提供仅在对象还不存在时才放置对象的操作。Amazon S3是一个分布式系统。如果S3同时接收到对同一个对象的多个写请求,它将覆盖除最后一个对象外的所有写请求。如果没有集中验证提交的能力,来自不同集群的同时提交将损坏表。
AWS GuardDuty与S3提交服务相关的警报
重要的
提交到所管理的表统一目录不触发GuardDuty警报。
如果你使用AWS GuardDuty当您使用AWS IAM实例配置文件访问数据时,GuardDuty可能会为与Delta Lake、结构化流、自动加载器或相关的默认Databricks行为创建警报复制成
.这些警报与实例凭据泄露检测相关,该检测在默认情况下启用。这些警告包括标题UnauthorizedAccess: IAMUser / InstanceCredentialExfiltration。InsideAWS
.
您可以配置Databricks部署来处理与S3提交服务相关的GuardDuty警报AWS实例概要假设您的原始S3数据访问IAM角色的角色。
作为使用实例概要文件凭据的替代方法,这个新的实例概要文件可以配置集群以承担具有短持续令牌的角色。这个功能已经存在于Databricks运行时的所有最新版本中,并且可以通过集群政策.
如果你还没有这样做,创建一个正常的实例配置文件访问S3数据。该实例概要文件使用实例概要文件凭据直接访问S3数据。
本节将此实例概要中的角色ARN称为
< data-role-arn >
.创建一个新的实例配置文件,它将使用令牌并引用直接访问数据的实例配置文件。您的集群将引用这个新的基于令牌的实例概要。看到使用实例概要配置S3访问.
这个实例概要文件不需要任何直接的S3访问。相反,它只需要承担您用于数据访问的IAM角色的权限。本节将此实例概要中的角色ARN称为
< cluster-role-arn >
.在新的集群实例概要文件IAM角色上添加附加的IAM策略(
< cluster-role-arn >
).将以下策略声明添加到新的集群实例概要文件IAM Role并替换< data-role-arn >
你的原始实例配置文件的ARN访问你的桶。{“效应”:“允许”,“行动”:“sts: AssumeRole”,“资源”:“< data-role-arn >”}
在现有的数据访问IAM角色中添加信任策略声明并替换
< cluster-role-arn >
使用原始实例配置文件的ARN访问您的桶。{“效应”:“允许”,“校长”:{“AWS”:“< cluster-role-arn >”},“行动”:“sts: AssumeRole”}
要使用直接连接到S3而不使用DBFS的笔记本代码,请配置您的集群以使用新的基于令牌的实例配置文件,并承担数据访问角色。
为所有桶配置S3访问集群。将以下内容添加到集群的Spark配置中:
fs.s3a。credentialsType AssumeRolefs.s3a.stsAssumeRole。是< data-role-arn >
在Databricks Runtime 8.3及以上版本中,你可以为一个特定的桶配置:
fs.s3a.bucket。< bucket名> .aws.credentials。提供者org.apache.hadoop.fs.s3a.auth.AssumedRoleCredentialProviderfs.s3a.bucket。< bucket名> .assumed.role。是< data-role-arn >
关闭直接上传优化功能
作为非常小的更新的性能优化,默认情况下,提交服务有时会直接将小的更新从控制平面推送到S3。若要禁用此优化,请设置Spark参数spark.hadoop.fs.s3a.databricks.s3commit.directPutFileSizeThreshold
来0
.您可以在集群的Spark配置中应用此设置,也可以在全局初始化脚本.
禁用此功能可能会导致近实时结构化流查询的性能受到轻微影响,并不断进行小更新。在生产环境中禁用此特性之前,请考虑使用数据测试性能影响。
额外的桶安全性限制
下面的桶策略配置进一步限制了对S3桶的访问。
这些更改都不会影响GuardDuty警报。
将桶访问限制在特定的IP地址和S3操作。如果您对存储桶的其他控制感兴趣,可以限制特定的S3存储桶只能从特定的IP地址访问。例如,您可以将访问限制为您自己的环境和Databricks控制平面的IP地址,包括S3提交服务。看到限制对S3桶的访问.此配置限制了从其他位置使用凭据的风险。
将S3操作类型限制在所需目录之外.您可以拒绝从Databricks控制平面访问S3提交服务所需目录之外的S3桶。您还可以将这些目录中的操作限制为所需的S3操作
把
而且列表
来自Databricks的IP地址。Databricks控制平面(包括S3提交服务)不需要得到
桶的访问权限。{“席德”:“LimitCommitServiceActions”,“效应”:“否认”,“校长”:“*”,“NotAction”:[“s3: ListBucket”,“s3: GetBucketLocation”,“s3: propertynames”],“资源”:[“攻击:aws: s3::: < bucket名> / *”,“攻击:aws: s3::: < bucket名>”],“条件”:{“IpAddress”:{“aws: SourceIp”:“< control-plane-ip >”}}},{“席德”:“LimitCommitServicePut”,“效应”:“否认”,“校长”:“*”,“行动”:“s3: propertynames”,“NotResource”:[“攻击:aws: s3::: < bucket名> / * _delta_log / *”,“攻击:aws: s3::: < bucket名> / * _spark_metadata / *”,“攻击:aws: s3::: < bucket名> / *补偿/ *”,“攻击:aws: s3::: < bucket名> / * / *来源”,“攻击:aws: s3::: < bucket名> / *水槽/ *”,“攻击:aws: s3::: < bucket名> / * _schemas / *”],“条件”:{“IpAddress”:{“aws: SourceIp”:“< control-plane-ip >”}}},{“席德”:“LimitCommitServiceList”,“效应”:“否认”,“校长”:“*”,“行动”:“s3: ListBucket”,“资源”:“攻击:aws: s3::: < bucket名>”,“条件”:{“StringNotLike”:{“s3:前缀”:[“* _delta_log / *”,“* _spark_metadata / *”,“*补偿/ *”,“/ * *来源”,“*水槽/ *”,“* _schemas / *”]},“IpAddress”:{“aws: SourceIp”:“< control-plane-ip >”}}}
取代
< control-plane-ip >
与你的Databricks控制平面的区域IP地址.取代< bucket名>
S3桶名。