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 | 源自定義鏡像的 ID | ||
OSSBucket | 鏡像檔案存放使用者的 OSS Bucket | ||
OSSPrefix | 否 | 設定OSS Object的字首 | |
ImageFormat | 鏡像格式,暫時隻支援:RAW 和 VHD。預設值:RAW |
2.3 傳回參數
地域ID | ||
鏡像的 ID | ||
exportTaskId | 導出鏡像任務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