在存量数据迁移完成后,您可以配置镜像回源,以确保用户可以访问到尚未迁移至OSS的增量数据,以避免对业务的影响。配置镜像回源后,当请求者访问Bucket中不存在的文件(Object)时,OSS会根据回源规则指定的源站获取该文件。OSS获取到目标文件后,会将文件返回给请求者并保存到Bucket中。
使用限制
规则数量
回源规则最多配置20条,按RuleNumber的先后顺序依次匹配。如果命中当前规则,则后续规则不再匹配。规则未命中表示没有匹配回源条件,与回源后是否成功获取目标文件无关。
QPS和流量限制
单个阿里云账号在中国内地各地域默认QPS为2000、流量为2 Gbit/s;非中国内地各地域默认QPS为1000、流量为1 Gbit/s。
如果您的业务有更大的QPS或者流量需求,请联系技术支持。
源站地址
要求源站地址符合RFC3986编码规范。
回源地址
回源地址不支持内网地址。
默认超时时间
镜像回源默认超时时间为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";
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
String region = "cn-hangzhou";
// 创建OSSClient实例。
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);
// 设置默认主页后,访问以非正斜线(/)结尾的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.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
region = "cn-hangzhou"
# examplebucket填写存储空间名称。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# 开启静态网站托管模式,并将默认首页设置为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 (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
region string // 存储区域
bucketName string // 存储空间名称
)
// init函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查bucket名称是否为空
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 检查region是否为空
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 加载默认配置并设置凭证提供者和区域
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 创建OSS客户端
client := oss.NewClient(cfg)
// 设置镜像回源规则
ruleOk := oss.RoutingRule{
RuleNumber: oss.Ptr(int64(1)),
Condition: &oss.RoutingRuleCondition{
KeyPrefixEquals: oss.Ptr("myobject"), // 指定匹配对象前缀
HttpErrorCodeReturnedEquals: oss.Ptr(int64(404)), // 指定回源条件为HTTP状态码404
},
Redirect: &oss.RoutingRuleRedirect{
RedirectType: oss.Ptr("Mirror"), // 指定重定向类型为镜像
MirrorURL: oss.Ptr("http://www.test.com/"), // 指定回源地址
MirrorHeaders: &oss.MirrorHeaders{
//PassAll: oss.Ptr(true), // 指定传递所有头部
Passs: []string{"myheader-key1", "myheader-key2"}, // 允许传递指定HTTP Header参数
Removes: []string{"myheader-key3", "myheader-key4"}, // 禁止传递指定HTTP Header参数
Sets: []oss.MirrorHeadersSet{
{
Key: oss.Ptr("myheader-key5"), // 设置指定HTTP Header参数的名称
Value: oss.Ptr("myheader-value"), // 设置指定HTTP Header参数的值
},
},
},
},
}
// 创建设置镜像回源的请求
request := &oss.PutBucketWebsiteRequest{
Bucket: oss.Ptr(bucketName), // 存储空间名称
WebsiteConfiguration: &oss.WebsiteConfiguration{
IndexDocument: &oss.IndexDocument{
Suffix: oss.Ptr("index.html"), //设置镜像回源的默认页面为index.html
SupportSubDir: oss.Ptr(true),
Type: oss.Ptr(int64(0)),
},
ErrorDocument: &oss.ErrorDocument{
Key: oss.Ptr("error.html"), // 设置镜像回源的错误页面为error.html
HttpStatus: oss.Ptr(int64(404)),
},
RoutingRules: &oss.RoutingRules{
RoutingRules: []oss.RoutingRule{
ruleOk,
},
},
},
}
// 执行设置镜像回源的请求
result, err := client.PutBucketWebsite(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put bucket website %v", err)
}
// 打印设置镜像回源的结果
log.Printf("put bucket website result:%#v\n", result)
}
使用命令行工具ossutil
关于使用ossutil配置镜像回源规则的具体操作,请参见添加或修改Website配置。
使用REST API
如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketWebsite。
相关文档
您可以通过日志查询通过回源上传的文件。具体操作,请参见实时日志查询。
- 本页导读 (1)
- 使用限制
- 使用场景
- 回源流程
- 回源规则
- 操作步骤
- 使用OSS控制台
- 使用阿里云SDK
- 使用命令行工具ossutil
- 使用REST API
- 相关文档