1+ data "alicloud_instance_types" "default" {
2+ instance_type_family = " ecs.g7"
3+ }
4+
5+ data "alicloud_zones" "default" {
6+ available_instance_type = data. alicloud_instance_types . default . ids . 0
7+ }
8+
9+ data "alicloud_db_zones" "default" {
10+ engine = " MySQL"
11+ engine_version = " 8.0"
12+ instance_charge_type = " PostPaid"
13+ category = " Basic"
14+ db_instance_storage_type = " cloud_essd"
15+ }
16+
17+ data "alicloud_db_instance_classes" "default" {
18+ zone_id = data. alicloud_db_zones . default . ids . 0
19+ instance_charge_type = " PostPaid"
20+ engine = " MySQL"
21+ engine_version = " 8.0"
22+ category = " Basic"
23+ db_instance_storage_type = " cloud_essd"
24+ }
25+
26+ data "alicloud_images" "instance_image" {
27+ name_regex = " ^aliyun_3_9_x64_20G_*"
28+ most_recent = true
29+ owners = " system"
30+ instance_type = data. alicloud_instance_types . default . ids . 0
31+ }
32+
33+ resource "alicloud_vpc" "vpc" {
34+ vpc_name = " ${ var . common_name } -vpc"
35+ cidr_block = " 192.168.0.0/16"
36+ }
37+
38+ resource "alicloud_vswitch" "ecs_vswitch1" {
39+ vpc_id = alicloud_vpc. vpc . id
40+ cidr_block = " 192.168.0.0/24"
41+ zone_id = data. alicloud_zones . default . ids . 0
42+ vswitch_name = " ${ var . common_name } -vsw"
43+ }
44+
45+ resource "alicloud_vswitch" "rds_vswitch2" {
46+ vpc_id = alicloud_vpc. vpc . id
47+ cidr_block = " 192.168.1.0/24"
48+ zone_id = data. alicloud_db_zones . default . ids . 0
49+ vswitch_name = " ${ var . common_name } -vsw"
50+ }
51+
52+ resource "alicloud_security_group" "security_group" {
53+ security_group_name = " ${ var . common_name } -sg"
54+ vpc_id = alicloud_vpc. vpc . id
55+ }
56+
57+ resource "alicloud_security_group_rule" "security_group_ingress_443" {
58+ security_group_id = alicloud_security_group. security_group . id
59+ type = " ingress"
60+ ip_protocol = " tcp"
61+ port_range = " 443/443"
62+ cidr_ip = " 0.0.0.0/0"
63+ }
64+
65+ resource "alicloud_security_group_rule" "security_group_ingress_80" {
66+ security_group_id = alicloud_security_group. security_group . id
67+ type = " ingress"
68+ ip_protocol = " tcp"
69+ port_range = " 80/80"
70+ cidr_ip = " 0.0.0.0/0"
71+ }
72+
73+ resource "alicloud_security_group_rule" "security_group_ingress_3306" {
74+ security_group_id = alicloud_security_group. security_group . id
75+ type = " ingress"
76+ ip_protocol = " tcp"
77+ port_range = " 3306/3306"
78+ cidr_ip = " 0.0.0.0/0"
79+ }
80+
81+ resource "alicloud_instance" "ecs_instance" {
82+ instance_name = " ${ var . common_name } -ecs"
83+ image_id = data. alicloud_images . instance_image . images [0 ]. id
84+ instance_type = data. alicloud_instance_types . default . ids . 0
85+ security_groups = [alicloud_security_group . security_group . id ]
86+ vswitch_id = alicloud_vswitch. ecs_vswitch1 . id
87+ system_disk_category = " cloud_essd"
88+ internet_max_bandwidth_out = 100
89+ password = var. ecs_instance_password
90+ }
91+
92+ resource "alicloud_db_instance" "rds_instance" {
93+ engine = " MySQL"
94+ engine_version = " 8.0"
95+ instance_type = data. alicloud_db_instance_classes . default . ids . 0
96+ instance_storage = 40
97+ category = " Basic"
98+ db_instance_storage_type = " cloud_essd"
99+ vpc_id = alicloud_vpc. vpc . id
100+ vswitch_id = alicloud_vswitch. rds_vswitch2 . id
101+ security_group_ids = [alicloud_security_group . security_group . id ]
102+ security_ips = [" 192.168.0.0/24" ]
103+ }
104+
105+ resource "alicloud_rds_account" "create_db_user" {
106+ db_instance_id = alicloud_db_instance. rds_instance . id
107+ account_name = var. db_user_name
108+ account_password = var. db_password
109+ account_type = " Super"
110+ }
111+
112+ resource "alicloud_db_database" "rds_database" {
113+ name = var. database_name
114+ description = " ${ var . database_name } database"
115+ instance_id = alicloud_db_instance. rds_instance . id
116+ character_set = " utf8mb4"
117+ }
118+
119+ locals {
120+ install_java_script = <<- SHELL
121+ #!/bin/bash
122+ # 环境变量配置
123+ export PATH=/usr/local/bin:$PATH
124+
125+ echo "export APPLETS_RDS_ENDPOINT=${ alicloud_db_instance . rds_instance . connection_string } " >> ~/.bashrc
126+ echo "export APPLETS_RDS_USER=${ var . db_user_name } " >> ~/.bashrc
127+ echo "export APPLETS_RDS_PASSWORD=${ var . db_password } " >> ~/.bashrc
128+ echo "export APPLETS_RDS_DB_NAME=${ var . database_name } " >> ~/.bashrc
129+ source ~/.bashrc
130+
131+ # 网络检查地址
132+ NETWORK_CHECk_ADDR="help-static-aliyun-doc.aliyuncs.com"
133+
134+ function unsupported_system() {
135+ log_fatal 1 "Unsupported System: $1"
136+ }
137+
138+ function log_info() {
139+ printf "%s [INFO] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1"
140+ }
141+
142+ function log_error() {
143+ printf "%s [ERROR] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1"
144+ }
145+
146+ function log_fatal() {
147+ printf "\n========================================================================\n"
148+ printf "%s [FATAL] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$2"
149+ printf "\n========================================================================\n"
150+ exit $1
151+ }
152+
153+ function debug_exec(){
154+ local cmd="$@"
155+ log_info "$cmd"
156+ eval "$cmd"
157+ ret=$?
158+ echo ""
159+ log_info "$cmd, exit code: $ret"
160+ return $ret
161+ }
162+
163+ function check_network_available() {
164+ log_info "ping $NETWORK_CHECk_ADDR ..."
165+ if ! debug_exec ping -c 4 $NETWORK_CHECk_ADDR; then
166+ log_fatal 2 "Could not connect to https://$NETWORK_CHECk_ADDR"
167+ fi
168+ }
169+
170+ function install_java() {
171+ log_info "install java"
172+ yum upgrade & yum install java-1.8.0-openjdk-devel -y
173+ }
174+
175+ function init_database() {
176+ log_info "install mysql 1.20.1"
177+ yum install -y mysql
178+ mysql -h $APPLETS_RDS_ENDPOINT -u $APPLETS_RDS_USER -p$APPLETS_RDS_PASSWORD < /data/script.sql
179+ }
180+
181+ log_info "System Information:"
182+ if ! lsb_release -a; then
183+ unsupported_system
184+ fi;
185+ echo ""
186+
187+ check_network_available
188+
189+ mkdir -p /data
190+ cat <<"EOF" >> /data/script.sql
191+ -- script.sql
192+ USE ${ var . database_name } ;
193+ CREATE TABLE `todo_list` (
194+ `id` bigint NOT NULL COMMENT 'id',
195+ `title` varchar(128) NOT NULL COMMENT 'title',
196+ `desc` text NOT NULL COMMENT 'description',
197+ `status` varchar(128) NOT NULL COMMENT 'status 未开始、进行中、已完成、已取消',
198+ `priority` varchar(128) NOT NULL COMMENT 'priority 高、中、低',
199+ `expect_time` datetime COMMENT 'expect time',
200+ `actual_completion_time` datetime COMMENT 'actual completion time',
201+ `gmt_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'create time',
202+ `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'modified time',
203+ PRIMARY KEY (`id`)
204+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
205+ ;
206+ INSERT INTO todo_list
207+ (id, title, `desc`, `status`, priority, expect_time)
208+ value(1, "创建一个小程序", "使用阿里云解决方案快速搭建一个App应用", "进行中", "高", "2024-04-01 00:00:00")
209+
210+ EOF
211+
212+ if ! debug_exec install_java; then
213+ log_fatal 3 "install java failed"
214+ fi
215+
216+ if ! debug_exec init_database; then
217+ log_fatal 4 "init database failed"
218+ fi
219+ SHELL
220+ }
221+
222+ resource "alicloud_ecs_command" "install_java" {
223+ depends_on = [alicloud_db_database . rds_database ]
224+ name = " install-java-and-init-db"
225+ command_content = base64encode (local. install_java_script )
226+ description = " Install Java and Initialize Database"
227+ type = " RunShellScript"
228+ working_dir = " /root"
229+ }
230+
231+ resource "alicloud_ecs_invocation" "invoke_install_java" {
232+ instance_id = [alicloud_instance . ecs_instance . id ]
233+ command_id = alicloud_ecs_command. install_java . id
234+ }
235+
236+ resource "alicloud_dns_record" "domain_record" {
237+ count = var. domain_name == null ? 0 : 1
238+
239+ # 解析 domain_name JSON 字符串,提取 domain_name 字段
240+ name = var. domain_name . domain_name
241+
242+ # 解析 domain_name JSON 字符串,提取 domain_prefix 字段
243+ host_record = var. domain_name . domain_prefix != " " && var. domain_name . domain_prefix != null ? var. domain_name . domain_prefix : " @"
244+ type = " A"
245+ value = alicloud_instance. ecs_instance . public_ip
246+ }
0 commit comments