diff --git a/solution/tech-solution/lindorm-data-process/README.md b/solution/tech-solution/lindorm-data-process/README.md new file mode 100644 index 000000000..7b83ad676 --- /dev/null +++ b/solution/tech-solution/lindorm-data-process/README.md @@ -0,0 +1,44 @@ +## Introduction + +本示例用于实现解决方案[泛时序数据一站式分析与洞察](https://www.aliyun.com/solution/tech-solution/lindorm-data-process),涉及专有网络(VPC)、交换机(VSwitch)、云服务器(ECS)、云原生多模数据库 Lindorm(Lindorm)等资源的部署。 + + + +This example is used to implement solution [Unified Time-Series Data Analysis and Insights +](https://www.aliyun.com/solution/tech-solution/lindorm-data-process), which involves the creation and deployment of resources such as Virtual Private Cloud (VPC), Virtual Switch (VSwitch), Elastic Compute Service (ECS), Lindorm Database(Lindorm). + + + +## Providers + +| Name | Version | +|------|---------| +| [alicloud](#provider\_alicloud) | n/a | +| [random](#provider\_random) | n/a | + +## Modules + +No modules. + +## Resources + +| Name | Type | +|------|------| +| [alicloud_ecs_command.deploy_application_on_ecs_alicloud_ecs_command](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_command) | resource | +| [alicloud_ecs_invocation.deploy_application_on_ecs_alicloud_ecs_invocation](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_invocation) | resource | +| [alicloud_instance.ecs_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance) | resource | +| [alicloud_lindorm_instance.lindorm_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/lindorm_instance) | resource | +| [alicloud_security_group.security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | 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_string.lowercase](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string) | resource | +| [alicloud_images.alinux3](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source | +| [alicloud_zones.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/zones) | data source | + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| [instance\_password](#input\_instance\_password) | ECS实例密码 | `string` | n/a | yes | +| [instance\_type](#input\_instance\_type) | ECS实例类型 | `string` | `"ecs.e-c1m4.2xlarge"` | no | + \ No newline at end of file diff --git a/solution/tech-solution/lindorm-data-process/main.tf b/solution/tech-solution/lindorm-data-process/main.tf new file mode 100644 index 000000000..38944ac67 --- /dev/null +++ b/solution/tech-solution/lindorm-data-process/main.tf @@ -0,0 +1,134 @@ +# ------------------------------------------------------------------------------ +# 核心资源定义 +# +# 本文件包含了模块的核心基础设施资源 +# 这里的代码负责根据输入变量来创建和配置所有云资源 +# ------------------------------------------------------------------------------ + +# 配置阿里云提供商 +provider "alicloud" { + region = "cn-hangzhou" +} + +# 生成一个随机字符串 +# Generate a random string. +resource "random_string" "lowercase" { + length = 8 + special = false + upper = false + numeric = false +} + +# 定义本地变量 +locals { + common_name = "lindorm-demo-${random_string.lowercase.result}" + sorted_zone_ids = sort(data.alicloud_zones.default.ids) + max_zone_id = local.sorted_zone_ids[length(local.sorted_zone_ids) - 1] + + # 定义 ECS 启动命令 + ecs_command = <<-SHELL + #!/bin/bash + function log_info() { + printf "%s [INFO] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1" + } + function log_error() { + printf "%s [ERROR] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1" + } + function debug_exec(){ + local cmd="$@" + log_info "$cmd" + eval "$cmd" + ret=$? + echo "" + log_info "$cmd, exit code: $ret" + return $ret + } + function init_work(){ + yum upgrade & yum install -y python3 cryptography==3.4.8 + wget -O lindorm-cli-linux-latest.tar.gz https://tsdbtools.oss-cn-hangzhou.aliyuncs.com/lindorm-cli-linux-latest.tar.gz + tar zxvf lindorm-cli-linux-latest.tar.gz + } + debug_exec init_work + SHELL +} + +# 查询可用区 +data "alicloud_zones" "default" { + available_disk_category = "cloud_essd" + available_instance_type = var.instance_type +} + +# 创建专有网络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.0.0/24" + zone_id = local.max_zone_id + vswitch_name = "vsw-${local.common_name}" +} + +# 创建安全组 +resource "alicloud_security_group" "security_group" { + vpc_id = alicloud_vpc.vpc.id + security_group_name = "sg-${local.common_name}" +} + +# 查询最新的镜像 +data "alicloud_images" "alinux3" { + name_regex = "^aliyun_3_x64_*" + owners = "system" + most_recent = true + status = "Available" +} + +# 创建ECS实例 +resource "alicloud_instance" "ecs_instance" { + availability_zone = local.max_zone_id + vpc_id = alicloud_vpc.vpc.id + vswitch_id = alicloud_vswitch.vswitch.id + security_groups = [alicloud_security_group.security_group.id] + password = var.ecs_instance_password + instance_type = var.instance_type + instance_name = "ecs-${local.common_name}" + system_disk_category = "cloud_essd" + image_id = data.alicloud_images.alinux3.images[0].id + internet_max_bandwidth_out = 5 +} + +# 创建Lindorm实例 +resource "alicloud_lindorm_instance" "lindorm_instance" { + instance_storage = 160 + zone_id = local.max_zone_id + payment_type = "PayAsYouGo" + vswitch_id = alicloud_vswitch.vswitch.id + vpc_id = alicloud_vpc.vpc.id + search_engine_specification = "lindorm.g.xlarge" + search_engine_node_count = 2 + table_engine_specification = "lindorm.g.xlarge" + table_engine_node_count = 2 + disk_category = "cloud_efficiency" + instance_name = "lindorm-${local.common_name}" +} + +# 定义ECS命令资源 +resource "alicloud_ecs_command" "deploy_application_on_ecs_alicloud_ecs_command" { + type = "RunShellScript" + timeout = 300 + command_content = base64encode(local.ecs_command) + name = "auto-75ca2a13" + working_dir = "/root" +} + +# 创建ECS命令调用 +resource "alicloud_ecs_invocation" "deploy_application_on_ecs_alicloud_ecs_invocation" { + instance_id = [alicloud_instance.ecs_instance.id] + command_id = alicloud_ecs_command.deploy_application_on_ecs_alicloud_ecs_command.id + timeouts { + create = "60m" + } +} \ No newline at end of file diff --git a/solution/tech-solution/lindorm-data-process/output.tf b/solution/tech-solution/lindorm-data-process/output.tf new file mode 100644 index 000000000..00187b867 --- /dev/null +++ b/solution/tech-solution/lindorm-data-process/output.tf @@ -0,0 +1,38 @@ +# ------------------------------------------------------------------------------ +# 模块输出值 +# +# 本文件定义了模块执行成功后返回给调用方的值 +# 这些输出可以被其他 Terraform 配置引用,或在 apply 命令结束后显示给用户 +# ------------------------------------------------------------------------------ + +# 输出 Lindorm 实例 ID +output "lindorm_instance_id" { + value = alicloud_lindorm_instance.lindorm_instance.id + description = "Lindorm 实例 ID" +} + +# 输出 ECS 实例 ID +output "ecs_instance_id" { + value = alicloud_instance.ecs_instance.id + description = "ECS 实例 ID" +} + + +# 输出 ECS 登录地址 +output "ecs_login_address" { + description = "ECS登录地址" + value = format("https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs®ionId=%s&instanceId=%s", "cn-hangzhou", alicloud_instance.ecs_instance.id) +} + +# 输出 ECS 实例用户名 +output "ecs_instance_username" { + value = "root" + description = "ECS 实例用户名" +} + +# 输出 ECS 实例密码 +output "ecs_instance_password" { + value = var.ecs_instance_password + sensitive = true + description = "ECS 实例密码" +} \ No newline at end of file diff --git a/solution/tech-solution/lindorm-data-process/variable.tf b/solution/tech-solution/lindorm-data-process/variable.tf new file mode 100644 index 000000000..0f85a4c15 --- /dev/null +++ b/solution/tech-solution/lindorm-data-process/variable.tf @@ -0,0 +1,25 @@ +# ------------------------------------------------------------------------------ +# 模块输入变量 +# +# 本文件定义了该 Terraform 模块所有可配置的输入变量 +# 每个变量都包含了详细的说明,以帮助用户正确配置模块 +# ------------------------------------------------------------------------------ + +# 指定ECS实例的规格型号 +variable "instance_type" { + type = string + description = "ECS实例类型" + default = "ecs.e-c1m4.2xlarge" +} + +# ECS实例密码 +variable "ecs_instance_password" { + type = string + sensitive = true + validation { + condition = can(regex("^[0-9A-Za-z_!@#$%^&*()_+\\-=\\+]+$", var.ecs_instance_password)) && length(var.ecs_instance_password) >= 8 && length(var.ecs_instance_password) <= 30 + error_message = "长度8-30,必须包含三项(大写字母、小写字母、数字、 !@#$%^&*()_+-=中的特殊符号)" + } + description = "ECS实例密码" + #default = "" +} \ No newline at end of file