Add initial S3 upload client
parent
3fa26a879c
commit
3125fb5e8a
@ -0,0 +1,62 @@
|
||||
package aws
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"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"
|
||||
)
|
||||
|
||||
// S3Client is a client for uploading data to S3.
|
||||
type S3Client struct {
|
||||
region string
|
||||
accessKey string
|
||||
secretKey string
|
||||
bucket string
|
||||
key string
|
||||
}
|
||||
|
||||
// NewS3Client returns an instance of an S3Client.
|
||||
func NewS3Client(region, accessKey, secretKey, bucket, key string) *S3Client {
|
||||
return &S3Client{
|
||||
region: region,
|
||||
accessKey: accessKey,
|
||||
secretKey: secretKey,
|
||||
bucket: bucket,
|
||||
key: key,
|
||||
}
|
||||
}
|
||||
|
||||
// String returns a string representation of the S3Client.
|
||||
func (s *S3Client) String() string {
|
||||
return fmt.Sprintf("s3://%s/%s", s.bucket, s.key)
|
||||
}
|
||||
|
||||
// Upload uploads data to S3.
|
||||
func (s *S3Client) Upload(ctx context.Context, reader io.Reader) error {
|
||||
sess, err := session.NewSession(&aws.Config{
|
||||
Region: aws.String(s.region),
|
||||
Credentials: credentials.NewStaticCredentials(s.accessKey, s.secretKey, ""),
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create S3 session: %w", err)
|
||||
}
|
||||
|
||||
uploader := s3manager.NewUploader(sess)
|
||||
|
||||
_, err = uploader.UploadWithContext(ctx, &s3manager.UploadInput{
|
||||
Bucket: aws.String(s.bucket),
|
||||
Key: aws.String(s.key),
|
||||
Body: reader,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to upload to S3: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package aws
|
||||
|
||||
import "testing"
|
||||
|
||||
func Test_NewS3Client(t *testing.T) {
|
||||
c := NewS3Client("region1", "access", "secret", "bucket2", "key3")
|
||||
if c.region != "region1" {
|
||||
t.Errorf("expected region to be %q, got %q", "region1", c.region)
|
||||
}
|
||||
if c.accessKey != "access" {
|
||||
t.Errorf("expected accessKey to be %q, got %q", "access", c.accessKey)
|
||||
}
|
||||
if c.secretKey != "secret" {
|
||||
t.Errorf("expected secretKey to be %q, got %q", "secret", c.secretKey)
|
||||
}
|
||||
if c.bucket != "bucket2" {
|
||||
t.Errorf("expected bucket to be %q, got %q", "bucket2", c.bucket)
|
||||
}
|
||||
if c.key != "key3" {
|
||||
t.Errorf("expected key to be %q, got %q", "key3", c.key)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_S3Client_String(t *testing.T) {
|
||||
c := NewS3Client("region1", "access", "secret", "bucket2", "key3")
|
||||
if c.String() != "s3://bucket2/key3" {
|
||||
t.Errorf("expected String() to be %q, got %q", "s3://bucket2/key3", c.String())
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue