向量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授權策略。
單擊按文法策略添加,在策略編輯器中輸入策略內容。例如,授予UID為114232345180****的使用者對my-vector-bucket下的my-index索引讀寫向量資料的許可權:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutVectors", "oss:GetVectors" ], "Principal": [ "1142323451******" ], "Resource": [ "acs:ossvector:*:*:my-vector-bucket/my-index" ] } ] }單擊確定完成建立。
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)層級的資源粒度。
情境 1:授予 RAM 使用者對指定向量索引的完全許可權
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": [
"acs:ossvector:*:*:my-vector-bucket/my-index"
]
}
]
} 情境 2:授予 RAM 使用者對某個向量 Bucket 的完全控制許可權
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": [
"acs:ossvector:*:*:my-vector-bucket",
"acs:ossvector:*:*:my-vector-bucket/*"
]
}
]
} 日誌管理
支援訪問日誌功能,可將訪問記錄轉存到指定的OSS儲存桶中,用於安全審計、效能分析和故障排查。
控制台
在向量Bucket頁面,單擊目標Bucket,在左側導覽列選擇 日誌管理 > 日誌轉存。
開啟 日誌轉存 開關,並配置以下參數:
目標儲存位置:選擇用於存放記錄檔的Bucket(必須與向量Bucket在同一地區)。
日誌首碼:設定記錄檔的目錄和首碼,如
MyLog-。授權角色:使用預設的Log Service角色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:Archive Storage。
-
Cold Archive:冷Archive Storage。
-
DeepCold Archive:深度冷Archive Storage。
-
-:未擷取到Object儲存類型。
TargetStorageClass
-
是否通過生命週期規則或CopyObject轉換了Object的儲存類型。取值如下:
-
Standard:轉換為標準儲存。
-
IA:轉換為低頻訪問儲存。
-
Archive:轉換為Archive Storage。
-
Cold Archive:轉換為冷Archive Storage。
-
DeepCold Archive:轉換為深度冷Archive Storage。
-
-:不涉及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後,您可以通過Log Service對記錄檔進行分析。對記錄檔進行分析前,您需要通過資料匯入方式將OSS記錄檔匯入到Log Service。有關資料匯入的具體操作,請參見匯入OSS資料。有關Log Service分析功能的更多資訊,請參見查詢與分析概述。