使用AWS-CDK创建AWS Cloud9实例失败,求技术解决方案
我认可AWS CDK的设计理念,但用它创建Cloud9环境时一直失败。每次运行代码,AWS控制台都会弹出“Error while creating Cloud9”错误提示,本地终端显示“CREATE_FAILED”。我猜测问题出在EC2和Cloud9的连接上,但不知道具体该怎么操作。有没有人成功用CDK创建过Cloud9环境?求建议。
AWS控制台错误信息

VSCode终端错误信息

向下滚动终端可见最终报错:
Stack Deployments Failed: Error: The stack named MjwFirstCdkStack failed creation,
it may need to be manually deleted from the AWS console: ROLLBACK_COMPLETE: Cannot
create the AWS Cloud9 environment. There was a problem connecting to the environment.
使用的代码
import * as cdk from "aws-cdk-lib"; import * as ec2 from "aws-cdk-lib/aws-ec2"; import * as cloud9 from "aws-cdk-lib/aws-cloud9"; import { Construct } from "constructs"; export class MjwFirstCdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // 创建VPC const vpc = new ec2.Vpc(this, "my-vpc-id", { natGateways: 1, maxAzs: 2, ipAddresses: ec2.IpAddresses.cidr("10.0.0.0/16"), subnetConfiguration: [ { name: "private-subnet-1", subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, cidrMask: 24, }, { name: "public-subnet-1", subnetType: ec2.SubnetType.PUBLIC, cidrMask: 24, }, ], }); // 创建Cloud9环境 const myCloud9Environment = new cloud9.CfnEnvironmentEC2( this, "MyCloud9Environment", { name: "MyCloud9EnvironmentName", instanceType: "t2.micro", automaticStopTimeMinutes: 60, subnetId: vpc.privateSubnets[0].subnetId, } ); } }
解决建议
1. 先验证子网类型问题
你当前把Cloud9实例部署在PRIVATE_WITH_EGRESS子网,这类子网依赖NAT网关访问外网,但如果NAT配置或子网流量限制有问题,会导致Cloud9实例无法和AWS服务建立连接。
快速测试:修改代码中subnetId为vpc.publicSubnets[0].subnetId,将实例放到公有子网重新部署。如果成功,说明问题出在私有子网的网络配置上。
2. 私有子网下的安全组配置
如果要保留私有子网部署,需要给Cloud9实例配置允许双向连接的安全组:
// 创建Cloud9专属安全组 const cloud9Sg = new ec2.SecurityGroup(this, "Cloud9Sg", { vpc: vpc, allowAllOutbound: true, description: "Allow Cloud9 service access" }); // 允许Cloud9服务的SSH入站流量(通过AWS服务前缀列表,避免开放所有IP) cloud9Sg.addIngressRule( ec2.Peer.prefixList(`com.amazonaws.${cdk.Stack.of(this).region}.cloud9`), ec2.Port.tcp(22), "Cloud9 service SSH access" ); // 将安全组关联到Cloud9实例 myCloud9Environment.addPropertyOverride("securityGroupId", cloud9Sg.securityGroupId);
3. 检查IAM权限
确保CDK部署使用的角色拥有足够权限,至少包含AWSCloud9Administrator策略,或自定义涵盖cloud9:*、ec2:CreateInstance、ec2:ModifyInstanceAttribute等操作的权限。
4. 元数据服务访问
Cloud9实例需要访问EC2元数据服务(169.254.169.254),确保子网的网络ACL和安全组没有禁止这个IP的HTTP(80)流量。
5. 实例类型兼容性
部分AWS区域已不再支持t2.micro,可以尝试换成t3.micro实例类型重新部署。
内容的提问来源于stack exchange,提问作者mjwebson

