在存量數據遷移完成后,您可以配置鏡像回源,以確保用戶可以訪問到尚未遷移至OSS的增量數據,以避免對業務的影響。配置鏡像回源后,當請求者訪問Bucket中不存在的文件(Object)時,OSS會根據回源規則指定的源站獲取該文件。OSS獲取到目標文件后,會將文件返回給請求者并保存到Bucket中。
使用限制
支持地域
華東1(杭州)、華東2(上海)、華北1(青島)、華北2(北京)、華北 3(張家口)、華北5(呼和浩特)、華北6(烏蘭察布)、華南1(深圳)、華南2(河源)、華南3(廣州)、西南1(成都)、中國香港、美國(硅谷)、美國(弗吉尼亞)、日本(東京)、新加坡、澳大利亞(悉尼)關停中、馬來西亞(吉隆坡)、印度尼西亞(雅加達)、菲律賓(馬尼拉)、德國(法蘭克福)、英國(倫敦)、阿聯酋(迪拜)地域支持配置鏡像回源。
規則數量
回源規則最多配置20條,按RuleNumber的先后順序依次匹配。如果命中當前規則,則后續規則不再匹配。規則未命中表示沒有匹配回源條件,與回源后是否成功獲取目標文件無關。
QPS和流量限制
單個阿里云賬號在中國內地各地域默認QPS為2000、流量為2 Gbit/s;非中國內地各地域默認QPS為1000、流量為1 Gbit/s。
如果您的業務有更大的QPS或者流量需求,請聯系技術支持。
回源地址
回源地址不支持內網地址。
默認超時時間
鏡像回源默認超時時間為10秒。
使用場景
鏡像回源主要用于數據無縫遷移到OSS的場景。例如某服務已經在自己建立的源站或者在其他云產品上運行。現因業務發展,需要將數據遷移到OSS上,但是又不能停止服務,此時可以在遷移數據的同時,使用鏡像回源功能保證業務的正常進行。關于使用案例的更多信息,請參見互聯網公司業務無縫遷移至阿里云OSS。
OSS鏡像回源不產生額外的費用,但是這個請求本身需照常收費。計費規則與非鏡像回源請求一樣收費。更多信息,請參見請求費用。
回源流程
鏡像回源具體流程如下圖所示。
回源規則
回源規則觸發條件
只有當GetObject本應該返回404的情況下,OSS才會執行鏡像回源,向源站請求文件。
回源文件命名規則
OSS向源站請求的URL為
http(s)://MirrorURL/ObjectName
,回源到OSS的文件名為ObjectName。例如某Bucket設置的回源地址為https://aliyun.com
,某用戶請求的文件example.jpg不在該Bucket中。則OSS會通過https://aliyun.com/example.jpg
獲取文件,存儲到OSS的文件名為example.jpg。回源請求失敗返回規則
如果鏡像源也不存在此文件,即鏡像源返回給OSS的HTTP狀態碼為404,那么OSS也會返回404給用戶。如果是其他非200的狀態碼(包括因為網絡原因等獲取不到文件的錯誤情況),OSS將返回
424 MirrorFailed
給用戶。回源文件更新規則
若某個文件已經通過鏡像回源到OSS,源站的源文件發生了變化,OSS不會更新該文件。
回源文件元數據
OSS會將源站返回的以下HTTP頭存儲為OSS文件的元數據:
Content-Type Content-Encoding Content-Disposition Cache-Control Expires Content-Language Access-Control-Allow-Origin
HTTP請求規則
傳給OSS的Header信息以及QueryString信息默認不會傳遞給源站,是否會傳遞給源站取決于回源規則中的配置。
如果源站是chunked編碼返回,則OSS返回給用戶的也是chunked編碼。
操作步驟
使用OSS控制臺
通過控制臺配置多條回源規則時,默認按規則創建時間的先后順序依次匹配。如果您希望自定義規則匹配順序,請通過規則右側的上移或下移操作來實現。
當請求者訪問目標Bucket中不存在的文件時,可以通過指定回源條件和回源地址,從源站中獲取目標文件。例如您在華東1(杭州)有名為examplebucket的Bucket,您希望請求者訪問Bucket根目錄下examplefolder目錄中不存在的文件時,可以從https://www.example.com/
站點的examplefolder目錄獲取目標文件。配置步驟如下:
登錄OSS管理控制臺。
單擊Bucket 列表,然后單擊目標Bucket名稱。
在左側導航欄,選擇 。
在鏡像回源頁面,單擊創建規則。
在創建規則面板,按以下說明配置必要參數,其他參數保留默認配置。
參數
配置
回源類型
選中鏡像。
回源條件
選中文件名前綴,并設置為examplefolder/。
說明配置單條回源規則時文件名前綴和后綴可選填;配置多條回源規則時,必須設置不同的文件名前綴或后綴區分不同的回源規則。
回源地址
第一列設置為https,第二列設置為www.example.com,第三列設置為空。
單擊確定。
規則配置完成后的訪問流程如下:
請求者首次訪問
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/examplefolder/example.txt
。如果examplebucket中不存在examplefolder/example.txt文件,則OSS向
https://www.example.com/examplefolder/example.txt
發起請求。如果獲取到目標文件,OSS將example.txt存入examplebucket的examplefolder目錄,并將文件返回給請求者;如果未獲取到文件,則返回404錯誤給請求者。
以上配置步驟僅滿足鏡像回源的基礎應用場景,如果您需要配置其他鏡像回源規則以滿足特定的應用場景時,請參見鏡像回源配置示例。
使用阿里云SDK
以下僅列舉常見SDK的配置鏡像回源規則的代碼示例。關于其他SDK的配置鏡像回源規則代碼示例,請參見SDK簡介。
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 {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
SetBucketWebsiteRequest request = new SetBucketWebsiteRequest(bucketName);
// 設置默認主頁后,訪問以非正斜線(/)結尾的Object,且該Object不存在時的行為。
//request.setSubDirType(null);
// 指定訪問子目錄時,是否支持轉到子目錄下的默認主頁。
//request.setSupportSubDir(false);
List<RoutingRule> routingRules = new ArrayList<RoutingRule>();
RoutingRule rule = new RoutingRule();
rule.setNumber(1);
// 只有匹配此前綴的Object才能匹配此規則。
rule.getCondition().setKeyPrefixEquals("examplebucket");
// 訪問指定Object時,返回status 404才能匹配此規則。
rule.getCondition().setHttpErrorCodeReturnedEquals(404);
// 指定跳轉的類型。
rule.getRedirect().setRedirectType(RoutingRule.RedirectType.Mirror);
// 指定鏡像回源的源站地址。例如https://www.example.com/。
rule.getRedirect().setMirrorURL("<yourMirrorURL>");
//rule.getRedirect().setMirrorRole("AliyunOSSMirrorDefaultRole");
// 指定執行跳轉或者鏡像回源規則時,是否攜帶請求參數。
rule.getRedirect().setPassQueryString(true);
// 與PassQueryString作用相同,優先級高于PassQueryString。只有設置RedirectType為Mirror時生效。
rule.getRedirect().setMirrorPassQueryString(true);
// 指定跳轉時返回的狀態碼。只有設置RedirectType為External或者AliCDN時生效。
//rule.getRedirect().setHttpRedirectCode(302);
// 指定跳轉時的域名,域名需符合域名規范。
//rule.getRedirect().setHostName("oss.aliyuncs.com");
// 指定跳轉時的協議。只有設置RedirectType為External或者AliCDN時才生效。
//rule.getRedirect().setProtocol(RoutingRule.Protocol.Https);
// Redirect時Object名稱將替換成ReplaceKeyWith指定的值,ReplaceKeyWith支持設置變量。
//rule.getRedirect().setReplaceKeyWith("${key}.jpg");
// 如果設置此字段為true,則Object的前綴將被替換為ReplaceKeyPrefixWith指定的值。
rule.getRedirect().setEnableReplacePrefix(true);
// Redirect時Object名稱的前綴將替換成該值。
rule.getRedirect().setReplaceKeyPrefixWith("examplebucket");
// 是否檢查回源body的MD5。只有設置RedirectType為Mirror時生效。
rule.getRedirect().setMirrorCheckMd5(true);
RoutingRule.MirrorHeaders mirrorHeaders = new RoutingRule.MirrorHeaders();
// 是否透傳除以下Header之外的其他Header到源站。只有設置RedirectType為Mirror時生效。
mirrorHeaders.setPassAll(false);
List passes = new ArrayList<String>();
passes.add("cache-control");
// 透傳指定的Header到源站。只有設置RedirectType為Mirror時生效。
mirrorHeaders.setPass(passes);
List removes = new ArrayList<String>();
removes.add("content-type");
// 禁止透傳指定的Header到源站。只有設置RedirectType為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);
// 設置傳到源站的Header。不管請求中是否攜帶這些指定的Header,回源時都會設置這些Header。
mirrorHeaders.setSet(sets);
// 指定回源時攜帶的Header。只有設置RedirectType為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
# 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Endpoint以華東1(杭州)為例,其他Region請按實際情況填寫。
# 填寫Bucket名稱,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 開啟靜態網站托管模式,并將默認首頁設置為index.html,默認404頁設置為error.html。
index_file = 'index.html'
error_file = 'error.html'
# 設置匹配的條件。
condition1 = Condition(key_prefix_equals='examplefolder',
http_err_code_return_equals=404)
# 指定鏡像回源時攜帶的Header。
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)
# 指定匹配此規則后執行的動作。
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])
# 設置鏡像回源。
bucket.put_bucket_website(website_set)
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
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實例。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填寫Bucket名稱,例如examplebucket。
bucketName := "examplebucket"
var indexWebsite = "myindex.html"
var errorWebsite = "myerror.html"
btrue := true
bfalse := false
// 指定回源類型為鏡像。
ruleOk := oss.RoutingRule{
RuleNumber: 1,
Condition: oss.Condition{
KeyPrefixEquals: "",
// 指定回源條件為HTTP狀態碼404。
HTTPErrorCodeReturnedEquals: 404,
},
Redirect: oss.Redirect{
RedirectType: "Mirror",
// PassQueryString: &btrue,
// 指定回源地址。
MirrorURL: "http://www.test.com/",
// MirrorPassQueryString:&btrue,
// MirrorFollowRedirect:&bfalse,
// MirrorCheckMd5:&bfalse,
MirrorHeaders: oss.MirrorHeaders{
// PassAll:&bfalse,
// 允許傳遞指定HTTP Header參數。
Pass: []string{"myheader-key1", "myheader-key2"},
// 禁止傳遞指定HTTP Header參數。
Remove: []string{"myheader-key3", "myheader-key4"},
Set: []oss.MirrorHeaderSet{
{
Key: "myheader-key5",
Value: "myheader-value5",
},
},
},
},
}
// 指定回源類型為重定向。
ruleArrOk := []oss.RoutingRule{
{
RuleNumber: 2,
Condition: oss.Condition{
// 指定回源條件為HTTP狀態碼404,文件名前綴為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,
},
},
// 指定回源類型為鏡像。
{
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配置鏡像回源規則的具體操作,請參見添加或修改Website配置。
使用REST API
如果您的程序自定義要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多信息,請參見PutBucketWebsite。
相關文檔
您可以通過日志查詢通過回源上傳的文件。具體操作,請參見實時日志查詢。