本書では、Resource Orchestration Service (ROS) テンプレートを編集して、スケーリンググループを使用して複数の Elastic Compute Service (ECS) インスタンスを管理する方法について、簡単な設定からより複雑な設定へと段階的に説明します。
前提条件
ROSテンプレートの構文と構造に精通しています。 詳細については、「テンプレートの使用開始方法」をご参照ください。
シナリオ例
Alibaba Cloud の virtual private cloud (VPC) にスケーリングルールを持つスケーリンググループを作成し、そのグループに ECS インスタンスを追加し、設定されたルールに基づいてインスタンスをスケールアウトまたはスケールインします。
注意事項
上記のリソースのリソースタイプを表示して、各リソースプロパティの詳細を取得できます。 詳細については、「リソースタイプの表示」をご参照ください。
リソースタイプは、タイプ、必要かどうか、編集可能かどうかなど、リソースのプロパティを宣言します。 プロパティが必要な場合は、テンプレートの [リソース] セクションの [プロパティ] 部分でプロパティを宣言する必要があります。 プロパティがオプションの場合は、プロパティを空のままにすることができます。 プロパティが編集可能な場合は、スタックテンプレートのクラウドリソースにプロパティを指定した後で、新しいテンプレートのプロパティを変更できます。 次に、新しいテンプレートを使用してスタックとリソースを更新できます。 それ以外の場合は、プロパティを変更できません。
テンプレートの編集
リソースタイプのドキュメントを参照して、ニーズに最適なリソースタイプを見つけることができます。 詳細については、「サービス別のリソースタイプのリスト」をご参照ください。
このシナリオでは、VPC (ALIYUN::ECS::VPC)、ECS インスタンス (ALIYUN::ECS::Instance)、およびスケーリンググループ (ALIYUN::ESS::ScalingGroup) を作成する必要があります。 また、ECS インスタンス用の vSwitch (ALIYUN::ECS::VSwitch) とセキュリティグループ (ALIYUN::ECS::SecurityGroup)、スケーリンググループ用のスケーリング設定 (ALIYUN::ESS::ScalingConfiguration)、およびスケーリンググループを有効化するリソース (ALIYUN::ESS::ScalingGroupEnable) も必要です。
テンプレートリソースとその依存関係の定義
基本的なネットワークリソースの定義
テンプレートで基本的なネットワークリソースである Vpc、vSwitch、EcsSecurityGroup を定義します。
-
Ref組み込み関数とALIYUN::StackName疑似パラメーターを使用してスタック名を取得し、VpcのVpcNameやvSwitchのVSwitchNameなどのリソースプロパティの値として使用します。 詳細については、「Ref」および「ALIYUN::StackName」をご参照ください。 -
Fn::SelectおよびFn::GetAZs組み込み関数をALIYUN::Region疑似パラメーターと共に使用して、スタックが作成されるリージョン内の最初のゾーンの ID を取得します (例:vSwitchのZoneIdプロパティ)。 詳細については、「関数」および「ALIYUN::Region」をご参照ください。
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:
Fn::Select:
- '0'
- Fn::GetAZs:
Ref: ALIYUN::Region
CidrBlock: 192.168.0.0/24
EcsSecurityGroup:
Type: ALIYUN::ECS::SecurityGroup
Properties:
SecurityGroupName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc
SecurityGroupEgress:
- PortRange: '-1/-1'
Priority: 1
IpProtocol: all
DestCidrIp: 0.0.0.0/0
NicType: intranet
ECS リソースの定義
テンプレートで ECS リソース EcsInstance を定義します。
Ref 組み込み関数を使用して、テンプレート内の他のリソースの論理名 (例:Vpc リソースの VpcId、EcsSecurityGroup リソースの SecurityGroupId、vSwitch リソースの VSwitchId) を参照します。 詳細については、「Ref」をご参照ください。
Resources:
EcsInstance:
Type: ALIYUN::ECS::Instance
Properties:
VpcId:
Ref: Vpc
SecurityGroupId:
Ref: EcsSecurityGroup
VSwitchId:
Ref: VSwitch
ImageId: centos_7
AllocatePublicIP: false
InstanceType: ecs.c5.large
SystemDiskSize: 40
SystemDiskCategory: cloud_essd
Password:
Ref: EcsInstancePassword
スケーリンググループリソースの定義
テンプレートでスケーリンググループリソース EssInstanceScalingGroup、EssInstanceScalingGroupEnable、EssInstanceScalingConfiguration を定義します。
-
Fn::GetAtt組み込み関数を使用して、リソース属性の値 (例:EssInstanceScalingGroupEnableのInstanceIds) を取得します。 詳細については、「Fn::GetAtt」をご参照ください。 -
Fn::Sub組み込み関数を使用して、入力文字列内の変数を指定された値に置き換えます。 たとえば、EssInstanceScalingConfigurationのScalingConfigurationNameプロパティにこの関数を使用できます。 詳細については、「Fn::Sub」をご参照ください。
Resources:
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
InstanceName:
Fn::Join:
- '-'
- - Ref: ALIYUN::StackName
- '[1,4]'
EssInstanceScalingGroupEnable:
Type: ALIYUN::ESS::ScalingGroupEnable
Properties:
ScalingRuleArisExecuteVersion: '1'
ScalingConfigurationId:
Ref: EssInstanceScalingConfiguration
InstanceIds:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
ScalingGroupId:
Ref: EssInstanceScalingGroup
完全なサンプルテンプレート
ROSTemplateFormatVersion: '2015-09-01'
Description: { }
Parameters:
EcsInstancePassword:
NoEcho: true
Type: String
Description: インスタンスのログオンパスワード。 長さが 8~30 文字で、大文字、小文字、数字、特殊文字の 4 種類のうち、少なくとも 3 種類を含める必要があります。 特殊文字には、()`~!@#$%^&*_-+=|{}[]:;'<>,.?/. が含まれます。
AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$'
Label: インスタンスのパスワード
ConstraintDescription: パスワードは長さが 8~30 文字で、大文字、小文字、数字、特殊文字の 4 種類のうち、少なくとも 3 種類を含める必要があります。 特殊文字には、()`~!@#$%^&*_-+=|{}[]:;'<>,.?/. が含まれます。
MinLength: 8
MaxLength: 30
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:
Fn::Select:
- '0'
- Fn::GetAZs:
Ref: ALIYUN::Region
CidrBlock: 192.168.0.0/24
EcsSecurityGroup:
Type: ALIYUN::ECS::SecurityGroup
Properties:
SecurityGroupName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc
SecurityGroupEgress:
- PortRange: '-1/-1'
Priority: 1
IpProtocol: all
DestCidrIp: 0.0.0.0/0
NicType: intranet
EcsInstance:
Type: ALIYUN::ECS::Instance
Properties:
VpcId:
Ref: Vpc
SecurityGroupId:
Ref: EcsSecurityGroup
VSwitchId:
Ref: VSwitch
ImageId: centos_7
AllocatePublicIP: false
InstanceType: ecs.c5.large
SystemDiskSize: 40
SystemDiskCategory: cloud_essd
Password:
Ref: EcsInstancePassword
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
InstanceName:
Fn::Join:
- '-'
- - Ref: ALIYUN::StackName
- '[1,4]'
EssInstanceScalingGroupEnable:
Type: ALIYUN::ESS::ScalingGroupEnable
Properties:
ScalingRuleArisExecuteVersion: '1'
ScalingConfigurationId:
Ref: EssInstanceScalingConfiguration
InstanceIds:
Fn::GetAtt:
- EcsInstance
- InstanceIds
ScalingGroupId:
Ref: EssInstanceScalingGroup
テンプレートパラメーターグループの追加とパラメーター設定の動的取得
前のセクションのテンプレートは基本的なリソースを定義していますが、インスタンスタイプなどのプロパティ値はハードコーディングされています。このセクションでは、テンプレートを拡張して柔軟性と再利用性を向上させます。主な変更点は、単一のインスタンス (ALIYUN::ECS::Instance) をインスタンスグループ (ALIYUN::ECS::InstanceGroup) に置き換えて複数のインスタンスを管理し、Parameters セクションを導入してスタック作成時に設定を動的に指定できるようにすることです。
テンプレートパラメーターグループの追加
テンプレートの Metadata セクションを使用して、パラメーターをグループ化し、グループラベルを定義します。
テンプレートのリソースとパラメーターを定義した後、次のように対応するリソースごとにパラメーターをグループ化します。
|
リソースパラメーターの分類 |
リソース名 |
パラメーター名 |
|
基本的なネットワーク設定 |
|
|
|
ECS 設定 |
|
|
|
スケーリンググループリソースの設定 |
|
|
パラメーター設定の動的取得
ECSInstanceType を例にとります。 コンソールでフィルター条件を設定し、パラメーター値を動的に選択するには、パラメーターでサポートされている AssociationProperty の値を見つけます。 値 ALIYUN::ECS::Instance::InstanceType は、ALIYUN::ECS::Instance リソースタイプの AssociationProperty および AssociationPropertyMetadata セクションに記載されており、ZoneId がフィルター条件となります。 詳細については、「AssociationProperty および AssociationPropertyMetadata」をご参照ください。
完全なサンプルテンプレート
ROSTemplateFormatVersion: '2015-09-01'
Description: オートスケーリングをサポートする ECS デプロイメント。
Parameters:
VSwitchZoneId:
Type: String
AssociationProperty: ALIYUN::ECS::Instance::ZoneId
Description: vSwitch のゾーン ID。
Label: vSwitch ゾーン ID
VpcCidrBlock:
Default: 192.168.0.0/16
Label: VPC CIDR ブロック
Type: String
Description: 新しい VPC の CIDR ブロック。 次のいずれかの CIDR ブロックを使用することを推奨します。<font color='green'>[10.0.XX.XX/8]</font><br><font color='green'>[172.16.XX.XX/12]</font><br><font color='green'>[192.168.XX.XX/16]</font>
VSwitchCidrBlock:
Default: 192.168.0.0/24
Type: String
Description: CIDR ブロックは VPC のサブネットである必要があり、別の vSwitch で使用されていない必要があります。
Label: vSwitch CIDR ブロック
ECSInstanceType:
Type: String
Label: インスタンスタイプ
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${VSwitchZoneId}
InstanceChargeType: ${InstanceChargeType}
ECSDiskCategory:
Type: String
Description: '<font color=''blue''><b>有効な値:</font>[cloud_efficiency: <font color=''green''>ウルトラディスク</font>]<br>[cloud_ssd: <font color=''green''>標準 SSD</font>]<br>[cloud_essd: <font color=''green''>エンタープライズ SSD</font>]<br>[cloud: <font color=''green''>ベーシックディスク</font>]<br>[ephemeral_ssd: <font color=''green''>ローカル SSD</font>]'
AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
AssociationPropertyMetadata:
ZoneId: ${VSwitchZoneId}
InstanceType: ${ECSInstanceType}
Label: システムディスクタイプ
ECSImageId:
AssociationProperty: ALIYUN::ECS::Image::ImageId
Label: イメージ ID
Description: ECS インスタンスの作成に使用されるイメージの ID。 <font><a href='https://www.alibabacloud.com/help/doc-detail/112977.html' target='_blank'><b>イメージリソースの表示</font color='blue'></a>
Type: String
EcsInstancePassword:
NoEcho: true
Type: String
Description: インスタンスのログオンパスワード。 パスワードは長さが 8~30 文字で、大文字、小文字、数字、特殊文字 (()`~!@#$%^&*_-+=|{}[]:;'<>,.?./) のうち、少なくとも 3 つのカテゴリの文字を含める必要があります。
AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$'
Label: インスタンスのパスワード
ConstraintDescription: パスワードは長さが 8~30 文字で、大文字、小文字、数字、特殊文字 (()`~!@#$%^&*_-+=|{}[]:;'<>,.?./) のうち、少なくとも 3 つのカテゴリの文字を含める必要があります。
MinLength: 8
MaxLength: 30
AssociationProperty: ALIYUN::ECS::Instance::Password
ECSInstanceGroupCount:
Type: Number
Description: ECS インスタンスの数。
Label: インスタンス数
Default: 3
ESSGroupMaxSize:
Type: Number
Label: スケーリンググループ内の 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::Join:
- '-'
- - Ref: ALIYUN::StackName
- '[1,4]'
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
EssInstanceScalingGroupEnable:
Type: ALIYUN::ESS::ScalingGroupEnable
Properties:
ScalingRuleArisExecuteVersion: '1'
ScalingConfigurationId:
Ref: EssInstanceScalingConfiguration
InstanceIds:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
ScalingGroupId:
Ref: EssInstanceScalingGroup
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::Join:
- '-'
- - Ref: ALIYUN::StackName
- '[1,4]'
EssInstanceScalingGroup:
Type: ALIYUN::ESS::ScalingGroup
Properties:
ScalingGroupName:
Ref: ALIYUN::StackName
RemovalPolicys:
- NewestInstance
MinSize:
Ref: ECSInstanceGroupCount
MaxSize: 50
VSwitchId:
Ref: VSwitch
DefaultCooldown: 300
Metadata:
ALIYUN::ROS::Interface:
ParameterGroups:
- Parameters:
- VSwitchZoneId
- VpcCidrBlock
- VSwitchCidrBlock
Label:
default: 基本的なネットワーク設定
- Parameters:
- ECSInstanceType
- ECSDiskCategory
- ECSImageId
- EcsInstancePassword
- ECSInstanceGroupCount
Label:
default: ECS インスタンス設定
- Parameters:
- ESSGroupMaxSize
Label:
default: スケーリンググループ設定