ROSキーを使用したデータディスクの作成、パーティション化、フォーマットおよびマウント
21335 ワード
各アプリケーションに対してデータを格納する需要があり、アリクラウドECSは異なるユーザーの需要に対して3種類のデータクラウドディスク、普通のクラウドディスク、高効率クラウドディスク、SSDクラウドディスクを提供している.ECSコンソールを使用すると、インスタンスごとに最大4つの空のデータディスクを作成するか、既存のデータディスクのsnapshotに基づいて4つのデータを含むクラウドディスクを生成できます.しかし、上記のようにして生成されたデータクラウドディスクは、直接使用することはできず、ユーザーがECSインスタンスにログインして手動で構成する必要がある.空のデータディスクの場合、ユーザーはECSのインスタンスの手動パーティションにログインし、フォーマットし、マウントします.snapshotで生成されたデータディスクの場合、ユーザーは自分でmountを手動で行う必要があります.これは、複数のECSインスタンスを使用するユーザーの導入に対して、複雑な体力的な作業であり、エラーが発生しやすい.
この文書では、リソース・アレンジ・キーに基づいてデータ・ディスクを作成し、UserDataによって自動的にパーティション化し、フォーマットし、データ・ディスクをマウントする便利な方法を提供します.
データディスクの作成
データディスクの作成には、次の2つの方法があります. ECSインスタンスとしての属性DiskMappings DiskMappingsはリストタイプの属性であり、リストの各項目は1つのデータディスクの定義を表し、ユーザーはデータディスク名、サイズ、タイプ、およびソースsnapshotIdを指定することができる. stackのリソースとして、diskリソースを対応するECSALIYUN::ECS::Diskがテンプレートで指定するリソースは、データディスクを作成する必要があることを示し、ユーザーはデータディスク名、サイズ、ドメイン、ソースsnapshotIdなどのALIYUN::ECS::DiskAttachmentは、どのデータディスクがどのECSインスタンスに関連付けられるかを指定します.指定するプロパティには、ALIYUN::ECS::DiskのIdとECSインスタンスのIdが含まれます.上記のようにソースデータ付きクラウドディスクを作成する場合でも、ソースデータディスクsnapshotは作成するデータディスクと同じドメインにある必要があります.
UserDataによるデータディスクの処理
ROSはユーザーにUserDataメカニズムを提供し、ユーザーはECSを作成するときに、UserDataスクリプトを指定することで、ECSが最初に起動したときに構成と初期化の仕事をすることができます.ユーザーは、自分のニーズに合わせて、UserDataスクリプトを自由に作成できます.次に、ROSとUserDataメカニズムを使用して、データディスクの作成と自動パーティション化、フォーマット、mountをワンタッチで実現する方法を2つの簡単な例で説明します.
UserDataフッター処理空データディスク
この例では、ECSインスタンスを作成し、インスタンスに2つの空のデータディスクを作成し、インスタンスをアリクラウドの独自のネットワークに配置し、このインスタンスに後続のアクセスのためにフレックスIPを割り当てます.DiskMappingsインスタンスプロパティを使用して、ROSがデータディスクを作成する方法を説明します.この例では、データディスクの名前、サイズを定義します.UserDataには簡単なスクリプトが指定されています.スクリプトでは、まずfdiskコマンドでデータディスクをパーティション化し、ext 4でデータディスクをフォーマットし、最後にデータディスクをマウントし、最後に/etc/fstabを構成してECSを起動するたびにデータディスクを正しくマウントすることができます.この例では、ユーザは、TotalDataDiskによって、どのくらいのブロックのデータディスクがあるかを説明することができ、MountPointは、データディスクのマウントポイントを指定する.私もROSのWaitConditionリソースを指定することで、UserDataスクリプトの実行結果を得ることができます.WaitConditionの使用はここを参考にすることができます.次は最終テンプレートです.
UserDataスクリプトは、ソースデータを含むデータディスクを処理します.
この例は、ソースデータのsnapshotに基づいてデータディスクを作成し、他の例は上記の例と似ています.この場合、新しいECSインスタンスのデータディスクはすでに分割されフォーマットされており、適切なマウントポイントにデータディスクをマウントするだけでよい.TotalDataDiskでどれだけのデータディスクがあるかを説明し、MountPointはデータディスクのマウントポイントを指定し、ROSのWaitConditionリソースを使用してUserDataスクリプトの実行結果を得る.次は最終テンプレートです.
に注意
上記の2つの例は、ROSスタックリソースを使用してデータディスクを作成するのではなく、DiskMappingsプロパティを使用していることに注目します.これは、DiskMappingsがECSリソースのプロパティであるため、ECSを起動するときにデータディスクが作成され、ECSインスタンスと関連付けられているためです.では、UserDataを実行すると、パーティション、フォーマット、マウントが完了します.ただし、ROS stackリソースでデータディスクを作成する場合は、まずECSリソースとDiskリソースを作成し、最後にdiskとECSインスタンスを関連付けます.では、ECSインスタンスが起動すると、データディスクはまだ対応するECSに関連付けられていないので、この場合、UserDataスクリプトを実行すると、データディスク、パーティション、フォーマット、マウントが見つかりません.データディスクを使用して、UserDataで自動的にデータディスクをマウントしたい場合は、DiskMappingsを使用してデータディスクを作成することをお勧めします.
この文書では、リソース・アレンジ・キーに基づいてデータ・ディスクを作成し、UserDataによって自動的にパーティション化し、フォーマットし、データ・ディスクをマウントする便利な方法を提供します.
データディスクの作成
データディスクの作成には、次の2つの方法があります.
UserDataによるデータディスクの処理
ROSはユーザーにUserDataメカニズムを提供し、ユーザーはECSを作成するときに、UserDataスクリプトを指定することで、ECSが最初に起動したときに構成と初期化の仕事をすることができます.ユーザーは、自分のニーズに合わせて、UserDataスクリプトを自由に作成できます.次に、ROSとUserDataメカニズムを使用して、データディスクの作成と自動パーティション化、フォーマット、mountをワンタッチで実現する方法を2つの簡単な例で説明します.
UserDataフッター処理空データディスク
この例では、ECSインスタンスを作成し、インスタンスに2つの空のデータディスクを作成し、インスタンスをアリクラウドの独自のネットワークに配置し、このインスタンスに後続のアクセスのためにフレックスIPを割り当てます.DiskMappingsインスタンスプロパティを使用して、ROSがデータディスクを作成する方法を説明します.この例では、データディスクの名前、サイズを定義します.UserDataには簡単なスクリプトが指定されています.スクリプトでは、まずfdiskコマンドでデータディスクをパーティション化し、ext 4でデータディスクをフォーマットし、最後にデータディスクをマウントし、最後に/etc/fstabを構成してECSを起動するたびにデータディスクを正しくマウントすることができます.この例では、ユーザは、TotalDataDiskによって、どのくらいのブロックのデータディスクがあるかを説明することができ、MountPointは、データディスクのマウントポイントを指定する.私もROSのWaitConditionリソースを指定することで、UserDataスクリプトの実行結果を得ることができます.WaitConditionの使用はここを参考にすることができます.次は最終テンプレートです.
{
"ROSTemplateFormatVersion": "2015-09-01",
"Parameters": {
"VpcName": {
"MaxLength": 128,
"Description": "VPC ",
"Type": "String",
"ConstraintDescription": "[2, 128] ",
"MinLength": 2
},
"SecurityGroupName": {
"Description": " ",
"Type": "String"
},
"VpcCidrBlock": {
"Default": "10.0.0.0/8",
"AllowedValues": [
"192.168.0.0/16",
"172.16.0.0/12",
"10.0.0.0/8"
],
"Type": "String"
},
"Password": {
"NoEcho": true,
"MaxLength": 30,
"Description": "ECS .",
"Type": "String",
"ConstraintDescription": "8-30 , 、 ",
"MinLength": 8
},
"DiskSize": {
"Default": 40,
"Type": "Number"
},
"TotalDataDisk": {
"Description": " ",
"Type": "String"
},
"ZoneId": {
"Description": " Id, の ",
"Type": "String"
},
"DiskName": {
"Type": "String"
},
"SystemDiskCategory": {
"Default": "cloud",
"AllowedValues": [
"cloud",
"cloud_efficiency",
"cloud_ssd"
],
"Description": " , (cloud)、 (cloud_efficiency) SSD (cloud_ssd)",
"Type": "String"
},
"MountPoint": {
"Description": " ",
"Type": "String"
},
"DestinationCidrBlock": {
"Default": "192.168.1.0",
"Description": "Route , 192.168.1.0/24 192.168.1.0",
"Type": "String"
},
"VSwitchCidrBlock": {
"Default": "10.0.10.0/24",
"Description": "VSwitch , VPC",
"Type": "String"
}
},
"Resources": {
"VSwitch": {
"Type": "ALIYUN::ECS::VSwitch",
"Properties": {
"CidrBlock": {
"Ref": "VSwitchCidrBlock"
},
"ZoneId": {
"Ref": "ZoneId"
},
"VpcId": {
"Fn::GetAtt": [
"Vpc",
"VpcId"
]
}
}
},
"Vpc": {
"Type": "ALIYUN::ECS::VPC",
"Properties": {
"CidrBlock": {
"Ref": "VpcCidrBlock"
},
"VpcName": {
"Ref": "VpcName"
}
}
},
"WaitCondition": {
"Type": "ALIYUN::ROS::WaitCondition",
"Properties": {
"Handle": {
"Ref": "WaitConHandle"
},
"Timeout": 200,
"Count": 1
}
},
"SecurityGroup": {
"Type": "ALIYUN::ECS::SecurityGroup",
"Properties": {
"SecurityGroupName": {
"Ref": "SecurityGroupName"
},
"VpcId": {
"Ref": "Vpc"
}
}
},
"NewEip": {
"Type": "ALIYUN::ECS::EIP",
"Properties": {
"InternetChargeType": "PayByTraffic",
"Bandwidth": 1
}
},
"SecurityGroupIngress": {
"Type": "ALIYUN::ECS::SecurityGroupIngress",
"Properties": {
"SourceCidrIp": "0.0.0.0/0",
"SecurityGroupId": {
"Ref": "SecurityGroup"
},
"IpProtocol": "all",
"NicType": "intranet",
"PortRange": "-1/-1"
}
},
"WebServer": {
"Type": "ALIYUN::ECS::Instance",
"Properties": {
"IoOptimized": "optimized",
"ImageId": "centos6u5_64_40G_cloudinit_20160427.raw",
"SecurityGroupId": {
"Ref": "SecurityGroup"
},
"Password": {
"Ref": "Password"
},
"DiskMappings": [
{
"DiskName": {
"Ref": "DiskName"
},
"Size": {
"Ref": "DiskSize"
}
},
{
"Size": {
"Ref": "DiskSize"
}
}
],
"SystemDiskCategory": {
"Ref": "SystemDiskCategory"
},
"UserData": {
"Fn::Join": [
"",
[
"#!/bin/sh
",
"logs=~/mount_logs
",
"i=1
",
"total=",
{
"Ref": "TotalDataDisk"
},
"
",
"mountpoint=",
{
"Ref": "MountPoint"
},
"
",
"while [ $i -le $total ]
",
"do
",
" j=`echo $i|awk '{printf \"%c\", 97+$i}'`
",
"fdisk -S 56 /dev/vd$j <> $logs
",
" mkfs.ext4 /dev/vd${j}1
",
" if [ $? -eq 0 ];then
",
" echo \"/dev/vd${j}1 is formated!\" >> $logs
",
" fi
",
" touch ~/test_ftab
",
" mkdir $mountpoint$i
",
"cat << ESXU > ~/test_ftab
",
"/dev/vd${j}1 $mountpoint$i ext4 defaults 0 0
",
"ESXU
",
" cat ~/test_ftab >> /etc/fstab
",
" mount -a
",
" chmod -R 777 $mountpoint$i
",
" rm -rf ~/test_ftab
",
" echo \"/dev/vd${j}1 is mounted!\" >> $logs
",
" let i+=1
",
"done
",
"
",
{
"Fn::GetAtt": [
"WaitConHandle",
"CurlCli"
]
},
" -d '{\"id\" : \"webserver\", \"data\" : \"mount disk\"}'
"
]
]
},
"VSwitchId": {
"Ref": "VSwitch"
},
"VpcId": {
"Ref": "Vpc"
},
"InstanceType": "ecs.n1.small"
}
},
"WaitConHandle": {
"Type": "ALIYUN::ROS::WaitConditionHandle"
},
"EIPBind": {
"Type": "ALIYUN::ECS::EIPAssociation",
"Properties": {
"InstanceId": {
"Ref": "WebServer"
},
"AllocationId": {
"Ref": "NewEip"
}
}
},
"SecurityGroupEgress": {
"Type": "ALIYUN::ECS::SecurityGroupEgress",
"Properties": {
"SecurityGroupId": {
"Ref": "SecurityGroup"
},
"IpProtocol": "all",
"DestCidrIp": "0.0.0.0/0",
"NicType": "intranet",
"PortRange": "-1/-1"
}
}
},
"Outputs": {
"Data": {
"Value": {
"Fn::GetAtt": [
"WaitCondition",
"Data"
]
}
},
"PublicIp": {
"Value": {
"Fn::GetAtt": [
"WebServer",
"PublicIp"
]
}
},
"InstanceId": {
"Value": {
"Fn::GetAtt": [
"WebServer",
"InstanceId"
]
}
},
"CurlCli": {
"Value": {
"Fn::GetAtt": [
"WaitConHandle",
"CurlCli"
]
}
}
}
}
UserDataスクリプトは、ソースデータを含むデータディスクを処理します.
この例は、ソースデータのsnapshotに基づいてデータディスクを作成し、他の例は上記の例と似ています.この場合、新しいECSインスタンスのデータディスクはすでに分割されフォーマットされており、適切なマウントポイントにデータディスクをマウントするだけでよい.TotalDataDiskでどれだけのデータディスクがあるかを説明し、MountPointはデータディスクのマウントポイントを指定し、ROSのWaitConditionリソースを使用してUserDataスクリプトの実行結果を得る.次は最終テンプレートです.
{
"ROSTemplateFormatVersion": "2015-09-01",
"Parameters": {
"VpcName": {
"MaxLength": 128,
"Description": "VPC ",
"Type": "String",
"ConstraintDescription": "[2, 128] ",
"MinLength": 2
},
"DataDisk2SnapshotId": {
"Description": " 2",
"Type": "String"
},
"Password": {
"NoEcho": true,
"MaxLength": 30,
"Description": "ECS .",
"Type": "String",
"ConstraintDescription": "8-30 , 、 ",
"MinLength": 8
},
"DiskName": {
"Type": "String"
},
"ZoneId": {
"Description": " Id, の ",
"Type": "String"
},
"DestinationCidrBlock": {
"Default": "192.168.1.0",
"Description": "Route , 192.168.1.0/24 192.168.1.0",
"Type": "String"
},
"MountPoint": {
"Description": " ",
"Type": "String"
},
"VSwitchCidrBlock": {
"Default": "10.0.10.0/24",
"Description": "VSwitch , VPC",
"Type": "String"
},
"DataDisk1SnapshotId": {
"Description": " 1",
"Type": "String"
},
"SecurityGroupName": {
"Description": " ",
"Type": "String"
},
"VpcCidrBlock": {
"Default": "10.0.0.0/8",
"AllowedValues": [
"192.168.0.0/16",
"172.16.0.0/12",
"10.0.0.0/8"
],
"Type": "String"
},
"DiskSize": {
"Default": 40,
"Type": "Number"
},
"TotalDataDisk": {
"Description": " ",
"Type": "String"
},
"SystemDiskCategory": {
"Default": "cloud",
"AllowedValues": [
"cloud",
"cloud_efficiency",
"cloud_ssd"
],
"Description": " , (cloud)、 (cloud_efficiency) SSD (cloud_ssd)",
"Type": "String"
}
},
"Resources": {
"VSwitch": {
"Type": "ALIYUN::ECS::VSwitch",
"Properties": {
"CidrBlock": {
"Ref": "VSwitchCidrBlock"
},
"ZoneId": {
"Ref": "ZoneId"
},
"VpcId": {
"Fn::GetAtt": [
"Vpc",
"VpcId"
]
}
}
},
"Vpc": {
"Type": "ALIYUN::ECS::VPC",
"Properties": {
"CidrBlock": {
"Ref": "VpcCidrBlock"
},
"VpcName": {
"Ref": "VpcName"
}
}
},
"WaitCondition": {
"Type": "ALIYUN::ROS::WaitCondition",
"Properties": {
"Handle": {
"Ref": "WaitConHandle"
},
"Timeout": 200,
"Count": 1
}
},
"SecurityGroup": {
"Type": "ALIYUN::ECS::SecurityGroup",
"Properties": {
"SecurityGroupName": {
"Ref": "SecurityGroupName"
},
"VpcId": {
"Ref": "Vpc"
}
}
},
"NewEip": {
"Type": "ALIYUN::ECS::EIP",
"Properties": {
"InternetChargeType": "PayByTraffic",
"Bandwidth": 1
}
},
"SecurityGroupIngress": {
"Type": "ALIYUN::ECS::SecurityGroupIngress",
"Properties": {
"SourceCidrIp": "0.0.0.0/0",
"SecurityGroupId": {
"Ref": "SecurityGroup"
},
"IpProtocol": "all",
"NicType": "intranet",
"PortRange": "-1/-1"
}
},
"WebServer": {
"Type": "ALIYUN::ECS::Instance",
"Properties": {
"IoOptimized": "optimized",
"ImageId": "centos6u5_64_40G_cloudinit_20160427.raw",
"SecurityGroupId": {
"Ref": "SecurityGroup"
},
"Password": {
"Ref": "Password"
},
"DiskMappings": [
{
"SnapshotId": {
"Ref": "DataDisk1SnapshotId"
},
"DiskName": {
"Ref": "DiskName"
},
"Size": {
"Ref": "DiskSize"
}
},
{
"SnapshotId": {
"Ref": "DataDisk2SnapshotId"
},
"Size": {
"Ref": "DiskSize"
}
}
],
"SystemDiskCategory": {
"Ref": "SystemDiskCategory"
},
"UserData": {
"Fn::Join": [
"",
[
"#!/bin/sh
",
"logs=~/mount_logs
",
"i=1
",
"total=",
{
"Ref": "TotalDataDisk"
},
"
",
"mountpoint=",
{
"Ref": "MountPoint"
},
"
",
"while [ $i -le $total ]
",
"do
",
" j=`echo $i|awk '{printf \"%c\", 97+$i}'`
",
" touch ~/test_ftab
",
" mkdir $mountpoint$i
",
"cat << ESXU > ~/test_ftab
",
"/dev/vd${j}1 $mountpoint$i ext4 defaults 0 0
",
"ESXU
",
" cat ~/test_ftab >> /etc/fstab
",
" mount -a
",
" chmod -R 777 $mountpoint$i
",
" rm -rf ~/test_ftab
",
" echo \"/dev/vd${j}1 is mounted!\" >> $logs
",
" let i+=1
",
"done
",
"
",
{
"Fn::GetAtt": [
"WaitConHandle",
"CurlCli"
]
},
" -d '{\"id\" : \"webserver\", \"data\" : \"mount disk\"}'
"
]
]
},
"VSwitchId": {
"Ref": "VSwitch"
},
"VpcId": {
"Ref": "Vpc"
},
"InstanceType": "ecs.n1.small"
}
},
"WaitConHandle": {
"Type": "ALIYUN::ROS::WaitConditionHandle"
},
"EIPBind": {
"Type": "ALIYUN::ECS::EIPAssociation",
"Properties": {
"InstanceId": {
"Ref": "WebServer"
},
"AllocationId": {
"Ref": "NewEip"
}
}
},
"SecurityGroupEgress": {
"Type": "ALIYUN::ECS::SecurityGroupEgress",
"Properties": {
"SecurityGroupId": {
"Ref": "SecurityGroup"
},
"IpProtocol": "all",
"DestCidrIp": "0.0.0.0/0",
"NicType": "intranet",
"PortRange": "-1/-1"
}
}
},
"Outputs": {
"Data": {
"Value": {
"Fn::GetAtt": [
"WaitCondition",
"Data"
]
}
},
"PublicIp": {
"Value": {
"Fn::GetAtt": [
"WebServer",
"PublicIp"
]
}
},
"InstanceId": {
"Value": {
"Fn::GetAtt": [
"WebServer",
"InstanceId"
]
}
},
"CurlCli": {
"Value": {
"Fn::GetAtt": [
"WaitConHandle",
"CurlCli"
]
}
}
}
}
に注意
上記の2つの例は、ROSスタックリソースを使用してデータディスクを作成するのではなく、DiskMappingsプロパティを使用していることに注目します.これは、DiskMappingsがECSリソースのプロパティであるため、ECSを起動するときにデータディスクが作成され、ECSインスタンスと関連付けられているためです.では、UserDataを実行すると、パーティション、フォーマット、マウントが完了します.ただし、ROS stackリソースでデータディスクを作成する場合は、まずECSリソースとDiskリソースを作成し、最後にdiskとECSインスタンスを関連付けます.では、ECSインスタンスが起動すると、データディスクはまだ対応するECSに関連付けられていないので、この場合、UserDataスクリプトを実行すると、データディスク、パーティション、フォーマット、マウントが見つかりません.データディスクを使用して、UserDataで自動的にデータディスクをマウントしたい場合は、DiskMappingsを使用してデータディスクを作成することをお勧めします.