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