1. 概述
近日,有同学问到如果控制台不支持自定义镜像导出的情况下,该怎么进行自定义镜像的迁移。所以就开始着手写了这个文档,希望能够帮到有类似需求的同学。
自定义镜像是不能跨地域使用的,如果需要跨云平台、跨地域、跨账号使用自定义镜像,则需要进行自定义镜像的一次迁移。整个迁移过程主要动作包括:
- 使用API将源地域的自定义镜像导出镜像到oss中。
- 从目标地域下载源地域镜像文件并导入到目标地域的oss中。
- 在目标地域创建自定义镜像,将OSS中的镜像文件导入。
从而实现跨地域跨账号使用自定义镜像,第二、第三环节主要通过控制台操作,步骤简单,下文主要对自定义镜像导出环节进行详细阐述。
2. 导出自定义镜像
导出自定义镜像是将用户ECS 环境中生成的自定义镜像导出到OSS的bucket中,生成一个object。
2.1 环境要求
导出自定义镜像所需的前置条件如下:
- 先在管控台生成一个自定义镜像。
- 导出镜像的地域必须跟存放镜像文件的OSS在同一个账号下的同一个地域。
- 操作账号需要在后台加入API的白名单中(联系后台产品同学操作)
- 需要通过 RAM 给阿里云 ECS 官方服务账号授权写入 OSS 的权限。
i.创建角色:AliyunECSImageImportDefaultRole。必须是这个名称,否则导入镜像会失败。角色的策略:
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"ecs.aliyuncs.com"
]
}
}
],
"Version": "1"
}
ii.在该角色下直接加入默认的系统权限策略:AliyunECSImageImportRolePolicy。这个策略是 ECS 提供导入镜像的默认策略,您也可以创建自定义策略,权限需要包含:
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:PutObject",
"oss:PutBucketLocation"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
2.2 请求参数
名称 | 类型 | 是否必须 | 描述 |
---|---|---|---|
RegionId | String | 是 | 镜像所在的 Region ID。RegionId 的列表详见地域列表 |
ImageId | String | 是 | 源自定义镜像的 ID |
OSSBucket | String | 是 | 镜像文件存放用户的 OSS Bucket |
OSSPrefix | String | 否 | 设置OSS Object的前缀 |
ImageFormat | String | 否 | 镜像格式,暂时只支持:RAW 和 VHD。默认值:RAW |
2.3 返回参数
名称 | 类型 | 描述 |
---|---|---|
RegionId | String | 地域ID |
ImageId | String | 镜像的 ID |
exportTaskId | String | 导出镜像任务ID |
2.4 导出示例
下面以使用ECS Java SDK 导出进项的方法ExportImage为例,介绍使用SDK导出自定义镜像的完整流程。
2.4.1 环境准备
1.阿里云Java SDK适用JDK 6及以上版本。
2.要使用阿里云Java SDK,您需要一个云账号以及一对Access Key ID和Access Key Secret。请在阿里云控制台中的AccessKey管理页面上创建和查看您的Access Key,或者联系您的系统管理员。
2.4.2 获取和安装SDK
阿里云Java SDK发布在 https://develop.aliyun.com/tools/sdk#/java 这个地址,请前往这些产品的详情页获取相应的SDK。
要成功地调用一个产品的SDK,您至少需要首先安装SDK核心库。 即您需要获取和安装2个SDK,分别是SDK核心库和ECS的SDK。
您可以通过在集成开发环境(Eclipse/IDE)中导入Jar包来安装SDK,具体步骤如下:
1.将下载的 aliyun-java-sdk-XXX.jar 文件复制到您的项目文件夹中。
2.在Eclipse中,依次选择菜单:工程,Properties,Java Build Path, Add JARs。
3.选中您下载的这些JAR文件。
2.4.3 配置参数
1.生成DefaultProfile的对象profile,该对象存放 Access Key ID 和 Access Key Secret 和默认的地域信息:
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>","<accessSecret>");
2.生成 IAcsClient 的对象client:
IAcsClient client = new DefaultAcsClient(profile);
3.创建一个对应方法的 Request,类的命名规则一般为API 的方法名加上 “Request”,如获得镜像列表的 API 方法名为ExportImage,对应的请求类名为ExportImageRequest,直接使用构造函数生成一个默认的类exportImage:
ExportImageRequest exportImage = new ExportImageRequest();
4.请求类生成好之后需要通过Request 类的 setXxx 方法设置必要的信息,即 API 参数中必须要提供的信息,同样的也可以通过setXxx方法设置其他可选的参数:
在此步骤中您需要配置的参数有:
- ImageId
- OSSBucket
- OSSPrefix(可选)
- ImageFormat(可选)
exportImage.setImageId("m-bp1an6so65agtbgihguf");
5.参数设置完毕后就可以通过 IAcsClient 对象来获得对应 Request 的响应了:
ExportImageResponse response = client.getAcsResponse(exportImage);
6.接着可以调用 response 中对应的 getXxx 方法获得返回的参数值了
System.out.println(response.getTaskId());
完整代码如下:
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ecs.model.v20140526.*;
import com.aliyuncs.exceptions.ClientException;
class exportTest {
public static void main(String[] args) {
try {
DefaultProfile.addEndpoint("cn-beijing-xx", "cn-beijing-xx", "Ecs", "ecs.aliyuncs.com");
} catch (ClientException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 初始化
DefaultProfile profile = DefaultProfile.getProfile("cn-beijing-xx", " <accessKeyId>"," <accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
//设置参数
ExportImageRequest exportImage = new ExportImageRequest();
exportImage.setRegionId("cn-beijing-xx");
exportImage.setImageId("m-bpxxxxxxx");
exportImage.setOSSBucket("bucketname");
// 发起请求
try {
ExportImageResponse response = client.getAcsResponse(exportImage);
System.out.println(response.getRegionId());
System.out.println(response.getRequestId());
System.out.println(response.getTaskId());
}catch (Exception e) {
e.printStackTrace();
}
}
}
3. 导入自定义镜像
导入自定义镜像是将用户线下的一个镜像文件导入到 ECS 环境中生成一个自定义镜像。可以使用这个镜像来创建 ECS 实例和更换系统盘,具体操作可参考官方文档导入自定义镜像部分https://help.aliyun.com/document_detail/25464.html