亚马逊云高权重账号 AWS CDK 实战教程:通过代码定义和部署云端资源的完整操作指南
用户搜索“AWS CDK 实战:通过代码定义和部署云端资源”,通常不是为了看概念,而是已经准备把基础设施从手工点控制台切换到代码管理,或者已经写了 CDK 代码,却在部署时遇到权限、网络、实例连接、数据库访问、证书绑定、堆栈删除失败等问题。最常见的目标包括:用代码一次性创建 VPC、子网、安全组、EC2、RDS、S3;把环境分成 dev、test、prod;减少手工配置差异;在更新资源时避免误删;以及在部署后能真正连上服务器和数据库。
下面的内容不做概念铺垫,直接围绕“怎么做、哪里容易错、怎么排查”展开。
一、开始前先确认:你真正需要准备什么
在 AWS CDK 落地前,最容易忽略的是权限和本地环境。很多“部署失败”并不是代码问题,而是账号、Region 或 Bootstrap 没准备好。
1. 账号与权限要求
| 项目 | 建议要求 | 常见问题 |
| AWS 账号 | 可访问目标账号与目标 Region | 切错账号,资源部署到错误环境 |
| IAM 权限 | 至少能创建 CloudFormation、IAM、EC2、RDS、VPC、S3、SSM 日志相关资源 | 部署到一半报 AccessDenied |
| CLI 配置 | aws configure 配置好 Access Key、Secret、Region | CDK 使用了默认 profile,和预期账号不一致 |
| Bootstrap 权限 | 允许执行 cdk bootstrap | 首次部署无法上传资产 |
2. 本地环境建议
建议使用 Node.js LTS 版本,并安装 AWS CLI 与 CDK CLI。
| 工具 | 建议版本 | 检查命令 |
| Node.js | 18 或 20 LTS | node -v |
| npm | 与 Node 匹配 | npm -v |
| AWS CLI | v2 | aws --version |
| AWS CDK CLI | 最新稳定版 | cdk --version |
安装命令示例:
<code>npm install -g aws-cdk</code>
<code>aws configure</code>
如果你有多个 AWS 账号,建议从一开始就使用 profile,例如:
<code>aws configure --profile devops-prod</code>
后续所有命令都显式带上 profile,避免资源部署错账号。
二、创建 CDK 项目时,先把目录结构和环境分层定好
很多人一开始直接把所有资源写进一个 stack,后期一改就牵一发而动全身。更稳妥的做法是至少区分网络层、计算层、数据库层。
1. 初始化项目
在空目录执行:
<code>mkdir aws-cdk-practice && cd aws-cdk-practice</code>
<code>cdk init app --language typescript</code>
安装常用依赖:
<code>npm install aws-cdk-lib constructs</code>
2. 第一次部署前必须执行 Bootstrap
亚马逊云高权重账号 这是用户最容易跳过的一步。没有 Bootstrap,涉及资产上传、Docker 镜像、跨账号部署时会直接失败。
命令示例:
<code>cdk bootstrap aws://123456789012/ap-southeast-1 --profile devops-prod</code>
参数填写建议如下:
| 参数 | 填写方式 | 注意事项 |
| 账号 ID | 目标 AWS Account ID | 不要用错测试账号 |
| Region | 如 ap-southeast-1、ap-northeast-1 | Bootstrap 需要针对每个 Region 执行 |
| profile | 本地 CLI profile 名称 | 避免默认凭证误用 |
3. Region 和可用区怎么选
如果你的应用面向中国大陆以外用户,常用选择是新加坡、东京、法兰克福、弗吉尼亚。不要先看价格,先看访问延迟、数据库合规要求、备份位置和后续是否要挂 CDN/证书。
| 场景 | 推荐 Region | 原因 |
| 东南亚网站 | ap-southeast-1 | 延迟较低,面向新马印用户常见 |
| 日韩业务 | ap-northeast-1 | 对日本访问友好 |
| 欧美 SaaS | eu-central-1 或 us-east-1 | 根据主要客户分布选 |
| 跨区域容灾 | 主 Region + 异地备份 Region | 避免单 Region 故障 |
三、实操:用 CDK 创建 VPC、安全组、EC2 和 RDS
下面给一个更接近实际业务的结构:1 个 VPC,2 个公有子网,2 个私有子网,1 台 Linux EC2,1 个 MySQL RDS,EC2 通过安全组访问数据库,数据库不开放公网。
步骤1:创建基础网络
在 lib 目录下编辑 stack 文件,例如 lib/app-stack.ts。
先定义 VPC:
<code>const vpc = new ec2.Vpc(this, 'AppVpc', { maxAzs: 2, natGateways: 1, subnetConfiguration: [ { name: 'public', subnetType: ec2.SubnetType.PUBLIC, cidrMask: 24 }, { name: 'private', subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, cidrMask: 24 } ] });</code>
这里最关键的不是代码本身,而是参数选择:
| 参数 | 建议值 | 适用场景 |
| maxAzs | 2 | 兼顾可用性与成本 |
| natGateways | 1 | 测试和中小业务先控成本 |
| 公有子网 | 保留 | 给负载均衡、跳板机或公网 EC2 用 |
| 私有子网 | 保留 | 数据库、内部服务部署位置 |
容易出错的点:
- 把 RDS 放到公有子网,导致数据库暴露公网。
- NAT 网关没开,私有子网实例无法更新软件包。
- 只建一个可用区,后续高可用扩展困难。
亚马逊云高权重账号 步骤2:创建安全组并开放必要端口
先给 EC2 建一个安全组:
<code>const ec2Sg = new ec2.SecurityGroup(this, 'Ec2Sg', { vpc, allowAllOutbound: true }); ec2Sg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22), 'SSH'); ec2Sg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80), 'HTTP'); ec2Sg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(443), 'HTTPS');</code>
再给 RDS 建安全组,只允许 EC2 安全组访问 3306:
<code>const dbSg = new ec2.SecurityGroup(this, 'DbSg', { vpc, allowAllOutbound: true }); dbSg.addIngressRule(ec2Sg, ec2.Port.tcp(3306), 'MySQL from EC2');</code>
注意:
- 不要直接把 3306 对 0.0.0.0/0 放开。
- 如果 SSH 只供办公网络使用,把 22 端口限制到固定公网 IP 段。
- Linux 系统内还要检查 firewalld 或 iptables,云安全组放行不代表系统防火墙也放行。
步骤3:创建 EC2 实例
实例示例:
<code>const instance = new ec2.Instance(this, 'WebServer', { vpc, vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC }, instanceType: new ec2.InstanceType('t3.small'), machineImage: ec2.MachineImage.latestAmazonLinux2023(), securityGroup: ec2Sg, keyName: 'your-keypair-name' });</code>
配置选择建议:
| 场景 | CPU/内存建议 | 磁盘建议 |
| 个人测试 | t3.micro 或 t3.small | 30GB gp3 |
| 中小网站 | t3.small 或 t3.medium | 40-80GB gp3 |
| Java/Node 应用 | t3.medium 起 | 60GB gp3,关注内存 |
| 高并发 API | c6i.large 起 | 按日志量规划 |
如果你需要 Windows 服务器,可以把 machineImage 替换成 Windows AMI,并额外开放 3389 端口用于 RDP。Windows 场景下,初始管理员密码通常需要通过密钥解密获取,不建议把 3389 暴露给全网。
步骤4:创建 MySQL RDS
示例:
<code>const db = new rds.DatabaseInstance(this, 'AppMysql', { engine: rds.DatabaseInstanceEngine.mysql({ version: rds.MysqlEngineVersion.VER_8_0_36 }), vpc, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO), credentials: rds.Credentials.fromGeneratedSecret('dbadmin'), allocatedStorage: 20, maxAllocatedStorage: 100, securityGroups: [dbSg], multiAz: false, publiclyAccessible: false, backupRetention: cdk.Duration.days(7), deletionProtection: false, databaseName: 'appdb' });</code>
这里有几个高频决策点:
| 参数 | 测试环境建议 | 生产建议 |
| 实例规格 | db.t3.micro | 至少 db.t3.small 或更高 |
| 存储 | 20GB 起 | 按增长量预留,并启用自动扩容 |
| Multi-AZ | 关闭 | 重要业务建议开启 |
| 公网访问 | 关闭 | 默认关闭 |
| 备份保留 | 3-7 天 | 7-30 天 |
如果数据库连接失败,优先检查三件事:RDS 所在子网是否可达、3306 安全组是否只允许了正确来源、应用是否使用了错误的 endpoint 或凭据。
四、部署、验证与连接:这是最容易“代码通过但服务不可用”的阶段
1. 部署命令
<code>cdk synth</code>
<code>cdk diff --profile devops-prod</code>
<code>cdk deploy --profile devops-prod</code>
建议每次上线前先执行 cdk diff,特别是在生产环境,避免误删数据库、安全组或 EIP。
2. SSH 连接 Linux 服务器
获取实例公网 IP 后连接:
<code>ssh -i your-key.pem ec2-user@your_public_ip</code>
如果是 Ubuntu AMI,用户名通常是 ubuntu,而不是 ec2-user。
连接失败排查顺序:
- 安全组是否开放 22。
- 实例是否绑定公网 IP。
- 子网路由表是否指向 Internet Gateway。
- 亚马逊云高权重账号 本地办公网络是否屏蔽了 22 端口。
- 密钥权限是否过宽,需执行 chmod 400 your-key.pem。
3. RDP 连接 Windows 服务器
如果部署的是 Windows 实例,确保安全组放行 3389,并在控制台获取 Administrator 密码后使用远程桌面工具连接。若长时间黑屏或认证失败,通常是实例初始化未完成、NACL 拦截或本地网络限制导致。
4. 数据库连接测试
在 EC2 内部测试 MySQL 连通性:
<code>mysql -h your-rds-endpoint -u dbadmin -p</code>
如果报 timeout,多半是网络或安全组问题;如果报 Access denied,则是用户名密码、授权主机或数据库参数问题。
五、网站与应用场景:DNS、证书、HTTPS 怎么配更稳
如果你的目标不只是建一台机器,而是部署网站或 API,CDK 通常还会继续管理域名解析、证书和负载均衡。
1. DNS 解析
域名如果在 Route 53,可直接用 CDK 创建 A 记录或别名记录;如果在第三方 DNS 平台,则在部署后手工填入负载均衡或 EIP 地址。
2. SSL 证书配置
亚马逊云高权重账号 证书建议使用 ACM,在负载均衡或 CloudFront 层终止 HTTPS,而不是直接在 EC2 手工传证书。这样后续续期更省事。
3. HTTPS 部署常见问题
| 问题 | 常见原因 | 处理方式 |
| 证书签发失败 | DNS 验证记录未生效 | 检查 CNAME 是否已解析 |
| 浏览器提示不安全 | 域名与证书不匹配 | 确认证书覆盖主域名和子域名 |
| 80 可访问,443 不通 | 安全组未放行 443 | 开放 443 并检查监听器配置 |
| HTTPS 跳转循环 | 反向代理或应用层重复跳转 | 统一在 ALB 或 Nginx 做跳转逻辑 |
六、不同用户怎么选配置,避免一开始就配错
亚马逊云高权重账号 1. 个人开发者
优先控制成本。建议 1 个 VPC、1 台 t3.micro 或 t3.small Linux 实例、1 个小规格 RDS 或直接先用容器内 MySQL 测试、S3 存日志和静态文件。数据库先不开 Multi-AZ,备份保留 3-7 天。
2. 企业用户
建议把网络、应用、数据库拆分成多个 stack;RDS 开启自动备份;关键资源加 deletionProtection;EC2 不直接暴露公网时,通过 ALB 或跳板机访问;安全组最小权限;参数通过 SSM Parameter Store 或 Secrets Manager 管理。
3. 跨境业务
先测目标市场网络延迟,再决定 Region。静态资源建议挂 CDN,源站放新加坡或东京较常见;数据库不要跨 Region 直连业务主库;如果涉及多地访问,可用只读副本或缓存分流。
4. 网站应用
推荐 Linux + Nginx + Node/PHP/Java,开放 80/443,SSH 限制办公出口 IP。日志单独挂载目录,定期快照;高峰期观察 CPU、内存、磁盘 IO,再决定是否横向扩容。
5. 数据库业务
亚马逊云高权重账号 如果数据库是核心,优先把预算留给 RDS 而不是 EC2。关注连接数、慢查询、IOPS、备份窗口和参数组。高并发场景建议配连接池,避免应用端把数据库打满。
亚马逊云高权重账号 七、部署失败和资源异常时,按这个顺序排查最省时间
1. cdk deploy 报权限不足
先看报错里具体拒绝的是哪类服务,例如 iam:CreateRole、ec2:CreateSecurityGroup、cloudformation:CreateChangeSet。很多企业账号开启了权限边界或 SCP,仅给 EC2 权限还不够,因为 CDK 底层依赖 CloudFormation、IAM、S3 资产桶等服务。
2. Bootstrap 已做,仍提示无法发布资产
通常是 Bootstrap 做在别的 Region、别的账号,或者当前 profile 不一致。执行 aws sts get-caller-identity 确认当前身份,再核对 cdk.json 与 CLI profile。
3. 堆栈删除失败
常见原因是 S3 桶非空、RDS 开启删除保护、ENI 残留、CloudWatch Log Group 被依赖。处理时先解除依赖,再执行 destroy。生产环境不要直接 destroy,先确认备份。
4. EC2 能创建但无法访问公网
检查四层:实例是否有公网 IP、子网路由表是否关联 Internet Gateway、安全组/NACL 是否放行、系统内部防火墙是否阻断。
5. RDS 创建成功但应用连不上
先从同 VPC 的 EC2 上测试 telnet 或 nc 到 3306;如果端口不通,先查安全组和子网;端口通但认证失败,再查账号密码、数据库名、字符集、参数组。
八、上线后必须做的优化,不然后面维护成本会明显上升
1. 安全优化
- SSH 和 RDP 限制来源 IP,不对全网开放。
- 数据库保持私网访问,不开放公网 endpoint。
- 凭据放 Secrets Manager,不写死在代码或 user data。
- 关键资源开启 CloudTrail、VPC Flow Logs 或最少基础审计日志。
2. 性能优化
- EC2 使用 gp3 磁盘,通常比默认配置更可控。
- RDS 关注慢查询日志、连接数、CPU 与 FreeableMemory。
- 网站前端静态资源走 CDN,减少源站带宽消耗。
- 高并发接口优先做缓存,不要先盲目升级数据库规格。
3. 成本优化
- 测试环境实例设定自动停机策略。
- natGateways 数量不要超出实际需求。
- 预留实例或 Savings Plans 适合长期稳定负载。
- 定期清理未使用的 EBS、快照、EIP 和旧版本 AMI。
4. 稳定性优化
- 生产环境把网络、计算、数据库拆成多个 stack,降低变更影响范围。
- 使用 cdk diff 审核变更。
- 亚马逊云高权重账号 重要数据库开启自动备份与快照策略。
- 部署前在测试账号先验证一次,尤其是 IAM 和网络策略变更。
如果你的目标是把云资源真正纳入版本管理,AWS CDK 的关键不在于“把资源写成代码”这句话,而在于从第一天开始就把账号、Region、权限、网络边界、连接方式、备份和删除策略定清楚。只要这几个基础动作做对,后面的实例创建、数据库部署、HTTPS 上线和环境复制都会顺很多。

如果需要更深入咨询了解可以联系全球代理上TG: @cloudcup 他们在云平台领域有更专业的知识和建议,他们有国际阿里云,国际腾讯云,国际华为云,aws亚马逊,谷歌云一级代理的渠道,微软云开户充值。oss防风控上传加密系统。客服1V1服务,支持免实名、免备案、免绑卡。开通即享专属VIP优惠、充值秒到账、官网下单享双重售后支持。