All Products
Search
Document Center

Object Storage Service:OSS Go SDK V1

Last Updated:Jun 18, 2026

Kami merekomendasikan OSS Go SDK V2 yang lebih baru (alibabacloud-oss-go-sdk-v2), yang menawarkan peningkatan arsitektur signifikan dibandingkan V1 (aliyun-oss-go-sdk). V2 menyederhanakan verifikasi identitas, pengulangan permintaan, dan penanganan error, serta menambahkan antarmuka lanjutan seperti paginator, transfer manager, dan antarmuka berbasis file. Untuk melakukan upgrade, lihat Panduan Migrasi Go SDK V1 ke V2.

Integrasi cepat

Lengkapi langkah-langkah berikut untuk mengintegrasikan OSS Go SDK V1.

Siapkan lingkungan

Unduh dan instal lingkungan build dan runtime Go. Untuk informasi selengkapnya, lihat Install Go. Gunakan Go 1.13 atau versi yang lebih baru.

  • Go 1.13 dan versi yang lebih baru mengaktifkan mode modul secara default untuk mengelola dependensi paket. Anda tidak perlu mengatur GOPATH secara manual.

  • Untuk Go 1.12 dan versi yang lebih lama, Anda harus mengatur variabel lingkungan sistem GOPATH dan mengarahkannya ke direktori kode Anda.

Anda dapat menjalankan perintah go version untuk melihat versi Go.

Instal SDK

Pilih metode instalasi berdasarkan lingkungan pengembangan Anda. Kami merekomendasikan menggunakan versi SDK terbaru.

go mod (Direkomendasikan)

Tambahkan dependensi berikut ke file go.mod. Contoh ini menggunakan versi 3.0.2. Gantilah dengan versi yang Anda butuhkan.

require (
    github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
)

Dari kode sumber

Jalankan perintah berikut untuk menginstal SDK:

go get github.com/aliyun/aliyun-oss-go-sdk/oss

Proses instalasi tidak menampilkan prompt apa pun. Jika instalasi timeout, jalankan perintah tersebut lagi.

Konfigurasi kredensial akses

Konfigurasikan kredensial akses dengan Pasangan Kunci Akses Pengguna RAM.

  1. Di Konsol RAM, buat Pengguna RAM dengan Permanent AccessKey Pair. Simpan pasangan AccessKey dan berikan izin AliyunOSSFullAccess kepada pengguna tersebut.

  2. Gunakan pasangan AccessKey Pengguna RAM untuk mengonfigurasi variabel lingkungan.

    Linux

    1. Jalankan perintah berikut di antarmuka baris perintah untuk menambahkan pengaturan variabel lingkungan ke file ~/.bashrc .

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. Jalankan perintah berikut untuk menerapkan perubahan.

      source ~/.bashrc
    3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. Jalankan perintah berikut di terminal untuk melihat jenis shell default.

      echo $SHELL
    2. Lakukan operasi berikut berdasarkan jenis shell default.

      Zsh
      1. Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file ~/.zshrc.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. Jalankan perintah berikut untuk menerapkan perubahan.

        source ~/.zshrc
      3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
      Bash
      1. Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file ~/.bash_profile.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. Jalankan perintah berikut untuk menerapkan perubahan.

        source ~/.bash_profile
      3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD
    1. Jalankan perintah berikut di CMD.

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%
    PowerShell
    1. Jalankan perintah berikut di PowerShell.

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)

Inisialisasi klien

Kode contoh berikut menginisialisasi klien menggunakan titik akhir publik wilayah Tiongkok (Hangzhou) dan mencantumkan bucket di bawah akun saat ini. Untuk daftar lengkap wilayah dan titik akhir, lihat Wilayah dan titik akhir.

package main

// Contoh kode untuk menginisialisasi klien di OSS Go SDK V1

import (
	"fmt"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {

	// Muat kredensial akses dari variabel lingkungan. Anda harus mengatur OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET.
	provider, _ := oss.NewEnvironmentVariableCredentialsProvider()

	// Buat instans klien OSS.
	client, _ := oss.New(
		"oss-cn-hangzhou.aliyuncs.com", // Titik akhir publik Tiongkok (Hangzhou) digunakan sebagai contoh.
		"",
		"",
		oss.SetCredentialsProvider(&provider),
		oss.AuthVersion(oss.AuthV4),
		oss.Region("cn-hangzhou"),
	)

	// Cantumkan semua bucket.
	buckets, err := client.ListBuckets()
	if err != nil {
		fmt.Printf("Gagal mencantumkan bucket: %v\n", err)
		return
	}

	// Cetak daftar bucket.
	fmt.Printf("Ditemukan %d bucket:\n", len(buckets.Buckets))

	for _, bucket := range buckets.Buckets {
		fmt.Printf("%s\n", bucket.Name)
	}
}

Konfigurasi klien

Saat menginisialisasi klien, Anda dapat menyesuaikan parameter seperti jenis titik akhir, periode timeout, dan ukuran kolam koneksi sesuai dengan kebutuhan jaringan dan performa Anda.

Klik untuk melihat parameter klien yang dapat dikonfigurasi

Parameter

Deskripsi

Metode

MaxIdleConns

Jumlah maksimum koneksi idle. Nilai default: 100.

oss.MaxConns

MaxIdleConnsPerHost

Jumlah maksimum koneksi idle per host. Nilai default: 100.

oss.MaxConns

MaxConnsPerHost

Jumlah maksimum koneksi per host. Nilai default: kosong.

oss.MaxConns

ConnectTimeout

Periode timeout koneksi HTTP dalam detik. Nilai default: 10. Nilai 0 berarti tanpa timeout.

oss.Timeout

ReadWriteTimeout

Periode timeout baca/tulis HTTP dalam detik. Nilai default: 20. Nilai 0 berarti tanpa timeout.

oss.Timeout

IsCname

Menentukan apakah akan menggunakan nama domain kustom sebagai titik akhir. Nilai default adalah false.

oss.UseCname

UserAgent

Header User-Agent untuk permintaan HTTP. Nilai default: aliyun-sdk-go.

oss.UserAgent

ProxyHost

Menentukan apakah akan mengaktifkan alamat host dan port server proxy. Nilai yang valid:

  • true: mengaktifkan alamat host dan port server proxy.

  • false (default): menonaktifkan alamat host dan port server proxy.

oss.AuthProxy

ProxyUser

Nama pengguna untuk autentikasi server proxy.

oss.AuthProxy

ProxyPassword

Kata sandi untuk autentikasi server proxy.

oss.AuthProxy

RedirectEnabled

Menentukan apakah akan mengaktifkan pengalihan HTTP. Nilai yang valid:

  • true (default): mengaktifkan pengalihan HTTP.

  • false: menonaktifkan pengalihan HTTP.

oss.RedirectEnabled

InsecureSkipVerify

Menentukan apakah akan mengaktifkan verifikasi sertifikat SSL. Nilai yang valid:

  • true (default): mengabaikan verifikasi sertifikat SSL.

  • false: mengaktifkan verifikasi sertifikat SSL.

oss.InsecureSkipVerify

IsEnableCRC

Menentukan apakah akan mengaktifkan validasi data CRC. Nilai yang valid:

  • true (default): mengaktifkan validasi data CRC.

  • false: menonaktifkan validasi data CRC.

oss.EnableCRC

LogLevel

Tingkat log. Nilai yang valid:

  • oss.LogOff

  • oss.Debug

  • oss.Error

  • oss.Warn

  • oss.Info

oss.SetLogLevel

Gunakan titik akhir internal

Untuk mengakses OSS melalui jaringan internal, tentukan titik akhir internal saat menginisialisasi klien OSS.

// Buat instans klien OSS.
client, _ := oss.New(
	"oss-cn-hangzhou-internal.aliyuncs.com", // Titik akhir internal Tiongkok (Hangzhou) digunakan sebagai contoh.
	"",
	"",
	oss.SetCredentialsProvider(&provider),
	oss.AuthVersion(oss.AuthV4),
	oss.Region("cn-hangzhou"),
)

Gunakan nama domain kustom

Untuk mengakses OSS menggunakan nama domain kustom, tentukan nama tersebut sebagai titik akhir dan aktifkan opsi CNAME dengan oss.UseCname(true) selama inisialisasi klien.

Sebelum menggunakan nama domain kustom, pastikan Anda telah memetakan nama domain kustom tersebut ke bucket. Untuk informasi selengkapnya, lihat Akses OSS melalui nama domain kustom.
// Tentukan apakah akan menggunakan nama domain kustom sebagai titik akhir. Nilai default adalah false.
cname := oss.UseCname(true)

// Buat instans klien OSS.
client, _ := oss.New(
	"http://kitkat-cloud.cn", // Nama domain kustom.
	"",
	"",
	oss.SetCredentialsProvider(&provider),
	oss.AuthVersion(oss.AuthV4),
	oss.Region("cn-hangzhou"),
	cname,
)

Kontrol timeout

Gunakan parameter oss.Timeout untuk mengatur periode timeout koneksi HTTP dan periode timeout baca/tulis dalam detik.

// Atur periode timeout koneksi HTTP menjadi 20 detik dan periode timeout baca/tulis HTTP menjadi 60 detik.
time := oss.Timeout(20, 60)

// Buat instans klien OSS.
client, _ := oss.New(
	"oss-cn-hangzhou.aliyuncs.com", // Titik akhir publik Tiongkok (Hangzhou) digunakan sebagai contoh.
	"",
	"",
	oss.SetCredentialsProvider(&provider),
	oss.AuthVersion(oss.AuthV4),
	oss.Region("cn-hangzhou"),
	time,
)

Atur ukuran kolam koneksi

Gunakan parameter oss.MaxConns untuk menyesuaikan ukuran kolam koneksi.

// Atur jumlah maksimum koneksi idle (MaxIdleConns) menjadi 10. Nilai default adalah 100.
// Atur jumlah maksimum koneksi idle per host (MaxIdleConnsPerHost) menjadi 20. Nilai default adalah 100.
// Atur jumlah maksimum koneksi per host (MaxConnsPerHost) menjadi 50. Nilai default adalah kosong.
conn := oss.MaxConns(10, 20, 50)

// Buat instans klien OSS.
client, _ := oss.New(
	"oss-cn-hangzhou.aliyuncs.com", // Titik akhir publik Tiongkok (Hangzhou) digunakan sebagai contoh.
	"",
	"",
	oss.SetCredentialsProvider(&provider),
	oss.AuthVersion(oss.AuthV4),
	oss.Region("cn-hangzhou"),
	conn,
)

Nonaktifkan validasi data CRC

Atur oss.EnableCRC(false) untuk menonaktifkan validasi data CRC.

Penting

Kami sangat menyarankan agar Anda tetap mengaktifkan validasi data CRC. Jika Anda menonaktifkan fitur ini, OSS tidak dapat menjamin integritas data selama proses unggah dan unduh.

// Nonaktifkan validasi data CRC.
crc := oss.EnableCRC(false)

// Buat instans klien OSS.
client, _ := oss.New(
	"oss-cn-hangzhou.aliyuncs.com", // Titik akhir publik Tiongkok (Hangzhou) digunakan sebagai contoh.
	"",
	"",
	oss.SetCredentialsProvider(&provider),
	oss.AuthVersion(oss.AuthV4),
	oss.Region("cn-hangzhou"),
	crc,
)

Versi signature

Penting

Signature V1 Alibaba Cloud Object Storage Service akan ditinggalkan sesuai jadwal berikut. Upgrade ke signature V4 sesegera mungkin untuk memastikan layanan Anda tidak terpengaruh.

  • Mulai 1 Maret 2025, pengguna baru tidak dapat menggunakan signature V1.

  • Mulai 1 September 2025, pemeliharaan dan pembaruan untuk signature V1 akan secara bertahap dihentikan, dan bucket yang baru dibuat tidak dapat menggunakan signature V1.

Kode contoh berikut menginisialisasi klien dengan signature V1. Untuk inisialisasi signature V4, lihat Inisialisasi klien.

package main

// Contoh kode untuk menginisialisasi klien dengan signature V1 di OSS Go SDK V1

import (
	"fmt"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {

	// Muat kredensial akses dari variabel lingkungan. Anda harus mengatur OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET.
	provider, _ := oss.NewEnvironmentVariableCredentialsProvider()

	// Buat instans klien OSS.
	client, _ := oss.New(
		"oss-cn-hangzhou.aliyuncs.com", // Titik akhir publik Tiongkok (Hangzhou) digunakan sebagai contoh.
		"",
		"",
		oss.SetCredentialsProvider(&provider),
	)

	// Cantumkan semua bucket.
	buckets, err := client.ListBuckets()
	if err != nil {
		fmt.Printf("Gagal mencantumkan bucket: %v\n", err)
		return
	}

	// Cetak daftar bucket.
	fmt.Printf("Ditemukan %d bucket:\n", len(buckets.Buckets))

	for _, bucket := range buckets.Buckets {
		fmt.Printf("%s\n", bucket.Name)
	}
}

Atur konteks permintaan

Gunakan konteks permintaan untuk mengontrol siklus hidup permintaan.

Hanya OSS Go SDK 2.2.9 dan versi yang lebih baru yang mendukung pengaturan konteks permintaan.
package main

// Contoh kode untuk mengatur konteks permintaan di OSS Go SDK V1

import (
	"context"
	"fmt"
	"time"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {

	// Muat kredensial akses dari variabel lingkungan. Anda harus mengatur OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET.
	provider, _ := oss.NewEnvironmentVariableCredentialsProvider()

	// Buat instans klien OSS.
	client, _ := oss.New(
		"oss-cn-hangzhou.aliyuncs.com", // Titik akhir publik Tiongkok (Hangzhou) digunakan sebagai contoh.
		"",
		"",
		oss.SetCredentialsProvider(&provider),
		oss.AuthVersion(oss.AuthV4),
		oss.Region("cn-hangzhou"),
	)

	// Dapatkan objek bucket.
	bucket, _ := client.Bucket("example-bucket-hz")

	// Konfigurasikan informasi objek.
	key := "oss-browser2-mac-arm64-2.1.0.dmg"       // Jalur objek di OSS.
	file_path := "oss-browser2-mac-arm64-2.1.0.dmg" // Jalur lokal untuk menyimpan objek.

	// Atur konteks permintaan.
	ctx := context.Background()

	// Tentukan bahwa konteks permintaan kedaluwarsa dalam 5 detik.
	ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
	defer cancel()

	// Unduh objek dari OSS ke jalur lokal yang ditentukan dan atur konteks permintaan.
	err := bucket.GetObjectToFile(key, file_path, oss.WithContext(ctx))
	if err != nil {
		select {
		case <-ctx.Done():
			fmt.Printf("Permintaan dibatalkan atau timeout: %v\n", err)
		default:
			fmt.Printf("Unduhan gagal: %v\n", err)
		}
		return
	}

	fmt.Printf("Objek diunduh: %s -> %s\n", key, file_path)
}

Penanganan error

Saat terjadi error selama akses OSS, SDK mengembalikan detail termasuk kode status HTTP, pesan error, ID permintaan, dan kode error EC. Kode error EC mengidentifikasi penyebab spesifik dan membantu Anda memecahkan masalah dengan cepat. Misalnya, jika Anda mencoba mengunduh objek yang tidak ada, pesan error berikut dikembalikan:

oss: service returned error: StatusCode=404, ErrorCode=NoSuchKey, ErrorMessage="The specified key does not exist.", RequestId=69030EDB2E5F223030953167, Ec=0026-00000001

Dalam pesan error tersebut, 'EC': '0026-00000001' adalah kode error EC. Anda dapat menggunakan kode error ini untuk menemukan penyebab masalah dan solusinya.

Kode contoh

OSS Go SDK V1 menyediakan kode contoh yang mencakup fitur inti seperti manajemen bucket, operasi objek, kontrol akses, dan transfer terenkripsi. Tabel berikut mencantumkan contoh yang tersedia:

Kode contoh GitHub

Kode contoh dokumentasi resmi

new_bucket.go

Inisialisasi klien

create_bucket.go

Buat bucket (Go SDK V1)

bucket_acl.go

Kelola ACL bucket (Go SDK V1)

bucket_policy.go

Kebijakan otorisasi

bucket_referer.go

Proteksi hotlink (Go SDK V1)

bucket_lifecycle.go

Siklus hidup

bucket_logging.go

Log akses

bucket_cors.go

Akses lintas-origin

bucket_website.go

Hosting situs statis (Pengembalian ke sumber berbasis mirroring) (Go SDK V1)

bucket_encryption.go

Enkripsi sisi server (Go SDK V1)

bucket_requestpayment.go

Bayar-per-peminta (Go SDK V1)

bucket_inventory.go

Inventaris bucket (Go SDK V1)

bucket_accessmonitor.go

Pelacakan akses (Go SDK V1)

bucket_metaquery.go

Pengindeksan data (Go SDK V1)

list_buckets.go

Cantumkan bucket (Go SDK V1)

bucket_stat.go

Dapatkan kapasitas penyimpanan bucket (Go SDK V1)

bucket_tagging.go

Tagging bucket (Go SDK V1)

put_object.go

Unggah objek, termasuk unggah simple (Go SDK V1) dan unggah yang dapat dilanjutkan (Go SDK V1)

append_object.go

Unggah append

get_object.go

Unduh objek, termasuk unduhan streaming (Go SDK V1) dan unduhan kondisional (Go SDK V1)

delete_object.go

Hapus objek (Go SDK V1)

copy_object.go

Salin objek (Go SDK V1)

list_objects.go

Cantumkan objek (Go SDK V1)

archive.go

Pulihkan objek (Go SDK V1)

object_acl.go

Kelola ACL objek

sign_url.go

Unggah objek menggunakan URL yang ditandatangani (Go SDK V1)

object_tagging.go

Tagging objek

select_object.go

Kueri objek (Go SDK V1)

object_meta.go

Kelola metadata objek (Go SDK V1)

livechannel.go

Manajemen LiveChannel (Go SDK V1)

Kueri informasi titik akhir

OSS Go SDK V1 memungkinkan Anda melakukan kueri informasi titik akhir untuk semua atau wilayah tertentu, termasuk titik akhir publik (IPv4), titik akhir internal (jaringan klasik atau VPC), dan titik akhir percepatan.

Catatan

Go SDK 2.2.8 dan versi yang lebih baru mendukung kueri informasi titik akhir.

package main

// Contoh kode untuk melakukan kueri informasi titik akhir di OSS Go SDK V1

import (
	"fmt"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {

	fmt.Println("=== Kueri informasi titik akhir untuk semua wilayah yang didukung ===\n")

	// Muat kredensial akses dari variabel lingkungan. Anda harus mengatur OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET.
	provider, _ := oss.NewEnvironmentVariableCredentialsProvider()

	// Buat instans klien OSS.
	client, err := oss.New(
		"oss-cn-hangzhou.aliyuncs.com", // Titik akhir publik Tiongkok (Hangzhou) digunakan sebagai contoh.
		"",
		"",
		oss.SetCredentialsProvider(&provider),
		oss.AuthVersion(oss.AuthV4),
		oss.Region("cn-hangzhou"),
	)
	if err != nil {
		fmt.Printf("Gagal membuat klien: %v\n", err)
		return
	}

	// Kueri informasi titik akhir untuk semua wilayah yang didukung.
	result, err := client.DescribeRegions()
	if err != nil {
		fmt.Printf("Gagal melakukan kueri informasi titik akhir: %v\n", err)
		return
	}

	// Telusuri semua informasi wilayah.
	for _, region := range result.Regions {
		fmt.Printf("Wilayah: %s\n", region.Region)
		fmt.Printf("  Titik akhir publik (IPv4): %s\n", region.InternetEndpoint)
		fmt.Printf("  Titik akhir internal (jaringan klasik atau VPC): %s\n", region.InternalEndpoint)
		fmt.Printf("  Titik akhir percepatan (percepatan unggah dan unduh global): %s\n", region.AccelerateEndpoint)
		fmt.Println("--------------------------------------------------------------------------------")
	}

	// Cetak statistik.
	fmt.Printf("\nDitemukan informasi titik akhir untuk %d wilayah\n", len(result.Regions))
}

Untuk melakukan kueri informasi titik akhir untuk wilayah tertentu, tentukan ID wilayah spesifik OSS dalam metode DescribeRegions.

result, err := client.DescribeRegions(oss.AddParam("regions", "oss-cn-hangzhou"))

Konfigurasi kredensial akses

OSS mendukung beberapa metode inisialisasi kredensial. Pilih metode berdasarkan kebutuhan autentikasi dan otorisasi Anda.

Klik untuk melihat cara memilih kredensial akses

Metode inisialisasi penyedia kredensial

Skenario

Memerlukan pasangan AccessKey atau token STS yang telah dikonfigurasi sebelumnya

Kredensial dasar

Validitas kredensial

Metode rotasi atau refresh kredensial

Gunakan pasangan AccessKey Pengguna RAM

Aplikasi yang diterapkan di lingkungan aman dan stabil yang tidak rentan terhadap serangan eksternal dan memerlukan akses jangka panjang ke layanan Alibaba Cloud tanpa rotasi kredensial yang sering.

Ya

Pasangan AccessKey

Jangka panjang

Rotasi manual

Gunakan kredensial akses sementara STS

Aplikasi yang diterapkan di lingkungan tidak tepercaya dan memerlukan kontrol atas periode validitas dan izin akses.

Ya

Token Layanan Token Keamanan

Sementara

Refresh manual

Gunakan ARN peran RAM

Aplikasi yang memerlukan akses berotorisasi ke layanan Alibaba Cloud, seperti akses lintas akun.

Ya

Token Layanan Token Keamanan

Sementara

Auto-refresh

Gunakan peran RAM instans ECS

Aplikasi yang diterapkan pada instans ECS Alibaba Cloud, instans ECI, atau node pekerja Container Service for Kubernetes.

Tidak

Token Layanan Token Keamanan

Sementara

Auto-refresh

Gunakan ARN peran OIDC

Aplikasi tidak tepercaya yang diterapkan pada node pekerja Alibaba Cloud Container Service for Kubernetes.

Tidak

Token Layanan Token Keamanan

Sementara

Auto-refresh

Gunakan kredensial dari konteks Function Compute

Fungsi aplikasi yang diterapkan di Alibaba Cloud Function Compute.

Tidak

Token Layanan Token Keamanan

Sementara

Tidak perlu refresh

Gunakan CredentialsURI

Aplikasi yang perlu mendapatkan kredensial akses dari sistem eksternal.

Tidak

Token Layanan Token Keamanan

Sementara

Auto-refresh

Gunakan pasangan AccessKey yang berotasi otomatis

Aplikasi yang diterapkan di lingkungan dengan risiko kebocoran pasangan AccessKey dan memerlukan rotasi kredensial yang sering untuk akses jangka panjang ke layanan Alibaba Cloud.

Tidak

Pasangan AccessKey

Jangka panjang

Auto-rotasi

Gunakan kredensial akses kustom

Jika metode konfigurasi kredensial di atas tidak memenuhi kebutuhan Anda, Anda dapat menyesuaikan cara mendapatkan kredensial.

Kustom

Kustom

Kustom

Kustom

Gunakan pasangan AccessKey Pengguna RAM

Cocok untuk aplikasi yang diterapkan di lingkungan aman yang memerlukan akses OSS jangka panjang tanpa rotasi kredensial yang sering. Anda menginisialisasi penyedia kredensial dengan pasangan AccessKey (ID AccessKey dan Rahasia AccessKey) dari Akun Alibaba Cloud atau Pengguna RAM. Metode ini memerlukan pemeliharaan pasangan AccessKey secara manual, yang dapat menimbulkan risiko keamanan.

Penting
  • Akun Alibaba Cloud memiliki izin penuh atas sumber daya. Jika pasangan AccessKey bocor, hal ini menimbulkan risiko signifikan bagi sistem Anda. Kami tidak merekomendasikan penggunaan pasangan AccessKey Akun Alibaba Cloud. Gunakan pasangan AccessKey Pengguna RAM dengan izin minimum yang diperlukan.

  • Untuk membuat pasangan AccessKey untuk Pengguna RAM, lihat Buat pasangan AccessKey. ID AccessKey dan Rahasia AccessKey Pengguna RAM hanya ditampilkan saat pasangan AccessKey dibuat. Jika Anda lupa, buat pasangan AccessKey baru untuk menggantikan yang lama.

Variabel lingkungan

  1. Konfigurasikan variabel lingkungan menggunakan pasangan AccessKey Pengguna RAM.

    Linux

    1. Jalankan perintah berikut di antarmuka baris perintah untuk menambahkan pengaturan variabel lingkungan ke file ~/.bashrc .

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. Jalankan perintah berikut untuk menerapkan perubahan.

      source ~/.bashrc
    3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. Jalankan perintah berikut di terminal untuk melihat jenis shell default.

      echo $SHELL
    2. Lakukan operasi berikut berdasarkan jenis shell default.

      Zsh

      1. Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file ~/.zshrc.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. Jalankan perintah berikut untuk menerapkan perubahan.

        source ~/.zshrc
      3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

      Bash

      1. Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file ~/.bash_profile.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. Jalankan perintah berikut untuk menerapkan perubahan.

        source ~/.bash_profile
      3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD

    1. Jalankan perintah berikut di CMD.

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%

    PowerShell

    1. Jalankan perintah berikut di PowerShell.

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
  2. Setelah memodifikasi variabel lingkungan sistem, restart atau refresh lingkungan build dan runtime. Ini termasuk IDE, antarmuka baris perintah, aplikasi desktop lainnya, dan layanan backend untuk memastikan variabel lingkungan sistem terbaru dimuat.

  3. Gunakan variabel lingkungan untuk meneruskan informasi kredensial.

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// Buat instans OSSClient.
    	// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, setel titik akhir sesuai kebutuhan.
    	// Setel yourRegion ke wilayah bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, setel wilayah sesuai kebutuhan.
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// Setel versi signature.
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    }

Kredensial statis

Untuk menghindari hard-coding kredensial dalam kode sumber, rujuk kredensial tersebut melalui variabel yang membaca dari variabel lingkungan, file konfigurasi, atau sumber eksternal lainnya saat runtime. Contoh berikut menggunakan file konfigurasi:

  1. Anda dapat menginstal library go-ini.

    go get -u github.com/go-ini/ini
  2. Anda dapat membuat file konfigurasi bernama config.ini.

    [credentials]
    alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID>
    alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET>
  3. Anda dapat menulis kode untuk membaca informasi kredensial dari file konfigurasi dan menginisialisasi klien OSS.

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"gopkg.in/ini.v1"
    )
    
    type defaultCredentials struct {
    	config *oss.Config
    }
    
    func (defCre *defaultCredentials) GetAccessKeyID() string {
    	return defCre.config.AccessKeyID
    }
    
    func (defCre *defaultCredentials) GetAccessKeySecret() string {
    	return defCre.config.AccessKeySecret
    }
    
    func (defCre *defaultCredentials) GetSecurityToken() string {
    	return defCre.config.SecurityToken
    }
    
    type defaultCredentialsProvider struct {
    	config *oss.Config
    }
    
    func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials {
    	return &defaultCredentials{config: defBuild.config}
    }
    func NewDefaultCredentialsProvider(accessID, accessKey, token string) (defaultCredentialsProvider, error) {
    	var provider defaultCredentialsProvider
    	if accessID == "" {
    		return provider, fmt.Errorf("access key id is empty!")
    	}
    	if accessKey == "" {
    		return provider, fmt.Errorf("access key secret is empty!")
    	}
    	config := &oss.Config{
    		AccessKeyID:     accessID,
    		AccessKeySecret: accessKey,
    		SecurityToken:   token,
    	}
    	return defaultCredentialsProvider{
    		config,
    	}, nil
    }
    
    func main() {
    	cfg, err := ini.Load("config.ini")
    	if err != nil {
    		fmt.Println("Error loading config file:", err)
    		return
    	}
    	accessKeyID := cfg.Section("credentials").Key("alibaba_cloud_access_key_id").String()
    	accessKeySecret := cfg.Section("credentials").Key("alibaba_cloud_access_key_secret").String()
    	provider, err := NewDefaultCredentialsProvider(accessKeyID, accessKeySecret, "")
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, setel titik akhir sesuai kebutuhan.
    	// Setel yourRegion ke wilayah bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, setel wilayah sesuai kebutuhan.
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// Setel versi signature.
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    }

Gunakan kredensial akses sementara STS

Cocok untuk aplikasi yang memerlukan akses OSS sementara. Anda menginisialisasi penyedia kredensial dengan kredensial sementara (ID AccessKey, Rahasia AccessKey, dan Token Keamanan) yang diperoleh dari STS. Metode ini memerlukan pemeliharaan token STS secara manual. Untuk mengakses OSS beberapa kali, Anda harus merefresh token secara manual sebelum kedaluwarsa.

Penting
  1. Setel variabel lingkungan menggunakan kredensial identitas sementara.

    Mac OS/Linux/Unix

    Penting
    • Gunakan kredensial identitas sementara (ID AccessKey, Rahasia AccessKey, dan Token Keamanan) yang diperoleh dari STS, bukan pasangan AccessKey (ID AccessKey dan Rahasia AccessKey) Pengguna RAM.

    • ID AccessKey yang diperoleh dari STS diawali dengan "STS.", misalnya, "STS.****************".

    export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>

    Windows

    Penting
    • Gunakan kredensial identitas sementara (ID AccessKey, Rahasia AccessKey, dan Token Keamanan) yang diperoleh dari STS, bukan pasangan AccessKey (ID AccessKey dan Rahasia AccessKey) Pengguna RAM.

    • ID AccessKey yang diperoleh dari STS diawali dengan "STS.", misalnya, "STS.****************".

    set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
  2. Teruskan informasi kredensial melalui variabel lingkungan.

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, dan OSS_SESSION_TOKEN telah diatur.
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// Buat instans OSSClient.
    	// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, setel titik akhir sesuai kebutuhan.
    	// Setel yourRegion ke wilayah bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, setel wilayah sesuai kebutuhan.
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// Setel versi signature.
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    }

Gunakan ARN peran RAM

Cocok untuk aplikasi yang memerlukan akses berotorisasi ke OSS, seperti akses lintas akun. Anda menginisialisasi penyedia kredensial dengan menentukan ARN peran RAM. Alat Credentials secara otomatis mendapatkan token STS dan merefreshnya sebelum kedaluwarsa dengan memanggil operasi AssumeRole. Anda juga dapat menetapkan policy untuk membatasi peran ke set izin yang lebih kecil.

Penting
  • Akun Alibaba Cloud memiliki izin penuh atas sumber daya. Jika pasangan AccessKey bocor, hal ini menimbulkan risiko signifikan bagi sistem Anda. Kami tidak merekomendasikan penggunaan pasangan AccessKey Akun Alibaba Cloud. Gunakan pasangan AccessKey Pengguna RAM dengan izin minimum yang diperlukan.

  • Untuk membuat pasangan AccessKey untuk Pengguna RAM, lihat Buat pasangan AccessKey. ID AccessKey dan Rahasia AccessKey Pengguna RAM hanya ditampilkan saat pasangan AccessKey dibuat. Simpan segera. Jika Anda lupa, buat pasangan AccessKey baru untuk menggantikan yang lama.

  • Untuk mendapatkan ARN peran RAM, lihat Buat peran RAM.

  1. Anda dapat menambahkan dependensi credentials.

    go get github.com/aliyun/credentials-go/credentials
  2. Konfigurasikan pasangan AccessKey dan ARN peran RAM sebagai kredensial akses.

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/credentials-go/credentials"
    )
    
    type Credentials struct {
    	AccessKeyId     string
    	AccessKeySecret string
    	SecurityToken   string
    }
    
    type defaultCredentialsProvider struct {
    	cred credentials.Credential
    }
    
    func (credentials *Credentials) GetAccessKeyID() string {
    	return credentials.AccessKeyId
    }
    
    func (credentials *Credentials) GetAccessKeySecret() string {
    	return credentials.AccessKeySecret
    }
    
    func (credentials *Credentials) GetSecurityToken() string {
    	return credentials.SecurityToken
    }
    
    func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials {
    	cred, _ := defBuild.cred.GetCredential()
    	return &Credentials{
    		AccessKeyId:     *cred.AccessKeyId,
    		AccessKeySecret: *cred.AccessKeySecret,
    		SecurityToken:   *cred.SecurityToken,
    	}
    }
    
    func NewRamRoleArnCredentialsProvider(credential credentials.Credential) defaultCredentialsProvider {
    	return defaultCredentialsProvider{
    		cred: credential,
    	}
    }
    
    func main() {
    	config := new(credentials.Config).
    		// Jenis kredensial. Setel nilai ke ram_role_arn.
    		SetType("ram_role_arn").
    		// ID AccessKey dan Rahasia AccessKey Pengguna RAM. Nilainya diperoleh dari variabel lingkungan.
    		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
    		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
    		// Operasi berikut langsung menggunakan nilai parameter. Anda juga dapat menambahkan variabel lingkungan dan menggunakan os.Getenv("<variable_name>") untuk mengatur parameter yang sesuai.
    		// ARN peran RAM yang akan diasumsikan. Nilainya diperoleh dari variabel lingkungan. Format: acs:ram::$accountID:role/$roleName.
    		SetRoleArn("ALIBABA_CLOUD_ROLE_ARN"). // Nama variabel lingkungan standar untuk RoleArn adalah ALIBABA_CLOUD_ROLE_ARN.
    		// Nama kustom untuk sesi peran untuk membedakan token yang berbeda.
    		SetRoleSessionName("ALIBABA_CLOUD_ROLE_SESSION_NAME"). // Nama variabel lingkungan standar untuk RoleSessionName adalah ALIBABA_CLOUD_ROLE_SESSION_NAME.
    		// (Opsional) Batasi izin token STS.
    		SetPolicy("").
    		// (Opsional) Batasi periode validitas token STS.
    		SetRoleSessionExpiration(3600)
    
    	arnCredential, err := credentials.NewCredential(config)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	provider := NewRamRoleArnCredentialsProvider(arnCredential)
    	// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, setel titik akhir sesuai kebutuhan.
    	// Setel yourRegion ke wilayah bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, setel wilayah sesuai kebutuhan.
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// Setel versi signature.
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	fmt.Printf("client:%#v\n", client)
    }

Gunakan peran RAM instans ECS

Disarankan untuk aplikasi yang berjalan pada instans ECS, instans ECI, atau node pekerja Container Service for Kubernetes. Peran RAM instans ECS mengaitkan peran dengan instans, memungkinkan refresh token STS otomatis tanpa menyediakan pasangan AccessKey atau token STS. Untuk informasi tentang cara mendapatkan peran RAM instans ECS, lihat Buat peran RAM. Untuk informasi tentang cara mengaitkan peran dengan instans ECS, lihat Peran RAM instans.

  1. Anda dapat menambahkan dependensi credentials.

    go get github.com/aliyun/credentials-go/credentials
  2. Konfigurasikan peran RAM instans ECS sebagai kredensial akses.

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/credentials-go/credentials"
    )
    
    type Credentials struct {
    	AccessKeyId     string
    	AccessKeySecret string
    	SecurityToken   string
    }
    
    type CredentialsProvider struct {
    	cred credentials.Credential
    }
    
    func (credentials *Credentials) GetAccessKeyID() string {
    	return credentials.AccessKeyId
    }
    
    func (credentials *Credentials) GetAccessKeySecret() string {
    	return credentials.AccessKeySecret
    }
    
    func (credentials *Credentials) GetSecurityToken() string {
    	return credentials.SecurityToken
    }
    
    func (defBuild CredentialsProvider) GetCredentials() oss.Credentials {
    	cred, _ := defBuild.cred.GetCredential()
    	return &Credentials{
    		AccessKeyId:     *cred.AccessKeyId,
    		AccessKeySecret: *cred.AccessKeySecret,
    		SecurityToken:   *cred.SecurityToken,
    	}
    }
    
    func NewEcsCredentialsProvider(credential credentials.Credential) CredentialsProvider {
    	return CredentialsProvider{
    		cred: credential,
    	}
    }
    
    func main() {
    	config := new(credentials.Config).
    		// Jenis kredensial. Setel nilai ke ecs_ram_role.
    		SetType("ecs_ram_role").
    		// (Opsional) Nama peran. Jika Anda tidak menentukan parameter ini, OSS secara otomatis mendapatkan peran. Kami menyarankan Anda menentukan nama peran untuk mengurangi jumlah permintaan.
    		SetRoleName("RoleName")
    
    	ecsCredential, err := credentials.NewCredential(config)
    	if err != nil {
    		return
    	}
    	provider := NewEcsCredentialsProvider(ecsCredential)
    	// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, setel titik akhir sesuai kebutuhan.
    	// Setel yourRegion ke wilayah bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, setel wilayah sesuai kebutuhan.
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// Setel versi signature.
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    
    }

Gunakan ARN peran OIDC

Untuk aplikasi tidak tepercaya yang diterapkan pada node pekerja Container Service for Kubernetes, fitur RAM Roles for Service Accounts (RRSA) menyediakan isolasi kredensial tingkat pod. Alih-alih berbagi peran RAM instans node pekerja melalui layanan meta global, RRSA memasang file token OIDC service account ke setiap pod dan menyuntikkan konfigurasi ke variabel lingkungan. Alat Credentials kemudian memanggil operasi AssumeRoleWithOIDC untuk menukar token OIDC dengan token STS. Tidak diperlukan pasangan AccessKey atau token STS. Untuk informasi selengkapnya, lihat Konfigurasikan izin RAM untuk ServiceAccount menggunakan RRSA untuk mencapai isolasi izin tingkat pod.

  1. Anda dapat menambahkan dependensi credentials.

    go get github.com/aliyun/credentials-go/credentials
  2. Konfigurasikan peran RAM OIDC sebagai kredensial akses.

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/credentials-go/credentials"
    )
    
    type Credentials struct {
    	AccessKeyId     string
    	AccessKeySecret string
    	SecurityToken   string
    }
    
    type CredentialsProvider struct {
    	cred credentials.Credential
    }
    
    func (credentials *Credentials) GetAccessKeyID() string {
    	return credentials.AccessKeyId
    }
    
    func (credentials *Credentials) GetAccessKeySecret() string {
    	return credentials.AccessKeySecret
    }
    
    func (credentials *Credentials) GetSecurityToken() string {
    	return credentials.SecurityToken
    }
    
    func (defBuild CredentialsProvider) GetCredentials() oss.Credentials {
    	cred, _ := defBuild.cred.GetCredential()
    	return &Credentials{
    		AccessKeyId:     *cred.AccessKeyId,
    		AccessKeySecret: *cred.AccessKeySecret,
    		SecurityToken:   *cred.SecurityToken,
    	}
    }
    
    func NewOIDCRoleARNCredentialsProvider(credential credentials.Credential) CredentialsProvider {
    	return CredentialsProvider{
    		cred: credential,
    	}
    }
    
    func main() {
    	config := new(credentials.Config).
    		// Jalur file token OIDC.
    		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
    		// Operasi berikut langsung menggunakan nilai parameter. Anda juga dapat menambahkan variabel lingkungan dan menggunakan os.Getenv("<variable_name>") untuk mengatur parameter yang sesuai.
    		// Jenis kredensial. Setel nilai ke oidc_role_arn.
    		SetType("oidc_role_arn").
    		// ARN penyedia OIDC. Format: acs:ram::account-id:oidc-provider/provider-name.
    		SetOIDCProviderArn("acs:ram::113511544585****:oidc-provider/TestOidcProvider"). // Nama variabel lingkungan standar untuk OIDCProviderArn adalah ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
    		// Nama kustom untuk sesi peran untuk membedakan token yang berbeda.
    		SetRoleSessionName("role_session_name"). // Nama variabel lingkungan standar untuk RoleSessionName adalah ALIBABA_CLOUD_ROLE_SESSION_NAME.
    		// ARN peran yang akan diasumsikan. Format: acs:ram::113511544585****:oidc-provider/TestOidcProvider
    		SetRoleArn("acs:ram::113511544585****:role/testoidc"). // Nama variabel lingkungan standar untuk RoleArn adalah ALIBABA_CLOUD_ROLE_ARN.
    		// (Opsional) Kebijakan yang digunakan saat mengasumsikan peran.
    		SetPolicy("").
    		SetSessionExpiration(3600)
    	oidcCredential, err := credentials.NewCredential(config)
    	if err != nil {
    		return
    	}
    	provider := NewOIDCRoleARNCredentialsProvider(oidcCredential)
    	// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, setel titik akhir sesuai kebutuhan.
    	// Setel yourRegion ke wilayah bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, setel wilayah sesuai kebutuhan.
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// Setel versi signature.
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    }

Gunakan kredensial dari konteks Function Compute

Cocok untuk fungsi aplikasi yang diterapkan di Function Compute. Function Compute mendapatkan token STS dengan mengasumsikan peran layanan yang dikonfigurasi untuk fungsi tersebut dan meneruskannya melalui parameter Credentials dalam konteks. Token STS ini berlaku selama 36 jam dan tidak kedaluwarsa selama eksekusi fungsi (maksimum 24 jam), sehingga tidak perlu refresh. Tidak diperlukan pasangan AccessKey atau token STS. Untuk informasi tentang pemberian izin Function Compute untuk mengakses OSS, lihat Gunakan peran fungsi untuk memberikan izin Function Compute mengakses layanan Alibaba Cloud lainnya.

  1. Anda dapat menambahkan dependensi konteks Function Compute.

    go get github.com/aliyun/fc-runtime-go-sdk/fc
    go get github.com/aliyun/fc-runtime-go-sdk/fccontext
  2. Anda dapat menginisialisasi penyedia kredensial menggunakan kredensial dari konteks Function Compute.

    package main
    
    import (
    	"context"
    	"fmt"
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/fc-runtime-go-sdk/fc"
    	"github.com/aliyun/fc-runtime-go-sdk/fccontext"
    )
    
    type GetObjectContext struct {
    	OutputRoute string `json:"outputRoute"`
    	OutputToken string `json:"outputToken"`
    	InputOssUrl string `json:"inputOssUrl"`
    }
    
    type StructEvent struct {
    	GetObjectContext GetObjectContext `json:"getObjectContext"`
    }
    
    func HandleRequest(ctx context.Context, event StructEvent) error {
    	endpoint := event.GetObjectContext.OutputRoute
    	fctx, _ := fccontext.FromContext(ctx)
    	client, err := oss.New(endpoint, fctx.Credentials.AccessKeyId, fctx.Credentials.AccessKeySecret, oss.SecurityToken(fctx.Credentials.SecurityToken))
    	if err != nil {
    		return fmt.Errorf("client new error: %v", err)
    	}
    	fmt.Printf("client:%#v\n", client)
    	return nil
    }
    
    func main() {
    	fc.Start(HandleRequest)
    }

Gunakan CredentialsURI

Cocok untuk aplikasi yang mendapatkan kredensial dari sistem eksternal. Alat Credentials mengambil token STS dari URI yang ditentukan dan secara otomatis merefreshnya. Tidak diperlukan pasangan AccessKey atau token STS.

Penting
  • CredentialsURI adalah alamat server tempat token STS diperoleh.

  • Layanan backend yang menyediakan respons CredentialsURI harus mengimplementasikan logika untuk refresh token STS otomatis guna memastikan aplikasi selalu dapat memperoleh kredensial yang valid.

  1. Agar alat Credentials dapat mengurai dan menggunakan token STS dengan benar, URI harus mematuhi protokol respons berikut:

    • Kode status respons: 200

    • Struktur isi respons:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2021-09-26T03:46:38Z",
          "SecurityToken": "SecurityToken"
      }
  2. Anda dapat menambahkan dependensi credentials.

    go get github.com/aliyun/credentials-go/credentials
  3. Konfigurasikan CredentialsURI sebagai kredensial akses.

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/credentials-go/credentials"
    )
    
    type Credentials struct {
    	AccessKeyId     string
    	AccessKeySecret string
    	SecurityToken   string
    }
    
    type CredentialsProvider struct {
    	cred credentials.Credential
    }
    
    func (credentials *Credentials) GetAccessKeyID() string {
    	return credentials.AccessKeyId
    }
    
    func (credentials *Credentials) GetAccessKeySecret() string {
    	return credentials.AccessKeySecret
    }
    
    func (credentials *Credentials) GetSecurityToken() string {
    	return credentials.SecurityToken
    }
    
    func (defBuild CredentialsProvider) GetCredentials() oss.Credentials {
    	cred, _ := defBuild.cred.GetCredential()
    	return &Credentials{
    		AccessKeyId:     *cred.AccessKeyId,
    		AccessKeySecret: *cred.AccessKeySecret,
    		SecurityToken:   *cred.SecurityToken,
    	}
    }
    
    func NewCredentialsUriCredentialsProvider(credential credentials.Credential) CredentialsProvider {
    	return CredentialsProvider{
    		cred: credential,
    	}
    }
    
    func main() {
    	config := new(credentials.Config).
    		// Jenis kredensial. Setel nilai ke credentials_uri.
    		SetType("credentials_uri").
    		// Tentukan alamat URL. Anda juga dapat mengatur variabel lingkungan dan menggunakan os.Getenv("<variable_name>") untuk meneruskan parameter.
    		// Nama variabel lingkungan standar untuk URLCredential adalah ALIBABA_CLOUD_CREDENTIALS_URI.
    		SetURLCredential("http://127.0.0.1")
    	uriCredential, err := credentials.NewCredential(config)
    	if err != nil {
    		return
    	}
    	provider := NewCredentialsUriCredentialsProvider(uriCredential)
    	// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, setel titik akhir sesuai kebutuhan.
    	// Setel yourRegion ke wilayah bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, setel wilayah sesuai kebutuhan.
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// Setel versi signature.
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    }

Gunakan pasangan AccessKey yang berotasi otomatis

Cocok untuk aplikasi yang memerlukan akses OSS jangka panjang tetapi diterapkan di lingkungan di mana risiko kebocoran pasangan AccessKey tinggi. Anda menginisialisasi penyedia kredensial dengan ClientKey. Key Management Service (KMS) secara otomatis merotasi pasangan AccessKey Pengguna RAM yang dikelola sesuai jadwal periodik, mengubah kredensial statis menjadi dinamis. KMS juga mendukung rotasi segera untuk penggantian cepat jika terjadi kebocoran. Untuk informasi tentang cara mendapatkan ClientKey, lihat Buat titik akses aplikasi.

  1. Anda dapat menambahkan dependensi klien kredensial.

    go get -u github.com/aliyun/aliyun-secretsmanager-client-go
  2. Anda dapat membuat file konfigurasi bernama secretsmanager.properties.

    # Jenis kredensial akses
    credentials_type=client_key
    
    # Kata sandi yang digunakan untuk mendekripsi kunci klien. Kata sandi dapat dibaca dari variabel lingkungan atau file.
    client_key_password_from_env_variable=#nama variabel lingkungan kata sandi kunci privat klien Anda#
    client_key_password_from_file_path=#jalur file kata sandi kunci privat klien Anda#
    
    # Jalur file kunci privat kunci klien.
    client_key_private_key_path=#jalur file kunci privat kunci klien Anda#
    
    # Wilayah layanan KMS terkait.
    cache_client_region_id=[{"regionId":"#regionId#"}]
  3. Anda dapat menggunakan file konfigurasi untuk meneruskan informasi kredensial.

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/aliyun-secretsmanager-client-go/sdk"
    )
    
    type defaultCredentials struct {
    	config *oss.Config
    }
    
    func (defCre *defaultCredentials) GetAccessKeyID() string {
    	return defCre.config.AccessKeyID
    }
    
    func (defCre *defaultCredentials) GetAccessKeySecret() string {
    	return defCre.config.AccessKeySecret
    }
    
    func (defCre *defaultCredentials) GetSecurityToken() string {
    	return defCre.config.SecurityToken
    }
    
    type defaultCredentialsProvider struct {
    	config *oss.Config
    }
    
    func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials {
    	return &defaultCredentials{config: defBuild.config}
    }
    func NewDefaultCredentialsProvider(accessID, accessKey, token string) (defaultCredentialsProvider, error) {
    	var provider defaultCredentialsProvider
    	if accessID == "" {
    		return provider, fmt.Errorf("access key id is empty!")
    	}
    	if accessKey == "" {
    		return provider, fmt.Errorf("access key secret is empty!")
    	}
    	config := &oss.Config{
    		AccessKeyID:     accessID,
    		AccessKeySecret: accessKey,
    		SecurityToken:   token,
    	}
    	return defaultCredentialsProvider{
    		config,
    	}, nil
    }
    
    func main() {
    	client, err := sdk.NewClient()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	secretInfo, err := client.GetSecretInfo("#secretName#")
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("SecretValue:%s\n", secretInfo.SecretValue)
    	var m map[string]string
    	err = json.Unmarshal([]byte(secretInfo.SecretValue), &m)
    	if err != nil {
    		fmt.Println("Error decoding JSON:", err)
    		os.Exit(-1)
    	}
    	accessKeyId := m["AccessKeyId"]
    	accessKeySecret := m["AccessKeySecret"]
    	provider, err := NewDefaultCredentialsProvider(accessKeyId, accessKeySecret, "")
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, setel titik akhir sesuai kebutuhan.
    	// Setel yourRegion ke wilayah bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, setel wilayah sesuai kebutuhan.
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// Setel versi signature.
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	ossClient, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", ossClient)
    }

Gunakan kredensial akses kustom

Jika metode di atas tidak memenuhi kebutuhan Anda, Anda dapat mengimplementasikan penyedia kredensial kustom menggunakan antarmuka Credential Providers. Jika kredensial dasar berbasis STS, Anda harus menangani refresh token.

package main

import (
	"fmt"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

type CustomerCredentialsProvider struct {
	config *oss.Config
}

func NewCustomerCredentialsProvider() CustomerCredentialsProvider {
	return CustomerCredentialsProvider{}
}

func (s CustomerCredentialsProvider) GetCredentials() oss.Credentials {
	// Kembalikan kredensial jangka panjang.
	config := &oss.Config{
		AccessKeyID:     "id",
		AccessKeySecret: "secret",
	}
	return &CustomerCredentialsProvider{
		config,
	}
	// Kembalikan kredensial sementara.
	//config := &oss.Config{
	//    AccessKeyID:     "id",
	//    AccessKeySecret: "secret",
	//    SecurityToken:   "token",
	//}
	//return &CustomerCredentialsProvider{
	//    config,
	//}
}

func (s *CustomerCredentialsProvider) GetAccessKeyID() string {
	return s.config.AccessKeyID
}

func (s *CustomerCredentialsProvider) GetAccessKeySecret() string {
	return s.config.AccessKeySecret
}

func (s *CustomerCredentialsProvider) GetSecurityToken() string {
	return s.config.SecurityToken
}

func main() {
	provider := NewCustomerCredentialsProvider()
	// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, setel titik akhir sesuai kebutuhan.
	// Setel yourRegion ke wilayah bucket. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, setel wilayah sesuai kebutuhan.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Setel versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Printf("client:%#v\n", client)
}

FAQ

Bagaimana cara memecahkan masalah error AccessDenied saat menggunakan SDK?

Error AccessDenied biasanya menunjukkan izin tidak mencukupi. Ikuti langkah-langkah berikut untuk memecahkan masalah:

  1. Konfirmasi ID AccessKey dan Rahasia AccessKey: Pastikan Anda menggunakan ID AccessKey dan Rahasia AccessKey yang benar.

  2. Periksa izin Pengguna RAM: Konfirmasi apakah Pengguna RAM memiliki izin yang diperlukan untuk operasi bucket atau objek.

  3. Periksa kebijakan bucket: Jika pesan error menyebutkan "Access denied by bucket policy," artinya akses ditolak oleh kebijakan bucket.

  4. Untuk informasi selengkapnya tentang cara mengkueri jenis error lain dan memecahkan masalah umum kontrol akses, lihat Penanganan error.

Referensi