PrivateLink は、お使いの VPC (Virtual Private Cloud) と Alibaba Cloud Object Storage Service (OSS) との間に安全でプライベートな接続を確立します。この接続は、ネイティブなネットワーク層のトラフィック分離を提供し、セキュリティリスクを軽減し、IP アドレスの競合を防ぎ、ネットワーク管理を簡素化します。これにより、クラウドストレージのための安全で管理しやすいアクセスアーキテクチャを構築できます。
仕組み
PrivateLink は、VPC 内に OSS に接続する専用のプライベートエンドポイントを作成することで機能します。これにより、すべてのアクセス トラフィックが Alibaba Cloud のバックボーンネットワーク内に留まり、パブリックインターネットに公開されることはありません。PrivateLink は、送信元 IP アドレスと VPC フローログ監査に基づく正確なアクセス制御も提供し、エンタープライズグレードのデータセキュリティシステムの構築に役立ちます。OSS が提供するデフォルトの内部エンドポイントと比較して、PrivateLink はより高いレベルのネイティブなネットワークセキュリティ分離と詳細な制御を提供するため、次のユースケースに最適です。
ユースケース | 内部エンドポイント | PrivateLink |
厳格なセキュリティとコンプライアンス要件 | アクセスは共有の内部エンドポイントを介して行われ、クラウドプロバイダーのネットワーク内で攻撃対象領域が公開されます。セキュリティ制御は主にアプリケーション層のポリシーに依存します。 | 攻撃対象領域を削減。エンドポイントは VPC 内にあるため、他の VPC はそれを検出したりアクセスしたりできません。トラフィックはネットワーク層でネイティブに分離されます。 |
詳細なネットワーク層のアクセス制御 | セキュリティグループを使用して OSS へのアクセスを制御することはできません。アクセス制御はバケットポリシーに依存します。 | セキュリティグループをサポート。PrivateLink エンドポイントにセキュリティグループルールを追加して、どの送信元 IP アドレスが OSS にアクセスできるかを正確に制御できます。 |
すべてのネットワーク接続試行の監査 | OSS アクセスログは成功したリクエストのみを記録します。ネットワークレイヤーで拒否された接続試行を監査するために使用することはできません。 | VPC フローログをサポート。成功したかどうかにかかわらず、エンドポイントにアクセスしようとするすべてのトラフィックをキャプチャして監査できます。 |
IP 競合の可能性がある複雑なハイブリッドクラウドネットワーク | Alibaba Cloud サービスはデフォルトで 100.64.0.0/10 CIDR ブロックを使用します。これは、オンプレミスのデータセンターの IP アドレススキームと競合する可能性があります。 | IP アドレスの競合を回避します。エンドポイントは VPC の CIDR ブロックから IP アドレスを使用します。これにより、カスタム IP プランと整合し、ハイブリッドクラウドのルーティング構成が簡素化されます。 |
サポートされているリージョン
日本 (東京)、インドネシア (ジャカルタ)、タイ (バンコク)、ドイツ (フランクフルト)、米国 (シリコンバレー)、米国 (バージニア)。
テクニカルサポート に連絡してリクエストすることで利用可能。
PrivateLink の設定と使用
エンドポイントを作成して PrivateLink 接続を確立し、VPC またはオンプレミスのデータセンターから OSS リソースに安全にアクセスできます。
エンドポイントの作成と検証
エンドポイントを作成して、VPC と OSS の間に安全でプライベートな接続を確立できます。エンドポイントが作成された後、ECS インスタンスを使用して、そのネットワーク接続と OSS へのアクセスを検証できます。
開始する前に、VPC と vSwitch を作成していることを確認してください。検証ステップには ECS インスタンスが必要です。既存のインスタンスがない場合は、従量課金インスタンスを作成します。詳細については、「ECS インスタンスの購入」をご参照ください。
ステップ 1: エンドポイントの作成
VPC エンドポイント ページに移動し、[エンドポイントの作成] をクリックします。PrivateLink を初めて使用する場合は、画面の指示に従ってサービスを有効化します。
以下のパラメーターを設定します。リストにないパラメーターはデフォルト値のままにします。
[リージョン]: ターゲットの OSS バケットのリージョン (中国 (杭州) など) を選択します。
エンドポイント名: エンドポイントの説明的な名前 (例:
privatelink-oss) を入力します。エンドポイントタイプ: [インターフェイスエンドポイント] を選択します。
エンドポイントサービス: [Alibaba Cloud サービス] を選択します。サービスリストで、OSS エンドポイントサービスを選択します。サービス名は
ossで終わります。VPC: エンドポイントを作成するターゲット VPC を選択します。利用可能な VPC がない場合は、[VPC の作成] をクリックします。
[セキュリティグループ]: エンドポイントにアタッチするセキュリティグループを選択します。セキュリティグループはアクセス権限を制御します。適切なセキュリティグループがない場合は、[セキュリティグループの作成] をクリックします。
[ゾーンと VSwitch]: エンドポイントがデプロイされるゾーンと対応する vSwitch を選択します。利用可能な vSwitch がない場合は、[VSwitch の作成] をクリックします。
[OK] をクリックします。システムは自動的にエンドポイントを作成します。エンドポイントが作成されたら、その詳細ページに移動して [エンドポイントドメイン名] を表示およびコピーします。このドメイン名は、後続の OSS へのアクセスに使用します。

ステップ 2: エンドポイントドメイン名の検証
ネットワーク接続をテストし、OSS からファイルをダウンロードすることで、エンドポイントの設定を検証できます。これにより、PrivateLink 接続が正しく機能していることを確認できます。
ネットワーク接続の確認
pingコマンドを使用して、エンドポイントドメイン名のネットワーク接続をテストできます。これにより、DNS 解決とネットワークパスが機能していることを確認できます。ping -c 4 ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.comファイルダウンロードの確認
同じリージョン内の ECS インスタンスで ossutil ツールを使用して、OSS からファイルをダウンロードできます。これにより、接続を介してデータを転送できることを確認できます。
「ossutil 2.0 のインストールと設定」をご参照ください。
エンドポイントドメイン名 (例:
ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com) を使用して OSS リソースにアクセスします。次の例は、example-bucketという名前のバケットからdest.jpgという名前のファイルをダウンロードする方法を示しています。ossutil cp oss://example-bucket/dest.jpg /tmp/ -e ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com --addressing-style pathコマンドが成功すると、次の出力が表示され、ダウンロードが完了したことを示します。ダウンロードしたファイルは
/tmpディレクトリにあります。Success: Total 1 object, size 134102 B, Download done:(1 files, 134102 B), avg 680.112 KiB/s 0.193189(s) elapsed
VPC アクセスのセキュリティ強化
PrivateLink が機能していることを確認したら、バケットポリシーを設定してセキュリティをさらに強化できます。次の例は、PrivateLink 接続に関連付けられている VPC からのみオブジェクトにアクセスできるようにアクセスを制限する方法を示しています。この設定は、ネットワーク層とアプリケーション層の両方でアクセス制御を提供します。
バケット ページに移動し、ターゲットバケットの名前をクリックします。
左側のナビゲーションウィンドウで、 をクリックします。
[承認] をクリックし、以下のパラメーターを設定します。他のパラメーターはデフォルト値のままにします。
承認済みユーザー: [すべてのアカウント (*)] を選択します。
承認済み操作: [詳細設定] を選択します。
効果: [拒否] を選択します。
アクション: [oss:GetObject] を選択します。
条件: [VPC ≠] を選択し、PrivateLink エンドポイントにアタッチされている VPC を選択します。
[OK] をクリックしてバケットポリシーを保存します。
SSL-VPN を使用したオンプレミスデバイスからのアクセス
SSL-VPN ソリューションは、開発者のワークステーションやモバイルデバイスなどの個々のオンプレミスデバイスに、高速で柔軟な VPC アクセスを提供します。VPC に SSL-VPN Gateway をデプロイすると、デバイスは暗号化されたトンネルを確立し、構成された PrivateLink エンドポイントを使用して OSS に安全にアクセスできます。この方法は、リモートワーク、開発とテスト、および緊急アクセスに最適です。
ステップ 1: SSL-VPN ゲートウェイの作成とクライアントの設定
オンプレミスデバイスと VPC の間に暗号化された接続を確立するには、SSL-VPN Gateway をデプロイし、クライアント構成を完了します。詳細については、「SSL-VPN 接続を介してクライアントから VPC にアクセスする」をご参照ください。
ステップ 2: OSS への PrivateLink アクセスの検証
プライベートアクセスパスが正しく機能していることを確認するために、接続性をテストし、ファイルをダウンロードして PrivateLink 接続を検証します。
接続性の検証
pingコマンドを使用して、エンドポイントドメイン名のネットワーク接続をテストできます。これにより、DNS 解決とネットワークパスが機能していることを確認できます。ping -c 4 ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.comファイルダウンロードの確認
ossutil
同じリージョン内の ECS インスタンスで、ossutil ツールを使用して OSS でファイル操作を実行します。これにより、PrivateLink 接続の機能とデータ転送の安定性が検証されます。
「ossutil 2.0 のインストールと設定」をご参照ください。
エンドポイントドメイン名 (例:
ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com) を使用して OSS リソースにアクセスします。次の例は、example-bucketという名前のバケットからdest.jpgという名前のファイルをダウンロードする方法を示しています。ossutil cp oss://example-bucket/dest.jpg /tmp/ -e ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com --addressing-style pathコマンドが成功すると、次の出力が表示され、ダウンロードが完了したことを示します。ダウンロードしたファイルは
/tmpディレクトリにあります。Success: Total 1 object, size 134102 B, Download done:(1 files, 134102 B), avg 680.112 KiB/s 0.193189(s) elapsed
SDK
SDK を使用すると、実際の運用環境をより忠実にシミュレートできます。この方法は、複雑なビジネスロジックの統合と例外処理をサポートします。次の言語の SDK は、PrivateLink 経由での OSS へのアクセスをサポートしています。
Java
PrivateLink 経由で OSS にアクセスする場合は、
setSLDEnabled(true)を使用してパス形式のアクセスを有効にします。パブリックインターネット経由で OSS にアクセスする場合は、setSLDEnabled(false)を使用します。import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.GetObjectRequest; import java.io.File; /** * OSS PrivateLink アクセスデモ。 * このデモは、PrivateLink 経由で OSS にアクセスし、ファイルをダウンロードする方法を示します。 */ public class Test { public static void main(String[] args) throws Exception { // PrivateLink エンドポイントのドメイン名。 String endpoint = "https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com"; // エンドポイントに対応するリージョン (例: cn-hangzhou) を指定します。 String region = "cn-hangzhou"; // 環境変数からアクセス資格情報を取得します。 // このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // バケット名 (例: example-bucket) を指定します。 String bucketName = "example-bucket"; // オブジェクトのフルパスを指定します (バケット名は含めません)。 String objectName = "dest.jpg"; // 保存するローカルファイルの名前。 String pathName = "dest.jpg"; // クライアントパラメーターを設定します。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // PrivateLink のパス形式のアクセスを有効にします。バケットのパブリックエンドポイントを介してアクセスする場合は、これを false に設定します。 clientBuilderConfiguration.setSLDEnabled(true); // V4 署名アルゴリズムの使用を明示的に宣言します。 clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // OSS クライアントインスタンスを作成します。 OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // オブジェクトをローカルファイルにダウンロードし、指定されたローカルパスに保存します。 // ローカルファイルが存在する場合は上書きされます。存在しない場合は作成されます。 // ローカルパスが指定されていない場合、ダウンロードされたファイルはプロジェクトのデフォルトのローカルパスに保存されます。 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName)); } catch (OSSException oe) { // OSS サーバー側の例外を処理します。 System.out.println("Caught an OSSException, which means your request made it to the OSS server but was rejected with an error response."); 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 a 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
PrivateLink 経由で OSS にアクセスする場合は、
is_path_style=Trueを使用してパス形式のアクセスを有効にします。# -*- coding: utf-8 -*- """ OSS PrivateLink アクセスデモ PrivateLink 経由で OSS にアクセスし、ローカルマシンにファイルをダウンロードします。 """ import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider def main(): """メイン関数: PrivateLink 経由で OSS にアクセスし、ファイルをダウンロードする方法を示します。""" # アクセス資格情報を設定します。 # 注: Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。これはリスクの高い操作です。 # API アクセスや日常の O&M には RAM ユーザーを作成して使用します。RAM コンソールにログオンして RAM ユーザーを作成します。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # PrivateLink エンドポイントのドメイン名。 endpoint = 'https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com' # バケット名。 bucket_name = 'example-bucket' # バケットオブジェクトを作成します。 # is_path_style=True はパス形式のアクセスを有効にし、PrivateLink などの特定のユースケースに適しています。 bucket = oss2.Bucket(auth, endpoint, bucket_name, is_path_style=True) # OSS オブジェクトのパス (バケット名を含まない完全なパス)。 object_name = 'dest.jpg' # 保存先のローカルファイルパス。 local_file_path = 'dest.jpg' # オブジェクトをローカルファイルにダウンロードします。 # ローカルファイルが存在する場合は上書きされます。存在しない場合は作成されます。 bucket.get_object_to_file(object_name, local_file_path) print(f"File downloaded successfully: {object_name} -> {local_file_path}") if __name__ == '__main__': main()Go
PrivateLink 経由で OSS にアクセスする場合は、
ForcePathStyle(true)を使用してパス形式のアクセスを有効にします。package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) const ( // PrivateLink エンドポイント。 endpoint = "https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com" // バケット名。 bucketName = "example-bucket" // OSS オブジェクトパス (バケット名を含まない完全なパス)。 objectName = "dest.jpg" // 保存先のローカルファイルパス。 localFilePath = "dest.jpg" ) func main() { // 資格情報プロバイダーを初期化します。 // 環境変数からアクセス資格情報を取得します。 // このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Printf("Failed to initialize credentials provider: %v\n", err) os.Exit(-1) } // OSS クライアントインスタンスを作成します。 // oss.ForcePathStyle(true) はパス形式のアクセスを有効にし、PrivateLink などの特定のユースケースに適しています。 client, err := oss.New( endpoint, "", // AccessKeyId は資格情報プロバイダーを介して取得されます。 "", // AccessKeySecret は資格情報プロバイダーを介して取得されます。 oss.SetCredentialsProvider(&provider), oss.ForcePathStyle(true), ) if err != nil { fmt.Printf("Failed to create OSS client: %v\n", err) os.Exit(-1) } // バケットオブジェクトを取得します。 bucket, err := client.Bucket(bucketName) if err != nil { fmt.Printf("Failed to get bucket object: %v\n", err) os.Exit(-1) } // オブジェクトをローカルファイルにダウンロードします。 // ローカルファイルが存在する場合は上書きされます。存在しない場合は作成されます。 // ローカルパスが指定されていない場合、ダウンロードされたファイルはプロジェクトのデフォルトのローカルパスに保存されます。 err = bucket.GetObjectToFile(objectName, localFilePath) if err != nil { fmt.Printf("Failed to download file: %v\n", err) os.Exit(-1) } fmt.Printf("File downloaded successfully: %s -> %s\n", objectName, localFilePath) }C++
PrivateLink 経由で OSS にアクセスする場合は、
conf.isPathStyle = trueを使用してパス形式のアクセスを有効にします。#include <alibabacloud/oss/OssClient.h> #include <memory> #include <fstream> #include <iostream> using namespace AlibabaCloud::OSS; int main(void) { // PrivateLink エンドポイントのドメイン名。 std::string Endpoint = "https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com"; // バケット名。 std::string BucketName = "example-bucket"; // OSS オブジェクトパス (バケット名を含まない完全なパス)。 std::string ObjectName = "dest.jpg"; // 保存先のローカルファイルパス。 // ローカルファイルが存在する場合は上書きされます。存在しない場合は作成されます。 // ローカルパスが指定されていない場合、ダウンロードされたファイルはプロジェクトのデフォルトのローカルパスに保存されます。 std::string FileNametoSave = "dest.jpg"; // ネットワークなどの OSS SDK リソースを初期化します。 InitializeSdk(); // クライアントパラメーターを設定します。 ClientConfiguration conf; // 環境変数からアクセス資格情報を取得します。 // このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>(); // パス形式のアクセスを有効にします。これは PrivateLink などの特定のユースケースに適しています。 conf.isPathStyle = true; // OSS クライアントインスタンスを作成します。 OssClient client(Endpoint, credentialsProvider, conf); // GetObject リクエストをビルドします。 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 << "File downloaded successfully, size: " << outcome.result().Metadata().ContentLength() << " bytes" << std::endl; std::cout << "File saved to: " << FileNametoSave << std::endl; } else { // エラーを処理します。 std::cout << "File download failed" << std::endl << "Error code: " << outcome.error().Code() << std::endl << "Error message: " << outcome.error().Message() << std::endl << "Request ID: " << outcome.error().RequestId() << std::endl; // リソースを解放し、エラーコードを返します。 ShutdownSdk(); return -1; } // ネットワークなどの OSS SDK リソースを解放します。 ShutdownSdk(); return 0; }
Express Connect 回線または VPN Gateway を使用したオンプレミスのデータセンターからの接続
OSS へのプライベートアクセスに PrivateLink を使用するために、エンタープライズデータセンターは Express Connect 回線または VPN Gateway を介して Alibaba Cloud VPC に接続できます。Express Connect は安定したネットワークパフォーマンスと保証された帯域幅を提供し、VPN Gateway は柔軟で暗号化された接続を提供します。どちらのソリューションも、本番環境での大規模なデータ転送に適しています。詳細については、「VPC をデータセンターまたは別のクラウドに接続する」をご参照ください。
本番環境での適用
ベストプラクティス
セキュリティグループ構成の最適化
セキュリティグループルールを最小権限の原則に基づいて構成します。必要な IP アドレス範囲からのみエンドポイントポートへのアクセスを許可し、セキュリティルールの定期的なレビュープロセスを確立します。正確な送信元 IP 制御とポート制限により、アクセス ポリシーがビジネスニーズを満たし、不正アクセスを防ぐことができます。
ネットワーク接続の監視
VPC フローログを有効にして、トラフィックパターンに基づいた異常検出メカニズムを確立し、PrivateLink のアクセス動作とデータ転送ステータスをリアルタイムで監視します。
複数ゾーンへのデプロイ
本番環境でフォールトトレラントで高可用性のサービスアーキテクチャを構築するには、複数のゾーンにエンドポイントをデプロイします。ロードバランシングまたは DNS ラウンドロビンを使用して、インテリジェントなトラフィック分散を行います。単一のゾーンで障害が発生した場合、トラフィックは自動的に他のゾーンの正常なエンドポイントにフェイルオーバーし、サービスの継続性と運用上の安定性を確保します。
課金
PrivateLink は実際の使用量に基づいて課金され、請求書は 1 時間ごとに生成されます。課金項目には、インスタンス料金とデータ転送料金が含まれます。サービスユーザーとプロバイダーは異なる Alibaba Cloud アカウントである可能性があり、料金は指定されたアカウントに請求できます。詳細については、「PrivateLink の課金」をご参照ください。