準(zhǔn)備工作
本文介紹數(shù)據(jù)遷移之前的準(zhǔn)備工作。
步驟一:上傳列表文件
HTTP/HTTPS列表文件包括2類文件,1個(gè)manifest.json文件和1個(gè)或多個(gè)example.csv.gz文件,example.csv.gz為CSV壓縮后的列表文件,單個(gè)example.csv.gz文件大小不超過(guò)50 MB,manifest.json為對(duì)CSV文件進(jìn)行項(xiàng)配置的文件,支持上傳至OSS或者AWS S3。
創(chuàng)建CSV列表文件
在本地創(chuàng)建CSV格式的列表文件。列表文件最多支持8項(xiàng),項(xiàng)與項(xiàng)之間用英文逗號(hào)(,)分隔;每行一個(gè)文件,文件之間用
\n
換行。各項(xiàng)的含義如下表所示。重要Key和Url為必填項(xiàng),其余項(xiàng)可以不填寫(xiě)。
必填項(xiàng)
名稱
是否必填
描述
說(shuō)明
Url
是
在線遷移服務(wù)使用該鏈接的Get請(qǐng)求下載文件內(nèi)容,Head請(qǐng)求獲取文件元數(shù)據(jù)。
說(shuō)明Url需確保可以直接使用[curl --HEAD "$Url"]、[curl --GET "$Url"]等命令正常訪問(wèn)。在線遷移服務(wù)不支持重定向的$Url。
Url和Key項(xiàng)必須要做編碼處理,不做編碼處理、包含特殊字符可能會(huì)導(dǎo)致文件遷移失敗。
Url項(xiàng)的編碼原則:在
curl
等命令行工具(非重定向)可正常訪問(wèn)的基礎(chǔ)上,再進(jìn)行一次Url編碼。Key項(xiàng)的編碼原則:在您期望該文件在OSS上的ObjectName基礎(chǔ)之上,再進(jìn)行一次Url編碼。
重要Url和Key項(xiàng)做編碼處理后,請(qǐng)務(wù)必進(jìn)行以下內(nèi)容確認(rèn),否則可能會(huì)導(dǎo)致文件遷移失敗,或遷移到目的端的文件路徑與您的預(yù)期不符。
原字符串中的加號(hào)(+)已被編碼成%2B。
原字符串中的百分號(hào)(%)已被編碼成%25。
原字符串中的半角逗號(hào)(,)已被編碼成%2C。
例如,原字符串為
a+b%c,d.file
,編碼后的字符串應(yīng)該是a%2Bb%25c%2Cd.file
。Key
是
遷移后的Object Name為prefix+文件名。
假設(shè)您已生成未進(jìn)行url編碼的CSV文件,名稱為plain_example.csv,該文件僅有兩列,第一列為Url,這些Url可直接使用curl命令進(jìn)行訪問(wèn);第二列為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,編碼后才能訪問(wèn)的url/123.png https://www.example-fake2.com/無(wú)需編碼即可訪問(wèn)的url/123.png,無(wú)需編碼即可訪問(wèn)的url/123.png https://www.example-fake3.com/漢語(yǔ)/日本語(yǔ)にほんご/???/123.png,漢語(yǔ)/日本語(yǔ)にほんご/???/123.png
重要請(qǐng)勿在Windows系統(tǒng)下使用自帶的記事本軟件編輯manifest.json或plain_example.csv,因?yàn)樵撥浖赡軙?huì)在文件內(nèi)容起始3個(gè)字節(jié)添加特殊標(biāo)記(0xefbbbf),從而可能引發(fā)在線遷移服務(wù)的解析異常。您可以在Linux或macOS下執(zhí)行
od -c plain_example.csv | less
確認(rèn)文件內(nèi)容的起始3字節(jié)是否包含特殊標(biāo)記。Windows系統(tǒng)下建議您使用Notepad++、Visual Studio Code等軟件創(chuàng)建或編輯文件。如下Python編碼示例代碼將會(huì)按行讀取plain_example.csv,并將編碼后的結(jié)果輸出到example.csv。代碼僅供您參考,請(qǐng)根據(jù)實(shí)際需要進(jìn)行適當(dāng)修改。
# -*- 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")
運(yùn)行上述代碼,輸出后的example.csv內(nèi)容為:
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
全部項(xiàng)
名稱
是否必填
說(shuō)明
Key
是
遷移后的Object Name為prefix+文件名。
Url
是
在線遷移服務(wù)使用該鏈接的Get請(qǐng)求下載文件內(nèi)容,Head請(qǐng)求獲取文件元數(shù)據(jù)。
Size
否
遷移文件的大小,單位為字節(jié)(Byte)。
StorageClass
否
源Bucket的存儲(chǔ)類型。
LastModifiedDate
否
待遷移文件的最后修改時(shí)間。
ETag
否
待遷移文件的ETag。
HashAlg
否
待遷移文件的Hash算法。
HashValue
否
待遷移文件的Hash值。
說(shuō)明以上示例中各項(xiàng)的順序并非固定順序,只需與manifest.json文件中fileSchema項(xiàng)順序保持一致即可。
壓縮CSV文件
需要將CSV文件壓縮為csv.gz文件,壓縮方法如下:
壓縮單個(gè)文件
例如dir目錄下有一個(gè)文件example.csv,需執(zhí)行如下壓縮命令:
gzip -c example.csv > example.csv.gz
說(shuō)明執(zhí)行以上
gzip
命令壓縮文件,不會(huì)保留源文件,如需保留源文件壓縮,請(qǐng)執(zhí)行命令gzip -c 源文件 > 源文件.gz
。壓縮后得到
.csv.gz
文件。壓縮多個(gè)文件
例如dir目錄下有三個(gè)文件example1.csv、example2.csv和 example3.csv,需執(zhí)行如下壓縮命令:
gzip -r dir
說(shuō)明gzip
命令不會(huì)打包目錄,而是將指定目錄下所有子文件分別進(jìn)行壓縮,且不會(huì)保留對(duì)應(yīng)的源文件。壓縮后在dir目錄下得到三個(gè)文件example1.csv.gz、example2.csv.gz和example3.csv.gz。
創(chuàng)建manifest.json文件
支持配置多個(gè)CSV文件,具體內(nèi)容如下。
fileFormat:指定列表文件格式為CSV
fileSchema:對(duì)應(yīng)CSV中文件項(xiàng),請(qǐng)注意順序。
files:
key:CSV文件在Bucket中的位置。
MD5checksum:16進(jìn)制的MD5字符串,不區(qū)分大小寫(xiě)。例如:91A76757B25C8BE78BC321DEEBA6A5AD,如果不填寫(xiě)該值,則不會(huì)做校驗(yàn)。
size:列表文件大小。
如下示例僅供您參考。
{ "fileFormat":"CSV", "fileSchema":"Url, Key", "files":[{ "key":"dir/example1.csv.gz", "MD5checksum":"", "size":0 },{ "key":"dir/example2.csv.gz", "MD5checksum":"", "size":0 }] }
您可以選擇將創(chuàng)建的2類列表文件上傳到OSS或AWS S3。
將創(chuàng)建的2類列表文件上傳到OSS的具體操作,請(qǐng)參見(jiàn)簡(jiǎn)單上傳。
說(shuō)明列表文件上傳到OSS后,在線遷移服務(wù)會(huì)下載列表文件,并根據(jù)指定的地址遷移文件。
新建任務(wù)時(shí),請(qǐng)?zhí)顚?xiě)文件列表所在Bucket信息,列表路徑的格式為
列表所在目錄/manifest.json
,例如dir/manifest.json。
將創(chuàng)建的2類列表文件上傳到AWS S3。
說(shuō)明列表文件上傳到AWS S3后,在線遷移服務(wù)會(huì)下載列表文件,并根據(jù)指定的地址遷移文件。
新建任務(wù)時(shí),請(qǐng)?zhí)顚?xiě)文件列表所在Bucket信息,列表路徑的格式為
列表所在目錄/manifest.json
,例如dir/manifest.json。
步驟二:創(chuàng)建目標(biāo)存儲(chǔ)空間
創(chuàng)建目標(biāo)存儲(chǔ)空間,用于存放遷移的數(shù)據(jù)。具體操作,請(qǐng)參見(jiàn)創(chuàng)建存儲(chǔ)空間。
步驟三:創(chuàng)建RAM用戶并添加權(quán)限
該RAM用戶用于遷移使用。在創(chuàng)建角色和進(jìn)行遷移實(shí)施操作時(shí),需要在該用戶下進(jìn)行操作。請(qǐng)盡量在源Bucket或者目的Bucket所在的主賬號(hào)下創(chuàng)建該RAM用戶。
如果沒(méi)有創(chuàng)建RAM用戶,可以創(chuàng)建RAM用戶并授權(quán)。
登錄主賬號(hào)所在的RAM控制臺(tái),在用戶頁(yè)面,單擊剛創(chuàng)建的RAM用戶 操作 列的 添加權(quán)限。
系統(tǒng)策略:管理OSS在線遷移服務(wù)的權(quán)限(AliyunOSSImportFullAccess)。
自定義權(quán)限策略:該策略必須包含
ram:CreateRole
、ram:CreatePolicy
、ram:AttachPolicyToRole
、ram:ListRoles
權(quán)限。可參考創(chuàng)建自定義權(quán)限策略進(jìn)行權(quán)限管理,以下是相關(guān)的權(quán)限策略腳本代碼:
{ "Version":"1", "Statement":[ { "Effect":"Allow", "Action":[ "ram:CreateRole", "ram:CreatePolicy", "ram:AttachPolicyToRole", "ram:ListRoles" ], "Resource":"*" } ] }
步驟四:清單Bucket授權(quán)
請(qǐng)根據(jù)清單Bucket是否歸屬于本賬號(hào),完成相應(yīng)的操作。
清單Bucket歸屬于本賬號(hào)
一鍵自動(dòng)授權(quán):
強(qiáng)烈建議您使用遷移控制臺(tái)授權(quán)角色進(jìn)行一鍵授權(quán)操作,該操作請(qǐng)?jiān)?b>遷移實(shí)施 > 步驟二 > 列表授權(quán)角色 中實(shí)施。
手動(dòng)授權(quán):
1、清單Bucket授權(quán)
在角色頁(yè)面,單擊剛創(chuàng)建的RAM角色 操作 列的 新增授權(quán)。
自定義權(quán)限策略:該策略必須包含
oss:List*
、oss:Get*
權(quán)限。
可參考創(chuàng)建自定義權(quán)限策略進(jìn)行權(quán)限管理,以下是相關(guān)的權(quán)限策略腳本代碼:
說(shuō)明以下權(quán)限策略僅供您參考,其中<myInvBucket>為本賬號(hào)下的清單Bucket名稱,請(qǐng)根據(jù)實(shí)際值替換。
關(guān)于OSS權(quán)限策略的更多信息,請(qǐng)參見(jiàn)RAM Policy常見(jiàn)示例。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:List*", "oss:Get*" ], "Resource": [ "acs:oss:*:*:<myInvBucket>", "acs:oss:*:*:<myInvBucket>/*" ] } ] }
清單Bucket不歸屬于本賬號(hào)
1、清單Bucket授權(quán)
使用清單Bucket所屬賬號(hào)登錄OSS管理控制臺(tái)。
在左側(cè)導(dǎo)航欄,單擊 Bucket 列表,選擇對(duì)應(yīng)Bucket。
在左側(cè)導(dǎo)航欄,選擇權(quán)限控制 > Bucket 授權(quán)策略。
在語(yǔ)法策略添加中,增加以下Bucket Policy,然后點(diǎn)擊 編輯并保存。
自定義策略:
授予RAM角色列舉并讀取該Bucket下所有資源的權(quán)限
說(shuō)明以下權(quán)限策略僅供您參考,其中<otherInvBucket>為 清單Bucket名稱,<myuid>為 遷移控制臺(tái)主賬號(hào)UID,<otherUid>為 清單Bucket歸屬的主賬號(hào)UID,<roleName>為上文創(chuàng)建的角色名稱,請(qǐng)根據(jù)實(shí)際值替換。關(guān)于OSS權(quán)限策略的更多信息,請(qǐng)參見(jiàn)RAM Policy常見(jiàn)示例。
{ "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授權(quán)
請(qǐng)根據(jù)目的Bucket是否歸屬于本賬號(hào),完成相應(yīng)的操作。
目的Bucket歸屬于本賬號(hào)
一鍵自動(dòng)授權(quán):
強(qiáng)烈建議您使用遷移控制臺(tái)自動(dòng)授權(quán)角色進(jìn)行一鍵授權(quán)操作,該操作請(qǐng)?jiān)?b>遷移實(shí)施 > 步驟三 > 授權(quán)角色 中實(shí)施。
手動(dòng)授權(quán):
1、目的Bucket授權(quán)
在角色頁(yè)面,單擊剛創(chuàng)建的RAM角色 操作 列的 新增授權(quán)。
自定義策略:該策略必須包含
oss:List*
、oss:Get*
、oss:Put*
、oss:AbortMultipartUpload*
權(quán)限。
可參考創(chuàng)建自定義權(quán)限策略 進(jìn)行權(quán)限管理,以下是相關(guān)的權(quán)限策略腳本代碼:
說(shuō)明以下權(quán)限策略僅供您參考,其中<myDestBucket>為 本賬號(hào)下的目的Bucket名稱,請(qǐng)根據(jù)實(shí)際值替換。
關(guān)于OSS權(quán)限策略的更多信息,請(qǐng)參見(jiàn)RAM Policy常見(jiàn)示例。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:List*", "oss:Get*", "oss:Put*", "oss:AbortMultipartUpload" ], "Resource": [ "acs:oss:*:*:<myDestBucket>", "acs:oss:*:*:<myDestBucket>/*" ] } ] }
目的Bucket不歸屬于本賬號(hào)
1、目的Bucket授權(quán)
在使用Bucket Policy按語(yǔ)法策略進(jìn)行授權(quán)時(shí),新添加的策略會(huì)覆蓋已有的策略。請(qǐng)確保新添加的策略包含已有策略的內(nèi)容,否則可能導(dǎo)致關(guān)聯(lián)已有策略的操作失敗。
使用目的Bucket所屬賬號(hào)登錄OSS管理控制臺(tái),
在左側(cè)導(dǎo)航欄,單擊 Bucket 列表,選擇對(duì)應(yīng)Bucket。
在左側(cè)導(dǎo)航欄,選擇 權(quán)限控制 > Bucket 授權(quán)策略。
在 按語(yǔ)法策略添加 中,增加自定義Bucket Policy,然后點(diǎn)擊 編輯并保存。
授予RAM角色列舉、讀取、刪除和寫(xiě)入該Bucket下所有資源的權(quán)限。
以下權(quán)限策略僅供您參考,其中<otherDestBucket>填寫(xiě) 目的Bucket名稱,<otherUid>填寫(xiě) 目的Bucket歸屬的主賬號(hào)UID,<myUid>填寫(xiě) 遷移控制臺(tái)主賬號(hào)UID,<roleName>填寫(xiě) 上文創(chuàng)建的角色名稱,請(qǐng)根據(jù)實(shí)際值替換。關(guān)于OSS權(quán)限策略的更多信息,請(qǐng)參見(jiàn)RAM Policy常見(jiàn)示例。
{
"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>/*"
]
}
]
}