随着云计算的发展,随着计算能力和数据的可用性提高,机器学习(ML)正在对各行各业产生影响,并成为每个企业和行业的核心部分。
Amazon SageMaker Studio是第一个完全集成的具有基于Web的可视界面的机器学习(ML)开发环境(IDE)。您可以执行所有机器学习开发步骤,并完全访问、控制和查看构建、训练和部署模型所需的每个步骤。
Amazon Redshift是一个完全托管、快速、安全且可扩展的云数据仓库。组织通常希望使用SageMaker Studio从诸如Amazon Redshift之类的数据仓库中获取预测。
如AWS Well-Architected Framework中所述,通过在不同的账户之间分离工作负载,可以使您的组织在隔离环境的同时设置共同的防护措施。这对于某些安全要求特别有用,并且可以简化项目和团队之间的成本控制和监控。通常具有多账户架构的组织通常在两个单独的AWS账户中拥有Amazon Redshift和SageMaker Studio。此外,通常将Amazon Redshift和SageMaker Studio配置在具有私有子网的VPC中,以改善安全性并降低未经授权访问风险,这是最佳实践。
当使用RA3节点类型时,Amazon Redshift原生支持跨账户数据共享。如果您使用其他Amazon Redshift节点类型(如DS2或DC2),则可以使用VPC对等连接来建立Amazon Redshift和SageMaker Studio之间的跨账户连接。
在本文中,我们将逐步介绍如何使用VPC对等连接在一个AWS账户中的Amazon Redshift集群与另一个AWS账户中的SageMaker Studio之间建立跨账户连接,以连接任何Amazon Redshift节点类型(RA3、DC2、DS2)。
解决方案概述
我们从两个AWS账户开始:一个拥有Amazon Redshift数据仓库的生产者账户,以及一个用于Amazon SageMaker ML用例且已设置SageMaker Studio的消费者账户。以下是工作流程的高级概述:
- 在消费者账户中使用
VPCOnly
模式设置SageMaker Studio。这样可以防止SageMaker为您的工作室笔记本提供互联网访问。所有SageMaker Studio流量都通过指定的VPC和子网进行。 - 更新SageMaker Studio域以打开
SourceIdentity
以传播用户配置文件名称。 - 在Amazon Redshift生产者账户中创建一个AWS身份和访问管理(IAM)角色,SageMaker Studio IAM角色将扮演该角色以访问Amazon Redshift。
- 在SageMaker Studio消费者账户中更新SageMaker IAM执行角色,SageMaker Studio将使用此角色来扮演生产者Amazon Redshift账户中的角色。
- 在Amazon Redshift生产者账户和SageMaker Studio消费者账户之间的VPC之间建立对等连接。
- 在消费者账户的SageMaker Studio中查询Amazon Redshift。
以下图示说明了我们的解决方案架构。
先决条件
本文中的步骤假设在Amazon Redshift生产者账户中的私有子网中启动了Amazon Redshift。将Amazon Redshift启动在私有子网中与在公共子网中启动相比,提供了额外的安全和隔离层,因为私有子网无法直接从互联网访问,并且比较安全免受外部攻击。
为了下载公共库,您必须在SageMaker消费者账户中创建一个VPC和一个私有子网和公共子网。然后在公共子网中启动一个NAT网关,并为SageMaker Studio在私有子网中添加一个互联网网关以访问互联网。有关如何建立与私有子网的连接的说明,请参阅在Amazon VPC中为私有子网设置NAT网关。
在消费者账户中使用VPCOnly模式设置SageMaker Studio
要使用VPCOnly
模式创建SageMaker Studio,请完成以下步骤:
- 在SageMaker控制台中,选择导航窗格中的Studio。
- 启动SageMaker Studio,选择标准设置,然后选择配置。
如果您已经使用AWS IAM身份中心(AWS单点登录的后继者)来访问您的AWS账户,您可以使用它进行身份验证。否则,您可以使用IAM进行身份验证并使用现有的联合角色。
- 在常规设置部分,选择创建新角色。
- 在创建IAM角色部分,可选择通过选择任意、特定或无来指定您的Amazon Simple Storage Service(Amazon S3)存储桶,然后选择创建角色。
这将创建一个SageMaker执行角色,例如AmazonSageMaker-ExecutionRole-00000000
。
- 在网络和存储部分,选择您之前创建的VPC、子网(私有子网)和安全组。
- 选择仅限VPC,然后选择下一步。
更新您的SageMaker Studio域以开启SourceIdentity以传播用户配置文件名称
SageMaker Studio与AWS CloudTrail集成,使管理员能够监控和审计来自SageMaker Studio笔记本的用户活动和API调用。您可以配置SageMaker Studio记录用户身份(具体来说是用户配置文件名称),以监控和审计来自SageMaker Studio笔记本的用户活动和API调用的CloudTrail事件。
为了记录多个用户配置文件中的特定用户活动,我们建议您开启SourceIdentity
以将SageMaker Studio域与用户配置文件名称关联起来。这样可以将用户信息持久化到会话中,以便将操作归因于特定用户。此属性在角色链中也持久存在,因此您可以获得对生产账户中用户操作的细粒度可见性。截至本文撰写时,您只能使用AWS命令行界面(AWS CLI)或任何命令行工具配置此项。
若要更新此配置,域中的所有应用程序必须处于已停止或已删除状态。
使用以下代码启用用户配置文件名称作为SourceIdentity
的传播:
update-domain
--domain-id <value>
[--default-user-settings <value>]
[--domain-settings-for-update "ExecutionRoleIdentityConfig=USER_PROFILE_NAME"]
这要求您在执行角色的信任关系中添加sts:SetSourceIdentity
。
在Amazon Redshift生产者账户中创建一个IAM角色,以供SageMaker Studio访问Amazon Redshift
要创建SageMaker将用于访问Amazon Redshift的角色,请完成以下步骤:
- 在Amazon Redshift生产者账户中打开IAM控制台。
- 在导航窗格中选择角色,然后选择创建角色。
- 在选择受信任的实体页面上,选择自定义信任策略。
- 将以下自定义信任策略输入编辑器,并提供您的SageMaker消费者帐户ID和您创建的SageMaker执行角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<<SageMaker-Consumer-Account-ID>>:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXX"
},
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
]
}
]
}
- 选择下一步。
- 在添加所需权限页面上,选择创建策略。
- 添加以下示例策略,并根据您的配置进行必要的编辑。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetRedshiftCredentials",
"Effect": "Allow",
"Action": "redshift:GetClusterCredentials",
"Resource": [
"arn:aws:redshift:<<redshift-region-name>>:<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:dbname:<<redshift-cluster-name>>/<<redshift-db-name>>",
"arn:aws:redshift:<<redshift-region-name>>:<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:dbuser:<<redshift-cluster-name>>/${redshift:DbUser}",
"arn:aws:redshift:<<redshift-region-name>>:<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:cluster:<<redshift-cluster-name>>"
],
"Condition": {
"StringEquals": {
"redshift:DbUser": "${aws:SourceIdentity}"
}
}
},
{
"Sid": "DynamicUserCreation",
"Effect": "Allow",
"Action": "redshift:CreateClusterUser",
"Resource": "arn:aws:redshift:<<redshift-region-name>>:<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:dbuser:<<redshift-cluster-name>>/${redshift:DbUser}",
"Condition": {
"StringEquals": {
"redshift:DbUser": "${aws:SourceIdentity}"
}
}
},
{
"Effect": "Allow",
"Action": "redshift:JoinGroup",
"Resource": "arn:aws:redshift:<<redshift-region-name>>:<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:dbgroup:<<redshift-cluster-name>>/*"
},
{
"Sid": "DataAPIPermissions",
"Effect": "Allow",
"Action": [
"redshift-data:ExecuteStatement",
"redshift-data:CancelStatement",
"redshift-data:ListStatements",
"redshift-data:GetStatementResult",
"redshift-data:DescribeStatement",
"redshift-data:ListDatabases",
"redshift-data:ListSchemas",
"redshift-data:ListTables",
"redshift-data:DescribeTable"
],
"Resource": "*"
},
{
"Sid": "ReadPermissions",
"Effect": "Allow",
"Action": [
"redshift:Describe*",
"redshift:ViewQueriesInConsole"
],
"Resource": "*"
}
]
}
- 通过添加名称(例如
RedshiftROAPIUserAccess
)保存策略。
SourceIdentity
属性用于将原始SageMaker Studio用户的身份与Amazon Redshift数据库用户关联起来。然后可以使用CloudTrail和Amazon Redshift数据库审计日志监视生产者账户中用户的操作。
- 在名称、回顾和创建页面上,输入角色名称,回顾设置,并选择创建角色。
更新SageMaker消费者账户中SageMaker Studio所扮演的角色以在Amazon Redshift生产者账户中扮演的角色
为了更新SageMaker执行角色以扮演我们刚刚创建的角色,请完成以下步骤:
- 在SageMaker消费者账户中打开IAM控制台。
- 在导航窗格中选择角色,然后选择我们创建的SageMaker执行角色(
AmazonSageMaker-ExecutionRole-*
)。 - 在权限策略部分,在添加权限菜单中选择创建内联策略。
- 在编辑器中,在JSON选项卡上,输入以下策略,其中<StudioRedshiftRoleARN>是您在Amazon Redshift生产者账户中创建的角色的ARN:
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "<StudioRedshiftRoleARN>"
}
}
您可以在IAM控制台上获取在Amazon Redshift生产者账户中创建的角色的ARN,如下图所示。
- 选择Review policy。
- 对于名称,输入策略的名称。
- 选择创建策略。
您的权限策略应该与以下截图类似。
在Amazon Redshift生产账户和SageMaker Studio消费账户之间建立VPC对等连接
要在SageMaker Studio VPC和Amazon Redshift VPC之间建立通信,需要使用VPC对等连接来对等连接这两个VPC。按照以下步骤完成连接的建立:
- 在Amazon Redshift或SageMaker账户中,打开Amazon VPC控制台。
- 在导航窗格中,选择Peering connections,然后选择Create peering connection。
- 对于Name,输入您的连接的名称。
- 在Select a local VPC to peer with下,选择一个本地VPC。
- 在Select another VPC to peer with下,指定另一个在同一地区和另一个账户中的VPC。
- 选择Create peering connection。
- 审查VPC对等连接并选择Accept request以激活。
成功建立VPC对等连接后,您需要在SageMaker和Amazon Redshift VPC上创建路由以完成它们之间的连接。
- 在SageMaker账户中,打开Amazon VPC控制台。
- 在导航窗格中选择Route tables,然后选择与SageMaker关联的VPC并编辑路由。
- 添加目标Amazon Redshift VPC的CIDR和对等连接。
- 此外,添加一个NAT网关。
- 选择Save changes。
- 在Amazon Redshift账户中,打开Amazon VPC控制台。
- 在导航窗格中选择Route tables,然后选择与Amazon Redshift关联的VPC并编辑路由。
- 添加目标SageMaker VPC的CIDR和对等连接。
- 此外,添加一个互联网网关。
- 选择Save changes。
您可以通过VPC接口终端在VPC内部连接到SageMaker Studio,而不是通过互联网连接。当您使用VPC接口终端时,您的VPC与SageMaker API或运行时之间的通信完全在AWS网络内进行,而且是安全的。
- 要创建VPC接口终端,在SageMaker账户中打开VPC控制台。
- 在导航窗格中选择Endpoints,然后选择Create endpoint。
- 指定SageMaker VPC、相应的子网和适当的安全组,以允许SageMaker笔记本域的入站和出站NFS流量,并选择Create VPC endpoint。
在消费者账户中使用SageMaker Studio查询Amazon Redshift
在成功建立所有网络连接之后,请按照本部分的步骤,使用AWS SDK for pandas库连接到SageMaker Studio消费者账户中的Amazon Redshift集群:
- 在SageMaker Studio中创建一个新的笔记本。
- 如果未安装AWS SDK for pandas包,可以使用以下命令进行安装:
!pip install awswrangler # AWS SDK for pandas
此安装不是持久性的,如果删除KernelGateway应用程序,将会丢失安装。可以将自定义包作为生命周期配置的一部分添加。
- 在第一个单元格中输入以下代码,并运行该代码。根据您的账户设置,替换
RoleArn
和region_name
的值:
import boto3
import awswrangler as wr
import pandas as pd
from datetime import datetime
import json
sts_client = boto3.client('sts')
# 调用STSConnection对象的assume_role方法,并传递角色ARN和角色会话名称。
assumed_role_object=sts_client.assume_role(
RoleArn="arn:aws:iam::<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:role/<<redshift-account-role>>",
RoleSessionName="RedshiftSession"
)
credentials=assumed_role_object['Credentials']
# 使用AssumeRole返回的临时凭证连接到Amazon S3
redshift_session=boto3.Session(
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'],
region_name="<<redshift-region-name>>",
)
- 在新的单元格中输入以下代码,并运行该代码以获取当前的SageMaker用户配置文件名称:
def get_userprofile_name():
metadata_file_path = '/opt/ml/metadata/resource-metadata.json'
with open(metadata_file_path, 'r') as logs:
metadata = json.load(logs)
return metadata.get("UserProfileName")
- 在新的单元格中输入以下代码,并运行该代码:
con_redshift = wr.redshift.connect_temp(
cluster_identifier="<<redshift-cluster-name>>",
database="<<redshift-db-name>>",
user=get_userprofile_name(),
auto_create=True,
db_groups=[<<list-redshift-user-group>>],
boto3_session = redshift_session
)
为了成功查询Amazon Redshift,您的数据库管理员需要在生产者账户的Amazon Redshift集群中为新创建的用户分配所需的读取权限。
- 在新的单元格中输入以下代码,更新查询以匹配您的Amazon Redshift表,并运行单元格。这将成功返回记录,以供进一步的数据处理和分析。
df = wr.redshift.read_sql_query(
sql="SELECT * FROM users",
con=con_redshift
)
现在,您可以根据业务需求开始构建数据转换和分析。
清理
为了避免产生重复费用,删除SageMaker VPC端点、Amazon Redshift集群以及SageMaker Studio应用程序、用户和域。还要删除您创建的任何S3存储桶和对象。
结论
本文介绍了如何使用VPC对等连接在不同账户的私有Amazon Redshift和SageMaker Studio VPC之间建立跨账户连接,以及如何使用IAM角色链接从SageMaker Studio访问Amazon Redshift数据,同时记录用户在SageMaker Studio中访问Amazon Redshift时的身份。通过这个解决方案,您可以消除手动迁移数据来访问数据的需求。我们还介绍了如何在SageMaker Studio中使用AWS SDK for pandas库访问Amazon Redshift集群,并为机器学习用例准备数据。
若要了解有关Amazon Redshift和SageMaker的更多信息,请参阅Amazon Redshift数据库开发人员指南和Amazon SageMaker文档。