全部產品
Search
文件中心

Data Online Migration:準備工作

更新時間:Oct 15, 2024

本文介紹資料移轉之前的準備工作。

步驟一:上傳列表檔案

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。

  1. 建立CSV列表檔案

    在本地建立CSV格式的列表檔案。列表檔案最多支援8項,項與項之間用英文逗號(,)分隔;每行一個檔案,檔案之間用\n換行。各項的含義如下表所示。

    重要

    KeyUrl為必填項,其餘項可以不填寫。

    • 必填項

      名稱

      是否必填

      描述

      說明

      Url

      線上遷移服務使用該連結的Get請求下載檔案內容,Head請求擷取檔案中繼資料。

      說明

      Url需確保可以直接使用[curl --HEAD "$Url"]、[curl --GET "$Url"]等命令正常訪問。線上遷移服務不支援重新導向的$Url。

      UrlKey項必須要做編碼處理,不做編碼處理、包含特殊字元可能會導致檔案遷移失敗。

      • Url項的編碼原則:在curl等命令列工具(非重新導向)可正常訪問的基礎上,再進行一次Url編碼。

      • Key項的編碼原則:在您期望該檔案在OSS上的ObjectName基礎之上,再進行一次Url編碼。

      重要

      UrlKey項做編碼處理後,請務必進行以下內容確認,否則可能會導致檔案遷移失敗,或遷移到目的端的檔案路徑與您的預期不符。

      • 原字串中的加號(+)已被編碼成%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項順序保持一致即可。

  2. 壓縮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。

  3. 建立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
        }]
    }
  4. 您可以選擇將建立的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使用者 操作 列的 添加許可權

  1. 系統策略:管理OSS線上遷移服務的許可權(AliyunOSSImportFullAccess)。

  2. 自訂權限原則:該策略必須包含ram:CreateRoleram:CreatePolicyram:AttachPolicyToRoleram: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授權

  1. 使用清單Bucket所屬帳號登入OSS管理主控台

  2. 在左側導覽列,單擊 Bucket 列表,選擇對應Bucket。

  3. 在左側導覽列,選擇許可權控制 > Bucket 授權策略

  4. 在文法策略添加中,增加以下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按文法策略進行授權時,新添加的策略會覆蓋已有的策略。請確保新添加的策略包含已有策略的內容,否則可能導致關聯已有策略的操作失敗。

  1. 使用目的Bucket所屬帳號登入OSS管理主控台

  2. 在左側導覽列,單擊 Bucket 列表,選擇對應Bucket。

  3. 在左側導覽列,選擇 許可權控制 > Bucket 授權策略。

  4. 按文法策略添加 中,增加自訂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>/*"
      ]
    }
  ]
}