سرویس آبجکت‌استوریج ستون از لیست بدون ترتیب در عملیات‌ ListObjectsV2 و ListObjects پشتیبانی می‌کند.

این عملیات مانند لیست مرتب‌شده، همه یا تعدادی از آبجکت‌های داخل باکت (تا سقف ۱۰۰۰تا) را در هر درخواست کاربر برمی‌گرداند. اما در این روش لزوماً ترتیب آبجکت‌ها رعایت نمی‌شود.

عملیات لیست بدون ترتیب هزینه‌ی کمتری برای سرویس آبجکت‌استوریج دارد. هم‌چنین در این روش ratelimit‌های ساده‌تری وجود دارند.

توجه کنید که در زمان آخرین ویرایش این مستند،‌ کلاینت‌ها (مانند aws cli و s3cmd) و sdkها (مانند boto3 و aws-sdk-go) از لیست بدون ترتیب پشتیبانی نمی‌کنند. پیاده‌سازی ماژول‌ها باید توسط کاربر و یا از طریق اکستنشن‌های خارجی مانند این مثال انجام گیرد که در مثال‌های زیر توضیح داده شده است.

کوئری پارامتر allow-unordered

با افزودن پارامتر کوئری allow-unordered به انتهای ریکوئست ListObjectsV2 و ListObjects می‌توانید ترتیب داشتن یا نداشتن آن را کنترل کنید. این پارامتر یک boolean با مقادیر مجاز true و false است.

نمونه ریکوئست curl روی دیتاسنتر ندا:

curl --location --request GET 'https://s3-website.thr1.sotoon.ir/<bucket-name>?allow-unordered=true?list-type=2' \
--header 'X-Amz-Content-Sha256: <sha256-sum>' \
--header 'X-Amz-Date: <date>' \
--header 'Authorization: <credentials>'

مثال‌هایی از پیاده‌سازی لیست unordered

در مثال‌های زیر سعی بر این است که با تغییر در نحوه‌ی استفاده از sdk‌های رسمی سرویس s3، عملیات ListObjectsV2 و ListObjects را به حالت allow-unordered اجرا کنیم.

aws-sdk-go (Golang)

کد زیر یک نمونه از اجرای عملیات لیست بدون ترتیب با استفاده از ماژول رسمی aws-sdk-go است:

package main
 
import (
    "encoding/xml"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "time"
 
    "github.com/aws/aws-sdk-go/aws/credentials"
    v4 "github.com/aws/aws-sdk-go/aws/signer/v4"
)
 
const (
    s3Endpoint = "https://s3-website.thr1.sotoon.ir"
    s3Bucket   = "<bucket-name>"
    accessKey  = "<access-key>"
    secretKey  = "<secret-key>"
)
 
type S3FileInfo struct {
    Key      	string	`xml:"Key"`
    LastModified time.Time `xml:"LastModified"`
    ETag     	string	`xml:"ETag"`
    Size     	int64 	`xml:"Size"`
    StorageClass string	`xml:"StorageClass"`
    Type     	string	`xml:"Type"`
}
 
type ListBucketResult struct {
    Name              	string   	`xml:"Name"`
    Prefix            	string   	`xml:"Prefix"`
    MaxKeys           	int64    	`xml:"MaxKeys"`
    IsTruncated       	bool     	`xml:"IsTruncated"`
    NextContinuationToken string   	`xml:"NextContinuationToken"`
    KeyCount          	int64    	`xml:"KeyCount"`
    Contents          	[]S3FileInfo `xml:"Contents"`
}
 
func main() {
    req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/%s", s3Endpoint, s3Bucket), nil)
    if err != nil {
   	 log.Fatal(err)
    }
 
    q := req.URL.Query()
    q.Add("list-type", "2")
    q.Add("allow-unordered", "true")
    req.URL.RawQuery = q.Encode()
 
    signer := v4.NewSigner(credentials.NewStaticCredentials(accessKey, secretKey, ""))
    signer.Sign(req, nil, "s3", "us-east", time.Now())
 
    client := &http.Client{}
 
    resp, err := client.Do(req)
    if err != nil {
   	 panic(fmt.Errorf("error when sending request to the server [%s]", err.Error()))
    }
    if resp.StatusCode != 200 {
   	 panic(fmt.Errorf("request failed [%s]", resp.Status))
    }
 
    defer resp.Body.Close()
    responseBody, err := ioutil.ReadAll(resp.Body)
    if err != nil {
   	 panic(fmt.Errorf("error in response body [%s]", err.Error()))
    }
    var responseXml ListBucketResult
    err = xml.Unmarshal([]byte(responseBody), &responseXml)
    if err != nil {
   	 panic(fmt.Errorf("error in response un-marshalling [%s]", err.Error()))
    }
 
    result, _ := xml.Marshal(responseXml)
    fmt.Println(string(result))
}

boto3 (Python)

لیست بدون ترتیب به طور پیش‌فرض توسط boto3 پشتیبانی نمی‌شود، ولی می‌توان آن را با استفاده از مدل‌های افزوده s3 aws اضافه کرد.

برای این کار ابتدا این فایل را دانلود کرده و آن را در مسیر زیر قرار دهید:

.aws/models/s3/2006-03-01/

سپس می‌توانید هنگام استفاده از متد list_objects با استفاده از آرگومان کلیدی AllowUnordered،‌ مرتب بودن یا نبودن عملیات لیست را کنترل کنید، برای مثال:

client.list_objects(Bucket="<bucket-name>", AllowUnordered=True)

توجه کنید که در این فایل کانفیگ، در آخرین ویرایش این مستند، این آرگومان هنوز برای متد list_objects_v2 پیاده‌سازی نشده است.

هم‌چنین توجه داشته باشید که این تغییر ممکن‌ است علاوه بر boto3 بر روی کلاینت‌هایی که به شکل مستقیم و یا غیر مستقیم از boto3 استفاده می‌کنند نیز اعمال شود.

برای مثال‌های بیشتر به این لینک مراجعه کنید.

s3cmd (Python)

در کلاینت s3cmd به تازگی پشتیبانی از لیست بدون ترتیب پیاده‌سازی شده است که در زمان ویرایش این مستند هنوز در یک release موجود نیست، اما می‌توانید به شکل مستقیم از برنچ master پروژه s3cmd در این لینک به آن دسترسی پیدا کنید.

برای استفاده از لیست بدون ترتیب در s3cmd دو روش موجود است:

1 - افزودن سوییچ —list-allow-unordered به انتهای هر کامندی که عملیات لیست در آن وجود دارد مانند:

s3cmd ls s3://<bucket-name> --list-allow-unordered

2 - استفاده از کانفیگ list_allow_unordered با مقدار True در کانفیگ s3cmd