PrivateLink は、お使いの Virtual Private Cloud (VPC) と Object Storage Service (OSS) の間に安全なプライベート接続を確立し、すべてのトラフィックを Alibaba Cloud のバックボーンネットワーク内に保持します。これにより、データセキュリティのリスク、ネットワークアドレスの競合、および運用の複雑さが解消され、クラウドストレージへの安全で制御されたパスが提供されます。
仕組み
PrivateLink は、VPC 内に専用のプライベートエンドポイントをプロビジョニングし、トラフィックを直接 OSS にルーティングします。トラフィックは Alibaba Cloud のバックボーンネットワーク内に留まり、ソース IP ベースのアクセス制御と VPC フローログ監査が可能になります。標準の OSS 内部エンドポイントとは異なり、PrivateLink はネットワーク層のセキュリティ分離と詳細なトラフィック制御を提供します。PrivateLink は、以下のシナリオに適しています。
|
シナリオ |
標準の内部エンドポイント |
PrivateLink |
|
厳格なセキュリティとコンプライアンス要件 |
すべての VPC がアクセス可能な共有エントリポイントを公開します。セキュリティはアプリケーション層のポリシーに依存します。 |
攻撃対象領域を削減します。エントリポイントは VPC 内に存在するため、他の VPC からは検出も到達もできず、トラフィックはネットワーク層で分離されます。 |
|
ネットワーク層での詳細なアクセス制御 |
セキュリティグループでは OSS へのアクセスを制御できません。バケットポリシーが唯一の選択肢です。 |
セキュリティグループのバインディングをサポートします。PrivateLink エンドポイントにセキュリティグループルールをアタッチして、OSS に到達できるソース IP を正確に制御します。 |
|
すべての接続試行の監査 |
OSS アクセスログは成功したリクエストのみを記録します。拒否されたネットワーク層の試行はキャプチャされません。 |
VPC フローログをサポートします。接続が成功したかどうかに関わらず、エンドポイントをターゲットとするすべてのトラフィックをキャプチャして監査します。 |
|
IP 競合の可能性があるハイブリッドクラウド |
クラウドサービスはデフォルトで |
IP 競合を回避します。エンドポイントは VPC のアドレス空間から IP を使用するため、カスタム IP 計画を完全に尊重し、ハイブリッドクラウドのルーティングを簡素化します。 |
サポート対象リージョン
以下のリージョンは、以下から申請した後にサポートされます:テクニカルサポート:中国 (Hangzhou)、中国 (Shanghai)、中国 (Qingdao)、中国 (Beijing)、中国 (Zhangjiakou)、中国 (Ulanqab)、中国 (Shenzhen)、中国 (Heyuan)、中国 (Guangzhou)、中国 (Chengdu)、香港 (中国)、日本 (Tokyo)、韓国 (Seoul)、シンガポール、インドネシア (Jakarta)、タイ (Bangkok)、ドイツ (Frankfurt)、米国 (Silicon Valley)、米国 (Virginia)、および英国 (London)。
PrivateLink の設定と使用
PrivateLink エンドポイントを作成してプライベート接続を確立し、それを使用して VPC またはオンプレミスデータセンターから安全に OSS にアクセスします。
エンドポイントの作成と検証
エンドポイントを作成して VPC と OSS の間に安全なプライベート接続を確立し、その後、Elastic Compute Service (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:エンドポイントの検証
接続性テストとファイルのダウンロードを実行して、PrivateLink エンドポイントが正しく設定され、完全に機能していることを確認します。
-
接続性の検証
pingを使用してエンドポイントのドメイン名をテストし、DNS 名前解決とネットワークパスが正しく機能していることを確認します。
ping -c 4 ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com
-
ファイルダウンロードの検証
同じリージョン内の ECS インスタンスから、ossutil を使用して 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
VPC アクセスセキュリティの強化
PrivateLink 接続を検証した後、バケットポリシーのアクセスポリシーを設定して、アクセス制御のレイヤーを追加します。次の例では、オブジェクトのダウンロードを PrivateLink エンドポイントにバインドされた VPC からのリクエストに制限し、ネットワーク層とアプリケーション層のアクセス制御を組み合わせています。
バケットリストに移動し、ターゲットのバケットをクリックします。
左側のナビゲーションウィンドウで、 をクリックします。
[承認] をクリックし、次の設定を行います。他のすべてのパラメーターはデフォルトのままにします。
承認済みユーザー: [すべてのアカウント (*)] を選択します。
承認操作: [詳細設定] を選択します。
効果: [拒否] を選択します。
[アクション]:[oss:GetObject] を選択します。
[条件]:[VPC ≠] を選択し、ドロップダウンから PrivateLink エンドポイントにバインドされた VPC を選択します。
[OK] をクリックしてバケットポリシーを保存します。
SSL-VPN を介したローカルデバイスの接続
SSL-VPN を使用すると、開発者のワークステーションやモバイルデバイスなどの個々のデバイスが、暗号化トンネルを介して VPC に接続できます。接続されると、これらのデバイスは VPC にすでに設定されている PrivateLink エンドポイントを介して OSS にアクセスできます。このアプローチは、リモートワーク、開発およびテスト、緊急アクセスシナリオに適しています。
ステップ 1:SSL-VPN ゲートウェイとクライアントの設定
SSL-VPN ゲートウェイをデプロイし、クライアント設定を完了して、ローカルデバイスと VPC の間に暗号化接続を確立します。詳細な手順については、「クライアントを VPC に接続する」をご参照ください。
ステップ 2:OSS への PrivateLink アクセスの検証
接続性テストとファイルのダウンロードを実行して、ローカルデバイスから PrivateLink 接続が正しく機能していることを確認します。
-
接続性の検証
pingを使用してエンドポイントのドメイン名をテストし、DNS 名前解決とネットワークパスが正しく機能していることを確認します。
ping -c 4 ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com
ファイルダウンロードの検証
ossutil
ossutil を使用して実際のファイル操作を実行し、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) を呼び出してパス形式のアクセスを有効にします。標準のインターネットアクセスの場合は、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);
// 署名バージョン 4 を使用
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: the request reached OSS but was rejected.");
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) {
// クライアントが OSS と通信できなかった
System.out.println("Caught a ClientException: the client encountered a serious internal problem, " +
"such as a network failure.");
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 アクセスや日常的な操作には RAM ユーザーを使用してください。RAM ユーザーは RAM コンソールで作成します。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# PrivateLink エンドポイントのドメイン名
endpoint = 'https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com'
# バケット名
bucket_name = 'example-bucket'
# 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: %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);
// ダウンロードリクエストの構築
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 << "Saved to: " << FileNametoSave << std::endl;
}
else {
// エラー処理
std::cout << "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 ゲートウェイを介したオンプレミスデータセンターの接続
エンタープライズデータセンターは、Express Connect 回線または VPN ゲートウェイを介して Alibaba Cloud VPC に接続し、その後 PrivateLink を使用してプライベートネットワーク経由で OSS にアクセスできます。Express Connect は安定した保証された帯域幅を提供し、VPN ゲートウェイは柔軟な暗号化接続を提供します。どちらも大規模な本番データ転送に適しています。設定の詳細については、「VPC をデータセンターまたは別のクラウドに接続する」をご参照ください。
本番環境への適用
ベストプラクティス
-
セキュリティグループルールの最適化
最小権限の原則に従ってセキュリティグループルールを設定します:アクセスが必要な特定の IP 範囲にのみエンドポイントのアクセスポートを開放し、セキュリティルールを定期的に見直します。正確なソース IP とポートの制御により、アクセスポリシーがビジネス要件と一致し続け、権限の無秩序な拡大や不正アクセスを防ぎます。
-
ネットワーク接続の監視
VPC フローログを有効にし、トラフィックパターンに基づいて異常検知を設定して、PrivateLink のアクセス動作とデータ転送をリアルタイムで監視します。
-
複数ゾーンへのデプロイ
本番環境では、高可用性とフォールトトレランスのために、複数のアベイラビリティゾーンにエンドポイントをデプロイします。負荷分散または DNS ラウンドロビンを使用すると、1 つのゾーンで障害が発生した場合に、トラフィックは自動的に他のゾーンの正常なエンドポイントにシフトされ、サービスの継続的な可用性が維持されます。
課金
PrivateLink は、実際の使用量に基づいて時間単位で課金されます。料金には、インスタンス料金とデータ処理料金が含まれます。サービス利用者とサービスプロバイダーは異なる Alibaba Cloud アカウントである場合があり、料金は指定されたアカウントに請求できます。詳細については、「課金概要」をご参照ください。