私網串連(PrivateLink)能夠建立Virtual Private Cloud(Virtual Private Cloud)與阿里雲上的服務安全穩定的私人串連,簡化網路架構,實現私網訪問服務,避免通過公網訪問服務帶來的潛在安全風險。本文介紹如何通過終端節點私網訪問OSS資源。
前提條件
使用終端節點私網訪問OSS資源目前處於邀測階段,需聯絡支援人員申請使用。
僅華東1(杭州)、華東2(上海)、華北2(北京)、華北6(烏蘭察布)、華南1(深圳)、中國香港、新加坡、印尼(雅加達)地區支援通過終端節點私網訪問OSS資源。
已在與終端節點相同的地區建立Virtual Private Cloud和交換器。具體操作,請參見建立專用網路和交換器。
已在同一個VPC內建立ECS執行個體。具體操作,請參見選購ECS執行個體。
費用說明
應用情境
將OSS服務共用給雲上VPC
如下圖所示,要實現同一地區內通過VPC中的終端節點私網訪問雲上部署的OSS資源,您需要將OSS作為服務資源加入到終端節點服務中,然後在VPC中建立串連OSS服務的終端節點,實現通過終端節點私網訪問OSS服務資源。
將OSS服務共用給本機資料中心
如下圖所示,要實現在本機資料中心私網訪問雲上部署的OSS服務資源,您需要在同一地區內將OSS服務資源加入到終端節點服務中,然後在VPC中建立串連OSS服務的終端節點,並通過專線、VPN網關或Smart Access Gateway將本機資料中心與VPC串連起來,實現本機資料中心私網訪問OSS服務資源。
操作步驟
建立終端節點。
- 登入專用網路管理主控台。
在左側導覽列,單擊終端節點。
在頂部功能表列處,選擇任意支援通過終端節點私網訪問OSS資源的地區。
在終端節點頁面下的介面終端節點頁簽,單擊建立終端節點。
在建立終端節點頁面,按以下說明配置各項參數,其他參數保留預設配置。
參數
說明
節點名稱
輸入自訂終端節點的名稱。
終端節點類型
選擇介面終端節點,表示服務使用方通過介面終端節點訪問服務提供者提供的服務。
終端節點服務
單擊阿里雲服務,然後在終端節點服務名稱搜尋方塊輸入
com.aliyuncs.privatelink.cn-hangzhou.oss
,並選中該終端節點服務。說明一個終端節點僅支援關聯一個終端節點服務。
專用網路
選擇需要建立終端節點的專用網路。
安全性群組
選擇要與終端節點網卡關聯的安全性群組,安全性群組可以管控到終端節點網卡的資料通訊。
可用性區域與交換器
選擇終端節點服務對應的可用性區域,然後選擇該可用性區域內的交換器。系統會自動在每個交換器下建立一個終端節點網卡。
單擊確認建立。
建立完成後,您需要記錄產生的終端節點網域名稱,用於後續訪問OSS服務。
使用終端節點網域名稱訪問OSS。
串連ECS執行個體。具體步驟,請參見串連ECS執行個體。
通過ossutil或者SDK以終端節點網域名稱的方式訪問OSS。
ossutil
在已建立的ECS執行個體安裝1.7.17及以上版本的ossutil。
具體步驟,請參見安裝ossutil。
使用終端節點網域名稱以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簡介。
在已建立的ECS執行個體搭建Java、Python、Go、C++環境。
選擇以下任意語言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; }