すべてのプロダクト
Search
ドキュメントセンター

:リクエスト元による支払い

最終更新日:Dec 19, 2023

Object Storage Service (OSS) のバケットに対してpay-by-requesterが有効になっている場合、バケット所有者ではなく、要求者にリクエストとトラフィック料金が請求されます。 バケット所有者には、ストレージ料金のみが請求されます。 バケットのpay-by-requesterを有効にして、バケットへのアクセスによって発生したリクエストとトラフィック料金を支払うことなく、バケット内のデータを共有できます。

使用上の注意

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。

  • このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。

  • pay-by-requesterを有効にするには、oss:PutBucketRequestPayment権限が必要です。 pay-by-requester設定を照会するには、oss:GetBucketRequestPayment権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。

pay-by-requesterの有効化

次のコードは、バケットのpay-by-requesterを有効にする方法の例を示しています。

パッケージメイン

import (import (import)
"fmt"
"os"

「github.com/aliyun/aliyun-oss-go-sdk/oss」
)

func main() {
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// OSSClientインスタンスを作成します。 
	// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。 
	client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("新しいエラー:", err)
os.Exit(-1)
}

// pay-by-requesterモードを初期化します。 
	reqPayConf := oss.RequestPaymentConfiguration {
支払人: "Requester" 、}

// バケットのpay-by-requesterを有効にします。 
	err = client.SetBucketRequestPayment("<yourBucketName>", reqPayConf)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
} 

バケットのpay-by-requester設定の照会

次のコードは、バケットのpay-by-requester設定を照会する方法の例を示しています。

パッケージメイン

import (import (import)
"fmt"
"os"

「github.com/aliyun/aliyun-oss-go-sdk/oss」
)

func main() {
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}

// OSSClientインスタンスを作成します。 
	// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。 
	client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}

// バケットのpay-by-requester設定を照会します。 
	ret, err := client.GetBucketRequestPayment("yourBucketName")
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケットのpay-by-requester設定を表示します。 
	fmt.Println("Bucket request payer:", ret.Payer)
} 

サードパーティがオブジェクトにアクセスするときに課金されることを指定します

バケット内のオブジェクトへのアクセスに対してサードパーティが課金されるように指定した場合、リクエスト元はHTTPリクエストにx-oss-request-payer:requesterヘッダーを含めて、オブジェクトに対する操作を実行する必要があります。 このヘッダーが含まれていない場合は、エラーが返されます。

次のコードでは、PutObjectGetObject、およびDeleteObject操作を呼び出して、サードパーティがオブジェクトにアクセスするときに課金されるように指定する方法の例を示します。 メソッドを使用して、サードパーティがオブジェクトに対して読み取りおよび書き込み操作を実行するときに、同様の方法で他のAPI操作を呼び出すことで、サードパーティが課金されるように指定できます。

パッケージメイン

import (import (import)
"fmt"
「github.com/aliyun/aliyun-oss-go-sdk/oss」
"io/ioutil"
"os"
"strings"
)

func main() {
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// OSSClientインスタンスを作成します。 
	// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。 
	payerClient, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("新しいエラー:", err)
os.Exit(-1)
}

// バケットの名前を指定します。 
	payerBucket, err := payerClient.Bucket("examplebucket")
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}

// バケット所有者がpay-by-requesterモードを有効にしている場合、リクエスターは承認されたコンテンツにアクセスするために要求にoss.RequestPayer(oss.Requester) パラメーターを含める必要があります。 
	// バケット所有者がpay-by-requesterモードを有効にしない場合、要求者は許可されたコンテンツにアクセスするために要求にoss.RequestPayer(oss.Requester) パラメーターを含める必要はありません。 

	// オブジェクトをアップロードします。 
	// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
	キー:= "exampledir/exampleobject.txt"
err = payerBucket.PutObject(key, strings.NewReader("objectValue"), oss.RequestPayer("requester"))
if err! =nil {
fmt.Println("put Error:", err)
os.Exit(-1)
}

// バケット内のすべてのオブジェクトを一覧表示します。 
	lor, err := payerBucket.ListObjects(oss.RequestPayer(oss.Requester))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケット内のオブジェクトの名前を表示します。 
	for _, l := range lor.Objects {
fmt.Println("the Key name is :", l.Key)
}

// オブジェクトをダウンロードします。 
	body, err := payerBucket.GetObject(key, oss.RequestPayer(oss.Requester))
if err! =nil {
fmt.Println("Get Error:", err)
os.Exit(-1)
}
// オブジェクトの読み取り後、取得したストリームを閉じる必要があります。 そうしないと、接続リークが発生する可能性があります。 Consequently, no connections are available and an exception occurs. 
	defer body.Close()

// 取得したコンテンツを読み取り、表示します。 
	data, err := ioutil.ReadAll(body)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("data:", string(data))

// オブジェクトを削除します。 
	err = payerBucket.DeleteObject(key, oss.RequestPayer(oss.Requester))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
} 

参考資料

  • pay-by-requesterを設定するための完全なサンプルコードについては、GitHubをご覧ください。

  • pay-by-requesterを有効にするために呼び出すことができるAPI操作の詳細については、「PutBucketRequestPayment」をご参照ください。

  • pay-by-requester設定を照会するために呼び出すことができるAPI操作の詳細については、「GetBucketRequestPayment」をご参照ください。