SLBを利用したECSサーバ基盤

作成日:2021-05-10

SLBを利用したECSサーバ基盤の構築

  SLB(Server Load Balancer)は、外部インターネット、もしくは内部イントラネットからパブリックIPまたはプライベートIPへ届くインバウンドトラフィックを予め設定したSLBの転送ルールに従って、複数のECSインスタンス間のインバウンドトラフィックを分散および制御し、アプリケーションの可用性を高めるサービスです。SLBを使うことで、以下のメリットがあります。

  • 高可用性・・・完全冗長モードとして障害や災害時でもで稼働します。
  • スケーラブル・・・サービスニーズに合わせて必要な台数分へサーバを増減します。
  • 費用対効果・・・必要なリソースの分だけ使用なので、通常の負荷分散ハードウェアと比べてコスト削減します。
  • セキュリティ・・・SLBはトラフィックを分散するだけでなくHTTP Flood攻撃やSYN Flood攻撃など、最大5GbitsのDDoS攻撃から防御できます。

SLBのより詳しい詳細はこちらを参照ください。

構成図

  TerraformでSLBを使ったECSインスタンスを作成してみます。ゴールの構成図は以下の通りです。

図 1

パラメータ構成

それぞれのパラメータは以下の通りです。

ネットワーク構成:

リソースリソース名パラメータ必須設定値内容
alicloud_vpcvpcvpc_name任意${var.project_name}-vpcVPC の名称。この例の場合、SLB-Sample-for-Terraform-vpc として表示されます。
vpccidr_block必須192.168.1.0/24VPC の CIDR ブロック
vpcdescription任意Enable SLB-Setteing-Sample vpcVPC の説明。
alicloud_vswitchvswvswitch_name任意${var.project_name}-vswitchvswitch の名称。この例の場合、SLB-Sample-for-Terraform-vswitch として表示されます。
vswvpc_id必須${alicloud_vpc.vpc.id}アタッチするVPCのID
vswcidr_block必須192.168.1.0/28vswitch の CIDR ブロック
vswzone_id必須${var.zone}使用するアベイラビリティゾーン
vswdescription任意Enable SLB-Setteing-Sample vswitchvswitch の説明。

ECSインスタンスセキュリティグループ構成:

リソースリソース名パラメータ必須設定値内容
alicloud_security_groupsgname任意${var.project_name}_sg"セキュリティグループ の名称。この例の場合、SLB-Sample-for-Terraform_sgとして表示されます。
sgvpc_id必須${alicloud_vpc.vpc.id}アタッチするVPCのID
sgdescription任意Enable SSH access via port 22セキュリティグループ の説明。
alicloud_security_group_ruleallow_httptype必須ingressセキュリティグループのタイプ。 ingress(受信) かegress(送信) のいずれかになります。
allow_httpip_protocol必須tcp通信プロトコル。 tcp, udp, icmp, gre, all のいずれかになります。
allow_httpnic_type必須intranetネットワークタイプ。 internet か intranet のいずれかになります。
allow_httppolicy必須accept許可ポリシー。 acceptか drop のいずれかになります。
allow_httpport_range必須80⁄80通信プロトコルのポート範囲。値が「- 1/-1」の場合は無効になります。
allow_httppriority必須1許可ポリシーの優先順位。
allow_httpsecurity_group_id必須${alicloud_security_group.sg.id}アタッチするセキュリティグループのID
allow_httpcidr_ip任意0.0.0.0/0ターゲットとなるIPアドレス。デフォルトは「0.0.0.0/0」。値が「0.0.0.0/0」の場合は無制限状態となります。

ECSインスタンス構成:

リソースリソース名パラメータ必須設定値内容
alicloud_instanceECS_instance_for_SLB_Sampleinstance_name任意${var.project_name}-ECS-instanceECSインスタンスの名称。この例の場合、SLB-Sample-for-Terraform-ECS-instance として表示されます。
ECS_instance_for_SLB_Samplehost_name任意${var.project_name}-ECS-instanceECSインスタンスのHost名称。この例の場合、SLB-Sample-for-Terraform-ECS-instance として表示されます。
ECS_instance_for_SLB_Sampleinstance_type必須ecs.sn1.mediumECSインスタンスのタイプ。今回は ecs.sn1.mediumを選定します。
ECS_instance_for_SLB_Sampleimage_id必須centos_7_04_64_20G_alibase_201701015.vhdECSインスタンスのImageID。今回は centos_7_04_64_20G_alibase_201701015.vhd を選定します。
ECS_instance_for_SLB_Samplesystem_disk_category任意cloud_efficiencyECSインスタンスのディスクタイプ。デフォルトは cloud_efficiency です。
ECS_instance_for_SLB_Samplesecurity_groups必須”${alicloud_security_group.sg.id}”アタッチするセキュリティグループのID
ECS_instance_for_SLB_Sampleavailability_zone必須${var.zone}使用するアベイラビリティゾーン
ECS_instance_for_SLB_Samplevswitch_id必須${alicloud_vswitch.vsw.id}アタッチするVSwitchのID
ECS_instance_for_SLB_Samplepassword任意"${var.ecs_password}"EC インスタンスのログインパスワード。
ECS_instance_for_SLB_Sampleinternet_max_bandwidth_out任意5パブリックネットワークへの最大帯域幅。デフォルトは0ですが、0より大きい値を入れるとパブリックIPアドレスがアタッチされます。
ECS_instance_for_SLB_Sampleuser_data任意"${file("provisioning.sh")}"ECSインスタンス起動後に実行するshell内容もしくはファイル名。今回はprovisioning.shにて記載しています。

SLB構成:

リソースリソース名パラメータ必須設定値内容
alicloud_slb_load_balancerdefaultload_balancer_name任意"${var.project_name}-slb"SLBの名称。この例の場合、SLB-Sample-for-Terraform-slb として表示されます。
defaultaddress_type必須internetSLB addressのインターネットタイプ。internetのインターネットにするか、intranetのイントラネットいずれかになります。
defaultinternet_charge_type必須paybytrafficインターネットチェンジタイプ。PayByBandwidth、PayByTrafficのいずれかになります。
defaultbandwidth任意5最大帯域幅。
defaultload_balancer_spec任意slb.s2.smallSLBのタイプ。今回は slb.s2.smallを選定します。
alicloud_slb_listenertcp_httpload_balancer_id必須"${alicloud_slb_load_balancer.slb.id}"新しいリスナーを起動するために使用されるロードバランサID。
tcp_httpbackend_port必須80Server Load Balancerインスタンスバックエンドが使用するポート。
tcp_httpfrontend_port必須80Server Load Balancerインスタンスフロントエンドが使用するポート。
tcp_httpprotocol必須"tcp"使用するプロトコル。http、https、tcp、udpのいずれかになります。
tcp_httpbandwidth任意10Listenerの最大帯域幅。
tcp_httphealth_check_type任意"tcp"ヘルスチェックのタイプ。tcpとhttpのいずれかになります。
alicloud_slb_attachmentslb_attachmentload_balancer_id必須"${alicloud_slb_load_balancer.slb.id}"ロードバランサID。
slb_attachmentinstance_ids必須"${alicloud_instance.ECS_instance_for_SLB_Sample.*.id}"アタッチするECSインスタンスID。

ソース

ソースは以下になります。

main.tf

provider "alicloud" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}
resource "alicloud_vpc" "vpc" {
vpc_name = "${var.project_name}-vpc"
cidr_block = "192.168.1.0/24"
description = "Enable SLB-Setteing-Sample vpc"
}
resource "alicloud_vswitch" "vsw" {
vswitch_name = "${var.project_name}-vswitch"
vpc_id = "${alicloud_vpc.vpc.id}"
cidr_block = "192.168.1.0/28"
zone_id = "${var.zone}"
description = "Enable SLB-Setteing-Sample vswitch"
}
resource "alicloud_security_group" "sg" {
name = "${var.project_name}_sg"
description = "Marker security group for SLB-Setteing-Sample"
vpc_id = "${alicloud_vpc.vpc.id}"
}
resource "alicloud_security_group_rule" "allow_http" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "80/80"
priority = 1
security_group_id = "${alicloud_security_group.sg.id}"
cidr_ip = "0.0.0.0/0"
}
resource "alicloud_instance" "ECS_instance_for_SLB_Sample" {
instance_name = "${var.project_name}-ECS-instance"
host_name = "${var.project_name}-ECS-instance"
instance_type = "ecs.sn1.medium"
image_id = "centos_7_04_64_20G_alibase_201701015.vhd"
system_disk_category = "cloud_efficiency"
count = 2
security_groups = ["${alicloud_security_group.sg.id}"]
availability_zone = "${var.zone}"
vswitch_id = "${alicloud_vswitch.vsw.id}"
internet_max_bandwidth_out = 5
password = "${var.ecs_password}"
user_data = "${file("provisioning.sh")}"
}
resource "alicloud_slb_load_balancer" "default" {
load_balancer_name = "${var.project_name}-slb"
address_type = "internet"
internet_charge_type = "paybytraffic"
bandwidth = 5
load_balancer_spec = "slb.s2.small"
}
resource "alicloud_slb_listener" "tcp_http" {
load_balancer_id = "${alicloud_slb_load_balancer.default.id}"
backend_port = "80"
frontend_port = "80"
protocol = "tcp"
bandwidth = "10"
health_check_type = "tcp"
}
resource "alicloud_slb_attachment" "slb_attachment" {
load_balancer_id = "${alicloud_slb_load_balancer.default.id}"
instance_ids = "${alicloud_instance.ECS_instance_for_SLB_Sample.*.id}"
}

variables.tf

variable "access_key" {}
variable "secret_key" {}
variable "region" {}
variable "zone" {}
variable "project_name" {}
variable "ecs_password" {}

output.tf

output "ECS_instance_ip" {
value = "${alicloud_instance.ECS_instance_for_SLB_Sample.*.public_ip}"
}
output "slb_ip" {
value = "${alicloud_slb_load_balancer.default.address}"
}

confing.tfvars

access_key = "xxxxxxxxxxxxxxxx"
secret_key = "xxxxxxxxxxxxxxxx"
region = "ap-northeast-1"
zone = "ap-northeast-1a"
project_name = "SLB-Sample-for-Terraform"
ecs_password = "!Password2019"

provisioning.sh

#!/bin/sh
yum install -y httpd
systemctl start httpd
systemctl enable httpd

実行

  ソースの準備ができたら実行します。

terraform init
terraform plan -var-file="confing.tfvars"
terraform apply -var-file="confing.tfvars"

これで完了です。問題なく実行できたら、ECSとSLBのIPが表示されます。

alicloud_instance.ECS_instance_for_SLB_Sample.0: Still creating... (40s elapsed)
alicloud_instance.ECS_instance_for_SLB_Sample.1: Still creating... (40s elapsed)
alicloud_instance.ECS_instance_for_SLB_Sample[1]: Creation complete after 46s (ID: i-6web68sjtatfqyq2mdd7)
alicloud_instance.ECS_instance_for_SLB_Sample.0: Still creating... (50s elapsed)
alicloud_instance.ECS_instance_for_SLB_Sample[0]: Creation complete after 59s (ID: i-6we4hecn7bodqns4pode)
alicloud_slb_attachment.slb_attachment: Creating...
backend_servers: "" => "<computed>"
instance_ids.#: "0" => "2"
instance_ids.3313383734: "" => "i-6web68sjtatfqyq2mdd7"
instance_ids.3330124408: "" => "i-6we4hecn7bodqns4pode"
load_balancer_id: "" => "lb-e9b8zcx2zwr5y423dlrjh"
weight: "" => "100"
alicloud_slb_attachment.slb_attachment: Creation complete after 3s (ID: lb-e9b8zcx2zwr5y423dlrjh)
Apply complete! Resources: 9 added, 0 changed, 0 destroyed.
Outputs:
ECS_instance_ip = [
47.74.6.63,
47.74.11.111
]
slb_ip = 47.245.35.115
$
Close

Alibaba Cloudを始めてみましょう

ソフトバンクは、Alibaba Cloudのアカウント開設から、サービス展開までをお手伝いします。
Hatena