diff --git a/solution/tech-solution/polardb-ai-search/README.md b/solution/tech-solution/polardb-ai-search/README.md new file mode 100644 index 000000000..c71c717ae --- /dev/null +++ b/solution/tech-solution/polardb-ai-search/README.md @@ -0,0 +1,47 @@ +## Introduction + +本示例用于实现解决方案[原生 SQL 轻松实现多模态智能检索](https://www.aliyun.com/solution/tech-solution/polardb-ai-search),涉及专有网络(VPC)、交换机(VSwitch)、PolarDB数据库(PolarDB)、对象存储服务(OSS)等资源的部署。 + + + +This example is used to implement solution [Native SQL enables effortless multimodal intelligent search](https://www.aliyun.com/solution/tech-solution/polardb-ai-search), which involves the creation and deployment of resources such as Virtual Private Cloud (VPC), Virtual Switch (VSwitch), PolarDB Database (PolarDB), Object Storage Service (OSS). + + + +## Providers + +| Name | Version | +|------|---------| +| [alicloud](#provider\_alicloud) | n/a | +| [random](#provider\_random) | n/a | + +## Modules + +No modules. + +## Resources + +| Name | Type | +|------|------| +| [alicloud_oss_bucket.ossbucket](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/oss_bucket) | resource | +| [alicloud_polardb_account.account](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/polardb_account) | resource | +| [alicloud_polardb_cluster.polardb_cluster](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/polardb_cluster) | resource | +| [alicloud_polardb_database.polardb_database](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/polardb_database) | resource | +| [alicloud_polardb_endpoint_address.dbcluster_endpoint_address](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/polardb_endpoint_address) | resource | +| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource | +| [alicloud_vswitch.vswitch](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource | +| [random_id.suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource | +| [random_string.lowercase](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string) | resource | +| [alicloud_oss_service.open_oss](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/oss_service) | data source | +| [alicloud_polardb_endpoints.polardb_endpoints](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/polardb_endpoints) | data source | +| [alicloud_polardb_node_classes.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/polardb_node_classes) | data source | + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| [account\_name](#input\_account\_name) | account\_name | `string` | `"polar_ai"` | no | +| [bucket\_name](#input\_bucket\_name) | bucket\_name,在同一可用区下请保持唯一 | `string` | `"test-bucket-polar"` | no | +| [db\_password](#input\_db\_password) | account\_password | `string` | n/a | yes | +| [dbname](#input\_dbname) | dbname | `string` | `"db-test"` | no | + \ No newline at end of file diff --git a/solution/tech-solution/polardb-ai-search/main.tf b/solution/tech-solution/polardb-ai-search/main.tf new file mode 100644 index 000000000..051a8121b --- /dev/null +++ b/solution/tech-solution/polardb-ai-search/main.tf @@ -0,0 +1,110 @@ +# ------------------------------------------------------------------------------ +# 核心资源定义 +# +# 本文件包含了模块的核心基础设施资源 +# 这里的代码负责根据输入变量来创建和配置所有云资源 +# ------------------------------------------------------------------------------ + +# 配置阿里云提供商 +provider "alicloud" { + region = "cn-beijing" +} + +# 创建随机字符串用于命名 +resource "random_string" "lowercase" { + length = 8 + special = false + upper = false + numeric = false +} + +# 创建随机ID用于命名 +resource "random_id" "suffix" { + byte_length = 8 +} + +# 定义本地变量用于统一命名 +locals { + common_name = "SmartSearch-${random_id.suffix.id}" +} + +# 查询可用区 +data "alicloud_polardb_node_classes" "default" { + db_type = "PostgreSQL" + pay_type = "PostPaid" + category = "SENormal" +} + +# 创建VPC +resource "alicloud_vpc" "vpc" { + cidr_block = "192.168.0.0/16" + vpc_name = "VPC_${local.common_name}" +} + +# 创建VSwitch +resource "alicloud_vswitch" "vswitch" { + vpc_id = alicloud_vpc.vpc.id + cidr_block = "192.168.1.0/24" + zone_id = data.alicloud_polardb_node_classes.default.classes[0].zone_id + vswitch_name = "vsw_001_${local.common_name}" +} + +# 创建PolarDB集群 +resource "alicloud_polardb_cluster" "polardb_cluster" { + vpc_id = alicloud_vpc.vpc.id + db_type = "PostgreSQL" + vswitch_id = alicloud_vswitch.vswitch.id + db_version = "14" + creation_category = "SENormal" + storage_space = 20 + hot_standby_cluster = "OFF" + db_node_class = "polar.pg.g2.2xlarge.c" + pay_type = "PostPaid" + storage_type = "ESSDPL1" + security_ips = ["0.0.0.0/0"] + db_node_num = 2 +} + +# 创建PolarDB账户 +resource "alicloud_polardb_account" "account" { + db_cluster_id = alicloud_polardb_cluster.polardb_cluster.id + account_name = var.account_name + account_password = var.db_password + account_type = "Super" +} + +# 查询PolarDB端点信息 +data "alicloud_polardb_endpoints" "polardb_endpoints" { + db_cluster_id = alicloud_polardb_cluster.polardb_cluster.id +} + +# 创建PolarDB端点地址 +# Create PolarDB endpoint address +resource "alicloud_polardb_endpoint_address" "dbcluster_endpoint_address" { + db_endpoint_id = data.alicloud_polardb_endpoints.polardb_endpoints.endpoints[0].db_endpoint_id + db_cluster_id = alicloud_polardb_cluster.polardb_cluster.id + net_type = "Public" + depends_on = [ + alicloud_polardb_account.account + ] +} + +# 创建PolarDB数据库 +resource "alicloud_polardb_database" "polardb_database" { + db_cluster_id = alicloud_polardb_cluster.polardb_cluster.id + db_name = var.dbname + character_set_name = "utf8" + account_name = var.account_name +} + +# 启用OSS服务 +data "alicloud_oss_service" "open_oss" { + enable = "On" +} + +# 创建OSS存储桶 +resource "alicloud_oss_bucket" "ossbucket" { + bucket = "${var.bucket_name}-${random_string.lowercase.result}" + force_destroy = true + redundancy_type = "ZRS" +} \ No newline at end of file diff --git a/solution/tech-solution/polardb-ai-search/output.tf b/solution/tech-solution/polardb-ai-search/output.tf new file mode 100644 index 000000000..f7095889d --- /dev/null +++ b/solution/tech-solution/polardb-ai-search/output.tf @@ -0,0 +1,37 @@ +# ------------------------------------------------------------------------------ +# 模块输出值 +# +# 本文件定义了模块执行成功后返回给调用方的值 +# 这些输出可以被其他 Terraform 配置引用,或在 apply 命令结束后显示给用户 +# ------------------------------------------------------------------------------ + +# 输出OSS存储桶名 +output "bucket_name" { + value = alicloud_oss_bucket.ossbucket.bucket + description = "对象存储存储桶名" +} + +# 输出PolarDB数据库用户名 +output "account_name" { + value = var.account_name + description = "PolarDB 数据库用户名" +} + +# 输出PolarDB数据库密码 +output "account_password" { + value = var.db_password + sensitive = true + description = "PolarDB 数据库密码" +} + +# 输出PolarDB数据库名称 +output "dbname" { + value = var.dbname + description = "PolarDB 数据库名称" +} + +# 输出PolarDB数据库公网地址 +output "connection_string" { + value = format("%s:5432", alicloud_polardb_endpoint_address.dbcluster_endpoint_address.connection_string) + description = "PolarDB 数据库的公网地址" +} \ No newline at end of file diff --git a/solution/tech-solution/polardb-ai-search/variable.tf b/solution/tech-solution/polardb-ai-search/variable.tf new file mode 100644 index 000000000..87882a23b --- /dev/null +++ b/solution/tech-solution/polardb-ai-search/variable.tf @@ -0,0 +1,47 @@ +# ------------------------------------------------------------------------------ +# 模块输入变量 +# +# 本文件定义了该 Terraform 模块所有可配置的输入变量 +# 每个变量都包含了详细的说明,以帮助用户正确配置模块 +# ------------------------------------------------------------------------------ + +# OSS存储桶名称 +variable "bucket_name" { + type = string + description = "bucket_name,在同一可用区下请保持唯一" + default = "test-bucket-polar" +} + +# PolarDB数据库用户名 +variable "account_name" { + type = string + default = "polar_ai" + description = "account_name" + validation { + condition = can(regex("^[a-z][a-z0-9_]{0,30}[a-z0-9]$", var.account_name)) + error_message = "数据库用户名必须以字母开头,以字母或数字结尾,只能包含字母、数字和下划线最多32个字符" + } +} + +# PolarDB数据库密码 +variable "db_password" { + type = string + sensitive = true + description = "account_password" + #default = "" + validation { + condition = can(regex("^[0-9A-Za-z_!@#$%^&*()_+\\-=\\+]+$", var.db_password)) && length(var.db_password) >= 8 && length(var.db_password) <= 30 + error_message = "长度8-30,必须包含三项(大写字母、小写字母、数字、 !@#$%^&*()_+-=中的特殊符号)" + } +} + +# PolarDB数据库名称 +variable "dbname" { + type = string + default = "db-test" + description = "dbname" + validation { + condition = can(regex("^[a-z][a-z0-9_-]{0,62}[a-z0-9]$", var.dbname)) + error_message = "由小写字母、数字、中划线(-)、下划线(_)组成,小写字母或数字结尾,以字母开头,以字母或数字结尾,最长 64 个字符" + } +} \ No newline at end of file