すべてのプロダクト
Search
ドキュメントセンター

PrivateLink:PrivateLink を使用した OSS へのアクセス

最終更新日:Jun 26, 2025

PrivateLink は、仮想プライベートクラウド (VPC) と他の Alibaba Cloud サービス間のプライベートで安定した安全な接続を確立するために使用されます。 PrivateLink はネットワークアーキテクチャを簡素化し、インターネット経由でサービスにアクセスすることによって発生する可能性のあるリスクを防ぎます。 このトピックでは、PrivateLink を使用して Object Storage Service (OSS) リソースにアクセスする方法について説明します。

背景情報

Alibaba Cloud サービスにアクセスするときに、次の課題が発生する可能性があります。

  • データセキュリティリスク: インターネット経由で Alibaba Cloud サービスにアクセスすると、機密情報が漏洩する可能性があります。 これはデータセキュリティに対する脅威となります。

  • CIDR ブロックの競合: デフォルトでは、Alibaba Cloud サービスは 100.64 CIDR ブロックを占有します。 データセンターで同じ CIDR ブロックを使用している場合、アドレスの競合が発生します。

  • O&M 管理の難しさ: O&M チームは、従来のプライベートネットワーク経由でサービスにアクセスする場合、Alibaba Cloud サービスへのアクセストラフィックを監査できません。

これらの課題に対処するために、PrivateLink を使用することをお勧めします。これには次の利点があります。

  • 強化されたデータプライバシー: PrivateLink は、インターネット上でデータが公開されるのを効果的に防ぎ、データ漏洩のリスクを軽減します。

  • 最適化されたネットワークアーキテクチャ: PrivateLink により、ルートを設定する必要がなくなり、データセンターとクラウド間の CIDR ブロックの競合を防ぎます。 ネットワーク管理が簡素化されます。

  • 強化されたアクセス制御: PrivateLink は、ソース認証ときめ細かい権限管理をサポートし、データセキュリティを確保します。 さらに、VPC フローログとトラフィックミラーリング機能により、アクセストラフィックの包括的な監視と監査が可能になり、データセキュリティがさらに向上します。

前提条件

  • テクニカルサポート に連絡して、中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深セン)、中国 (河源)、中国 (広州)、中国 (成都)、中国 (香港)、シンガポール、ドイツ (フランクフルト)、米国 (シリコンバレー)、または米国 (バージニア) リージョンにある OSS リソースへの PrivateLink ベースのアクセスを申請する必要があります。

  • 日本 (東京) およびインドネシア (ジャカルタ) リージョンの OSS リソースには、PrivateLink 経由で直接アクセスできます。

  • PrivateLink エンドポイントを作成するリージョンに VPC と vSwitch が作成されます。 詳細については、「VPC と vSwitch を作成する」をご参照ください。

  • Elastic Compute Service (ECS) インスタンスが VPC に作成されます。 詳細については、「インスタンスの作成」をご参照ください。

課金ルール

  • PrivateLink を有効にしても課金されません。PrivateLink の有効化後、従量課金制で課金されます。請求書は 1 時間ごとに生成されます。インスタンス料金とデータ転送料金が課金されます。詳細については、「請求の概要」をご参照ください。

  • サービス コンシューマーとサービス プロバイダーは、異なる Alibaba Cloud アカウントを使用できます。サービス コンシューマーまたはサービス プロバイダーのどちらが費用を支払うかを指定できます。詳細については、「支払者」をご参照ください。

シナリオ

OSS リソースを VPC と共有する

PrivateLink を使用して、リージョン内の VPC から OSS リソースにアクセスできます。この場合、エンドポイントサービスのサービスリソースとして OSS を指定し、VPC にエンドポイントを作成する必要があります。次の図は、プロセスを示しています。

OSS リソースをローカルデータセンターと共有する

PrivateLink を使用すると、ローカルデータセンターが OSS リソースにアクセスできるようにすることができます。この場合、エンドポイントサービスのサービスリソースとして OSS を指定し、VPC にエンドポイントを作成して VPC をリージョン内の OSS に接続し、次に専用回線、VPN Gateway、または Smart Access Gateway(SAG)を使用して、ローカルデータセンターと VPC 間に接続を確立する必要があります。次の図は、プロセスを示しています。

手順

  1. エンドポイントを作成します。

    1. VPCコンソール にログインします。

    2. 左側のナビゲーションウィンドウで、[エンドポイント] をクリックします。

    3. 上部のナビゲーションバーで、PrivateLink を使用してアクセスする OSS リソースが配置されているリージョンを選択します。

    4. [エンドポイント] ページの [インターフェースエンドポイント] タブで、[エンドポイントの作成] をクリックします。

    5. [エンドポイントの作成] ページで、パラメーターを構成します。次の表にパラメーターを示します。その他のパラメーターについては、デフォルト設定を保持します。

      パラメーター

      説明

      エンドポイント名

      エンドポイントの名前を指定します。

      エンドポイントタイプ

      [インターフェースエンドポイント] を選択して、サービスコンシューマーが提供されるサービスにアクセスするためのインターフェースエンドポイントを作成します。

      エンドポイントサービス

      [Alibaba Cloud サービス] を選択し、com.aliyuncs.privatelink.{リージョンID}.oss の形式に従う OSS のエンドポイントサービス名を選択します。

      たとえば、中国 (杭州) リージョンのエンドポイントサービス名は com.aliyuncs.privatelink.cn-hangzhou.oss です。

      説明

      エンドポイントは 1 つのエンドポイントサービスにのみ関連付けることができます。

      VPC

      エンドポイントを作成する VPC を選択します。

      セキュリティグループ

      エンドポイントの弾性ネットワークインターフェース (ENI) に関連付けるセキュリティグループを選択します。セキュリティグループを使用すると、エンドポイント ENI との間の通信を管理できます。

      ゾーンと VSwitch

      エンドポイントサービスのゾーンを選択し、そのゾーン内の vSwitch を選択します。システムは vSwitch にエンドポイント ENI を自動的に作成します。

    6. [OK] をクリックします。

      生成された PrivateLink エンドポイントを記録して、後で OSS にアクセスします。

      Dingtalk_20240325172953.jpg

  2. PrivateLink エンドポイントを使用して OSS にアクセスします。

    1. 作成した ECS インスタンスに接続します。詳細については、「インスタンスに接続する」をご参照ください。

    2. ossutil または OSS SDK を使用して OSS にアクセスする場合は、PrivateLink エンドポイントを指定します。

      ossutil

      1. ECS インスタンスに ossutil をインストールします。

        詳細については、「ossutil をインストールする」をご参照ください。

      2. OSS にアクセスするには、ossutil コマンドで PrivateLink エンドポイントを指定します。

        次のサンプルコマンドを実行して、examplebucket バケットから examplefile.txt オブジェクトをローカルの /tmp/ フォルダーにダウンロードします。サンプルコマンドでは、-e オプションは PrivateLink エンドポイントを指定し、--addressing-style オプションは OSS へのパススタイルアクセスを指定します。

        ossutil cp oss://examplebucket/examplefile.txt /tmp/ -e ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com --addressing-style  path

        次の出力は、上記のコマンドに対するサンプルレスポンスです。

        Succeed: Total num: 1, size: 11. OK num: 1(download 1 objects).
        
        average speed 0(byte/s)
        
        0.188959(s) elapsed

        このコマンドの詳細については、「オブジェクトをダウンロードする」をご参照ください。

      OSS SDK

      OSS にアクセスするための PrivateLink エンドポイントは、次のプログラミング言語の OSS SDK でのみサポートされています。次のサンプルコードは、PrivateLink エンドポイントを使用して、examplebucket バケットから exampleobject.txt オブジェクトをローカルパスにダウンロードする方法の例を示しています。

      PrivateLink エンドポイントベースの OSS アクセスをサポートする OSS SDK の詳細については、「概要」をご参照ください。

      1. ECS インスタンスに Java、Python、Go、または C++ 環境を構築します。

      2. 次の OSS SDK のいずれかのコードで PrivateLink エンドポイントを指定して、オブジェクトをダウンロードします。

        Java

        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;
        
        public class Demo {
        
            public static void main(String[] args) throws Exception {
                // PrivateLink エンドポイントを指定します。
                String endpoint = "https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com";
                // エンドポイントにマップするリージョンの ID を指定します。例: cn-hangzhou。
                String region = "cn-hangzhou";        
                // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
                EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
                // バケットの名前を指定します。例: examplebucket。
                String bucketName = "examplebucket";
                // オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampleobject.txt。
                String objectName = "exampleobject.txt";
                String pathName = "D:\\examplefile.txt";
        
                // OSSClient インスタンスを作成します。
                // OSS クライアントが使用されなくなったときに関連付けられたリソースを解放するには、shutdown メソッドを呼び出します。
                ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
                // 第 2 レベルドメイン名に基づくアクセスを有効にします。
                clientBuilderConfiguration.setSLDEnabled(true);
                // V4 署名アルゴリズムの使用を明示的に宣言します。
                clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
                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) {
                    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
        
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。これらの認証情報を使用して OSS で操作を実行することは、リスクの高い操作です。API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを使用することをお勧めします。RAM ユーザーを作成するには、RAM コンソールにログインします。
        auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
        # PrivateLink エンドポイントを指定します。
        # バケットの名前を指定します。例: examplebucket。
        # is_path_style を True に設定して、ルートドメインに基づくアクセスを有効にします。
        bucket = oss2.Bucket(auth, 'https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com', 'examplebucket', is_path_style=True)
        
        # オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampleobject.txt。
        # 指定されたパスにオブジェクトをローカルファイルとしてダウンロードします。例: 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 インスタンスを作成します。
        	// PrivateLink エンドポイントを指定します。
        	// 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)
        	}
        
        	// バケットの名前を指定します。例: examplebucket。
        	bucket, err := client.Bucket("examplebucket")
        	if err != nil {
        		fmt.Println("Error:", err)
        		os.Exit(-1)
        	}
        
        	// 指定されたローカルパスにオブジェクトをローカルファイルとしてダウンロードします。パスに同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。パスに同じ名前のファイルが存在しない場合、ダウンロードされたオブジェクトはパスに保存されます。
        	// ダウンロードされたオブジェクトのローカルパスを指定しない場合、ダウンロードされたオブジェクトは、サンプルプログラムが属するプロジェクトのパスに保存されます。
        	// オブジェクトの完全なパスとローカルファイルを指定します。この例では、オブジェクトの完全なパスは exampleobject.txt で、ローカルファイルの完全なパスは D:\\examplefile.txt です。完全なパスにバケット名を含めないでください。
        	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 にアクセスするために使用されるアカウントに関する情報を初期化します。*/
                    
            /* PrivateLink エンドポイントを指定します。*/
            std::string Endpoint = "https://ep-bp1i317e3d65873e****.oss.cn-hangzhou.privatelink.aliyuncs.com";
            /* バケットの名前を指定します。例: examplebucket。*/
            std::string BucketName = "examplebucket";
            /* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampleobject.txt。*/
            std::string ObjectName = "exampleobject.txt";
            /* 指定されたパスに 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 に設定して、第 2 レベルドメインに基づくアクセスを有効にします。*/
            conf.isPathStyle = true;
            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 << "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;
        }