Panduan untuk Mengintegrasikan dengan Layanan Cloud Storage Non-AWS yang Mendukung Protokol S3 menggunakan Golang

Yuda Prasetiya
3 min readApr 18, 2024

Contoh Praktis Penerapan Integrasi Protokol S3 dengan Cloud Storage Non-AWS menggunakan Go

Introduction

Protokol Simple Storage Service (S3) adalah antarmuka standar yang dikembangkan oleh Amazon Web Services (AWS) untuk menyimpan dan mengambil data di cloud. Ini adalah penyimpanan Key-Value, artinya setiap bagian data (objek) dikaitkan dengan unique identifier (key) yang digunakan untuk mengakses data tersebut. Protokol S3 sangat penting dalam layanan penyimpanan cloud karena beberapa alasan:

  1. Skalabilitas
    S3 memungkinkan penyimpanan yang hampir tidak terbatas, sehingga ideal untuk aplikasi yang perlu melakukan penskalaan dengan cepat atau menangani data dalam jumlah besar.
  2. Daya Tahan dan Ketersediaan
    S3 dirancang untuk daya tahan 99,999999999% (11 9), yang berarti kemungkinan kehilangan data sangat rendah. Ini juga menjamin ketersediaan 99,99%, memastikan data Anda dapat diakses saat Anda membutuhkannya.
  3. Keamanan
    S3 menyediakan fitur keamanan yang kuat, termasuk enkripsi untuk data diam dan dalam transit, kebijakan kontrol akses, dan kemampuan logging.
  4. Interoperabilitas
    Banyak penyedia penyimpanan cloud, tidak hanya AWS, mendukung protokol S3, menjadikannya pilihan serbaguna bagi pengembang.
  5. Hemat Biaya
    Dengan S3, Anda hanya membayar penyimpanan yang Anda gunakan, menjadikannya solusi hemat biaya untuk semua ukuran bisnis.

Singkatnya, protokol S3 adalah solusi yang andal, aman, dan terukur untuk menyimpan data di cloud, menjadikannya landasan aplikasi berbasis cloud modern.

Menyiapkan Go Environment

Install AWS SDK, jalankan perintah dibawah ini untuk menginstall di project kita :

go get github.com/aws/aws-sdk-go-v2/aws
go get github.com/aws/aws-sdk-go-v2/config
go get github.com/aws/aws-sdk-go-v2/credentials
go get github.com/aws/aws-sdk-go-v2/feature/s3/manager
go get github.com/aws/aws-sdk-go-v2/service/s3

Project Sederhana untuk mengunggah file

AWS SDK Wrapper

package s3client

import (
"context"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
"github.com/aws/aws-sdk-go-v2/service/s3"
"io"
"log"
"sync"
)

var (
uploader *manager.Uploader
once sync.Once
)

func setup() {
endpoint := "http://s3-test-endpoint.com"
accessKey := "XVXQ8Q3QGQ9QXQ8QXQ8Q"
secretKey := "/XQ8Q3QGQ9QXQ8QXQ8QXQ/Q3QGQ9QXQ8QXQ8QXQ8"

resolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
return aws.Endpoint{
URL: endpoint,
HostnameImmutable: true,
Source: aws.EndpointSourceCustom,
}, nil
})
awsConfig, err := config.LoadDefaultConfig(context.TODO(),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accessKey, secretKey, "")),
config.WithEndpointResolverWithOptions(resolver),
config.WithRegion("auto"),
)
if err != nil {
log.Fatalf("failed to load config, %v", err)
}

uploader = manager.NewUploader(s3.NewFromConfig(awsConfig)) // Initialize S3 client
}

func UploadFile(ctx context.Context, bucket, filename string, file io.Reader) (string, error) {
once.Do(setup)
result, err := uploader.Upload(ctx, &s3.PutObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(filename),
Body: file,
ACL: "public-read",
})
if err != nil {
log.Fatalf("failed to upload file, %v", err)
}

return result.Location, nil
}

Mengapa kita perlu membungkus (Wrap) library pihak ketiga?

Tujuan wrapper adalah untuk menyederhanakan interface dari library, menyesuaikannya agar sesuai dengan kebutuhan spesifik aplikasi kita, atau menambahkan fungsionalitas tambahan. Dalam hal ini kita menyederhanakan proses pengunggahan file ke S3 dengan menyediakan fungsi UploadFileyang menangani proses pengaturan dan pengunggahan. Hal ini memudahkan aplikasi kita yang lain untuk mengunggah file ke S3, karena hanya perlu memanggil s3client.UploadFile dengan parameter yang sesuai.

Yuk, kita bahas code-nya!

Kita perlu menyiapkan project kita agar terhubung dengan layanan Cloud Storage, dalam fungsi setup ada 2 langkah utama yang perlu kita soroti.

Pertama, dalam parameter resolver kita perlu menggunakan aws.EndpointSourceCustom untuk menunjukkan bahwa kita tidak terhubung ke endpoint AWS.

Kedua, config.WithRegion(“auto”) saat memuat konfigurasi default di fungsiconfig.LoadDefaultConfig.

Kemudian pada fungsi UploadFile kita menggunakan once.Do(setup) untuk memastikan fungsi setup hanya dipanggil satu kali.

Main Function

Kita akan membuat server sederhana menggunakan librarychi, kemudian membuat POST API untuk mengunggah file ke S3 Cloud Storage. Juga endpointHello World” untuk memastikan server kita berfungsi 😆.

package main

import (
"github.com/go-chi/chi/v5"
"github.com/yudaph/s3-integration/s3client"
"net/http"
)

func main() {
r := chi.NewRouter()

r.Get("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
})

r.Post("/", HandleUpload)
http.ListenAndServe(":8080", r)
}

func HandleUpload(w http.ResponseWriter, r *http.Request) {
file, header, err := r.FormFile("image")
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
defer file.Close()

// TODO: Do Validation

// Upload file to S3
filename := "suffix_" + header.Filename
url, err := s3client.UploadFile(r.Context(), "bucket-name", filename, file)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

w.Write([]byte(url))
}

Mari kita bahas fungsi HandlerUpload:

Kita akan menggunakan user.FormFile(“image") untuk mendapatkan file dari request, di framework lain seperti mux dan fiber kita hanya mendapatkan headernya, jadi jika kita perlu menggunakan header.Open() untuk mendapatkan file dari header(CMIIW).

Kemudian lakukan beberapa validasi, setelah itu kita cukup memanggil fungsi wrapper kita s3client.UploadFile untuk mengupload ke Cloud Storage kita.

Kesimpulan

Pada artikel ini kita mempelajari tentang protokol S3, cara mengintegrasikan dengan layanan Cloud Storage Non-AWS yang mendukung protokol S3, dan sedikit tentang wrapper.

Semoga artikel ini dapat bermanfaat. Jangan sungkan untuk memberikan kritik dan saran pada artikel ini.

Mari terhubung di https://www.linkedin.com/in/yudaph/ dan https://hackernoon.com/u/yudaph

Note :

English language articles can be found at : https://hackernoon.com/guide-to-integrating-with-non-aws-cloud-storage-services-supporting-the-s3-protocol-using-golang

--

--