All Products
Search
Document Center

Object Storage Service:Mengakses OSS dengan AWS SDK

Last Updated:Apr 22, 2026

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, seperti cn-hangzhou. Untuk daftar lengkap wilayah, lihat Wilayah dan titik akhir.

    Jenis

    Format

    Titik akhir publik

    https://s3.oss-{region}.aliyuncs.com

    Titik akhir internal

    https://s3.oss-{region}-internal.aliyuncs.com

    Titik akhir percepatan transfer

    https://s3.oss-accelerate.aliyuncs.com

    Penting

    Karena 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 value

Akar 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: signature_version='s3'

Implementasi Signature V4 di boto3 terikat dengan enkode chunked dan tidak dapat dinonaktifkan.

Java 1.x

Signature V4 + .withChunkedEncodingDisabled(true)

Enkode chunked dapat dinonaktifkan.

Java 2.x

Signature V4 + .chunkedEncodingEnabled(false)

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: chunked tidak 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 (s3)

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.