當您在多個地區建立了大量儲存空間(Bucket)時,您可以通過指定儲存空間名稱的方式,快速擷取該儲存空間所屬的地區資訊。
使用情境
資料訪問最佳化:瞭解Bucket所在地區有助於確定最優的資料訪問路徑。例如,如果您的應用部署在同一地區或附近地區,通過內網訪問可以降低網路延遲和傳輸成本。
合規與資料歸屬地要求:某些法規可能要求資料必須儲存在特定地區,因此需要確保Bucket建立在符合法規要求的地區。
多地區冗餘或災備:若業務有高可用性需求,可能會在多個地區設定Bucket以實現資料冗餘,此時擷取Bucket的地區資訊對於實現資料同步和故障切換至關重要。
注意事項
關於OSS支援的地區資訊,請參見OSS地區和訪問網域名稱。例如,華東1(杭州)的Location欄位資訊顯示為oss-cn-hangzhou。
操作方式
使用OSS控制台
登入OSS管理主控台。
在左側導覽列,單擊Bucket 列表,然後單擊目標Bucket名稱。
頁面左上方將顯示目標Bucket所屬的地區資訊,例如華東1(杭州)。
使用圖形化管理工具ossbrowser
ossbrowser支援的Bucket層級的操作與控制台支援的操作類似,請按照ossbrowser介面指引完成擷取儲存空間所屬地區資訊的操作。關於使用ossbrowser的具體操作,請參見常用操作。
使用阿里雲SDK
以下僅列舉常見SDK的擷取儲存空間所屬地區資訊的程式碼範例。關於其他SDK的擷取儲存空間所屬地區資訊的程式碼範例,請參見SDK簡介。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
public class Demo {
public static void main(String[] args) throws Exception {
// 填寫OSS支援的任意Region對應的Endpoint,例如https://oss-cn-hangzhou.aliyuncs.com。
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執行個體。
// 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
String location = ossClient.getBucketLocation(bucketName);
System.out.println(location);
} 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();
}
}
}
}const OSS = require('ali-oss')
const client = new OSS({
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// yourRegion填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'oss-cn-hangzhou',
// 使用V4簽名演算法
authorizationV4: true,
// yourBucketName填寫Bucket名稱。
bucket: 'yourBucketName',
// yourEndpoint填寫Bucket所在地區對應的公網Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
});
async function getLocation() {
try {
const result = await client.getBucketInfo();
console.log(result.bucket.Location);
} catch (e) {
console.log(e);
}
}
getLocation();using Aliyun.OSS;
using Aliyun.OSS.Common;
// 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// yourBucketName填寫儲存空間名稱。
var bucketName = "yourBucketName";
// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
// 擷取儲存空間所在的地區。
var result = client.GetBucketLocation(bucketName);
Console.WriteLine("Get bucket:{0} Info succeeded ", bucketName);
Console.WriteLine("bucket Location: {0}", result.Location);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/*初始化OSS帳號資訊。*/
/*填寫OSS支援的任意Region對應的Endpoint,例如https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/ *yourRegion填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn - hangzhou。 * /
std::string Region = "yourRegion";
/*yourBucketName填寫儲存空間名稱。*/
std::string BucketName = "yourBucketName";
/*初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/*擷取儲存空間所在地區。*/
GetBucketLocationRequest request(BucketName);
auto outcome = client.GetBucketLocation(request);
if (outcome.isSuccess()) {
std::cout << "getBucketLocation success, location: " << outcome.result().Location() << std::endl;
}
else {
/*異常處理。*/
std::cout << "getBucketLocation fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
/*釋放網路等資源。*/
ShutdownSdk();
return 0;
}#include "oss_api.h"
#include "aos_http_io.h"
/* 填寫OSS支援的任意Region對應的Endpoint,例如https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫Bucket名稱。*/
const char *bucket_name = "yourBucket";
/* yourRegion填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* 用char*類型的字串初始化aos_string_t類型。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
//需要額外配置以下兩個參數
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* 是否使用CNAME網域名稱訪問OSS服務。0表示不使用。*/
options->config->is_cname = 0;
/* 設定網路相關參數,比如逾時時間等*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* 在程式入口調用aos_http_io_initialize方法來初始化網路、記憶體等全域資源。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* 用於記憶體管理的記憶體池(pool),等價於apr_pool_t。其實現代碼在apr庫中。*/
aos_pool_t *pool;
/* 重新建立一個記憶體池,第二個參數是NULL,表示沒有繼承其它記憶體池。*/
aos_pool_create(&pool, NULL);
/* 建立並初始化options,該參數包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全域配置資訊。*/
oss_request_options_t *oss_client_options;
/* 在記憶體池中分配記憶體給options。*/
oss_client_options = oss_request_options_create(pool);
/* 初始化Client的選項oss_client_options。*/
init_options(oss_client_options);
/* 初始化參數。*/
aos_string_t bucket;
aos_string_t oss_location;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
/* 將char*類型資料賦值給aos_string_t類型的儲存空間。*/
aos_str_set(&bucket, bucket_name);
/* 擷取儲存空間的地區。*/
resp_status = oss_get_bucket_location(oss_client_options, &bucket, &oss_location, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("get bucket location succeeded : %s \n", oss_location.data);
} else {
printf("get bucket location failed\n");
}
/* 釋放記憶體池,相當於釋放了請求過程中各資源分派的記憶體。*/
aos_pool_destroy(pool);
/* 釋放之前分配的全域資源。*/
aos_http_io_deinitialize();
return 0;
}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)
// 建立擷取儲存空間所在地區的請求
request := &oss.GetBucketLocationRequest{
Bucket: oss.Ptr(bucketName), // 儲存空間名稱
}
// 執行擷取儲存空間所在地區的操作並處理結果
result, err := client.GetBucketLocation(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get bucket location %v", err)
}
// 列印儲存空間所在地區
log.Printf("get bucket location:%#v\n", *result.LocationConstraint)
}
import argparse
import alibabacloud_oss_v2 as oss
# 建立命令列參數解析器,描述此指令碼用於擷取指定Bucket的位置資訊。
parser = argparse.ArgumentParser(description="Get the location of a specified OSS bucket.")
# 添加命令列參數 --region,表示儲存空間所在的地區,必需參數
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# 添加命令列參數 --bucket,表示儲存空間的名稱,必需參數
parser.add_argument('--bucket', help='The name of the bucket to get the location for.', required=True)
# 添加命令列參數 --endpoint,表示其他服務可用來訪問OSS的網域名稱,非必需參數
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS.')
def main():
"""
主函數,用於解析命令列參數並擷取指定Bucket的位置資訊。
"""
args = parser.parse_args() # 解析命令列參數
# 從環境變數中載入憑證資訊,用於身分識別驗證
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# 使用SDK的預設配置,並設定憑證提供者和地區資訊
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
# 如果提供了endpoint參數,則設定配置中的endpoint
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 使用配置好的資訊建立OSS用戶端
client = oss.Client(cfg)
# 構造請求以擷取指定Bucket的位置資訊
request = oss.GetBucketLocationRequest(bucket=args.bucket)
# 執行請求並擷取響應結果
result = client.get_bucket_location(request)
# 列印響應結果的狀態代碼、請求ID和位置資訊
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' location: {result.location}'
)
if __name__ == "__main__":
main() # 指令碼入口,當檔案被直接運行時調用main函數<?php
require_once __DIR__ . '/../vendor/autoload.php'; // 引入自動負載檔案,載入依賴庫
use AlibabaCloud\Oss\V2 as Oss;
// 定義命令列參數描述
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // 地區是必填項,儲存空間所在的地區,例如 oss-cn-hangzhou。
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // 終端節點是可選項,其他服務可以用來訪問OSS的網域名稱。
"bucket" => ['help' => 'The name of the bucket', 'required' => True], // 儲存空間名稱是必填項。
];
$longopts = \array_map(function ($key) {
return "$key:"; // 每個參數後面加冒號,表示需要值
}, array_keys($optsdesc));
// 解析命令列參數
$options = getopt("", $longopts);
// 檢查必填參數是否缺失
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help"; // 提示使用者缺少必填參數
exit(1);
}
}
// 擷取命令列參數值
$region = $options["region"]; // 儲存空間所在地區。
$bucket = $options["bucket"]; // 儲存空間名稱。
// 使用環境變數載入憑證資訊(AccessKeyId 和 AccessKeySecret)
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// 使用SDK的預設配置
$cfg = Oss\Config::loadDefault(); // 載入SDK的預設配置。
$cfg->setCredentialsProvider($credentialsProvider); // 設定憑證提供者。
$cfg->setRegion($region); // 設定地區。
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // 如果提供了終端節點,則設定終端節點。
}
// 建立OSS用戶端執行個體
$client = new Oss\Client($cfg);
// 建立擷取儲存空間位置的請求對象
$request = new Oss\Models\GetBucketLocationRequest($bucket);
// 調用getBucketLocation方法擷取儲存空間位置
$result = $client->getBucketLocation($request);
// 列印返回結果
printf(
'status code:' . $result->statusCode . PHP_EOL . // HTTP響應狀態代碼。
'request id:' . $result->requestId . PHP_EOL . // 請求的唯一標識。
'bucket location:' . var_export($result->location, true) // 儲存空間所在的地區位置。
);
使用命令列工具ossutil
您可以使用命令列工具ossutil來擷取儲存空間的地區資訊,ossutil的安裝請參見安裝ossutil。
以下樣本展示了如何擷取儲存空間examplebucket 的地區資訊。
ossutil api get-bucket-location --bucket examplebucket如果您想瞭解該命令的更多資訊,請參見get-bucket-location。
相關API
以上操作方式底層基於API實現,如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見GetBucketLocation。