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

Resource Orchestration Service:ECS インスタンスを使用した ApsaraDB RDS インスタンスへの接続とデータベースの初期化

最終更新日:Aug 14, 2026

このチュートリアルでは、Alibaba Cloud Resource Orchestration Service (ROS) を使用して、単一の VPC 内に Elastic Compute Service (ECS) インスタンスと ApsaraDB RDS for MySQL (RDS) インスタンスをプロビジョニングします。次に、クラウドアシスタントを使用して初期化スクリプトを実行し、サンプルデータセットを RDS にインポートします。最終的に、単一の YAML テンプレートから作成され、オンデマンドで再デプロイ可能な、実用的な ECS + RDS 環境が完成します。

ソリューション概要

ビジネスシナリオ

同じ Alibaba Cloud Virtual Private Cloud (VPC) 内に Elastic Compute Service (ECS) インスタンスと ApsaraDB RDS for MySQL インスタンスを作成します。ECS インスタンスは VPC 内部ネットワーク経由で RDS インスタンスに接続し、クラウドアシスタント (RunCommand) が ECS インスタンス上でシェルスクリプトを自動的に実行してデータベースの初期化を行います。

作成されるリソース

No.

リソース

ROS リソースタイプ

説明

1

VPC

ALIYUN::ECS::VPC

分離されたネットワーク環境を提供します。すべてのリソースは同じ VPC 内にデプロイされます。

2

vSwitch

ALIYUN::ECS::VSwitch

VPC 内のサブネットを分割し、ゾーンを指定します。

3

セキュリティグループ

ALIYUN::ECS::SecurityGroup

ECS インスタンスのインバウンドおよびアウトバウンドトラフィックを制御します。

4

ECS インスタンス

ALIYUN::ECS::Instance

データベース初期化スクリプトを実行するコンピュートノードです。

5

ApsaraDB RDS MySQL インスタンス

ALIYUN::RDS::DBInstance

初期化されたデータを格納するターゲットデータベースです。

6

データベースアカウント

ALIYUN::RDS::Account

ECS インスタンスがデータベースに接続するために使用する RDS ログインアカウントです。

7

クラウドアシスタントコマンド

ALIYUN::ECS::RunCommand

ECS インスタンス上でシェルスクリプトをリモート実行し、データベースの初期化を行います。

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

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

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

  • VPC ネットワークとセキュリティグループにアタッチされた ECS インスタンス。

  • 初期データベースとスーパーアカウントを持つ ApsaraDB RDS MySQL 8.0 インスタンス。

  • MySQL 公式の employees サンプルデータセット (約 300,000 レコード) がデータベースに自動的にインポートされます。

アーキテクチャ図

ECS与RDS架构图

前提条件

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

  1. アカウントと権限:ECS、ApsaraDB RDS、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

基本概念:

  • VpcNameVSwitchNameSecurityGroupName などのカスタム名には擬似パラメーターを使用できます。これにより、デプロイ後にスタックに関連付けられたリソースを迅速に見つけることができます。

  • セキュリティグループルールは、ビジネスニーズに合わせてカスタマイズできます。例:

    • Web サービスへの外部アクセスを許可するには、HTTP ポート 80 または 8080 を開くインバウンドルールを追加します。

    • SSH ログインを許可するには、ポート 22 を開くインバウンドルールを追加します。

ステップ 2: データベースリソースの定義 (RDS インスタンス + データベースアカウント)

Resources:
  # ============================================================
  # データベースレイヤー: ApsaraDB RDS MySQL インスタンス + データベースアカウント
  # ============================================================

  DBInstance:
    Type: ALIYUN::RDS::DBInstance  # ApsaraDB RDS MySQL インスタンスの作成
    Properties:
      ZoneId: cn-beijing-h
      VpcId:
        Ref: Vpc  # RDS を ECS と同じ VPC にデプロイ (内部ネットワーク接続に必須)
      VSwitchId:
        Ref: VSwitch  # vSwitch を指定して ECS と RDS が同じサブネット内にあるようにする
      Engine: MySQL  # データベースエンジン
      EngineVersion: '8.0'  # MySQL バージョン
      DBInstanceClass: mysql.n2e.medium.1  # インスタンスタイプ (2 vCPU, 4 GB)
      DBInstanceStorage: 10  # ストレージ: 10 GB
      MultiAZ: true  # 高可用性のためのマルチゾーンデプロイ
      DBInstanceNetType: Intranet  # 内部ネットワークタイプ (VPC ネットワーク)
      DBMappings:  # 初期データベースの作成
        - CharacterSetName: utf8  # 文字セット
          DBName: employees  # データベース名
      SecurityIPList: 0.0.0.0/0  # RDS ホワイトリスト (VPC 内のすべての IP を許可)

  DBAccount:
    Type: ALIYUN::RDS::Account  # RDS データベースアカウントの作成
    Properties:
      DBInstanceId:
        # Fn::GetAtt はリソースの出力属性を返す (プライマリ識別子ではない)
        Fn::GetAtt:
          - DBInstance  # 論理リソース名
          - DBInstanceId  # 取得する属性名
      AccountPassword: Admin@2791
      AccountType: Super  # スーパーアカウント (すべてのデータベース権限を持つ)
      AccountName: rdsuser  # アカウント名

基本概念:

  • RefFn::GetAtt の違い:

    • Ref はリソースのプライマリ識別子を返します (例:VPC の VpcId)。

    • Fn::GetAtt はリソースの関連属性を返します (例:RDS インスタンスの InnerConnectionString)。

ステップ 3: ECS インスタンスリソースの定義

Resources:
  # ============================================================
  # コンピュートレイヤー + 初期化: ECS インスタンス + データベース初期化のためのクラウドアシスタント
  # ============================================================

  EcsInstance:
    Type: ALIYUN::ECS::Instance  # ECS インスタンスの作成
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch  # RDS と同じ vSwitch で内部ネットワーク接続を確保
      ImageId: aliyun_3_x64_20G_alibase  # OS イメージ: Alibaba Cloud Linux 3 (メンテナンスリリース)
      AllocatePublicIP: true
      InstanceType: ecs.c5.large  # インスタンスタイプ: 2 vCPU, 4 GiB
      SystemDiskSize: 40  # システムディスク: 40 GiB
      SystemDiskCategory: cloud_essd  # ESSD (エンタープライズ SSD)
      Password: <REPLACE_WITH_STRONG_PASSWORD>  # 8-30 文字、大文字/小文字/数字/特殊文字の組み合わせ

  InstanceRunCommand:
    Type: ALIYUN::ECS::RunCommand  # クラウドアシスタント: ECS 上でコマンドをリモート実行
    DependsOn:
      - DBAccount  # 明示的な依存関係: 接続する前にデータベースアカウントが作成されるのを待つ
    Properties:
      CommandContent:
        # Fn::Sub 関数: 文字列の変数置換
        # 構文: Fn::Sub: [テンプレート文字列, {変数: 値}]
        # テンプレート文字列内で ${変数} を使用して変数を参照
        Fn::Sub:
          - |
            #!/bin/bash
            # 1. MySQL クライアントと展開ツールをインストール
            yum -y install mariadb unzip
            # 2. OSS から MySQL 公式サンプルデータセットをダウンロード
            wget -P /tmp https://ros-userdata-resources.oss-cn-beijing.aliyuncs.com/MySQL/test_db-master.zip
            # 3. データファイルを展開
            unzip /tmp/test_db-master.zip -d /tmp/
            # 4. RDS 内部エンドポイント経由でデータベースに接続し、SQL をインポート
            mysql -h${DBConnectString} -P3306 -u${DBUsername} -p${DBPassword} < /tmp/test_db-master/employees.sql
          - DBConnectString:
              # RDS インスタンスの内部接続文字列を取得
              Fn::GetAtt:
                - DBInstance
                - InnerConnectionString
            DBUsername: rdsuser
            DBPassword: Admin@2791
      Type: RunShellScript  # コマンドタイプ: シェルスクリプト
      InstanceIds:  # ターゲット ECS インスタンスリスト
        - Fn::GetAtt:
            - EcsInstance
            - InstanceId
      Timeout: '500'  # コマンド実行タイムアウト: 500 秒

基本概念:

  • InnerConnectionString は、RDS インスタンス作成後に自動的に生成される VPC 内部接続エンドポイントです。

  • AllocatePublicIP: false の場合、ECS インスタンスにはパブリック IP がありません。インターネットからファイルをダウンロードするには、VPC に NAT Gateway を設定するか、AllocatePublicIP: true を設定します。

  • 暗黙的 vs. 明示的な依存関係:

    • Ref または Fn::GetAtt を使用してリソースを参照すると、ROS は依存関係を自動的に推論します (暗黙的)。

    • 2 つのリソース間に直接の参照関係はないが、特定の順序で作成する必要がある場合にのみ DependsOn (明示的) を使用します。

説明

この例の初期化データは、MySQL 公式の employees サンプルデータセットです。安定したダウンロードを確保するために、データファイルを事前にご自身の OSS バケットにアップロードし、wget の URL を置き換えてください。

基本テンプレートの完成版

ROSTemplateFormatVersion: '2015-09-01'
Description: VPC ネットワークを作成し、ECS と RDS MySQL インスタンスをデプロイし、RunCommand 経由でデータベースを初期化します
Parameters:
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

  # === データベースレイヤー ===
  DBInstance:
    Type: ALIYUN::RDS::DBInstance
    Properties:
      ZoneId: cn-beijing-h
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      Engine: MySQL
      EngineVersion: '8.0'
      DBInstanceClass: mysql.n2e.medium.1
      DBInstanceStorage: 200
      MultiAZ: false
      DBInstanceNetType: Intranet
      DBMappings:
        - CharacterSetName: utf8
          DBName: employees
      SecurityIPList: 0.0.0.0/0

  DBAccount:
    Type: ALIYUN::RDS::Account
    DependsOn:
      - DBInstance
    Properties:
      DBInstanceId:
        Fn::GetAtt:
          - DBInstance
          - DBInstanceId
      AccountPassword: Admin@2791
      AccountType: Super
      AccountName: rdsuser

  # === コンピュートレイヤー + データベース初期化 ===
  EcsInstance:
    Type: ALIYUN::ECS::Instance
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ImageId: aliyun_3_x64_20G_alibase
      AllocatePublicIP: true
      InstanceType: ecs.c5.large
      SystemDiskSize: 40
      SystemDiskCategory: cloud_essd
      Password: <REPLACE_WITH_STRONG_PASSWORD>  # 8-30 文字、大文字/小文字/数字/特殊文字の組み合わせ

  InstanceRunCommand:
    Type: ALIYUN::ECS::RunCommand
    DependsOn:
      - DBAccount
    Properties:
      CommandContent:
        Fn::Sub:
          - |
            #!/bin/bash
            yum -y install mariadb unzip
            wget -P /tmp https://ros-userdata-resources.oss-cn-beijing.aliyuncs.com/MySQL/test_db-master.zip
            unzip /tmp/test_db-master.zip -d /tmp/
            mysql -h${DBConnectString} -P3306 -u${DBUsername} -p${DBPassword} < /tmp/test_db-master/employees.sql
          - DBConnectString:
              Fn::GetAtt:
                - DBInstance
                - InnerConnectionString
            DBUsername: rdsuser
            DBPassword: Admin@2791
      Type: RunShellScript
      InstanceIds:
        - Fn::GetAtt:
            - EcsInstance
            - InstanceId
      Timeout: '500'
Outputs:
  RDSInnerConnectionString:
    Description: RDS 内部エンドポイント
    Label: RDS 内部エンドポイント
    Value:
      Fn::GetAtt:
        - DBInstance
        - InnerConnectionString
  RDSPort:
    Description: RDS ポート
    Label: RDS ポート
    Value:
      Fn::GetAtt:
        - DBInstance
        - InnerPort
  ECSPrivateIp:
    Description: ECS 内部 IP アドレス
    Label: ECS 内部 IP アドレス
    Value:
      Fn::GetAtt:
        - EcsInstance
        - PrivateIp
  ECSPublicIp:
    Description: ECS パブリック IP アドレス
    Label: ECS パブリック IP アドレス
    Value:
      Fn::GetAtt:
        - EcsInstance
        - PublicIp

基本概念:

  • テンプレートがリソースを作成した後、Outputs セクションを使用して、RDS 内部エンドポイント、RDS ポート、ECS 内部 IP、ECS パブリック IP などのリソース属性をクエリします。

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

基本テンプレートでは、ECS インスタンスの InstanceTypeSystemDiskCategory、RDS インスタンスの DBInstanceClass などのプロパティは固定値を使用しています。テンプレートを異なるリージョンや仕様で再利用する場合、毎回テンプレートを編集する必要があります。テンプレート内のパラメーターは、しばしば依存関係を持ちます。例えば、ECS インスタンスタイプはゾーンによって制約され (ゾーンごとに提供されるタイプが異なる)、システムディスクカテゴリはゾーンとインスタンスタイプの両方によってさらに制約されます。これらのパラメーターを手動で入力すると、デプロイの失敗を引き起こす無効な組み合わせを簡単に選択してしまう可能性があります。

以下の改善により、テンプレートは柔軟で再利用可能になります。

  1. パラメーター化 (Parameters) — 変動する設定をパラメーターとして抽出し、デプロイ時に動的に入力します。

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

  3. パラメーターのグループ化 (Metadata) — コンソールでパラメーターを論理的なカテゴリ別にグループ化し、設定エクスペリエンスを向上させます。

パラメーターの依存関係図

以下の図は、ECS インスタンスタイプ、システムディスクカテゴリ、RDS インスタンスタイプを例として、依存関係の連鎖を示しています。

VSwitchZoneId (ゾーン)  <- 基本パラメーター、前提条件なし
|
|-> ECSInstanceType (ECS インスタンスタイプ)
|        |             依存先: ZoneId
|        |
|        |-> ECSDiskCategory (システムディスクカテゴリ)
|                           依存先: ZoneId + InstanceType
|
|-> DBInstanceClass (RDS インスタンスタイプ)
                     依存先: ZoneId + Engine (固定値)

中心的なアプローチ:まずゾーンを選択し、それに応じて ECS と RDS のインスタンスタイプをフィルタリングし、最後にゾーンと ECS インスタンスタイプに基づいてディスクカテゴリをフィルタリングします。各ステップでは、現在の条件下で利用可能なオプションのみが表示され、無効な組み合わせを防ぎます。

AssociationProperty の仕組み

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

AssociationPropertyALIYUN::ECS::ZoneId に設定すると、現在のリージョンで利用可能なすべてのゾーンがリストされます。

VSwitchZoneId:
    Type: String
    Label: 
      zh-cn: 交换机可用区
      en: VSwitch アベイラビリティゾーン
    Description: 
      zh-cn: 选择交换机所在的可用区,ECS 和 RDS 将部署在此可用区
      en: VSwitch のアベイラビリティゾーンを選択します。ECS と RDS はこのゾーンにデプロイされます。
    AssociationProperty: ALIYUN::ECS::ZoneId

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

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

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

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

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

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

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

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 をサポートしない) とインスタンスタイプ (一部のタイプは特定のディスクカテゴリのみをサポート) の両方に依存します。

4. DBInstanceClass — RDS インスタンスタイプ

AssociationPropertyALIYUN::RDS::Instance::InstanceType に設定し、${VSwitchZoneId} と固定の Engine: MySQL を関連付けて、選択したゾーンで MySQL をサポートする RDS インスタンスタイプをフィルタリングします。

DBInstanceClass:
    Type: String
    Label: 
      zh-cn: RDS 实例规格
      en: RDS インスタンスクラス
    Description:
      zh-cn: 选择RDS实例规格。列表已根据数据库引擎和可用区自动过滤。
      en: RDS インスタンスクラスを選択します。エンジンタイプとゾーンによってフィルタリングされます。
    AssociationProperty: ALIYUN::RDS::Instance::InstanceType
    AssociationPropertyMetadata:
      Engine: MySQL
      ZoneId: ${VSwitchZoneId}
      EngineVersion: '8.0'
      Category: Basic
      InstanceChargeTYpe: Postpaid

このシナリオでは MySQL を使用するため、エンジンは固定です。他のエンジンを選択したい場合は、AssociationProperty: ALIYUN::RDS::Engine::EngineId を持つ Engine パラメーターを追加し、ここで ${Engine} を参照します。

動的パラメーターフィルタリングテンプレート
Parameters:
  VSwitchZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch アベイラビリティゾーン
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和RDS将部署在此可用区
      en: VSwitch のアベイラビリティゾーンを選択します。ECS と RDS はここにデプロイされます
    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}

  DBInstanceClass:
    Type: String
    Label:
      zh-cn: RDS实例规格
      en: RDS インスタンスクラス
    Description:
      zh-cn: 选择RDS实例规格。列表已根据数据库引擎和可用区自动过滤。
      en: RDS インスタンスクラスを選択します。エンジンタイプとゾーンによってフィルタリングされます。
    AssociationProperty: ALIYUN::RDS::Instance::InstanceType
    AssociationPropertyMetadata:
      Engine: MySQL
      ZoneId: ${VSwitchZoneId}

AssociationProperty のカスケードフィルタリングの仕組み

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

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

  2. ECS インスタンスタイプのドロップダウンが更新され、そのゾーンで利用可能なタイプのみが表示されます。

  3. RDS インスタンスタイプのドロップダウンが更新され、そのゾーンで MySQL をサポートするタイプのみが表示されます。

  4. ECS インスタンスタイプが選択されると、システムディスクカテゴリのドロップダウンが更新され、そのゾーンとインスタンスタイプの組み合わせでサポートされているカテゴリのみが表示されます。

これにより、各選択で有効なオプションのみが表示され、無効なパラメーターの組み合わせによるデプロイの失敗がなくなります。

Metadata パラメーターのグループ化

Metadata 内の ALIYUN::ROS::Interface を使用して、パラメーターをラベル付きの論理グループに整理します。コンソールはパラメーターをグループで表示し、設定エクスペリエンスを向上させます。

Metadata 構文
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:           # パラメーターグループリスト (必須)
      - Parameters:            # このグループ内のパラメーター (必須)
          - ParameterName1
          - ParameterName2
        Label:                 # グループレベル (必須)
          default:
            en: 英語のラベルテキスト

Metadata ルール:

  • ParameterGroupsParametersLabel はすべて必須です。

  • Metadata.ALIYUN::ROS::Interface.ParameterGroups.Parameters の下にリストされているパラメーター名は、Parameters セクションで定義された名前と完全に一致する必要があります。

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

Metadata テンプレート:

Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - VSwitchZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            zh-cn: 基础网络配置
            en: ネットワーク構成
      - Parameters:
          - ECSInstanceType
          - ECSDiskSize
          - ECSDiskCategory
          - EcsInstancePassword
        Label:
          default:
            zh-cn: ECS实例配置
            en: ECS インスタンス構成
      - Parameters:
          - DBInstanceClass
          - DBInstanceStorage
          - DBName
          - DBUsername
          - DBPassword
        Label:
          default:
            zh-cn: 数据库配置
            en: データベース構成
このシナリオのグループ化設計

このテンプレートは 12 個のパラメーターを 3 つのグループに分割します。

グループ

含まれるパラメーター

ネットワーク構成

VSwitch アベイラビリティゾーン VSwitchZoneId、VPC CIDR ブロック VpcCidrBlock、vSwitch CIDR ブロック VSwitchCidrBlock

ECS インスタンス構成

ECS インスタンスタイプ ECSInstanceType、システムディスクサイズ ECSDiskSize、システムディスクカテゴリ ECSDiskCategory、ECS インスタンスパスワード EcsInstancePassword

データベース構成

RDS インスタンスクラスDBInstanceClass、RDS ストレージ DBInstanceStorage、データベース名 DBName、データベースユーザー名 DBUsername、データベースパスワード DBPassword

高度なテンプレートの完成版

ROSTemplateFormatVersion: '2015-09-01'
Description: >-
  パラメーター化されたテンプレート: VPC 内に ECS と RDS MySQL を作成し、RunCommand 経由でデータベースを初期化します。
  ゾーン、インスタンスタイプ、ディスクカテゴリの動的選択をサポートします。

Parameters:
  # --- ネットワークパラメーター ---
  VSwitchZoneId:
    Type: String
    Label: VSwitch アベイラビリティゾーン
    Description: VSwitch のアベイラビリティゾーンを選択します。ECS と RDS はこのゾーンにデプロイされます。
    AssociationProperty: ALIYUN::ECS::ZoneId

  VpcCidrBlock:
    Type: String
    Label: VPC CIDR ブロック
    Description: 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: vSwitch CIDR ブロック
    Description: VPC CIDR のサブネットである必要があり、他の vSwitch と重複してはなりません
    Default: 192.168.0.0/24

  # --- ECS パラメーター ---
  ECSInstanceType:
    Type: String
    Label: ECS インスタンスタイプ
    Description: ECS インスタンスタイプを選択します。リストは選択したゾーンによってフィルタリングされます。
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}

  ECSDiskSize:
    Type: Number
    Label: システムディスクサイズ (GiB)
    Description: ECS システムディスクサイズ、範囲 40-500 GiB
    Default: 40
    MinValue: 40
    MaxValue: 500

  ECSDiskCategory:
    Type: String
    Label: システムディスクカテゴリ
    Description: "システムディスクタイプ。オプション: cloud_essd (ESSD (エンタープライズ SSD))、cloud_ssd (標準 SSD)、cloud_efficiency (Ultra ディスク)"
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}
      InstanceType: ${ECSInstanceType}

  EcsInstancePassword:
    Type: String
    NoEcho: true
    Label: ECS インスタンスパスワード
    Description: 長さ 8-30、大文字、小文字、数字、特殊文字のうち少なくとも 3 種類を含む必要があります
    MinLength: 8
    MaxLength: 30

  # --- データベースパラメーター ---
  DBInstanceClass:
    Type: String
    Label: RDS インスタンスクラス
    Description: RDS インスタンスクラスを選択します。エンジンタイプとゾーンによってフィルタリングされます。
    AssociationProperty: ALIYUN::RDS::Instance::InstanceType
    AssociationPropertyMetadata:
      Engine: MySQL
      ZoneId: ${VSwitchZoneId}
      EngineVersion: '8.0'
      Category: Basic
      InstanceChargeType: Postpaid

  DBInstanceStorage:
    Type: Number
    Label: RDS ストレージ (GB)
    Description: RDS ストレージサイズ、範囲 20-2000 GB、5 単位で増分
    Default: 200
    MinValue: 20
    MaxValue: 2000

  DBName:
    Type: String
    Label: データベース名
    Description: 初期データベース名。文字で始まり、英数字のみ使用可能です。
    Default: employees
    MinLength: 1
    MaxLength: 64

  DBUsername:
    Type: String
    Label: データベースユーザー名
    Description: RDS プライマリアカウント名。2-16 文字の小文字で、文字で始まる必要があります。
    Default: rdsuser
    MinLength: 2
    MaxLength: 16

  DBPassword:
    Type: String
    NoEcho: true
    Label: データベースパスワード
    Description: RDS データベースユーザーパスワード

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: '-1/-1'
          Priority: 1
          IpProtocol: all
          NicType: intranet
          SourceCidrIp: '0.0.0.0/0'

  # === データベースレイヤー ===
  DBInstance:
    Type: ALIYUN::RDS::DBInstance
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      Engine: MySQL
      EngineVersion: '8.0'
      DBInstanceClass:
        Ref: DBInstanceClass
      DBInstanceStorage:
        Ref: DBInstanceStorage
      DBInstanceNetType: Intranet
      DBMappings:
        - CharacterSetName: utf8
          DBName:
            Ref: DBName
      SecurityIPList: 0.0.0.0/0

  DBAccount:
    Type: ALIYUN::RDS::Account
    DependsOn:
      - DBInstance
    Properties:
      DBInstanceId:
        Fn::GetAtt:
          - DBInstance
          - DBInstanceId
      AccountPassword:
        Ref: DBPassword
      AccountType: Super
      AccountName:
        Ref: DBUsername

  # === コンピュートレイヤー + データベース初期化 ===
  EcsInstance:
    Type: ALIYUN::ECS::Instance
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ImageId: aliyun_3_x64_20G_alibase
      AllocatePublicIP: true  # OSS からデータファイルをダウンロードするにはパブリック IP が必要です
      InstanceType:
        Ref: ECSInstanceType
      SystemDiskSize:
        Ref: ECSDiskSize
      SystemDiskCategory:
        Ref: ECSDiskCategory
      Password:
        Ref: EcsInstancePassword

  InstanceRunCommand:
    Type: ALIYUN::ECS::RunCommand
    DependsOn:
      - DBAccount  # 接続する前にデータベースアカウントの準備が完了するのを待ちます
    Properties:
      CommandContent:
        Fn::Sub:
          - |
            #!/bin/bash
            yum -y install mariadb unzip
            wget -P /tmp https://ros-userdata-resources.oss-cn-beijing.aliyuncs.com/MySQL/test_db-master.zip
            unzip /tmp/test_db-master.zip -d /tmp/
            mysql -h${DBConnectString} -P3306 -u${DBUsername} -p${DBPassword} < /tmp/test_db-master/employees.sql
          - DBConnectString:
              Fn::GetAtt:
                - DBInstance
                - InnerConnectionString
            DBUsername:
              Ref: DBUsername
            DBPassword:
              Ref: DBPassword
      Type: RunShellScript
      InstanceIds:
        - Fn::GetAtt:
            - EcsInstance
            - InstanceId
      Timeout: '500'

Outputs:
  RDSInnerConnectionString:
    Description: RDS 内部エンドポイント
    Label: RDS 内部エンドポイント
    Value:
      Fn::GetAtt:
        - DBInstance
        - InnerConnectionString
  RDSPort:
    Description: RDS ポート
    Label: RDS ポート
    Value:
      Fn::GetAtt:
        - DBInstance
        - InnerPort
  ECSPrivateIp:
    Description: ECS 内部 IP アドレス
    Label: ECS 内部 IP アドレス
    Value:
      Fn::GetAtt:
        - EcsInstance
        - PrivateIp
  ECSPublicIp:
    Description: ECS パブリック IP アドレス
    Label: ECS パブリック IP アドレス
    Value:
      Fn::GetAtt:
        - EcsInstance
        - PublicIp

# === Metadata: コンソールパラメーターグループ構成 ===
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - VSwitchZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            en: ネットワーク構成
      - Parameters:
          - ECSInstanceType
          - ECSDiskSize
          - ECSDiskCategory
          - EcsInstancePassword
        Label:
          default:
            en: ECS インスタンス構成
      - Parameters:
          - DBInstanceClass
          - DBInstanceStorage
          - DBName
          - DBUsername
          - DBPassword
        Label:
          default:
            en: データベース構成

ROS ビルトイン関数のクイックリファレンス

関数

構文例

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

説明

Ref

Ref: MyVpc

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

パラメーターを参照する場合はパラメーター値を返し、リソースを参照する場合はプライマリ ID を返します

Fn::GetAtt

Fn::GetAtt: [DBInstance, InnerConnectionString]

RDS 内部エンドポイントを取得

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

Fn::Sub

Fn::Sub: [string, {variable mapping}]

シェルコマンドでデータベース接続情報を連結

テンプレート文字列内で ${Var} を使用して変数を参照します

デプロイメント

デプロイパラメーター

必須パラメーター (デプロイ時に指定が必要)

パラメーター

タイプ

説明

制約

DBPassword

String

ApsaraDB RDS ユーザーパスワード

RDS パスワードポリシーに従ってください

オプションパラメーター (デフォルト値があり、変更しなくてもよい)

パラメーター

デフォルト値

説明

VpcCidrBlock

192.168.0.0/16

VPC CIDR アドレス範囲

VSwitchCidrBlock

192.168.0.0/24

vSwitch サブネット CIDR

VSwitchZoneId

ゾーン ID (コンソールで動的に選択)

ECSInstanceType

ECS インスタンスタイプ (コンソールで動的にフィルタリング)

ECSDiskCategory

cloud_essd

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

ECSDiskSize

40

ECS システムディスクサイズ (GiB)、範囲 40-500

EcsInstancePassword

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

DBInstanceClass

RDS インスタンスタイプ (コンソールで動的にフィルタリング)

DBInstanceStorage

200

RDS ストレージサイズ (GB)、範囲 20-2000

DBName

employees

初期データベース名

DBUsername

rdsuser

データベースアカウント名 (2-16 文字の小文字)

デプロイ方法

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

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

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

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

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

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

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

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

# プロンプト
ECS インスタンスと ApsaraDB RDS MySQL インスタンスをデプロイします。クラウドアシスタントを使用して RDS データベースを初期化します。初期化データのダウンロード URL は次のとおりです: https://ros-userdata-resources.oss-cn-beijing.aliyuncs.com/MySQL/test_db-master.zip
要件:
1. ECS は新しく作成された VPC と vSwitch を使用します。
2. ECS セキュリティグループはインバウンドポート 22 と 3306 を開きます。
3. 新しい RDS スーパーアカウントを作成し、それを使用して RDS データベースを初期化します。
4. ECS にはパブリック IP アドレスが必要です。
5. VpcCidrBlock、VSwitchZoneId、VSwitchCidrBlock、ECSInstanceType、および ECSDiskCategory は、動的なコンソールフィルタリングのために AssociationProperty と AssociationPropertyMetadata を使用する必要があります。

よくある質問

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

原因:選択された ECS インスタンスタイプが指定されたゾーンに在庫がありません。

ソリューション:

  • 高度なテンプレートでは、AssociationProperty が利用可能なタイプを自動的にフィルタリングしてこの問題を防止します。

  • 基本テンプレートを使用する場合は、Elastic Compute Service 製品ページの料金タブにアクセスして、ターゲットゾーンでのインスタンスタイプの可用性を確認するか、別のゾーンに切り替えてください。

Q2: クラウドアシスタントのコマンド実行がタイムアウトします (RunCommand タイムアウト)

原因:データファイルのダウンロードが遅いか、SQL のインポートが設定された Timeout 値を超えています。

ソリューション:

  1. テンプレートの Timeout 値を増やします (例:'600' 以上に変更)。

  2. ECS インスタンスがファイルをダウンロードするためにインターネットにアクセスできることを確認します (AllocatePublicIP: true または NAT Gateway を設定)。

  3. データファイルを ECS インスタンスと同じリージョンの OSS バケットに保存し、内部エンドポイント経由でダウンロードします。

Q3: ECS が RDS に接続できず、「Can't connect to MySQL server」というエラーが表示されます

トラブルシューティング手順:

  1. ECS と RDS が同じ VPC と vSwitch にあることを確認します (テンプレートによって保証されています)。

  2. RDS ホワイトリスト (SecurityIPList) に ECS 内部 IP 範囲が含まれているか、0.0.0.0/0 に設定されていることを確認します。

  3. RDS インスタンスのステータスが実行中であることを確認します (DependsOn: DBAccount は、コマンドが実行される前に RDS の準備が完了していることを保証します)。

  4. セキュリティグループルールがポート 3306 でのアウトバウンドトラフィックを許可していることを確認します。

Q4: 新しい VPC を作成する代わりに、既存の VPC を使用するにはどうすればよいですか?

ソリューション:Resources から VPCvSwitch を削除し、代わりに 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}

Q5: このテンプレートを PostgreSQL で使用するように変更するにはどうすればよいですか?

必要な変更:

  1. RDS リソースを Engine: PostgreSQLEngineVersion: '16.0' に変更します。

  2. DBInstanceClass を PostgreSQL インスタンスタイプ (例:pg.n4.medium.2c) に更新します。

  3. RunCommandmysql コマンドを psql コマンドに置き換えます。

  4. 初期化 SQL ファイルを PostgreSQL と互換性があるように更新します。

    その他のデプロイに関する問題については、「よくある質問」をご参照ください。

リファレンス