PrivateLinkは、仮想プライベートクラウド (VPC) と他のAlibaba Cloudサービス間のプライベートで安定したセキュアな接続を確立するために使用されます。 PrivateLinkはネットワークアーキテクチャを簡素化し、インターネット経由でサービスにアクセスすることで発生するリスクを防ぎます。 このトピックでは、PrivateLinkを使用してObject Storage Service (OSS) リソースにアクセスする方法について説明します。
前提条件
あなたの OSSへのPrivateLinkベースのアクセスを申請するためのチケットが承認されました。 注: この機能は招待プレビューです。
PrivateLinkを使用してアクセスするOSSリソースは、中国 (杭州) 、中国 (上海) 、中国 (北京) 、中国 (ウランカブ) 、中国 (深セン) 、中国 (香港) 、シンガポール、またはインドネシア (ジャカルタ) リージョンにあります。
PrivateLinkエンドポイントを作成するリージョンにVPCとvSwitchが作成されます。 詳細については、「VPCとvSwitchの作成」をご参照ください。
ECS (Elastic Compute Service) インスタンスがVPCに作成されます。 詳細は、インスタンスの作成をご参照ください。
課金ルール
シナリオ
OSSリソースをVPCと共有する
PrivateLinkを使用して、リージョン内のVPCからOSSリソースにアクセスできます。 この場合、エンドポイントサービスのサービスリソースとしてOSSを指定し、VPCにエンドポイントを作成する必要があります。 次の図にプロセスを示します。
OSSリソースをローカルデータセンターと共有する
PrivateLinkを使用して、ローカルデータセンターがOSSリソースにアクセスできるようにすることができます。 この場合、エンドポイントサービスのサービスリソースとしてOSSを指定し、VPCにエンドポイントを作成してリージョン内のOSSにVPCを接続し、専用回線、VPN Gateway、またはSmart Access Gateway (SAG) を使用してローカルデータセンターとVPC間の接続を確立する必要があります。 次の図にプロセスを示します。
手順
エンドポイントを作成します。
VPCコンソールにログインします。
左側のナビゲーションウィンドウで、[エンドポイント] をクリックします。
上部のナビゲーションバーで、PrivateLinkを使用してアクセスするOSSリソースが配置されているリージョンを選択します。
[エンドポイント] ページの [インターフェイスエンドポイント] タブで、[エンドポイントの作成] をクリックします。
[エンドポイントの作成] ページで、パラメーターを設定します。 下表に、各パラメーターを説明します。 他のパラメーターのデフォルト設定を保持します。
パラメーター
説明
エンドポイント名
エンドポイントの名前を指定します。
エンドポイントタイプ
サービスコンシューマーが提供されたサービスにアクセスするためのインターフェイスエンドポイントを作成するには、[インターフェイスエンドポイント] を選択します。
Endpointsサービス
[Alibaba Cloudサービス] を選択します。 [エンドポイントサービス名] 検索ボックスに
com.aliyuncs.privatelink.cn-hangzhou.oss
と入力し、検索アイコンをクリックします。 エンドポイントサービスを選択します。説明エンドポイントを1つのエンドポイントサービスにのみ関連付けることができます。
[VPC]
エンドポイントを作成するVPCを選択します。
セキュリティグループ
エンドポイントelastic network interface (ENI) に関連付けるセキュリティグループを選択します。 セキュリティグループを使用すると、エンドポイントENIとの通信を管理できます。
ゾーンとvSwitch
エンドポイントサービスのゾーンを選択し、ゾーン内のvSwitchを選択します。 システムは自動的にvSwitchにエンドポイントENIを作成します。
[OK] をクリックします。
生成されたPrivateLinkエンドポイントを、後でOSSにアクセスできるように記録します。
PrivateLinkエンドポイントを使用してOSSにアクセスします。
作成したECSインスタンスに接続します。 詳細については、「インスタンスへの接続」をご参照ください。
ossutilまたはOSS SDKを使用してOSSにアクセスする場合は、PrivateLinkエンドポイントを指定します。
ossutil
ECSインスタンスにossutil 1.7.17以降をインストールします。
詳細については、「ossutilのインストール」をご参照ください。
OSSにアクセスするためのossutilコマンドでPrivateLinkエンドポイントを指定します。
次のサンプルコマンドを実行して、examplebucketバケットからローカルの /tmp /フォルダーにexamplefile.txtオブジェクトをダウンロードします。サンプルコマンドの-eオプションはPrivateLinkエンドポイントを指定し、-- force-path-styleオプションはOSSへのパススタイルアクセスを指定します。
ossutil cp oss:// examplebucket/examplefile.txt /tmp/ -e ep-bp1i317e3d65873e **** .oss.cn-hangzhou.privatelink.aliyuncs.com -- force-path-style
ossutilは、OSSへのアクセス用のPrivateLinkエンドポイントをサポートしています。 一般的なossutilコマンドのリストについては、「一般的なコマンド」をご参照ください。
次の出力は、上記のコマンドに対するサンプル応答です。
成功: 合計数: 1、サイズ: 11。 OK num: 1 (1オブジェクトをダウンロード) 。 平均速度0 (バイト /秒) 0.188959経過
SDK
次のプログラミング言語のOSS SDKのみが、OSSへのアクセス用のPrivateLinkエンドポイントをサポートしています。 次のサンプルコードは、PrivateLinkエンドポイントを使用してexamplebucketバケットからローカルパスにexampleobject.txtオブジェクトをダウンロードする方法の例を示しています。
PrivateLinkエンドポイントベースのOSSアクセスをサポートするOSS SDKの詳細については、「概要」をご参照ください。
ECSインスタンスにJava、Python、Go、またはC ++ 環境を構築します。
次のいずれかのOSS SDKのコードでPrivateLinkエンドポイントを指定して、オブジェクトをダウンロードします。
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 { // Specify the PrivateLink endpoint. String endpoint = "https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com"; // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Specify the name of the bucket. Example: examplebucket. String bucketName = "examplebucket"; // Specify the full path of the object. Do not include the bucket name in the full path. Example: exampleobject.txt. String objectName = "exampleobject.txt"; String pathName = "D:\\examplefile.txt"; ClientBuilderConfiguration conf = new ClientBuilderConfiguration(); // Enable access based on a root domain name. conf.setSLDEnabled(true); // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider, conf); try { // Download the object as a local file in the specified path. If a file that has the same name already exists in the path, the downloaded object overwrites the file. If no file that has the same name exists in the path, the downloaded object is saved in the path. // If you do not specify a local path for the downloaded object, the downloaded object is saved to the path of the project to which the sample program belongs. 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 # The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # Specify the PrivateLink endpoint. # Specify the name of the bucket. Example: examplebucket. # Set is_path_style to True to enable access based on a root domain. bucket = oss2.Bucket(auth, 'https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com', 'examplebucket', is_path_style=True) # Specify the full path of the object. Do not include the bucket name in the full path. Example: exampleobject.txt. # Download the object as a local file in the specified path. Example: D:\\examplefile.txt. If a file that has the same name already exists in the path, the downloaded object overwrites the file. If no file that has the same name exists in the path, the downloaded object is saved in the path. 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() { // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Create an OSSClient instance. // Specify the PrivateLink endpoint. // Set oss.ForcePathStyle to true to enable access based on a root domain. 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) } // Specify the name of the bucket. Example: examplebucket. bucket, err := client.Bucket("examplebucket") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Download the object as a local file in the specified local path. If a file that has the same name already exists in the path, the downloaded object overwrites the file. If no file that has the same name exists in the path, the downloaded object is saved in the path. // If you do not specify a local path for the downloaded object, the downloaded object is saved to the path of the project to which the sample program belongs. // Specify the full path of the object and the local file. In this example, the full path of the object is exampleobject.txt and the full path of the local file is D:\\examplefile.txt. Do not include the bucket name in the full path. 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) { /* Initialize information about the account that is used to access OSS. */ /* Specify the PrivateLink endpoint. */ std::string Endpoint = "https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com"; /* Specify the name of the bucket. Example: examplebucket. */ std::string BucketName = "examplebucket"; /* Specify the full path of the object. Do not include the bucket name in the full path. Example: exampleobject.txt. */ std::string ObjectName = "exampleobject.txt"; /* Download the object as a local file named examplefile.txt in the specified path. If a file that has the same name already exists in the path, the downloaded object overwrites the file. If no file that has the same name exists in the path, the downloaded object is saved in the path. */ /* If you do not specify a local path for the downloaded object, the downloaded object is saved to the path of the project to which the sample program belongs. */ std::string FileNametoSave = "D:\\examplefile.txt"; /* Initialize resources, such as network resources. */ InitializeSdk(); ClientConfiguration conf; /* Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. */ auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>(); /* Set conf.isPathStyle to true to enable access based on a second-level domain. */ conf.isPathStyle = true OssClient client(Endpoint, credentialsProvider, conf); /* Download the object as a local file. */ 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 { /* Handle exceptions. */ std::cout << "GetObjectToFile fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; return -1; } /* Release resources, such as network resources. */ ShutdownSdk(); return 0; }