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

Object Storage Service:シンボリックリンク

最終更新日:Sep 11, 2026

シンボリックリンクは、バケット内で頻繁に使用されるオブジェクトにアクセスするための便利な方法です。作成後、Windows のショートカットのようにシンボリックリンクを使用して、ターゲットオブジェクトにアクセスできます。

注意事項

  • 標準または低頻度アクセスのオブジェクトには、そのシンボリックリンクを介して直接アクセスできます。

  • アーカイブ、コールドアーカイブ、またはディープコールドアーカイブのオブジェクトにシンボリックリンクを介してアクセスするには、まずオブジェクトを復元する必要があります。詳細については、「オブジェクトの復元」をご参照ください。

  • シンボリックリンクはターゲットオブジェクトのコンテンツではなく、パスを格納します。したがって、シンボリックリンクのストレージ使用量は、ターゲットオブジェクトの実際のサイズではなく、ターゲットオブジェクトのパスの長さに依存します。たとえば、image.jpg という名前の 1 MB のオブジェクトを指すシンボリックリンクの場合、シンボリックリンク自体が使用するストレージは約 0.009 KB のみです。

  • シンボリックリンクへのアクセスは、最小権限の原則に従います。バケットポリシーまたは RAM ポリシーが関係するシナリオでは、ユーザーはシンボリックリンクとそのターゲットオブジェクトの両方にアクセスする権限を持っている必要があります。いずれかの権限がない場合、アクセスは拒否されます。アクセス制御リスト (ACL) が関係するシナリオでは、シンボリックリンクがプライベートの場合、ターゲットオブジェクトがパブリック読み取りの場合でも、ユーザーはそれを使用してターゲットオブジェクトにアクセスすることはできません。同様に、シンボリックリンクがパブリック読み取りで、ターゲットオブジェクトがプライベートの場合もアクセスは拒否されます。

  • シンボリックリンクはサーバー側の暗号化をサポートしていません。

操作手順

Object Storage Service (OSS) コンソール

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

  2. 左側のナビゲーションウィンドウで、バケット をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。

  3. 左側のナビゲーションバーで、オブジェクト管理を選択します

    [オブジェクト]。

  4. ターゲットオブジェクトの **[操作]** 列で、more > シンボリックリンクの設定 を選択します。

  5. シンボリックリンクの設定 パネルで、ソフトリンクファイル を設定し、OK をクリックします。

    シンボリックリンクに指定する名前は、コンソールに表示される命名規則に従う必要があります。現在のオブジェクトが /test/ ディレクトリにあると仮定します。

    • [絶対パス] を選択し、シンボリックリンクに t1-symlink と名前を付けた場合、シンボリックリンクのパスは /t1-symlink になります。

    • [相対パス] を選択してシンボリックリンクを t2-symlink と命名した場合、シンボリックリンクのパスは /test/t2-symlink になります。

    重要

    シンボリックリンクのファイル名に拡張子が含まれていない場合 (たとえば、オブジェクト myphoto.jpg のシンボリックリンクの名前が myphoto の場合)、コンソールまたは URL からアクセスすることで、シンボリックリンクをプレビューできます。ツールまたはコンソールを使用してシンボリックリンクをダウンロードすると、ダウンロードされたファイルは拡張子がないため、不明な種類のファイルと見なされ、直接開くことはできません。ファイルを開くには、正しい拡張子を追加してください。

ossbrowser

ossbrowser 2.0 をインストールし、それにログインしていることを確認してください。

  1. ターゲットバケットの名前をクリックし、ターゲットオブジェクトを見つけます。

  2. 対象のオブジェクトの右側にある image アイコンをクリックして、シンボリックリンクの設定 をクリックします。

  3. シンボリックリンクのフルパスをファイル名を含めて入力し、OK をクリックします。 たとえば、ターゲットオブジェクトに対して exampledir/ ディレクトリに symlink という名前のシンボリックリンクを作成する場合、exampledir/symlink と入力します。

Alibaba Cloud SDK

次のコードは、一般的なプログラミング言語向けの Alibaba Cloud SDK を使用してシンボリックリンクを作成する方法を示しています。他の言語の SDK の使用方法については、「SDK 概要」をご参照ください。

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {
    public static void main(String[] args) throws Exception {
        // 例として中国 (杭州) リージョンを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。このコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します。例:examplebucket。
        String bucketName = "examplebucket";
        // シンボリックリンクの名前を指定します。
        String symLink = "yourSymLink";
        // シンボリックリンクが指すオブジェクトの名前を指定します。
        String destinationObjectName = "yourDestinationObjectName";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // オブジェクトのメタデータを作成します。
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType("text/plain");
            // カスタムメタデータプロパティの値を property-value に設定します。
            metadata.addUserMetadata("property", "property-value");

            // シンボリックリンクの作成時に、同名のオブジェクトを上書きするかどうかを指定します。
            // metadata.setHeader("x-oss-forbid-overwrite", "true");
            // オブジェクトのアクセス制御リスト (ACL) を指定します。
            // metadata.setHeader(OSSHeaders.OSS_OBJECT_ACL, CannedAccessControlList.Default);
            // オブジェクトのストレージクラスを指定します。
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);

            // CreateSymlinkRequest を作成します。
            CreateSymlinkRequest createSymlinkRequest = new CreateSymlinkRequest(bucketName, symLink, destinationObjectName);

            // メタデータを設定します。
            createSymlinkRequest.setMetadata(metadata);

            // シンボリックリンクを作成します。
            ossClient.createSymlink(createSymlinkRequest);

        } 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();
            }
        }
    }
}            
const OSS = require('ali-oss')

const client = new OSS({
  // region をバケットが配置されているリージョンに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、region を oss-cn-hangzhou に設定します。
  region: 'yourRegion',
  // 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // バケット名を指定します。
  bucket: 'examplebucket',
});

const headers = {
   // オブジェクトのストレージクラスを指定します。
   'x-oss-storage-class':'Standard', 
   // オブジェクトのアクセス権限を指定します。
   'x-oss-object-acl':'private',
   // シンボリックリンクと同じ名前のオブジェクトを上書きするかどうかを指定します。 true の値は、上書きが禁止されていることを示します。
   'x-oss-forbid-overwrite': 'true '
};

async function put () {
  try {
    // シンボリックリンクの名前を symlinkobject.txt に、ターゲットオブジェクトの名前を exampleobject.txt に設定します。 
    const result = await client.putSymlink('symlinkobject.txt', 'exampleobject.txt'
    // ,{ headers }
    );
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

put();
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <title>Document</title>
</head>

<body>
  <button id='upload'>Upload</button>
  <button id='symlink'>Create Symbolic Link</button>  
  <!--SDK ファイルをインポートします。-->
  <script type="text/javascript" src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script>
  <script type="text/javascript">
    const client = new OSS({
       // バケットが配置されているリージョンに region を設定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、region を oss-cn-hangzhou に設定します。
       region: 'yourRegion',
       authorizationV4: true,
       // STS から取得した一時的な AccessKey ID と AccessKey Secret。
       accessKeyId: 'yourAccessKeyId',
       accessKeySecret: 'yourAccessKeySecret',
       // STS から取得したセキュリティトークン (SecurityToken)。
       stsToken: 'yourSecurityToken',
       // バケット名を指定します。例:examplebucket。
       bucket: "examplebucket",
     });

    const upload = document.getElementById('upload')
    const symlink = document.getElementById('symlink')
    const getSymlink = document.getElementById("getSymlink")

    // アップロードするファイルの内容を指定します。
    const file = new Blob(['examplecontent'])
    // バケット内のオブジェクトの名前を指定します。
    const fileName = 'exampleobject.txt'

    // ファイルをアップロードします。
    upload.addEventListener('click', () => {
      client.put(fileName, file).then(r => console.log(r))
    })
    
    // symlink.txt という名前のシンボリックリンクを作成します。
    symlink.addEventListener('click', () => {
      client.putSymlink('symlink.txt', fileName).then(r => console.log(r))
    })

  </script>
</body>

</html>
using Aliyun.OSS;
using System.Text;
using Aliyun.OSS.Common;

// yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス認証情報を取得します。 このコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。 例: examplebucket
var bucketName = "examplebucket";
var targetObjectName = "yourTargetObjectName";
var symlinkObjectName = "yourSymlinkObjectName";
var objectContent = "More than just cloud.";
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";

// ClientConfiguration インスタンスを作成し、必要に応じてデフォルトパラメーターを変更します。
var conf = new ClientConfiguration();

// 署名バージョン4を使用します。
conf.SignatureVersion = SignatureVersion.V4;

// OssClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    // ターゲットオブジェクトをアップロードします。
    byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
    MemoryStream requestContent = new MemoryStream(binaryData);
    client.PutObject(bucketName, targetObjectName, requestContent);
    // シンボリックリンクを作成します。
    client.CreateSymlink(bucketName, symlinkObjectName, targetObjectName);
    // シンボリックリンクが指すオブジェクトの名前を取得します。
    var ossSymlink = client.GetSymlink(bucketName, symlinkObjectName);
    Console.WriteLine("Target object is {0}", ossSymlink.Target);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}
// リクエストを構築します。
PutSymlinkRequest putSymlink = new PutSymlinkRequest();
// バケット名を指定します。
putSymlink.setBucketName("yourBucketName");
// シンボリックリンク名を指定します。
putSymlink.setObjectKey("yourSymLink");
// シンボリックリンクのターゲットオブジェクト名を指定します。
putSymlink.setTargetObjectName("yourTargetObjectName");

ObjectMetadata metadata = new ObjectMetadata();
// 同じ名前のオブジェクトの上書きを禁止するかどうかを指定します。 この例では、このパラメーターは true に設定され、上書きが禁止されます。
//metadata.setHeader("x-oss-forbid-overwrite", "true");
// オブジェクトのアクセス権限を指定します。 この例では、アクセス権限は非公開に設定されています。
//metadata.setHeader("x-oss-object-acl", "private");
// オブジェクトのストレージクラスを指定します。 この例では、ストレージクラスは標準ストレージに設定されています。
//metadata.setHeader("x-oss-storage-class", "Standard");
putSymlink.setMetadata(metadata);

OSSAsyncTask task = oss.asyncPutSymlink(putSymlink, new OSSCompletedCallback<PutSymlinkRequest, PutSymlinkResult>() {
    @Override
    public void onSuccess(PutSymlinkRequest request, PutSymlinkResult result) {
        Log.d("PutSymlink", "PutSymlink success");
    }

    @Override
    public void onFailure(PutSymlinkRequest request, ClientException clientException,
                          ServiceException serviceException) {
        // リクエストエラー。
        if (clientException != null) {
            // クライアント側の例外 (ネットワーク例外など)。
            clientException.printStackTrace();
        }
        if (serviceException != null) {
            // サーバー側の例外。
            Log.e("ErrorCode", serviceException.getErrorCode());
            Log.e("RequestId", serviceException.getRequestId());
            Log.e("HostId", serviceException.getHostId());
            Log.e("RawMessage", serviceException.getRawMessage());
        }
    }
});
task.waitUntilFinished();
OSSPutSymlinkRequest *request = [OSSPutSymlinkRequest new];
// バケット名を指定します。例: examplebucket。
request.bucketName = @"examplebucket";
// シンボリックリンクの名前を指定します。
request.objectKey = @"examplesymlink";
// シンボリックリンクが指すオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。
request.targetObjectName = @"exampleobject.txt";

OSSTask *putSymlinkTask = [client putSymlink:request];
[putSymlinkTask continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
    if (!task.error) {
        NSLog(@"シンボリックリンクの作成に成功しました");
    } else {
        NSLog(@"シンボリックリンクの作成に失敗しました。エラー: %@", task.error);
    }
    return nil;
}];
// 同期ブロッキングを実装して、タスクが完了するのを待ちます。
// [putSymlinkTask waitUntilFinished];
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
            
    /* バケットが配置されているリージョンのエンドポイントに yourEndpoint を設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* バケットが配置されているリージョンに yourRegion を設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 */
    std::string Region = "yourRegion";
    /* バケット名を指定します。 例:examplebucket */
    std::string BucketName = "examplebucket";
    /* オブジェクトの完全なパスを指定します。 例:exampledir/exampleobject.txt。 完全なパスにバケット名を含めることはできません。 */
    std::string ObjectName = "exampledir/exampleobject.txt";
    /* シンボリックリンクの完全なパスを指定します。 例:shortcut/myobject.txt。 */
    std::string LinkName = "shortcut/myobject.txt";

    /* ネットワークリソースを初期化します。 */
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);



    /* HTTP ヘッダーを設定します。 */
    auto meta = ObjectMetaData();
    meta.setContentType("text/plain");

    /* カスタムオブジェクトのメタデータを設定します。 */
    meta.UserMetaData()["meta"] = "meta-value";

    /* シンボリックリンクを作成します。 */
    CreateSymlinkRequest request(BucketName, ObjectName, meta);
    request.SetSymlinkTarget(LinkName);
    auto outcome = client.CreateSymlink(request);

    if (!outcome.isSuccess()) {
        /* 例外を処理します。 */
        std::cout << "CreateSymlink fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークリソースを解放します。 */
    ShutdownSdk();
    return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに置き換えます。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
const char *endpoint = "yourEndpoint";
/* バケット名を指定します。 例: examplebucket */
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。 例: exampledir/exampleobject.txt */
const char *object_name = "exampledir/exampleobject.txt";
/* シンボリックリンクの完全なパスを指定します。 */
const char *link_object_name = "yourLinkObjectName";
/* yourRegion を、バケットが配置されているリージョンの ID に置き換えます。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョン ID を cn-hangzhou に設定します。 */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* char* 文字列で aos_string_t 型を初期化します。 */
    aos_str_set(&options->config->endpoint, endpoint);
    /* 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
    aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
    aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
    // 次の 2 つのパラメーターも設定する必要があります。
    aos_str_set(&options->config->region, region);
    options->config->signature_version = 4;
    /* CNAME ドメイン名を使用するかどうかを指定します。 値 0 は、CNAME ドメイン名が使用されないことを示します。 */
    options->config->is_cname = 0;
    /* タイムアウト期間などのネットワークパラメーターを設定します。 */
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
    /* プログラムのエントリポイントで aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリなどのグローバルリソースを初期化します。 */
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* メモリ管理のためにメモリプールを作成します。 これは apr_pool_t と同等です。 実装コードは apr ライブラリにあります。 */
    aos_pool_t *pool;
    /* メモリプールを作成します。 2 番目のパラメーターは NULL で、新しいメモリプールが他のメモリプールから継承しないことを示します。 */
    aos_pool_create(&pool, NULL);
    /* オプションを作成して初期化します。 オプションには、エンドポイント、access_key_id、access_key_secret、is_cname、curl などのグローバル構成が含まれます。 */
    oss_request_options_t *oss_client_options;
    /* メモリプール内のオプションにメモリを割り当てます。 */
    oss_client_options = oss_request_options_create(pool);
    /* クライアントオプション oss_client_options を初期化します。 */
    init_options(oss_client_options);
    /* パラメーターを初期化します。 */
    aos_string_t bucket;
    aos_string_t object;
    aos_string_t sym_object;
    aos_table_t *resp_headers = NULL; 
    aos_status_t *resp_status = NULL; 
    aos_str_set(&bucket, bucket_name);
    aos_str_set(&object, object_name);
    aos_str_set(&sym_object, link_object_name);
    resp_status = oss_put_symlink(oss_client_options, &bucket, &sym_object, &object, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        printf("put symlink succeeded\n");
    } else {
        printf("put symlink failed\n");      
    }
    /* メモリプールをリリースします。 これにより、リクエスト中にリソースに割り当てられたメモリが解放されます。 */
    aos_pool_destroy(pool);
    /* 以前に割り当てられたグローバルリソースをリリースします。 */
    aos_http_io_deinitialize();
    return 0;
}

ossutil

ossutil を使用してシンボリックリンクを作成できます。ossutil のインストール方法の詳細については、「ossutil のインストール」をご参照ください。

次のコマンドは、ターゲットオブジェクト targetobject を指す examplelink という名前のシンボリックリンクを作成します。

ossutil api put-symlink --bucket examplebucket --key examplelink --symlink-target targetobject

このコマンドの詳細については、「put-symlink」をご参照ください。

関連 API

高度なカスタマイズを行うには、REST API リクエストを直接作成できます。この場合、コードで署名を手動で計算する必要があります。詳細については、「PutSymlink」をご参照ください。

よくある質問

プライベートオブジェクトのシンボリックリンクを作成できますか。

シンボリックリンクの作成は、ターゲットオブジェクトの読み取りおよび書き込み権限とは無関係です。bucket-owner-full-control、 public-read、 public-read-write など、任意のアクセス制御リスト (ACL) が設定されたオブジェクトに対してシンボリックリンクを作成できます。

オブジェクトがシンボリックリンクであるかどうかを判断するにはどうすればよいですか。

HeadObject API または GetObject API を呼び出して、レスポンスを確認できます。

オブジェクトがシンボリックリンクの場合、レスポンスにはターゲットオブジェクトのコンテンツが含まれます。レスポンス内の Content-Length、 ETag、および Content-Md5 ヘッダーは、ターゲットオブジェクトのメタデータです。

シンボリックリンクを削除すると、ターゲットオブジェクトも削除されますか。

いいえ。シンボリックリンクを削除してもリンク自体が削除されるだけで、ターゲットオブジェクトには影響しません。