1+
2+ locals {
3+ zone_id = data. alicloud_kvstore_zones . default . ids [length (data. alicloud_kvstore_zones . default . ids ) - 1 ]
4+ }
5+
6+ data "alicloud_kvstore_zones" "default" {
7+ instance_charge_type = " PostPaid"
8+ engine = " Redis"
9+ product_type = " OnECS"
10+ }
11+
12+ data "alicloud_db_instance_classes" "default" {
13+ zone_id = local. zone_id
14+ engine = " MySQL"
15+ engine_version = " 8.0"
16+ category = " Basic"
17+ db_instance_storage_type = " cloud_essd"
18+ instance_charge_type = " PostPaid"
19+ }
20+
21+ # Declare the data source
22+ data "alicloud_instance_types" "default" {
23+ availability_zone = local. zone_id
24+ instance_type_family = " ecs.c7"
25+ }
26+
27+ resource "random_id" "suffix" {
28+ byte_length = 4
29+ }
30+ locals {
31+ common_name = " cache-${ random_id . suffix . hex } "
32+ }
33+ # VPC 网络资源
34+ resource "alicloud_vpc" "vpc" {
35+ vpc_name = " ${ local . common_name } -vpc"
36+ cidr_block = " 192.168.0.0/16"
37+ }
38+
39+ resource "alicloud_vswitch" "vswitch" {
40+ vpc_id = alicloud_vpc. vpc . id
41+ cidr_block = " 192.168.0.0/24"
42+ zone_id = local. zone_id
43+ vswitch_name = " ${ local . common_name } -vsw"
44+ }
45+
46+ # 安全组
47+ resource "alicloud_security_group" "security_group" {
48+ security_group_name = " ${ local . common_name } -sg"
49+ vpc_id = alicloud_vpc. vpc . id
50+ }
51+
52+ resource "alicloud_security_group_rule" "security_group_rule_ssh" {
53+ security_group_id = alicloud_security_group. security_group . id
54+ type = " ingress"
55+ ip_protocol = " tcp"
56+ port_range = " 22/22"
57+ cidr_ip = " 0.0.0.0/0"
58+ }
59+
60+ resource "alicloud_security_group_rule" "security_group_rule_http" {
61+ security_group_id = alicloud_security_group. security_group . id
62+ type = " ingress"
63+ ip_protocol = " tcp"
64+ port_range = " 80/80"
65+ cidr_ip = " 0.0.0.0/0"
66+ }
67+
68+ resource "alicloud_security_group_rule" "security_group_rule_https" {
69+ security_group_id = alicloud_security_group. security_group . id
70+ type = " ingress"
71+ ip_protocol = " tcp"
72+ port_range = " 443/443"
73+ cidr_ip = " 0.0.0.0/0"
74+ }
75+
76+ resource "alicloud_security_group_rule" "security_group_rule_mysql" {
77+ security_group_id = alicloud_security_group. security_group . id
78+ type = " ingress"
79+ ip_protocol = " tcp"
80+ port_range = " 3306/3306"
81+ cidr_ip = " 0.0.0.0/0"
82+ }
83+
84+ # 镜像数据源
85+ data "alicloud_images" "ecs_image" {
86+ name_regex = " ^aliyun_3_x64_20G_alibase_.*"
87+ most_recent = true
88+ owners = " system"
89+ instance_type = data. alicloud_instance_types . default . instance_types [0 ]. id
90+ }
91+
92+ # ECS 实例
93+ resource "alicloud_instance" "ecs_instance" {
94+ instance_name = " ${ local . common_name } -ecs"
95+ image_id = data. alicloud_images . ecs_image . images [0 ]. id
96+ instance_type = data. alicloud_instance_types . default . instance_types [0 ]. id
97+ security_groups = [alicloud_security_group . security_group . id ]
98+ vswitch_id = alicloud_vswitch. vswitch . id
99+ system_disk_category = " cloud_essd"
100+ internet_max_bandwidth_out = 5
101+ password = var. ecs_instance_password
102+ }
103+
104+ # RDS 数据库实例
105+ resource "alicloud_db_instance" "rds_instance" {
106+ engine = " MySQL"
107+ engine_version = " 8.0"
108+ instance_type = data. alicloud_db_instance_classes . default . instance_classes . 0 . instance_class
109+ instance_storage = data. alicloud_db_instance_classes . default . instance_classes . 0 . storage_range . min
110+ db_instance_storage_type = " cloud_essd"
111+ category = " Basic"
112+ vpc_id = alicloud_vpc. vpc . id
113+ vswitch_id = alicloud_vswitch. vswitch . id
114+ security_group_ids = [alicloud_security_group . security_group . id ]
115+ security_ips = [" 192.168.0.0/24" ]
116+ zone_id = local. zone_id
117+ zone_id_slave_a = " Auto"
118+ }
119+
120+ # RDS 账户
121+ resource "alicloud_rds_account" "rds_account" {
122+ db_instance_id = alicloud_db_instance. rds_instance . id
123+ account_name = var. db_user_name
124+ account_password = var. db_password
125+ account_type = " Super"
126+ }
127+
128+ # RDS 数据库
129+ resource "alicloud_db_database" "rds_database" {
130+ instance_id = alicloud_db_instance. rds_instance . id
131+ name = " biz"
132+ character_set = " utf8mb4"
133+ depends_on = [alicloud_rds_account . rds_account ]
134+ }
135+
136+ # Redis 实例
137+ resource "alicloud_kvstore_instance" "redis_instance" {
138+ db_instance_name = " ${ local . common_name } -redis"
139+ instance_class = " redis.shard.small.2.ce"
140+ instance_type = " Redis"
141+ engine_version = " 6.0"
142+ vswitch_id = alicloud_vswitch. vswitch . id
143+ zone_id = local. zone_id
144+ password = var. redis_password
145+ security_ips = [" 192.168.0.0/24" ]
146+ }
147+
148+ # Redis 账户
149+ resource "alicloud_kvstore_account" "redis_account" {
150+ instance_id = alicloud_kvstore_instance. redis_instance . id
151+ account_name = var. redis_account_name
152+ account_password = var. redis_password
153+ account_privilege = " RoleReadWrite"
154+ account_type = " Normal"
155+ }
156+
157+
158+ # 本地变量 - 安装脚本
159+ locals {
160+ install_script = <<- SHELL
161+ #!/bin/bash
162+
163+ # 环境变量配置
164+ export PATH=/usr/local/bin:$PATH
165+
166+ function log_info() {
167+ printf "%s [INFO] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1"
168+ }
169+
170+ function log_error() {
171+ printf "%s [ERROR] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1"
172+ }
173+
174+ function log_fatal() {
175+ printf "\n========================================================================\n"
176+ printf "%s [FATAL] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$2"
177+ printf "\n========================================================================\n"
178+ exit $1
179+ }
180+
181+ function debug_exec(){
182+ local cmd="$@"
183+ log_info "$cmd"
184+ eval "$cmd"
185+ ret=$?
186+ echo ""
187+ log_info "$cmd, exit code: $ret"
188+ return $ret
189+ }
190+
191+ function install_web() {
192+ yum install nginx -y
193+ yum install java-1.8.0-openjdk.x86_64 -y
194+ sed -i 's/ _;/ domain.not.exists;/' /etc/nginx/nginx.conf
195+ curl -o AppWithRedisDemo.jar 'https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/demos/AppWithRedisDemo.jar'
196+ }
197+
198+ if ! debug_exec install_web; then
199+ log_fatal 3 "install web failed"
200+ fi
201+
202+ cat << 'EOF' > /etc/nginx/conf.d/app_with_redis.conf
203+ server {
204+ listen 80 default_server;
205+ server_name _;
206+
207+ location / {
208+ proxy_pass http://localhost:8080;
209+ proxy_set_header Host $host;
210+ proxy_set_header X-Real-IP $remote_addr;
211+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
212+ proxy_set_header X-Forwarded-Proto $scheme;
213+ }
214+ }
215+
216+ EOF
217+
218+ nohup java -DMYSQL_HOST="${ alicloud_db_instance . rds_instance . connection_string } " -DMYSQL_PASSWORD="${ var . db_password } " -DREDIS_HOST="${ alicloud_kvstore_instance . redis_instance . connection_domain } " -DREDIS_PASSWORD="redis:${ var . redis_password } " -DAPP_MANUAL_DEPLOY="false" -jar AppWithRedisDemo.jar > output.log 2>&1 &
219+ /bin/systemctl start nginx.service
220+ SHELL
221+ }
222+
223+ # ECS 命令
224+ resource "alicloud_ecs_command" "install_web_command" {
225+ name = " install-web-command"
226+ description = " Install web application with Redis demo"
227+ enable_parameter = false
228+ type = " RunShellScript"
229+ command_content = base64encode (local. install_script )
230+ timeout = 3600
231+ working_dir = " /root"
232+ }
233+
234+ # 在ECS中执行命令
235+ resource "alicloud_ecs_invocation" "install_web_invocation" {
236+ instance_id = [alicloud_instance . ecs_instance . id ]
237+ command_id = alicloud_ecs_command. install_web_command . id
238+
239+ depends_on = [
240+ alicloud_db_database . rds_database ,
241+ alicloud_kvstore_account . redis_account
242+ ]
243+
244+ timeouts {
245+ create = " 10m"
246+ }
247+ }
0 commit comments