Terraform を使用して、Enterprise Distributed Application Service (EDAS) に Elastic Compute Service (ECS) クラスターを作成し、Java アプリケーションをデプロイし、クラシックロードバランサー (CLB) インスタンスをバインドします。これらはすべて Infrastructure-as-Code として定義されます。
このチュートリアルの完全な例は、Terraform Explorer で直接実行できます。
構築するリソース
このチュートリアルの終わりまでに、Terraform 設定によって以下のリソースが順番にプロビジョニングされます:
-
ネットワーキングとコンピューティング:Virtual Private Cloud (VPC)、vSwitch、セキュリティグループ、および ECS インスタンス。
-
EDAS クラスター:ECS インスタンスがアタッチされた ECS クラスター。
-
アプリケーション:EDAS アプリケーションとデプロイグループ。
-
デプロイ:デモ JAR パッケージを使用してスケールアウトおよびデプロイされたアプリケーション。
-
負荷分散:アプリケーションにバインドされた CLB インスタンス。
前提条件
開始する前に、以下の準備が整っていることを確認してください:
-
以下のサービスが有効化されていること:
-
Alibaba Cloud アカウントの AccessKey ペアが公開されるのを避けるため、最小限の権限を持つ RAM ユーザー。詳細については、「RAM ユーザーの作成」および「RAM ユーザー権限の管理」をご参照ください。
-
以下のいずれかの方法でセットアップ済みの Terraform 実行環境:
-
Terraform Explorer:ブラウザベースで、インストールは不要です。簡単なテストに最適です。
-
Terraform を使用したリソースの作成:Terraform がプレインストールされており、認証情報が事前設定されています。低コストでの実験に最適です。
-
Terraform のインストールと設定:カスタム環境や制限されたネットワークに最適です。
-
必要な IAM ポリシー
RAM ユーザーには、次のポリシーをアタッチしてください。このポリシーは、このチュートリアルで使用される各サービスに対する最小限の権限を付与します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"edas:CreateCluster",
"edas:ReadCluster",
"edas:DeleteCluster",
"edas:ListResourceGroup",
"edas:ListServiceGroups",
"edas:ListSwimmingLaneGroup",
"edas:ReadApplication",
"edas:ListSlb",
"edas:DeleteApplication"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ecs:CreateSecurityGroup",
"ecs:ModifySecurityGroupPolicy",
"ecs:DescribeSecurityGroups",
"ecs:ListTagResources",
"ecs:DeleteSecurityGroup",
"ecs:DescribeSecurityGroupAttribute",
"ecs:RunInstances",
"ecs:DescribeInstances",
"ecs:DescribeUserData",
"ecs:DescribeInstanceRamRole",
"ecs:DescribeInstanceAttribute",
"ecs:DescribeNetworkInterfaces",
"ecs:DescribeInstanceMaintenanceAttributes",
"ecs:DescribeDisks",
"ecs:DeleteInstance"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"edas:ManageCluster",
"edas:SynchronizeResource",
"edas:CreateApplication",
"edas:ManageApplication",
"edas:QueryMigrateEcuList",
"edas:ReadApplication"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"slb:CreateLoadBalancer",
"slb:DescribeLoadBalancerAttribute",
"slb:ListTagResources",
"slb:DeleteLoadBalancer"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"vpc:CreateVpc",
"vpc:DeleteVpc",
"vpc:CreateVSwitch",
"vpc:DeleteVSwitch"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"vpc:DescribeVpcAttribute",
"vpc:DescribeRouteTableList",
"vpc:DescribeVSwitchAttributes"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "kms:CreateKey",
"Resource": "*"
}
]
}
このチュートリアルでプロビジョニングされるリソースには料金が発生します。不要になったリソースは解放するか、サブスクリプションを解除してください。
使用されるリソース
-
alicloud_vpc:Virtual Private Cloud (VPC) を作成します。
-
alicloud_security_group:セキュリティグループを作成します。
-
alicloud_vswitch:vSwitch を作成します。
-
alicloud_instance:ECS インスタンスを作成します。
-
alicloud_edas_cluster:ECS クラスターを作成します。
-
alicloud_edas_instance_cluster_attachment:ECS インスタンスをクラスターにアタッチします。
-
alicloud_edas_application:EDAS に ECS アプリケーションを作成します。
-
alicloud_edas_deploy_group:デプロイグループを作成します。
-
alicloud_edas_application_scale:アプリケーションをスケールアウトします。
-
alicloud_edas_application_deployment:アプリケーションをデプロイします。
-
alicloud_slb_load_balancer:CLB インスタンスを作成します。
-
alicloud_edas_slb_attachment:アプリケーションを CLB インスタンスにバインドします。
Terraform リソース
このチュートリアルでは、以下の Terraform リソースを使用します。各リソースは Terraform Registry のドキュメントにリンクされています。
|
リソース |
目的 |
|
VPC を作成します |
|
|
セキュリティグループを作成します |
|
|
vSwitch を作成します |
|
|
ECS インスタンスをプロビジョニングします |
|
|
EDAS に ECS クラスターを作成します |
|
|
ECS インスタンスをクラスターにアタッチします |
|
|
EDAS アプリケーションを作成します |
|
|
デプロイグループを作成します |
|
|
アプリケーションを ECS インスタンスにスケールアウトします |
|
|
アプリケーションパッケージをデプロイします |
|
|
CLB インスタンスを作成します |
|
|
CLB インスタンスをアプリケーションにバインドします |
手順1:ECS インスタンスの作成
基盤となるネットワーキングおよびコンピューティングインフラストラクチャ (VPC、セキュリティグループ、vSwitch、ECS インスタンス) をプロビジョニングします。
-
作業ディレクトリを作成し、次の設定を含む
main.tfという名前のファイルを追加します:主な設定の詳細:
パラメーター
値
説明
regioncn-shanghaiすべてのリソースが作成されるリージョン
instance_typeecs.e-c1m1.largeECS インスタンスの仕様
vpc_cidr_block172.16.0.0/16VPC の IP アドレス範囲
vsw_cidr_block172.16.0.0/24vSwitch の IP アドレス範囲
system_disk_categorycloud_essdシステムディスクのディスクタイプ
variable "region" { default = "cn-shanghai" } variable "instance_type" { type = string default = "ecs.e-c1m1.large" } variable "vpc_cidr_block" { default = "172.16.0.0/16" } variable "vsw_cidr_block" { default = "172.16.0.0/24" } # 公式 EDAS ダウンロードページにあるデモ用の Spring Cloud Consumer JAR。 variable "war_url" { type = string default = "http://edas-sz.oss-cn-shenzhen.aliyuncs.com/prod/demo/SPRING_CLOUD_CONSUMER.jar" } provider "alicloud" { region = var.region } # 指定されたインスタンスタイプとディスクカテゴリをサポートするアベイラビリティーゾーンを検索します。 data "alicloud_zones" "default" { available_instance_type = var.instance_type available_resource_creation = "VSwitch" available_disk_category = "cloud_essd" } # グローバルに一意なリソース名のランダムなサフィックスを生成します。 resource "random_integer" "default" { min = 10000 max = 99999 } # VPC を作成します。 resource "alicloud_vpc" "vpc" { vpc_name = "vpc-test_${random_integer.default.result}" cidr_block = var.vpc_cidr_block } # VPC 内にセキュリティグループを作成します。 resource "alicloud_security_group" "group" { name = "test_${random_integer.default.result}" vpc_id = alicloud_vpc.vpc.id } # 最初のアベイラビリティーゾーンに vSwitch を作成します。 resource "alicloud_vswitch" "vswitch" { vpc_id = alicloud_vpc.vpc.id cidr_block = var.vsw_cidr_block zone_id = data.alicloud_zones.default.zones[0].id vswitch_name = "vswitch-test-${random_integer.default.result}" } # ECS インスタンスを作成します。 # 以下のパスワードはデモンストレーション用です。本番環境では、 # sensitive = true を指定した Terraform 変数またはシークレットマネージャーを使用してください。 resource "alicloud_instance" "instance" { availability_zone = data.alicloud_zones.default.zones[0].id security_groups = alicloud_security_group.group.*.id instance_type = var.instance_type system_disk_category = "cloud_essd" system_disk_name = "test_foo_system_disk_${random_integer.default.result}" system_disk_description = "test_foo_system_disk_description" image_id = "aliyun_2_1903_x64_20G_alibase_20240628.vhd" instance_name = "test_ecs_${random_integer.default.result}" vswitch_id = alicloud_vswitch.vswitch.id internet_max_bandwidth_out = 10 password = "Terraform@Example" } # ECS インスタンスの初期化が完了するのを待ちます # (通常 60 秒未満)。 resource "time_sleep" "example" { depends_on = [alicloud_instance.instance] create_duration = "60s" } -
Terraform 作業ディレクトリを初期化します。出力例:
terraform initTerraform has been successfully initialized! -
設定を検証して、構文エラーやサポートされていない引数を検出します。出力例:
terraform validateSuccess! The configuration is valid. -
実行計画をプレビューして、Terraform が作成する内容を確認します:
terraform plan -
設定を適用します。プロンプトが表示されたら、
yesと入力して [Enter] キーを押します。成功時の出力例:terraform applyApply complete! Resources: 6 added, 0 changed, 0 destroyed. -
結果を検証します。
terraform showを実行して、作成されたリソースを確認します。または、ECS コンソール を開きます。左側メニューで、 [Instances & Images] > [Instances] を選択します。上部メニューで [China (Shanghai)] を選択してインスタンスを表示します。terraform show

手順2:ECS クラスターの作成とインスタンスのアタッチ
EDAS の ECS クラスターを作成し、手順 1 で作成した ECS インスタンスをアタッチします。
-
main.tfに次のコードを追加します:リソース引数のリファレンス:
引数
値
説明
cluster_type"2"ECS クラスターを指定します。Swarm クラスターの場合は
"1"ですnetwork_mode"2"VPC ネットワーキングを指定します。クラシックネットワークの場合は
"1"ですlogical_region_idvar.regionクラスターが作成されるリージョン
# EDAS に ECS クラスターを作成します。 # cluster_type = "2":ECS クラスター ("1" は Swarm クラスター)。 # network_mode = "2":VPC ネットワーク ("1" はクラシックネットワーク)。 resource "alicloud_edas_cluster" "cluster" { cluster_name = "tf-edas-${random_integer.default.result}" cluster_type = "2" network_mode = "2" logical_region_id = var.region vpc_id = alicloud_vpc.vpc.id } # ECS インスタンスをクラスターにアタッチします。 # depends_on は、インスタンスがアタッチ前に完全に初期化されることを保証します。 resource "alicloud_edas_instance_cluster_attachment" "default" { depends_on = [time_sleep.example] cluster_id = alicloud_edas_cluster.cluster.id instance_ids = [alicloud_instance.instance.id] } -
変更をプレビューして適用します。プロンプトが表示されたら、
yesと入力して [Enter] キーを押します。成功時の出力例:terraform plan terraform applyApply complete! Resources: 2 added, 0 changed, 0 destroyed. -
結果を検証します。
terraform showを実行して、クラスターの詳細を確認します。または、EDAS コンソール を開きます。左側メニューで、 [Resource Management] > [ECS Clusters] を選択します。上部メニューで [China (Shanghai)] を選択します。クラスター ID をクリックして、アタッチされた ECS インスタンスを含むクラスターの詳細を表示します。terraform show


手順3:アプリケーションとデプロイグループの作成
クラスター内に EDAS アプリケーションとデプロイグループを作成します。
-
main.tfに次のコードを追加します:# ECS クラスターに JAR タイプのアプリケーションを作成します。 resource "alicloud_edas_application" "app" { application_name = "tf-test-app-${random_integer.default.result}" cluster_id = alicloud_edas_cluster.cluster.id package_type = "JAR" } # アプリケーションのデプロイグループを作成します。 # デプロイグループを使用すると、インスタンスのサブセットを個別に管理できます # (例:カナリアリリース)。 resource "alicloud_edas_deploy_group" "this" { app_id = alicloud_edas_application.app.id group_name = "tf-test-group-${random_integer.default.result}" } -
変更をプレビューして適用します。プロンプトが表示されたら、
yesと入力して [Enter] キーを押します。成功時の出力例:terraform plan terraform applyApply complete! Resources: 2 added, 0 changed, 0 destroyed. -
結果を検証します。
terraform showを実行して、アプリケーションとデプロイグループを確認します。または、EDAS コンソール を開きます。左側メニューで、 [Application Management] > [Applications] を選択します。上部メニューで [China (Shanghai)] を選択します。アプリケーション名をクリックし、 [Instance Information] タブをクリックしてデプロイグループを表示します。terraform show


手順4:アプリケーションのスケールアウトとデプロイ
ECS インスタンスをデプロイグループに割り当て (スケールアウト) し、デモ JAR パッケージをデプロイします。
-
main.tfに次のコードを追加します:time_sleepを使用する理由: EDAS は、ECS インスタンスにエージェントをインストールしてアプリケーションを起動するために時間が必要です。time_sleepリソースは遅延を追加することで、依存リソース (手順 5 の CLB バインディングなど) がアプリケーションの準備が整う前に実行されないようにします。# 複合リソース ID からデプロイグループ ID を抽出します。 locals { parts = split(":", alicloud_edas_deploy_group.this.id) group_id = local.parts[2] } # スケールアウト:ECS インスタンスをデプロイグループに割り当てます。 resource "alicloud_edas_application_scale" "default" { app_id = alicloud_edas_application.app.id deploy_group = local.group_id ecu_info = [alicloud_edas_instance_cluster_attachment.default.ecu_map[alicloud_instance.instance.id]] } # デモ JAR をアプリケーションにデプロイします。 # depends_on は、スケールアウトとクラスターのアタッチが先に完了することを保証します。 resource "alicloud_edas_application_deployment" "default" { depends_on = [alicloud_edas_application_scale.default, alicloud_edas_instance_cluster_attachment.default] app_id = alicloud_edas_application.app.id group_id = local.group_id war_url = var.war_url } # アプリケーションの起動を待ちます (通常 60 秒未満)。 resource "time_sleep" "example2" { depends_on = [alicloud_edas_application_deployment.default] create_duration = "60s" } -
変更をプレビューして適用します。プロンプトが表示されたら、
yesと入力して [Enter] キーを押します。成功時の出力例:terraform plan terraform applyApply complete! Resources: 3 added, 0 changed, 0 destroyed. -
結果を検証します。
terraform showを実行して、デプロイを確認します。または、EDAS コンソール を開きます。左側メニューで、 [Application Management] > [Applications] を選択します。上部メニューで [China (Shanghai)] を選択します。アプリケーション名をクリックし、 [Instance Information] タブをクリックしてデプロイステータスを確認します。terraform show

手順5:CLB インスタンスの作成とアプリケーションへのバインド
内部 CLB インスタンスを作成し、アプリケーションにバインドします。
-
main.tfに次のコードを追加します:リソース引数のリファレンス:
引数
値
説明
load_balancer_specslb.s2.smallCLB インスタンスの仕様
address_typeintranetVPC 内でのみアクセス可能な内部ロードバランサーを作成します
# 同じ vSwitch 内に内部 CLB インスタンスを作成します。 resource "alicloud_slb_load_balancer" "default" { load_balancer_name = "tf-test-slb-${random_integer.default.result}" vswitch_id = alicloud_vswitch.vswitch.id load_balancer_spec = "slb.s2.small" address_type = "intranet" } # CLB インスタンスを EDAS アプリケーションにバインドします。 # depends_on は、アプリケーションが完全にデプロイされ、起動していることを保証します。 resource "alicloud_edas_slb_attachment" "this" { depends_on = [time_sleep.example2] app_id = alicloud_edas_application.app.id slb_id = alicloud_slb_load_balancer.default.id slb_ip = alicloud_slb_load_balancer.default.address type = alicloud_slb_load_balancer.default.address_type } -
変更をプレビューして適用します。プロンプトが表示されたら、
yesと入力して [Enter] キーを押します。成功時の出力例:terraform plan terraform applyApply complete! Resources: 2 added, 0 changed, 0 destroyed. -
結果を検証します。
terraform showを実行して、CLB インスタンスを確認します。または、EDAS コンソール を開きます。左側メニューで、 [Application Management] > [Applications] を選択します。上部メニューで [China (Shanghai)] を選択します。アプリケーション名をクリックし、 [Basic Information] タブをクリックしてバインドされた CLB インスタンスを確認します。terraform show

リソースのクリーンアップ
これらのリソースが不要になったら、料金の発生を停止するために削除します:
terraform destroy
プロンプトが表示されたら、 yes と入力して [Enter] キーを押します。
terraform destroy の詳細については、「一般的な Terraform コマンド」をご参照ください。
完全な例
この例は Terraform Explorer で直接実行できます。
以下の main.tf ファイルは、手順 1 から 5 までのすべてのリソースを一つの設定にまとめたものです。
variable "region" {
default = "cn-shanghai"
}
variable "instance_type" {
type = string
default = "ecs.e-c1m1.large"
}
variable "vpc_cidr_block" {
default = "172.16.0.0/16"
}
variable "vsw_cidr_block" {
default = "172.16.0.0/24"
}
# 公式 EDAS ダウンロードページにあるデモ用の Spring Cloud Consumer JAR。
variable "war_url" {
type = string
default = "http://edas-sz.oss-cn-shenzhen.aliyuncs.com/prod/demo/SPRING_CLOUD_CONSUMER.jar"
}
provider "alicloud" {
region = var.region
}
# 複合リソース ID からデプロイグループ ID を抽出します。
locals {
parts = split(":", alicloud_edas_deploy_group.this.id)
group_id = local.parts[2]
}
data "alicloud_zones" "default" {
available_instance_type = var.instance_type
available_resource_creation = "VSwitch"
available_disk_category = "cloud_essd"
}
# グローバルに一意なリソース名のランダムなサフィックスを生成します。
resource "random_integer" "default" {
min = 10000
max = 99999
}
# VPC を作成します。
resource "alicloud_vpc" "vpc" {
vpc_name = "vpc-test_${random_integer.default.result}"
cidr_block = var.vpc_cidr_block
}
# VPC 内にセキュリティグループを作成します。
resource "alicloud_security_group" "group" {
name = "test_${random_integer.default.result}"
vpc_id = alicloud_vpc.vpc.id
}
# 最初のアベイラビリティーゾーンに vSwitch を作成します。
resource "alicloud_vswitch" "vswitch" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = var.vsw_cidr_block
zone_id = data.alicloud_zones.default.zones[0].id
vswitch_name = "vswitch-test-${random_integer.default.result}"
}
# ECS インスタンスを作成します。
# 以下のパスワードはデモンストレーション用です。本番環境では、
# sensitive = true を指定した Terraform 変数またはシークレットマネージャーを使用してください。
resource "alicloud_instance" "instance" {
availability_zone = data.alicloud_zones.default.zones[0].id
security_groups = alicloud_security_group.group.*.id
instance_type = var.instance_type
system_disk_category = "cloud_essd"
system_disk_name = "test_foo_system_disk_${random_integer.default.result}"
system_disk_description = "test_foo_system_disk_description"
image_id = "aliyun_2_1903_x64_20G_alibase_20240628.vhd"
instance_name = "test_ecs_${random_integer.default.result}"
vswitch_id = alicloud_vswitch.vswitch.id
internet_max_bandwidth_out = 10
password = "Terraform@Example"
}
# ECS インスタンスの初期化が完了するのを待ちます (通常 60 秒未満)。
resource "time_sleep" "example" {
depends_on = [alicloud_instance.instance]
create_duration = "60s"
}
# EDAS に ECS クラスターを作成します。
# cluster_type = "2":ECS クラスター ("1" は Swarm クラスター)。
# network_mode = "2":VPC ネットワーク ("1" はクラシックネットワーク)。
resource "alicloud_edas_cluster" "cluster" {
cluster_name = "tf-edas-${random_integer.default.result}"
cluster_type = "2"
network_mode = "2"
logical_region_id = var.region
vpc_id = alicloud_vpc.vpc.id
}
# ECS インスタンスをクラスターにアタッチします。
resource "alicloud_edas_instance_cluster_attachment" "default" {
depends_on = [time_sleep.example]
cluster_id = alicloud_edas_cluster.cluster.id
instance_ids = [alicloud_instance.instance.id]
}
# ECS クラスターに JAR タイプのアプリケーションを作成します。
resource "alicloud_edas_application" "app" {
application_name = "tf-test-app-${random_integer.default.result}"
cluster_id = alicloud_edas_cluster.cluster.id
package_type = "JAR"
}
# アプリケーションのデプロイグループを作成します。
resource "alicloud_edas_deploy_group" "this" {
app_id = alicloud_edas_application.app.id
group_name = "tf-test-group-${random_integer.default.result}"
}
# スケールアウト:ECS インスタンスをデプロイグループに割り当てます。
resource "alicloud_edas_application_scale" "default" {
app_id = alicloud_edas_application.app.id
deploy_group = local.group_id
ecu_info = [alicloud_edas_instance_cluster_attachment.default.ecu_map[alicloud_instance.instance.id]]
}
# デモ JAR をアプリケーションにデプロイします。
resource "alicloud_edas_application_deployment" "default" {
depends_on = [alicloud_edas_application_scale.default, alicloud_edas_instance_cluster_attachment.default]
app_id = alicloud_edas_application.app.id
group_id = local.group_id
war_url = var.war_url
}
# アプリケーションの起動を待ちます (通常 60 秒未満)。
resource "time_sleep" "example2" {
depends_on = [alicloud_edas_application_deployment.default]
create_duration = "60s"
}
# 同じ vSwitch 内に内部 CLB インスタンスを作成します。
resource "alicloud_slb_load_balancer" "default" {
load_balancer_name = "tf-test-slb-${random_integer.default.result}"
vswitch_id = alicloud_vswitch.vswitch.id
load_balancer_spec = "slb.s2.small"
address_type = "intranet"
}
# CLB インスタンスを EDAS アプリケーションにバインドします。
resource "alicloud_edas_slb_attachment" "this" {
depends_on = [time_sleep.example2]
app_id = alicloud_edas_application.app.id
slb_id = alicloud_slb_load_balancer.default.id
slb_ip = alicloud_slb_load_balancer.default.address
type = alicloud_slb_load_balancer.default.address_type
}
より完全な例については、GitHub の EDAS ディレクトリをご参照ください。