Press "Enter" to skip to content

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问

随着云计算的发展,随着计算能力和数据的可用性提高,机器学习(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的消费者账户。以下是工作流程的高级概述:

  1. 在消费者账户中使用VPCOnly模式设置SageMaker Studio。这样可以防止SageMaker为您的工作室笔记本提供互联网访问。所有SageMaker Studio流量都通过指定的VPC和子网进行。
  2. 更新SageMaker Studio域以打开SourceIdentity以传播用户配置文件名称。
  3. 在Amazon Redshift生产者账户中创建一个AWS身份和访问管理(IAM)角色,SageMaker Studio IAM角色将扮演该角色以访问Amazon Redshift。
  4. 在SageMaker Studio消费者账户中更新SageMaker IAM执行角色,SageMaker Studio将使用此角色来扮演生产者Amazon Redshift账户中的角色。
  5. 在Amazon Redshift生产者账户和SageMaker Studio消费者账户之间的VPC之间建立对等连接。
  6. 在消费者账户的SageMaker Studio中查询Amazon Redshift。

以下图示说明了我们的解决方案架构。

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第1张

先决条件

本文中的步骤假设在Amazon Redshift生产者账户中的私有子网中启动了Amazon Redshift。将Amazon Redshift启动在私有子网中与在公共子网中启动相比,提供了额外的安全和隔离层,因为私有子网无法直接从互联网访问,并且比较安全免受外部攻击。

为了下载公共库,您必须在SageMaker消费者账户中创建一个VPC和一个私有子网和公共子网。然后在公共子网中启动一个NAT网关,并为SageMaker Studio在私有子网中添加一个互联网网关以访问互联网。有关如何建立与私有子网的连接的说明,请参阅在Amazon VPC中为私有子网设置NAT网关。

在消费者账户中使用VPCOnly模式设置SageMaker Studio

要使用VPCOnly模式创建SageMaker Studio,请完成以下步骤:

  1. 在SageMaker控制台中,选择导航窗格中的Studio
  2. 启动SageMaker Studio,选择标准设置,然后选择配置

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第2张

如果您已经使用AWS IAM身份中心(AWS单点登录的后继者)来访问您的AWS账户,您可以使用它进行身份验证。否则,您可以使用IAM进行身份验证并使用现有的联合角色。

  1. 常规设置部分,选择创建新角色
  2. 创建IAM角色部分,可选择通过选择任意特定来指定您的Amazon Simple Storage Service(Amazon S3)存储桶,然后选择创建角色

这将创建一个SageMaker执行角色,例如AmazonSageMaker-ExecutionRole-00000000

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第3张

  1. 网络和存储部分,选择您之前创建的VPC、子网(私有子网)和安全组。
  2. 选择仅限VPC,然后选择下一步

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第4张

更新您的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"]

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第5张

这要求您在执行角色的信任关系中添加sts:SetSourceIdentity

在Amazon Redshift生产者账户中创建一个IAM角色,以供SageMaker Studio访问Amazon Redshift

要创建SageMaker将用于访问Amazon Redshift的角色,请完成以下步骤:

  1. 在Amazon Redshift生产者账户中打开IAM控制台。

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第6张

  1. 在导航窗格中选择角色,然后选择创建角色

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第7张

  1. 选择受信任的实体页面上,选择自定义信任策略
  2. 将以下自定义信任策略输入编辑器,并提供您的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"
           ]
            
        }
    ]
}

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第8张

  1. 选择下一步
  2. 添加所需权限页面上,选择创建策略
  3. 添加以下示例策略,并根据您的配置进行必要的编辑。
{
    "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": "*"
        }
    ]
}

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第9张

  1. 通过添加名称(例如RedshiftROAPIUserAccess)保存策略。

SourceIdentity属性用于将原始SageMaker Studio用户的身份与Amazon Redshift数据库用户关联起来。然后可以使用CloudTrail和Amazon Redshift数据库审计日志监视生产者账户中用户的操作。

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第10张

  1. 名称、回顾和创建页面上,输入角色名称,回顾设置,并选择创建角色

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第11张

更新SageMaker消费者账户中SageMaker Studio所扮演的角色以在Amazon Redshift生产者账户中扮演的角色

为了更新SageMaker执行角色以扮演我们刚刚创建的角色,请完成以下步骤:

  1. 在SageMaker消费者账户中打开IAM控制台。
  2. 在导航窗格中选择角色,然后选择我们创建的SageMaker执行角色(AmazonSageMaker-ExecutionRole-*)。
  3. 权限策略部分,在添加权限菜单中选择创建内联策略

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第12张

  1. 在编辑器中,在JSON选项卡上,输入以下策略,其中<StudioRedshiftRoleARN>是您在Amazon Redshift生产者账户中创建的角色的ARN:
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "<StudioRedshiftRoleARN>"
    }
}

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第13张

您可以在IAM控制台上获取在Amazon Redshift生产者账户中创建的角色的ARN,如下图所示。

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第14张

  1. 选择Review policy
  2. 对于名称,输入策略的名称。
  3. 选择创建策略

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第15张

您的权限策略应该与以下截图类似。

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第16张

在Amazon Redshift生产账户和SageMaker Studio消费账户之间建立VPC对等连接

要在SageMaker Studio VPC和Amazon Redshift VPC之间建立通信,需要使用VPC对等连接来对等连接这两个VPC。按照以下步骤完成连接的建立:

  1. 在Amazon Redshift或SageMaker账户中,打开Amazon VPC控制台。
  2. 在导航窗格中,选择Peering connections,然后选择Create peering connection
  3. 对于Name,输入您的连接的名称。
  4. Select a local VPC to peer with下,选择一个本地VPC。
  5. Select another VPC to peer with下,指定另一个在同一地区和另一个账户中的VPC。
  6. 选择Create peering connection

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第17张

  1. 审查VPC对等连接并选择Accept request以激活。

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第18张

成功建立VPC对等连接后,您需要在SageMaker和Amazon Redshift VPC上创建路由以完成它们之间的连接。

  1. 在SageMaker账户中,打开Amazon VPC控制台。
  2. 在导航窗格中选择Route tables,然后选择与SageMaker关联的VPC并编辑路由。
  3. 添加目标Amazon Redshift VPC的CIDR和对等连接。
  4. 此外,添加一个NAT网关。
  5. 选择Save changes

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第19张

  1. 在Amazon Redshift账户中,打开Amazon VPC控制台。
  2. 在导航窗格中选择Route tables,然后选择与Amazon Redshift关联的VPC并编辑路由。
  3. 添加目标SageMaker VPC的CIDR和对等连接。
  4. 此外,添加一个互联网网关。
  5. 选择Save changes

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第20张

您可以通过VPC接口终端在VPC内部连接到SageMaker Studio,而不是通过互联网连接。当您使用VPC接口终端时,您的VPC与SageMaker API或运行时之间的通信完全在AWS网络内进行,而且是安全的。

  1. 要创建VPC接口终端,在SageMaker账户中打开VPC控制台。
  2. 在导航窗格中选择Endpoints,然后选择Create endpoint
  3. 指定SageMaker VPC、相应的子网和适当的安全组,以允许SageMaker笔记本域的入站和出站NFS流量,并选择Create VPC endpoint

在Amazon SageMaker Studio中使用VPC互连配置Amazon Redshift集群的跨账户访问 四海 第21张

在消费者账户中使用SageMaker Studio查询Amazon Redshift

在成功建立所有网络连接之后,请按照本部分的步骤,使用AWS SDK for pandas库连接到SageMaker Studio消费者账户中的Amazon Redshift集群:

  1. 在SageMaker Studio中创建一个新的笔记本。
  2. 如果未安装AWS SDK for pandas包,可以使用以下命令进行安装:
!pip install awswrangler # AWS SDK for pandas

此安装不是持久性的,如果删除KernelGateway应用程序,将会丢失安装。可以将自定义包作为生命周期配置的一部分添加。

  1. 在第一个单元格中输入以下代码,并运行该代码。根据您的账户设置,替换RoleArnregion_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>>",
)
  1. 在新的单元格中输入以下代码,并运行该代码以获取当前的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")
  1. 在新的单元格中输入以下代码,并运行该代码:
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集群中为新创建的用户分配所需的读取权限。

  1. 在新的单元格中输入以下代码,更新查询以匹配您的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文档。

Leave a Reply

Your email address will not be published. Required fields are marked *