在中管理 Amazon Redshift 命名空间的先决条件 AWS Glue Data Catalog - AWS Lake Formation

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在中管理 Amazon Redshift 命名空间的先决条件 AWS Glue Data Catalog

  1. 创建数据湖管理员-创建有权接受命名空间邀请的 IAM 角色,创建 AWS Glue Data Catalog 对象(目录、数据库、表/视图),并向其他用户授予 Lake Formation 权限。

    有关创建数据湖管理员的 step-by-step说明,请参阅创建数据湖管理员

  2. 更新数据湖管理员权限。

    除了数据湖管理员权限外,数据湖管理员还需要以下权限才能在 Lake Formation 中接受 Amazon Redshift 命名空间邀请、创建或更新数据目录资源以及启用数据湖访问权限:

    { "Version": "2012-10-17", "Id": "glue-enable-datalake-access", "Statement": [ { "Effect": "Allow", "Action": [ "redshift:AssociateDataShareConsumer", "redshift:DescribeDataSharesForConsumer", "redshift:DescribeDataShares", "redshift-serverless:CreateNamespace", "redshift-serverless:CreateWorkgroup", "redshift-serverless:DeleteNamespace", "redshift-serverless:DeleteWorkgroup", "ec2:DescribeAccountAttributes", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "ec2:DescribeAvailabilityZones", "s3:createBucket", "s3:deleteBucket", "s3:putBucketPolicy", "s3:putEncryptionConfiguration", "s3:putLifecycleConfiguration", "s3:putBucketVersioning", "iam:CreateRole" ], "Resource": "*" } ] } { "Action": [ "iam:PassRole" ], "Effect": "Allow", "Resource": "arn:aws:iam::*:role/data transfer role name", "Condition": { "StringLike": { "iam:PassedToService": [ "glue.amazonaws.com" ] } } }
  3. 如果用于创建联合目录的 IAM 角色不是数据湖管理员,则需要向该角色授予Create catalog权限。

    创建目录创建者
    1. 打开 Lake Formation 控制台,网址为https://console.aws.amazon.com/lakeformation/

    2. 在 “管理” 下选择 “管理角色和任务”。

    3. 选择授权

    4. 授予权限屏幕上,选择一个 IAM 用户或角色。

    5. 选择创建目录权限。

    6. 或者,您也可以授予可授予的 “创建目录” 权限。可授予权限允许目录创建者将Create catalog权限授予其他委托人。

    7. 选择授权

    AWS CLI 授予创建联合目录权限的示例。

    aws lakeformation grant-permissions \ --cli-input-json \ '{ "Principal": { "DataLakePrincipalIdentifier":"arn:aws:iam::123456789012:role/Admin" }, "Resource": { "Catalog": { } }, "Permissions": [ "CREATE_CATALOG", "DESCRIBE" ] }'
  4. 创建只读管理员角色,通过亚马逊 Redshift 查询编辑器 v2 在数据目录中发现 Amazon Redshift 联合目录。

    要从 Amazon Redshift 查询编辑器 v2 查询联合目录中的 Amazon Redshift 表,请确保只读管理员角色策略包含亚马逊 Redshift 服务相关角色的 ARN-。AWSServiceRoleForRedshift

    aws lakeformation put-data-lake-settings --region us-east-1 \ --data-lake-settings \ '{ "DataLakeAdmins": [{"DataLakePrincipalIdentifier":"arn:aws:iam::123456789012:role/Admin"}], "ReadOnlyAdmins":[{"DataLakePrincipalIdentifier":"arn:aws:iam::123456789012:role/aws-service-role/redshift.amazonaws.com/AWSServiceRoleForRedshift"}], "CreateDatabaseDefaultPermissions":[], "CreateTableDefaultPermissions":[], "Parameters":{"CROSS_ACCOUNT_VERSION":"4","SET_CONTEXT":"TRUE"} }'
  5. 创建一个数据传输角色,Amazon Redshift 可以代表您担任该角色,用于向 Amazon S3 存储桶传输数据和从该存储桶传输数据。

    当您为兼容 Apache Iceberg 的查询引擎(例如亚马逊上的 Athena、Amazon EMR)启用数据湖访问权限以 EC2 访问数据目录中的 Amazon Redshift 资源时,您需要创建一个具有所需权限的 IAM 角色来执行与亚马逊 S3 存储桶之间的数据传输。

    { "Version": "2012-10-17", "Id": "glue-enable-datalake-access", "Statement": [{ "Sid": "DataTransferRole policy", "Effect": "Allow", "Action": [ "glue:GetCatalog", "glue:GetDatabase", "kms:GenerateDataKey", "kms:Decrypt"], "Resource": "*" } ] }
  6. 将以下信任策略添加到 AWS Glue 和 Amazon Redshift 服务的数据传输角色中,以代入和传出 Amazon S3 存储桶的数据的角色。

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": [ "redshift.amazonaws.com", "glue.amazonaws.com" ] }, "Action": "sts:AssumeRole" }] }
  7. 如果您使用客户托管密钥加密 Amazon Redshift 集群/命名空间中的数据,请将以下密钥策略添加到密钥中。 AWS KMS 将账号替换为有效的 AWS 账号,并指定数据传输角色名称。默认情况下,Amazon Redshift 集群中的数据使用 KMS 密钥进行加密。Lake Formation 提供了一个选项来创建用于加密的自定义 KMS 密钥。如果您使用的是客户管理的密钥,则必须为密钥添加特定的密钥策略。

    有关管理客户管理型密钥权限的更多信息,请参阅客户管理型密钥

    { "Version": "2012-10-17", "Id": "auto-redshift-3", "Statement": [ { "Sid": "Allow access through RedShift for all principals in the account that are authorized to use RedShift", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:CallerAccount": "123456789012", "kms:ViaService": "redshift.us-east-1.amazonaws.com" } } }, { "Sid": "Allow access through RedShift-Serverless for all principals in the account that are authorized to use RedShift-Serverless", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:CallerAccount": "123456789012", "kms:ViaService": "redshift-serverless.us-east-1.amazonaws.com" } } }, { "Sid": "Allow direct access to key metadata to the account", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ], "Resource": "*" }, { "Sid": "Allow GenerateDataKey + Decrypt to the DataTransferRole via s3", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012 :role/data-transfer-role-name" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" }, "Condition": { "StringEquals": { "kms:ViaService": "s3.us-east-1.amazonaws.com" } } ] }