Terraform批量创建EC2偶现‘Still creating’直至超时求助
Terraform并行创建EC2随机超时的解决办法
问题排查与解决思路
1. AWS API限流导致请求延迟
23台m5.12xlarge实例并行创建,极易触发EC2的API请求配额限制,部分请求被限流后延迟处理,最终超时。
- 检查区域EC2配额:查看当前区域
Running On-Demand m5.12xlarge的限额,若接近上限,直接在AWS控制台提交配额提升申请。 - 降低Terraform并行度:限制并发创建数量,比如执行命令时添加参数
terraform apply -parallelism=10,或者在配置文件中固定设置:
terraform { parallelism = 10 }
2. User Data脚本阻塞实例初始化
Shell脚本如果执行时间过长、卡住,会导致cloud-init无法完成初始化,Terraform会一直等待实例进入就绪状态,最终超时。
- 优化脚本耗时操作:给大文件下载、无超时的命令添加超时限制,比如
timeout 300s wget https://example.com/large-file.tar.gz。 - 后台执行长任务:将非紧急初始化操作放到后台,避免阻塞cloud-init流程:
nohup /path/to/long-running-script.sh > /var/log/init.log 2>&1 &
- 缩短Terraform等待时长:如果确认脚本不影响实例可用性,可调整等待超时时间:
resource "aws_instance" "genomic-etl-ec2" { # 保留原有配置 wait_for_guest_timeout = "10m" }
3. 大规格实例资源不足
m5.12xlarge属于大规格实例,部分可用区可能临时资源紧张,导致实例创建被延迟。
- 切换可用区:将子网替换为同区域的其他可用区,或配置多个子网让Terraform自动轮选:
variable "subnet_ids" { type = list(string) default = ["subnet-xxx", "subnet-yyy"] } resource "aws_instance" "genomic-etl-ec2" { # 保留原有配置 subnet_id = element(var.subnet_ids, count.index % length(var.subnet_ids)) }
- 改用Spot实例:若业务允许,Spot实例资源池更充足,创建成功率更高(需注意处理实例中断场景)。
4. 移除不必要的local-exec sleep
配置中的local-exec "sleep 40"完全冗余,23台实例并行时会占用Jenkins节点资源,间接影响Terraform与AWS的通信,直接删除该provisioner即可。
5. 修复RequestExpired通信超时
该错误源于Terraform与AWS API的通信超时,可通过以下配置调整:
- 延长API请求超时:
provider "aws" { region = "us-east-1" request_timeout = "120s" }
- 增加重试次数:让Terraform对临时错误进行多次重试:
provider "aws" { region = "us-east-1" retry_max = 5 retry_mode = "adaptive" }
临时排查技巧
- 查看CloudTrail日志:搜索失败实例的创建请求,确认是否存在
InsufficientInstanceCapacity或Throttling等具体错误。 - 检查EC2系统日志:卡在创建状态的实例,可在AWS控制台查看系统日志,定位cloud-init的执行断点。
- 单实例测试:手动用Terraform创建1台实例并运行相同user_data,排除脚本本身的问题。
内容的提问来源于stack exchange,提问作者sjn44
相关产品推荐
相关产品推荐

