go

پلتفرم Golang

(Golang Platform)

اتصال به ذخیره‌سازی ابری

بدون شک اتصال برنامه به یک ذخیره‌سازی ابری مطمئن برای نگهداری و ارائه فایل‌های استاتیک وب‌سایت یا داده‌های آپلود شده توسط کاربران، باعث اطمینان خاطر صاحبان کسب و کار و بهبود عملکرد برنامه‌ می‌شود.

فهرست عناوین:

نصب AWS SDK

از آنجا که ذخیره‌سازی ابری لیارا یک سرویس Object storage سازگار با پروتکل S3 است، شما می‌توانید با استفاده از AWS SDK‌، در زبان‌ها و فریم‌ورک‌های مختلفی این فضای ذخیره‌سازی را مدیریت کنید. حال برای اتصال به ذخیره‌سازی ابری در Golang باید با اجرای دستورهای زیر، پکیج‌های مورد نیاز را نصب کنید:

$ 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/service/s3

دریافت کلیدها

اگر باکت شما خصوصی باشد، برای دسترسی به باکت، نیاز به کلید دارید. برای ساخت کلید، به صفحه ذخیره‌سازی ابری رفته و طبق عکس‌ها کلیدخود را بسازید.

به قسمت کلیدها رفته:

یک کلید جدید بسازید.

کلیدهای ساخته‌شده را ذخیره کنید. توجه داشته‌باشید که SECRET_KEY تنها یک بار نمایش داده می‌شود و پس از آن باید کلید را درجایی مطمئن ذخیره کنید.

تنظیم متغیر‌های محیطی

در این مرحله باید کلیدها، نام باکت و endpoint لیارا را در فایل .env ذخیره کنید:

LIARA_ENDPOINT=https://<Liara Bucket Endpoint>
LIARA_BUCKET_NAME=<Bucket Name>
LIARA_ACCESS_KEY=<Access Key>
LIARA_SECRET_KEY=<Secret Key>

لطفا توجه داشته‌باشید که باید هریک از مقادیر بالا را با متغیر های باکت‌خودتان‌ جایگزین کنید. به عنوان مثال، یک فایل .env می‌تواند به شکل زیر باشد:

LIARA_ENDPOINT=https://storage.iran.liara.space
LIARA_BUCKET_NAME=my-personal-files
LIARA_ACCESS_KEY=nad4u71et9dgc3go
LIARA_SECRET_KEY=82c963df-1122-4c31-868b-0124a28ad57d

نحوه‌ی استفاده

قطعه کد زیر، یک تابع نمونه است که طریقه اتصال و آپلود فایل به باکت در برنامه golang را نشان می‌دهد:

func upload_using_s3(fileContent *bytes.Reader, fileName string) error {

  err := godotenv.Load()
  if err != nil {
      log.Fatal("Error loading .env file")}

  cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-west-2"))
  if err != nil {
    return err
  }

  // Define AWS credentials and bucket information
  awsAccessKeyID     := os.Getenv("LIARA_ACCESS_KEY")     
  awsSecretAccessKey := os.Getenv("LIARA_SECRET_KEY")  
  endpoint           := os.Getenv("LIARA_ENDPOINT")
  bucketName         := os.Getenv("LIARA_BUCKET_NAME")     

  // Initialize S3 client with custom configuration
  cfg.Credentials = aws.CredentialsProviderFunc(func(ctx context.Context) (aws.Credentials, error) {
    return aws.Credentials{
    AccessKeyID:     awsAccessKeyID,
    SecretAccessKey: awsSecretAccessKey,
    }, nil
  })

  cfg.BaseEndpoint = aws.String(endpoint)

  client := s3.NewFromConfig(cfg)

  // Specify the destination key in the bucket
  destinationKey := "uploads/" + fileName

  // Use the S3 client to upload the file
  _, err = client.PutObject(context.TODO(), &s3.PutObjectInput{
  Bucket: aws.String(bucketName),
  Key:    aws.String(destinationKey),
  Body:   fileContent,
  })

  return err
}

از تابع فوق می‌توان در بدنه اصلی برنامه (تابع main)، به شکل زیر استفاده کرد:

func main() {
// Example: Upload a file to S3
fileName := "example.txt"
fileContent := []byte("Hello, S3!")

err := upload_using_s3(bytes.NewReader(fileContent), fileName)
if err != nil {
  log.Fatalf("failed to upload file, %v", err)
}

fmt.Printf("File uploaded successfully!\n")}

کد کامل برنامه:

package main

import (
	"bytes"
	"context"
	"fmt"
	"log"
    "os"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/s3"
    "github.com/joho/godotenv"
)

func upload_using_s3(fileContent *bytes.Reader, fileName string) error {

    err := godotenv.Load()
	if err != nil {log.Fatal("Error loading .env file")}

	cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-west-2"))
	if err != nil {
		return err
	}

	// Define AWS credentials and bucket information
	awsAccessKeyID     := os.Getenv("LIARA_ACCESS_KEY")     
	awsSecretAccessKey := os.Getenv("LIARA_SECRET_KEY")  
	endpoint           := os.Getenv("LIARA_ENDPOINT")
	bucketName         := os.Getenv("LIARA_ENDPOINT")     

	// Initialize S3 client with custom configuration
	cfg.Credentials = aws.CredentialsProviderFunc(func(ctx context.Context) (aws.Credentials, error) {
		return aws.Credentials{
			AccessKeyID:     awsAccessKeyID,
			SecretAccessKey: awsSecretAccessKey,
		}, nil
	})

    cfg.BaseEndpoint = aws.String(endpoint)

	client := s3.NewFromConfig(cfg)

	// Specify the destination key in the bucket
	destinationKey := "uploads/" + fileName

	// Use the S3 client to upload the file
	_, err = client.PutObject(context.TODO(), &s3.PutObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(destinationKey),
		Body:   fileContent,
	})

	return err
}

func main() {
	// Example: Upload a file to S3
	fileName := "example.txt"
	fileContent := []byte("Hello, S3!")

	err := upload_using_s3(bytes.NewReader(fileContent), fileName)
	if err != nil {
		log.Fatalf("failed to upload file, %v", err)
	}

	fmt.Printf("File uploaded successfully!
")
}

برای اطلاعات بیشتر می‌توانید به مستندات golang s3 مراجعه کنید.


متوجه شدم، برو گام بعدی!
;