☰
Amazon Connect 实例的 CDK 自动化部署:Python 基础设施即代码实战指南
2026/10/15 2:34:10 网站建设 项目流程

【免费下载链接】aws-cdk-examples

Example projects using the AWS CDK

项目地址:https://gitcode.com/gh_mirrors/aw/aws-cdk-examples
点击查看免费下载

导读

本文基于 aws-cdk-examples 仓库中的 python/amazon-connect 示例,系统讲解如何使用 AWS CDK(Python 语言)以基础设施即代码的方式一键创建 Amazon Connect 云联络中心实例。你将掌握:如何用aws_connect构造库声明式地创建实例、为通话录音与定时报表配置 S3 存储、为联系人追踪记录(Contact Trace Records)搭建 Firehose 传输流,以及如何分配电话号码并定义营业时间。全文以 官方 README 为骨架,结合 amazon_connect_stack.py 的完整实现逐段剖析,并给出可复制的部署与销毁命令。

一、示例概述:用 CDK 管理 Amazon Connect 的完整生命周期

Amazon Connect 是 AWS 提供的全渠道云联络中心服务。传统上,在控制台手动创建实例、配置存储和号码,流程繁琐且难以复现。本示例的核心用例正是:让客户能够使用 CDK(Python)来预置(provision)并配置(configure)Amazon Connect 实例,将整个联络中心的基础设施声明式地写进代码,随代码库一起版本化、可评审、可重建。

该示例标注为Stable(稳定):它完全构建在标记为 "Stable" 的构造库之上,不需要任何基础设施前置条件即可开箱构建(out of the box),这一点在 README 中有明确说明。

从整体解决方案看,示例会部署的资源包括:

  • 一个Amazon Connect 实例(由aws_connect模块的CfnInstance创建);
  • 用于**通话录音与转录(call recordings and transcripts)**的 S3 存储桶,以及配套的访问日志桶与 KMS 加密密钥;
  • 用于**联系人追踪记录(Contact Trace Records,CTR)**的Firehose Delivery Stream(含配套 IAM 角色);
  • 用于**定时报表(scheduled reports)**的 S3 存储桶及访问日志桶;
  • 分配给实例的一个电话号码;
  • 联络中心的**营业时间(hours of operation)**配置。

部署完成后,实例随即被绑定电话号码,并按 "Main"(主营业时间)的配置对外提供服务。整个堆栈由 app.py 入口组装,仅一行即完成注册:

#!/usr/bin/env python3 import aws_cdk as cdk from amazon_connect.amazon_connect_stack import AmazonConnectStack app = cdk.App() AmazonConnectStack(app, "AmazonConnectStack") app.synth()

二、逐段解析核心实现:从实例到存储再到号码

堆栈的全部逻辑集中在 amazon_connect_stack.py。下面按资源创建顺序拆解,每一段都对应可验证的源码行号。

2.1 创建 Amazon Connect 实例(L25-L37)

实例的创建是整个堆栈的起点,后续所有资源(存储、号码、营业时间)都通过attr_arn与该实例关联:

amazon_connect_instance = connect.CfnInstance(self, "AmazonConnectInstance", attributes=connect.CfnInstance.AttributesProperty( inbound_calls=True, outbound_calls=True, auto_resolve_best_voices=False, contactflow_logs=True, contact_lens=True, early_media=False, use_custom_tts_voices=False ), identity_management_type="CONNECT_MANAGED", instance_alias="amazon-connect-instance" )

关键配置项的含义与取值:

参数本示例取值说明
inbound_calls/outbound_callsTrue启用/禁用呼入、呼出通话能力,均开启
auto_resolve_best_voicesFalse是否自动选择 Amazon Polly 的最佳语音,关闭以保留手工指定空间
contactflow_logsTrue开启联系流(Contact Flow)日志,便于排障与审计
contact_lensTrue开启 Amazon Connect Contact Lens(通话分析)能力
early_mediaFalse是否启用 Early Media(通话建立前的媒体流)
use_custom_tts_voicesFalse是否使用自定义 TTS 语音
identity_management_typeCONNECT_MANAGED身份管理方式,示例选用 Connect 托管(无需依赖外部 IdP)
instance_aliasamazon-connect-instance实例别名,作为访问地址与标识

值得注意:这里使用的是低层级 L1 构造CfnInstance,说明 AWS CDK 中aws_connect模块对 Connect 的支持以 CloudFormation 原生资源为基准,需要在代码中显式给出每个属性值。

2.2 通话录音与转录的存储链路(L40-L89)

Amazon Connect 要求将通话录音和转录写入 S3,并支持通过**存储配置(Instance Storage Config)**把存储位置关联到实例。示例为此创建了三类对象:

(1)KMS 密钥(L40-L44)——录音与转录使用独立的客户管理密钥:

call_recordings_key = kms.Key(self, "CallRecordingsKey", enable_key_rotation=True, pending_window=Duration.days(30), alias="amazon-connect-call-recordings-key" )

开启密钥轮换(enable_key_rotation=True)、删除等待窗口设为 30 天(pending_window),符合密钥管理最佳实践。

(2)S3 存储桶(L47-L73)——录音桶与访问日志桶成对出现,安全基线相当严格:

call_recordings_bucket = s3.Bucket(self, "CallRecordingsBucket", block_public_access=s3.BlockPublicAccess.BLOCK_ALL, encryption=s3.BucketEncryption.KMS, encryption_key=call_recordings_key, removal_policy=RemovalPolicy.RETAIN, enforce_ssl=True, versioned=True, server_access_logs_bucket=call_recordings_access_logs_bucket, bucket_name="amazon-connect-call-recordings-bucket", lifecycle_rules=[ s3.LifecycleRule( enabled=True, expiration=Duration.days(365*2) ) ] )
  • block_public_access=BLOCK_ALL:彻底阻断公有访问;
  • encryption=KMS+ 指定encryption_key:强制使用客户管理密钥加密;
  • enforce_ssl=True:仅允许 HTTPS 访问;
  • versioned=True:开启版本控制,防误删覆盖;
  • removal_policy=RemovalPolicy.RETAIN:销毁堆栈时保留桶,避免误删珍贵录音数据;
  • lifecycle_rules:录音桶设置 2 年(365×2 天)过期策略,兼顾合规留存与成本控制;
  • server_access_logs_bucket:将访问日志写入独立日志桶,便于审计。

(3)存储配置关联(L76-L89)——通过CfnInstanceStorageConfig把桶注册到实例,并明确资源类型为CALL_RECORDINGS:

call_recordings_storage_config = connect.CfnInstanceStorageConfig(self, "CallRecordingsStorageConfig", instance_arn=amazon_connect_instance.attr_arn, resource_type="CALL_RECORDINGS", storage_type="S3", s3_config=connect.CfnInstanceStorageConfig.S3ConfigProperty( bucket_name=call_recordings_bucket.bucket_name, bucket_prefix="recordings", encryption_config=connect.CfnInstanceStorageConfig.EncryptionConfigProperty( encryption_type="KMS", key_id=call_recordings_key.key_arn ) ) )

bucket_prefix="recordings"让录音文件统一落在recordings/前缀下,与后续 CTR 的ctr/、报表的reports/前缀形成清晰隔离。

2.3 联系人追踪记录(CTR)的 Firehose 传输流(L92-L150)

联系人追踪记录是每次通话的元数据事件流。示例采用Kinesis Firehose → S3的经典链路,包含三个组成部分:

(1)IAM 角色(L92-L117)——角色信任firehose.amazonaws.com,并授予目标桶的 S3 读写与 KMS 加解密权限:

ctr_delivery_stream_role = iam.Role(self, "CtrDeliveryStreamRole", assumed_by=iam.ServicePrincipal("firehose.amazonaws.com"), role_name="amazon-connect-ctr-delivery-stream-role" ) ctr_delivery_stream_role.add_to_policy(iam.PolicyStatement( actions=[ "s3:PutObject", "s3:GetObject", "s3:ListBucket", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload", "s3:GetBucketLocation", "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt", "kms:GenerateDataKey", "kms:DescribeKey", "kms:CreateGrant" ], resources=[call_recordings_bucket.bucket_arn, call_recordings_key.key_arn] ))

这里把 S3 操作与 KMS 操作权限按最小权限原则精确列出,仅限录音桶与对应密钥。

(2)Firehose 传输流(L120-L140)——DirectPut类型(由 Connect 直接推送),启用客户管理 CMK 加密,缓冲窗口 60 秒:

ctr_delivery_stream = firehose.CfnDeliveryStream(self, "CtrDeliveryStream", delivery_stream_name="amazon-connect-ctr-delivery-stream", delivery_stream_type="DirectPut", delivery_stream_encryption_configuration_input=firehose.CfnDeliveryStream.DeliveryStreamEncryptionConfigurationInputProperty( key_type="CUSTOMER_MANAGED_CMK", key_arn=call_recordings_key.key_arn ), s3_destination_configuration=firehose.CfnDeliveryStream.S3DestinationConfigurationProperty( bucket_arn=call_recordings_bucket.bucket_arn, prefix="ctr/", role_arn=ctr_delivery_stream_role.role_arn, buffering_hints=firehose.CfnDeliveryStream.BufferingHintsProperty( interval_in_seconds=60 ), encryption_configuration=firehose.CfnDeliveryStream.EncryptionConfigurationProperty( kms_encryption_config=firehose.CfnDeliveryStream.KMSEncryptionConfigProperty( awskms_key_arn=call_recordings_key.key_arn ) ) ) )
  • prefix="ctr/":CTR 数据写入ctr/前缀;
  • buffering_hints.interval_in_seconds=60:缓冲 60 秒后落盘,可在实时性与文件数量间取得平衡。

(3)存储配置关联(L143-L150)——资源类型为CONTACT_TRACE_RECORDS、存储类型为KINESIS_FIREHOSE:

ctr_storage_config = connect.CfnInstanceStorageConfig(self, "CtrStorageConfig", instance_arn=amazon_connect_instance.attr_arn, resource_type="CONTACT_TRACE_RECORDS", storage_type="KINESIS_FIREHOSE", kinesis_firehose_config=connect.CfnInstanceStorageConfig.KinesisFirehoseConfigProperty( firehose_arn=ctr_delivery_stream.attr_arn ) )

2.4 定时报表的独立存储链路(L153-L196)

定时报表(SCHEDULED_REPORTS)复用与录音几乎相同的模式,但使用独立的一套 KMS 密钥与存储桶(amazon-connect-scheduled-reports-key、amazon-connect-scheduled-reports-bucket),避免报表与敏感录音数据混存。其配置要点:

  • 报表桶同样BLOCK_ALL公有访问、KMS 加密、enforce_ssl=True、versioned=True、RemovalPolicy.RETAIN,访问日志写入独立日志桶(L161-L180);
  • 存储配置关联时resource_type="SCHEDULED_REPORTS"、storage_type="S3",bucket_prefix="reports"(L183-L196)。

由此,三类数据在 S3 中形成三个互不干扰的前缀:recordings/(录音)、ctr/(追踪记录)、reports/(报表)。

2.5 分配电话号码(L199-L204)

phone_number = connect.CfnPhoneNumber(self, "PhoneNumber", target_arn=amazon_connect_instance.attr_arn, country_code="GB", description="Inbound Phone Number", type="DID" )
  • country_code="GB":申请英国地区的号码(按业务需要可改为其他可用国家代码);
  • type="DID":直拨号码(Direct Inward Dialing);
  • target_arn:将该号码直接绑定到上面创建的实例。

2.6 配置营业时间(L207-L267)

营业时间决定了路由策略中哪些时段允许联系中心接入,示例配置了周一至周五(MONDAY~FRIDAY)9:00–17:00 的 "Main" 时段,时区为Europe/London:

hours_of_operation = connect.CfnHoursOfOperation(self, "HoursOfOperation", config=[ connect.CfnHoursOfOperation.HoursOfOperationConfigProperty( day="MONDAY", start_time=connect.CfnHoursOfOperation.HoursOfOperationTimeSliceProperty( hours=9, minutes=0 ), end_time=connect.CfnHoursOfOperation.HoursOfOperationTimeSliceProperty( hours=17, minutes=0 ) ), # ... 依次为 TUESDAY / WEDNESDAY / THURSDAY / FRIDAY,时间段相同 ], instance_arn=amazon_connect_instance.attr_arn, name="Main", time_zone="Europe/London", description="Business Hours of Operation", )

config是数组类型,可以按需扩展周六、周日或多时段配置;每个时段用HoursOfOperationTimeSliceProperty(hours, minutes)描述起止时间。

三、内置安全审计:CDK Nag 校验

堆栈构造函数第一行(L22)就挂载了安全合规审计:

Aspects.of(self).add(AwsSolutionsChecks())

cdk-nag(requirements.txt 中声明cdk-nag>=2.28.0,<3.0.0)会在cdk synth时对堆栈做 AWS Solutions 最佳实践检查,例如密钥是否开启轮换、桶是否允许公有访问、是否启用 SSL 强制等。本示例中 KMS 轮换、BLOCK_ALL、enforce_ssl、versioned等配置都与该检查的诉求一致。若在合成阶段出现 nag 告警,可直接定位到具体资源并对照规则修正。

四、本地环境准备与运行步骤

该示例遵循标准的 Python CDK 工程布局:入口 app.py、堆栈代码位于 amazon_connect/ 包内,cdk.json指定执行方式为python3 app.py(见 cdk.json)。

4.1 创建并激活虚拟环境

项目初始化会尝试自动创建.venv虚拟环境(要求环境中存在python3,Windows 下为python,且带有venv模块)。若自动创建失败,可手动创建:

$ python3 -m venv .venv

激活虚拟环境(MacOS / Linux):

$ source .venv/bin/activate

Windows 平台使用:

% .venv\Scripts\activate.bat

4.2 安装依赖

$ pip install -r requirements.txt

依赖声明于 requirements.txt,核心三件套为:

  • aws-cdk-lib>=2.262.0,<3.0.0:CDK 核心库;
  • constructs>=10.5.0,<11.0.0:构造基类库;
  • cdk-nag>=2.28.0,<3.0.0:合规审计库。

如需增加其他 CDK 库,可将其添加到setup.py的依赖列表后重新执行pip install -r requirements.txt。

4.3 合成 CloudFormation 模板

$ cdk synth

该命令会在本地合成完整 CloudFormation 模板(同时触发 cdk-nag 审计)。cdk.json中还配置了watch模式,默认排除README.md、cdk*.json、requirements*.txt、tests等非基础设施文件,便于开发时增量观测。

五、部署与销毁

5.1 部署全部资源

$ cdk deploy --all

--all会部署应用中所有堆栈(本示例只有一个AmazonConnectStack)。部署完成后,可在 AWS 控制台的 Amazon Connect 服务页看到新实例,并验证电话号码与营业时间已就位。

5.2 销毁部署

$ cdk destroy --all

需要特别提醒:由于录音桶、报表桶及日志桶均设置了RemovalPolicy.RETAIN,销毁堆栈时这些 S3 桶与 KMS 密钥会被保留,不会随堆栈删除,以保护历史数据。若确认数据无需保留,需要在控制台或通过其他方式手动清理,而堆栈销毁本身不会执行rm类操作。

六、延伸与注意事项

  • 实例创建耗时较长:Amazon Connect 实例预置并非即时完成,cdk deploy可能等待实例状态变为 Active 后才继续后续资源关联,部署时需要耐心观察事件输出。
  • 实例别名全局唯一性:instance_alias="amazon-connect-instance"在 AWS 区域内需要唯一,若被占用可修改别名后重试。
  • 号码可用性:country_code="GB"与type="DID"的组合取决于目标区域的号码库存,业务上若需更换地区,直接调整这两个参数即可。
  • 成本考量:录音 2 年过期策略、versioned版本保留等都会影响存储费用;pending_window=30的密钥删除窗口则用于防止误删。
  • 安全基线可复用:BLOCK_ALL+ KMS 加密 +enforce_ssl+ 独立访问日志桶的组合,可作为任何涉及敏感通话数据的 CDK 工程的模板参考;配合AwsSolutionsChecks,可以在代码合入前就拦截不合规配置。

七、小结

本文以 python/amazon-connect/README.md 为主线,结合 amazon_connect_stack.py 的完整源码,完整还原了用 AWS CDK(Python)从零预置 Amazon Connect 联络中心的方案:实例创建 → 录音/转录 S3 存储 → CTR Firehose 链路 → 定时报表存储 → 电话号码 → 营业时间,并覆盖了虚拟环境搭建、依赖安装、cdk synth、cdk deploy --all与cdk destroy --all的完整操作闭环。对希望把联络中心基础设施纳入代码管线的团队而言,这是一个可以直接落地、开箱即用的起点。

【免费下载链接】aws-cdk-examples

Example projects using the AWS CDK

项目地址:https://gitcode.com/gh_mirrors/aw/aws-cdk-examples
点击查看免费下载
上一篇:PlayerBase源码架构深度解析:理解Android播放器框架设计思想
下一篇:终极Konva.js部署指南:从开发到生产的完整工作流

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询