如何编写Terraform脚本部署EC2并配置AD域实现实例自动加域?
需求可行性结论
该需求不能仅通过Terraform原生功能直接实现,但完全可以结合EC2的user data脚本完成全流程自动化,无需额外手动操作。
实现逻辑说明
- Terraform本身的职责是云基础设施编排,仅能完成EC2实例、VPC、安全组等云资源的创建配置,没有内置Windows AD域配置、实例加域这类操作系统内部的业务配置能力。
- 你可以分别为两个EC2实例注入PowerShell格式的user data脚本,完成AD域初始化和客户端加域操作:
- 预装AD服务的实例user data:完成AD域林初始化、域名配置、防火墙端口放行、DNS配置
- 客户端实例user data:先配置DNS指向AD实例的私有IP,再执行加域命令并自动重启生效
代码参考示例
# AD服务端实例 resource "aws_instance" "ad_server" { ami = "你的AD预装AMI ID" instance_type = "t3.large" vpc_security_group_ids = [aws_security_group.ad_sg.id] user_data = base64encode(<<EOF <powershell> # 初始化AD域林 Install-WindowsFeature AD-Domain-Services -IncludeManagementTools $safePass = ConvertTo-SecureString "设置的目录服务还原密码" -AsPlainText -Force Install-ADDSForest -DomainName "corp.example.com" -SafeModeAdministratorPassword $safePass -Force # 放行AD所需端口 New-NetFirewallRule -DisplayName "AD TCP Port Allow" -Direction Inbound -Protocol TCP -LocalPort 53,88,135,139,389,445,464,636 -Action Allow New-NetFirewallRule -DisplayName "AD UDP Port Allow" -Direction Inbound -Protocol UDP -LocalPort 53,88,123,137,138,389,464 -Action Allow </powershell> EOF ) } # 客户端实例 resource "aws_instance" "ad_client" { ami = "你的客户端AMI ID" instance_type = "t3.medium" vpc_security_group_ids = [aws_security_group.client_sg.id] depends_on = [aws_instance.ad_server] user_data = base64encode(<<EOF <powershell> # 配置DNS指向AD服务端私有IP Set-DnsClientServerAddress -InterfaceAlias Ethernet -ServerAddresses ("${aws_instance.ad_server.private_ip}") # 执行加域操作 $domain = "corp.example.com" $domainPass = ConvertTo-SecureString "域管理员账号密码" -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential("$domain\Administrator", $domainPass) Add-Computer -DomainName $domain -Credential $cred -Force -Restart </powershell> EOF ) }
注意事项:
- 两个实例需要放在同一个VPC内,安全组放通AD所需的全部TCP/UDP端口
- 敏感密码不要明文写在代码中,建议使用AWS Secrets Manager或者Terraform敏感变量存储
- 建议给AD服务端配置固定私有IP,避免实例重启后IP变化导致客户端DNS解析失败
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

