全部產品
Search
文件中心

:通過終端節點私網訪問OSS資源

更新時間:Sep 19, 2024

私網串連(PrivateLink)能夠建立Virtual Private Cloud(Virtual Private Cloud)與阿里雲上的服務安全穩定的私人串連,簡化網路架構,實現私網訪問服務,避免通過公網訪問服務帶來的潛在安全風險。本文介紹如何通過終端節點私網訪問OSS資源。

前提條件

  • 使用終端節點私網訪問OSS資源目前處於邀測階段,需聯絡支援人員申請使用。

  • 僅華東1(杭州)、華東2(上海)、華北2(北京)、華北6(烏蘭察布)、華南1(深圳)、中國香港、新加坡、印尼(雅加達)地區支援通過終端節點私網訪問OSS資源。

  • 已在與終端節點相同的地區建立Virtual Private Cloud和交換器。具體操作,請參見建立專用網路和交換器

  • 已在同一個VPC內建立ECS執行個體。具體操作,請參見選購ECS執行個體

費用說明

  • PrivateLink開通時不產生費用。開通成功後,根據實際使用量進行計費,按每小時出賬。費用包含執行個體費和流量處理費。更多資訊,請參見計費說明

  • PrivateLink的服務使用方和服務提供者可以是不同的阿里雲帳號,也支援將所產生的費用歸入服務使用方或者服務提供者的帳號進行出賬。更多資訊,請參見付費方說明

應用情境

將OSS服務共用給雲上VPC

如下圖所示,要實現同一地區內通過VPC中的終端節點私網訪問雲上部署的OSS資源,您需要將OSS作為服務資源加入到終端節點服務中,然後在VPC中建立串連OSS服務的終端節點,實現通過終端節點私網訪問OSS服務資源。

將OSS服務共用給本機資料中心

如下圖所示,要實現在本機資料中心私網訪問雲上部署的OSS服務資源,您需要在同一地區內將OSS服務資源加入到終端節點服務中,然後在VPC中建立串連OSS服務的終端節點,並通過專線、VPN網關或Smart Access Gateway將本機資料中心與VPC串連起來,實現本機資料中心私網訪問OSS服務資源。

操作步驟

  1. 建立終端節點。

    1. 登入專用網路管理主控台
    2. 在左側導覽列,單擊終端節點

    3. 在頂部功能表列處,選擇任意支援通過終端節點私網訪問OSS資源的地區。

    4. 終端節點頁面下的介面終端節點頁簽,單擊建立終端節點

    5. 建立終端節點頁面,按以下說明配置各項參數,其他參數保留預設配置。

      參數

      說明

      節點名稱

      輸入自訂終端節點的名稱。

      終端節點類型

      選擇介面終端節點,表示服務使用方通過介面終端節點訪問服務提供者提供的服務。

      終端節點服務

      單擊阿里雲服務,然後在終端節點服務名稱搜尋方塊輸入com.aliyuncs.privatelink.cn-hangzhou.oss,並選中該終端節點服務。

      說明

      一個終端節點僅支援關聯一個終端節點服務。

      專用網路

      選擇需要建立終端節點的專用網路。

      安全性群組

      選擇要與終端節點網卡關聯的安全性群組,安全性群組可以管控到終端節點網卡的資料通訊。

      可用性區域與交換器

      選擇終端節點服務對應的可用性區域,然後選擇該可用性區域內的交換器。系統會自動在每個交換器下建立一個終端節點網卡。

    6. 單擊確認建立

      建立完成後,您需要記錄產生的終端節點網域名稱,用於後續訪問OSS服務。

      Dingtalk_20240325172953.jpg

  2. 使用終端節點網域名稱訪問OSS。

    1. 串連ECS執行個體。具體步驟,請參見串連ECS執行個體

    2. 通過ossutil或者SDK以終端節點網域名稱的方式訪問OSS。

      ossutil

      1. 在已建立的ECS執行個體安裝1.7.17及以上版本的ossutil。

        具體步驟,請參見安裝ossutil

      2. 使用終端節點網域名稱以ossutil的方式訪問OSS。

        以將examplebucket下的檔案examplefile.txt下載到本地目錄/tmp/為例。樣本中通過-e選項指定終端節點網域名稱,使用--force-path-style選項指定以Path-Style的方式訪問OSS。

        ossutil cp oss://examplebucket/examplefile.txt /tmp/ -e ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com --force-path-style

        ossutil支援使用終端節點網域名稱進行訪問的巨集指令清單,請參見常用命令

        返回結果如下:

        Succeed: Total num: 1, size: 11. OK num: 1(download 1 objects).
        
        average speed 0(byte/s)
        
        0.188959(s) elapsed

      SDK

      僅以下語言SDK支援使用終端節點網域名稱訪問OSS。以下以使用終端節點網域名稱將examplebucket下的檔案exampleobject.txt下載到本地為例。

      SDK支援使用終端節點網域名稱進行訪問的巨集指令清單,請參見SDK簡介

      1. 在已建立的ECS執行個體搭建Java、Python、Go、C++環境。

      2. 選擇以下任意語言SDK以終端節點網域名稱的方式下載OSS資源。

        Java

        import com.aliyun.oss.*;
        import com.aliyun.oss.common.auth.*;
        import com.aliyun.oss.model.GetObjectRequest;
        import java.io.File;
        
        public class Demo {
        
            public static void main(String[] args) throws Exception {
                // Endpoint填寫終端節點網域名稱。
                String endpoint = "https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com";
                //從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
                EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
                // 填寫Bucket名稱,例如examplebucket。
                String bucketName = "examplebucket";
                // 填寫不包含Bucket名稱在內的Object完整路徑,例如exampleobject.txt。
                String objectName = "exampleobject.txt";
                String pathName = "D:\\examplefile.txt";
                 
                ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
                // 開啟次層網域的訪問方式。
                conf.setSLDEnabled(true);
                // 建立OSSClient執行個體。
                OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider, conf);
                
        
                try {
                    // 下載Object到本地檔案,並儲存到指定的本地路徑中。如果指定的本地檔案存在會覆蓋,不存在則建立。
                    // 如果未指定本地路徑,則下載後的檔案預設儲存到樣本程式所屬專案對應本地路徑中。
                    ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName));
                } 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();
                    }
                }
            }
        }

        Python

        # -*- coding: utf-8 -*-
        import oss2
        from oss2.credentials import EnvironmentVariableCredentialsProvider
        
        # 阿里雲帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常營運,請登入RAM控制台建立RAM帳號。
        auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
        # Endpoint填寫終端節點網域名稱。
        # 填寫Bucket名稱,例如examplebucket。
        # is_path_style=True用於開啟次層網域的訪問方式。
        bucket = oss2.Bucket(auth, 'https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com', 'examplebucket', is_path_style=True)
        
        # 填寫Object完整路徑,完整路徑中不包含Bucket名稱,例如exampleobject.txt。
        # 下載Object到本地檔案,並儲存到指定的本地路徑D:\\examplefile.txt。如果指定的本地檔案存在會覆蓋,不存在則建立。
        bucket.get_object_to_file('exampleobject.txt', 'D:\\examplefile.txt')      

        Go

        package main
        
        import (
        	"fmt"
        	"os"
        
        	"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 {
        		fmt.Println("Error:", err)
        		os.Exit(-1)
        	}
        	// 建立OSSClient執行個體。
        	// yourEndpoint填寫終端節點網域名稱。
        	// oss.ForcePathStyle(true)用於開啟次層網域訪問方式。
        	client, err := oss.New("https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider),oss.ForcePathStyle(true))
        	if err != nil {
        		fmt.Println("Error:", err)
        		os.Exit(-1)
        	}
        
        	// 填寫Bucket名稱,例如examplebucket。
        	bucket, err := client.Bucket("examplebucket")
        	if err != nil {
        		fmt.Println("Error:", err)
        		os.Exit(-1)
        	}
        
        	// 下載檔案到本地檔案,並儲存到指定的本地路徑中。如果指定的本地檔案存在會覆蓋,不存在則建立。
        	// 如果未指定本地路徑,則下載後的檔案預設儲存到樣本程式所屬專案對應本地路徑中。
        	// 依次填寫Object完整路徑(例如exampleobject.txt)和本地檔案的完整路徑(例如D:\\examplefile.txt)。Object完整路徑中不能包含Bucket名稱。
        	err = bucket.GetObjectToFile("exampleobject.txt", "D:\\examplefile.txt")
        	if err != nil {
        		fmt.Println("Error:", err)
        		os.Exit(-1)
        	}
        }

        C++

        #include <alibabacloud/oss/OssClient.h>
        #include <memory>
        #include <fstream>
        using namespace AlibabaCloud::OSS;
        
        int main(void)
        {
            /* 初始化OSS帳號資訊。*/
                    
            /* 填寫終端節點網域名稱。*/
            std::string Endpoint = "https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com";
            /* 填寫Bucket名稱,例如examplebucket。*/
            std::string BucketName = "examplebucket";
            /* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampleobject.txt。*/
            std::string ObjectName = "exampleobject.txt";
            /* 下載Object到本地檔案examplefile.txt,並儲存到指定的本地路徑中。如果指定的本地檔案存在會覆蓋,不存在則建立。*/
            /* 如果未指定本地路徑,則下載後的檔案預設儲存到樣本程式所屬專案對應本地路徑中。*/
            std::string FileNametoSave = "D:\\examplefile.txt";
        
            /* 初始化網路等資源。*/
            InitializeSdk();
        
            ClientConfiguration conf;	
            /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/    
            auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
            /* conf.isPathStyle = true用於開啟次層網域訪問方式。*/
            conf.isPathStyle = true
            OssClient client(Endpoint, credentialsProvider, conf);
        
            /* 下載Object到本地檔案。*/
            GetObjectRequest request(BucketName, ObjectName);
            request.setResponseStreamFactory([=]() {return std::make_shared<std::fstream>(FileNametoSave, std::ios_base::out | std::ios_base::in | std::ios_base::trunc| std::ios_base::binary); });
        
            auto outcome = client.GetObject(request);
        
            if (outcome.isSuccess()) {    
                std::cout << "GetObjectToFile success" << outcome.result().Metadata().ContentLength() << std::endl;
            }
            else {
                /* 異常處理。*/
                std::cout << "GetObjectToFile fail" <<
                ",code:" << outcome.error().Code() <<
                ",message:" << outcome.error().Message() <<
                ",requestId:" << outcome.error().RequestId() << std::endl;
                return -1;
            }
        
            /* 釋放網路等資源。*/
            ShutdownSdk();
            return 0;
        }