すべてのプロダクト
Search
ドキュメントセンター

Enterprise Distributed Application Service:Terraform を使用して ECS クラスタを作成し、アプリケーションをデプロイする

最終更新日:Oct 22, 2025

このトピックでは、Terraform を使用して Elastic Compute Service (ECS) クラスターを作成し、アプリケーションをスケールアウトしてデプロイし、アプリケーションを Classic Load Balancer (CLB) インスタンスにバインドし、アプリケーショングループを作成する方法について説明します。

説明

このトピックのサンプルコードは、数回クリックするだけで実行できます。詳細については、「Terraform Explorer」をご参照ください。

前提条件

  • 次のサービスが有効化されています。

    • Enterprise Distributed Application Service (EDAS): このサービスを有効化する方法の詳細については、「EDAS の有効化」をご参照ください。

    • CLB: 詳細については、「CLB の課金」をご参照ください。

    • ECS: 詳細については、「課金の概要」をご参照ください。

  • このトピックの操作を実行するには、最小限必要な権限を持つ Resource Access Management (RAM) ユーザーを使用します。これにより、Alibaba Cloud アカウントの AccessKey ペアが漏洩するリスクを最小限に抑えることができます。最小限必要な権限を含むポリシーを RAM ユーザーにアタッチする方法の詳細については、「RAM ユーザーの作成」および「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": "*"
        }
      ]
    }
  • Terraform のランタイム環境は、次のいずれかの方法で準備されます。

    • Terraform Explorer で Terraform を使用する: Alibaba Cloud は、Terraform のオンラインランタイム環境である Terraform Explorer を提供しています。Terraform をインストールすることなく、Terraform Explorer にログインした後に Terraform を使用できます。詳細については、「Terraform Explorer で Terraform を使用する」をご参照ください。この方法は、追加費用なしで迅速かつ便利に Terraform を使用およびデバッグしたいシナリオに適しています。

    • Cloud Shell で Terraform を使用する: Terraform は Cloud Shell にプリインストールされており、ID 資格情報が構成されています。Cloud Shell で Terraform コマンドを実行できます。詳細については、「Cloud Shell で Terraform を使用する」をご参照ください。この方法は、低コストで迅速かつ便利に Terraform を使用およびデバッグしたいシナリオに適しています。

    • オンプレミスマシンに Terraform をインストールして構成する: この方法は、ネットワーク状態が悪い場合や、カスタム開発環境が使用されるシナリオに適しています。詳細については、「Terraform のインストールと構成」をご参照ください。

説明

特定のリソースに対して課金されます。リソースが不要になった場合は、できるだけ早くリソースをリリースまたはサブスクリプションを解除する必要があります。

使用されるリソース

ステップ 1: ECS インスタンスの作成

  1. 作業ディレクトリを作成し、そのディレクトリに main.tf という名前の構成ファイルを作成します。次のコードは ECS インスタンスを作成するために使用され、ECS インスタンスの作成に必要な VPC、セキュリティグループ、および vSwitch も作成します。次のコードを main.tf 構成ファイルにコピーします。

    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"
    }
    
    # 公式ダウンロードページからデモパッケージをダウンロードします。
    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
    }
    
    # セキュリティグループを作成します。
    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 インスタンスを作成します。
    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"
    }
  2. 次のコマンドを実行して、Terraform ランタイム環境を初期化します。

    terraform init

    次の情報が返された場合、Terraform は初期化されています。

    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
  3. 次のコマンドを実行してコードを実行します。

    terraform apply

    実行中に、プロンプトが表示されたら yes と入力し、[Enter] キーを押します。コマンドが完了するのを待ちます。次の情報が表示された場合、コードは正常に実行されています。

    You can apply this plan to save these new output values to the Terraform state, without changing any real infrastructure.
    
    Do you want to perform these actions?
      Terraform will perform the actions described above.
      Only 'yes' will be accepted to approve.
    
      Enter a value: yes
    
    
    Apply complete!  Resources: 6 added, 0 changed, 0 destroyed.
  4. 結果を検証します。

    terraform show コマンドの実行

    作業ディレクトリで次のコマンドを実行して、Terraform を使用して作成された ECS インスタンスの詳細をクエリします。

    terraform show

    image

    ECS コンソールへのログイン

    ECS コンソールにログインします。左側のナビゲーションウィンドウで、[インスタンス & イメージ] > [インスタンス] を選択します。上部のナビゲーションバーで、ECS インスタンスが作成されたリージョンを選択します。この例では、[中国 (上海)] を選択して、作成された ECS インスタンスを表示します。

    image

ステップ 2: ECS クラスターを作成し、ECS インスタンスをクラスターに追加する

  1. 次のコードを main.tf ファイルに追加します。

    # ECS クラスターを作成します。
    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 インスタンスを 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]
    }
  2. 実行計画を作成し、変更をプレビューします。

    terraform plan
  3. 次のコマンドを実行してコードを実行します。

    terraform apply

    実行中に、プロンプトが表示されたら yes と入力し、[Enter] キーを押します。コマンドが完了するのを待ちます。次の情報が表示された場合、コードは正常に実行されています。

    Apply complete!  Resources: 2 added, 0 changed, 0 destroyed.
  4. 結果を検証します。

    terraform show コマンドの実行

    作業ディレクトリで次のコマンドを実行して、Terraform を使用して作成された ECS クラスターの詳細をクエリします。

    terraform show

    image

    EDAS コンソールへのログイン

    1. EDAS コンソールにログインします。左側のナビゲーションウィンドウで、[リソース管理] > [ECS クラスター] を選択します。上部のナビゲーションバーで、ECS クラスターが作成されたリージョンを選択します。この例では、[中国 (上海)] を選択して、作成された ECS クラスターを表示します。

      image

    2. ECS クラスターの ID をクリックして、クラスターの詳細を表示します。

      image

ステップ 3: アプリケーションとアプリケーショングループの作成

  1. 次のコードを main.tf ファイルに追加します。

    # アプリケーションを作成します。
    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}"
    }
  2. 実行計画を作成し、変更をプレビューします。

    terraform plan
  3. 次のコマンドを実行してコードを実行します。

    terraform apply

    実行中に、プロンプトが表示されたら yes と入力し、[Enter] キーを押します。コマンドが完了するのを待ちます。次の情報が表示された場合、コードは正常に実行されています。

    Apply complete!  Resources: 2 added, 0 changed, 0 destroyed.
  4. 結果を検証します。

    terraform show コマンドの実行

    Terraform で作成されたアプリケーションとアプリケーショングループの詳細をクエリするには、作業ディレクトリで次のコマンドを実行します:

    terraform show

    イメージ

    EDAS コンソールへのログイン

    1. EDAS コンソールにログインします。左側のナビゲーションウィンドウで、[アプリケーション管理] > [アプリケーション] を選択します。上部のナビゲーションバーで、アプリケーションが作成されたリージョンを選択します。この例では、[中国 (上海)] を選択して、作成されたアプリケーションを表示します。

      image

    2. アプリケーション名をクリックします。表示されたページで、[インスタンス情報] タブをクリックして、アプリケーションが属するアプリケーショングループを表示します。

      image

ステップ 4: アプリケーションのスケールアウトとデプロイ

  1. 次のコードを main.tf ファイルに追加します。

    # アプリケーショングループ ID を取得します。
    locals {
      parts    = split(":", alicloud_edas_deploy_group.this.id)
      group_id = local.parts[2]
    }
    
    # アプリケーションをスケールアウトします。
    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]]
    }
    
    # アプリケーションをデプロイします。
    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"
    }
  2. 実行計画を作成し、変更をプレビューします。

    terraform plan
  3. 次のコマンドを実行してコードを実行します。

    terraform apply

    実行中に、プロンプトが表示されたら yes と入力し、[Enter] キーを押します。コマンドが完了するのを待ちます。次の情報が表示された場合、コードは正常に実行されています。

    Apply complete!  Resources: 3 added, 0 changed, 0 destroyed.
  4. 結果を検証します。

    terraform show コマンドの実行

    作業ディレクトリで次のコマンドを実行して、Terraform を使用して作成されたアプリケーションの詳細をクエリします。

    terraform show

    image

    EDAS コンソールへのログイン

    EDAS コンソールにログインします。左側のナビゲーションウィンドウで、[アプリケーション管理] > [アプリケーション] を選択します。上部のナビゲーションバーで、アプリケーションが作成されたリージョンを選択します。この例では、[中国 (上海)] を選択して、作成されたアプリケーションを表示します。アプリケーション名をクリックします。表示されたページで、[インスタンス情報] タブをクリックして、アプリケーションのデプロイ情報を表示します。

    image

ステップ 5: CLB インスタンスを作成し、アプリケーションにバインドする

  1. 次のコードを main.tf ファイルに追加します。

    # 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 インスタンスをアプリケーションにバインドします。
    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
    }
  2. 実行計画を作成し、変更をプレビューします。

    terraform plan
  3. 次のコマンドを実行してコードを実行します。

    terraform apply

    実行中に、プロンプトが表示されたら yes と入力し、[Enter] キーを押します。コマンドが完了するのを待ちます。次の情報が表示された場合、コードは正常に実行されています。

    Apply complete!  Resources: 2 added, 0 changed, 0 destroyed.
  4. 結果を検証します。

    terraform show コマンドの実行

    作業ディレクトリで次のコマンドを実行して、Terraform を使用して作成された CLB インスタンスの詳細をクエリします。

    terraform show

    image

    EDAS コンソールへのログイン

    EDAS コンソールにログインします。左側のナビゲーションウィンドウで、[アプリケーション管理] > [アプリケーション] を選択します。上部のナビゲーションバーで、アプリケーションが作成されたリージョンを選択します。この例では、[中国 (上海)] を選択して、作成されたアプリケーションを表示します。アプリケーション名をクリックします。表示されたページで、[基本情報] タブをクリックして、アプリケーションの基本情報を表示します。

    image

クリーンアップ

上記の Terraform によって作成または管理されたリソースが不要になった場合は、次のコマンドを実行してリソースを解放します。terraform destroy の詳細については、「一般的なコマンド」をご参照ください。

terraform destroy

説明

このトピックのサンプルコードは、数回クリックするだけで実行できます。詳細については、「Terraform Explorer」をご参照ください。

サンプルコード

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"
}

# 公式ダウンロードページからデモパッケージをダウンロードします。
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 を取得します。
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
}

# セキュリティグループを作成します。
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 インスタンスを作成します。
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"
}

# ECS クラスターを作成します。
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 インスタンスを 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]
}

# アプリケーションを作成します。
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}"
}

# アプリケーションをスケールアウトします。
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]]
}

# アプリケーションをデプロイします。
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"
}

# 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 インスタンスをアプリケーションにバインドします。
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 の対応するサービスのディレクトリにアクセスしてください。

参考

  • Terraform の詳細については、「Terraform とは」をご参照ください。

  • CLB の詳細については、「CLB とは」をご参照ください。