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

Resource Orchestration Service:ROS を使用した自動スケーリング ECS クラスターのデプロイ

最終更新日:Sep 16, 2026

Alibaba Cloud Resource Orchestration Service (ROS) を使用して、単一の YAML テンプレートから VPC ネットワーク、ECS インスタンスのグループ、および Auto Scaling (ESS) グループをプロビジョニングします。ECS インスタンスをスケーリンググループに追加することで、ビジネスの負荷に基づいて自動的にスケールアウトまたはスケールインできるようになります。このチュートリアルは、Web アプリケーションやマイクロサービスなど、サーバークラスターの弾力的な管理が必要なシナリオに適しています。

ソリューションの概要

ビジネスシナリオ

Alibaba Cloud Virtual Private Cloud (VPC) 内に ECS インスタンスをバッチ作成し、スケーリンググループに追加します。スケーリングルールを設定すると、スケーリンググループはビジネスの負荷に基づいて ECS インスタンスの数を増減させ、サーバークラスターの弾力的な管理を実現します。

作成されるリソース

No.

リソース名

ROS リソースタイプ

目的

1

VPC

ALIYUN::ECS::VPC

分離されたネットワーク環境を提供します。

2

VSwitch

ALIYUN::ECS::VSwitch

サブネットの CIDR ブロックを割り当て、VPC 内のゾーンを指定します。

3

SecurityGroup

ALIYUN::ECS::SecurityGroup

ECS インスタンスのインバウンドおよびアウトバウンドのネットワークアクセスルールを制御します。

4

ECS InstanceGroup

ALIYUN::ECS::InstanceGroup

初期の ECS インスタンスをバッチ作成します。

5

ScalingGroup

ALIYUN::ESS::ScalingGroup

弾力的なスケーリングポリシー (インスタンスの最小数と最大数) を管理します。

6

ScalingConfiguration

ALIYUN::ESS::ScalingConfiguration

スケールアウト時に使用される ECS の仕様テンプレートを定義します。

7

ScalingGroupEnable

ALIYUN::ESS::ScalingGroupEnable

スケーリンググループを有効にし、既存の ECS インスタンスを追加します。

デプロイ後の期待される結果

テンプレートが正常にデプロイされると、以下のものが作成されます:

  • VPC、VSwitch、セキュリティグループを含む完全な VPC ネットワーク環境。

  • ECS インスタンスのグループ。(数は ECSInstanceGroupCount パラメーターで指定され、デフォルトは 3 です。)

  • 自動スケールアウト用のスケーリング設定を持つ、有効化されたスケーリンググループ。

  • すべての ECS インスタンスがスケーリンググループに追加されます。

アーキテクチャ図

使用伸缩组管理多台云服务器-架构图

前提条件

開始する前に、以下を確認してください:

  1. アカウントと権限:ECS、ESS (Auto Scaling)、VPC のリソースを作成する権限を持つ Alibaba Cloud アカウント。

  2. 知識の準備:ROS テンプレートの構文と構造に関する基本的な知識。詳細については、「テンプレートのクイックスタート」をご参照ください。

テンプレート作成チュートリアル

このチュートリアルでは、テンプレートの作成プロセスを 2 つのフェーズで示します:

  • フェーズ 1 (基本バージョン):固定のパラメーター値を使用し、リソースの定義と依存関係の理解に焦点を当てます。

  • フェーズ 2 (高度なバージョン):すべての可変構成をパラメーター化し、動的なパラメーターフィルタリングとパラメーターグループ化を追加します。

フェーズ 1:基本テンプレート — リソースとその依存関係の定義

ステップ 1:基本ネットワークリソースの定義 (VPC + VSwitch + セキュリティグループ)

ネットワークリソースは他のすべてのリソースの基盤であり、最初に作成する必要があります。

Resources:
  # ============================================================
  # 基本ネットワークレイヤー:VPC → VSwitch → SecurityGroup
  # ============================================================
  
  Vpc:
    Type: ALIYUN::ECS::VPC  # VPC を作成
    Properties:
      CidrBlock: 192.168.0.0/16  # VPC CIDR ブロック。65,534 個のプライベート IP アドレスを提供
      VpcName:
        Ref: ALIYUN::StackName  # 擬似パラメーター:スタック名を VPC 名として使用

  VSwitch:
    Type: ALIYUN::ECS::VSwitch  # VPC 内に VSwitch (サブネット) を作成
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc  # Ref は Vpc の VpcId を返す (暗黙的な依存関係のため、ROS は最初に Vpc を作成)
      ZoneId: cn-beijing-h # このシナリオでは、中国 (北京) リージョンのゾーン H を例として使用
      CidrBlock: 192.168.0.0/24  # サブネット CIDR ブロック。VPC CIDR ブロックのサブセットである必要があります

  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup  # セキュリティグループを作成
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc  # セキュリティグループを同じ VPC にバインド
      # インバウンドルール:この例では、簡潔にするためにすべてのインバウンドトラフィックを許可します。本番環境では必要に応じてポートを制限してください。
      SecurityGroupIngress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          SourceCidrIp: 0.0.0.0/0
          NicType: intranet

キーポイント:

  • VpcName、VSwitchName、SecurityGroupName などのカスタム設定は、擬似パラメーターで構成できます。これにより、デプロイ後に特定のスタックによってデプロイされたリソースをすばやく見つけることができます。

  • SecurityGroup のアクセスルールは、ビジネス要件に基づいてカスタマイズできます。例:

    • インターネットから Web サービスにアクセスするには、セキュリティグループでインバウンドポート HTTP 80 または 8080 を開きます。

    • SSH 経由でサーバーにログインするには、セキュリティグループでインバウンドポート 22 を開きます。

ステップ 2:ECS インスタンスグループリソースの定義

ALIYUN::ECS::InstanceGroup は、同じ構成の複数の ECS インスタンスを一度に作成するため、ALIYUN::ECS::Instance を複数回宣言するよりも効率的です。

Resources:
  # ============================================================
  # コンピュートレイヤー:ECS インスタンスをバッチ作成
  # ============================================================

  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup  # ECS インスタンスをバッチ作成
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ImageId: centos_7_9_x64_20G_alibase_20220727.vhd  # CentOS 7.9 イメージ
      AllocatePublicIP: false  # パブリック IP アドレスを割り当てない
      InstanceType: ecs.c5.large  # インスタンスタイプ:2 vCPU、4 GiB
      SystemDiskSize: 200  # 200 GiB システムディスク
      SystemDiskCategory: cloud_essd  # ESSD クラウドディスク
      MaxAmount: 3  # 3 つの ECS インスタンスを作成
      Password: <YourPassword>  # デプロイ時に実際のパスワードに置き換えます (大文字、小文字、数字、特殊文字を含む必要があります)
      InstanceName:  # インスタンス名:スタック名とシーケンス番号 (例:mystack-0001)
        Fn::Sub:
           - ${StackName}-[1,4]
           - StackName:
               Ref: ALIYUN::StackName

キーポイント:

  • ALIYUN::ECS::InstanceGroup は MaxAmount プロパティを使用して、作成する ECS インスタンスの数を指定します。

  • Fn::Sub 関数は文字列を連結します。[1,4] は ROS 固有のシーケンス番号プレースホルダーです。これは、0001 や 0002 のように 1 からインクリメントする 4 桁の数値を示します。

  • このリソースの出力属性 InstanceIds は ECS インスタンス ID のリストであり、スケーリンググループから参照できます。

ステップ 3:スケーリンググループリソースの定義 (スケーリンググループ+スケーリング設定+スケーリング設定の有効化)

スケーリンググループは、ScalingGroup (スケーリングポリシーを定義)、ScalingConfiguration (スケールアウト時に使用する ECS テンプレートを定義)、ScalingGroupEnable (スケーリンググループを有効にし、既存のインスタンスを追加) の 3 つのリソースを通じて機能します。

Resources:
  # ============================================================
  # Auto Scaling レイヤー:スケーリンググループ + スケーリング設定 + スケーリンググループの有効化
  # ============================================================
  
  EssInstanceScalingGroup:
    Type: ALIYUN::ESS::ScalingGroup  # スケーリンググループを作成
    Properties:
      ScalingGroupName:
        Ref: ALIYUN::StackName
      RemovalPolicys:
        - NewestInstance  # スケールインポリシー:最後に作成されたインスタンスから削除
      MinSize: 3  # スケーリンググループは少なくとも 3 つのインスタンスを維持
      MaxSize: 50  # スケーリンググループは最大 50 インスタンスまでスケールアウト可能
      VSwitchId:
        Ref: VSwitch  # スケーリンググループを VSwitch にバインド (スケールアウト時に追加されるインスタンスのネットワークロケーションを決定)
      DefaultCooldown: 300  # 300 秒のクールダウン期間で頻繁なスケーリングを防止

  EssInstanceScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration  # スケーリング設定 (スケールアウト時に使用される ECS テンプレート)
    Properties:
      SecurityGroupId:
        Ref: EcsSecurityGroup
      ScalingGroupId:
        Ref: EssInstanceScalingGroup  # 上で定義したスケーリンググループに関連付け
      ScalingConfigurationName:
        Fn::Sub: sc-${ALIYUN::StackName}  # Fn::Sub は擬似パラメーター変数を直接置換
      InstanceType: ecs.c5.large  # スケールアウト時に作成される ECS インスタンスタイプ (初期の ECS インスタンスと一致させる必要があります)
      SystemDiskCategory: cloud_essd
      SystemDiskSize: 200
      ImageId: centos_7_9_x64_20G_alibase_20220727.vhd  # スケールアウト時に使用されるイメージ (初期の ECS インスタンスと一致させる必要があります)

  EssInstanceScalingGroupEnable:
    Type: ALIYUN::ESS::ScalingGroupEnable  # スケーリンググループを有効化
    Properties:
      ScalingRuleArisExecuteVersion: '1'
      ScalingConfigurationId:
        Ref: EssInstanceScalingConfiguration  # 有効にするスケーリング設定を指定
      InstanceIds:
        # ステップ 2 で作成した ECS インスタンスをスケーリンググループに追加
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds  # InstanceGroup のすべてのインスタンス ID のリストを取得
      ScalingGroupId:
        Ref: EssInstanceScalingGroup

キーポイント:

  • スケーリンググループの MinSize を、グループが有効化された直後にスケールインがトリガーされるのを防ぐために、ECSInstanceGroupCount (最初に作成されたインスタンスの数) と同じ値に設定します。

  • スケーリングルール (ALIYUN::ESS::ScalingRule) とアラームタスク (ALIYUN::ESS::AlarmTask) をスケーリンググループに追加して、CPU 使用率やメモリ使用量などのメトリックに基づいて自動スケーリングを実装できます。

  • Ref と Fn::GetAtt の違い:

    • Ref は、VPC の VpcId など、リソースのプライマリ識別子を返します。

    • Fn::GetAtt は、EcsInstanceGroup の InstanceIds など、リソースの関連属性を返します。

基本バージョン — 完全なテンプレート

以下は、上記の 3 つのステップを組み合わせた、すぐに使用できる完全なテンプレートです:

ROSTemplateFormatVersion: '2015-09-01'
Description: VPC ネットワーク環境を作成し、ECS インスタンスをバッチデプロイしてスケーリンググループに追加し、弾力的なスケールアウト・スケールイン管理を実現します。

Resources:
  # === 基本ネットワークレイヤー ===
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      CidrBlock: 192.168.0.0/16
      VpcName:
        Ref: ALIYUN::StackName

  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      ZoneId: cn-beijing-h
      CidrBlock: 192.168.0.0/24

  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          SourceCidrIp: 0.0.0.0/0
          NicType: intranet

  # === コンピュートレイヤー ===
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ImageId: centos_7_9_x64_20G_alibase_20220727.vhd
      AllocatePublicIP: false
      InstanceType: ecs.c5.large
      SystemDiskSize: 200
      SystemDiskCategory: cloud_essd
      MaxAmount: 3
      Password: <YourPassword>  
      InstanceName:
        Fn::Sub:
           - ${StackName}-[1,4]
           - StackName:
               Ref: ALIYUN::StackName

  # === ESS レイヤー ===
  EssInstanceScalingGroup:
    Type: ALIYUN::ESS::ScalingGroup
    Properties:
      ScalingGroupName:
        Ref: ALIYUN::StackName
      RemovalPolicys:
        - NewestInstance
      MinSize: 3
      MaxSize: 50
      VSwitchId:
        Ref: VSwitch
      DefaultCooldown: 300

  EssInstanceScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration
    Properties:
      SecurityGroupId:
        Ref: EcsSecurityGroup
      ScalingGroupId:
        Ref: EssInstanceScalingGroup
      ScalingConfigurationName:
        Fn::Sub: sc-${ALIYUN::StackName}
      InstanceType: ecs.c5.large
      SystemDiskCategory: cloud_essd
      SystemDiskSize: 200
      ImageId: centos_7_9_x64_20G_alibase_20220727.vhd

  EssInstanceScalingGroupEnable:
    Type: ALIYUN::ESS::ScalingGroupEnable
    Properties:
      ScalingRuleArisExecuteVersion: '1'
      ScalingConfigurationId:
        Ref: EssInstanceScalingConfiguration
      InstanceIds:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      ScalingGroupId:
        Ref: EssInstanceScalingGroup

Outputs:
  ECSInstanceIds:
    Label: ECS インスタンス ID リスト
    Value:
      Fn::GetAtt:
        - EcsInstanceGroup
        - InstanceIds

キーポイント:

  • テンプレートがリソースを作成した後、ECS インスタンス ID のリストなど、それらのリソースの内部属性をテンプレートの Outputs から直接クエリできます。

フェーズ 2:高度なテンプレート — パラメーター化と動的構成

基本テンプレートでは、ECS インスタンスの InstanceType、SystemDiskCategory、ImageId や、スケーリンググループの MaxSize などのプロパティは固定値を使用しています。テンプレートを別のリージョンや異なる仕様で再利用するには、テンプレートを繰り返し変更する必要があります。さらに、テンプレート内のパラメーターはしばしば相互に依存します。たとえば、ECS インスタンスタイプはゾーンによって制限され (ゾーンごとにインスタンスタイプの在庫が異なる)、システムディスクカテゴリはゾーンとインスタンスタイプの両方によって制限されます。これらのパラメーターを手動で指定すると、利用できない組み合わせを簡単に選択してしまい、デプロイが失敗する原因となります。

以下の最適化により、テンプレートの柔軟性と再利用性が大幅に向上します:

  • パラメーター化 (Parameters):可変構成をパラメーターとして抽出し、デプロイ時に動的に指定します。

  • 動的パラメーターフィルタリング (AssociationProperty):ROS コンソールが、すでに選択されているパラメーターに基づいて利用可能なオプションを自動的にフィルタリングするようにします。

  • パラメーターグループ化 (Metadata):コンソールでパラメーターを論理的なグループに表示し、入力エクスペリエンスを向上させます。

パラメーター依存関係図

次の例では、ECS インスタンスタイプとシステムディスクカテゴリを使用して、パラメーター間の依存関係チェーンを示します:

VSwitchZoneId (ゾーン)  ← 基本パラメーター、前提条件なし
    ├──→ ECSInstanceType (ECS インスタンスタイプ)
    │             依存:ZoneId
    │
    └──→ ECSDiskCategory (システムディスクカテゴリ)
                  依存:ZoneId + InstanceType

コアロジック:最初にゾーンを選択し、次にそのゾーンで利用可能な ECS インスタンスタイプをフィルタリングし、最後に選択したゾーンとインスタンスタイプでサポートされているディスクカテゴリをフィルタリングします。各ステップでは、現在の条件下で有効なオプションのみが表示され、無効な組み合わせを防ぎます。

AssociationProperty の説明

1. VSwitchZoneId — ゾーン (基本パラメーター)

AssociationProperty を ALIYUN::ECS::ZoneId に設定して、現在のリージョンのすべてのゾーンをリストします。例:

VSwitchZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch 可用性ゾーン
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和伸缩组将部署在此可用区
      en: VSwitch の可用性ゾーンを選択します。ECS とスケーリンググループはここにデプロイされます
    AssociationProperty: ALIYUN::ECS::ZoneId

このパラメーターは、後続のすべてのパラメーターのフィルタリングの基礎となります。ゾーンを選択すると、他のパラメーターのオプションリストがそれに応じて更新されます。

2. ECSInstanceType — ECS インスタンスタイプ

AssociationProperty を ALIYUN::ECS::Instance::InstanceType に設定して、利用可能な ECS インスタンスタイプをリストし、${VSwitchZoneId} を関連付けて、選択したゾーンで利用可能なインスタンスタイプをフィルタリングします。例:

ECSInstanceType:
    Type: String
    Label:
      zh-cn: ECS インスタンスタイプ
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}

インスタンスタイプの在庫はゾーンによって異なります。フィルタリングしないと、ゾーンで在庫切れのタイプを選択してしまい、作成が失敗する可能性があります。

3. ECSDiskCategory — システムディスクカテゴリ

AssociationProperty を ALIYUN::ECS::Disk::SystemDiskCategory に設定して、利用可能なシステムディスクカテゴリをリストし、${VSwitchZoneId} と ${ECSInstanceType} を関連付けて、選択したゾーンと ECS インスタンスタイプでサポートされているシステムディスクカテゴリをフィルタリングします。例:

ECSDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: システムディスクカテゴリ
    Description:
      zh-cn: 选择系统盘类型。可选值:cloud_essd(ESSD云盘)、cloud_ssd(SSD云盘)、cloud_efficiency(高效云盘)
      en: "システムディスクタイプ。オプション:cloud_essd、cloud_ssd、cloud_efficiency"
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}
      InstanceType: ${ECSInstanceType}

システムディスクカテゴリの可用性は、ゾーン (一部のゾーンは ESSD をサポートしない) とインスタンスタイプ (一部のタイプは特定のディスクカテゴリのみをサポート) の両方に依存します。

動的パラメーターフィルタリングの例

次の例は、AssociationProperty を構成して ECS インスタンスタイプとディスクカテゴリを動的に取得する効果を示しています:

Parameters:
  VSwitchZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch 可用性ゾーン
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和伸缩组将部署在此可用区
      en: VSwitch の可用性ゾーンを選択します。ECS とスケーリンググループはここにデプロイされます
    AssociationProperty: ALIYUN::ECS::ZoneId
  ECSInstanceType:
    Type: String
    Label:
      zh-cn: ECS实例规格
      en: ECS インスタンスタイプ
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}
  ECSDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: システムディスクカテゴリ
    Description:
      zh-cn: 选择系统盘类型。可选值:cloud_essd(ESSD云盘)、cloud_ssd(SSD云盘)、cloud_efficiency(高效云盘)
      en: "システムディスクタイプ。オプション:cloud_essd、cloud_ssd、cloud_efficiency"
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}
      InstanceType: ${ECSInstanceType}

AssociationProperty の仕組み

ROS コンソールでスタックを作成すると、パラメーターの選択がカスケードでトリガーされます:

  1. ゾーン (VSwitchZoneId) を選択します。

  2. ECS インスタンスタイプのドロップダウンリストが自動的に更新され、そのゾーンで在庫のあるインスタンスタイプのみが表示されます。

  3. ECS インスタンスタイプを選択すると、システムディスクカテゴリのドロップダウンリストが自動的に更新され、そのゾーンとそのインスタンスタイプの両方でサポートされているディスクカテゴリのみが表示されます。

このようにして、各ステップでは現在の条件下で利用可能なオプションのみが表示され、無効なパラメーターの組み合わせによるデプロイの失敗を防ぎます。

メタデータパラメーターグループ

Metadata で ALIYUN::ROS::Interface を構成することで、パラメーターを論理的なグループに分割し、それぞれに見出しを付けることができます。コンソールではパラメーターがグループごとに表示され、入力エクスペリエンスが大幅に向上します。

メタデータ構文構造
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:           # パラメーターグループのリスト (必須)
      - Parameters:            # グループ内のパラメーター名のリスト (必須)
          - Parameter1
          - Parameter2
        Label:                 # グループの見出し (必須)
          default:
            zh-cn: 中文标题
            en: English Title

メタデータ構文ルール:

  • ParameterGroups、Parameters、Label はすべて必須です。

  • Parameters にリストされているパラメーター名は、テンプレートの Parameters セクションで定義されているパラメーター名と完全に一致する必要があります。

  • どのグループにも属さないパラメーターは、コンソールのグループ化されていないエリアに表示されます。

パラメーターグループの設計

このテンプレートでは、9 つのパラメーターをリソースタイプごとに 3 つのグループに分割します:

┌────────────────────────────────────────────────────┐
│  ネットワーク構成                                  │
│  ├── VSwitch ゾーン (VSwitchZoneId)                  │
│  ├── VPC CIDR ブロック (VpcCidrBlock)                 │
│  └── VSwitch CIDR ブロック (VSwitchCidrBlock)         │
├────────────────────────────────────────────────────┤
│  ECS インスタンス構成                              │
│  ├── ECS インスタンスタイプ (ECSInstanceType)           │
│  ├── ECS イメージ ID (ECSImageId)                     │
│  ├── システムディスクカテゴリ (ECSDiskCategory)        │
│  ├── ECS インスタンスパスワード (EcsInstancePassword)   │
│  └── ECS インスタンス数 (ECSInstanceGroupCount)    │
├────────────────────────────────────────────────────┤
│  ESS スケーリンググループ構成                      │
│  └── 最大インスタンス数 (ESSGroupMaxSize)      │
└────────────────────────────────────────────────────┘
メタデータグループ化の例
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - VSwitchZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            zh-cn: 基础网络配置
            en: ネットワーク構成
      - Parameters:
          - ECSInstanceType
          - ECSDiskCategory
          - ECSImageId
          - EcsInstancePassword
          - ECSInstanceGroupCount
        Label:
          default:
            zh-cn: ECS实例配置
            en: ECS インスタンス構成
      - Parameters:
          - ESSGroupMaxSize
        Label:
          default:
            zh-cn: ESS伸缩组配置
            en: スケーリンググループ構成

高度なバージョン — 完全なテンプレート

ROSTemplateFormatVersion: '2015-09-01'
Description: >-
  パラメーター化されたテンプレート:ECS インスタンスグループをバッチ作成し、ESS スケーリンググループで管理します。自動スケールアウト・スケールインをサポートします。
  可用性ゾーン、インスタンスタイプ、ディスクカテゴリ、イメージの動的選択をサポートし、複数リージョンでの再利用に適しています。

Parameters:
  # ─── 基本ネットワークパラメーター ───
  VSwitchZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch 可用性ゾーン
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和伸缩组将部署在此可用区
      en: VSwitch の可用性ゾーンを選択します。ECS とスケーリンググループはここにデプロイされます
    AssociationProperty: ALIYUN::ECS::ZoneId

  VpcCidrBlock:
    Type: String
    Label:
      zh-cn: VPC网段
      en: VPC CIDR ブロック
    Description:
      zh-cn: VPC的IP地址段范围。推荐使用 10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16
      en: VPC の IP アドレス範囲。10.0.0.0/8、172.16.0.0/12、または 192.168.0.0/16 を推奨します
    Default: 192.168.0.0/16

  VSwitchCidrBlock:
    Type: String
    Label:
      zh-cn: 交换机网段
      en: VSwitch CIDR ブロック
    Description:
      zh-cn: 必须是VPC网段的子网段,且不能与同VPC下其他交换机网段重叠
      en: VPC CIDR のサブネットである必要があり、他の VSwitch と重複してはなりません
    Default: 192.168.0.0/24

  # ─── ECS インスタンスパラメーター ───
  ECSInstanceType:
    Type: String
    Label:
      zh-cn: ECS实例规格
      en: ECS インスタンスタイプ
    Description:
      zh-cn: 选择ECS实例规格。列表已根据可用区自动过滤可用规格。
      en: ECS インスタンスタイプを選択します。リストは選択された可用性ゾーンによってフィルタリングされます。
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}

  ECSDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: システムディスクカテゴリ
    Description:
      zh-cn: 选择系统盘类型。可选值:cloud_essd(ESSD云盘)、cloud_ssd(SSD云盘)、cloud_efficiency(高效云盘)
      en: "システムディスクタイプ。オプション:cloud_essd、cloud_ssd、cloud_efficiency"
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}
      InstanceType: ${ECSInstanceType}

  ECSImageId:
    Type: String
    Label:
      zh-cn: ECS镜像ID
      en: イメージ ID
    Description:
      zh-cn: 选择ECS实例使用的操作系统镜像
      en: ECS インスタンス用の OS イメージを選択します
    AssociationProperty: ALIYUN::ECS::Image::ImageId

  ECSInstanceGroupCount:
    Type: Number
    Label:
      zh-cn: ECS初始实例数量
      en: 初期インスタンス数
    Description:
      zh-cn: 初始创建的ECS实例数量,这些实例将加入伸缩组管理
      en: 初期に作成する ECS インスタンスの数。これらはスケーリンググループに追加されます
    Default: 3

  EcsInstancePassword:
    Type: String
    NoEcho: true
    Label:
      zh-cn: ECS实例密码
      en: ECS インスタンスパスワード
    Description:
      zh-cn: 长度8-30位,需包含大写字母、小写字母、数字、特殊字符中的至少三种
      en: 長さ 8~30 文字で、大文字、小文字、数字、特殊文字のうち少なくとも 3 種類を含む必要があります
    MinLength: 8
    MaxLength: 30
    AssociationProperty: ALIYUN::ECS::Instance::Password

  # ─── スケーリンググループパラメーター ───
  ESSGroupMaxSize:
    Type: Number
    Label:
      zh-cn: 伸缩组最大实例数
      en: スケーリンググループの最大サイズ
    Description:
      zh-cn: 伸缩组内ECS实例的最大数量,达到此上限后不再自动扩容
      en: スケーリンググループ内の ECS インスタンスの最大数
    Default: 50

Resources:
  # === 基本ネットワークレイヤー ===
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      CidrBlock:
        Ref: VpcCidrBlock
      VpcName:
        Ref: ALIYUN::StackName

  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      ZoneId:
        Ref: VSwitchZoneId
      CidrBlock:
        Ref: VSwitchCidrBlock

  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:
        - PortRange: 8080/8080
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
          NicType: internet
      SecurityGroupEgress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: internet
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: intranet

  # === コンピュートレイヤー ===
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      InstanceName:
        Fn::Sub:
           - ${StackName}-[1,4]
           - StackName:
               Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      SecurityGroupId:
        Ref: EcsSecurityGroup
      SystemDiskCategory:
        Ref: ECSDiskCategory
      SystemDiskSize: 200
      MaxAmount:
        Ref: ECSInstanceGroupCount
      ImageId:
        Ref: ECSImageId
      InstanceType:
        Ref: ECSInstanceType
      Password:
        Ref: EcsInstancePassword
      AllocatePublicIP: false

  # === ESS レイヤー ===
  EssInstanceScalingGroup:
    Type: ALIYUN::ESS::ScalingGroup
    Properties:
      ScalingGroupName:
        Ref: ALIYUN::StackName
      RemovalPolicys:
        - NewestInstance
      MinSize:
        Ref: ECSInstanceGroupCount
      MaxSize:
        Ref: ESSGroupMaxSize
      VSwitchId:
        Ref: VSwitch
      DefaultCooldown: 300

  EssInstanceScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration
    Properties:
      SecurityGroupId:
        Ref: EcsSecurityGroup
      ScalingGroupId:
        Ref: EssInstanceScalingGroup
      ScalingConfigurationName:
        Fn::Sub: sc-${ALIYUN::StackName}
      InstanceType:
        Ref: ECSInstanceType
      SystemDiskCategory:
        Ref: ECSDiskCategory
      SystemDiskSize: 200
      ImageId:
        Ref: ECSImageId
      InstanceName:
        Fn::Sub:
           - ${StackName}-[index,1,4]
           - StackName:
               Ref: ALIYUN::StackName

  EssInstanceScalingGroupEnable:
    Type: ALIYUN::ESS::ScalingGroupEnable
    Properties:
      ScalingRuleArisExecuteVersion: '1'
      ScalingConfigurationId:
        Ref: EssInstanceScalingConfiguration
      InstanceIds:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      ScalingGroupId:
        Ref: EssInstanceScalingGroup

Outputs:
  ECSInstanceIds:
    Label: ECS インスタンス ID リスト
    Value:
      Fn::GetAtt:
        - EcsInstanceGroup
        - InstanceIds

# === メタデータ ===
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - VSwitchZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            zh-cn: 基础网络配置
            en: ネットワーク構成
      - Parameters:
          - ECSInstanceType
          - ECSDiskCategory
          - ECSImageId
          - EcsInstancePassword
          - ECSInstanceGroupCount
        Label:
          default:
            zh-cn: ECS实例配置
            en: ECS インスタンス構成
      - Parameters:
          - ESSGroupMaxSize
        Label:
          default:
            zh-cn: 伸缩组配置
            en: スケーリンググループ構成

このテンプレートで使用される ROS ビルトイン関数のクイックリファレンス

関数

構文例

このテンプレートでの使用法

説明

Ref

Ref: MyVpc

パラメーター値またはリソースのプライマリ識別子を参照します。

パラメーターを参照するとその値が返され、リソースを参照するとそのプライマリ識別子が返されます。

Fn::GetAtt

Fn::GetAtt: [EcsInstanceGroup, InstanceIds]

ECS インスタンスグループのインスタンス ID リストを取得します。

作成後のリソースの出力属性 (プライマリ識別子ではない) を取得します。

Fn::Sub

Fn::Sub: sc-${ALIYUN::StackName}

スケーリング設定名を連結します。

テンプレート文字列で ${Var} を使用して、変数または擬似パラメーターを参照します。

デプロイ

デプロイパラメーター

必須パラメーター (デプロイ時に指定する必要があります)

パラメーター

説明

制約

VSwitchZoneId

ゾーン ID。

コンソールで動的に選択されます。

ECSInstanceType

ECS インスタンスタイプ。

利用可能なインスタンスタイプはゾーンに基づいて自動的にフィルタリングされます。

ECSDiskCategory

ECS システムディスクカテゴリ。

ゾーンとインスタンスタイプに基づいて自動的にフィルタリングされます。

ECSImageId

ECS イメージ ID。

コンソールで動的に選択されます。

オプションパラメーター (デフォルト値があり、空のままにできます)

パラメーター

デフォルト値

説明

VpcCidrBlock

192.168.0.0/16

VPC の CIDR ブロック。

VSwitchCidrBlock

192.168.0.0/24

VSwitch サブネットの CIDR ブロック。

ECSInstanceGroupCount

3

初期に作成される ECS インスタンスの数。

ESSGroupMaxSize

50

ESS スケーリンググループ内のインスタンスの最大数。

EcsInstancePassword

なし

ECS インスタンスのログインパスワード。長さは 8~30 文字で、大文字、小文字、数字、特殊文字のうち少なくとも 3 種類を含む必要があります。

デプロイ方法

方法 1:ROS コンソール経由でのデプロイ

  1. ROS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[スタック] > [スタックの作成] を選択します。

  3. [既存のテンプレートを選択] > [テンプレートコンテンツの入力] を選択し、完全なテンプレートをエディターに貼り付けます。

  4. [次へ] をクリックし、グループごとにパラメーターを構成します。

  5. 構成を確認した後、[作成] をクリックし、スタックのステータスが CREATE_COMPLETE に変わるのを待ちます。

方法 2:ROS IaC Code 経由でのデプロイ

IaC Code は、クラウドインフラストラクチャ向けの AI Infrastructure-as-Code アシスタントです。クラウドリソースのユーザーや O&M エンジニアが、ターミナルワークフローを通じてインフラストラクチャテンプレートを生成、デプロイ、管理するのに役立ちます。

# プロンプト
ECS インスタンスのグループをデプロイし、Auto Scaling グループで管理します。要件:
1. 新規作成した VPC と VSwitch を使用します。
2. 初期に 3 つの ECS インスタンスを作成し、スケーリンググループに追加します。
3. スケーリンググループの最大インスタンス数を 50、最小数を 3 に設定します。
4. スケールインポリシーを、最新のインスタンスを最初に削除するように設定します。
5. セキュリティグループでインバウンドポート 8080 を開きます。
6. VSwitchZoneId、ECSInstanceType、ECSDiskCategory、ECSImageId を AssociationProperty で構成し、コンソールで動的にフィルタリングされるようにします。

よくある質問

Q1:デプロイが「指定された InstanceType はゾーンで利用できません」で失敗する

原因:選択された ECS インスタンスタイプが指定されたゾーンで在庫切れです。

解決策:

  • 高度なテンプレートでは、AssociationProperty が利用可能なインスタンスタイプを自動的にフィルタリングするため、この問題は回避されます。

  • 基本テンプレートを使用する場合は、Elastic Compute Service (ECS) 料金 にアクセスして対象ゾーンのインスタンスタイプの在庫を確認するか、別のゾーンを選択してください。

Q2:スケーリンググループが有効化直後にスケールインをトリガーする

原因:MinSize の値が実際にグループに参加したインスタンスの数より大きいか、インスタンスの参加に失敗しました。

解決策:

  1. ECSInstanceGroupCount の値がスケーリンググループの MinSize 以上であることを確認してください。

  2. ECS インスタンスが実行中状態であることを確認してください。

  3. インスタンスとスケーリンググループが同じ VPC または VSwitch 内にあることを確認してください。

Q3:スケールアウト中に新規作成された ECS インスタンスの構成が予期しないものになる

原因:ScalingConfiguration の InstanceType や ImageId などの構成が、初期の ECS インスタンスの構成と一致していません。

解決策:

  • 高度なテンプレートでは、ScalingConfiguration の InstanceType や ImageId などのパラメーターは、すでに EcsInstanceGroup と同じパラメーターを参照しているため、スケールアウト構成の一貫性が保たれます。

  • 異なる構成でスケールアウトする必要がある場合は、複数の ScalingConfiguration リソースを作成し、重みによってその比率を制御します。

Q4:CPU 使用率に基づいて自動スケーリングを実装するにはどうすればよいですか?

解決策:スケーリングルールとアラームタスクをテンプレートに追加します:

# スケールアウトルール:毎回 2 つのインスタンスを追加
ScaleOutRule:
  Type: ALIYUN::ESS::ScalingRule
  Properties:
    ScalingGroupId:
      Ref: EssInstanceScalingGroup
    ScalingRuleName: scale-out-2
    ScalingRuleType: SimpleScalingRule
    AdjustmentType: QuantityChangeInCapacity  # 数量で調整
    AdjustmentValue: 2  # 毎回 2 つのインスタンスを追加

# アラームトリガー:CPU 使用率が 80% を超えるとスケールアウトをトリガー
CpuAlarm:
  Type: ALIYUN::ESS::AlarmTask
  Properties:
    AlarmTaskName: cpu-high-alarm
    ScalingGroupId:
      Ref: EssInstanceScalingGroup
    MetricName: CpuUtilization
    Threshold: 80
    ComparisonOperator: '>='
    EvaluationCount: 3  # 3 回連続でサンプルがしきい値を超えた場合にのみトリガー
    AlarmActions:
      - Fn::GetAtt:
          - ScaleOutRule
          - ScalingRuleAri

Q5:新規作成ではなく、既存の VPC を使用するにはどうすればよいですか?

解決策:Resources から VPC と VSwitch を削除し、Parameters を通じて渡します:

Parameters:
  ExistingVpcId:
    Type: String
    Label:
      en: 既存の VPC ID
    AssociationProperty: ALIYUN::ECS::VPC::VPCId
  ExistingVSwitchId:
    Type: String
    Label:
      en: 既存の VSwitch ID
    AssociationProperty: ALIYUN::VPC::VSwitch::VSwitchId
    AssociationPropertyMetadata:
      VpcId: ${ExistingVpcId}

Q6:トラフィック分散のために SLB をスケーリンググループにアタッチするにはどうすればよいですか?

解決策:ScalingGroup の Properties に LoadBalancerIds を追加します:

EssInstanceScalingGroup:
  Type: ALIYUN::ESS::ScalingGroup
  Properties:
    ScalingGroupName:
      Ref: ALIYUN::StackName
    RemovalPolicys:
      - NewestInstance
    MinSize:
      Ref: ECSInstanceGroupCount
    MaxSize:
      Ref: ESSGroupMaxSize
    VSwitchId:
      Ref: VSwitch
    DefaultCooldown: 300
    LoadBalancerIds:
      - Ref: MyLoadBalancer  # 既存の SLB インスタンスを参照

スケーリンググループがインスタンスを追加または削除すると、インスタンスは自動的に SLB バックエンドサーバーグループに追加または削除されます。