通過終端節(jié)點私網(wǎng)訪問OSS資源
私網(wǎng)連接(PrivateLink)能夠建立專有網(wǎng)絡(luò)VPC(Virtual Private Cloud)與阿里云上的服務(wù)安全穩(wěn)定的私有連接,簡化網(wǎng)絡(luò)架構(gòu),實現(xiàn)私網(wǎng)訪問服務(wù),避免通過公網(wǎng)訪問服務(wù)帶來的潛在安全風(fēng)險。本文介紹如何通過終端節(jié)點私網(wǎng)訪問OSS資源。
前提條件
使用終端節(jié)點私網(wǎng)訪問OSS資源目前處于邀測階段,需聯(lián)系技術(shù)支持申請使用。
僅華東1(杭州)、華東2(上海)、華北2(北京)、華北6(烏蘭察布)、華南1(深圳)、中國香港、新加坡、印度尼西亞(雅加達)地域支持通過終端節(jié)點私網(wǎng)訪問OSS資源。
已在與終端節(jié)點相同的地域創(chuàng)建專有網(wǎng)絡(luò)VPC和交換機。具體操作,請參見創(chuàng)建專有網(wǎng)絡(luò)和交換機。
已在同一個VPC內(nèi)創(chuàng)建ECS實例。具體操作,請參見選購ECS實例。
費用說明
應(yīng)用場景
將OSS服務(wù)共享給云上VPC
如下圖所示,要實現(xiàn)同一地域內(nèi)通過VPC中的終端節(jié)點私網(wǎng)訪問云上部署的OSS資源,您需要將OSS作為服務(wù)資源加入到終端節(jié)點服務(wù)中,然后在VPC中創(chuàng)建連接OSS服務(wù)的終端節(jié)點,實現(xiàn)通過終端節(jié)點私網(wǎng)訪問OSS服務(wù)資源。
將OSS服務(wù)共享給本地數(shù)據(jù)中心
如下圖所示,要實現(xiàn)在本地數(shù)據(jù)中心私網(wǎng)訪問云上部署的OSS服務(wù)資源,您需要在同一地域內(nèi)將OSS服務(wù)資源加入到終端節(jié)點服務(wù)中,然后在VPC中創(chuàng)建連接OSS服務(wù)的終端節(jié)點,并通過專線、VPN網(wǎng)關(guān)或智能接入網(wǎng)關(guān)將本地數(shù)據(jù)中心與VPC連接起來,實現(xiàn)本地數(shù)據(jù)中心私網(wǎng)訪問OSS服務(wù)資源。
操作步驟
創(chuàng)建終端節(jié)點。
- 登錄專有網(wǎng)絡(luò)管理控制臺。
在左側(cè)導(dǎo)航欄,單擊終端節(jié)點。
在頂部菜單欄處,選擇任意支持通過終端節(jié)點私網(wǎng)訪問OSS資源的地域。
在終端節(jié)點頁面下的接口終端節(jié)點頁簽,單擊創(chuàng)建終端節(jié)點。
在創(chuàng)建終端節(jié)點頁面,按以下說明配置各項參數(shù),其他參數(shù)保留默認配置。
參數(shù)
說明
節(jié)點名稱
輸入自定義終端節(jié)點的名稱。
終端節(jié)點類型
選擇接口終端節(jié)點,表示服務(wù)使用方通過接口終端節(jié)點訪問服務(wù)提供方提供的服務(wù)。
終端節(jié)點服務(wù)
單擊阿里云服務(wù),然后在終端節(jié)點服務(wù)名稱搜索框輸入
com.aliyuncs.privatelink.cn-hangzhou.oss
,并選中該終端節(jié)點服務(wù)。說明一個終端節(jié)點僅支持關(guān)聯(lián)一個終端節(jié)點服務(wù)。
專有網(wǎng)絡(luò)
選擇需要創(chuàng)建終端節(jié)點的專有網(wǎng)絡(luò)。
安全組
選擇要與終端節(jié)點網(wǎng)卡關(guān)聯(lián)的安全組,安全組可以管控到終端節(jié)點網(wǎng)卡的數(shù)據(jù)通信。
可用區(qū)與交換機
選擇終端節(jié)點服務(wù)對應(yīng)的可用區(qū),然后選擇該可用區(qū)內(nèi)的交換機。系統(tǒng)會自動在每個交換機下創(chuàng)建一個終端節(jié)點網(wǎng)卡。
單擊確認創(chuàng)建。
創(chuàng)建完成后,您需要記錄生成的終端節(jié)點域名,用于后續(xù)訪問OSS服務(wù)。
使用終端節(jié)點域名訪問OSS。
連接ECS實例。具體步驟,請參見連接ECS實例。
通過ossutil或者SDK以終端節(jié)點域名的方式訪問OSS。
ossutil
在已創(chuàng)建的ECS實例安裝1.7.17及以上版本的ossutil。
具體步驟,請參見安裝ossutil。
使用終端節(jié)點域名以ossutil的方式訪問OSS。
以將examplebucket下的文件examplefile.txt下載到本地目錄/tmp/為例。示例中通過-e選項指定終端節(jié)點域名,使用--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支持使用終端節(jié)點域名進行訪問的操作列表,請參見常用命令。
返回結(jié)果如下:
Succeed: Total num: 1, size: 11. OK num: 1(download 1 objects). average speed 0(byte/s) 0.188959(s) elapsed
SDK
僅以下語言SDK支持使用終端節(jié)點域名訪問OSS。以下以使用終端節(jié)點域名將examplebucket下的文件exampleobject.txt下載到本地為例。
SDK支持使用終端節(jié)點域名進行訪問的操作列表,請參見SDK簡介。
在已創(chuàng)建的ECS實例搭建Java、Python、Go、C++環(huán)境。
選擇以下任意語言SDK以終端節(jié)點域名的方式下載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填寫終端節(jié)點域名。 String endpoint = "https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com"; //從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // 填寫Bucket名稱,例如examplebucket。 String bucketName = "examplebucket"; // 填寫不包含Bucket名稱在內(nèi)的Object完整路徑,例如exampleobject.txt。 String objectName = "exampleobject.txt"; String pathName = "D:\\examplefile.txt"; ClientBuilderConfiguration conf = new ClientBuilderConfiguration(); // 開啟二級域名的訪問方式。 conf.setSLDEnabled(true); // 創(chuàng)建OSSClient實例。 OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider, conf); try { // 下載Object到本地文件,并保存到指定的本地路徑中。如果指定的本地文件存在會覆蓋,不存在則新建。 // 如果未指定本地路徑,則下載后的文件默認保存到示例程序所屬項目對應(yīng)本地路徑中。 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的訪問權(quán)限,風(fēng)險很高。強烈建議您創(chuàng)建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創(chuàng)建RAM賬號。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # Endpoint填寫終端節(jié)點域名。 # 填寫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() { // 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 創(chuàng)建OSSClient實例。 // yourEndpoint填寫終端節(jié)點域名。 // 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) } // 下載文件到本地文件,并保存到指定的本地路徑中。如果指定的本地文件存在會覆蓋,不存在則新建。 // 如果未指定本地路徑,則下載后的文件默認保存到示例程序所屬項目對應(yīng)本地路徑中。 // 依次填寫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賬號信息。*/ /* 填寫終端節(jié)點域名。*/ 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,并保存到指定的本地路徑中。如果指定的本地文件存在會覆蓋,不存在則新建。*/ /* 如果未指定本地路徑,則下載后的文件默認保存到示例程序所屬項目對應(yīng)本地路徑中。*/ std::string FileNametoSave = "D:\\examplefile.txt"; /* 初始化網(wǎng)絡(luò)等資源。*/ InitializeSdk(); ClientConfiguration conf; /* 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量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; } /* 釋放網(wǎng)絡(luò)等資源。*/ ShutdownSdk(); return 0; }