背景:
一致的全球部署的需要的时候, 通过将 自定义镜像 从一个区域复制到另一个区域或者复制到相同到区域, 使您能够在不同的区域启动基于相同 Image 的一致实例, 达到高可用的需求
针对场景做相应的查询
场景 1. 华东 1 的实例, 在华东 2 部署一样的实例 (一致实例)
场景 2. 华东 1 的实例, 取消复制到华东 2
场景 3. 新购部署实例, 镜像没有符合特定要求, 需要导入镜像
场景 4. 对于实例, 导出镜像到本地测试或线下私有云环境
除了您现在看到的这文章, 您还可以前往:
您也可以使用 ECS 管理控制台 API 操作你的自定义镜像
ECS 控制台 - 快照和镜像 - 镜像
对象存储 OSS 控制台
访问控制 控制台
ECS ALIYUN CLI
CopyImage API 文档
CancelCopyImage API 文档
ImportImage API 文档
ExportImage API 文档
下文以命令行为示例
安装 Aliyun CLI
首先确保您已经具备 Python 的 Runtime, 本文中使用的 Python 版本为 2.7+
pip install aliyuncli
如果提示您没有权限, 请切换 sudo 继续执行
sudo pip install aliyuncli
系统显示如下类似信息, 则表明安装成功.
Successfully uninstalled aliyuncli-2.1.2
配置命令行工具
- # 在 Linux/UNIX 和 Mac OS 环境下, 执行如下命令, 打开并填写所列参数
- $ sudo aliyuncli configure
Aliyun Access Key ID [None]: < 输入 Access Key ID>
Aliyun Access Key Secret [None]: < 输入 Access Key Secret>
Default Region Id [None]: < 输入您购买的阿里云产品的 Region Id>
Default output format [None]: < 输入您需要的输出格式 >
使用场景事例
约束
目前复制镜像功能有如下约束和限制
复制镜像时, 自定义镜像的状态必须为 Available
被复制的自定义镜像必须为您账号下的镜像, 不能跨账号复制
复制镜像的过程中无法删除删除镜像 (DeleteImage), 但是您可以取消复制任务 (CancelCopyImage)
目前您能在中国大陆地域之间复制镜像, 华北 1 华北 2 华北 3 华北 5 华东 1 华东 2 华南 1 支持复制镜像功能复制镜像到其他国家和地区地域时需要 提交工单 申请, 并在工单页面注明复制镜像时的源地域目标地域以及镜像 ID
目前导入镜像功能有如下约束和限制:
不支持多个网络接口
不支持 IPv6 地址
密码策略: 8 - 30 个字符, 必须同时包含三项 (大写或小写字母数字和特殊符号)
需要安装虚拟化平台 XEN 和 KVM 驱动
关闭防火墙, 默认打开 22 端口
镜像需要开启 DHCP
建议 安装 cloud-init, 以保证能成功配置 hostnameNTP 源和 yum 源
您必须提前 上传镜像文件到对象存储 OSS, 导入镜像的地域必须跟镜像文件上传的 OSS Bucket 的地域相同
您不能删除正在导入的镜像, 只能取消导入镜像任务 (CancelTask)
目前导出镜像功能有如下约束和限制:
导出镜像需要 提交工单 申请后才能使用
不支持导出通过市场镜像的系统盘快照创建的自定义镜像
支持导出镜像中包括数据盘快照的信息的自定义镜像, 其中数据盘个数不能超过 4 个, 单个数据盘容量最大不能超过 500 GB
导出镜像是把用户自定义镜像导出到与该自定义镜像同一地域的 OSS bucket 里
场景 1. 华东 1 的实例, 在华东 2 部署一样的实例 (一致实例)
- # Copy Image 'm-xxx' from hangzhou to shanghai.
- aliyuncli ecs CopyImage --RegionId cn-hangzhou --ImageId m-xxx --DestinationRegionId cn-shanghai --output json
- # 返回复制成功后目标地域的镜像: 'm-yyyy'
场景 2. 华东 1 的实例, 取消复制到华东 2
- # Cancel Copy Image 'm-yyyy' in shanghai.
- aliyuncli ecs CancelCopyImage --RegionId cn-shanghai --ImageId m-yyyy
场景 3. 新购部署实例, 镜像没有符合特定要求, 需要导入镜像
您需要预先通过 访问控制 RAM 服务为您的云服务器 ECS 服务授权读取 OSS 的权限参阅见以下步骤:
1. 创建角色 AliyunECSImageImportDefaultRole 必须是这个名称, 否则导入镜像会失败角色的策略为:
- {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": [
- "ecs.aliyuncs.com"
- ]}
- }],
- "Version": "1"
- }
在访问控制 RAM 控制台创建角色
2. 在该角色下, 添加权限策略 AliyunECSImageImportRolePolicy 这个策略是 ECS 导入镜像功能的默认策略, 或者您也可以创建自定义策略, 权限需要包含:
- {
- "Version": "1",
- "Statement": [
- {
- "Action": [
- "oss:GetObject",
- "oss:GetBucketLocation"
- ],
- "Resource": "*",
- "Effect": "Allow"
- }]
- }
3. 导入镜像
- # import image from OSSBucket 'OSSBucket 名称' and OSSObject 'm-xxxx.raw'
- # aliyuncli ecs ImportImage --RegionId cn-shanghai --DiskDeviceMappings 支持不了磁盘的 mappings
- #aliyuncli 支持不了 用 python 来实现
- import json
- import logging
- from aliyunsdkcore import client
- from aliyunsdkecs.request.v20140526.ImportImageRequest import ImportImageRequest
- logging.basicConfig(level=logging.INFO,
- format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
- datefmt='%a, %d %b %Y %H:%M:%S')
- # your access key Id
- ak_id = "YOU_ACCESS_KEY_ID"
- # your access key secret
- ak_secret = "YOU_ACCESS_SECRET"
- region_id = "cn-shanghai"
- clt = client.AcsClient(ak_id, ak_secret, region_id)
- # import image.
- def import_image():
- request = ImportImageRequest()
- dict ={"OSSBucket":"testexportimage",
- "OSSObject":"m-uf6c8xeqe9vpdwx1w9gd_system.raw"}
- list=[dict]
- request.set_DiskDeviceMappings(list)
- _execute_request(request)
- def _execute_request(request):
- response = _send_request(request)
- if response is None:
- print 'response is None'
- return
- if response.get('Code') is None:
- print "ecs import image task is %s , imageId is %s"%(response['TaskId'], response['ImageId'])
- # send open api request
- def _send_request(request):
- request.set_accept_format('json')
- try:
- response_str = clt.do_action(request)
- logging.info(response_str)
- response_detail = json.loads(response_str)
- return response_detail
- except Exception as e:
- logging.error(e)
- if __name__ == '__main__':
- print "hello ecs import image"
- import_image()
场景 4. 对于实例, 导出镜像到本地测试或线下私有云环境
需要通过 RAM 授权云服务器 ECS 官方服务账号写入 OSS 的权限:
1. 创建角色: AliyunECSImageExportDefaultRole(其他任何角色名称无效), 为该角色设置以下角色策略:
- {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": [
- "ecs.aliyuncs.com"
- ]
- }
- }],
- "Version": "1"
- }
2. 在角色 AliyunECSImageExportDefaultRole 下加入默认的系统权限策略: AliyunECSImageExportRolePolicy, 该策略是云服务器 ECS 提供导出镜像的默认策略用户也可以创建自定义策略, 权限需要包含:
- {
- "Version": "1",
- "Statement": [
- {
- "Action": [
- "oss:GetObject",
- "oss:PutObject",
- "oss:DeleteObject",
- "oss:GetBucketLocation",
- "oss:AbortMultipartUpload",
- "oss:ListMultipartUploads",
- "oss:ListParts"
- ],
- "Resource": "*",
- "Effect": "Allow"
- }
- ]
- }
3. 如果已有 OSS Bucket 就忽略第三步
4. 导出镜像
- # export Image 'm-xxxx' to OSSBucket 'OSSBucket 名称' .
- aliyuncli ecs ExportImage --RegionId cn-shanghai --ImageId m-xxxx --OSSBucket testexportimage
- # 返回
- {
- "RegionId": "cn-shanghai",
- "RequestId": "53D25A67-15D9-412B-BCF7-1BE57889FDE2",
- "TaskId": "t-xxxx"
- }
在对象存储 OSS - 搜索 OSSBucket 名称 - 文件管理
来源: https://yq.aliyun.com/articles/551165