ECS实例的系统快照文件不能直接从云端下载到本地,不过通过OOS的模板可以轻松帮您实现下载数据到本地。
解决方案
此过程您只需选定要创建系统快照的ECS实例,并准备一个可保存镜像的OSS bucket,剩下工作交给OSS就可以了,当OOS准备完待下载内容后,您单击下载快照的镜像文件即可。
OOS主要帮您做了这些,其先对您选定的ECS实例打系统快照,完成后对快照创建镜像,再将镜像导出到OSS的bucket内,最后将bucket中镜像对应的文件名返回。
OOS模版任务
- 获取被指定的ECS实例系统盘信息。
- 检查ECS实例状态,保证可创建快照。
- 对ECS实例系统盘进行快照创建。
- 等待快照创建完成。
- 对快照创建镜像。
- 等待镜像创建完成。
- 将镜像导出到指定的OSS的bucket中。
- 返回镜像导出后在bucket内对应的文件名。
模版内容
FormatVersion: OOS-2019-06-01
Description: Export image of snapshot which is created by ECS instance system disk to OSS.
Parameters:
instanceIds:
Description: The ID list of the ECS instance.
Type: List
OSSBucket:
Description: The bucket of the image to export into.
Type: String
OSSPrefix:
Description: The prefix for name of the image to export into oos.
Type: String
regionId:
Description: The region Id of instance.
Type: String
MinLength: 1
MaxLength: 30
OOSAssumeRole:
Description: The RAM role to be assumed by OOS.
Type: String
Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
- Name: querysDiskInfo
Action: 'ACS::ExecuteAPI'
Description: Get info of the data disk.
Properties:
Service: ECS
API: DescribeDisks
Parameters:
RegionId: '{{ regionId }}'
InstanceId: '{{ ACS::TaskLoopItem }}'
DiskType: system
Outputs:
systemDiskId:
Type: String
ValueSelector: 'Disks.Disk[].DiskId'
Loop:
Items: '{{ instanceIds }}'
Outputs:
systemDiskIds:
AggregateType: 'Fn::ListJoin'
AggregateField: systemDiskId
- Name: checkInstanceAvailable
Action: 'ACS::CheckFor'
Description: Checks whether the ECS instance status is running or stopped.
Properties:
Service: ECS
API: DescribeInstances
Parameters:
RegionId: '{{ regionId }}'
InstanceIds:
- '{{ ACS::TaskLoopItem }}'
DesiredValues:
- Running
- Stopped
PropertySelector: 'Instances.Instance[].Status'
Loop:
Items: '{{ instanceIds }}'
- Name: createSnapshot
Action: 'ACS::ExecuteAPI'
Description: Create a snapshot with the specified disk ID and snapshot name.
Properties:
Service: ECS
API: CreateSnapshot
Parameters:
RegionId: '{{ regionId }}'
DiskId: '{{ ACS::TaskLoopItem }}'
SnapshotName: 'Snapshot-from-{{ ACS::TaskLoopItem }}-{{ ACS::ExecutionId }}'
Outputs:
snapshotId:
Type: String
ValueSelector: SnapshotId
Loop:
Items: '{{ querysDiskInfo.systemDiskIds }}'
Outputs:
snapshotIds:
AggregateType: 'Fn::ListJoin'
AggregateField: snapshotId
- Name: untilSnapshotsReady
Action: 'ACS::WaitFor'
Description: Waits for the snapshot to be accomplished.
Properties:
Service: ECS
API: DescribeSnapshots
Parameters:
RegionId: '{{ regionId }}'
SnapshotIds:
- '{{ ACS::TaskLoopItem }}'
DesiredValues:
- accomplished
PropertySelector: 'Snapshots.Snapshot[].Status'
Loop:
Items: '{{ createSnapshot.snapshotIds }}'
- Name: createImage
Action: 'ACS::ExecuteAPI'
Description: Creates a custom image.
Properties:
Service: ECS
API: CreateImage
Parameters:
RegionId: '{{ regionId }}'
ImageName: 'img-from-{{ ACS::TaskLoopItem }}-{{ ACS::ExecutionId }}'
SnapshotId: '{{ ACS::TaskLoopItem }}'
Outputs:
imageId:
Type: String
ValueSelector: ImageId
Loop:
Items: '{{ createSnapshot.snapshotIds }}'
Outputs:
ImageIds:
AggregateType: 'Fn::ListJoin'
AggregateField: imageId
- Name: untilCreateImageReady
Action: 'ACS::WaitFor'
Description: Wait for created images available.
Properties:
Service: ECS
API: DescribeImages
Parameters:
RegionId: '{{ regionId }}'
ImageId: '{{ ACS::TaskLoopItem }}'
DesiredValues:
- Available
PropertySelector: 'Images.Image[].Status'
Loop:
Items: '{{ createImage.ImageIds }}'
- Name: exportImageToOSS
Action: 'ACS::ExecuteAPI'
Description: Copy image.
Properties:
Service: ECS
API: ExportImage
Parameters:
RegionId: '{{ regionId }}'
ImageId: '{{ ACS::TaskLoopItem }}'
OSSBucket: '{{ OSSBucket }}'
OSSPrefix: '{{ OSSPrefix }}'
Loop:
Items: '{{ createImage.ImageIds }}'
Outputs:
TaskIds:
AggregateType: 'Fn::ListJoin'
AggregateField: TaskId
Outputs:
TaskId:
ValueSelector: TaskId
Type: String
- Name: queryNameOfFile
Action: 'ACS::ExecuteAPI'
Description: Get object name of image.
Properties:
Service: ECS
API: DescribeTaskAttribute
Parameters:
RegionId: '{{ regionId }}'
TaskId: '{{ ACS::TaskLoopItem }}'
Loop:
Items: '{{ exportImageToOSS.TaskIds }}'
Outputs:
OSSObjectNames:
AggregateType: 'Fn::ListJoin'
AggregateField: OSSObjectName
Outputs:
OSSObjectName:
ValueSelector: 'OperationProgressSet.OperationProgress[].RelatedItemSet.RelatedItem[1].Value'
Type: String
Outputs:
OSSObjectNames:
Value: '{{ queryNameOfFile.OSSObjectNames }}'
Type: List
imageIds:
Value: '{{ createImage.ImageIds }}'
Type: List
snapshotIds:
Value: '{{ createSnapshot.snapshotIds }}'
Type: List
instanceIds:
Value: '{{ instanceIds }}'
Type: List
模版参数
- instanceIds: 实例ID,在该参数中输入您准备打快照的ECS实例ID,支持添加多个实例ID进行批量操作。
- OSSBucket: OSS的Bucket,在该参数中输入一个可以保存镜像文件的OSS bucket,以便您从中下载快照的镜像文件。
- OSSPrefix: OSS文件名前缀,输入一个存储在OSS bucket内镜像的文件名前缀。
- regionId: 将要创建系统快照的ECS实例所在region。
操作步骤
- 登录到运维编排服务控制台。
- 单击 自定义模版 ,将上文的模版内容复制到YAML格式编辑区域,输入模版名称。
- 单击 创建模版。
- 模版创建成功后,单击该模版的 创建执行。
- 风险确认模式选择 客户了解风险,无需确认 。
- 单击 下一步:设置参数。
- 将准备好的模版参数输入到对应参数栏。
- 执行使用到的权限的来源选择 当前账号的已有权限(确保创建执行的账号具有模版中涉及的云产品API权限,如无权限请参考账号访问控制完成账号授权)。
- 单击下一步:确认创建。
- 单击 创建执行 。
- 待执行结束后查看输出的存入到bucket中数据的objectName。
- 根据模版执行结果返回实例ID对应的objectName,在OSS中选择并下载快照的镜像文件到本地。