Skip to content

Commit b63154a

Browse files
author
承虔
committed
Update app_id variable name to bai_lian_app_id for consistency and set default value for zone_id
1 parent c95d64a commit b63154a

File tree

3 files changed

+324
-0
lines changed

3 files changed

+324
-0
lines changed
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
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+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
output "web_url" {
2+
description = "Web 访问地址"
3+
value = format("http://%s:5000/home", alicloud_instance.ecs_instance.public_ip)
4+
}
5+
6+
output "ecs_login_address" {
7+
description = "ECS登录地址"
8+
value = format("https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=%s&instanceId=%s",
9+
data.alicloud_regions.current_region_ds.regions[0].id,
10+
alicloud_instance.ecs_instance.id)
11+
}
12+
13+
output "vpc_id" {
14+
description = "VPC ID"
15+
value = alicloud_vpc.vpc.id
16+
}
17+
18+
output "vswitch_id" {
19+
description = "VSwitch ID"
20+
value = alicloud_vswitch.vswitch.id
21+
}
22+
23+
output "security_group_id" {
24+
description = "安全组ID"
25+
value = alicloud_security_group.security_group.id
26+
}
27+
28+
output "ecs_instance_id" {
29+
description = "ECS实例ID"
30+
value = alicloud_instance.ecs_instance.id
31+
}
32+
33+
output "ecs_public_ip" {
34+
description = "ECS公网IP"
35+
value = alicloud_instance.ecs_instance.public_ip
36+
}
37+
38+
output "analyticdb_instance_id" {
39+
description = "AnalyticDB实例ID"
40+
value = alicloud_gpdb_instance.analyticdb.id
41+
}
42+
43+
output "analyticdb_connection_string" {
44+
description = "AnalyticDB连接字符串"
45+
value = alicloud_gpdb_instance.analyticdb.connection_string
46+
}
47+
48+
output "region_id" {
49+
description = "部署区域ID"
50+
value = data.alicloud_regions.current_region_ds.regions[0].id
51+
}
52+
53+
output "zone_id" {
54+
description = "部署可用区ID"
55+
value = var.zone_id
56+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
variable "region" {
2+
type = string
3+
default = "cn-hangzhou"
4+
description = "地域,例如:cn-hangzhou。所有地域及可用区请参见文档:https://help.aliyun.com/document_detail/40654.html#09f1dc16b0uke"
5+
}
6+
7+
variable "zone_id" {
8+
type = string
9+
description = "可用区ID"
10+
default = "cn-hangzhou-h"
11+
}
12+
13+
variable "bai_lian_api_key" {
14+
type = string
15+
description = "百炼 API-KEY,需开通百炼模型服务再获取 API-KEY,详情请参考:https://help.aliyun.com/zh/model-studio/developer-reference/get-api-key"
16+
}
17+
18+
variable "bai_lian_app_id" {
19+
type = string
20+
description = "百炼应用的应用ID"
21+
}
22+
23+
variable "instance_type" {
24+
type = string
25+
description = "ECS实例规格"
26+
default = "ecs.g6.large"
27+
}
28+
29+
variable "ecs_instance_password" {
30+
type = string
31+
sensitive = true
32+
description = "服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)"
33+
34+
validation {
35+
condition = length(var.ecs_instance_password) >= 8 && length(var.ecs_instance_password) <= 30
36+
error_message = "密码长度必须在8-30位之间"
37+
}
38+
}
39+
40+
variable "common_name" {
41+
type = string
42+
description = "资源名称前缀"
43+
default = "RAG"
44+
}

0 commit comments

Comments
 (0)