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

Object Storage Service:ミラーリングベースのback-to-origin

最終更新日:Dec 10, 2024

サーバーからすべての既存のデータをObject Storage Service (OSS) バケットに移行した後、ミラーリングベースのback-to-originルールを設定して、サーバーで使用可能であるがバケットに移行されていないデータにリクエスタがアクセスできるようにします。 リクエスタがバケットに存在しないリソースを要求すると、OSSはミラーリングベースのback-to-originルールで指定されたオリジンからリソースを取得しようとします。 リクエストされたリソースがオリジンから取得された場合、OSSはリソースをバケットに格納し、リクエスト元にリソースを返します。

制限事項

  • リージョン

    次のリージョンにあるバケットに対して、ミラーリングベースのback-to-originルールを設定できます。中国 (杭州) 、中国 (上海) 、中国 (青島) 、中国 (北京) 、中国 (張家口) 、中国 (フフホト) 、中国 (ウランカブ) 、中国 (深セン) 、中国 (河源) 、中国 (広州) 、中国 (成都) 、中国 (香港) 、米国 (シリコンバレー) 、米国 (バージニア) 、日本 (東京) 、シンガポール、マレーシア (クアラルンプール) 、インドネシア (ジャカルタ) 、フィリピン (マニラ) 、ドイツ (フランクフルト) 、イギリス (ロンドン) 、アラブ首長国連邦 (ドバイ).

  • ミラーリングベースのback-to-originルールの数

    1つのバケットに最大20個のミラーリングベースのback-to-originルールを設定できます。 ルールは、RuleNumberの値に基づいてリクエストと順次照合されます。 ミラーリングベースのback-to-originルールが一致した場合、後続のルールは無視されます。 OSSは、リクエストがルールで指定された条件を満たすかどうかに基づいて、リクエストがミラーリングベースのback-to-originルールに一致するかどうかを判断します。 OSSは、要求されたオブジェクトがオリジンから取得できるかどうかをチェックしません。

  • QPSとトラフィック

    中国本土のリージョンでは、ミラーリングベースのback-to-originリクエストのデフォルトの最大クエリ /秒 (QPS) とAlibaba Cloudアカウントのデフォルトの最大帯域幅は2,000および2 Gbit/sです。 中国本土以外のリージョンでは、ミラーリングベースのback-to-originリクエストのデフォルトの最大QPSとAlibaba Cloudアカウントのデフォルトの最大帯域幅は1,000と1 Gbit/sです。

    ビジネスでより高いQPSまたは帯域幅が必要な場合は、テクニカルサポート にお問い合わせください。

  • ソースURL

    すべてのソースURLは、RFC3986エンコード仕様に準拠する必要があります。

  • オリジンURL

    オリジンURLを内部ネットワーク上のURLにすることはできません。

  • デフォルトのタイムアウト期間

    デフォルトでは、ミラーリングベースのback-to-originリクエストのタイムアウト時間は10秒です。

シナリオ

ミラーリングベースのback-to-originを使用して、データをOSSにシームレスに移行します。 たとえば、ミラーリングベースのback-to-originを使用して、ビジネスを中断することなく、自己管理オリジンまたは別のクラウドサービスからOSSにビジネスを移行できます。 移行中に、ミラーリングベースのback-to-originルールを使用して、OSSに移行されていないデータを取得できます。 これにより、ビジネスの継続性が確保されます。 ユースケースの詳細については、「webベースのサービスプロバイダーのデータをOSSにシームレスに移行する」をご参照ください。

説明

ミラーリングベースのback-to-originルールでは、追加料金は発生しません。 ただし、ミラーリングベースのback-to-originリクエストでは、API操作呼び出し料金が発生します。 ミラーリングベースのback-to-originリクエストに対しては、他のリクエストに対して課金されるのと同じ方法で課金されます。 詳細については、「API 操作呼び出し料金」をご参照ください。

処理中

次の図は、ミラーリングベースのback-to-originの動作を示しています。

image

Back-to-Origin ルール

  • トリガー条件

    OSSは、GetObject操作に対してHTTPステータスコード404が返された場合にのみ、ミラーリングベースのback-to-originルールに基づいてオリジンからオブジェクトを取得します。

  • 要求されたオブジェクトの命名規則

    OSSがオリジンからオブジェクトを取得するために使用するURLは、http(s):// MirrorURL/ObjectNameの形式です。 ObjectNameは、要求されたオブジェクトの名前を指定します。 たとえば、バケットに設定されたback-to-origin URLが https://aliyun.com で、リクエストされたexample.jpgという名前のオブジェクトがバケットに存在しない場合、OSSは https://aliyun.com/example.jpg からオブジェクトを取得し、そのオブジェクトをexample.jpgとしてOSSに保存します。

  • back-to-originリクエストの失敗

    要求されたオブジェクトがオリジンに存在しない場合、オリジンはHTTPステータスコード404をOSSに返します。 次に、OSSは同じHTTPステータスコードを要求者に返します。 オリジンが200と404以外のHTTPステータスコードを返した場合、ネットワークエラーなどの要因によりback-to-originリクエストは失敗します。 この場合、OSSは424 MirrorFailedエラーコードをリクエスタに返します。

  • オリジンから取得したオブジェクトの更新

    OSSがミラーリングベースのback-to-originを使用してオブジェクトを取得した後、オリジンのオブジェクトが変更されても、取得したオブジェクトは更新されません。

  • オリジンから取得したオブジェクトのメタデータ

    OSSは、オリジンから返された次のHTTPヘッダーをOSSオブジェクトのメタデータとして保存します。

    Content-Type
    Content-Encoding
    Content-Disposition
    Cache-Control
    Expires
    Content-Language
    Access-Control-Allow-Origin
  • HTTPリクエスト

    • OSSに送信されるリクエストに含まれるQueryStringおよびヘッダーは、OSSからオリジンに送信されるリクエストには含まれません。 OSSは、設定されたback-to-originルールに基づいて、情報をオリジンに送信するかどうかを決定します。

    • オリジンがチャンクエンコードされたデータを返した場合、OSSはチャンクエンコードされたデータを返します。

方法

OSSコンソールの使用

OSSコンソールでバケットに複数のback-to-originルールを設定した場合、ルールは、ルールが作成された時刻に基づいて時系列で有効になります。 ルールの右側にある [上] または [下] をクリックすると、ルールの優先順位を変更できます。

3

リクエスタがバケットに存在しないオブジェクトを要求すると、OSSは、設定されたオリジンURLとback-to-origin条件に基づいて、オリジンからオブジェクトを取得しようとします。 たとえば、examplefolderサブディレクトリは、中国 (杭州) リージョンのexamplebucketバケットのルートディレクトリにあります。 要求されたオブジェクトがexamplefolderサブディレクトリに存在しない場合、OSSは https://www.example.com/examplefolderディレクトリを検索し、要求されたオブジェクトをリクエスタに返します。 この目標を達成するには、次の手順を実行してback-To-originルールを設定します。

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

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

  3. 左側のナビゲーションツリーで、データ管理 > ミラーリングベースのBack-to-originを選択します。

  4. ミラーリングベースのBack-to-originページで、ルールの作成をクリックします。

  5. [ルールの作成] パネルで、次の表に示す必要なパラメーターを設定し、他のパラメーターのデフォルト設定を保持します。

    パラメーター

    説明

    移動方法

    [ミラーリング] を選択します。

    条件

    [オブジェクト名プレフィックス] を選択し、パラメーターをexamplefolder/ に設定します。

    説明

    バケットにミラーリングベースのback-to-originルールを1つだけ設定する場合は、Object Name PrefixパラメーターとFile Name Suffixパラメーターを空のままにすることができます。 バケットに複数のミラーリングベースのback-to-originルールを設定する場合は、back-to-originルールを区別するために、異なる名前のプレフィックスまたはサフィックスを指定する必要があります。

    オリジンURL

    最初のボックスでhttpsを選択し、2番目のボックスにwww.example.comを入力し、3番目のボックスを空のままにします。

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

    次の項目は、上記のルールを設定した後のアクセスプロセスについて説明します。

    1. リクエスタは、初めて https://examplebucket.oss-cn-hangzhou.aliyuncs.com/examplefolder/example.txt を要求する。

    2. examplefolder/example.txtオブジェクトがexamplebucketに存在しない場合、OSSは https://www.example.com/examplefolder/example.txt でオリジンからオブジェクトを取得します。

    3. オブジェクトがオリジンから取得された場合、OSSはexample.txtオブジェクトをexamplebucketのexamplefolderディレクトリに書き込み、リクエスト元に返します。 オブジェクトがオリジンから取得されない場合、HTTPステータスコード404がリクエスタに返されます。

上記の手順を使用して、基本的なビジネスシナリオのミラーリングベースのback-to-originルールを設定できます。 特定のシナリオのミラーリングベースのback-originルールの詳細については、「ミラーリングベースのback-to-originの構成例」をご参照ください。

OSS SDKの使用

次のサンプルコードは、一般的なプログラミング言語のOSS SDKを使用して、ミラーリングベースのback-to-originルールを設定する方法の例を示しています。 他のプログラミング言語のOSS SDKを使用してミラーリングベースのback-to-originルールを設定する方法の詳細については、「概要」をご参照ください。

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.RoutingRule;
import com.aliyun.oss.model.SetBucketWebsiteRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Demo {

    public static void main(String[] args) throws Exception {
        // In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint. 
        String endpoint = "https://oss-cn-hangzhou.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 region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
        String region = "cn-hangzhou";

        // Create an OSSClient instance. 
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            SetBucketWebsiteRequest request = new SetBucketWebsiteRequest(bucketName);
            // Specify the operation that you want to perform if the default homepage is specified, the name of the requested object does not end with a forward slash (/), and the object does not exist. 
            //request.setSubDirType(null);
            // Specify whether to redirect the requester to the default homepage in the subdirectory when the subdirectory is accessed. 
            //request.setSupportSubDir(false);

            List<RoutingRule> routingRules = new ArrayList<RoutingRule>();

            RoutingRule rule = new RoutingRule();
            rule.setNumber(1);
            // Specify the prefix that is contained in the object names. Only the objects whose names contain the specified prefix match the rule. 
            rule.getCondition().setKeyPrefixEquals("examplebucket");
            // Specify the HTTP status code. The rule is matched only when the specified object is accessed and HTTP status code 404 is returned. 
            rule.getCondition().setHttpErrorCodeReturnedEquals(404);
            // Specify the redirection type. 
            rule.getRedirect().setRedirectType(RoutingRule.RedirectType.Mirror);
            // Specify the URL of the origin for the mirroring-based back-to-origin rule. Example: https://www.example.com/. 
            rule.getRedirect().setMirrorURL("<yourMirrorURL>");
            //rule.getRedirect().setMirrorRole("AliyunOSSMirrorDefaultRole");
            // Specify whether to include the request parameters when the redirection rule or the mirroring-based back-to-origin rule is executed. 
            rule.getRedirect().setPassQueryString(true);
            // This parameter is used in the same manner as the PassQueryString parameter and is assigned a higher priority level than the PassQueryString parameter. This parameter takes effect only when you set the RedirectType parameter to Mirror. 
            rule.getRedirect().setMirrorPassQueryString(true);
            // Specify the HTTP status code in the response when the request is redirected. This parameter takes effect only when you set the RedirectType parameter to External or AliCDN. 
            //rule.getRedirect().setHttpRedirectCode(302);
            // Specify the domain name that you want to use for redirection. The domain name must comply with the naming conventions for domain names. 
            //rule.getRedirect().setHostName("oss.aliyuncs.com");
            // Specify the protocol that you want to use for redirection. This parameter takes effect only when you set the RedirectType parameter to External or AliCDN. 
            //rule.getRedirect().setProtocol(RoutingRule.Protocol.Https);
            // Specify the string that you want to use to replace the object name when the request is redirected. You can set this parameter to a variable. 
            //rule.getRedirect().setReplaceKeyWith("${key}.jpg");
            // If you set this parameter to true, the prefix of the object name is replaced with the value specified by the ReplaceKeyPrefixWith parameter. 
            rule.getRedirect().setEnableReplacePrefix(true);
            // Specify the string that you want to use to replace the prefix of the object name during redirection. 
            rule.getRedirect().setReplaceKeyPrefixWith("examplebucket");
            // Specify whether to check the MD5 hash of the response body that is returned by the origin. This parameter takes effect only when you set the RedirectType parameter to Mirror. 
            rule.getRedirect().setMirrorCheckMd5(true);

            RoutingRule.MirrorHeaders mirrorHeaders = new RoutingRule.MirrorHeaders();
            // Specify whether to pass through all request headers except the following header to the origin. This parameter takes effect only when you set the RedirectType parameter to Mirror. 
            mirrorHeaders.setPassAll(false);
            List passes = new ArrayList<String>();
            passes.add("cache-control");
            // Specify the headers that you want to pass through to the origin. This parameter takes effect only when you set the RedirectType parameter to Mirror. 
            mirrorHeaders.setPass(passes);
            List removes = new ArrayList<String>();
            removes.add("content-type");
            // Specify the headers that you do not want to pass through to the origin. This parameter takes effect only when you set the RedirectType parameter to Mirror. 
            mirrorHeaders.setRemove(removes);
            List sets = new ArrayList<Map<String, String>>();
            Map header1 = new HashMap<String, String>();
            header1.put("Key", "key1");
            header1.put("Value", "value1");
            Map header2 = new HashMap<String, String>();
            header2.put("Key", "key2");
            header2.put("Value", "value2");
            sets.add(header1);
            sets.add(header2);
            // Specify the headers that you want to pass through to the origin. The specified headers are passed through to the origin regardless of whether the headers are included in the request. 
            mirrorHeaders.setSet(sets);
            // Specify the headers that you want to include in the response when the requested object is obtained from the origin. This parameter takes effect only when you set the RedirectType parameter to Mirror. 
            rule.getRedirect().setMirrorHeaders(mirrorHeaders);

            routingRules.add(rule);
            request.setRoutingRules(routingRules);
            ossClient.setBucketWebsite(request);
        } 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();
            }
        }
    }
}
#-*-coding:utf-8-*-
import oss2
from oss2.models import BucketWebsite, MirrorHeadersSet, RedirectMirrorHeaders, Redirect, RoutingRule, \
    REDIRECT_TYPE_MIRROR, Condition
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 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. 
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the region in which the bucket is located. Example: cn-hangzhou This parameter is required if you use the V4 signature algorithm.
region = "cn-hangzhou"

# Replace examplebucket with the name of the bucket. 
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

# Enable static website hosting, set the default homepage to index.html, and then set the default 404 page to error.html. 
index_file = 'index.html'
error_file = 'error.html'
# Specify the matching conditions. 
condition1 = Condition(key_prefix_equals='examplefolder',
                       http_err_code_return_equals=404)

# Specify the headers that you want to include in the response when the requested object is obtained from the origin. 
mirror_headers_set_1 = MirrorHeadersSet("myheader-key5", "myheader-value5")
mirror_headers_set_2 = MirrorHeadersSet("myheader-key6", "myheader-value6")
set_list = [mirror_headers_set_1, mirror_headers_set_2]
pass_list = ['myheader-key1', 'myheader-key2']
remove_list = ['myheader-key3', 'myheader-key4']
mirror_header = RedirectMirrorHeaders(pass_all=True, pass_list=pass_list, remove_list=remove_list, set_list=set_list)
# Specify the operation that you want to perform when the rule is matched. 
redirect1 = Redirect(redirect_type=REDIRECT_TYPE_MIRROR, mirror_url='https://www.example.com/',
                     mirror_pass_query_string=True, mirror_follow_redirect=True, mirror_check_md5=True,
                     mirror_headers=mirror_header)

rule1 = RoutingRule(rule_num=1, condition=condition1, redirect=redirect1)
website_set = BucketWebsite(index_file, error_file, [rule1])

# Configure the mirroring-based back-to-origin rule. 
bucket.put_bucket_website(website_set)
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 endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. 
	// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Specify the version of the signature algorithm.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Specify the name of the bucket. Example: examplebucket. 
	bucketName := "examplebucket"

	var indexWebsite = "myindex.html"
	var errorWebsite = "myerror.html"

	btrue := true
	bfalse := false
	// Set the back-to-origin type to mirroring-based back-to-origin. 
	ruleOk := oss.RoutingRule{
		RuleNumber: 1,
		Condition: oss.Condition{
			KeyPrefixEquals: "",
			// Set the back-to-origin condition to HTTP status code 404. 
			HTTPErrorCodeReturnedEquals: 404,
		},
		Redirect: oss.Redirect{
			RedirectType: "Mirror",
			// PassQueryString: &btrue,
			// Specify the back-to-origin URL for a mirroring-based back-to-origin rule. 
			MirrorURL: "http://www.test.com/",
			// MirrorPassQueryString:&btrue,
			// MirrorFollowRedirect:&bfalse,
			// MirrorCheckMd5:&bfalse,
			MirrorHeaders: oss.MirrorHeaders{
				// PassAll:&bfalse,
				// Transmit specific HTTP headers. 
				Pass: []string{"myheader-key1", "myheader-key2"},
				// Prohibit the transmission of specific HTTP headers. 
				Remove: []string{"myheader-key3", "myheader-key4"},
				Set: []oss.MirrorHeaderSet{
					{
						Key:   "myheader-key5",
						Value: "myheader-value5",
					},
				},
			},
		},
	}

	// Set the back-to-origin type to redirection-based back-to-origin. 
	ruleArrOk := []oss.RoutingRule{
		{
			RuleNumber: 2,
			Condition: oss.Condition{
				// Set the back-to-origin condition to HTTP status code 404 and the prefix in object names to abc/. 
				KeyPrefixEquals:             "abc/",
				HTTPErrorCodeReturnedEquals: 404,
				IncludeHeader: []oss.IncludeHeader{
					{
						Key:    "host",
						Equals: "test.oss-cn-beijing-internal.aliyuncs.com",
					},
				},
			},
			Redirect: oss.Redirect{
				RedirectType:     "AliCDN",
				Protocol:         "http",
				HostName:         "www.test.com",
				PassQueryString:  &bfalse,
				ReplaceKeyWith:   "prefix/${key}.suffix",
				HttpRedirectCode: 301,
			},
		},
		// Set the back-to-origin type to mirroring-based back-to-origin. 
		{
			RuleNumber: 3,
			Condition: oss.Condition{
				KeyPrefixEquals:             "",
				HTTPErrorCodeReturnedEquals: 404,
			},
			Redirect: oss.Redirect{
				RedirectType:          "Mirror",
				PassQueryString:       &btrue,
				MirrorURL:             "http://www.test.com/",
				MirrorPassQueryString: &btrue,
				MirrorFollowRedirect:  &bfalse,
				MirrorCheckMd5:        &bfalse,
				MirrorHeaders: oss.MirrorHeaders{
					PassAll: &btrue,
					Pass:    []string{"myheader-key1", "myheader-key2"},
					Remove:  []string{"myheader-key3", "myheader-key4"},
					Set: []oss.MirrorHeaderSet{
						{
							Key:   "myheader-key5",
							Value: "myheader-value5",
						},
					},
				},
			},
		},
	}

	wxmlOne := oss.WebsiteXML{
		IndexDocument: oss.IndexDocument{
			Suffix: indexWebsite,
		},
		ErrorDocument: oss.ErrorDocument{
			Key: errorWebsite,
		},
	}
	wxmlOne.RoutingRules = append(wxmlOne.RoutingRules, ruleOk)
	wxmlOne.RoutingRules = append(wxmlOne.RoutingRules, ruleArrOk...)
	err = client.SetBucketWebsiteDetail(bucketName, wxmlOne)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}
    

ossutilの使用

ossutilを使用して、ミラーリングベースのback-to-originルールを設定できます。 詳細については、「Webサイト関連の設定の追加または変更」をご参照ください。

OSS APIの使用

ビジネスで高度なカスタマイズが必要な場合は、RESTful APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。 詳細については、「PutBucketWebsite」をご参照ください。

関連ドキュメント

リアルタイムログクエリ機能を使用して、back-to-originを使用してバケットにアップロードされたオブジェクトをクエリできます。 詳細については、「リアルタイムログクエリ」をご参照ください。