Untuk mengakses OSS dengan AWS SDK, konfigurasikan endpoint OSS dan kredensial akses Anda. Tidak diperlukan perubahan kode tambahan.
Endpoint: Gunakan format endpoint yang kompatibel dengan S3. Ganti
{region}dengan ID wilayah, seperticn-hangzhou. Untuk daftar lengkap wilayah, lihat Wilayah dan titik akhir.Jenis
Format
Titik akhir publik
https://s3.oss-{region}.aliyuncs.comTitik akhir internal
https://s3.oss-{region}-internal.aliyuncs.comTitik akhir percepatan transfer
https://s3.oss-accelerate.aliyuncs.comPentingKarena adanya perubahan kebijakan untuk meningkatkan kepatuhan dan keamanan, mulai 20 Maret 2025, pengguna OSS baru harus menggunakan nama domain kustom (CNAME) untuk melakukan operasi API data pada bucket OSS yang berlokasi di wilayah daratan Tiongkok. Titik akhir publik default dibatasi untuk operasi tersebut. Lihat pengumuman resmi untuk daftar lengkap operasi yang terdampak. Jika Anda mengakses data melalui HTTPS, Anda harus mengikat Sertifikat SSL yang valid ke domain kustom Anda. Ini wajib untuk akses Konsol OSS, karena konsol menerapkan HTTPS.
Kredensial akses: Buat AccessKey dengan izin OSS di Resource Access Management (RAM).
Java
SDK 2.x
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.S3Configuration;
import java.net.URI;
S3Client s3Client = S3Client.builder()
.endpointOverride(URI.create("https://s3.oss-cn-hangzhou.aliyuncs.com"))
.region(Region.AWS_GLOBAL)
.serviceConfiguration(
S3Configuration.builder()
.pathStyleAccessEnabled(false)
.chunkedEncodingEnabled(false)
.build()
)
.build();SDK 1.x
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new EndpointConfiguration(
"https://s3.oss-cn-hangzhou.aliyuncs.com",
"cn-hangzhou"))
.withPathStyleAccessEnabled(false)
.withChunkedEncodingDisabled(false)
.build();Untuk SDK 1.x, S3ObjectInputStream yang dikembalikan oleh getObject akan segera membuang data yang belum dibaca saat Anda memanggil close(). Pastikan Anda membaca seluruh aliran sebelum menutupnya.
S3Object object = s3Client.getObject("my-bucket", "file.txt");
InputStream input = object.getObjectContent();
byte[ ] data = IOUtils.toByteArray(input);
input.close();Python
import boto3
from botocore.config import Config
s3 = boto3.client(
's3',
endpoint_url='https://s3.oss-cn-hangzhou.aliyuncs.com',
config=Config(
signature_version='s3',
s3={'addressing_style': 'virtual'}
)
)
Node.js
SDK v3
import { S3Client } from '@aws-sdk/client-s3';
const client = new S3Client({
endpoint: 'https://s3.oss-cn-hangzhou.aliyuncs.com',
region: 'cn-hangzhou'
});SDK v2
const AWS = require('aws-sdk');
const s3 = new AWS.S3({
endpoint: 'https://s3.oss-cn-hangzhou.aliyuncs.com',
region: 'cn-hangzhou'
});Go
SDK v2
import (
"context"
"github.com/aws/aws-sdk-go-v2/aws"
awsconfig "github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
cfg, _ := awsconfig.LoadDefaultConfig(context.TODO(),
awsconfig.WithEndpointResolverWithOptions(
aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
return aws.Endpoint{
URL: "https://s3.oss-cn-hangzhou.aliyuncs.com",
}, nil
}),
),
)
client := s3.NewFromConfig(cfg)SDK v1
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
sess := session.Must(session.NewSessionWithOptions(session.Options{
Config: aws.Config{
Endpoint: aws.String("https://s3.oss-cn-hangzhou.aliyuncs.com"),
Region: aws.String("cn-hangzhou"),
},
SharedConfigState: session.SharedConfigEnable,
}))
svc := s3.New(sess).NET
SDK 3.x
using Amazon.S3;
var config = new AmazonS3Config
{
ServiceURL = "https://s3.oss-cn-hangzhou.aliyuncs.com"
};
var client = new AmazonS3Client(config);SDK 2.x
using Amazon.S3;
var config = new AmazonS3Config
{
ServiceURL = "https://s3.oss-cn-hangzhou.aliyuncs.com"
};
var client = new AmazonS3Client(config);PHP
SDK 3.x
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Aws\S3\S3Client;
$s3Client = new S3Client([
'version' => '2006-03-01',
'region' => 'cn-hangzhou',
'endpoint' => 'https://s3.oss-cn-hangzhou.aliyuncs.com'
]);SDK 2.x
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Aws\S3\S3Client;
$s3Client = S3Client::factory([
'version' => '2006-03-01',
'region' => 'cn-hangzhou',
'base_url' => 'https://s3.oss-cn-hangzhou.aliyuncs.com'
]);Ruby
SDK 3.x
require 'aws-sdk-s3'
s3 = Aws::S3::Client.new(
endpoint: 'https://s3.oss-cn-hangzhou.aliyuncs.com',
region: 'cn-hangzhou'
)SDK 2.x
require 'aws-sdk'
s3 = AWS::S3::Client.new(
s3_endpoint: 's3.oss-cn-hangzhou.aliyuncs.com',
region: 'cn-hangzhou',
s3_force_path_style: false
)
C++
Memerlukan versi SDK 1.7.68 atau lebih baru.
#include <aws/s3/S3Client.h>
#include <aws/core/client/ClientConfiguration.h>
Aws::Client::ClientConfiguration config;
config.endpointOverride = "s3.oss-cn-hangzhou.aliyuncs.com";
config.region = "cn-hangzhou";
Aws::S3::S3Client s3_client(config);Browser
Aplikasi web frontend harus menggunakan kredensial temporary STS. Jangan pernah menyematkan AccessKey permanen secara langsung dalam kode sisi klien. Server Anda memanggil AssumeRole untuk mendapatkan kredensial temporary dan mengembalikannya ke klien. Untuk tutorial lengkap, lihat Gunakan kredensial temporary STS untuk mengakses OSS.
import { S3Client } from '@aws-sdk/client-s3';
// Ambil kredensial temporary STS dari server Anda.
async function getSTSCredentials() {
const response = await fetch('https://your-server.com/api/sts-token');
return await response.json();
}
// Inisialisasi klien S3 dengan kredensial temporary.
const client = new S3Client({
region: 'cn-hangzhou',
endpoint: 'https://s3.oss-cn-hangzhou.aliyuncs.com',
credentials: async () => {
const creds = await getSTSCredentials();
return {
accessKeyId: creds.accessKeyId,
secretAccessKey: creds.secretAccessKey,
sessionToken: creds.securityToken,
expiration: new Date(creds.expiration)
};
}
});Android
Aplikasi Android harus menggunakan kredensial temporary STS. Jangan pernah menyematkan AccessKey permanen dalam aplikasi klien. Server Anda memanggil AssumeRole untuk mendapatkan kredensial temporary dan mengembalikannya ke klien. Untuk tutorial lengkap, lihat Gunakan kredensial temporary STS untuk mengakses OSS.
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.BasicSessionCredentials;
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
// Implementasikan penyedia kredensial yang mengambil kredensial temporary STS dari server Anda.
public class OSSCredentialsProvider implements AWSCredentialsProvider {
@Override
public AWSCredentials getCredentials() {
// Ambil kredensial temporary STS dari server Anda,
// misalnya dengan mengirim permintaan ke https://your-server.com/api/sts-token.
String accessKeyId = fetchFromServer("accessKeyId");
String secretKeyId = fetchFromServer("secretKeyId");
String securityToken = fetchFromServer("securityToken");
return new BasicSessionCredentials(accessKeyId, secretKeyId, securityToken);
}
@Override
public void refresh() {
// Perbarui kredensial.
}
}
// Buat klien S3.
AmazonS3 s3Client = AmazonS3Client.builder()
.withCredentials(new OSSCredentialsProvider())
.withEndpointConfiguration(new EndpointConfiguration(
"https://s3.oss-cn-hangzhou.aliyuncs.com", ""))
.build();
// Kode aplikasi
s3Client.putObject("my-bucket", "test.txt", "Hello OSS");iOS
Aplikasi iOS harus menggunakan kredensial temporary STS. Jangan pernah menyematkan AccessKey permanen dalam aplikasi klien. Server Anda memanggil AssumeRole untuk mendapatkan kredensial temporary dan mengembalikannya ke klien. Untuk tutorial lengkap, lihat Gunakan kredensial temporary STS untuk mengakses OSS.
#import <AWSS3/AWSS3.h>
// Implementasikan penyedia kredensial.
@interface OSSCredentialsProvider : NSObject <AWSCredentialsProvider>
@end
@implementation OSSCredentialsProvider
- (AWSTask<AWSCredentials *> *)credentials {
return [[AWSTask taskWithResult:nil] continueWithBlock:^id(AWSTask *task) {
// Ambil kredensial temporary STS dari server Anda.
NSString *accessKey = [self fetchFromServer:@"accessKeyId"];
NSString *secretKey = [self fetchFromServer:@"secretKeyId"];
NSString *sessionToken = [self fetchFromServer:@"securityToken"];
AWSCredentials *credentials = [[AWSCredentials alloc]
initWithAccessKey:accessKey
secretKey:secretKey
sessionKey:sessionToken
expiration:[NSDate dateWithTimeIntervalSinceNow:3600]];
return [AWSTask taskWithResult:credentials];
}];
}
@end
// Konfigurasikan klien S3.
AWSEndpoint *endpoint = [[AWSEndpoint alloc] initWithURLString:@"https://s3.oss-cn-hangzhou.aliyuncs.com"];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc]
initWithRegion:AWSRegionUnknown
endpoint:endpoint
credentialsProvider:[[OSSCredentialsProvider alloc] init]];
[AWSS3 registerS3WithConfiguration:configuration forKey:@"OSS"];
AWSS3 *s3 = [AWSS3 S3ForKey:@"OSS"];
// Kode aplikasi
AWSS3PutObjectRequest *request = [AWSS3PutObjectRequest new];
request.bucket = @"my-bucket";
request.key = @"test.txt";
request.body = [@"Hello OSS" dataUsingEncoding:NSUTF8StringEncoding];
[[s3 putObject:request] continueWithBlock:^id(AWSTask *task) {
if (task.error) {
NSLog(@"Error: %@", task.error);
} else {
NSLog(@"Berhasil");
}
return nil;
}];FAQ
Kegagalan unggah: InvalidArgument: aws-chunked encoding is not supported
Gejala: Saat mengunggah file, Anda menerima error berikut:
InvalidArgument: aws-chunked encoding is not supported with the specified x-amz-content-sha256 valueAkar masalah:
Ini adalah masalah paling umum saat menggunakan AWS SDK untuk mengakses OSS. OSS mendukung algoritma AWS Signature V4 tetapi berbeda dalam enkode transfer:
AWS S3: Secara default menggunakan enkode chunked untuk mentransfer file besar.
OSS: Tidak mendukung enkode chunked untuk transfer.
Analisis penyebab:
Beberapa SDK mengaitkan implementasi Signature V4 mereka dengan enkode chunked:
Python (boto3): Implementasi Signature V4 memaksa penggunaan enkode chunked dan tidak dapat dinonaktifkan. Anda harus menggunakan Signature V2.
Java: Anda dapat menonaktifkan enkode chunked melalui konfigurasi.
Go/Node.js: Enkode chunked tidak digunakan secara default, sehingga tidak diperlukan penanganan khusus.
Solusi (berdasarkan SDK):
SDK | Solusi | Alasan |
Python (boto3) | Gunakan Signature V2: | Implementasi Signature V4 di boto3 terikat dengan enkode chunked dan tidak dapat dinonaktifkan. |
Java 1.x | Signature V4 + | Enkode chunked dapat dinonaktifkan. |
Java 2.x | Signature V4 + | Enkode chunked dapat dinonaktifkan. |
Go v1 | Signature V4 | Tidak menggunakan enkode chunked secara default. |
Go v2 | Signature V4; namun, API Manager mungkin menggunakan enkode chunked untuk unggah file besar. | Fitur Manager mungkin menggunakan enkode chunked. |
Node.js v3 | Signature V4 | Tidak menggunakan enkode chunked secara default. |
Contoh Python (sebelum dan sesudah):
# Konfigurasi salah (implementasi Signature V4 boto3 menggunakan enkode chunked)
s3 = boto3.client('s3',
endpoint_url='https://oss-cn-hongkong.aliyuncs.com',
config=Config(signature_version='v4'))
# Konfigurasi benar (boto3 menggunakan Signature V2)
s3 = boto3.client('s3',
endpoint_url='https://oss-cn-hongkong.aliyuncs.com',
config=Config(signature_version='s3')) # Signature V2 adalah solusi stabil untuk boto3.Detail teknis:
OSS Signature V4 mengikuti spesifikasi AWS Signature Version 4 tetapi dengan persyaratan berikut:
Header permintaan harus menyertakan
x-oss-content-sha256: UNSIGNED-PAYLOAD.Metode
Transfer-Encoding: chunkedtidak boleh digunakan.
Sebagian besar SDK dapat dikonfigurasi agar kompatibel. Namun, karena implementasi Signature V4 di boto3 sangat terikat dengan enkode chunked, Anda harus menggunakan Signature V2 dengan boto3.
Pemilihan SDK dan versi signature
Panduan pemilihan versi:
Bahasa | Versi SDK | Signature Version | Pertimbangan utama |
Python | Latest boto3 | V2 ( | Implementasi V4 boto3 tidak kompatibel dengan OSS. |
Java 1.x | Latest 1.x version | V4 | Enkode chunked harus dinonaktifkan. |
Java 2.x | Latest 2.x version | V4 | Enkode chunked harus dinonaktifkan. |
Node.js | v3 | V4 (default) | - |
Go v1 | Latest v1 version | V4 (default) | - |
Go v2 | Latest v2 version | V4 (default) | API Manager mungkin menggunakan enkode chunked untuk unggah file besar. |
Detail versi signature:
OSS Signature V4: OSS sepenuhnya mendukung algoritma AWS Signature V4.
Signature V2: Ini adalah kasus khusus untuk boto3, yang diperlukan karena keterbatasan implementasi SDK.
Kompatibilitas: Kecuali boto3, semua SDK lain dapat menggunakan Signature V4 untuk mengakses OSS.
Panduan pemilihan versi untuk proyek baru:
Skenario | Solusi yang direkomendasikan | Alasan |
Proyek Python baru | boto3 + Signature V2 | boto3 tidak mendukung Signature V4 untuk OSS. |
Proyek Java baru | Java 2.x + Signature V4 | Kinerja lebih baik. |
Proyek Node.js baru | v3 + Signature V4 | - |
Proyek Go baru | Go v1 + Signature V4 | Direkomendasikan |
Migrasi proyek yang sudah ada | Pertahankan versi SDK saat ini. | Meminimalkan risiko perubahan yang merusak. |
Error signature: SignatureDoesNotMatch
Anda mungkin mengalami error SignatureDoesNotMatch, yang menunjukkan bahwa signature yang dihitung oleh server tidak sesuai dengan signature klien.
Penyebab paling umum adalah menggunakan AccessKey AWS alih-alih AccessKey OSS. Kredensial akses AWS dan OSS merupakan sistem terpisah dan tidak dapat saling dipertukarkan. Periksa parameter seperti aws_access_key_id dan aws_secret_access_key dalam kode Anda untuk memastikan Anda menggunakan ID AccessKey dan Secret AccessKey yang dibuat di konsol OSS.
Penyebab kedua paling umum adalah ketidaksesuaian waktu (clock skew). Algoritma signature S3 menyertakan timestamp dalam signature. OSS menolak permintaan jika timestamp berbeda lebih dari 15 menit dari waktu server. Anda dapat menjalankan perintah date -u untuk memeriksa waktu UTC server. Jika waktunya tidak akurat, gunakan ntpdate atau layanan sinkronisasi waktu sistem Anda untuk memperbaikinya.
Penyebab ketiga adalah konfigurasi endpoint yang salah. Jika endpoint masih mengarah ke domain AWS, seperti s3.amazonaws.com, atau menggunakan wilayah OSS yang salah, perhitungan signature akan gagal. Format standar untuk endpoint OSS adalah https://oss-{region}.aliyuncs.com, di mana {region} harus sesuai dengan wilayah bucket, seperti oss-cn-hangzhou atau oss-cn-beijing.
Saat menggunakan boto3, ada penyebab spesifik lainnya: jika signature_version='s3' tidak dikonfigurasi, boto3 secara default menggunakan Signature V4, sehingga signature gagal. Konfigurasi boto3 yang benar mencakup parameter Config(signature_version='s3').
Cara sederhana untuk memverifikasi konfigurasi Anda adalah dengan menggunakan alat baris perintah ossutil. Jalankan ossutil ls oss://your-bucket --access-key-id <key> --access-key-secret <secret> --endpoint oss-cn-hangzhou.aliyuncs.com. Jika perintah ini berhasil menampilkan isi bucket, kredensial akses dan endpoint Anda benar, yang menunjukkan bahwa masalahnya ada pada konfigurasi kode Anda.
Error akses bucket
Error NoSuchBucket atau AccessDenied menunjukkan bahwa bucket yang ditentukan tidak dapat diakses. Penyebab paling umum adalah ketidaksesuaian antara endpoint dan wilayah bucket.
Setiap bucket OSS termasuk dalam wilayah tertentu, seperti cn-hangzhou atau cn-beijing. Saat mengakses bucket, endpoint harus sesuai dengan wilayah tempat bucket berada. Misalnya, jika bucket Anda berada di wilayah Hangzhou, endpoint harus oss-cn-hangzhou.aliyuncs.com. Anda tidak dapat menggunakan endpoint untuk wilayah Beijing, oss-cn-beijing.aliyuncs.com. Berbeda dengan AWS S3, OSS tidak mendukung akses lintas wilayah atau pengalihan otomatis. Jika Anda menggunakan endpoint yang salah, OSS akan mengembalikan error NoSuchBucket.
Penyebab kedua adalah izin RAM yang salah. Pastikan pengguna RAM yang terkait dengan AccessKey OSS Anda memiliki izin untuk mengakses bucket target. Di konsol RAM, pastikan pengguna telah diberikan izin yang diperlukan, seperti oss:ListObjects, oss:GetObject, dan oss:PutObject.
Penyebab ketiga adalah konvensi penamaan bucket. OSS mendukung dua gaya URL: gaya virtual-hosted (bucket-name.oss-cn-hangzhou.aliyuncs.com) dan gaya path (oss-cn-hangzhou.aliyuncs.com/bucket-name). Saat menggunakan gaya virtual-hosted, nama bucket harus mematuhi konvensi penamaan DNS dan tidak boleh mengandung garis bawah. Jika nama bucket Anda mengandung garis bawah, Anda harus mengonfigurasi SDK Anda untuk menggunakan akses gaya path atau membuat bucket baru dengan nama yang sesuai.
Optimasi kinerja
Mengunggah dan mengunduh file besar adalah tugas umum dalam penyimpanan objek. AWS SDK menyediakan beberapa fitur akselerasi transfer yang juga berfungsi dengan OSS.
Saat menggunakan Python boto3, Anda dapat mengonfigurasi parameter unggah multi-bagian dengan TransferConfig. Jika ukuran file melebihi ambang batas yang dikonfigurasi, boto3 secara otomatis membagi file menjadi bagian-bagian dan mengunggahnya secara paralel, yang dapat meningkatkan throughput secara signifikan. Parameter multipart_threshold mengontrol ambang batas ukuran file untuk mengaktifkan unggah multi-bagian, max_concurrency mengontrol jumlah thread unggah konkuren, dan multipart_chunksize mengontrol ukuran setiap bagian. Mengonfigurasi parameter ini dengan tepat dapat meningkatkan kecepatan unggah untuk file yang lebih besar dari 100 MB hingga beberapa kali lipat.
Saat menggunakan SDK Java, kelas TransferManager mengenkapsulasi fitur seperti unggah multi-bagian, transfer konkuren, dan pengulangan otomatis. TransferManager secara otomatis memilih strategi transfer optimal berdasarkan ukuran file, sehingga Anda tidak perlu mengelola logika bagian secara manual.
Saat menggunakan SDK Go, gunakan s3manager.Uploader alih-alih PutObject secara langsung. Uploader menyediakan unggah multi-bagian konkuren, secara otomatis membagi file besar dan mengulang unggah yang gagal.
Saat menggunakan SDK Node.js, Anda dapat menggunakan kelas Upload dari paket @aws-sdk/lib-storage. Kelas ini mendukung unggah streaming, yang memungkinkan unggah dimulai saat file sedang dibaca, sehingga mengurangi penggunaan memori.
Semua fitur akselerasi transfer ini didasarkan pada API S3 Multipart Upload, yang sepenuhnya didukung oleh OSS. Oleh karena itu, Anda dapat menggunakannya langsung dengan OSS.