简介
云点播专业版(Video on Demand Professional,VOD Pro)是基于腾讯云音视频能力提供的高品质媒体服务,在标准版的基础上,支持以对象存储模式管理内容,并使用 EdgeOne 进行内容分发,为直播、教育、电商、金融、游戏等行业提供更优的用户体验。
云点播专业版应用支持在腾讯云内网使用 AWS S3 兼容的 API 对存储桶内的文件进行读写。客户可使用相同地域的腾讯云服务器(如云服务器、轻量应用服务器、容器服务等)实现存储桶文件的内网安全访问,此方式可实现数据的内网传输,即上传和下载文件均只产生内网流量,不会形成流量费用。
本文主要介绍在腾讯云内网访问专业版应用存储桶的方法,访问方式以 AWS 命令行工具和常用开发平台的 AWS S3 SDK 为例,其他兼容 S3 API 的工具或 SDK 通常也可以使用。如果您的数据是从 S3 或 S3 兼容的存储服务迁移到点播专业版应用,一般只需要进行简单的适配就可以使用了。
准备工作
1. 创建应用和存储桶:
2. 获取内网访问域名:
3. 获取密钥对:
4. 准备服务器:
准备好与存储桶同地域的腾讯云服务器,如腾讯云服务器、轻量应用服务器、容器服务等。
方式一:通过命令行访问存储桶
步骤一:AWS 配置和证书文件
1. 在配置文件(文件位置是~/.aws/config) 中添加以下配置:
[default]s3 =addressing_style = virtual
2. 在证书文件(文件路径为 ~/.aws/credentials)中配置点播专业版应用的密钥对:
[default]aws_access_key_id = [AccessKeyId]aws_secret_access_key = [SecretAccessKey]
步骤二:使用 AWS CLI 访问专业版应用的存储桶
使用 AWS CLI 访问专业版应用的存储桶时,需要指定 endpoint-url 参数。以存储地域为 ap-chongqing ,存储桶 ID 为 bucketid1 为例,常用命令如下所示:
# 上传本地文件到存储桶的 a/b/ 目录下aws s3 cp --endpoint-url http://vodsrc-internal.ap-chongqing.eovod.com ./e.jpeg s3://bucketid1/a/b/# 将存储桶中的文件 a/b/e.jpeg 下载到本地aws s3 cp --endpoint-url http://vodsrc-internal.ap-chongqing.eovod.com s3://bucketid1/a/b/e.jpeg .# 获取对象 a/b/c.jpeg 的元数据aws s3api head-object --endpoint-url http://vodsrc-internal.ap-chongqing.eovod.com --bucket bucketid1 --key a/b/c.jpeg
方式二:通过 SDK 访问存储桶
以下为各语言使用 SDK 访问存储桶的指引。
GO SDK
下面以 AWS GO SDK V2 版本的上传文件为例,介绍如何适配以访问专业版应用的存储桶。以存储地域为 ap-chongqing ,存储桶 ID 为 bucketid1 为例,上传文件的代码示例如下所示:
package mainimport ("context""errors""fmt""net/url""os""strings""github.com/aws/aws-sdk-go-v2/aws""github.com/aws/aws-sdk-go-v2/config""github.com/aws/aws-sdk-go-v2/credentials""github.com/aws/aws-sdk-go-v2/service/s3"endpoints "github.com/aws/smithy-go/endpoints")type customEndpointResolverV2 struct {}// ResolveEndpoint 自定义 Endpointfunc (r *customEndpointResolverV2) ResolveEndpoint(ctx context.Context,params s3.EndpointParameters) (endpoints.Endpoint, error) {if params.Bucket == nil || params.Region == nil {return endpoints.Endpoint{}, errors.New("invalid s3 endpoint param")}return endpoints.Endpoint{URI: url.URL{Scheme: "http",Host: fmt.Sprintf("%s.vodsrc-internal.%s.eovod.com", *params.Bucket, *params.Region),},}, nil}func main() {// 通过环境变量 ACCESS_KEY_ID 和 SECRET_ACCESS_KEY 获取密钥creds := credentials.NewStaticCredentialsProvider(os.Getenv("ACCESS_KEY_ID"), os.Getenv("SECRET_ACCESS_KEY"), "")cfg, _ := config.LoadDefaultConfig(context.TODO(),config.WithRegion("ap-chongqing"),config.WithCredentialsProvider(creds),)s3Client := s3.New(s3.Options{Credentials: cfg.Credentials,Region: cfg.Region,EndpointResolverV2: new(customEndpointResolverV2),UsePathStyle: false,})input := &s3.PutObjectInput{Body: strings.NewReader("xxxxxxx"),Bucket: aws.String("bucketid1"), // 存储桶 IDKey: aws.String("a/b/c.jpeg"), // 文件的目标存储路径StorageClass: "STANDARD",}result, err := s3Client.PutObject(context.Background(), input)if err != nil {panic(err)}fmt.Println(result)}
C++ SDK
1. 修改 AWS 配置和证书文件
在配置文件(文件位置是~/.aws/config) 中添加以下配置:
[default]s3 =addressing_style = virtual
在证书文件(文件路径为 ~/.aws/credentials)中配置点播专业版应用的密钥对:
[default]aws_access_key_id = [AccessKeyId]aws_secret_access_key = [SecretAccessKey]
2. 代码中设置 Endpoint
变量 endpointOverride 传入内网访问域名的不包含存储桶 ID 的部分,即 vodsrc-internal.[存储地域].eovod.com。以存储地域为 ap-chongqing 为例,代码示例如下所示:
Aws::Client::ClientConfiguration awsCC;awsCC.scheme = Aws::Http::Scheme::HTTP;awsCC.region = "ap-chongqing";awsCC.endpointOverride = "vodsrc-internal.ap-chongqing.eovod.com";Aws::S3::S3Client s3_client(awsCC);
Java SDK
1. 修改 AWS 配置和证书文件
在配置文件(文件位置是~/.aws/config) 中添加以下配置:
[default]s3 =addressing_style = virtual
在证书文件(文件路径为 ~/.aws/credentials)中配置点播专业版应用的密钥对:
[default]aws_access_key_id = [AccessKeyId]aws_secret_access_key = [SecretAccessKey]
2. 代码中设置 Endpoint
变量 endpointOverride 传入内网访问域名的不包含存储桶 ID 的部分,即 vodsrc-internal.[存储地域].eovod.com。以存储地域为 ap-chongqing 为例,代码示例如下所示:
S3Client s3Client = S3Client.builder().endpointOverride(URI.create("http://vodsrc-internal.ap-chongqing.eovod.com")).region(Region.of("ap-chongqing")).build();
.NET SDK
string sAccessKeyId = "AccessKeyId";string sAccessKeySecret = "SecretAccessKey";string region = "ap-chongqing";var config = new AmazonS3Config() { ServiceURL = "http://vodsrc-internal." + region + ".eovod.com" };var client = new AmazonS3Client(sAccessKeyId, sAccessKeySecret, config);
Node.js SDK
var AWS = require('aws-sdk');AWS.config.update({accessKeyId: "AccessKeyId",secretAccessKey: "SecretAccessKey",region: "ap-chongqing",endpoint: 'http://vodsrc-internal.ap-chongqing.eovod.com',});s3 = new AWS.S3({apiVersion: '2006-03-01'});
PHP SDK
1. 修改 AWS 配置和证书文件
在配置文件(文件位置是~/.aws/config) 中添加以下配置:
[default]s3 =addressing_style = virtual
在证书文件(文件路径为 ~/.aws/credentials)中配置点播专业版应用的密钥对:
[default]aws_access_key_id = [AccessKeyId]aws_secret_access_key = [SecretAccessKey]
2. 代码中设置 Endpoint
变量 endpoint 传入内网访问域名的不包含存储桶 ID 的部分,即 http://vodsrc-internal.[存储地域].eovod.com。以存储地域为 ap-chongqing 为例,代码示例如下所示:
$S3Client = new S3Client(['region' => 'ap-chongqing','version' => '2006-03-01','endpoint' => 'http://vodsrc-internal.ap-chongqing.eovod.com']);
Python SDK
1. 修改 AWS 配置和证书文件
在配置文件(文件位置是~/.aws/config) 中添加以下配置:
[default]s3 =addressing_style = virtual
在证书文件(文件路径为 ~/.aws/credentials)中配置点播专业版应用的密钥对:
[default]aws_access_key_id = [AccessKeyId]aws_secret_access_key = [SecretAccessKey]
2. 代码中设置 Endpoint
参数 endpoint_url 传入内网访问域名的不包含存储桶 ID 的部分,即 http://vodsrc-internal.[存储地域].eovod.com。以存储地域为 ap-chongqing 为例,代码示例如下所示:
client = boto3.client('s3', endpoint_url='http://vodsrc-internal.ap-chongqing.eovod.com')
兼容的 S3 API
常见问题
如何判断是否内网访问?
以腾讯云服务器(Cloud Virtual Machine,CVM)访问专业版应用存储桶为例,判断是否使用内网访问 ,可以在 CVM 上 使用 nslookup 命令解析内网访问域名,若返回内网 IP,则可确定是内网访问,否则为外网访问。实际使用中,如果通过内网域名进行外网访问,服务端会返回 404 响应码。
说明:
内网 IP 地址一般形如 10.*.*.*、100.*.*.* ,VPC 网络一般为 169.254.*.* 等,这两种形式的 IP 都属于内网。