前言

约定格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
├── aliyun                                             # 云厂商实例文件
│ └── aliyun_ecs_mod_demo # 模型名
│ └── aliyun_china_platform_7111 # 云账号名
│ └── ecs_instance_name_20241224121212 # 实例名
│ ├── backend.tf # 实例state文件保存说明:oss
│ └── main.tf # 实例具体的参数
├── modules # 模型数据文件夹
│ ├── aliyun # 云厂商模型文件夹
│ │ └── aliyun_ecs_mod_demo # 模型名
│ │ ├── main.tf # 模型定义主文件
│ │ ├── outputs.tf # 模型定义输出文件
│ │ └── variables.tf # 模型定义参数文件
│ └── tenmod # 另一个云厂商模型
└── tenent # 另一个云厂商实例文件

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
.
├── aliyun
│ └── aliyun_alikafka_demo
│ └── aliyun_china_pt_7111
│ └── alikafka_demo_202502061910
│ ├── backend.tf
│ └── main.tf
└── modules
└── aliyun
└── aliyun_alikafka_mod_demo
├── main.tf
└── variables.tf

modules

/modules/aliyun/aliyun_alikafka_mod_demo/main.tf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.225.0"
}
}
}
provider "alicloud" {
region = var.region
}

resource "alicloud_alikafka_instance" "this" {
name = var.instance_name
deploy_type = var.deploy_type
disk_size = var.disk_size
disk_type = var.disk_type
vswitch_id = var.vswitch_id
partition_num = var.partition_num
io_max = var.io_max
}

/modules/aliyun/aliyun_alikafka_mod_demo/variables.tf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
variable "region" {
description = "地域"
type = string
}

variable "instance_name" {
description = "kafka实例名"
type = string
}

variable "deploy_type" {
// - 4: eip/vpc instance;- 5: vpc instance.
description = "部署类型"
type = number
default = 5
validation {
condition = contains([4, 5], var.deploy_type)
error_message = "The deploy_type must be one of 4, 5"
}
}

variable "disk_size" {
description = "kafka实例磁盘规格"
type = number
validation {
condition = contains([500, 1000], var.disk_size)
error_message = "The disk_size must be one of 200, 400"
}
}

variable "disk_type" {
# 0: efficient cloud disk , 1: SSD.
description = "磁盘类型"
type = number
default = 1
validation {
condition = contains([0, 1], var.disk_type)
error_message = "The disk_type must be empty, or one of 0, 1"
}
}

variable "vswitch_id" {
description = "绑定虚拟交换机id"
type = string
}

variable "partition_num" {
description = "分区数量"
type = number
}


variable "io_max" {
description = "io的最大值"
type = number
}

Demo

/aliyun/aliyun_alikafka_demo/aliyun_china_pt_7111/alikafka_demo_202502061910/backend.tf

1
2
3
4
5
6
7
8
9
terraform {
backend "oss" {
endpoint = "oss-cn-hangzhou.aliyuncs.com"
bucket = "dz-devops" # 替换为你的 OSS Bucket 名称
prefix = "terraform_state//aliyun/aliyun_alikafka_demo/aliyun_china_pt_7111/alikafka_demo_202502061910"
key = "terraform.tfstate" # 存储状态文件的路径和名称
region = "cn-hangzhou" # OSS 的地域(根据你的实际情况调整)
}
}

/aliyun/aliyun_alikafka_demo/aliyun_china_pt_7111/alikafka_demo_202502061910/main.tf

1
2
3
4
5
6
7
8
9
10
11

module "alikafka_instance" {
source = "../../../../modules/aliyun/aliyun_alikafka_mod_demo"
region = "cn-hangzhou"
disk_size = 500
instance_name = "alikafka-testV2"
deploy_type = 5
vswitch_id = "vsw-bp1co65f3q2s0bis9yfkg"
partition_num = 50
io_max = 20
}

运行测试

获取 AK/SK

在首次使用 Terraform 之前,需要前往腾讯云的云 API 密钥页面申请安全凭证SecretId和SecretKey2。若已有可使用的安全凭证,则跳过该步骤2。具体步骤如下2:

  1. 登录腾讯云访问管理控制台,在左侧导航栏,选择访问密钥>API 密钥管理。
  2. 在API 密钥管理页面,单击新建密钥,即可以创建一对SecretId/SecretKey。

设置环境变量

将获取到的SecretId和SecretKey设置为环境变量:

1
2
export TENCENTCLOUD_SECRET_ID=your_secret_id
export TENCENTCLOUD_SECRET_KEY=your_secret_key

运行项目

进入项目根目录,alikafka_demo_202502061910目录:

1
cd ./aliyun/aliyun_alikafka_demo/aliyun_china_pt_7111/alikafka_demo_202502061910

初始化 Terraform 项目:

1
2
# 将xxx替换为实际backend的ak,将yyy替换为实际backend的sk
terraform init -backend-config="access_key=xxx" -backend-config="secret_key=yyy"

该命令会下载所需的插件和依赖,并初始化后端配置。
类似的输出(首次使用某一个provier时,会先下载):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Initializing the backend...

Successfully configured the backend "oss"! Terraform will automatically
use this backend unless the backend configuration changes.
Initializing modules...
Initializing provider plugins...
- Reusing previous version of aliyun/alicloud from the dependency lock file
- Using previously-installed aliyun/alicloud v1.225.0

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

预览计划变更:

1
terraform plan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# module.alikafka_instance.alicloud_alikafka_instance.this will be created
+ resource "alicloud_alikafka_instance" "this" {
+ config = (known after apply)
+ deploy_type = 5
+ disk_size = 500
+ disk_type = 1
+ eip_max = (known after apply)
+ end_point = (known after apply)
+ group_left = (known after apply)
+ group_used = (known after apply)
+ id = (known after apply)
+ io_max = 20
+ io_max_spec = (known after apply)
+ is_partition_buy = (known after apply)
+ name = "alikafka-testV2"
+ paid_type = "PostPaid"
+ partition_left = (known after apply)
+ partition_num = 50
+ partition_used = (known after apply)
+ resource_group_id = (known after apply)
+ security_group = (known after apply)
+ service_version = (known after apply)
+ spec_type = "normal"
+ status = (known after apply)
+ topic_left = (known after apply)
+ topic_num_of_buy = (known after apply)
+ topic_quota = (known after apply)
+ topic_used = (known after apply)
+ vpc_id = (known after apply)
+ vswitch_id = "vsw-bp1co65f3q2s0bis9yfkg"
+ zone_id = (known after apply)
}

Plan: 1 to add, 0 to change, 0 to destroy.

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

执行变更:

1
terraform apply
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# module.alikafka_instance.alicloud_alikafka_instance.this will be created
+ resource "alicloud_alikafka_instance" "this" {
+ config = (known after apply)
+ deploy_type = 5
+ disk_size = 500
+ disk_type = 1
+ eip_max = (known after apply)
+ end_point = (known after apply)
+ group_left = (known after apply)
+ group_used = (known after apply)
+ id = (known after apply)
+ io_max = 20
+ io_max_spec = (known after apply)
+ is_partition_buy = (known after apply)
+ name = "alikafka-testV2"
+ paid_type = "PostPaid"
+ partition_left = (known after apply)
+ partition_num = 50
+ partition_used = (known after apply)
+ resource_group_id = (known after apply)
+ security_group = (known after apply)
+ service_version = (known after apply)
+ spec_type = "normal"
+ status = (known after apply)
+ topic_left = (known after apply)
+ topic_num_of_buy = (known after apply)
+ topic_quota = (known after apply)
+ topic_used = (known after apply)
+ vpc_id = (known after apply)
+ vswitch_id = "vsw-bp1co65f3q2s0bis9yfkg"
+ zone_id = (known after apply)
}

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value: yes

module.alikafka_instance.alicloud_alikafka_instance.this: Creating...
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [10s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [20s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [30s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [40s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [50s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [1m0s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [1m10s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [1m20s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [1m30s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [1m40s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [1m50s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [2m0s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [2m10s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [2m20s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [2m30s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [2m40s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [2m50s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [3m0s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [3m10s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [3m20s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [3m30s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [3m40s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [3m50s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [4m0s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [4m10s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [4m20s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [4m30s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still creating... [4m40s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Creation complete after 4m45s [id=alikafka_post-cn-0gx44g6dm006]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

验证创建

在前端查看是否成功创建实例:

img

销毁资源

执行下面的命令进行销毁:

1
terraform destroy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
module.alikafka_instance.alicloud_alikafka_instance.this: Refreshing state... [id=alikafka_post-cn-0gx44g6dm006]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
- destroy

Terraform will perform the following actions:

# module.alikafka_instance.alicloud_alikafka_instance.this will be destroyed
- resource "alicloud_alikafka_instance" "this" {
- config = jsonencode(
{
- "cloud.maxTieredStoreSpace" = "0"
- "enable.acl" = "false"
- "enable.compact" = "true"
- "enable.tiered" = "false"
- "enable.vpc_sasl_ssl" = "false"
- "kafka.log.retention.hours" = "72"
- "kafka.message.max.bytes" = "1048576"
- "kafka.offsets.retention.minutes" = "10080"
- "kafka.ssl.bit" = "1024"
- "message.timestamp.difference.max.ms" = "9223372036854775807"
- "message.timestamp.type" = "CreateTime"
}
) -> null
- deploy_type = 5 -> null
- disk_size = 500 -> null
- disk_type = 1 -> null
- eip_max = 0 -> null
- end_point = "172.31.1.64:9092,172.31.1.66:9092,172.31.1.65:9092" -> null
- group_left = 2100 -> null
- group_used = 0 -> null
- id = "alikafka_post-cn-0gx44g6dm006" -> null
- io_max = 20 -> null
- io_max_spec = "alikafka.hw.2xlarge" -> null
- is_partition_buy = 1 -> null
- name = "alikafka-testV2" -> null
- paid_type = "PostPaid" -> null
- partition_left = 1050 -> null
- partition_num = 50 -> null
- partition_used = 0 -> null
- resource_group_id = "rg-acfmzpn54i5ejry" -> null
- security_group = "sg-bp184o2lwjnssf12wf3w" -> null
- service_version = "2.2.0" -> null
- spec_type = "normal" -> null
- status = 5 -> null
- tags = {} -> null
- topic_left = 1050 -> null
- topic_num_of_buy = 1050 -> null
- topic_quota = 1050 -> null
- topic_used = 0 -> null
- vpc_id = "vpc-bp1sro6pb0sec14x7s05l" -> null
- vswitch_id = "vsw-bp1co65f3q2s0bis9yfkg" -> null
- zone_id = "zonei" -> null
# (1 unchanged attribute hidden)
}

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value: yes

module.alikafka_instance.alicloud_alikafka_instance.this: Destroying... [id=alikafka_post-cn-0gx44g6dm006]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 10s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 20s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 30s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 40s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 50s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 1m1s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 1m11s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 1m21s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 1m31s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 1m41s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 1m51s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 2m1s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 2m11s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 2m21s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Still destroying... [id=alikafka_post-cn-0gx44g6dm006, 2m31s elapsed]
module.alikafka_instance.alicloud_alikafka_instance.this: Destruction complete after 2m37s

Destroy complete! Resources: 1 destroyed.