All Products
Search
Document Center

Object Storage Service:Gunakan kredensial sementara dari STS untuk mengakses OSS

Last Updated:Mar 21, 2026

Layanan Token Keamanan (Security Token Service/STS) memungkinkan Anda memberikan akses berdurasi terbatas ke resource OSS tanpa mengekspos pasangan AccessKey permanen Anda. Saat kredensial sementara kedaluwarsa, akses akan secara otomatis dicabut.

Gunakan kredensial sementara berbasis STS ketika Anda perlu:

  • Memberikan pihak ketiga (seperti pemasok atau mitra) akses berdurasi terbatas ke bucket OSS Anda tanpa membagikan kredensial permanen Anda

  • Mengontrol izin secara dinamis — berikan hanya operasi spesifik yang dibutuhkan pihak ketiga, dan sesuaikan atau cabut akses seiring perubahan kebutuhan

  • Menghindari pengelolaan kredensial jangka panjang untuk pihak eksternal

OSS juga mendukung URL yang ditandatangani (presigned URLs) untuk akses sementara. Gunakan STS ketika Anda memerlukan kontrol izin berbasis role dan manajemen akses dinamis. Gunakan presigned URLs ketika Anda perlu membagikan objek tertentu melalui URL berdurasi terbatas.

Cara kerja

Alur ini melibatkan tiga pihak: perusahaan (pemilik Akun Alibaba Cloud), STS, dan pemasok (pihak ketiga).

Workflow diagram
  1. Perusahaan menyiapkan Pengguna RAM dan Peran RAM, lalu memberikan izin OSS yang diperlukan kepada peran tersebut.

  2. Pemasok meminta kredensial sementara dari server aplikasi perusahaan.

  3. Server aplikasi memanggil AssumeRole menggunakan kredensial Pengguna RAM untuk mendapatkan kredensial sementara dari STS.

  4. STS mengembalikan kredensial sementara — ID AccessKey, Rahasia AccessKey, dan token STS — beserta waktu kedaluwarsa.

  5. Pemasok menggunakan kredensial sementara tersebut untuk mengunggah data ke bucket OSS.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Langkah 1: Konfigurasi sisi perusahaan

Perusahaan melakukan penyiapan berikut satu kali untuk memungkinkan pemasok meminta kredensial sementara.

1.1 Buat Pengguna RAM

Pengguna RAM mewakili server aplikasi Anda — ia memanggil STS untuk menghasilkan kredensial sementara atas nama perusahaan.

  1. Masuk ke RAM consoleRAM consoleRAM consoleRAM consoleRAM console.

  2. Di panel navigasi kiri, pilih Identities > Users.

  3. Klik Create User.

  4. Tentukan Logon Name dan Display Name.

  5. Di bawah Access Mode, pilih Using permanent AccessKey to access, lalu klik OK.

  6. Lengkapi verifikasi keamanan sesuai permintaan.

  7. Salin ID AccessKey dan Rahasia AccessKey, lalu simpan dengan aman.

Penting

Rahasia AccessKey hanya ditampilkan sekali saat pembuatan. Unduh file CSV segera dan simpan di lokasi yang aman.

RAM user creation screenshot

1.2 Berikan izin kepada Pengguna RAM untuk memanggil AssumeRole

  1. Di RAM console, pilih Identities > Users.

  2. Temukan Pengguna RAM yang telah Anda buat dan klik Add Permissions di kolom Actions.

  3. Di panel Grant permissions, pilih kebijakan AliyunSTSAssumeRoleAccess.

  4. Klik Grant permissions.

AliyunSTSAssumeRoleAccess hanya mengizinkan Pengguna RAM untuk memanggil AssumeRole. Kebijakan ini tidak memberikan akses OSS — akses tersebut berasal dari Peran RAM yang akan Anda buat selanjutnya.
AliyunSTSAssumeRoleAccess policy screenshot

1.3 Buat Peran RAM

Peran RAM menentukan apa yang dapat dilakukan oleh kredensial sementara. Kredensial sementara pemasok mewarisi izin dari peran tersebut.

  1. Di RAM console, pilih Identities > Roles.

  2. Klik Create Role.

  3. Atur Principal Type menjadi Cloud Account dan Principal Name menjadi Current Account, lalu klik OK.

    RAM role creation screenshot

  4. Di dialog Create Role, tentukan nama peran dan klik OK.

  5. Di halaman detail peran, klik Copy di samping bidang ARN pada bagian Basic Information. Simpan ARN tersebut — Anda akan membutuhkannya saat memanggil AssumeRole.

    Role ARN screenshot

1.4 Berikan izin unggah OSS kepada Peran RAM

Lampirkan kebijakan ke Peran RAM yang hanya memberikan izin yang dibutuhkan pemasok.

Create a custom policy:

  1. Di RAM console, pilih Permissions > Policies.

  2. Klik Create Policy.

  3. Klik JSON dan masukkan kebijakan berikut, yang mengizinkan pengunggahan objek ke bucket tertentu:

    Peringatan

    Contoh ini memberikan akses unggah luas ke seluruh bucket. Untuk penggunaan produksi, batasi Resource ke direktori tertentu. Lihat Contoh umum kebijakan RAM.

    oss:PutObject mencakup unggah simple, unggah form, unggah append, unggah multi-bagian, dan unggah yang dapat dilanjutkan. Untuk operasi lainnya, lihat Elemen Action dalam kebijakan RAM untuk OSS.
       {
           "Version": "1",
           "Statement": [
            {
                   "Effect": "Allow",
                   "Action": [
                     "oss:PutObject"
                   ],
                   "Resource": [
                     "acs:oss:*:*:examplebucket/*"
                   ]
             }
           ]
       }
  4. Klik OK. Di dialog tersebut, masukkan nama kebijakan (misalnya, RamTestPolicy), lalu klik OK.

Lampirkan kebijakan ke Peran RAM:

  1. Di RAM console, pilih Identities > Roles.

  2. Temukan peran RamOssTest, lalu klik Grant Permission pada kolom Tindakan.

  3. Di bagian Policy, pilih Custom Policy dari dropdown jenis, lalu pilih RamTestPolicy.

  4. Klik Grant permissions.

1.5 Hasilkan kredensial sementara

Server aplikasi memanggil AssumeRole menggunakan pasangan AccessKey Pengguna RAM (dari langkah 1.1) untuk mendapatkan kredensial sementara dari STS.

Penting

Gunakan pasangan AccessKey Pengguna RAM — bukan kredensial Akun Alibaba Cloud. Memanggil STS dengan kredensial Akun Alibaba Cloud akan gagal.

Semua contoh di bawah membaca kredensial dari variabel lingkungan dan menggunakan ARN Peran RAM dari langkah 1.3. Kredensial yang dikembalikan mencakup ID AccessKey (diawali dengan STS.), Rahasia AccessKey, token STS, dan waktu kedaluwarsa.

Contoh respons:

{
  "AccessKeyId": "STS.****************",
  "AccessKeySecret": "3dZn*******************************************",
  "SecurityToken": "CAIS*****************************************************************************************************************************************",
  "Expiration": "2024-**-*****:**:50Z"
}
Waktu kedaluwarsa dalam UTC. Misalnya, 2024-04-18T11:33:40Z berarti 18 April 2024 pukul 19:33:40 (UTC+8).
Akun Alibaba Cloud, bersama Pengguna RAM dan Peran RAM-nya, dapat mengirim hingga 100 permintaan per detik (RPS) ke STS. Dalam skenario konkurensi tinggi, gunakan kembali kredensial hingga kedaluwarsa alih-alih meminta kredensial baru untuk setiap operasi.

Periode validitas:

SkenarioMinimumMaksimum
Durasi sesi maksimum peran default (3.600 detik)900 detik3.600 detik
Durasi sesi maksimum peran kustom900 detikHingga 43.200 detik

Tentukan periode validitas yang cukup panjang untuk operasi Anda. Untuk mengunggah file besar atau menjalankan tugas yang memakan waktu, gunakan durasi yang lebih lama agar kredensial tidak perlu direfresh di tengah operasi.

Java

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;

public class StsServiceSample {
    public static void main(String[] args) {
        // Titik akhir STS — gunakan yang berada di wilayah yang sama dengan server aplikasi Anda untuk respons lebih cepat
        String endpoint = "sts.cn-hangzhou.aliyuncs.com";
        // Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
        String accessKeyId = System.getenv("ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("ACCESS_KEY_SECRET");
        // Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
        String roleArn = System.getenv("RAM_ROLE_ARN");
        // Label untuk mengidentifikasi sesi ini — berguna untuk auditing
        String roleSessionName = "yourRoleSessionName";
        // null berarti kredensial sementara mewarisi semua izin peran
        String policy = null;
        // Periode validitas dalam detik (min: 900, maks: durasi sesi maksimum peran, maks default: 3.600)
        Long durationSeconds = 3600L;

        try {
            String regionId = "";
            // Untuk STS SDK for Java V3.12.0 dan yang lebih baru:
            DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
            // Untuk STS SDK for Java sebelum V3.12.0:
            // DefaultProfile.addEndpoint("", regionId, "Sts", endpoint);

            IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(profile);

            final AssumeRoleRequest request = new AssumeRoleRequest();
            // Untuk STS SDK for Java V3.12.0 dan yang lebih baru:
            request.setSysMethod(MethodType.POST);
            // Untuk STS SDK for Java sebelum V3.12.0:
            // request.setMethod(MethodType.POST);
            request.setRoleArn(roleArn);
            request.setRoleSessionName(roleSessionName);
            request.setPolicy(policy);
            request.setDurationSeconds(durationSeconds);

            final AssumeRoleResponse response = client.getAcsResponse(request);
            System.out.println("Expiration: " + response.getCredentials().getExpiration());
            System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
            System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
            System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
            System.out.println("RequestId: " + response.getRequestId());
        } catch (ClientException e) {
            System.out.println("Failed: ");
            System.out.println("Error code: " + e.getErrCode());
            System.out.println("Error message: " + e.getErrMsg());
            System.out.println("RequestId: " + e.getRequestId());
        }
    }
}

Python

# -*- coding: utf-8 -*-
from aliyunsdkcore import client
from aliyunsdkcore.request import CommonRequest
import json
import oss2
import os

# Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
access_key_id = os.getenv("ACCESS_KEY_ID")
access_key_secret = os.getenv("ACCESS_KEY_SECRET")
# Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
role_arn = os.getenv("RAM_ROLE_ARN")

clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')
request = CommonRequest(product="Sts", version='2015-04-01', action_name='AssumeRole')
request.set_method('POST')
request.set_protocol_type('https')
request.add_query_param('RoleArn', role_arn)
# Label untuk mengidentifikasi sesi ini
request.add_query_param('RoleSessionName', 'sessiontest')
# Periode validitas: 3.600 detik
request.add_query_param('DurationSeconds', '3600')
request.set_accept_format('JSON')

body = clt.do_action_with_exception(request)

token = json.loads(oss2.to_unicode(body))
print('AccessKeyId: ' + token['Credentials']['AccessKeyId'])
print('AccessKeySecret: ' + token['Credentials']['AccessKeySecret'])
print('SecurityToken: ' + token['Credentials']['SecurityToken'])
print('Expiration: ' + token['Credentials']['Expiration'])

Node.js

const { STS } = require('ali-oss');
const express = require("express");
const app = express();

app.get('/sts', (req, res) => {
  let sts = new STS({
    // Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
    accessKeyId: process.env.ACCESS_KEY_ID,
    accessKeySecret: process.env.ACCESS_KEY_SECRET
  });
  // Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
  // Argumen kedua adalah kebijakan inline opsional untuk membatasi izin lebih lanjut
  // Periode validitas: 3.600 detik (min: 900)
  // Label untuk mengidentifikasi sesi ini
  sts.assumeRole(process.env.RAM_ROLE_ARN, ``, '3600', 'sessiontest').then((result) => {
    console.log(result);
    res.set('Access-Control-Allow-Origin', '*');
    res.set('Access-Control-Allow-METHOD', 'GET');
    res.json({
      AccessKeyId: result.credentials.AccessKeyId,
      AccessKeySecret: result.credentials.AccessKeySecret,
      SecurityToken: result.credentials.SecurityToken,
      Expiration: result.credentials.Expiration
    });
  }).catch((err) => {
    console.log(err);
    res.status(400).json(err.message);
  });
});

app.listen(8000, () => {
  console.log("server listen on:8000")
})

Go

package main

import (
    "fmt"
    "os"

    openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    sts20150401 "github.com/alibabacloud-go/sts-20150401/v2/client"
    util "github.com/alibabacloud-go/tea-utils/v2/service"
    "github.com/alibabacloud-go/tea/tea"
)

func main() {
    // Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
    accessKeyId := os.Getenv("ACCESS_KEY_ID")
    accessKeySecret := os.Getenv("ACCESS_KEY_SECRET")
    // Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
    roleArn := os.Getenv("RAM_ROLE_ARN")

    config := &openapi.Config{
        AccessKeyId:     tea.String(accessKeyId),
        AccessKeySecret: tea.String(accessKeySecret),
    }
    // Titik akhir STS — lihat https://api.alibabacloud.com/product/Sts untuk semua titik akhir
    config.Endpoint = tea.String("sts.cn-hangzhou.aliyuncs.com")
    client, err := sts20150401.NewClient(config)
    if err != nil {
        fmt.Printf("Failed to create client: %v\n", err)
        return
    }

    request := &sts20150401.AssumeRoleRequest{
        // Periode validitas: 3.600 detik
        DurationSeconds: tea.Int64(3600),
        RoleArn:         tea.String(roleArn),
        // Label untuk mengidentifikasi sesi ini
        RoleSessionName: tea.String("examplename"),
    }
    response, err := client.AssumeRoleWithOptions(request, &util.RuntimeOptions{})
    if err != nil {
        fmt.Printf("Failed to assume role: %v\n", err)
        return
    }

    credentials := response.Body.Credentials
    fmt.Println("AccessKeyId: " + tea.StringValue(credentials.AccessKeyId))
    fmt.Println("AccessKeySecret: " + tea.StringValue(credentials.AccessKeySecret))
    fmt.Println("SecurityToken: " + tea.StringValue(credentials.SecurityToken))
    fmt.Println("Expiration: " + tea.StringValue(credentials.Expiration))
}

php

<?php
require __DIR__ . '/vendor/autoload.php';

use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
use AlibabaCloud\Sts\Sts;

// Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
$accessKeyId = getenv("ACCESS_KEY_ID");
$accessKeySecret = getenv("ACCESS_KEY_SECRET");
// Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
$roleArn = getenv("RAM_ROLE_ARN");

AlibabaCloud::accessKeyClient($accessKeyId, $accessKeySecret)
    ->regionId('cn-hangzhou')
    ->asDefaultClient();

try {
    $result = Sts::v20150401()
        ->assumeRole()
        ->withRoleArn($roleArn)
        // Label untuk mengidentifikasi sesi ini
        ->withRoleSessionName('sessiontest')
        // Periode validitas: 3.600 detik
        ->withDurationSeconds(3600)
        ->request();

    $credentials = $result['Credentials'];
    echo 'AccessKeyId: ' . $credentials['AccessKeyId'] . PHP_EOL;
    echo 'AccessKeySecret: ' . $credentials['AccessKeySecret'] . PHP_EOL;
    echo 'SecurityToken: ' . $credentials['SecurityToken'] . PHP_EOL;
    echo 'Expiration: ' . $credentials['Expiration'] . PHP_EOL;
} catch (ClientException $e) {
    echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
    echo $e->getErrorMessage() . PHP_EOL;
}

Ruby

require 'sinatra'
require 'base64'
require 'open-uri'
require 'cgi'
require 'openssl'
require 'json'
require 'sinatra/reloader'
require 'sinatra/content_for'
require 'aliyunsdkcore'

set :public_folder, File.dirname(__FILE__) + '/templates'

def get_sts_token_for_oss_upload()
  client = RPCClient.new(
    // Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
    access_key_id: ENV['ACCESS_KEY_ID'],
    access_key_secret: ENV['ACCESS_KEY_SECRET'],
    endpoint: 'https://sts.cn-hangzhou.aliyuncs.com',
    api_version: '2015-04-01'
  )
  response = client.request(
    action: 'AssumeRole',
    params: {
      // Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
      "RoleArn": ENV['RAM_ROLE_ARN'],
      // Periode validitas: 3.600 detik
      "DurationSeconds": 3600,
      // Label untuk mengidentifikasi sesi ini
      "RoleSessionName": "sessiontest"
    },
    opts: {
      method: 'POST',
      format_params: true
    }
  )
end

$server_ip = "127.0.0.1"  // Untuk mendengarkan alamat IP lain, terapkan autentikasi di sisi server
$server_port = 8000

if ARGV.length == 1
  $server_port = ARGV[0]
elsif ARGV.length == 2
  $server_ip = ARGV[0]
  $server_port = ARGV[1]
end

puts "App server is running on: http://#{$server_ip}:#{$server_port}"

set :bind, $server_ip
set :port, $server_port

get '/get_sts_token_for_oss_upload' do
  token = get_sts_token_for_oss_upload()
  response = {
    "AccessKeyId" => token["Credentials"]["AccessKeyId"],
    "AccessKeySecret" => token["Credentials"]["AccessKeySecret"],
    "SecurityToken" => token["Credentials"]["SecurityToken"],
    "Expiration" => token["Credentials"]["Expiration"]
  }
  response.to_json
end

get '/*' do
  puts "********************* GET "
  send_file File.join(settings.public_folder, 'index.html')
end

Untuk bahasa lainnya, lihat Ikhtisar STS SDK.

Izin tingkat granularitas tinggi (opsional)

Secara default, kredensial sementara memiliki semua izin dari Peran RAM. Untuk membatasinya lebih lanjut — misalnya, hanya mengizinkan unggah ke direktori tertentu — berikan kebijakan inline dalam permintaan AssumeRole. Izin akhir merupakan irisan antara izin peran dan kebijakan inline.

// Kebijakan ini membatasi kredensial sementara hanya untuk mengunggah objek ke direktori src/.
// Izin akhir = izin peran (langkah 1.4) irisan kebijakan inline ini
String policy = "{\n" +
                "    \"Version\": \"1\", \n" +
                "    \"Statement\": [\n" +
                "        {\n" +
                "            \"Action\": [\n" +
                "                \"oss:PutObject\"\n" +
                "            ], \n" +
                "            \"Resource\": [\n" +
                "                \"acs:oss:*:*:examplebucket/src/*\" \n" +
                "            ], \n" +
                "            \"Effect\": \"Allow\"\n" +
                "        }\n" +
                "    ]\n" +
                "}";

Langkah 2: Unggah data menggunakan kredensial sementara

Penting

Mulai 20 Maret 2025, pengguna OSS baru harus menggunakan nama domain kustom (CNAME) untuk melakukan operasi API data pada bucket OSS di wilayah Tiongkok Daratan. Titik akhir publik default dibatasi untuk operasi ini. Lihat pengumuman resmi untuk daftar lengkap operasi yang terdampak. Jika Anda mengakses data melalui HTTPS, ikat Sertifikat SSL yang valid ke domain kustom Anda — ini wajib untuk akses Konsol OSS.

Inisialisasi klien OSS dengan kredensial sementara (ID AccessKey, Rahasia AccessKey, dan token STS) dari langkah 1.5. ID AccessKey sementara diawali dengan STS..

Untuk bahasa lainnya, lihat Ikhtisar.

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;

public class Demo {
    public static void main(String[] args) throws Exception {
        // Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial Pengguna RAM
        // ID AccessKey sementara diawali dengan STS.
        String accessKeyId = "yourSTSAccessKeyID";
        String accessKeySecret = "yourSTSAccessKeySecret";
        String stsToken = "yourSecurityToken";

        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Gunakan signature V4
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);

        OSS ossClient = OSSClientBuilder.create()
                // Titik akhir wilayah tempat bucket berada, misalnya, https://oss-cn-hangzhou.aliyuncs.com
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                // ID wilayah, misalnya, cn-hangzhou
                .region("region")
                .build();

        try {
            // Unggah exampletest.txt ke examplebucket
            PutObjectRequest putObjectRequest = new PutObjectRequest(
                "examplebucket",
                "exampletest.txt",
                new File("D:\\localpath\\exampletest.txt")
            );
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Kesalahan OSS — permintaan mencapai OSS tetapi ditolak:");
            System.out.println("Pesan Kesalahan: " + oe.getErrorMessage());
            System.out.println("Kode Kesalahan: " + oe.getErrorCode());
            System.out.println("ID Permintaan: " + oe.getRequestId());
            System.out.println("ID Host: " + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Kesalahan klien — tidak dapat mencapai OSS:");
            System.out.println("Pesan Kesalahan: " + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Python

OSS SDK untuk Python tersedia dalam dua versi. Versi 2.0 merupakan penulisan ulang lengkap dari 1.0 dengan autentikasi yang disederhanakan, logika retry, dan penanganan kesalahan, serta opsi konfigurasi yang lebih fleksibel.

Contoh V2

import alibabacloud_oss_v2 as oss

def main():
    // Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial Pengguna RAM
    // ID AccessKey sementara diawali dengan STS.
    sts_access_key_id = 'yourSTSAccessKeyID'
    sts_access_key_secret = 'yourSTSAccessKeySecret'
    sts_security_token = 'yourSecurityToken'

    credentials_provider = oss.credentials.StaticCredentialsProvider(
        access_key_id=sts_access_key_id,
        access_key_secret=sts_access_key_secret,
        security_token=sts_security_token,
    )

    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    // Wilayah tempat bucket berada, misalnya, cn-hangzhou
    cfg.region = 'cn-hangzhou'

    client = oss.Client(cfg)

    // Unggah file lokal ke examplebucket
    local_file_path = 'D:\\localpath\\exampletest.txt'
    with open(local_file_path, 'rb') as file:
        data = file.read()

    result = client.put_object(oss.PutObjectRequest(
        bucket='examplebucket',
        key='exampletest.txt',
        body=data,
    ))

    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' content md5: {result.content_md5},'
          f' etag: {result.etag},'
          f' hash crc64: {result.hash_crc64},'
          f' version id: {result.version_id},'
    )

if __name__ == "__main__":
    main()

Contoh V1

# -*- coding: utf-8 -*-
import oss2

# Titik akhir wilayah tempat bucket berada, misalnya https://oss-cn-hangzhou.aliyuncs.com
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial pengguna RAM
sts_access_key_id = 'yourAccessKeyId'
sts_access_key_secret = 'yourAccessKeySecret'
bucket_name = 'examplebucket'
object_name = 'examplebt.txt'
security_token = 'yourSecurityToken'

auth = oss2.StsAuth(sts_access_key_id, sts_access_key_secret, security_token)
bucket = oss2.Bucket(auth, endpoint, bucket_name)
result = bucket.put_object(object_name, "hello world")
print(result.status)

Go

OSS SDK untuk Go tersedia dalam dua versi. Versi 2.0 merupakan penulisan ulang lengkap dari 1.0 dengan autentikasi yang disederhanakan, logika retry, dan penanganan kesalahan, serta opsi konfigurasi yang lebih fleksibel.

Contoh V2

package main

import (
	"context"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	// Wilayah tempat bucket berada, misalnya, cn-hangzhou
	region := "cn-hangzhou"

	// Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial Pengguna RAM
	// ID AccessKey sementara diawali dengan STS.
	accessKeyID := "yourSTSAccessKeyID"
	accessKeySecret := "yourSTSAccessKeySecret"
	stsToken := "yourSecurityToken"

	provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret, stsToken)

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(provider).
		WithRegion(region)

	client := oss.NewClient(cfg)

	localFile := "D:\\localpath\\exampletest.txt"

	putRequest := &oss.PutObjectRequest{
		Bucket:       oss.Ptr("examplebucket"),
		Key:          oss.Ptr("exampletest.txt"),
		StorageClass: oss.StorageClassStandard,
		Acl:          oss.ObjectACLPrivate,
		Metadata: map[string]string{
			"yourMetadataKey1": "yourMetadataValue1",
		},
	}

	result, err := client.PutObjectFromFile(context.TODO(), putRequest, localFile)
	if err != nil {
		log.Fatalf("failed to put object from file %v", err)
	}
	log.Printf("put object from file result:%#v\n", result)
}

Contoh V1

package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)

func main() {
    // Baca kredensial sementara dari variabel lingkungan
    // Atur OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, dan OSS_SESSION_TOKEN sebelum menjalankan
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    // Titik akhir wilayah tempat bucket berada, misalnya, https://oss-cn-hangzhou.aliyuncs.com
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    bucketName := "examplebucket"
    objectName := "exampledir/exampleobject.txt"
    filepath := "D:\\localpath\\examplefile.txt"

    bucket, err := client.Bucket(bucketName)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    err = bucket.PutObjectFromFile(objectName, filepath)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    fmt.Println("upload success")
}

Node.js

Contoh ini memerlukan Axios.
const axios = require("axios");
const OSS = require("ali-oss");

const getToken = async () => {
  // Ambil kredensial sementara dari server aplikasi (menjalankan langkah 1.5)
  await axios.get("http://localhost:8000/sts").then((token) => {
    const client = new OSS({
      // Wilayah tempat bucket berada, misalnya, oss-cn-hangzhou
      region: 'oss-cn-hangzhou',
      // Gunakan kredensial sementara dari langkah 1.5
      accessKeyId: token.data.AccessKeyId,
      accessKeySecret: token.data.AccessKeySecret,
      stsToken: token.data.SecurityToken,
      authorizationV4: true,
      bucket: "examplebucket",
      // Secara otomatis refresh kredensial sebelum kedaluwarsa
      refreshSTSToken: async () => {
        const refreshToken = await axios.get("http://localhost:8000/sts");
        return {
          accessKeyId: refreshToken.data.AccessKeyId,
          accessKeySecret: refreshToken.data.AccessKeySecret,
          stsToken: refreshToken.data.SecurityToken,
        };
      },
    });
    // Unggah objek menggunakan kredensial sementara
    client.put('exampleobject.jpg', 'D:\\example.jpg')
      .then((res) => { console.log(res) })
      .catch(e => console.log(e))
  });
};
getToken()

php

<?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\StaticCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;

try {
    // Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial Pengguna RAM
    // ID AccessKey sementara diawali dengan STS.
    $accessKeyId = 'yourSTSAccessKeyID';
    $accessKeySecret = 'yourSTSAccessKeySecret';
    $securityToken = 'yourSecurityToken';

    $provider = new StaticCredentialsProvider($accessKeyId, $accessKeySecret, $securityToken);

    // Titik akhir wilayah tempat bucket berada, misalnya, https://oss-cn-hangzhou.aliyuncs.com
    $endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    $bucket = "examplebucket";
    $object = "exampletest.txt";
    $localFilePath = "D:\\localpath\\exampletest.txt";

    $options = array(
        OssClient::OSS_HEADERS => array(
            'x-oss-object-acl' => 'private',
            'x-oss-meta-info' => 'yourinfo'
        ),
    );

    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        // Wilayah tempat bucket berada, misalnya, cn-hangzhou
        "region" => "cn-hangzhou"
    );

    $ossClient = new OssClient($config);
    $ossClient->putObject($bucket, $object, $localFilePath, $options);
} catch (OssException $e) {
    printf($e->getMessage() . "\n");
    return;
}

Ruby

require 'aliyun/sts'
require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  // Titik akhir wilayah tempat bucket berada, misalnya, https://oss-cn-hangzhou.aliyuncs.com
  endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
  // Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial Pengguna RAM
  access_key_id: 'token.access_key_id',
  access_key_secret: 'token.access_key_secret',
  sts_token: 'token.security_token'
)
bucket = client.get_bucket('examplebucket')
bucket.put_object('exampleobject.txt', :file => 'D:\test.txt')
Penting

Karena 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 Tiongkok Daratan. Titik akhir publik default dibatasi untuk operasi ini. 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.

FAQ

"You are not authorized to do this action. You should be authorized by RAM"

Di langkah 1.5, pastikan Anda menggunakan pasangan AccessKey Pengguna RAM (dari langkah 1.1), bukan kredensial Akun Alibaba Cloud.

"The Min/Max value of DurationSeconds is 15min/1hr"

Periode validitas berada di luar rentang yang diizinkan. Minimum selalu 900 detik. Maksimum bergantung pada pengaturan durasi sesi maksimum peran:

  • Durasi sesi maksimum default (3.600 detik): periode validitas maksimum adalah 3.600 detik

  • Durasi sesi maksimum kustom: periode validitas maksimum sama dengan nilai kustom (hingga 43.200 detik)

Periksa durasi sesi maksimum peran di RAM console. Lihat Melihat informasi tentang Peran RAM.

"The security token you provided is invalid"

Pastikan Anda menggunakan token STS yang dikembalikan di langkah 1.5.

"The OSS Access Key Id you provided does not exist in our records"

Kredensial sementara telah kedaluwarsa. Minta kredensial baru dari server aplikasi (langkah 1.5).

"AccessDenied: Anonymous access is forbidden for this operation"

Anda menggunakan pasangan AccessKey Akun Alibaba Cloud alih-alih Pengguna RAM (langkah 1.1) saat meminta kredensial sementara di langkah 1.5.

NoSuchBucket

Bucket yang ditentukan tidak ada. Verifikasi bahwa nama bucket benar.

"You have no right to access this object because of bucket acl"

Kebijakan RAM tidak dikonfigurasi dengan benar. Periksa bahwa elemen Action mencakup operasi yang Anda butuhkan dan elemen Resource mengarah ke bucket dan path yang benar. Lihat Kebijakan RAM dan Elemen Action dalam kebijakan RAM untuk OSS.

"Access denied by authorizer's policy"

Kredensial sementara tidak memiliki izin yang cukup. Hal ini terjadi ketika kebijakan inline yang diberikan ke AssumeRole (langkah 1.5) lebih membatasi daripada yang dibutuhkan.

Izin akhir kredensial sementara merupakan irisan antara izin Peran RAM (langkah 1.4) dan kebijakan inline (langkah 1.5). Dua contoh:

  • Jika peran memiliki izin A dan Anda memberikan kebijakan inline dengan izin B, izin akhir adalah A irisan B.

    Permissions intersection example 1

  • Jika B merupakan subset dari A (kebijakan inline merupakan subset dari izin peran), izin akhir adalah B.

    Permissions intersection example 2

Jika Anda tidak memberikan kebijakan inline, kredensial sementara memiliki semua izin peran.

"The bucket you are attempting to access must be addressed using the specified endpoint"

Titik akhir di langkah 2 tidak sesuai dengan wilayah bucket. Gunakan titik akhir untuk wilayah tempat bucket berada. Lihat Wilayah dan titik akhir.

Can I hold multiple sets of temporary credentials at the same time?

Ya. Setiap panggilan AssumeRole mengembalikan satu set kredensial terpisah. Beberapa set dapat aktif secara bersamaan dalam periode validitasnya masing-masing.

Time format error

Salah satu kemungkinan penyebabnya adalah spasi tambahan dalam nilai parameter Timestamp. Gunakan format ISO 8601: yyyy-MM-ddTHH:mm:ssZ. Misalnya, 2014-05-26T12:00:00Z merepresentasikan 26 Mei 2014 pukul 20:00:00 (UTC+8).

Error 0003-0000301

Kredensial sementara tidak memiliki izin yang diperlukan. Ikuti panduan troubleshooting 0003-00000301.

Langkah selanjutnya

Referensi