本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
搭配支援的 API 操作使用多區域存取點
Amazon S3 提供一組可管理多區域存取點的操作。Amazon S3 會同步處理其中一些操作,也會非同步處理另一些操作。當您叫用非同步操作時,Amazon S3 會先同步授權請求的操作。如果授權成功,Amazon S3 會傳回一個字符,而您可以用它來追蹤請求的操作的進度和結果。
透過 Amazon S3 主控台提出的請求始終同步。主控台會等到請求完成後,才會允許您提交其他請求。
您可以使用 主控台檢視非同步操作的目前狀態和結果,也可以DescribeMultiRegionAccessPointOperation在 、 AWS CLI AWS SDKs或 REST API 中使用 。Amazon S3 會在回應非同步操作時提供追蹤字符。您可以將該追蹤字符作為 DescribeMultiRegionAccessPointOperation 的參數。當您包括追蹤字符時,Amazon S3 接著會傳回指定操作的目前狀態和結果,包括任何錯誤或相關的資源資訊。Amazon S3 會同步執行 DescribeMultiRegionAccessPointOperation 操作。
所有建立或維護多區域存取點的控制平面請求,都必須路由至 US West (Oregon) 區域。對於多區域存取點資料平面請求,不需要指定區域。對於多區域存取點容錯移轉控制平面,請求必須路由至五個受支援區域的其中一個。如需多區域存取點支援區域的詳細資訊,請參閱多區域存取點約束與限制。
此外,您必須將 s3:ListAllMyBuckets許可授予提出管理多區域存取點請求的使用者、角色或其他 AWS Identity and Access Management (IAM) 實體。
下列範例示範如何在 Amazon S3 中搭配相容操作使用多區域存取點。
多區域存取點與 AWS 服務 和 AWS SDKs相容性
若要將多區域存取點與需要 Amazon S3 儲存貯體名稱的應用程式搭配使用,請在使用 AWS SDK 提出請求時使用多區域存取點的 Amazon Resource Name (ARN)。若要檢查哪些 AWS SDKs 與多區域存取點相容,請參閱與 AWS SDKs的相容性。
多區域存取點與 S3 操作的相容性
您可以使用下列 Amazon S3 資料平面 API 操作,對儲存貯體中與多區域存取點相關聯的物件執行動作。下列 S3 操作可以接受多區域存取點 ARN:
多區域存取點僅在使用多區域存取點 ARN 時,才支援使用多區域存取點作為目的地的複製操作。
您可以使用下列 Amazon S3 控制平面操作,來建立和管理您的多區域存取點:
檢視您的多區域存取點路由狀態
- AWS CLI
-
下列範例命令會擷取您的多區域存取點路由組態,以便您可以查看儲存貯體目前的路由狀態。若要使用此範例命令,請以您自己的資訊取代 user input
placeholders。
aws s3control get-multi-region-access-point-routes
--region eu-west-1
--account-id 111122223333
--mrap arn:aws:s3::111122223333:accesspoint/abcdef0123456.mrap
- SDK for Java
-
下列適用於 Java 的 SDK 程式碼會擷取您的多區域存取點路由組態,以便您可以查看儲存貯體目前的路由狀態。若要使用此範例語法,請以您自己的資訊取代 user input
placeholders。
S3ControlClient s3ControlClient = S3ControlClient.builder()
.region(Region.US_EAST_1)
.credentialsProvider(credentialsProvider)
.build();
GetMultiRegionAccessPointRoutesRequest request = GetMultiRegionAccessPointRoutesRequest.builder()
.accountId("111122223333")
.mrap("arn:aws:s3::111122223333:accesspoint/abcdef0123456.mrap")
.build();
GetMultiRegionAccessPointRoutesResponse response = s3ControlClient.getMultiRegionAccessPointRoutes(request);
- SDK for JavaScript
-
下列適用於 JavaScript 的 SDK 程式碼會擷取您的多區域存取點路由組態,以便您可以查看儲存貯體目前的路由狀態。若要使用此範例語法,請以您自己的資訊取代 user input
placeholders。
const REGION = 'us-east-1'
const s3ControlClient = new S3ControlClient({
region: REGION
})
export const run = async () => {
try {
const data = await s3ControlClient.send(
new GetMultiRegionAccessPointRoutesCommand({
AccountId: '111122223333',
Mrap: 'arn:aws:s3::111122223333:accesspoint/abcdef0123456.mrap',
})
)
console.log('Success', data)
return data
} catch (err) {
console.log('Error', err)
}
}
run()
- SDK for Python
-
下列適用於 Python 的 SDK 程式碼會擷取您的多區域存取點路由組態,以便您可以查看儲存貯體目前的路由狀態。若要使用此範例語法,請以您自己的資訊取代 user input
placeholders。
s3.get_multi_region_access_point_routes(
AccountId=111122223333,
Mrap=arn:aws:s3::111122223333:accesspoint/abcdef0123456.mrap)['Routes']
更新您的基礎 Amazon S3 儲存貯體政策
若要授予適當的存取權,您也必須更新基礎 Amazon S3 儲存貯體政策。下列範例將存取控制委派給多區域存取點政策。將存取控制委派給多區域存取點政策後,當透過多區域存取點進行請求時,系統不會再使用該儲存貯體政策來存取控制。
以下是範例儲存貯體政策,可將存取控制委派給多區域存取點政策。若要使用此範例儲存貯體政策,請以您自己的資訊取代 user input
placeholders。若要透過 AWS CLI put-bucket-policy命令套用此政策,如下例所示,請將政策儲存在檔案中,例如 policy.json。
- JSON
-
-
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::444455556666:root"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket",
"arn:aws:s3:::amzn-s3-demo-bucket/*"
],
"Condition": {
"StringEquals": {
"s3:DataAccessPointAccount": "444455556666"
}
}
}
]
}
下列 put-bucket-policy 範例命令會將更新的 S3 儲存貯體政策與您的 S3 儲存貯體建立關聯:
aws s3api put-bucket-policy
--bucket amzn-s3-demo-bucket
--policy file:///tmp/policy.json
更新多區域存取點路由組態
下列範例命令會更新多區域存取點路由組態。可以針對下列五個區域執行多區域存取點路由命令:
-
ap-southeast-2
-
ap-northeast-1
-
us-east-1
-
us-west-2
-
eu-west-1
在多區域存取點路由組態中,您可以將儲存貯體設為主動或被動路由狀態。主動儲存貯體會接收流量,而被動儲存貯體則不會接收流量。您可以將儲存貯體的 TrafficDialPercentage 值設為 100 表示主動或 0 表示被動,來設定儲存貯體的路由狀態。
- AWS CLI
-
下列範例命令會更新您的多區域存取點路由組態。在此範例中,amzn-s3-demo-bucket1 會設為主動狀態,而 amzn-s3-demo-bucket2 會設為被動狀態。若要使用此範例命令,請以您自己的資訊取代 user input placeholders。
aws s3control submit-multi-region-access-point-routes
--region ap-southeast-2
--account-id 111122223333
--mrap arn:aws:s3::111122223333:accesspoint/abcdef0123456.mrap
--route-updates Bucket=amzn-s3-demo-bucket1,TrafficDialPercentage=100
Bucket=amzn-s3-demo-bucket2,TrafficDialPercentage=0
- SDK for Java
-
下列適用於 Java 的 SDK 程式碼會更新您的多區域存取點路由組態。若要使用此範例語法,請以您自己的資訊取代 user input
placeholders。
S3ControlClient s3ControlClient = S3ControlClient.builder()
.region(Region.ap-southeast-2)
.credentialsProvider(credentialsProvider)
.build();
SubmitMultiRegionAccessPointRoutesRequest request = SubmitMultiRegionAccessPointRoutesRequest.builder()
.accountId("111122223333")
.mrap("arn:aws:s3::111122223333:accesspoint/abcdef0123456.mrap")
.routeUpdates(
MultiRegionAccessPointRoute.builder()
.region("eu-west-1")
.trafficDialPercentage(100)
.build(),
MultiRegionAccessPointRoute.builder()
.region("ca-central-1")
.bucket("111122223333")
.trafficDialPercentage(0)
.build()
)
.build();
SubmitMultiRegionAccessPointRoutesResponse response = s3ControlClient.submitMultiRegionAccessPointRoutes(request);
- SDK for JavaScript
-
下列適用於 JavaScript 的 SDK 程式碼會更新您的多區域存取點路由組態。若要使用此範例語法,請以您自己的資訊取代 user input
placeholders。
const REGION = 'ap-southeast-2'
const s3ControlClient = new S3ControlClient({
region: REGION
})
export const run = async () => {
try {
const data = await s3ControlClient.send(
new SubmitMultiRegionAccessPointRoutesCommand({
AccountId: '111122223333',
Mrap: 'arn:aws:s3::111122223333:accesspoint/abcdef0123456.mrap',
RouteUpdates: [
{
Region: 'eu-west-1',
TrafficDialPercentage: 100,
},
{
Region: 'ca-central-1',
Bucket: 'amzn-s3-demo-bucket1',
TrafficDialPercentage: 0,
},
],
})
)
console.log('Success', data)
return data
} catch (err) {
console.log('Error', err)
}
}
run()
- SDK for Python
-
下列適用於 Python 的 SDK 程式碼會更新您的多區域存取點路由組態。若要使用此範例語法,請以您自己的資訊取代 user input
placeholders。
s3.submit_multi_region_access_point_routes(
AccountId=111122223333,
Mrap=arn:aws:s3::111122223333:accesspoint/abcdef0123456.mrap,
RouteUpdates= [{
'Bucket': amzn-s3-demo-bucket,
'Region': ap-southeast-2,
'TrafficDialPercentage': 10
}])
在您的多區域存取點中將物件新增至儲存貯體
若要將與多區域存取點相關聯的物件新增至儲存貯體,您可以使用 PutObject 操作。若要將多區域存取點中的所有儲存貯體保持同步,請啟用跨區域複寫。
若要使用這項操作,您必須具有多區域存取點的 s3:PutObject 許可。如需多區域存取點許可需求的詳細資訊,請參閱 許可。
- AWS CLI
-
下列範例資料平面請求會將 example.txt 上傳至指定的多區域存取點。若要使用此範例,請以您自己的資訊取代 user input
placeholders。
aws s3api put-object --bucket arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap --key example.txt --body example.txt
- SDK for Java
-
S3Client s3Client = S3Client.builder()
.build();
PutObjectRequest objectRequest = PutObjectRequest.builder()
.bucket("arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap")
.key("example.txt")
.build();
s3Client.putObject(objectRequest, RequestBody.fromString("Hello S3!"));
- SDK for JavaScript
-
const client = new S3Client({});
async function putObjectExample() {
const command = new PutObjectCommand({
Bucket: "arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap",
Key: "example.txt",
Body: "Hello S3!",
});
try {
const response = await client.send(command);
console.log(response);
} catch (err) {
console.error(err);
}
}
- SDK for Python
-
import boto3
client = boto3.client('s3')
client.put_object(
Bucket='arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap',
Key='example.txt',
Body='Hello S3!'
)
從您的多區域存取點中擷取物件
若要從多區域存取點中擷取物件,您可以使用 GetObject 操作。
若要使用這項 API 操作,您必須具有多區域存取點的 s3:GetObject 許可。如需多區域存取點許可需求的詳細資訊,請參閱 許可。
- AWS CLI
-
下列範例資料平面請求會從指定的多區域存取點中擷取 example.txt,並將其下載為 downloaded_example.txt。若要使用此範例,請以您自己的資訊取代 user input
placeholders。
aws s3api get-object --bucket arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap --key example.txt downloaded_example.txt
- SDK for Java
-
S3Client s3 = S3Client
.builder()
.build();
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket("arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap")
.key("example.txt")
.build();
s3Client.getObject(getObjectRequest);
- SDK for JavaScript
-
const client = new S3Client({})
async function getObjectExample() {
const command = new GetObjectCommand({
Bucket: "arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap",
Key: "example.txt"
});
try {
const response = await client.send(command);
console.log(response);
} catch (err) {
console.error(err);
}
}
- SDK for Python
-
import boto3
client = boto3.client('s3')
client.get_object(
Bucket='arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap',
Key='example.txt'
)
列出存放在以多區域存取點為基礎之儲存貯體的物件
若要傳回存放在以多區域存取點為基礎之儲存貯體的物件清單,請使用 ListObjectsV2 操作。在下列範例命令中,使用多區域存取點的 ARN,列出指定多區域存取點的所有物件。在此情況下,多區域存取點 ARN 為:
arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap
若要使用這項 API 操作,您必須具有多區域存取點的 s3:ListBucket 許可和基礎儲存貯體。如需多區域存取點許可需求的詳細資訊,請參閱 許可。
- AWS CLI
-
下列範例資料平面請求會列出以 ARN 所指定多區域存取點為基礎之儲存貯體中的物件。若要使用此範例,請以您自己的資訊取代 user input placeholders。
aws s3api list-objects-v2 --bucket arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap
- SDK for Java
-
S3Client s3Client = S3Client.builder()
.build();
String bucketName = "arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap";
ListObjectsV2Request listObjectsRequest = ListObjectsV2Request
.builder()
.bucket(bucketName)
.build();
s3Client.listObjectsV2(listObjectsRequest);
- SDK for JavaScript
-
const client = new S3Client({});
async function listObjectsExample() {
const command = new ListObjectsV2Command({
Bucket: "arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap",
});
try {
const response = await client.send(command);
console.log(response);
} catch (err) {
console.error(err);
}
}
- SDK for Python
-
import boto3
client = boto3.client('s3')
client.list_objects_v2(
Bucket='arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap'
)
搭配多區域存取點使用預先簽章的 URL
您可以使用預先簽章的 URL 來產生一個 URL,允許其他人透過 Amazon S3 多區域存取點存取 Amazon S3 儲存貯體。當建立預先簽章的 URL 時,您會將其與 S3 上傳 (PutObject) 或 S3 下載 (GetObject) 等特定物件動作建立關聯。您可以共用預先簽章的 URL,且擁有存取權的任何人都可以執行內嵌在 URL 中的動作,如同原始簽章使用者一樣。
預先簽章的 URL 具有到期日。過了到期時間,URL 將不再運作起作用。
在您搭配預先簽章的 URL 使用 S3 多區域存取點之前,請先檢查 AWS SDK 與 SigV4a 演算法的相容性。驗證您的 SDK 版本是否支援 SigV4a 作為簽署實作,用來簽署全域 AWS 區域 請求。如需搭配 Amazon S3 使用預先簽章 URL 的詳細資訊,請參閱使用預先簽章的 URL 共用物件。
下列範例示範如何搭配預先簽章的 URL 使用多區域存取點。若要使用這些範例,請以您自己的資訊取代 user input placeholders。
- AWS CLI
-
aws s3 presign arn:aws:s3::123456789012:accesspoint/MultiRegionAccessPoint_alias/example-file.txt
- SDK for Python
-
import logging
import boto3
from botocore.exceptions import ClientError
s3_client = boto3.client('s3',aws_access_key_id='xxx',aws_secret_access_key='xxx')
s3_client.generate_presigned_url(HttpMethod='PUT',ClientMethod="put_object", Params={'Bucket':'arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap','Key':'example-file'})
- SDK for Java
-
S3Presigner s3Presigner = S3Presigner.builder()
.credentialsProvider(StsAssumeRoleCredentialsProvider.builder()
.refreshRequest(assumeRole)
.stsClient(stsClient)
.build())
.build();
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket("arn:aws:s3::123456789012:accesspoint/abcdef0123456.mrap")
.key("example-file")
.build();
GetObjectPresignRequest preSignedReq = GetObjectPresignRequest.builder()
.getObjectRequest(getObjectRequest)
.signatureDuration(Duration.ofMinutes(10))
.build();
PresignedGetObjectRequest presignedGetObjectRequest = s3Presigner.presignGetObject(preSignedReq);
若要搭配臨時安全登入資料使用 SigV4A,例如使用 IAM 角色時,請務必從 AWS Security Token Service (AWS STS) 中的區域端點請求臨時登入資料,而非全域端點。如果您使用全域端點 for AWS STS (sts.amazonaws.com), AWS STS 會從全域端點產生臨時登入資料,Sig4A 不支援。因此,您會收到錯誤。若要解決此問題,請使用任何列出的區域端點 AWS STS。
使用以多區域存取點設定為請求者付款的儲存貯體
若與多區域存取點相關聯的 S3 儲存貯體設定為使用請求者付款,請求者將支付儲存貯體請求、下載和任何多區域存取點的相關費用。如需詳細資訊,請參閱 Simple Storage Service (Amazon S3) 定價。
以下範例是多區域存取點的資料平面請求,該多區域存取點連接至請求者付款儲存貯體。
- AWS CLI
-
若要從連接至請求者付款儲存貯體的多區域存取點下載物件,您必須將 --request-payer requester 指定為 get-object 請求的一部分。您也必須指定儲存貯體中檔案的名稱,以及應存放下載檔案的位置。
aws s3api get-object --bucket MultiRegionAccessPoint_ARN --request-payer requester --key example-file-in-bucket.txt example-location-of-downloaded-file.txt
- SDK for Java
-
若要從連接至請求者付款儲存貯體的多區域存取點下載物件,您必須將 RequestPayer.REQUESTER 指定為 GetObject 請求的一部分。您也必須指定儲存貯體中檔案的名稱,以及儲存檔案的位置。
GetObjectResponse getObjectResponse = s3Client.getObject(GetObjectRequest.builder()
.key("example-file.txt")
.bucket("arn:aws:s3::
123456789012:accesspoint/abcdef0123456.mrap")
.requestPayer(RequestPayer.REQUESTER)
.build()
).response();