1
+ provider "alicloud" {
2
+ region = var. region
3
+ }
4
+
5
+ # 生成随机字符串
6
+ resource "random_string" "random_string" {
7
+ length = 8
8
+ special = false
9
+ upper = false
10
+ numeric = true
11
+ lower = true
12
+ }
13
+
14
+ # 获取当前区域信息
15
+ data "alicloud_regions" "current_region_ds" {
16
+ current = true
17
+ }
18
+
19
+ # 动态查询可用区
20
+ data "alicloud_zones" "default" {
21
+ available_disk_category = " cloud_essd"
22
+ available_resource_creation = " VSwitch"
23
+ available_instance_type = var. instance_type
24
+ }
25
+
26
+ # 动态查询镜像
27
+ data "alicloud_images" "default" {
28
+ name_regex = " ^aliyun_3_x64_20G_alibase_.*"
29
+ most_recent = true
30
+ owners = " system"
31
+ }
32
+
33
+ # VPC
34
+ resource "alicloud_vpc" "vpc" {
35
+ cidr_block = " 192.168.0.0/16"
36
+ vpc_name = " vpc_${ var . common_name } "
37
+ }
38
+
39
+ # VSwitch
40
+ resource "alicloud_vswitch" "vswitch" {
41
+ vpc_id = alicloud_vpc. vpc . id
42
+ cidr_block = " 192.168.0.0/24"
43
+ zone_id = var. zone_id
44
+ vswitch_name = " vsw_${ var . common_name } "
45
+ }
46
+
47
+ # 安全组
48
+ resource "alicloud_security_group" "security_group" {
49
+ vpc_id = alicloud_vpc. vpc . id
50
+ security_group_name = " ${ var . common_name } -sg"
51
+ security_group_type = " normal"
52
+ }
53
+
54
+ # 安全组入站规则 - SSH端口
55
+ # 注意:在VPC中,nic_type必须设置为"intranet",但这不会阻止从公网访问
56
+ # 只要ECS实例有公网IP并且cidr_ip允许相应访问即可
57
+ resource "alicloud_security_group_rule" "allow_ssh" {
58
+ type = " ingress"
59
+ ip_protocol = " tcp"
60
+ nic_type = " intranet"
61
+ policy = " accept"
62
+ port_range = " 22/22"
63
+ priority = 1
64
+ security_group_id = alicloud_security_group. security_group . id
65
+ cidr_ip = " 0.0.0.0/0"
66
+ }
67
+
68
+ # 安全组入站规则 - 5000端口
69
+ # 注意:在VPC中,nic_type必须设置为"intranet",但这不会阻止从公网访问
70
+ # 只要ECS实例有公网IP并且cidr_ip允许相应访问即可
71
+ resource "alicloud_security_group_rule" "allow_app" {
72
+ type = " ingress"
73
+ ip_protocol = " tcp"
74
+ nic_type = " intranet"
75
+ policy = " accept"
76
+ port_range = " 5000/5000"
77
+ priority = 1
78
+ security_group_id = alicloud_security_group. security_group . id
79
+ cidr_ip = " 0.0.0.0/0"
80
+ }
81
+
82
+ # ECS实例
83
+ resource "alicloud_instance" "ecs_instance" {
84
+ instance_name = " ${ var . common_name } -ecs_adb"
85
+ image_id = data. alicloud_images . default . images [0 ]. id
86
+ instance_type = var. instance_type
87
+ system_disk_category = " cloud_essd"
88
+ vswitch_id = alicloud_vswitch. vswitch . id
89
+ security_groups = [alicloud_security_group . security_group . id ]
90
+ password = var. ecs_instance_password
91
+ internet_max_bandwidth_out = 100
92
+ }
93
+
94
+ # AnalyticDB实例
95
+ resource "alicloud_gpdb_instance" "analyticdb" {
96
+ engine = " gpdb"
97
+ engine_version = " 6.0"
98
+ instance_spec = " 4C16G"
99
+ zone_id = var. zone_id
100
+ vswitch_id = alicloud_vswitch. vswitch . id
101
+ seg_node_num = 2
102
+ seg_storage_type = " cloud_essd"
103
+ seg_disk_performance_level = " pl1"
104
+ storage_size = 50
105
+ vpc_id = alicloud_vpc. vpc . id
106
+ ip_whitelist {
107
+ security_ip_list = " 192.168.0.0/24"
108
+ }
109
+ description = " ${ var . common_name } -adb"
110
+ payment_type = " PayAsYouGo"
111
+ db_instance_category = " Basic"
112
+ db_instance_mode = " StorageElastic"
113
+ }
114
+
115
+ # ECS命令
116
+ resource "alicloud_ecs_command" "run_command" {
117
+ name = " adb-bailian-install"
118
+ command_content = base64encode (<< EOF
119
+ #!/bin/bash
120
+
121
+ # script exit code:
122
+ # 0 - success
123
+ # 1 - unsupported system
124
+ # 2 - network not available
125
+ # 3 - failed to git clone
126
+ # 4 - failed to init python environment
127
+ # 5 - failed to init git
128
+ # 6 - failed to run flask app
129
+
130
+ # 环境变量配置
131
+ cat << EOT >> ~/.bashrc
132
+ export SOCKET_ENDPOINT=${ alicloud_instance . ecs_instance . public_ip } :5000
133
+ export APP_ID=${ var . app_id }
134
+ export DASHSCOPE_API_KEY=${ var . bai_lian_api_key }
135
+ EOT
136
+ source ~/.bashrc
137
+
138
+ # 检查是否已经配置过
139
+ if [ ! -f .ros.provision ]; then
140
+ echo "Name: 手动搭建AnalyticDB与百炼搭建智能问答系统" > .ros.provision
141
+ fi
142
+
143
+ name=$(grep "^Name:" .ros.provision | awk -F':' '{print $2}' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
144
+ if [[ "$name" != "手动搭建AnalyticDB与百炼搭建智能问答系统" ]]; then
145
+ echo "当前实例已使用过\"$name\"教程的一键配置,不能再使用本教程的一键配置"
146
+ exit 1
147
+ fi
148
+
149
+ # Step1: Prepare Environment
150
+ if ! grep -q "^Step1: Prepare Environment$" .ros.provision; then
151
+ echo "#########################"
152
+ echo "# Prepare Environment "
153
+ echo "#########################"
154
+
155
+ # 安装Python-3.9.7
156
+ sudo yum update -y && \
157
+ sudo yum groupinstall "Development Tools" -y && \
158
+ sudo yum install openssl-devel bzip2-devel libffi-devel -y
159
+
160
+ cd /usr/src && \
161
+ sudo curl -O https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240729/unpfxr/Python-3.9.0.tgz && \
162
+ sudo tar xzf Python-3.9.0.tgz && \
163
+ cd Python-3.9.0 && \
164
+ sudo ./configure --enable-optimizations && \
165
+ sudo make altinstall
166
+
167
+ python3.9 --version && \
168
+ python3.9 -m ensurepip && \
169
+ python3.9 -m pip install --upgrade pip
170
+
171
+ echo "Step1: Prepare Environment" >> .ros.provision
172
+ else
173
+ echo "#########################"
174
+ echo "# Environment has been ready"
175
+ echo "#########################"
176
+ fi
177
+
178
+ # Step2: Deployment service
179
+ if ! grep -q "^Step2: Deployment service$" .ros.provision; then
180
+ echo "#########################"
181
+ echo "# Deployment service "
182
+ echo "#########################"
183
+
184
+ cd /root
185
+ wget https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240729/unpfxr/demo.zip
186
+ sudo yum install -y unzip
187
+ unzip demo.zip
188
+ cd demo
189
+ python3.9 -m venv $(pwd)/venv
190
+ source $(pwd)/venv/bin/activate
191
+ pip3 install -r requirements.txt
192
+ # 解决Python包版本兼容性问题
193
+ # 1. 卸载可能存在问题的包
194
+ pip3 uninstall -y aiohttp flask-socketio python-socketio
195
+ # 2. 安装已知兼容的特定版本
196
+ pip3 install aiohttp==3.8.1 flask-socketio==5.3.0 python-socketio==5.6.0
197
+ sed "s/socketio.run(app, debug=True, host='0.0.0.0')/socketio.run(app, debug=True, host='0.0.0.0', allow_unsafe_werkzeug=True)/" app-stream.py > temp_app_stream.py
198
+ mv temp_app_stream.py app-stream.py
199
+ rm -rf temp_app_stream.py
200
+ nohup python3.9 app-stream.py > app-stream.log 2>&1 &
201
+
202
+ echo "Step2: Deployment service" >> .ros.provision
203
+ else
204
+ echo "#########################"
205
+ echo "# Service deployed"
206
+ echo "#########################"
207
+ fi
208
+
209
+ echo "Deployment completed successfully!"
210
+ EOF
211
+ )
212
+ working_dir = " /root"
213
+ type = " RunShellScript"
214
+ timeout = 7200
215
+ }
216
+
217
+ # 调用命令资源
218
+ resource "alicloud_ecs_invocation" "invoke_script" {
219
+ instance_id = [alicloud_instance . ecs_instance . id ]
220
+ command_id = alicloud_ecs_command. run_command . id
221
+ timeouts {
222
+ create = " 120m"
223
+ }
224
+ }
0 commit comments