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 . bai_lian_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