Skip to content

feat: 解决方案elastic-application-with-ess tf文件完成 #341

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions solution/tech-solution/improve-app-availability/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
## Introduction
<!-- DOCS_DESCRIPTION_CN -->
本示例用于实现解决方案[自动弹性,稳定交付](https://www.aliyun.com/solution/tech-solution/improve-app-availability), 涉及到专有网络(VPC)、交换机(VSwitch)、云服务器(ECS)、应用型负载均衡器(ALB) 、弹性伸缩(ESS)等资源的部署。
<!-- DOCS_DESCRIPTION_CN -->

<!-- DOCS_DESCRIPTION_EN -->
This example is used to implement solution [Auto Scaling and Stable Delivery](https://www.aliyun.com/solution/tech-solution/improve-app-availability), which involves the creation and deployment of resources such as Virtual Private Cloud (VPC), VSwitch, Elastic Compute Service (ECS), Application Load Balancer (ALB), and Elastic Scaling Service (ESS).
<!-- DOCS_DESCRIPTION_EN -->

<!-- BEGIN_TF_DOCS -->
## Providers

| Name | Version |
|------|---------|
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | n/a |
| <a name="provider_random"></a> [random](#provider\_random) | n/a |

## Modules

No modules.

## Resources

| Name | Type |
|------|------|
| [alicloud_alb_listener.alb_listener](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/alb_listener) | resource |
| [alicloud_alb_load_balancer.alb](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/alb_load_balancer) | resource |
| [alicloud_alb_server_group.alb_server_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/alb_server_group) | resource |
| [alicloud_ess_scaling_configuration.ess_scaling_configuration](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ess_scaling_configuration) | resource |
| [alicloud_ess_scaling_group.ess_scaling_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ess_scaling_group) | resource |
| [alicloud_ess_scaling_rule.ess_scale_down_rule](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ess_scaling_rule) | resource |
| [alicloud_ess_scaling_rule.ess_scale_up_rule](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ess_scaling_rule) | resource |
| [alicloud_ess_scheduled_task.scheduled_scale_down_task](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ess_scheduled_task) | resource |
| [alicloud_ess_scheduled_task.scheduled_scale_up_task](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ess_scheduled_task) | resource |
| [alicloud_ess_server_group_attachment.ess_server_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ess_server_group_attachment) | resource |
| [alicloud_security_group.security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
| [alicloud_security_group_rule.security_group_http](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
| [alicloud_security_group_rule.security_group_https](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
| [alicloud_vswitch.alb_vswitch_3](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
| [alicloud_vswitch.alb_vswitch_4](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
| [alicloud_vswitch.ecs_vswitch_1](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
| [alicloud_vswitch.ecs_vswitch_2](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
| [random_integer.default](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/integer) | resource |
| [alicloud_alb_zones.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/alb_zones) | data source |
| [alicloud_images.instance_image](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source |
| [alicloud_instance_types.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/instance_types) | 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 |
|------|-------------|------|---------|:--------:|
| <a name="input_common_name"></a> [common\_name](#input\_common\_name) | 弹性应用名称 | `string` | `"elastic-app"` | no |
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/中的特殊符号)` | `string` | n/a | yes |
| <a name="input_region"></a> [region](#input\_region) | 地域 | `string` | `"cn-hangzhou"` | no |
| <a name="input_scale_down_time"></a> [scale\_down\_time](#input\_scale\_down\_time) | 自动缩容执行时间 | `string` | `null` | no |
| <a name="input_scale_up_time"></a> [scale\_up\_time](#input\_scale\_up\_time) | 自动扩容执行时间 | `string` | `null` | no |
<!-- END_TF_DOCS -->
233 changes: 233 additions & 0 deletions solution/tech-solution/improve-app-availability/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
data "alicloud_instance_types" "default" {
instance_type_family = "ecs.g7"
}

data "alicloud_zones" "default" {
available_instance_type = data.alicloud_instance_types.default.ids.0
}

data "alicloud_alb_zones" "default" {}

data "alicloud_images" "instance_image" {
name_regex = "^aliyun_3_9_x64_20G_*"
most_recent = true
owners = "system"
}

# 创建VPC
resource "alicloud_vpc" "vpc" {
vpc_name = var.common_name
cidr_block = "192.168.0.0/16"
}

# 创建VSwitch1
resource "alicloud_vswitch" "ecs_vswitch_1" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = "192.168.1.0/24"
zone_id = data.alicloud_zones.default.ids.0
vswitch_name = "${var.common_name}-vsw"
}

# 创建VSwitch2
resource "alicloud_vswitch" "ecs_vswitch_2" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = "192.168.2.0/24"
zone_id = data.alicloud_zones.default.ids.1
vswitch_name = "${var.common_name}-vsw"
}

# 创建VSwitch3
resource "alicloud_vswitch" "alb_vswitch_3" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = "192.168.3.0/24"
zone_id = data.alicloud_alb_zones.default.ids.0
vswitch_name = "${var.common_name}-vsw"
}

# 创建VSwitch4
resource "alicloud_vswitch" "alb_vswitch_4" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = "192.168.4.0/24"
zone_id = data.alicloud_alb_zones.default.ids.1
vswitch_name = "${var.common_name}-vsw"
}

# 创建安全组
resource "alicloud_security_group" "security_group" {
security_group_name = "${var.common_name}-sg"
vpc_id = alicloud_vpc.vpc.id
}

# 添加安全组规则 - HTTP
resource "alicloud_security_group_rule" "security_group_http" {
security_group_id = alicloud_security_group.security_group.id
type = "ingress"
ip_protocol = "tcp"
port_range = "80/80"
cidr_ip = "0.0.0.0/0"
}

# 添加安全组规则 - HTTPS
resource "alicloud_security_group_rule" "security_group_https" {
security_group_id = alicloud_security_group.security_group.id
type = "ingress"
ip_protocol = "tcp"
port_range = "443/443"
cidr_ip = "0.0.0.0/0"
}

# 创建ALB负载均衡器
resource "alicloud_alb_load_balancer" "alb" {
load_balancer_name = "${var.common_name}-alb"
load_balancer_edition = "Basic"
address_allocated_mode = "Fixed"
vpc_id = alicloud_vpc.vpc.id
address_type = "Internet"

load_balancer_billing_config {
pay_type = "PayAsYouGo"
}

zone_mappings {
zone_id = data.alicloud_alb_zones.default.ids.0
vswitch_id = alicloud_vswitch.alb_vswitch_3.id
}

zone_mappings {
zone_id = data.alicloud_alb_zones.default.ids.1
vswitch_id = alicloud_vswitch.alb_vswitch_4.id
}
}

# 创建ALB服务器组
resource "alicloud_alb_server_group" "alb_server_group" {
server_group_name = "${var.common_name}-server-group"
vpc_id = alicloud_vpc.vpc.id
protocol = "HTTP"

health_check_config {
health_check_enabled = true
health_check_protocol = "HTTP"
health_check_path = "/"
health_check_codes = ["http_2xx", "http_3xx"]
health_check_connect_port = 80
}

sticky_session_config {
sticky_session_enabled = false
}

lifecycle {
ignore_changes = [servers]
}
}

# 创建ALB监听器
resource "alicloud_alb_listener" "alb_listener" {
listener_protocol = "HTTP"
listener_port = 80
load_balancer_id = alicloud_alb_load_balancer.alb.id

default_actions {
type = "ForwardGroup"
forward_group_config {
server_group_tuples {
server_group_id = alicloud_alb_server_group.alb_server_group.id
}
}
}
}

resource "random_integer" "default" {
min = 10000
max = 99999
}

# 创建ESS伸缩组,min_size设置为2,在伸缩组启用后,会自动创建两台ECS实例
resource "alicloud_ess_scaling_group" "ess_scaling_group" {
scaling_group_name = "${var.common_name}-scaling-group-${random_integer.default.result}"
min_size = 2
max_size = 5
vswitch_ids = [alicloud_vswitch.ecs_vswitch_1.id, alicloud_vswitch.ecs_vswitch_2.id]
removal_policies = ["NewestInstance"]
default_cooldown = 300
multi_az_policy = "COMPOSABLE"
az_balance = true
depends_on = [alicloud_security_group.security_group]
}

# 配置ESS服务器组关联
resource "alicloud_ess_server_group_attachment" "ess_server_group" {
scaling_group_id = alicloud_ess_scaling_group.ess_scaling_group.id
server_group_id = alicloud_alb_server_group.alb_server_group.id
port = 80
type = "ALB"
weight = 100
force_attach = true
}

locals {
instance_user_data = <<-SHELL
#!/bin/bash
yum -y install nginx-1.20.1
instanceId=`curl http://100.100.100.200/latest/meta-data/instance-id`
echo "This instance from ess, the instance id is $instanceId" > /usr/share/nginx/html/index.html
systemctl start nginx
systemctl enable nginx
SHELL
}

# 创建ESS伸缩配置
resource "alicloud_ess_scaling_configuration" "ess_scaling_configuration" {
scaling_group_id = alicloud_ess_scaling_group.ess_scaling_group.id
enable = true
active = true
force_delete = true
image_id = data.alicloud_images.instance_image.images[0].id
instance_types = [data.alicloud_instance_types.default.ids.0]
security_group_id = alicloud_security_group.security_group.id
system_disk_category = "cloud_essd"
system_disk_size = 40
password = var.ecs_instance_password
instance_name = "${var.common_name}-ess"
user_data = local.instance_user_data
}

# 创建ESS伸缩规则(扩容)
resource "alicloud_ess_scaling_rule" "ess_scale_up_rule" {
scaling_group_id = alicloud_ess_scaling_group.ess_scaling_group.id
scaling_rule_name = "${var.common_name}-asr-scale_up_rule"
scaling_rule_type = "SimpleScalingRule"
adjustment_type = "QuantityChangeInCapacity"
adjustment_value = 1
cooldown = 60
}

# 创建ESS伸缩规则(缩容)
resource "alicloud_ess_scaling_rule" "ess_scale_down_rule" {
scaling_group_id = alicloud_ess_scaling_group.ess_scaling_group.id
scaling_rule_name = "${var.common_name}-asr-scale_down_rule"
scaling_rule_type = "SimpleScalingRule"
adjustment_type = "QuantityChangeInCapacity"
adjustment_value = -1
cooldown = 60
}

resource "time_static" "example" {}

# 创建定时任务(自动扩容)
resource "alicloud_ess_scheduled_task" "scheduled_scale_up_task" {
scheduled_task_name = "${var.common_name}-scale_up_task-${random_integer.default.result}"
launch_time = var.scale_up_time != null && var.scale_up_time != "" ? var.scale_up_time : formatdate("YYYY-MM-DD'T'HH:mm'Z'", timeadd(time_static.example.rfc3339, "1h"))
scheduled_action = alicloud_ess_scaling_rule.ess_scale_up_rule.ari
launch_expiration_time = 10
}

# 创建定时任务(自动缩容)
resource "alicloud_ess_scheduled_task" "scheduled_scale_down_task" {
scheduled_task_name = "${var.common_name}-scale_down_task-${random_integer.default.result}"
launch_time = var.scale_down_time != null && var.scale_down_time != "" ? var.scale_down_time : formatdate("YYYY-MM-DD'T'HH:mm'Z'", timeadd(time_static.example.rfc3339, "2h"))
scheduled_action = alicloud_ess_scaling_rule.ess_scale_down_rule.ari
launch_expiration_time = 10
}

10 changes: 10 additions & 0 deletions solution/tech-solution/improve-app-availability/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# 输出负载均衡地址
output "WebUrl" {
description = <<EOT
{
"zh-cn": "Web 访问地址。",
"en": "The Addresses of Web."
}
EOT
value = format("http://%s", alicloud_alb_load_balancer.alb.dns_name)
}
3 changes: 3 additions & 0 deletions solution/tech-solution/improve-app-availability/provider.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
provider "alicloud" {
region = var.region
}
29 changes: 29 additions & 0 deletions solution/tech-solution/improve-app-availability/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
variable "region" {
description = "地域"
type = string
default = "cn-hangzhou"
}

variable "common_name" {
description = "弹性应用名称"
type = string
default = "elastic-app"
}

variable "ecs_instance_password" {
description = "服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/中的特殊符号)"
type = string
sensitive = true
}

variable "scale_up_time" {
description = "自动扩容执行时间"
type = string
default = null
}

variable "scale_down_time" {
description = "自动缩容执行时间"
type = string
default = null
}
Loading