向量Bucket提供访问控制和日志管理功能,确保数据安全性、合规性和可观测性。
访问控制
向量Bucket支持Bucket Policy和RAM Policy。
Bucket Policy:基于资源的授权策略,可以将其附加到Bucket上,用于授权其他阿里云账户、子账户或匿名用户访问指定的向量资源。
RAM Policy:基于身份的授权策略,可以将其附加到RAM用户、用户组或角色上,定义其能够访问哪些向量Bucket资源。
支持的Action列表
API | Action | 接口描述 |
oss:PutVectorBucket | 创建向量Bucket。 | |
oss:GetVectorBucket | 获取向量Bucket的详细信息。 | |
oss:ListVectorBuckets | 列举请求者拥有的所有向量Bucket。 | |
oss:DeleteVectorBucket | 删除向量Bucket。 | |
oss:PutBucketLogging | 开启向量Bucket日志转存功能。 | |
oss:PutObject | 开启源向量Bucket日志转存功能时,设置源向量Bucket日志写入另一个目标Bucket。 | |
oss:GetBucketLogging | 查看向量Bucket日志转存配置。 | |
oss:DeleteBucketLogging | 关闭向量Bucket日志转存功能。 | |
oss:PutBucketPolicy | 设置指定向量Bucket的授权策略。 | |
oss:GetBucketPolicy | 获取指定向量Bucket的授权策略。 | |
oss:DeleteBucketPolicy | 删除指定向量Bucket的授权策略。 | |
oss:PutVectorIndex | 创建向量索引。 | |
oss:GetVectorIndex | 获取向量索引的详细信息。 | |
oss:ListVectorIndexes | 列举向量Bucket中的所有向量索引。 | |
oss:DeleteVectorIndex | 删除向量索引。 | |
oss:PutVectors | 写入向量数据。 | |
oss:GetVectors | 获取指定的向量数据。 | |
oss:ListVectors | 列举向量索引中的所有向量数据。 | |
oss:QueryVectors | 进行向量相似性检索。 | |
oss:DeleteVectors | 删除向量索引中的指定向量数据。 |
资源描述格式
资源级别 | 格式 | 示例 |
所有向量资源 |
|
|
向量 Bucket |
|
|
向量索引 |
|
|
向量数据 |
|
|
Bucket Policy
通过 Bucket Policy 授权子账户和其他账号访问指定的 OSS 资源。
控制台
在向量Bucket页面,单击目标Bucket,在左侧导航栏选择权限控制 > Bucket授权策略。
单击按语法策略添加,在策略编辑器中输入策略内容。例如,授予用户
my-vector-bucket
的读写向量数据的权限:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutVectors", "oss:GetVectors" ], "Principal": [ "*" ], "Resource": [ "acs:ossvector:*:*:bucket/my-vector-bucket/*" ] } ] }
单击确定完成创建。
ossutil
以下示例展示了如何为向量存储空间设置授权策略,允许指定用户进行向量相关操作。使用JSON配置文件,vector-policy.json内容如下:
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:PutVectors",
"oss:GetVectors"
],
"Effect":"Deny",
"Principal":["1234567890"],
"Resource":["acs:ossvector:cn-hangzhou:1234567890:*"]
}
]
}
ossutil vectors-api put-bucket-policy --bucket vector-example --body file://vector-policy.json
使用JSON配置参数设置向量Bucket策略:
ossutil vectors-api put-bucket-policy --bucket vector-example --body "{\"Version\":\"1\",\"Statement\":[{\"Action\":[\"oss:PutVectors\",\"oss:GetVectors\",\"oss:QueryVectors\"],\"Effect\":\"Allow\",\"Principal\":[\"1234567890\"],\"Resource\":[\"acs:ossvector:cn-hangzhou:1234567890:bucket/vector-example/*\"]}]}"
SDK
Python
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.vectors as oss_vectors
parser = argparse.ArgumentParser(description="vector put bucket policy sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--account_id', help='The account id.', required=True)
def main():
args = parser.parse_args()
# Loading credentials values from the environment variables
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Using the SDK's default configuration
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
cfg.account_id = args.account_id
if args.endpoint is not None:
cfg.endpoint = args.endpoint
vector_client = oss_vectors.Client(cfg)
policy_content = '''
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:PutVectors",
"oss:GetVectors"
],
"Effect":"Deny",
"Principal":["1234567890"],
"Resource":["acs:ossvector:cn-hangzhou:1234567890:*"]
}
]
}
'''
result = vector_client.put_bucket_policy(oss_vectors.models.PutBucketPolicyRequest(
bucket=args.bucket,
body=policy_content
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
)
if __name__ == "__main__":
main()
Go
package main
import (
"context"
"flag"
"log"
"strings"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/vectors"
)
var (
region string
bucketName string
accountId string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the vector bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the vector bucket.")
flag.StringVar(&accountId, "account-id", "", "The id of vector account.")
}
func main() {
flag.Parse()
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(accountId) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, accounId required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region).WithAccountId(accountId)
client := vectors.NewVectorsClient(cfg)
request := &vectors.PutBucketPolicyRequest{
Bucket: oss.Ptr(bucketName),
Body: strings.NewReader(`{
"Version":"1",
"Statement":[
{
"Action":[
"oss:PutVectors",
"oss:GetVectors"
],
"Effect":"Deny",
"Principal":["1234567890"],
"Resource":["acs:ossvector:cn-hangzhou:1234567890:*"]
}
]
}`),
}
result, err := client.PutBucketPolicy(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put vector bucket policy %v", err)
}
log.Printf("put vector bucket policy result:%#v\n", result)
}
API
调用PutBucketPolicy接口为向量Bucket设置授权策略。
RAM Policy
支持RAM策略,可以通过RAM控制台为RAM用户或角色配置向量Bucket相关的权限,RAM策略支持到索引(Index)级别的资源粒度。
日志管理
支持访问日志功能,可将访问记录转存到指定的OSS存储桶中,用于安全审计、性能分析和故障排查。
控制台
在向量Bucket页面,单击目标Bucket,在左侧导航栏选择 日志管理 > 日志转存。
开启 日志转存 开关,并配置以下参数:
目标存储位置:选择用于存放日志文件的Bucket(必须与向量Bucket在同一地域)。
日志前缀:设置日志文件的目录和前缀,如
MyLog-
。授权角色:使用默认的日志服务角色AliyunOSSLoggingDefaultRole或选择选择一个自定义角色。
ossutil
以下示例展示了如何为名为examplebucket
的存储空间开启日志转存功能,日志文件前缀为MyLog-
,存储访问日志的Bucket为examplebucket
。
使用JSON配置文件,bucket-logging-status.json内容如下:
{ "BucketLoggingStatus": { "LoggingEnabled": { "TargetBucket": "examplebucket", "TargetPrefix": "MyLog-", "LoggingRole": "AliyunOSSLoggingDefaultRole" } } }
命令示例如下:
ossutil vectors-api put-bucket-logging --bucket examplebucket --bucket-logging-status file://bucket-logging-status.json
使用JSON配置参数,命令示例如下:
ossutil vectors-api put-bucket-logging --bucket examplebucket --bucket-logging-status "{\"BucketLoggingStatus\":{\"LoggingEnabled\":{\"TargetBucket\":\"examplebucket\",\"TargetPrefix\":\"MyLog-\",\"LoggingRole\":\"AliyunOSSLoggingDefaultRole\"}}}"
SDK
Python
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.vectors as oss_vectors
parser = argparse.ArgumentParser(description="vector put bucket logging sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--account_id', help='The account id.', required=True)
parser.add_argument('--target_bucket', help='The name of the target bucket.', required=True)
def main():
args = parser.parse_args()
# Loading credentials values from the environment variables
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Using the SDK's default configuration
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
cfg.account_id = args.account_id
if args.endpoint is not None:
cfg.endpoint = args.endpoint
vector_client = oss_vectors.Client(cfg)
result = vector_client.put_bucket_logging(oss_vectors.models.PutBucketLoggingRequest(
bucket=args.bucket,
bucket_logging_status=oss_vectors.models.BucketLoggingStatus(
logging_enabled=oss_vectors.models.LoggingEnabled(
target_bucket=args.target_bucket,
target_prefix='log-prefix',
logging_role='AliyunOSSLoggingDefaultRole'
)
)
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
)
if __name__ == "__main__":
main()
Go
package main
import (
"context"
"flag"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/vectors"
"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
accountId string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the vector bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the vector bucket.")
flag.StringVar(&accountId, "account-id", "", "The id of vector account.")
}
func main() {
flag.Parse()
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(accountId) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, accounId required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region).WithAccountId(accountId)
client := vectors.NewVectorsClient(cfg)
request := &vectors.PutBucketLoggingRequest{
Bucket: oss.Ptr(bucketName),
BucketLoggingStatus: &vectors.BucketLoggingStatus{
&vectors.LoggingEnabled{
TargetBucket: oss.Ptr("TargetBucket"),
TargetPrefix: oss.Ptr("TargetPrefix"),
LoggingRole: oss.Ptr("AliyunOSSLoggingDefaultRole"),
},
},
}
result, err := client.PutBucketLogging(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put vector bucket logging %v", err)
}
log.Printf("put vector bucket logging result:%#v\n", result)
}
API
调用PutBucketLogging接口为向量Bucket开启日志转存功能。
日志文件命名规则
转存后的日志文件命名规则如下:
<TargetPrefix><SourceBucket>YYYY-mm-DD-HH-MM-SS-UniqueString
字段 | 说明 |
TargetPrefix | 日志文件的文件名前缀。 |
SourceBucket | 产生访问日志的源Bucket名称。 |
YYYY-mm-DD-HH-MM-SS | 日志的时间分区。从左到右分别表示:年、月、日、小时、分钟和秒。当前转存的日志是以小时粒度存放,例如:HH 为 01 时,代表为 01 点 00 分 00 秒 - 01 点 59 分 59 秒之间的日志信息,同时 MM、SS 均会推送 00。 |
UniqueString | 系统生成的字符串,是日志文件的唯一标识。 |
日志的格式和示例
日志格式
OSS的访问日志包含请求者和被访问资源的相关信息,格式如下:
RemoteIP Reserved Reserved Time "RequestURL" HTTPStatus SentBytes RequestTime "Referer" "UserAgent" "HostName" "RequestID" "LoggingFlag" "RequesterAliyunID" "Operation" "BucketName" "ObjectName" ObjectSize ServerCostTime "ErrorCode" RequestLength "UserID" DeltaDataSize "SyncRequest" "StorageClass" "TargetStorageClass" "TransmissionAccelerationAccessPoint" "AccessKeyID" "BucketARN"
字段
示例值
说明
RemoteIP
192.168.0.1
请求者的IP地址。
Reserved
-
保留字段,固定值为-。
Reserved
-
保留字段,固定值为-。
Time
03/Jan/2021:14:59:49 +0800
OSS收到请求的时间。
RequestURL
GET /example.jpg HTTP/1.0
包含query string的请求URL。
OSS会忽略以
x-
开头的query string参数,但这个参数会被记录在访问日志中。所以您可以使用x-
开头query string参数标记一个请求,然后使用这个标记快速查找该请求对应的日志。HTTPStatus
200
OSS返回的HTTP状态码。
SentBytes
999131
请求产生的下行流量。单位:Byte。
RequestTime
127
完成本次请求耗费的时间。单位:ms。
Referer
http://www.aliyun.com/product/oss
请求的HTTP Referer。
UserAgent
curl/7.15.5
HTTP的User-Agent头。
HostName
examplebucket.oss-cn-hangzhou.aliyuncs.com
请求访问的目标域名。
RequestID
5FF16B65F05BC932307A3C3C
请求的Request ID。
LoggingFlag
true
是否已开启日志转存。取值如下:
true表示已开启日志转存。
false表示未开启日志转存。
RequesterAliyunID
16571836914537****
请求者的用户ID。取值-表示匿名访问。
Operation
GetObject
请求类型。
BucketName
examplebucket
请求的目标Bucket名称。
ObjectName
example.jpg
请求的目标Object名称。
ObjectSize
999131
目标Object大小。单位:Byte。
ServerCostTime
88
OSS处理本次请求所花的时间。单位:毫秒。
ErrorCode
-
OSS返回的错误码。取值-表示未返回错误码。
RequestLength
302
请求的长度。单位:Byte。
UserID
16571836914537****
Bucket拥有者ID。
DeltaDataSize
-
Object大小的变化量。取值-表示此次请求不涉及Object的写入操作。
SyncRequest
-
请求类型。取值如下:
-:一般请求。
cdn:CDN回源请求。
lifecycle:通过生命周期规则转储或者删除数据的请求。
StorageClass
Standard
目标Object的存储类型。取值如下:
Standard:标准存储。
IA:低频访问存储。
Archive:归档存储。
Cold Archive:冷归档存储。
DeepCold Archive:深度冷归档存储。
-:未获取到Object存储类型。
TargetStorageClass
-
是否通过生命周期规则或CopyObject转换了Object的存储类型。取值如下:
Standard:转换为标准存储。
IA:转换为低频访问存储。
Archive:转换为归档存储。
Cold Archive:转换为冷归档存储。
DeepCold Archive:转换为深度冷归档存储。
-:不涉及Object存储类型转换操作。
TransmissionAccelerationAccessPoint
-
通过传输加速域名访问目标Bucket时使用的传输加速接入点。例如请求者通过华东1(杭州)的接入点访问目标Bucket时,值为cn-hangzhou。
取值-表示未使用传输加速域名或传输加速接入点与目标Bucket所在地域相同。
AccessKeyID
LTAI****************
请求者的AccessKey ID。
通过控制台的方式发起请求时,日志字段中会显示为以TMP开头的临时AccessKey ID。
通过工具、SDK以长期密钥的方式发起请求时,日志字段中显示为常见的AccessKey ID,示例值为
LTAI****************
。通过STS临时访问凭证发起请求时,显示为以STS开头的临时AccessKey ID。
说明AccessKey ID字段显示为-,表示匿名请求。
BucketArn
acs:oss***************
Bucket的全局唯一资源描述符。
日志示例
192.168.0.1 - - [03/Jan/2021:14:59:49 +0800] "GET /example.jpg HTTP/1.0" 200 999131 127 "http://www.aliyun.com/product/oss" "curl/7.15.5" "examplebucket.oss-cn-hangzhou.aliyuncs.com" "5FF16B65F05BC932307A3C3C" "true" "16571836914537****" "GetObject" "examplebucket" "example.jpg" 999131 88 "-" 302 "16571836914537****" - "cdn" "standard" "-" "-" "LTAI****************" "acs:oss***************"
日志文件转存到OSS指定Bucket后,您可以通过日志服务对日志文件进行分析。对日志文件进行分析前,您需要通过数据导入方式将OSS日志文件导入到日志服务。有关数据导入的具体操作,请参见导入OSS数据。有关日志服务分析功能的更多信息,请参见查询与分析概述。