Provider认证、资源依赖声明、状态文件协调是跑通Terraform创建云服务器的三关;必须执行terraform init和plan,Provider需正确配置features{}(Azure)或region(AWS),且密钥、网络、安全组等依赖须显式声明。

直接写 resource "aws_instance" 或 resource "azurerm_linux_virtual_machine" 就能创建云服务器,但实际跑通要过三关:Provider 认证配对、资源依赖显式声明、状态文件不冲突。硬写资源块却跳过 terraform init 和 terraform plan,90% 情况下会卡在认证失败或网络资源未就绪。
Provider 配置必须带 features {}(尤其 Azure)
AzureRM Provider 从 v3.0 起强制要求 features 块,否则 terraform init 会报错:Missing required configuration: features。AWS Provider 虽不强制,但省略 region 会导致后续所有资源创建失败,错误信息是 No valid credential sources found 或更隐蔽的 InvalidParameter: The parameter 'Region' is required。
正确写法示例(Azure):
provider "azurerm" {
features {}
}
正确写法示例(AWS):
provider "aws" {
region = "us-east-1"
}
- 不要把
access_key/secret_key写死在provider块里,改用环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY - Azure 必须先运行
az login,否则terraform init会提示Error building AzureRM client: Authenticating using the Azure CLI is only supported as a user (not a service principal) - 阿里云 provider 需显式声明
region和access_key/secret_key,且版本号必须匹配文档要求(如version = "1.231.0")
EC2 实例必须显式关联子网和安全组
aws_instance 不会自动帮你拉起 VPC、子网或安全组。如果只写实例资源,terraform apply 会报错:InvalidParameterValue: Value (xxxx) for parameter groupId is invalid. The security group 'xxxx' does not exist in default VPC 'vpc-xxxx' —— 因为默认 VPC 可能被禁用,或你没指定 vpc_security_group_ids。
关键点:
IT技术解决互联网公司网站模板是一款适合提供APP设计、网页开发、SEO优化、云服务、数据分析等服务的互联网公司宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。
- 子网 ID 必须通过
subnet_id参数传入,不能只靠availability_zone - 安全组必须用
vpc_security_group_ids = [aws_security_group.web.id],而非security_groups = ["default"](后者只适用于经典网络,已弃用) - AMI ID 必须与目标区域匹配,例如
ami-0c02fb55956c7d316是 us-east-1 的 Ubuntu 22.04,换到 ap-southeast-1 就得查新 ID,否则报InvalidAMIID.NotFound
Linux VM 网络接口必须绑定公网 IP 才能 SSH 连通
Azure 的 azurerm_linux_virtual_machine 默认不分配公网 IP。即使你写了 public_ip_address_allocation = "Static",若没把该 IP 绑定到网络接口(NIC),实例启动后仍无法从外网访问,terraform apply 也不报错,但 ssh 会超时。
必须确保三者串联:
- 先定义
azurerm_public_ip - 再定义
azurerm_network_interface,并在其ip_configuration块中引用该 IP 的id - 最后在
azurerm_linux_virtual_machine的network_interface_ids中填入 NIC 的id
漏掉任一环,terraform plan 看似成功,实际机器“存在但不可达”。
密钥对管理最容易被忽略的权限和路径问题
Terraform 生成的私钥文件(如 aws_key.pem)若权限不是 0600,OpenSSH 会拒绝使用,报错:Permissions for 'aws_key.pem' are too open. It is required that your private key files are NOT accessible by others.
同时要注意:
- AWS 密钥对资源(
aws_key_pair)的key_name必须全局唯一,重名会触发ResourceAlreadyExistsException - Azure 不用单独建密钥对,而是把公钥内容直接写进
admin_ssh_key块,格式必须是"ssh-rsa AAAAB3NzaC1yc2E... user@host",开头不能有空格或换行 - 本地保存私钥的路径不能含中文或空格,否则某些 shell 下
ssh -i会解析失败
跨平台部署最常卡在密钥环节——不是配置写错了,而是文件权限或路径没按 SSH 规则来。

















