リクエスト元支払いモードでは、バケット内のデータへのアクセスによって発生するトラフィック料金とリクエスト料金はリクエスト元が支払い、バケットの所有者はストレージ料金のみを支払います。この機能により、発生するトラフィックやリクエストに対する料金を負担することなく、データを共有できます。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「クライアントの設定 (Go SDK V1)」をご参照ください。
リクエスト元支払いモードを有効にするには、
oss:PutBucketRequestPayment権限が必要です。リクエスト元支払いモードの構成を取得するには、oss:GetBucketRequestPayment権限が必要です。詳細については、「RAM ユーザーへのカスタム権限の付与」をご参照ください。
リクエスト元支払いモードの設定
次のコードは、リクエスト元支払いモードを有効にする方法の例を示しています。
package main
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 インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、必要に応じてエンドポイントを設定します。
// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、必要に応じてリージョンを設定します。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("New Error:", err)
os.Exit(-1)
}
// リクエスト元支払いモードを初期化します。
reqPayConf := oss.RequestPaymentConfiguration{
Payer: "Requester",
}
// リクエスト元支払いモードを設定します。
err = client.SetBucketRequestPayment("<yourBucketName>", reqPayConf)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
リクエスト元支払いモード構成の取得
次のコードは、リクエスト元支払いモードの構成情報を取得する方法の例を示しています。
package main
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 インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、必要に応じてエンドポイントを設定します。
// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、必要に応じてリージョンを設定します。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// リクエスト元支払いモードの構成を取得します。
ret, err := client.GetBucketRequestPayment("yourBucketName")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// リクエスト元支払いモードの構成情報を出力します。
fmt.Println("Bucket request payer:", ret.Payer)
}
サードパーティのリクエスト元としてのオブジェクトへのアクセス
サードパーティがオブジェクトに対して操作を実行する場合、リクエストの HTTP ヘッダーに x-oss-request-payer:requester パラメーターを含める必要があります。そうでない場合、エラーが返されます。
PutObject、GetObject、および DeleteObject 操作を例として、オブジェクトアクセスに対してサードパーティの支払いを指定する方法を次のコードに示します。オブジェクトに対する他の読み取りおよび書き込み操作の支払いを指定する方法も同様です。
package main
import (
"fmt"
"io"
"os"
"strings"
"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 インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、必要に応じてエンドポイントを設定します。
// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、必要に応じてリージョンを設定します。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
payerClient, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("New Error:", err)
os.Exit(-1)
}
// バケット名を指定します。
payerBucket, err := payerClient.Bucket("examplebucket")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケットの所有者がリクエスト元支払いモードを有効にした後、外部のリクエスト元は、承認されたコンテンツにアクセスするために oss.RequestPayer(oss.Requester) パラメーターを設定する必要があります。
// バケットの所有者がリクエスト元支払いモードを有効にしていない場合、外部のリクエスト元は oss.RequestPayer(oss.Requester) パラメーターを含めずに承認されたコンテンツにアクセスできます。
// オブジェクトをアップロードします。
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例: exampledir/exampleobject.txt。
key := "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)
}
// データを読み取った後、ストリームを閉じます。ストリームを閉じないと、接続リークが発生する可能性があります。これにより、リクエストに利用可能な接続が枯渇し、プログラムが失敗する可能性があります。
defer body.Close()
// 取得したコンテンツを読み取って出力します。
data, err := io.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)
}
}
関連ドキュメント
リクエスト元支払いモードの完全なサンプルコードについては、「GitHub の例」をご参照ください。
リクエスト元支払いモードを有効にする API 操作の詳細については、「PutBucketRequestPayment」をご参照ください。
リクエスト元支払いモードの構成情報を取得する API 操作の詳細については、「GetBucketRequestPayment」をご参照ください。