本文介紹資料移轉之前的準備工作。
步驟一:上傳列表檔案
HTTP/HTTPS列表檔案包括2類檔案,1個manifest.json檔案和1個或多個example.csv.gz檔案,example.csv.gz為CSV壓縮後的列表檔案,單個example.csv.gz檔案大小不超過50 MB,manifest.json為對CSV檔案進行項配置的檔案,支援上傳至OSS或者AWS S3。
建立CSV列表檔案
在本地建立CSV格式的列表檔案。列表檔案最多支援8項,項與項之間用英文逗號(,)分隔;每行一個檔案,檔案之間用
\n
換行。各項的含義如下表所示。重要Key和Url為必填項,其餘項可以不填寫。
必填項
名稱
是否必填
描述
說明
Url
是
線上遷移服務使用該連結的Get請求下載檔案內容,Head請求擷取檔案中繼資料。
說明Url需確保可以直接使用[curl --HEAD "$Url"]、[curl --GET "$Url"]等命令正常訪問。線上遷移服務不支援重新導向的$Url。
Url和Key項必須要做編碼處理,不做編碼處理、包含特殊字元可能會導致檔案遷移失敗。
Url項的編碼原則:在
curl
等命令列工具(非重新導向)可正常訪問的基礎上,再進行一次Url編碼。Key項的編碼原則:在您期望該檔案在OSS上的ObjectName基礎之上,再進行一次Url編碼。
重要Url和Key項做編碼處理後,請務必進行以下內容確認,否則可能會導致檔案遷移失敗,或遷移到目的端的檔案路徑與您的預期不符。
原字串中的加號(+)已被編碼成%2B。
原字串中的百分比符號(%)已被編碼成%25。
原字串中的半形逗號(,)已被編碼成%2C。
例如,原字串為
a+b%c,d.file
,編碼後的字串應該是a%2Bb%25c%2Cd.file
。Key
是
遷移後的Object Name為prefix+檔案名稱。
假設您已產生未進行url編碼的CSV檔案,名稱為plain_example.csv,該檔案僅有兩列,第一列為Url,這些Url可直接使用curl命令進行訪問;第二列為Key,這些Key即為您期望該檔案在OSS上的ObjectName。如下:
https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/1354977961/p486238.jpg,assets/img/zh-CN/1354977961/p486238.jpg https://www.example-fake1.com/%E7%BC%96%E7%A0%81%E5%90%8E%E6%89%8D%E8%83%BD%E8%AE%BF%E9%97%AE%E7%9A%84url/123.png,編碼後才能訪問的url/123.png https://www.example-fake2.com/無需編碼即可訪問的url/123.png,無需編碼即可訪問的url/123.png https://www.example-fake3.com/漢語/日本語にほんご/한국어/123.png,漢語/日本語にほんご/한국어/123.png
重要請勿在Windows系統下使用內建的記事本軟體編輯manifest.json或plain_example.csv,因為該軟體可能會在檔案內容起始3個位元組添加特殊標記(0xefbbbf),從而可能引發線上遷移服務的解析異常。您可以在Linux或macOS下執行
od -c plain_example.csv | less
確認檔案內容的起始3位元組是否包含特殊標記。Windows系統下建議您使用Notepad++、Visual Studio Code等軟體建立或編輯檔案。如下Python編碼範例程式碼將會按行讀取plain_example.csv,並將編碼後的結果輸出到example.csv。代碼僅供您參考,請根據實際需要進行適當修改。
# -*- coding: utf-8 -*- import sys if sys.version_info.major == 3: from urllib.parse import quote_plus else: from urllib import quote_plus reload(sys) sys.setdefaultencoding("utf-8") # Source CSV file path. src_path = "plain_example.csv" # URL-encoded file path. out_path = "example.csv" # The sample CSV contains only two columns: url and key. with open(src_path) as fin, open(out_path, "w") as fout: for line in fin: items = line.strip().split(",") url, key = items[0], items[1] enc_url = quote_plus(url.encode("utf-8")) enc_key = quote_plus(key.encode("utf-8")) # The enc_url and enc_key vars are encoded format. fout.write(enc_url + "," + enc_key + "\n")
運行上述代碼,輸出後的example.csv內容為:
https%3A%2F%2Fhelp-static-aliyun-doc.aliyuncs.com%2Fassets%2Fimg%2Fzh-CN%2F1354977961%2Fp486238.jpg,assets%2Fimg%2Fzh-CN%2F1354977961%2Fp486238.jpg https%3A%2F%2Fwww.example-fake1.com%2F%25E7%25BC%2596%25E7%25A0%2581%25E5%2590%258E%25E6%2589%258D%25E8%2583%25BD%25E8%25AE%25BF%25E9%2597%25AE%25E7%259A%2584url%2F123.png,%E7%BC%96%E7%A0%81%E5%90%8E%E6%89%8D%E8%83%BD%E8%AE%BF%E9%97%AE%E7%9A%84url%2F123.png https%3A%2F%2Fwww.example-fake2.com%2F%E6%97%A0%E9%9C%80%E7%BC%96%E7%A0%81%E5%8D%B3%E5%8F%AF%E8%AE%BF%E9%97%AE%E7%9A%84url%2F123.png,%E6%97%A0%E9%9C%80%E7%BC%96%E7%A0%81%E5%8D%B3%E5%8F%AF%E8%AE%BF%E9%97%AE%E7%9A%84url%2F123.png https%3A%2F%2Fwww.example-fake3.com%2F%E6%B1%89%E8%AF%AD%2F%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AB%E3%81%BB%E3%82%93%E3%81%94%2F%ED%95%9C%EA%B5%AD%EC%96%B4%2F123.png,%E6%B1%89%E8%AF%AD%2F%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AB%E3%81%BB%E3%82%93%E3%81%94%2F%ED%95%9C%EA%B5%AD%EC%96%B4%2F123.png
全部項
名稱
是否必填
說明
Key
是
遷移後的Object Name為prefix+檔案名稱。
Url
是
線上遷移服務使用該連結的Get請求下載檔案內容,Head請求擷取檔案中繼資料。
Size
否
遷移檔案的大小,單位為位元組(Byte)。
StorageClass
否
源Bucket的儲存類型。
LastModifiedDate
否
待遷移檔案的最後修改時間。
ETag
否
待遷移檔案的ETag。
HashAlg
否
待遷移檔案的Hash演算法。
HashValue
否
待遷移檔案的Hash值。
說明以上樣本中各項的順序並非固定順序,只需與manifest.json檔案中fileSchema項順序保持一致即可。
壓縮CSV檔案
需要將CSV檔案壓縮為csv.gz檔案,壓縮方法如下:
壓縮單個檔案
例如dir目錄下有一個檔案example.csv,需執行如下壓縮命令:
gzip -c example.csv > example.csv.gz
說明執行以上
gzip
命令壓縮檔,不會保留源檔案,如需保留源檔案壓縮,請執行命令gzip -c 源檔案 > 源檔案.gz
。壓縮後得到
.csv.gz
檔案。壓縮多個檔案
例如dir目錄下有三個檔案example1.csv、example2.csv和 example3.csv,需執行如下壓縮命令:
gzip -r dir
說明gzip
命令不會打包目錄,而是將指定目錄下所有子檔案分別進行壓縮,且不會保留對應的源檔案。壓縮後在dir目錄下得到三個檔案example1.csv.gz、example2.csv.gz和example3.csv.gz。
建立manifest.json檔案
支援配置多個CSV檔案,具體內容如下。
fileFormat:指定列表檔案格式為CSV
fileSchema:對應CSV中檔案項,請注意順序。
files:
key:CSV檔案在Bucket中的位置。
MD5checksum:16進位的MD5字串,不區分大小寫。例如:91A76757B25C8BE78BC321DEEBA6A5AD,如果不填寫該值,則不會做校正。
size:列表檔案大小。
如下樣本僅供您參考。
{ "fileFormat":"CSV", "fileSchema":"Url, Key", "files":[{ "key":"dir/example1.csv.gz", "MD5checksum":"", "size":0 },{ "key":"dir/example2.csv.gz", "MD5checksum":"", "size":0 }] }
您可以選擇將建立的2類列表檔案上傳到OSS或AWS S3。
將建立的2類列表檔案上傳到OSS的具體操作,請參見簡單上傳。
說明列表檔案上傳到OSS後,線上遷移服務會下載列表檔案,並根據指定的地址遷移檔案。
建立任務時,請填寫檔案清單所在Bucket資訊,列表路徑的格式為
列表所在目錄/manifest.json
,例如dir/manifest.json。
將建立的2類列表檔案上傳到AWS S3。
說明列表檔案上傳到AWS S3後,線上遷移服務會下載列表檔案,並根據指定的地址遷移檔案。
建立任務時,請填寫檔案清單所在Bucket資訊,列表路徑的格式為
列表所在目錄/manifest.json
,例如dir/manifest.json。
步驟二:建立目標儲存空間
建立目標儲存空間,用於存放遷移的資料。具體操作,請參見建立儲存空間。
步驟三:建立RAM使用者並添加許可權
該RAM使用者用於遷移使用。在建立角色和進行遷移實施操作時,需要在該使用者下進行操作。請盡量在源Bucket或者目的Bucket所在的主帳號下建立該RAM使用者。
如果沒有建立RAM使用者,可以建立RAM使用者並授權。
登入主帳號所在的RAM控制台,在使用者頁面,單擊剛建立的RAM使用者 操作 列的 添加許可權。
系統策略:管理OSS線上遷移服務的許可權(AliyunOSSImportFullAccess)。
自訂權限原則:該策略必須包含
ram:CreateRole
、ram:CreatePolicy
、ram:AttachPolicyToRole
、ram:ListRoles
許可權。可參考建立自訂權限原則進行許可權管理,以下是相關的權限原則指令碼代碼:
{ "Version":"1", "Statement":[ { "Effect":"Allow", "Action":[ "ram:CreateRole", "ram:CreatePolicy", "ram:AttachPolicyToRole", "ram:ListRoles" ], "Resource":"*" } ] }
步驟四:清單Bucket授權
請根據清單Bucket是否歸屬於本帳號,完成相應的操作。
清單Bucket歸屬於本帳號
一鍵自動授權:
強烈建議您使用遷移控制台授權角色進行一鍵授權操作,該操作請在遷移實施 > 步驟二 > 列表授權角色 中實施。
手動授權:
1、清單Bucket授權
在角色頁面,單擊剛建立的RAM角色 操作 列的 新增授權。
自訂權限原則:該策略必須包含
oss:List*
、oss:Get*
許可權。
可參考建立自訂權限原則進行許可權管理,以下是相關的權限原則指令碼代碼:
說明以下權限原則僅供您參考,其中<myInvBucket>為本帳號下的清單Bucket名稱,請根據實際值替換。
關於OSS權限原則的更多資訊,請參見RAM Policy常見樣本。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:List*", "oss:Get*" ], "Resource": [ "acs:oss:*:*:<myInvBucket>", "acs:oss:*:*:<myInvBucket>/*" ] } ] }
清單Bucket不歸屬於本帳號
1、清單Bucket授權
使用清單Bucket所屬帳號登入OSS管理主控台。
在左側導覽列,單擊 Bucket 列表,選擇對應Bucket。
在左側導覽列,選擇許可權控制 > Bucket 授權策略。
在文法策略添加中,增加以下Bucket Policy,然後點擊 編輯並儲存。
自訂策略:
授予RAM角色列舉並讀取該Bucket下所有資源的許可權
說明以下權限原則僅供您參考,其中<otherInvBucket>為 清單Bucket名稱,<myuid>為 遷移控制台主帳號UID,<otherUid>為 清單Bucket歸屬的主帳號UID,<roleName>為上文建立的角色名稱,請根據實際值替換。關於OSS權限原則的更多資訊,請參見RAM Policy常見樣本。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:List*", "oss:Get*" ], "Principal": [ "arn:sts::<myUid>:assumed-role/<roleName>/*" ], "Resource": [ "acs:oss:*:<otherUid>:<otherInvBucket>", "acs:oss:*:<otherUid>:<othereInvBucket>/*" ] } ] }
步驟五:目的Bucket授權
請根據目的Bucket是否歸屬於本帳號,完成相應的操作。
目的Bucket歸屬於本帳號
一鍵自動授權:
強烈建議您使用遷移控制台自動授權角色進行一鍵授權操作,該操作請在遷移實施 > 步驟三 > 授權角色 中實施。
手動授權:
1、目的Bucket授權
在角色頁面,單擊剛建立的RAM角色 操作 列的 新增授權。
自訂策略:該策略必須包含
oss:List*
、oss:Get*
、oss:Put*
、oss:AbortMultipartUpload*
許可權。
可參考建立自訂權限原則 進行許可權管理,以下是相關的權限原則指令碼代碼:
說明以下權限原則僅供您參考,其中<myDestBucket>為 本帳號下的目的Bucket名稱,請根據實際值替換。
關於OSS權限原則的更多資訊,請參見RAM Policy常見樣本。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:List*", "oss:Get*", "oss:Put*", "oss:AbortMultipartUpload" ], "Resource": [ "acs:oss:*:*:<myDestBucket>", "acs:oss:*:*:<myDestBucket>/*" ] } ] }
目的Bucket不歸屬於本帳號
1、目的Bucket授權
在使用Bucket Policy按文法策略進行授權時,新添加的策略會覆蓋已有的策略。請確保新添加的策略包含已有策略的內容,否則可能導致關聯已有策略的操作失敗。
使用目的Bucket所屬帳號登入OSS管理主控台,
在左側導覽列,單擊 Bucket 列表,選擇對應Bucket。
在左側導覽列,選擇 許可權控制 > Bucket 授權策略。
在 按文法策略添加 中,增加自訂Bucket Policy,然後點擊 編輯並儲存。
授予RAM角色列舉、讀取、刪除和寫入該Bucket下所有資源的許可權。
以下權限原則僅供您參考,其中<otherDestBucket>填寫 目的Bucket名稱,<otherUid>填寫 目的Bucket歸屬的主帳號UID,<myUid>填寫 遷移控制台主帳號UID,<roleName>填寫 上文建立的角色名稱,請根據實際值替換。關於OSS權限原則的更多資訊,請參見RAM Policy常見樣本。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:List*",
"oss:Get*",
"oss:Put*",
"oss:AbortMultipartUpload"
],
"Principal": [
"arn:sts::<myUid>:assumed-role/<roleName>/*"
],
"Resource": [
"acs:oss:*:<otherUid>:<otherDestBucket>",
"acs:oss:*:<otherUid>:<otherDestBucket>/*"
]
}
]
}