全部產品
Search
文件中心

Object Storage Service:加速OSS資源的跨境上傳和下載

更新時間:Nov 23, 2024

如果您希望實現Bucket遠距離資料轉送加速,例如從中國內地向非中國內地Bucket請求加速上傳或下載檔案,您可以開啟傳輸加速。傳輸加速利用全球分布的雲機房,將全球各地使用者對Bucket的訪問,經過智能路由解析至就近的存取點,使用最佳化後的網路及協議,為雲端儲存的上傳、下載提供端到端的加速方案。

前提條件

當前帳號已完成實名登記。具體步驟,請參見如何進行實名登記?

使用情境

  • 遠距離資料轉送加速

    例如全球性的論壇、Top線上協同辦公平台等,部分客戶會因傳輸距離較遠導致上傳和下載體驗非常差。傳輸加速功能可以讓全球各地的客戶使用最佳化後的網路來傳輸資料,極大地提升上傳和下載速度,讓不同地區的使用者都能有很好的訪問體驗。

  • GB、TB級大檔案上傳和下載

    通過互連網遠距離上傳和下載大檔案時,經常會因為網路延遲過大而導致傳輸失敗。傳輸加速功能使用最佳化的互連網傳輸鏈路、調優的協議棧與傳輸演算法,可大幅減少遠距離互連網傳輸逾時的比例。您還可以結合使用傳輸加速功能與分區上傳斷點續傳下載,形成遠距離大檔案上傳和下載的解決方案。

  • 非靜態、非熱點資料下載加速

    例如相簿應用、遊戲、電商、社交應用的評論內容、企業門戶網站、金融類APP等,使用者的下載體驗直接影響產品競爭力和客戶留存率。傳輸加速功能作為專為OSS上傳、下載加速而設計的功能,可以最大限度利用用戶端的網路能力,提升使用者的下載體驗。

注意事項

  • 華東1(杭州)、華東2(上海)、華東5(南京-本地地區)、華東6(福州-本地地區)、華北1(青島)、華北2(北京)、華北 3(張家口)、華北5(呼和浩特)、華北6(烏蘭察布)、華南1(深圳)、華南2(河源)、華南3(廣州)、西南1(成都)、中國香港、美國(矽谷)、美國(維吉尼亞)、日本(東京)、韓國(首爾)、新加坡、馬來西亞(吉隆坡)、印尼(雅加達)、菲律賓(馬尼拉)、泰國(曼穀)、德國(法蘭克福)、英國(倫敦)、阿聯酋(杜拜)地區支援開啟傳輸加速。

  • 通過傳輸加速Endpoint上傳資料時,會產生加速上傳流量。通過傳輸加速Endpoint下載資料時,會產生加速下載流量,同時會與OSS外網流出流量同時計算。例如,通過傳輸加速Endpoint從開啟傳輸加速功能的儲存空間中下載了1 GB的資料,則會產生1 GB傳輸加速費用和1 GB外網流出流量費用。更多資訊,請參見傳輸加速費用流量費用

  • 開啟傳輸加速功能後,必須使用OSS的傳輸加速網域名稱才會提升訪問速度。此外,OSS提供的預設Endpoint仍可正常使用。在不需要傳輸加速的情境中,您可以使用預設Endpoint以減少傳輸加速的費用。關於預設Endpoint,請參見OSS地區和訪問網域名稱

  • 傳輸加速Endpoint僅支援HTTP/HTTPS協議的API接入,不支援RTMP協議等非HTTP/HTTPS協議的API接入。

  • 為保證資料轉送安全,傳輸加速後端加速邏輯會視情況選擇使用HTTPS協議進行資料轉送。所以,用戶端使用HTTP協議通過傳輸加速網域名稱訪問OSS時,在OSS的訪問日誌中查看到訪問協議可能是HTTPS。

開啟傳輸加速

開啟傳輸加速後,Bucket會在保留預設Endpoint的基礎上,新增以下兩種傳輸加速Endpoint。

  • Global AccelerationEndpoint:地址為oss-accelerate.aliyuncs.com。傳輸加速存取點分布在全球各地,全球各地的Bucket均可以使用該網域名稱進行傳輸加速。

  • 非中國內地加速Endpoint:地址為oss-accelerate-overseas.aliyuncs.com。傳輸加速存取點分布在除中國內地以外的各地區,僅在中國香港及海外各地區Bucket綁定未備案的網域名稱做CNAME指向時使用。

您可以通過以下多種方式開啟傳輸加速。

使用OSS控制台

  1. 登入OSS管理主控台

  2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇Bucket 配置>傳輸加速

  4. 傳輸加速頁面,開啟開啟傳輸加速開關,然後在彈出的對話方塊單擊確定

    傳輸加速開啟操作會在30分鐘內全網生效。關閉傳輸加速操作也需要在30分鐘內全網生效。

使用阿里雲SDK

以下僅列舉常見SDK開啟傳輸加速的程式碼範例。關於其他SDK的開啟傳輸加速的程式碼範例,請參見SDK簡介

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫Bucket名稱,例如examplebucket。
        String bucketName = "examplebucket";
        // 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
        String region = "cn-hangzhou";

        // 建立OSSClient執行個體。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // 設定Bucket的傳輸加速狀態。
            // 當設定enabled為true時,表示開啟傳輸加速;當設定enabled為false時,表示關閉傳輸加速。
            boolean enabled = true;
            ossClient.setBucketTransferAcceleration(bucketName, enabled);

        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"

# examplebucket填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

# 設定Bucket的傳輸加速狀態。
# 當設定enabled為true時,表示開啟傳輸加速;當設定enabled為false時,表示關閉傳輸加速。
enabled = 'true'
bucket.put_bucket_transfer_acceleration(enabled)
package main

import (
	"log"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// 建立OSSClient執行個體。
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 設定簽名版本
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// 填寫Bucket名稱。
	bucketName := "examplebucket"

	// 開啟Bucket的傳輸加速狀態。
	// Enabled表示傳輸加速的開關,取值為true表示開啟傳輸加速,取值為false表示關閉傳輸加速。
	accConfig := oss.TransferAccConfiguration{
		Enabled: true,
	}

	err = client.SetBucketTransferAcc(bucketName, accConfig)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// 輸出成功資訊
	log.Println("Set bucket transfer accelerate success")
}

使用REST API

如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutBucketTransferAcceleration

使用傳輸加速

使用瀏覽器

通過瀏覽器訪問OSS時,將檔案URL的Endpoint欄位替換為傳輸加速Endpoint,例如https://test.oss-cn-shenzhen.aliyuncs.com/myphoto.jpg需改為https://test.oss-accelerate.aliyuncs.com/myphoto.jpg。如果檔案存取權限為私人,則還需要加上籤名資訊。

使用命令列工具ossutil

  • 替換設定檔的Endpoint為傳輸加速Endpoint

    通過ossutil訪問時,您可以將設定檔內的Endpoint替換為傳輸加速Endpoint。具體操作,請參見ossutil

  • 在命令樣本中增加-e oss-accelerate.aliyuncs.com

    在使用ossutil相關命令時,在命令樣本中增加-e oss-accelerate.aliyuncs.com。下圖表示在cp命令上傳情境中使用了傳輸加速Endpoint。

    ossu

使用圖形化管理工具ossbrowser

重要

通過ossbrowser訪問OSS時,除了要填寫AccessKey(AK)資訊以外,還必須指定預設OSS路徑。

各配置項說明如下:

參數

說明

Endpoint

選擇自訂,並填寫傳輸加速Endpoint https://oss-accelerate.aliyuncs.com

AccessKeyIdAccessKeySecret

填寫帳號的AccessKey(AK)資訊。擷取AccessKey的方式,請參見建立AccessKey

重要

為保證資料安全,推薦您使用RAM使用者的AccessKey登入ossbrowser。使用RAM使用者登入之前,需要為RAM使用者授予AliyunOSSFullAccessAliyunRAMFullAccess以及AliyunSTSAssumeRoleAccess的許可權。具體操作,請參見許可權管理

預設OSS路徑

指定訪問某個Bucket或Bucket某個路徑下資源的存取權限。預設OSS路徑格式為oss://bucketname/path。例如授權訪問儲存空間examplebucket下檔案夾examplefolder下的檔案或子檔案夾,則填寫oss://examplebucket/examplefolder/

配置樣本如下:

Transfer.jpg

使用阿里雲SDK

通過各語言SDK訪問OSS時,將Endpoint設定為傳輸加速Endpoint。此處以Java SDK的簡單上傳和簡單下載為例介紹。

  • 簡單上傳

    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    import com.aliyun.oss.model.PutObjectRequest;
    import java.io.File;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            // 填寫傳輸加速Endpoint。以Global AccelerationEndpoint為例。
            String endpoint = "https://oss-accelerate.aliyuncs.com";
            // 強烈建議不要把訪問憑證儲存到工程代碼裡,否則可能導致訪問憑證泄露,威脅您帳號下所有資源的安全。本程式碼範例以從環境變數中擷取訪問憑證為例。運行本程式碼範例之前,請先配置環境變數。
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // 填寫Bucket名稱,例如examplebucket。
            String bucketName = "examplebucket";
            // 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
            String objectName = "exampledir/exampleobject.txt";
            // 填寫本地檔案的完整路徑,例如D:\\localpath\\examplefile.txt。
            // 如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
            String filePath= "D:\\localpath\\examplefile.txt";
    
            // 建立OSSClient執行個體。
            OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
    
            try {
                // 建立PutObjectRequest對象。            
                PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, filePath);
                // 如果需要上傳時設定儲存類型和存取權限,請參考以下範例程式碼。
                // ObjectMetadata metadata = new ObjectMetadata();
                // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
                // metadata.setObjectAcl(CannedAccessControlList.Private);
                // putObjectRequest.setMetadata(metadata);
    
                // 上傳檔案。
                ossClient.putObject(putObjectRequest);
            } catch (OSSException oe) {
                System.out.println("Caught an OSSException, which means your request made it to OSS, "
                        + "but was rejected with an error response for some reason.");
                System.out.println("Error Message:" + oe.getErrorMessage());
                System.out.println("Error Code:" + oe.getErrorCode());
                System.out.println("Request ID:" + oe.getRequestId());
                System.out.println("Host ID:" + oe.getHostId());
            } catch (ClientException ce) {
                System.out.println("Caught an ClientException, which means the client encountered "
                        + "a serious internal problem while trying to communicate with OSS, "
                        + "such as not being able to access the network.");
                System.out.println("Error Message:" + ce.getMessage());
            } finally {
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }
        }
    }            
  • 簡單下載

    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    import com.aliyun.oss.model.GetObjectRequest;
    import java.io.File;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            // 填寫傳輸加速Endpoint。以Global AccelerationEndpoint為例。
            String endpoint = "https://oss-accelerate.aliyuncs.com";
            // 強烈建議不要把訪問憑證儲存到工程代碼裡,否則可能導致訪問憑證泄露,威脅您帳號下所有資源的安全。本程式碼範例以從環境變數中擷取訪問憑證為例。運行本程式碼範例之前,請先配置環境變數。
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // 填寫Bucket名稱,例如examplebucket。
            String bucketName = "examplebucket";
            // 填寫不包含Bucket名稱在內的Object完整路徑,例如testfolder/exampleobject.txt。
            String objectName = "testfolder/exampleobject.txt";
            String filePath = "D:\\localpath\\examplefile.txt";
    
            // 建立OSSClient執行個體。
            OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
    
            try {
                // 下載Object到本地檔案,並儲存到指定的本地路徑中。如果指定的本地檔案存在會覆蓋,不存在則建立。
                // 如果未指定本地路徑,則下載後的檔案預設儲存到樣本程式所屬專案對應本地路徑中。
                ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(filePath));
            } catch (OSSException oe) {
                System.out.println("Caught an OSSException, which means your request made it to OSS, "
                        + "but was rejected with an error response for some reason.");
                System.out.println("Error Message:" + oe.getErrorMessage());
                System.out.println("Error Code:" + oe.getErrorCode());
                System.out.println("Request ID:" + oe.getRequestId());
                System.out.println("Host ID:" + oe.getHostId());
            } catch (ClientException ce) {
                System.out.println("Caught an ClientException, which means the client encountered "
                        + "a serious internal problem while trying to communicate with OSS, "
                        + "such as not being able to access the network.");
                System.out.println("Error Message:" + ce.getMessage());
            } finally {
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }
        }
    }

測試傳輸加速效果

使用命令列工具ossutil

通過在ossutil命令樣本中測試未開啟傳輸加速前(即使用-e oss-us-west-1.aliyuncs.com)以及開啟傳輸加速後(即使用-e oss-accelerate.aliyuncs.com)上傳檔案所需時間的差異。

常見問題

除傳輸加速外,OSS是否提供其他加速方案?

除傳輸加速外,您還可以選擇CDN加速實現加速訪問OSS資源。更多資訊,請參見CDN加速訪問

是否支援同時配置多種加速方案?

支援。例如您已開啟CDN加速,並希望同時使用傳輸加速。您只需要開啟傳輸加速,並將CDN回源到傳輸加速網域名稱即可。更多資訊,請參見綁定CDN加速網域名稱

為什麼使用傳輸加速Endpoint無法列舉Bucket?

傳輸加速服務僅針對攜帶Bucket名稱資訊的第三層網域名(格式為https://BucketName.oss-accelerate.aliyuncs.com)提供解析服務。而列舉Bucket的請求網域名稱中不攜帶Bucket名稱資訊,因此您無法使用傳輸加速Endpoint列舉Bucket。建議您通過預設Endpoint列舉目標地區的Bucket,例如https://oss-cn-hangzhou.aliyuncs.com