Panduan untuk Mengintegrasikan dengan Layanan Cloud Storage Non-AWS yang Mendukung Protokol S3 menggunakan Golang
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:
- Skalabilitas
S3 memungkinkan penyimpanan yang hampir tidak terbatas, sehingga ideal untuk aplikasi yang perlu melakukan penskalaan dengan cepat atau menangani data dalam jumlah besar. - 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. - Keamanan
S3 menyediakan fitur keamanan yang kuat, termasuk enkripsi untuk data diam dan dalam transit, kebijakan kontrol akses, dan kemampuan logging. - Interoperabilitas
Banyak penyedia penyimpanan cloud, tidak hanya AWS, mendukung protokol S3, menjadikannya pilihan serbaguna bagi pengembang. - 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 UploadFile
yang 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 endpoint “Hello 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