自定义镜像迁移方案

1. 概述

近日,有同学问到如果控制台不支持自定义镜像导出的情况下,该怎么进行自定义镜像的迁移。所以就开始着手写了这个文档,希望能够帮到有类似需求的同学。
自定义镜像是不能跨地域使用的,如果需要跨云平台、跨地域、跨账号使用自定义镜像,则需要进行自定义镜像的一次迁移。整个迁移过程主要动作包括:

  1. 使用API将源地域的自定义镜像导出镜像到oss中。
  2. 从目标地域下载源地域镜像文件并导入到目标地域的oss中。
  3. 在目标地域创建自定义镜像,将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

上一篇:同地域跨可用区容灾的迁移和演练


下一篇:ASP.NET开发web应用遇到的javascript跨域请求问题