• 搜索
  • 夜间模式
    ©2025-2026  依刻学习 Theme by OneBlog

    依刻学习博客

    搜索
    标签
  • 首页>
  • >
  • 正文
  • Terraform关于阿里云的实践

    2026年03月20日 10 阅读 0 评论 6587 字

    一.概览
    terraform作为一种IaC技术,允许自动化来完成基础设施建设
    这次,我将在阿里云ECS上使用terraform自动创建阿里云资源

    阿里云文档
    阿里云Terraform文档 Terraform Provider for Alibaba Cloud

    华为云Terraform文档 HuaweiCloud Terraform Provider

    二.安装Terraform

    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
    sudo yum -y install terraform
    terraform -help
    terraform -install-autocomplete   # 自动补全

    三.了解terraform
    terraform部署文件

    # 顶级块--配置引擎(版本约束,模块行为)
    terraform {
      required_version = ">= 1.5.0, < 2.0.0" # 指定 Terraform 版本
      required_providers {}                   # 描述所需 Provider 的版本与来源
      backend <存储类型> {}                   # 存储位置,默认本地,可配置远程(如 s3、gcs 等)
    }
    
    # ---------------------------------------------------------
    # Provider 提供者--配置云平台或服务
    provider "alicloud" {
      region = "<阿里云部署区域>"
    }
    provider "aws" {
      region = "<AWS 部署区域>"
      alias  = "us"  # 多 Provider 时需别名
    }
    
    # ---------------------------------------------------------
    # Variables 变量--使配置可复用、参数化(建议存于 variables.tf)
    variable "region" {    
      description = "部署区域"       
      type        = string
      default     = var.<默认区域变量>  # 通过 “var.xxxx” 引用变量
    }
    variable "instance_type" {
      type        = string
      validation {
        condition     = contains(["<允许的实例类型1>", "<允许的实例类型2>"], var.instance_type)
        error_message = "仅支持指定实例类型。"
      }
    }
    
    # ---------------------------------------------------------
    # Resources 资源--通过 provider 创建的基础设施对象
    resource "alicloud_vpc" "main" {     
      vpc_name   = "<VPC 名称>"
      cidr_block = "<VPC CIDR 块>"
    }
    resource "alicloud_instance" "web" {
      instance_name = "<实例名称>"
      image_id      = "<操作系统镜像 ID>"
      instance_type = var.instance_type
      vswitch_id    = alicloud_vswitch.public.id  # 引用其他资源属性
      tags = {
        Environment = "<环境标签>"
        Team        = "<团队标签>"
      }
    }
    
    # ---------------------------------------------------------
    # Outputs 输出--暴露重要信息供外部使用(terraform output,建议存于 outputs.tf)
    output "web_server_public_ip" {      
      description = "Web服务器公网IP"
      value       = alicloud_instance.web.public_ip  # resource.变量
      sensitive   = true  # 隐藏敏感输出(但仍会存入 state)
    }
    output "vpc_id" {
      value = alicloud_vpc.main.id
    }
    
    # ---------------------------------------------------------
    # Locals 本地变量--简化复杂表达式,避免重复
    locals {
      common_tags = {
        Owner       = "<所有者信息>"
        Project     = "<项目名称>"
        Environment = "<部署环境>"
      }
    }
    resource "alicloud_instance" "web" {
      tags = merge(local.common_tags, { Name = "<实例标识名>" })
    }
    
    # ---------------------------------------------------------
    # Modules 模块--使用官方 VPC 模块,将配置封装为可复用单元
    module "vpc" {
      source  = "<模块来源路径>"
      version = "<模块版本>"
      vpc_name   = "<模块内 VPC 名称>"
      cidr_block = "<模块内 CIDR 块>"
    }
    # 引用模块输出
    resource "alicloud_instance" "web" {
      vswitch_id = module.vpc.vswitch_ids[0]
    }
    
    # --------------------------------------------------------
    # Data 数据源--读取外部已存在的资源信息
    data "aws_vpc" "main" {   
      tags = {
        Name = "<已有 VPC 的标签名称>"
      }
    }

    命令与执行

    terraform init    # 初始化项目,创建新配置使用(当前目录需要存在配置)
    # 以下命令都需要在配置工作目录中才能执行
    terraform fmt     # 格式化配置
    terraform validate # 检查配置是合法
    terraform apply   # 部署基础设施
    terraform show    # 检查当前配置运行的状态
    terraform state list # 列出项目状态的资源
    terraform destroy # 终止运行的资源,默认所有资源  -target单独指定某个资源
    terraform output  # 显示当前配置的output
    
    如果需要修改,只需修改配置重新apply

    细节

    - 部署
    每次apply时,都会输出执行计划,可以查看添加,删除,修改了什么配置
    +是添加,-是删除,-/+是重建(不是更新),~是就地更新 这些实现由Terraform决定
    
    - 命名
    terraform会加载工作目录下所有以.tf结尾的文件
    
    - resource字段
    使用不同的provider,使用不同的资源,resource的字段是不同的,甚至不同的provider本身的字段也是不同的。不同的资源与提供者的字段几乎都不相同
    
    - provider需下载
    terraform本身不会内置任何provider,任何provider都需要下载,作为插件使用
    
    - resource的类型与provider
    resource的类型有明显的格式:“provider_name”,他是provider提供的类型,自动与该provider关联,所以一般只需要一个provider就可以完成配置
    
    - 多文件
    多个文件仅仅是逻辑分隔,实际上terraform会将这些配置聚成一个文件使用

    四.实战
    为了允许terraform操作阿里云,必须在阿里云上提前进行授权,而阿里云的授权方式很多,这里我选择了扮演RAM角色并将ECS实例作为可信实体,即允许该ECS中的进程扮演该RAM角色。
    1.提前创建临时的ECS作为测试节点,并且按步骤完成了terraform部署
    2.创建并授予RAM角色账号权限,用于操作ECS、VPC、KMS

    信任策略参考
    {
    "Statement": [
      {
        "Action": "sts:AssumeRole",
        "Effect": "Allow",
        "Principal": {
          "Service": [
            "ecs.aliyuncs.com"
          ]
        }
      }
    ],
    "Version": "1"
    }

    3.为ECS授予RAM角色权限(绑定实体)

    4.部署清单

    
    # 创建交换机
    resource "alicloud_vswitch" "vswitch" { #
      vpc_id       = alicloud_vpc.vpc.id
      cidr_block   = "172.16.0.0/24"
      zone_id      = data.alicloud_zones.default.zones.0.id
      vswitch_name = var.name
    }
    
    # 创建安全组
    resource "alicloud_security_group" "group" {
      security_group_name        = var.name
      description = "foo"
      vpc_id      = alicloud_vpc.vpc.id
    }
    
    # 在阿里云创建KMS秘钥
    resource "alicloud_kms_key" "key" {
      description            = "Hello KMS"
      pending_window_in_days = "7"
      status                 = "Enabled"
    }
    
    # 创建实例
    resource "alicloud_instance" "instance" {
      # 通过data动态的获取可用区
      availability_zone = data.alicloud_zones.default.zones.0.id
      security_groups   = [alicloud_security_group.group.id]
    
      # series III
      instance_type              = "ecs.e-c1m1.large"
      system_disk_name           = var.name
      system_disk_description    = "system_disk_description"
      system_disk_performance_level = "PL0"
      system_disk_category       = "cloud_essd"
      system_disk_size           = 40
      image_id                   = "centos_7_9_x64_20G_alibase_20240628.vhd"
      instance_name              = var.name
      vswitch_id                 = alicloud_vswitch.vswitch.id
      internet_max_bandwidth_out = 3
     # data_disks {
     #   name        = "data-disk"
     #   size        = 20
     #   category    = "cloud_essd"
     #   description = "disk-description"
     #   encrypted   = true
     #   kms_key_id  = alicloud_kms_key.key.id
     # }
    }
    
    # 默认是按量付费,包年包月需要手动指定

    5.部署

    terraform init
    terraform validate
    terraform apply

    6.结果展示

    7.清理

    terraform destroy 

    8.出现的问题

    搜索官方文档,发现是余额不足100导致无法创建按量付费的ECS实例

    本文著作权归作者 [ wymm ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    Copyright©2025-2026  All Rights Reserved.  Load:0.009 s
    苏ICP备2024095254号-2
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。