使用gauserole策略訪問跨帳戶S3桶

在AWS中,您可以設置跨帳戶訪問,因此一個帳戶中的計算可以訪問另一個帳戶中的桶。中描述的一種授予訪問權限的方法使用實例概要配置S3訪問,是授予一個帳戶直接訪問另一個帳戶中的桶。授予對桶的訪問權限的另一種方法是允許帳戶訪問扮演一個角色在另一個賬戶裏。

考慮具有帳戶ID的AWS帳戶A< deployment-acct-id >和AWS帳戶B< bucket-owner-acct-id >.帳戶A用於簽約了數據庫: EC2服務和DBFS根桶均由該帳戶管理。帳戶B有一個桶< s3-bucket-name >

本文提供配置帳戶A以使用AWS AssumeRole訪問S3文件的操作< s3-bucket-name >要啟用此訪問,請在帳戶a和帳戶B以及Databricks管理控製台中執行配置。您還必須配置Databricks集群或向訪問桶的筆記本添加配置。

需求

  • AWS管理員訪問Databricks部署的AWS帳戶和S3桶的AWS帳戶中的IAM角色和策略。

  • 目標S3桶。

  • 如果您打算啟用加密對於S3桶,必須將實例配置文件添加為關鍵用戶輸入配置中提供的KMS密鑰。看到為s3a://路徑配置KMS加密

步驟1:在帳號A中創建角色MyRoleA並附加策略

  1. 創建一個名為MyRoleA“實例配置文件ARN”為攻擊:aws:我::< deployment-acct-id >: instance-profile / MyRoleA

  2. 創建一個策略,說明帳戶a中的角色可以承擔MyRoleB在賬戶b中MyRoleA.點擊內聯政策然後粘貼策略:

    “版本”“2012-10-17”“聲明”“席德”“Stmt1487884001000”“效應”“允許”“行動”“sts: AssumeRole”],“資源”“攻擊:aws:我::< bucket-owner-acct-id >: / MyRoleB”角色
  3. 更新Account A角色的策略創建集群,加上我:PassRole行動MyRoleA

    “版本”“2012-10-17”“聲明”“席德”“Stmt1403287045000”“效應”“允許”“行動”“ec2: AssociateDhcpOptions”“ec2: AssociateIamInstanceProfile”“ec2: AssociateRouteTable”“ec2: AttachInternetGateway”“ec2: AttachVolume”“ec2: AuthorizeSecurityGroupEgress”“ec2: AuthorizeSecurityGroupIngress”“ec2: CancelSpotInstanceRequests”“ec2: CreateDhcpOptions”“ec2: CreateInternetGateway”“ec2: CreateKeyPair”“ec2: CreateRoute”“ec2: CreateSecurityGroup”“ec2: CreateSubnet”“ec2: CreateTags”“ec2: CreateVolume”“ec2: CreateVpc”“ec2: CreateVpcPeeringConnection”“ec2: DeleteInternetGateway”“ec2: DeleteKeyPair”“ec2: DeleteRoute”“ec2: DeleteRouteTable”“ec2: DeleteSecurityGroup”“ec2: DeleteSubnet”“ec2: DeleteTags”“ec2: DeleteVolume”“ec2: DeleteVpc”“ec2: DescribeAvailabilityZones”“ec2: DescribeIamInstanceProfileAssociations”“ec2: DescribeInstanceStatus”“ec2: DescribeInstances”“ec2: DescribePrefixLists”“ec2: DescribeReservedInstancesOfferings”“ec2: DescribeRouteTables”“ec2: DescribeSecurityGroups”“ec2: DescribeSpotInstanceRequests”“ec2: DescribeSpotPriceHistory”“ec2: DescribeSubnets”“ec2: DescribeVolumes”“ec2: DescribeVpcs”“ec2: DetachInternetGateway”“ec2: DisassociateIamInstanceProfile”“ec2: ModifyVpcAttribute”“ec2: ReplaceIamInstanceProfileAssociation”“ec2: RequestSpotInstances”“ec2: RevokeSecurityGroupEgress”“ec2: RevokeSecurityGroupIngress”“ec2: RunInstances”“ec2: TerminateInstances”],“資源”“*”},“效應”“允許”“行動”“我:PassRole”“資源”“攻擊:aws:我::< deployment-acct-id >: / MyRoleA”角色

    請注意

    如果您的帳戶使用的是Databricks平台的E2版本,則可以省略Beplay体育安卓版本ec2: CreateKeyPair而且ec2: DeleteKeyPair.如果您不確定您的帳戶版本,請聯係您的Databricks代表。

步驟2:在帳號B中創建角色MyRoleB並附加策略

  1. 創建一個名為MyRoleB.角色ARN為攻擊:aws:我::< bucket-owner-acct-id >: / MyRoleB角色

  2. 編輯角色的信任關係MyRoleB允許角色MyRoleA在帳號A中扮演帳號b中的角色,請選擇IAM >角色> MyRoleB >信任關係>編輯信任關係並輸入:

    “版本”“2012-10-17”“聲明”“效應”“允許”“校長”“AWS”“攻擊:aws:我::< deployment-acct-id >: / MyRoleA”角色},“行動”“sts: AssumeRole”
  3. 為桶創建桶策略< s3-bucket-name >.選擇S3 >< s3-bucket-name >>權限>桶策略.包括角色(負責人)MyRoleB在桶策略中:

    “版本”“2012-10-17”“聲明”“效應”“允許”“校長”“AWS”“攻擊:aws:我::< bucket-owner-acct-id >: / MyRoleB”角色},“行動”“s3: GetBucketLocation”“s3: ListBucket”],“資源”“攻擊:aws: s3::: < s3-bucket-name >”},“效應”“允許”“校長”“AWS”“攻擊:aws:我::< bucket-owner-acct-id >: / MyRoleB”角色},“行動”“s3: propertynames”“s3: PutObjectAcl”“s3: GetObject”“s3: DeleteObject”],“資源”“攻擊:aws: s3::: < s3-bucket-name > / *”

提示

如果係統提示您主要錯誤,確保您隻修改了信任關係政策。

3 .添加MyRoleA到Databricks工作區

在Databricks管理控製台中,添加實例概要文件MyRoleA到數據庫使用MyRoleA實例概要ARN攻擊:aws:我::< deployment-acct-id >: instance-profile / MyRoleA從第一步開始。

步驟4:配置cluster withMyRoleA

  1. 選擇或創建集群。

  2. 打開高級選項部分。

  3. 實例選項卡上,選擇實例概要文件MyRoleA

  4. 火花選項卡,設置假設角色憑據提供程序和角色ARNMyRoleB

    請注意

    Databricks Runtime 7.3 LTS及以上版本支持配置S3A文件係統開源Hadoop選項.可以配置全局屬性和每桶屬性。

    為所有桶設置全局值:

    fs.s3a.aws.credentials。提供者org.apache.hadoop.fs.s3a.auth。AssumedRoleCredentialProvider fs.s3a.assumed.role。在攻擊攻擊:aws:我::< bucket-owner-account-id >: / MyRoleB角色

    設置為指定的桶。

    fs.s3a.bucket。< s3-bucket-name > .aws.credentials。提供者org.apache.hadoop.fs.s3a.auth。AssumedRoleCredentialProvider fs.s3a.bucket。< s3-bucket-name > .assumed.role。在攻擊攻擊:aws:我::< bucket-owner-account-id >: / MyRoleB角色
  5. 啟動集群。

  6. 在集群上附加一個筆記本。

  7. 驗證您是否可以訪問< s3-bucket-name >運行命令如下:

    dbutilsfsls“s3a: / / < s3-bucket-name > /”

步驟5:使用假想角色掛載跨帳戶桶

您可以掛載跨帳戶桶以使用相對文件路徑訪問遠程數據。看到使用實例概要文件和假設角色策略掛載桶

使用Terraform進行自動化配置

你可以使用Databricks Terraform提供商自動配置AWS IAM角色及其集群附件。

如本例配置所示,首先定義兩個變量:

variable "prefix" {default = "changeme"} variable "databricks_account_id" {description = "賬號ID。您可以在帳戶控製台的左下角獲得帳戶ID。見https://accounts.cloud.m.eheci.com"}

使用以下命令創建桶aws_s3_bucket

資源“aws_s3_bucket”“ds”{bucket = "${var.桶。Prefix}-ds" acl = "private" versioning {enabled = false} force_destroy = true tags = merge(var。標簽,{Name = "${var. "前綴}-ds"})}

創建IAM角色,用於數據訪問aws_iam_role

data "aws_iam_policy_document" "assume_role_for_ec2" {statement {effect = "Allow" actions = ["sts: presumerole "] principals {identifiers = ["ec2.amazonaws.com"] type = "Service"}}} resource "aws_iam_role" "data_role" {name = "${var。prefix}-first-ec2s3" description = "(${var.prefix}) EC2 Assume Role S3訪問角色" assume_role_policy = data.aws_iam_policy_document.assume_role_for_ec2. prefix}-first-ec2s3"Json標簽= var.tags}

創建桶策略databricks_aws_bucket_policy定義,該定義提供對此桶的完全訪問權。將內聯S3桶策略應用於新創建的桶aws_s3_bucket_policy

Data "databricks_aws_bucket_policy" "ds" {provider = databricks。MWS full_access_role = aws_iam_role.data_role。Arn bucket = aws_s3_bucket.ds。桶}資源“aws_s3_bucket_policy”“ds”{Bucket = aws_s3_bucket.ds。Id policy = data.databricks_aws_bucket_policy.ds。json}

創建一個跨帳戶策略,該策略允許Databricks使用對象傳遞數據角色列表aws_iam_policy

Data "databricks_aws_crossaccount_policy" "this" {pass_roles = [aws_iam_role.data_role.]Arn]}資源"aws_iam_policy" "cross_account_policy" {name = "${var。Prefix}-crossaccount-iam-policy" policy = data.databricks_aws_crossaccount_policy.this。json}

允許數據庫在您的帳戶內執行操作,方法是使用aws_iam_role_policy_attachment.賦予Databricks完全訪問VPC資源的權限,並為跨帳號角色綁定跨帳號策略:

數據"databricks_aws_assume_role_policy" "this" {external_id = var.databricks_account_id}資源"aws_iam_role" "cross_account" {name = "${var. assume_role_policy" "this" {external_id = var.databricks_account_id}Prefix}-crossaccount-iam-role" assume_role_policy = data.databricks_aws_assume_role_policy.this. crossaccount-iam-role"{policy_arn = aws_iam_policy.cross_account_policy. json description = "授予數據庫完全訪問VPC資源"}resource "aws_iam_role_policy_attachment" "cross_account" {policy_arn = aws_iam_policy.cross_account_policy. json description = "授予數據庫完全訪問VPC資源"}Arn role = aws_iam_role.cross_account.name}

注冊跨帳戶角色E2工作空間設置

資源"databricks_mws_credentials" "this" {provider = databricks. xml "MWS account_id = var.databricks_account_id credentials_name = "${var。Prefix}-creds" role_arn = aws_iam_role.cross_account. cross_account。在攻擊}

創建工作區後,將數據角色注冊到aws_iam_instance_profile作為databricks_instance_profile

資源"aws_iam_instance_profile" "this" {name = "${var. xml "Prefix}-first-profile" role = aws_iam_role.data_role.name} resource "databricks_instance_profile" "ds" {instance_profile_arn = aws_iam_instance_profile.this. ds" {instance_profile_arn = aws_iam_instance_profile.this. name "在攻擊}

對於最後一步,創建一個/ mnt /實驗掛載點和具有指定實例配置文件的集群:

資源“databricks_aws_s3_mount”“this”{instance_profile = databricks_instance_profile.ds。Id s3_bucket_name = aws_s3_bucket。桶mount_name = "experiments"} data "databricks_node_type" minimal " {local_disk = true} data "databricks_spark_version" "latest_lts" {long_term_support = true} resource "databricks_cluster" "shared_autoscaling" {cluster_name = "Shared Autoscaling" spark_version = data.databricks_spark_version.latest_lts. "Id node_type_id = data.databricks_node_type. least。Id autotermination_minutes = 20 autoscale {min_workers = 1 max_workers = 50} aws_attributes {instance_profile_arn = databricks_instance_profile.ds。Id}}