Object Storage Service (OSS) のファイル (オブジェクト) にアクセスすると、大量の帯域幅を消費する可能性があります。トラフィックシェーピングの制御が困難なクライアントでは、他のアプリケーションに影響を与える可能性があります。この問題を回避するために、OSS が提供する単一接続の帯域幅調整機能を使用して、ファイルのアップロードやダウンロードなどの操作中のトラフィックを制御できます。これにより、他のアプリケーションに十分なネットワーク帯域幅を確保できます。
使用上の注意
PutObject、AppendObject、PostObject、CopyObject、UploadPart、UploadPartCopy、および GetObject リクエストに x-oss-traffic-limit パラメーターを含め、調整値を指定します。値は 819200 から 838860800 の間でなければなりません。単位は bit/s です。
クライアントリクエストの調整
クライアントリクエストの調整は、SDK (ソフトウェア開発キット) を使用してのみ実行できます。次のコードは、一般的な SDK を使用してアップロードまたはダウンロードリクエストを調整する方法の例を示しています。他の SDK を使用したコード例については、「SDK の概要」をご参照ください。
単純なアップロードとダウンロードの調整
マルチパートアップロードの調整
ファイル URL を使用した帯域幅の調整
公開読み取りまたは公開読み書き権限を持つファイルの場合、ファイル URL に調整パラメーター x-oss-traffic-limit=<value> を追加してアクセスを調整できます。たとえば、URL https://examplebucket.oss-cn-hangzhou.aliyuncs.com/video.mp4?x-oss-traffic-limit=819200 は、video.mp4 ファイルのダウンロード速度が 100 KB/s に調整されることを指定します。次の図は、調整の効果を示しています:
署名付き URL を使用した帯域幅の調整
SDK を使用して署名付き URL を生成し、非公開ファイルにアクセスする場合、署名計算に調整パラメーターを含める必要があります。次のコードは、一般的な SDK を使用して署名付き URL に調整パラメーターを追加する方法の例を示しています。他の SDK を使用したコード例については、「SDK の概要」をご参照ください。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.GetObjectRequest;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws Throwable {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。実際のエンドポイントを指定してください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
String objectName = "exampledir/exampleobject.txt";
// アップロードするローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。
// ローカルファイルのパスを指定しない場合、ローカルファイルはサンプルプログラムが属するプロジェクトのパスからアップロードされます。
String localFileName = "D:\\localpath\\examplefile.txt";
// オブジェクトをダウンロードする完全なパスを指定します。同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。それ以外の場合、ダウンロードされたオブジェクトはパスに保存されます。
// ダウンロードしたオブジェクトのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。
String downLoadFileName = "D:\\localpath\\exampleobject.txt";
// 帯域幅制限を 100 KB/s に設定します。
int limitSpeed = 100 * 1024 * 8;
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSS Client インスタンスを作成します。
// OSS Client が不要になったら、shutdown メソッドを呼び出して関連リソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// オブジェクトのアップロード用に帯域幅調整パラメーターを含む署名付き URL を生成し、URL の有効期間を 60 秒に設定します。
Date date = new Date();
date.setTime(date.getTime() + 60 * 1000);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
request.setExpiration(date);
request.setTrafficLimit(limitSpeed);
URL signedUrl = ossClient.generatePresignedUrl(request);
System.out.println("put object url" + signedUrl);
// オブジェクトのアップロードの帯域幅調整を設定します。
InputStream inputStream = new FileInputStream(localFileName);
ossClient.putObject(signedUrl, inputStream, -1, null, true);
// オブジェクトのダウンロード用に帯域幅調整パラメーターを含む署名付き URL を生成し、URL の有効期間を 60 秒に設定します。
date = new Date();
date.setTime(date.getTime() + 60 * 1000);
request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
request.setExpiration(date);
request.setTrafficLimit(limitSpeed);
signedUrl = ossClient.generatePresignedUrl(request);
System.out.println("get object url" + signedUrl);
// オブジェクトのダウンロードの帯域幅調整を設定します。
GetObjectRequest getObjectRequest = new GetObjectRequest(signedUrl, null);
ossClient.getObject(getObjectRequest, new File(downLoadFileName));
} 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();
}
}
}
}<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;
// 環境変数からアクセス資格情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、中国 (杭州) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "yourEndpoint";
// バケット名を指定します。例: examplebucket。
$bucket= "examplebucket";
// オブジェクトの完全なパスを指定します。例: exampledir/exampleobject.txt。完全なパスにバケット名を含めることはできません。
$object = "exampledir/exampleobject.txt";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// 帯域幅を 100 KB/s (819200 bit/s) に調整します。
$options = array(
OssClient::OSS_TRAFFIC_LIMIT => 819200,
);
// 調整されたアップロード用の署名付き URL を作成します。URL は 60 秒間有効です。
$timeout = 60;
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", $options);
print($signedUrl);
// 調整されたダウンロード用の署名付き URL を作成します。URL は 120 秒間有効です。
$timeout = 120;
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
print($signedUrl);# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import OSS_TRAFFIC_LIMIT
# 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントにマッピングされるリージョンの ID を指定します。例: cn-hangzhou。このパラメーターは、署名アルゴリズム V4 を使用する場合に必要です。
region = "cn-hangzhou"
# バケットの名前を指定します。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
# アップロードするローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。デフォルトでは、ローカルファイルのパスを指定しない場合、ローカルファイルはサンプルプログラムが属するプロジェクトのパスからアップロードされます。
local_file_name = 'D:\\localpath\\examplefile.txt'
# オブジェクトをダウンロードするローカルパスを指定します。同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。同じ名前のファイルが存在しない場合、ダウンロードされたオブジェクトはパスに保存されます。
# ダウンロードしたオブジェクトのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。
down_file_name = 'D:\\localpath\\exampleobject.txt'
# params パラメーターを設定して、帯域幅制限を 100 KB/s (819,200 bit/s) に設定します。
limit_speed = (100 * 1024 * 8)
params = dict()
params[OSS_TRAFFIC_LIMIT] = str(limit_speed)
# オブジェクトのアップロード用に帯域幅調整パラメーターを含む署名付き URL を生成し、URL の有効期間を 60 秒に設定します。
url = bucket.sign_url('PUT', object_name, 60, params=params)
print('put object url:', url)
# オブジェクトのアップロードの帯域幅調整を設定します。
result = bucket.put_object_with_url_from_file(url, local_file_name)
print('http response status:', result.status)
# オブジェクトのダウンロード用に帯域幅調整パラメーターを含む署名付き URL を生成し、URL の有効期間を 60 秒に設定します。
url = bucket.sign_url('GET', object_name, 60, params=params)
print('get object url:', url)
# オブジェクトのダウンロードの帯域幅調整を設定します。
result = bucket.get_object_with_url_to_file(url, down_file_name)
print('http response status:', result.status)using System.Text;
using Aliyun.OSS;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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");
// バケットの名前を指定します。例: examplebucket。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
var objectContent = "More than just cloud.";
var downloadFilename = "D:\\localpath\\examplefile.txt";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、必要に応じてパラメーターを変更します。
var conf = new ClientConfiguration();
// 署名アルゴリズム V4 を使用します。
conf.SignatureVersion = SignatureVersion.V4;
// OSSClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
// オブジェクトをアップロードするための署名付き URL を生成します。
var generatePresignedUriRequest = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Put)
{
Expiration = DateTime.Now.AddHours(1),
};
// 帯域幅制限を 100 KB/s (819,200 bit/s) に設定します。
generatePresignedUriRequest.AddQueryParam("x-oss-traffic-limit", "819200");
var signedUrl = client.GeneratePresignedUri(generatePresignedUriRequest);
// 署名付き URL を使用してオブジェクトをアップロードします。
var buffer = Encoding.UTF8.GetBytes(objectContent);
using (var ms = new MemoryStream(buffer))
{
client.PutObject(signedUrl, ms);
}
Console.WriteLine("Put object by signatrue succeeded. {0} ", signedUrl.ToString());
var metadata = client.GetObjectMetadata(bucketName, objectName);
var etag = metadata.ETag;
// オブジェクトをダウンロードするための署名付き URL を生成します。
// 帯域幅制限を 100 KB/s (819,200 bit/s) に設定します。
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get);
req.AddQueryParam("x-oss-traffic-limit", "819200");
var uri = client.GeneratePresignedUri(req);
// 署名付き URL を使用してオブジェクトをダウンロードします。
OssObject ossObject = client.GetObject(uri);
using (var file = File.Open(downloadFilename, FileMode.OpenOrCreate))
{
using (Stream stream = ossObject.Content)
{
int length = 4 * 1024;
var buf = new byte[length];
do
{
length = stream.Read(buf, 0, length);
file.Write(buf, 0, length);
} while (length != 0);
}
}
Console.WriteLine("Get object by signatrue succeeded. {0} ", uri.ToString());
}
catch (Exception ex)
{
Console.WriteLine("Put object failed, {0}", ex.Message);
}#include <alibabacloud/oss/OssClient.h>
#include <fstream>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS へのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/*バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* バケットの名前を指定します。例: examplebucket。 */
std::string BucketName = "examplebucket";
/* オブジェクトの完全なパスを指定します。オブジェクトの完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。 */
std::string ObjectName = "exampledir/exampleobject.txt";
/* ネットワークリソースなどのリソースを初期化します。 */
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);
/* 署名付き URL の有効期間を 32,400 秒に設定します。 */
std::time_t expires = std::time(nullptr) + 1200;
/* オブジェクトのアップロードに使用される署名付き URL を生成します。 */
GeneratePresignedUrlRequest putrequest(BucketName, ObjectName, Http::Put);
putrequest.setExpires(expires);
/* オブジェクトをアップロードする最大速度を 100 KB/s に設定します。 */
putrequest.setTrafficLimit(819200);
auto genOutcome = client.GeneratePresignedUrl(putrequest);
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "test cpp sdk";
/* 署名付きアップロード URL を表示します。 */
std::cout << "Signed upload URL:" << genOutcome.result() << std::endl;
/* 署名付き URL を使用してオブジェクトをアップロードします。 */
auto outcome = client.PutObjectByUrl(genOutcome.result(), content);
/* オブジェクトのダウンロードに使用される署名付き URL を生成します。 */
GeneratePresignedUrlRequest getrequest(BucketName, ObjectName, Http::Get);
getrequest.setExpires(expires);
/* オブジェクトをダウンロードする最大速度を 100 KB/s に設定します。 */
getrequest.setTrafficLimit(819200);
genOutcome = client.GeneratePresignedUrl(getrequest);
/* 署名付きダウンロード URL を表示します。 */
std::cout << "Signed download URL:" << genOutcome.result() << std::endl;
/* 署名付き URL を使用してオブジェクトをダウンロードします。 */
auto goutcome = client.GetObjectByUrl(genOutcome.result());
/* ネットワークリソースなどのリソースを解放します。 */
ShutdownSdk();
return 0;
}