شروع به کار پارتیشن S3 RGW #

اطلاعات دسترسی پارتیشن S3 #

پس از ساختن پارتیشن S3 و دریافت ایمیل اطلاع رسانی وارد داشبورد پشتیبان شده و در صفحه خانه داشبورد در وسط صفحه به سربرگ پارتیشن S3 بروید و روی منوی سه نقطه سمت چپ کارت پارتیشن کلیک کنید تا وارد بخش تنظیمات پارتیشن شوید. در سربرگ اطلاع دسترسی و سربرگ آدرس ها اطلاع دسترسی پارتیشن s3 خود را مشاهده خواهید کرد.

این مشخصات برای اتصال به آبجکت استوریج در اختیار شما قرار خواهد داشت.

کلید دسترسی (Access Key ID)

کلید خصوصی (Secret Access Key)

اندپوینت S3 (یک نام دامنه تایید شده برای فضای ابری شما یا FQDM)

نام  Bucket (که پس از ساخت پارتیشن به هر تعداد که نیازداشته باشید در پارتیشن ایجاد می‌کنید)

کلید دسترسی و کلید خصوصی مانند نام کاربری و رمز عبور پارتیشن S3 هستند و باید به خوبی از آنها محافظت کنید و در اختیار دیگران قرار ندهید.

مستندات AWS SDK Go #

برای دسترسی به مستندات کامل کتابخانه AWS SDK Go می‌توانید به مستندات ، گیت‌هاب نسخه اول و گیت‌هاب نسخه دوم این کتابخانه مراجعه کنید.

پیش نیاز و نصب aws-sdk-go #

با استفاده از Go Get این کتابخانه را نصب کنید:

go get github.com/aws/aws-sdk-go

به روزرسانی:

go get -u github.com/aws/aws-sdk-go
go get github.com/aws/aws-sdk-go/aws
go get github.com/aws/aws-sdk-go/aws/session
go get github.com/aws/aws-sdk-go/service/s3

نصب نسخه دوم:

mkdir ~/helloaws
cd ~/helloaws
go mod init helloaws

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/dynamodb

اجرای کد:

go run .

کانفیگ اطلاعات دسترسی در Go #

روش اول با ایجاد فایل کانفیگ #

Access Key و Secret Key را در فایل به این صورت قرار دهید:

mkdir ~/.aws    touch ~/.aws/credentials
echo "[default]
aws_access_key_id = <ACCESS_KEY>
aws_secret_access_key = <SECRET_KEY>" > ~/.aws/credentials

و اجرا کنید

package main

import (
    "fmt"
    "os"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func main() {
    sess := session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    }))
    svc := s3.New(sess, &aws.Config{
        Region:   aws.String("default"),
        Endpoint: aws.String("<ENDPOINT_URL>"),
    })
}


روش دوم Hard-coding #

Access Key و Secret Key را در کد به صورت زیر استفاده کنید:

package main

import (
    "fmt"
    "os"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func main() {
    sess, err := session.NewSession(&aws.Config{
        Credentials: credentials.NewStaticCredentials("<ACCESS_KEY>", "<SECRET_KEY>", ""),
    })
    svc := s3.New(sess, &aws.Config{
        Region:   aws.String("default"),
        Endpoint: aws.String("<ENDPOINT_URL>"),
    })

    if err != nil {
        // handle error
    } else {
        // success
    }
}


ساخت باکت #

package main

import (
    "fmt"
    "os"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

// Creates an S3 Bucket in the region configured in the shared config
// or AWS_REGION environment variable.
//
// Usage:
//    go run s3_create_bucket BUCKET_NAME
func main() {
    if len(os.Args) != 2 {
        exitErrorf("Bucket name missing!\nUsage: %s bucket_name", os.Args[0])
    }

    bucket := os.Args[1]

    sess, err := session.NewSession(&aws.Config{
        Credentials: credentials.NewStaticCredentials("<ACCESS_KEY>", "<SECRET_KEY>", ""),
    })
    svc := s3.New(sess, &aws.Config{
        Region:   aws.String("default"),
        Endpoint: aws.String("<ENDPOINT_URL>"),
    })

    // Create the S3 Bucket
    _, err = svc.CreateBucket(&s3.CreateBucketInput{
        Bucket: aws.String(bucket),
    })
    if err != nil {
        exitErrorf("Unable to create bucket %q, %v", bucket, err)
    }

    // Wait until bucket is created before finishing
    fmt.Printf("Waiting for bucket %q to be created...\n", bucket)

    err = svc.WaitUntilBucketExists(&s3.HeadBucketInput{
        Bucket: aws.String(bucket),
    })
    if err != nil {
        exitErrorf("Error occurred while waiting for bucket to be created, %v", bucket)
    }

    fmt.Printf("Bucket %q successfully created\n", bucket)
}

func exitErrorf(msg string, args ...interface{}) {
    fmt.Fprintf(os.Stderr, msg+"\n", args...)
    os.Exit(1)
}

آپلود فایل در باکت #

با این فرض که فایل را با نام s3_upload_object.go ذخیره کنید.

package main

import (
    "fmt"
    "os"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
)

// Creates a S3 Bucket in the region configured in the shared config
// or AWS_REGION environment variable.
//
// Usage:
//    go run s3_upload_object.go BUCKET_NAME FILENAME
func main() {
    if len(os.Args) != 3 {
        exitErrorf("bucket and file name required\nUsage: %s bucket_name filename",
            os.Args[0])
    }

    bucket := os.Args[1]
    filename := os.Args[2]

    file, err := os.Open(filename)
    if err != nil {
        exitErrorf("Unable to open file %q, %v", err)
    }

    defer file.Close()

    // Initialize a session in us-west-2 that the SDK will use to load
    // credentials from the shared credentials file ~/.aws/credentials.

    sess, err := session.NewSession(&aws.Config{
        Credentials: credentials.NewStaticCredentials("<ACCESS_KEY>", "<SECRET_KEY>", ""),
        Region:      aws.String("default"),
        Endpoint:    aws.String("<ENDPOINT_URL>"),
    })

    // Setup the S3 Upload Manager. Also see the SDK doc for the Upload Manager
    // for more information on configuring part size, and concurrency.
    //
    // http://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/#NewUploader
    uploader := s3manager.NewUploader(sess)

    // Upload the file's body to S3 bucket as an object with the key being the
    // same as the filename.
    _, err = uploader.Upload(&s3manager.UploadInput{
        Bucket: aws.String(bucket),

        // Can also use the `filepath` standard library package to modify the
        // filename as need for an S3 object key. Such as turning absolute path
        // to a relative path.
        Key: aws.String(filename),

        // The file to be uploaded. io.ReadSeeker is preferred as the Uploader
        // will be able to optimize memory when uploading large content. io.Reader
        // is supported, but will require buffering of the reader's bytes for
        // each part.
        Body: file,
    })
    if err != nil {
        // Print the error and exit.
        exitErrorf("Unable to upload %q to %q, %v", filename, bucket, err)
    }

    fmt.Printf("Successfully uploaded %q to %q\n", filename, bucket)
}

func exitErrorf(msg string, args ...interface{}) {
    fmt.Fprintf(os.Stderr, msg+"\n", args...)
    os.Exit(1)
}


اجرای کد :

go run s3_upload_object.go BUCKET_NAME FILENAME

آپلود فایل به روش pre-signed بدون نیاز به اطلاعات دسترسی #

با این فرض که فایل را با نام upload_presigned.go ذخیره کنید.

package main

import (
    "fmt"
    "os"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
)

// Creates a S3 Bucket in the region configured in the shared config
// or AWS_REGION environment variable.
//
// Usage:
//    go run s3_upload_object.go BUCKET_NAME FILENAME
func main() {
    if len(os.Args) != 3 {
        exitErrorf("bucket and file name required\nUsage: %s bucket_name filename",
            os.Args[0])
    }

    bucket := os.Args[1]
    filename := os.Args[2]

    file, err := os.Open(filename)
    if err != nil {
        exitErrorf("Unable to open file %q, %v", err)
    }

    defer file.Close()

    // Initialize a session in us-west-2 that the SDK will use to load
    // credentials from the shared credentials file ~/.aws/credentials.

    sess, err := session.NewSession(&aws.Config{
        Credentials: credentials.NewStaticCredentials("<ACCESS_KEY>", "<SECRET_KEY>", ""),
        Region:      aws.String("default"),
        Endpoint:    aws.String("<ENDPOINT_URL>"),
    })

    // Setup the S3 Upload Manager. Also see the SDK doc for the Upload Manager
    // for more information on configuring part size, and concurrency.
    //
    // http://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/#NewUploader
    uploader := s3manager.NewUploader(sess)

    // Upload the file's body to S3 bucket as an object with the key being the
    // same as the filename.
    _, err = uploader.Upload(&s3manager.UploadInput{
        Bucket: aws.String(bucket),

        // Can also use the `filepath` standard library package to modify the
        // filename as need for an S3 object key. Such as turning absolute path
        // to a relative path.
        Key: aws.String(filename),

        // The file to be uploaded. io.ReadSeeker is preferred as the Uploader
        // will be able to optimize memory when uploading large content. io.Reader
        // is supported, but will require buffering of the reader's bytes for
        // each part.
        Body: file,
    })
    if err != nil {
        // Print the error and exit.
        exitErrorf("Unable to upload %q to %q, %v", filename, bucket, err)
    }

    fmt.Printf("Successfully uploaded %q to %q\n", filename, bucket)
}

func exitErrorf(msg string, args ...interface{}) {
    fmt.Fprintf(os.Stderr, msg+"\n", args...)
    os.Exit(1)
}


اجرای کد

go run upload_presigned.go BUCKET FILENAME

اگر مقدار Body در تابع PutObjectRequest تعریف نشده باشد و نیز مقدار Hash به سرآیند (Header) این تابع اضافه نگردیده باشید کاربر میتواند با این URL آبجکت با هر مقداری را بارگذاری نماید.

برای دسترسی به مستندات کامل کتابخانه AWS SDK Go می‌توانید به مستندات ، گیت‌هاب نسخه اول و گیت‌هاب نسخه دوم این کتابخانه مراجعه کنید.