Created
August 15, 2023 20:44
-
-
Save ekzhang/2ba48f9350f6e3f0675c071946b760d8 to your computer and use it in GitHub Desktop.
package r2test for baseline latency
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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