このチュートリアルでは、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 |
| 分離されたネットワーク環境を提供します。すべてのリソースは同じ VPC 内にデプロイされます。 |
2 | vSwitch |
| VPC 内のサブネットを分割し、ゾーンを指定します。 |
3 | セキュリティグループ |
| ECS インスタンスのインバウンドおよびアウトバウンドトラフィックを制御します。 |
4 | ECS インスタンス |
| データベース初期化スクリプトを実行するコンピュートノードです。 |
5 | ApsaraDB RDS MySQL インスタンス |
| 初期化されたデータを格納するターゲットデータベースです。 |
6 | データベースアカウント |
| ECS インスタンスがデータベースに接続するために使用する RDS ログインアカウントです。 |
7 | クラウドアシスタントコマンド |
| ECS インスタンス上でシェルスクリプトをリモート実行し、データベースの初期化を行います。 |
デプロイ後の期待される結果
テンプレートが正常にデプロイされると、以下のものが作成されます。
VPC、vSwitch、セキュリティグループを含む完全な VPC ネットワーク環境。
VPC ネットワークとセキュリティグループにアタッチされた ECS インスタンス。
初期データベースとスーパーアカウントを持つ ApsaraDB RDS MySQL 8.0 インスタンス。
MySQL 公式の employees サンプルデータセット (約 300,000 レコード) がデータベースに自動的にインポートされます。
アーキテクチャ図

前提条件
開始する前に、以下を確認してください。
アカウントと権限:ECS、ApsaraDB RDS、VPC、およびクラウドアシスタントでリソースを作成する権限を持つ Alibaba Cloud アカウント。
知識の準備: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などのカスタム名には擬似パラメーターを使用できます。これにより、デプロイ後にスタックに関連付けられたリソースを迅速に見つけることができます。セキュリティグループルールは、ビジネスニーズに合わせてカスタマイズできます。例:
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 # アカウント名基本概念:
RefとFn::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 インスタンスの InstanceType や SystemDiskCategory、RDS インスタンスの DBInstanceClass などのプロパティは固定値を使用しています。テンプレートを異なるリージョンや仕様で再利用する場合、毎回テンプレートを編集する必要があります。テンプレート内のパラメーターは、しばしば依存関係を持ちます。例えば、ECS インスタンスタイプはゾーンによって制約され (ゾーンごとに提供されるタイプが異なる)、システムディスクカテゴリはゾーンとインスタンスタイプの両方によってさらに制約されます。これらのパラメーターを手動で入力すると、デプロイの失敗を引き起こす無効な組み合わせを簡単に選択してしまう可能性があります。
以下の改善により、テンプレートは柔軟で再利用可能になります。
パラメーター化 (Parameters) — 変動する設定をパラメーターとして抽出し、デプロイ時に動的に入力します。
動的パラメーターフィルタリング (AssociationProperty) — ROS コンソールが選択されたパラメーターに基づいて利用可能なオプションを自動的にフィルタリングするようにします。
パラメーターのグループ化 (Metadata) — コンソールでパラメーターを論理的なカテゴリ別にグループ化し、設定エクスペリエンスを向上させます。
パラメーターの依存関係図
以下の図は、ECS インスタンスタイプ、システムディスクカテゴリ、RDS インスタンスタイプを例として、依存関係の連鎖を示しています。
VSwitchZoneId (ゾーン) <- 基本パラメーター、前提条件なし
|
|-> ECSInstanceType (ECS インスタンスタイプ)
| | 依存先: ZoneId
| |
| |-> ECSDiskCategory (システムディスクカテゴリ)
| 依存先: ZoneId + InstanceType
|
|-> DBInstanceClass (RDS インスタンスタイプ)
依存先: ZoneId + Engine (固定値)中心的なアプローチ:まずゾーンを選択し、それに応じて ECS と RDS のインスタンスタイプをフィルタリングし、最後にゾーンと ECS インスタンスタイプに基づいてディスクカテゴリをフィルタリングします。各ステップでは、現在の条件下で利用可能なオプションのみが表示され、無効な組み合わせを防ぎます。
AssociationProperty の仕組み
1. VSwitchZoneId — ゾーン (基本パラメーター)
AssociationProperty を ALIYUN::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 インスタンスタイプ
AssociationProperty を ALIYUN::ECS::Instance::InstanceType に設定し、${VSwitchZoneId} を関連付けて、選択したゾーンで利用可能な ECS インスタンスタイプをフィルタリングします。
ECSInstanceType:
Type: String
Label:
zh-cn: ECS 实例规格
en: ECS インスタンスタイプ
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${VSwitchZoneId}利用可能なインスタンスタイプはゾーンによって異なります。フィルタリングしないと、ユーザーは選択したゾーンで在庫切れのタイプを選択してしまい、作成が失敗する可能性があります。
3. ECSDiskCategory — システムディスクカテゴリ
AssociationProperty を ALIYUN::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 インスタンスタイプ
AssociationProperty を ALIYUN::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 コンソールでスタックを作成すると、パラメーターの選択がカスケードをトリガーします。
ゾーン (
VSwitchZoneId) を選択します。ECS インスタンスタイプのドロップダウンが更新され、そのゾーンで利用可能なタイプのみが表示されます。
RDS インスタンスタイプのドロップダウンが更新され、そのゾーンで MySQL をサポートするタイプのみが表示されます。
ECS インスタンスタイプが選択されると、システムディスクカテゴリのドロップダウンが更新され、そのゾーンとインスタンスタイプの組み合わせでサポートされているカテゴリのみが表示されます。
これにより、各選択で有効なオプションのみが表示され、無効なパラメーターの組み合わせによるデプロイの失敗がなくなります。
Metadata パラメーターのグループ化
Metadata 内の ALIYUN::ROS::Interface を使用して、パラメーターをラベル付きの論理グループに整理します。コンソールはパラメーターをグループで表示し、設定エクスペリエンスを向上させます。
Metadata 構文
Metadata:
ALIYUN::ROS::Interface:
ParameterGroups: # パラメーターグループリスト (必須)
- Parameters: # このグループ内のパラメーター (必須)
- ParameterName1
- ParameterName2
Label: # グループレベル (必須)
default:
en: 英語のラベルテキストMetadata ルール:
ParameterGroups、Parameters、Labelはすべて必須です。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 アベイラビリティゾーン |
ECS インスタンス構成 | ECS インスタンスタイプ |
データベース構成 | RDS インスタンスクラス |
高度なテンプレートの完成版
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 ビルトイン関数のクイックリファレンス
関数 | 構文例 | このテンプレートでの使用法 | 説明 |
|
| パラメーター値またはリソースのプライマリ識別子を参照 | パラメーターを参照する場合はパラメーター値を返し、リソースを参照する場合はプライマリ ID を返します |
|
| RDS 内部エンドポイントを取得 | 作成後にリソースの出力属性を返します (プライマリ識別子ではない) |
|
| シェルコマンドでデータベース接続情報を連結 | テンプレート文字列内で |
デプロイメント
デプロイパラメーター
必須パラメーター (デプロイ時に指定が必要)
パラメーター | タイプ | 説明 | 制約 |
| String | ApsaraDB RDS ユーザーパスワード | RDS パスワードポリシーに従ってください |
オプションパラメーター (デフォルト値があり、変更しなくてもよい)
パラメーター | デフォルト値 | 説明 |
| 192.168.0.0/16 | VPC CIDR アドレス範囲 |
| 192.168.0.0/24 |
|
| — | ゾーン ID (コンソールで動的に選択) |
| — | ECS インスタンスタイプ (コンソールで動的にフィルタリング) |
|
| ECS システムディスクカテゴリ |
| 40 | ECS システムディスクサイズ (GiB)、範囲 40-500 |
| — | ECS インスタンスログインパスワード。長さ 8-30、大文字、小文字、数字、特殊文字のうち少なくとも 3 種類を含む必要があります。 |
| — | RDS インスタンスタイプ (コンソールで動的にフィルタリング) |
| 200 | RDS ストレージサイズ (GB)、範囲 20-2000 |
| employees | 初期データベース名 |
| rdsuser | データベースアカウント名 (2-16 文字の小文字) |
デプロイ方法
方法 1: ROS コンソール経由でのデプロイ
ROS コンソールにログインします。
左側のナビゲーションウィンドウで、[スタック > スタックの作成] を選択します。
[既存のテンプレートを選択 > テンプレートの内容を入力] を選択し、完全なテンプレートをエディターに貼り付けます。
[次へ] をクリックし、グループごとにパラメーターを設定します。
構成を確認した後、[作成] をクリックし、スタックのステータスが
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 値を超えています。
ソリューション:
テンプレートの
Timeout値を増やします (例:'600'以上に変更)。ECS インスタンスがファイルをダウンロードするためにインターネットにアクセスできることを確認します (
AllocatePublicIP: trueまたは NAT Gateway を設定)。データファイルを ECS インスタンスと同じリージョンの OSS バケットに保存し、内部エンドポイント経由でダウンロードします。
Q3: ECS が RDS に接続できず、「Can't connect to MySQL server」というエラーが表示されます
トラブルシューティング手順:
ECS と RDS が同じ VPC と
vSwitchにあることを確認します (テンプレートによって保証されています)。RDS ホワイトリスト (
SecurityIPList) に ECS 内部 IP 範囲が含まれているか、0.0.0.0/0に設定されていることを確認します。RDS インスタンスのステータスが実行中であることを確認します (
DependsOn: DBAccountは、コマンドが実行される前に RDS の準備が完了していることを保証します)。セキュリティグループルールがポート 3306 でのアウトバウンドトラフィックを許可していることを確認します。
Q4: 新しい VPC を作成する代わりに、既存の 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}Q5: このテンプレートを PostgreSQL で使用するように変更するにはどうすればよいですか?
必要な変更:
RDS リソースを
Engine: PostgreSQLとEngineVersion: '16.0'に変更します。DBInstanceClassを PostgreSQL インスタンスタイプ (例:pg.n4.medium.2c) に更新します。RunCommandのmysqlコマンドをpsqlコマンドに置き換えます。初期化 SQL ファイルを PostgreSQL と互換性があるように更新します。
その他のデプロイに関する問題については、「よくある質問」をご参照ください。