Skip to content

Instantly share code, notes, and snippets.

@ekzhang
Created August 15, 2023 20:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ekzhang/2ba48f9350f6e3f0675c071946b760d8 to your computer and use it in GitHub Desktop.
Save ekzhang/2ba48f9350f6e3f0675c071946b760d8 to your computer and use it in GitHub Desktop.
package r2test for baseline latency
module r2test
go 1.20
require (
github.com/aws/aws-sdk-go-v2 v1.20.1
github.com/aws/aws-sdk-go-v2/config v1.18.33
github.com/aws/aws-sdk-go-v2/credentials v1.13.32
github.com/aws/aws-sdk-go-v2/service/s3 v1.38.2
)
require (
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.12 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.1 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.13 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.33 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.1 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.13.2 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.21.2 // indirect
github.com/aws/smithy-go v1.14.1 // indirect
)
// Connect to Cloudflare R2 and make a few requests, measuring average latency.
package main
import (
"context"
"fmt"
"io"
"log"
"strings"
"time"
"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/service/s3"
)
func main() {
// Construct a new API object
bucketName := "XXX"
accountId := "XXX"
accessKeyId := "XXX"
accessKeySecret := "XXX"
r2Resolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
return aws.Endpoint{
URL: fmt.Sprintf("https://%s.r2.cloudflarestorage.com", accountId),
}, nil
})
cfg, err := config.LoadDefaultConfig(context.TODO(),
config.WithEndpointResolverWithOptions(r2Resolver),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accessKeyId, accessKeySecret, "")),
)
if err != nil {
log.Fatal(err)
}
client := s3.NewFromConfig(cfg)
_, err = client.PutObject(context.TODO(), &s3.PutObjectInput{
Bucket: &bucketName,
Key: aws.String("test"),
Body: strings.NewReader("test"),
})
if err != nil {
log.Fatal(err)
}
start := time.Now()
listObjectsOutput, err := client.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
Bucket: &bucketName,
})
if err != nil {
log.Fatal(err)
}
log.Printf("%+v", listObjectsOutput)
log.Printf("list objects: %v", time.Since(start))
for {
start = time.Now()
getObjectOutput, err := client.GetObject(context.TODO(), &s3.GetObjectInput{
Bucket: &bucketName,
Key: aws.String("test"),
})
if err != nil {
log.Fatal(err)
}
// Read the object to a string
object, err := io.ReadAll(getObjectOutput.Body)
if err != nil {
log.Fatal(err)
}
log.Printf("read: %s", string(object))
log.Printf("get object: %v", time.Since(start))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment