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