Client adalah klien Go untuk Object Storage Service (OSS) yang dapat digunakan untuk mengelola sumber daya OSS seperti bucket dan file. Untuk mengirim permintaan OSS melalui Go SDK, Anda harus menginisialisasi instance Client. Konfigurasi default juga dapat dimodifikasi sesuai kebutuhan.
Prasyarat
Sebelum menginisialisasi OSS SDK, Anda harus mengonfigurasi kredensial akses terlebih dahulu. Untuk informasi selengkapnya, lihat Konfigurasikan kredensial akses (Go SDK V1).
Buat Client baru
Signature V4 (Direkomendasikan)
Kami menyarankan Anda menggunakan algoritma signature V4 yang lebih aman. Saat menginisialisasi client dengan signature V4, Anda harus menentukan Endpoint dan ID wilayah Alibaba Cloud umum. ID wilayah menentukan wilayah tempat permintaan diajukan, misalnya, cn-hangzhou. Anda juga harus mendeklarasikan oss.AuthV4. Signature V4 didukung di OSS Go SDK versi 3.0.2 dan yang lebih baru.
Contoh berikut menunjukkan cara menginisialisasi client dengan Signature V4 menggunakan nama domain OSS. Contoh ini dapat dimodifikasi untuk skenario lain, seperti menginisialisasi client dengan nama domain kustom.
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError digunakan untuk menangani kesalahan yang tidak dapat dipulihkan, mencatat pesan kesalahan, dan menghentikan program.
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// setupClient digunakan untuk mengatur dan membuat instance klien OSS.
// Parameter:
// endpoint - Endpoint yang sesuai dengan Bucket.
// region - Informasi region yang sesuai dengan endpoint.
//
// Mengembalikan instance klien OSS yang telah dibuat.
func setupClient(endpoint, region string) (*oss.Client, error) {
// Dapatkan kredensial akses dari variabel lingkungan.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return nil, err
}
// Buat instance OSSClient dan gunakan tanda tangan V4.
client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region(region))
if err != nil {
return nil, err
}
return client, nil
}
func main() {
// Isi yourEndpoint dengan endpoint yang sesuai dengan Bucket. Sebagai contoh, untuk China Timur 1 (Hangzhou), isi dengan https://oss-cn-hangzhou.aliyuncs.com. Untuk region lain, isi sesuai situasi aktual.
endpoint := "yourEndpoint"
// Isi yourRegion dengan informasi region yang sesuai dengan endpoint, misalnya cn-hangzhou.
region := "yourRegion"
// Periksa apakah variabel lingkungan telah diatur, sekaligus memeriksa string kosong dan nilai placeholder.
if endpoint == "" || region == "" || endpoint == "yourEndpoint" || region == "yourRegion" {
log.Fatal("Please set yourEndpoint and yourRegion with valid values.")
}
// Atur dan buat instance klien OSS.
client, err := setupClient(endpoint, region)
if err != nil {
handleError(err)
}
// Keluarkan informasi klien.
log.Printf("Client: %#v\n", client)
}Signature V1 (Tidak direkomendasikan)
Mulai 1 Maret 2025, algoritma Signature V1 OSS tidak lagi tersedia untuk pelanggan baru dengan UID baru. Mulai 1 September 2025, OSS tidak lagi memperbarui dan memelihara algoritma Signature V1, serta algoritma tersebut tidak lagi tersedia untuk bucket baru. Segera tingkatkan dari Signature V1 ke Signature V4 untuk mencegah dampak pada bisnis Anda.
Buat Client baru menggunakan nama domain OSS
Kode berikut menunjukkan cara menginisialisasi client menggunakan nama domain OSS. Untuk informasi selengkapnya mengenai nama domain OSS di berbagai wilayah, lihat Wilayah dan Endpoint.
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError digunakan untuk menangani kesalahan yang tidak dapat dipulihkan, mencatat pesan kesalahan, dan menghentikan program.
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// setupClient digunakan untuk mengatur dan membuat instance klien OSS.
// Parameter:
//
// endpoint - Endpoint yang sesuai dengan Bucket.
//
// Mengembalikan instance klien OSS yang telah dibuat.
func setupClient(endpoint string) (*oss.Client, error) {
// Dapatkan kredensial akses dari variabel lingkungan.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return nil, err
}
// Buat instance OSSClient.
// Isi yourRegion dengan region tempat Bucket berada. Sebagai contoh, untuk China Timur 1 (Hangzhou), isi dengan cn-hangzhou. Untuk region lain, isi sesuai situasi aktual.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Atur versi tanda tangan
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New(endpoint, "", "", clientOptions...)
if err != nil {
return nil, err
}
return client, nil
}
func main() {
// Isi yourEndpoint dengan endpoint yang sesuai dengan Bucket. Sebagai contoh, untuk China Timur 1 (Hangzhou), isi dengan https://oss-cn-hangzhou.aliyuncs.com. Untuk region lain, isi sesuai situasi aktual.
endpoint := "yourEndpoint"
// Periksa apakah variabel lingkungan telah diatur.
if endpoint == "" {
log.Fatal("Please set yourEndpoint.")
}
// Atur dan buat instance klien OSS.
client, err := setupClient(endpoint)
if err != nil {
handleError(err)
}
// Keluarkan informasi klien.
log.Printf("Client: %#v\n", client)
}Buat Client baru menggunakan nama domain kustom
Kode berikut menunjukkan cara membuat Client baru menggunakan nama domain kustom. Untuk informasi selengkapnya tentang cara mengakses OSS melalui nama domain kustom, lihat Akses OSS dengan nama domain kustom.
Anda tidak dapat menggunakan metode ossClient.listBuckets dengan nama domain kustom.
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError menangani error yang tidak dapat dipulihkan, mencatat pesan error, dan menghentikan program.
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// setupClient menyiapkan dan membuat instans client OSS yang mendukung CNAME.
// Parameter:
//
// endpoint - Nama domain kustom yang dilampirkan ke bucket.
//
// Mengembalikan instans client OSS yang telah dibuat.
func setupClient(endpoint string) (*oss.Client, error) {
// Dapatkan kredensial akses dari variabel lingkungan.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return nil, err
}
// Buat instans OSSClient dan aktifkan dukungan CNAME.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk China (Hangzhou), setel ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah yang sebenarnya.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
clientOptions = append(clientOptions, oss.UseCname(true))
// Setel versi signature.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New(endpoint, "", "", clientOptions...)
if err != nil {
return nil, err
}
return client, nil
}
func main() {
// Setel yourEndpoint ke nama domain kustom bucket.
// Contoh: "custom-domain-for-your-bucket.com".
endpoint := "yourEndpoint"
// Periksa apakah variabel lingkungan telah disetel.
if endpoint == "" {
log.Fatal("Please set yourEndpoint.")
}
// Siapkan dan buat instans client OSS yang mendukung CNAME.
client, err := setupClient(endpoint)
if err != nil {
handleError(err)
}
// Cetak informasi client.
log.Printf("Client: %#v\n", client)
}
Konfigurasikan Client
Anda dapat mengonfigurasi parameter Client, seperti proxy, timeout koneksi, dan jumlah koneksi maksimum.
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 HTTP dalam detik. Nilai default: 10 detik. Nilai 0 berarti tanpa timeout. | oss.Timeout |
ReadWriteTimeout | Periode timeout baca/tulis HTTP dalam detik. Nilai default: 20 detik. Nilai 0 berarti tanpa timeout. | oss.Timeout |
IsCname | Menentukan apakah akan menggunakan nama domain kustom sebagai Endpoint. Fitur ini dinonaktifkan secara default. | oss.UseCname |
UserAgent | Menyetel 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:
| oss.AuthProxy |
ProxyUser | Username untuk autentikasi server proxy. | oss.AuthProxy |
ProxyPassword | Password untuk autentikasi server proxy. | oss.AuthProxy |
RedirectEnabled | Menentukan apakah akan mengaktifkan pengalihan HTTP. Nilai yang valid:
| oss.RedirectEnabled |
InsecureSkipVerify | Menentukan apakah akan mengaktifkan validasi sertifikat SSL. Nilai yang valid:
| oss.InsecureSkipVerify |
IsEnableCRC | Menentukan apakah akan mengaktifkan validasi data CRC. Nilai yang valid:
| oss.EnableCRC |
LogLevel | Menyetel mode log. Nilai yang valid:
| oss.SetLogLevel |
Kode berikut memberikan contoh konfigurasi:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError menangani error yang tidak dapat dipulihkan, mencatat pesan error, dan menghentikan program.
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// setupClient menyiapkan dan membuat instans client OSS.
// Parameter:
//
// endpoint - Endpoint bucket.
//
// Mengembalikan instans client OSS yang telah dibuat.
func setupClient(endpoint string) (*oss.Client, error) {
// Dapatkan kredensial akses dari variabel lingkungan.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return nil, err
}
// Setel jumlah maksimum koneksi ke 10, jumlah maksimum koneksi idle per host ke 20, dan jumlah maksimum koneksi per host ke 20.
conn := oss.MaxConns(10, 20, 20)
// Setel timeout koneksi HTTP ke 20 detik dan timeout baca/tulis HTTP ke 60 detik.
time := oss.Timeout(20, 60)
// Tentukan apakah akan menggunakan nama domain kustom sebagai Endpoint. Nilai default adalah false.
cname := oss.UseCname(true)
// Setel header User-Agent untuk permintaan HTTP. Nilai default adalah aliyun-sdk-go.
userAgent := oss.UserAgent("aliyun-sdk-go")
// Tentukan apakah akan mengaktifkan pengalihan HTTP. Nilai default adalah true.
redirect := oss.RedirectEnabled(true)
// Tentukan apakah akan mengaktifkan validasi sertifikat SSL. Nilai default adalah melewati validasi.
verifySsl := oss.InsecureSkipVerify(false)
// Setel alamat dan port server proxy.
// proxy := oss.Proxy("yourProxyHost")
// Setel alamat host dan port server proxy, serta username dan password untuk autentikasi server proxy.
authProxy := oss.AuthProxy("yourProxyHost", "yourProxyUserName", "yourProxyPassword")
// Aktifkan validasi data CRC.
crc := oss.EnableCRC(true)
// Setel mode log.
logLevel := oss.SetLogLevel(oss.LogOff)
// Buat instans OSSClient.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk China (Hangzhou), setel ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah yang sebenarnya.
client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(&provider), oss.Region("yourRegion"), oss.AuthVersion(oss.AuthV4),
conn, time, cname, userAgent, authProxy, verifySsl, redirect, crc, logLevel)
if err != nil {
return nil, err
}
return client, nil
}
func main() {
// Setel yourEndpoint ke Endpoint bucket. Misalnya, untuk China (Hangzhou), setel ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan Endpoint yang sebenarnya.
endpoint := "yourEndpoint"
// Periksa apakah variabel lingkungan telah disetel.
if endpoint == "" {
log.Fatal("Please set yourEndpoint.")
}
// Siapkan dan buat instans client OSS.
client, err := setupClient(endpoint)
if err != nil {
handleError(err)
}
// Cetak informasi client.
log.Printf("Client: %#v\n", client)
}
Setel konteks permintaan
Anda dapat menggunakan konteks permintaan untuk mengontrol dan mengelola siklus hidup permintaan serta meneruskan informasi terkait konteks.
Kode berikut menunjukkan cara menyetel konteks permintaan. Fitur ini hanya didukung mulai dari OSS Go SDK versi 2.2.9 dan yang lebih baru.
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError menangani error yang tidak dapat dipulihkan, mencatat pesan error, dan menghentikan program.
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// uploadFile mengunggah file lokal ke bucket OSS.
// Parameter:
//
// bucketName - Nama bucket.
// objectName - Path lengkap objek. Path lengkap tidak termasuk nama bucket.
// localFileName - Path lengkap file lokal.
// endpoint - Endpoint bucket.
//
// Jika unggah berhasil, log keberhasilan dicatat. Jika tidak, error dikembalikan.
func uploadFile(bucketName, objectName, localFileName, endpoint string) error {
// Dapatkan kredensial akses dari variabel lingkungan.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return err
}
// Buat instans OSSClient.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk China (Hangzhou), setel ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah yang sebenarnya.
client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(&provider), oss.Region("yourRegion"), oss.AuthVersion(oss.AuthV4))
if err != nil {
return err
}
// Dapatkan bucket.
bucket, err := client.Bucket(bucketName)
if err != nil {
return err
}
// Setel konteks permintaan.
ctx := context.Background()
// Tentukan timeout untuk konteks permintaan.
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
// Unggah file lokal ke OSS.
err = bucket.PutObjectFromFile(objectName, localFileName, oss.WithContext(ctx))
if err != nil {
select {
case <-ctx.Done():
return fmt.Errorf("Request cancelled or timed out")
default:
return err
}
}
// Setelah file diunggah, catat log.
log.Printf("File uploaded successfully: %s/%s", bucketName, objectName)
return nil
}
func main() {
// Setel yourEndpoint ke Endpoint bucket. Misalnya, untuk China (Hangzhou), setel ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan Endpoint yang sebenarnya.
endpoint := "yourEndpoint"
// Tentukan nama bucket, misalnya examplebucket.
bucketName := "examplebucket"
// Setel yourObjectName ke path lengkap objek. Path lengkap tidak termasuk nama bucket.
objectName := "yourObjectName"
// Setel yourLocalFile ke path lengkap file lokal.
localFileName := "yourLocalFile"
// Periksa apakah variabel lingkungan telah disetel.
if endpoint == "" || bucketName == "" || objectName == "" || localFileName == "" {
log.Fatal("Please set yourEndpoint, bucketName, objectName, and localFileName.")
}
// Coba unggah file. Jika gagal, tangani error tersebut.
if err := uploadFile(bucketName, objectName, localFileName, endpoint); err != nil {
handleError(err)
}
// Cetak pesan yang menunjukkan bahwa unggah berhasil.
log.Println("Upload Success!")
}