瑞士电信如何通过 AWS CDK 将 Amazon Redshift 自动化,作为其 One Dat

瑞士通信如何通过 AWS CDK 实现 Amazon Redshift 的自动化部署

关键要点

在这篇文章中,我们将深入探讨瑞士通信 (Swisscom) 使用 AWS Cloud Development Kit (AWS CDK) 来自动化 Amazon Redshift 的配置,从而实现其一体化数据平台 (One Data Platform ODP) 解决方案。本文将介绍自助使用 Redshift 集群的方法、身份联合、安全审核日志、JDBC 连接以及成本优化策略。

在第一部分 中,我们深度分析了如何使用 AWS CDK 创建安全合规的 Redshift 集群并讨论了密钥轮换的最佳实践。

现在,我们将探讨如何使用 AWS CDK 促进用户自助使用已配置的 Redshift 集群,以及与其他托管服务和应用程序集成的关键主题。这些主题包括与瑞士通信身份提供者 (IdP) 的联合认证、JDBC 连接、使用 AWS Config 规则进行监控和恢复、通过调度优化成本以及审计日志记录。

调度操作

为了优化已部署 Redshift 集群的成本效益,瑞士通信实现了一种调度机制。此功能由用户配置驱动,用户可以根据指定的 cron 表达式启用动态暂停和恢复集群:

yamlredshiftoptions usescheduler true # 是否使用 Redshift 调度器 schedulerpausecron cron(00 18 MONFRI ) # 调度器暂停的 cron 表达式 schedulerresumecron cron(00 08 MONFRI ) # 调度器恢复的 cron 表达式

此功能使瑞士通信能够在非高峰期间暂停集群操作,从而显著减少运营成本。调度功能通过使用 AWS CloudFormation 的 CfnScheduledAction 实现。以下代码示例展示了瑞士通信如何实现此调度:

pythonif configusescheduler cfnscheduledactionpause = awsredshiftCfnScheduledAction( scope schedulepauseaction # schedule=configschedulerpausecron # targetaction=awsredshiftCfnScheduledActionScheduledActionTypeProperty( pausecluster=awsredshiftCfnScheduledActionResumeClusterMessageProperty( clusteridentifier=clusteridentifier ) ) )

cfnscheduledactionresume = awsredshiftCfnScheduledAction(    scope scheduleresumeaction    #     schedule=configschedulerresumecron    #     targetaction=awsredshiftCfnScheduledActionScheduledActionTypeProperty(                     resumecluster=awsredshiftCfnScheduledActionResumeClusterMessageProperty(                        clusteridentifier=clusteridentifier                     )                  ))

JDBC 连接

对于 Amazon Redshift 集群的 JDBC 连接,非常灵活,适应用户定义的子网类型和安全组配置:

yamlredshiftoptions subnettype routableprivate # routableprivate 或 nonroutableprivate securitygroupid sgtestredshift # Amazon Redshift 的安全组 ID必须在账户中存在

如同在第一部分中的 ODP 架构图,许多提取、转换和加载 (ETL) 过程预计将在 Amazon Redshift 之外的无服务器 AWS Glue 环境中运行。因此,瑞士通信需要使 AWS Glue 能够连接到 Amazon Redshift。这种连接通过创建 AWS Glue 连接来实现,该连接在 AWS CDK 代码中定义。以下代码示例展示了如何实现:

pythonjdbcconnection = glueConnection( scope redshiftglueconnection type=ConnectionType(JDBC) connectionname=redshiftglueconnection subnet=connectionsubnet securitygroups=connectionsecuritygroups properties={ JDBCCONNECTIONURL fjdbcredshift//{clusterendpoint}/{databasename} USERNAME etluserusername PASSWORD etluserpasswordtostring() redshiftTmpDir fs3//{dataproductname}redshiftwork })

通过这样做,瑞士通信确保无服务器的 AWS Glue ETL 工作流能够与在安全虚拟私有云 (VPC) 中运行的新配置的 Redshift 集群安全通信。

身份联合

身份联合允许集中系统 (IdP) 用于验证用户,以便访问类似 Amazon Redshift 的服务提供商。有关该主题的一般概述可以在 AWS 中的身份联合 中找到。

身份联合不仅通过集中用户生命周期管理和身份验证机制例如,支持多因素认证提升安全性,还改善用户体验并减少身份和访问管理的整体复杂性,从而增强其治理能力。

在瑞士通信的设置中,使用 Microsoft Active Directory Services 进行身份和访问管理。在 ODP 的初始构建阶段,Amazon Redshift 提供了两种身份联合选项:

基于 IAM 的 SAML 20 IdP 联合,如使用 Microsoft Azure AD 单点登录联合访问 Amazon Redshift中所述。还请参阅使用 IAM 身份验证生成数据库用户凭据。原生 IdP 联合,如使用 SQL 客户端将 Amazon Redshift 原生 IdP 联合与 Microsoft Azure AD 集成中所述。另见 Amazon Redshift 的原生身份提供者 (IdP) 联合。

在瑞士通信的背景下,在初始实施期间,瑞士通信选择了基于 IAM 的 SAML 20 IdP 联合,因为这种方法更通用,还可以用于 Amazon QuickSight 等其他 AWS 服务参见 使用 IAM 和 QuickSight 设置 IdP 联合。

在 2023 年的 AWS reInvent 大会上,AWS 宣布了基于 AWS IAM Identity Center 的 Amazon Redshift 新连接选项。IAM Identity Center 为 AWS 中的工作身份提供一个统一的平台,允许直接在其中创建用户和组或与支持标准 IdP 的联邦系统如 Okta、PingOne、Microsoft Entra ID (Azure AD) 或任何支持 SAML 20 和 SCIM 的 IdP进行联邦。它还为 Redshift 功能及其他分析服务如 Amazon Redshift Query Editor V2提供无缝的单点登录 (SSO) 体验。

此外,一个 IAM Identity Center 实例可以与多个 Redshift 集群和工作区共享,并具备简单的自动发现和连接能力。确保所有 Redshift 集群和工作区对用户及其属性和组有一致的视图。这整个设置与 ODP 提供必要安全控制的自助分析愿景非常契合。目前,瑞士通信正在积极推进使用 IAM Identity Center 作为 ODP 的标准联合解决方案。以下图示展示了当前进行中的高层架构。

审计日志

Amazon Redshift 的审计日志对安全审核、监控和故障排查非常有用。日志提供信息,如用户计算机的 IP 地址、用户使用的身份验证类型或请求的时间戳。Amazon Redshift 记录 SQL 操作,包括连接尝试、查询和更改,并便于跟踪这些更改。这些日志可以通过对系统表的 SQL 查询进行访问,保存到安全的 Amazon Simple Storage Service (Amazon S3) 位置,或导出到 Amazon CloudWatch 中。

Amazon Redshift 记录的信息包含在以下日志文件中:

连接日志 提供有关用户连接到数据库的监控信息,以及相关连接信息如其 IP 地址。用户日志 记录有关数据库用户定义更改的信息。用户活动日志 跟踪用户和系统在数据库中执行的查询类型的信息,主要用于故障排查。

在 ODP 解决方案中,瑞士通信希望将所有 Amazon Redshift 日志写入 CloudWatch。由于目前 AWS CDK 不直接支持该功能,因此瑞士通信使用 AWS CDK 自定义资源选项实现了一个变通方案,该方案通过 SDK 调用 Redshift 的 enableLogging 操作。示例代码如下:

pythoncustomresourcesAwsCustomResource(self f{selfclusteridentifier}customsdklogging onupdate=customresourcesAwsSdkCall( service=Redshift action=enableLogging parameters={ ClusterIdentifier selfclusteridentifier LogDestinationType cloudwatch LogExports [connectionlog userlog useractivitylog] } physicalresourceid=customresourcesPhysicalResourceIdof( f{selfaccount}{selfregion}{selfclusteridentifier}logging) ) policy=customresourcesAwsCustomResourcePolicyfromsdkcalls( resources=[farnawsredshift{selfregion}{selfaccount}cluster{selfclusteridentifier}] ) )

AWS Config 规则与修复

在 Redshift 集群部署后,瑞士通信需要确保集群在创建后随时符合治理规则。因此,瑞士通信决定使用 AWS Config。

AWS Config 提供了详细的视图,展示 AWS 账户中 AWS 资源的配置,包括资源之间的关系,以及过去的配置方式,从而让用户随时查看配置和关系的变化。

以下图示展示了瑞士通信实施的流程。

如果 AWS Config 规则不合规,可以应用修复。瑞士通信定义在非合规集群的情况下默认采取暂停集群的操作根据需要,还可以采取其他修复措施。这通过 AWS Systems Manager SSM自动化文档实现。

SSM 自动化是一种简化 Amazon EC2、Amazon RDS、Amazon Redshift、Amazon S3 等 AWS 服务的常见维护、部署和修复任务的能力。

SSM 文档基于 AWSConfigRemediationDeleteRedshiftCluster。其代码如下所示:

yamldescription ### 文档名称 PauseRedshiftClusterWithCheck

## 本文档的功能 本文档通过 PauseCluster API 暂停给定的 Amazon Redshift 集群。

## 输入参数 AutomationAssumeRole (必需) 允许自动化代表您执行操作的角色 ARN。 ClusterIdentifier (必需) Amazon Redshift 集群的标识符。

## 输出参数 PauseRedshiftClusterWithoutSnapShotResponse PauseCluster API 的标准 HTTP 响应。 PauseRedshiftClusterWithSnapShotResponse PauseCluster API 的标准 HTTP 响应。 schemaVersion 03 assumeRole {{ AutomationAssumeRole }} parameters AutomationAssumeRole type String description (必需) 允许自动化代表您执行操作的角色 ARN。 allowedPattern arnaws[az09]iamd{12}role/[w/@=]{11017} ClusterIdentifier type String description (必需) Amazon Redshift 集群的标识符。 allowedPattern [az]{1}[az09]{062} mainSteps name GetRedshiftClusterStatus action awsexecuteAwsApi inputs ClusterIdentifier {{ ClusterIdentifier }} Service redshift Api DescribeClusters description ## GetRedshiftClusterStatus 获取给定 Amazon Redshift 集群的状态。 outputs Name ClusterStatus Selector Clusters[0]ClusterStatus Type String timeoutSeconds 600 name Condition action awsbranch inputs Choices NextStep PauseRedshiftCluster Variable {{ GetRedshiftClusterStatusClusterStatus }} StringEquals available Default Finish name PauseRedshiftCluster action awsexecuteAwsApi description ## PauseRedshiftCluster 通过 Amazon Redshift 集群标识符调用 PauseCluster API 暂停集群,不带最终快照。 ## 输出 Response PauseCluster API 的标准 HTTP 响应。 timeoutSeconds 600 isEnd false nextStep VerifyRedshiftClusterPause inputs Service redshift Api PauseCluster ClusterIdentifier {{ ClusterIdentifier }} outputs Name Response Selector Type StringMap name VerifyRedshiftClusterPause action awsassertAwsResourceProperty timeoutSeconds 600 isEnd true description ## VerifyRedshiftClusterPause 验证给定的 Amazon Redshift 集群已暂停。 inputs Service redshift Api DescribeClusters ClusterIdentifier {{ ClusterIdentifier }} PropertySelector Clusters[0]ClusterStatus DesiredValues pausing name Finish action awssleep inputs Duration PT1S isEnd true

瑞士电信如何通过 AWS CDK 将 Amazon Redshift 自动化,作为其 One Dat

SSM 自动化文档使用 AWS CDK 部署。

pythonfrom awscdk import awsssm as ssm

ssmdocumentcontent = #读取 yaml 文档为字典

documentid = automationid documentname = automationname

document = ssmCfnDocument(scope id=documentid content=ssmdocumentcontent documentformat=YAML documenttype=Automation name=documentname)

为 AWS Config 创建适当的权限,可以创建一个 IAM 角色:

from awscdk import iam

为自动化创建角色

rolename = roletopauseredshiftautomationrole = iamRole(scope roletopauseredshiftcluster assumedby=iamServicePrincipal(ssmamazonawscom) rolename=rolename)

automationpolicy = iamPolicy(scope policytopausecluster policyname=policytopausecluster statements=[ iamPolicyStatement( effect=iamEffectALLOW actions=[redshiftPauseCluster redshiftDescribeClusters] resources=[] ) ])

automationroleattachinlinepolicy(automationpolicy)

瑞士通信根据 AWS 最佳实践定义了要应用的规则参见 Amazon Redshift 的安全最佳实践。这些规则作为 AWS Config 一致性包conformance packs进行了部署。

一致性包是一组 AWS Config 规则和修复措施,可以作为一个单元快速部署到 AWS 账户和 AWS 区域,或通过 AWS Organizations 跨组织进行部署。

一致性包是通过编写包含 AWS Config 管理或自定义规则和修复措施的 YAML 模板来创建的。您还可以使用 SSM 文档将一致性包模板存储在 AWS 上,并通过 SSM 文档名称直接部署一致性包。

该 AWS 一致性包可以使用 AWS CDK 部署:

pythonfrom awscdk import awsconfig

conformancepacktemplate = #读取 yaml 文件为字符串 conformancepackcontent = #替换 rolearnforsubstitution 和 documentforsubstitution 在 conformancepacktemplate 中

conformancepackid = conformancepackid conformancepackname = conformancepackname

conformancepack = awsconfigCfnConformancePack(scope id=conformancepackid conformancepackname=conformancepackname templatebody=conformancepackcontent)

云梯加速器免费

结论

瑞士通信通过自动化的配置过程、先进的安全特性和可用户配置的选项,构建了其下一代数据即服务平台,以满足多样

给我们留言