s3_sessions.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package s3_backend
  2. import (
  3. "fmt"
  4. "github.com/seaweedfs/seaweedfs/weed/util/version"
  5. "sync"
  6. "github.com/aws/aws-sdk-go/aws"
  7. "github.com/aws/aws-sdk-go/aws/credentials"
  8. "github.com/aws/aws-sdk-go/aws/request"
  9. "github.com/aws/aws-sdk-go/aws/session"
  10. "github.com/aws/aws-sdk-go/service/s3"
  11. "github.com/aws/aws-sdk-go/service/s3/s3iface"
  12. )
  13. var (
  14. s3Sessions = make(map[string]s3iface.S3API)
  15. sessionsLock sync.RWMutex
  16. )
  17. func getSession(region string) (s3iface.S3API, bool) {
  18. sessionsLock.RLock()
  19. defer sessionsLock.RUnlock()
  20. sess, found := s3Sessions[region]
  21. return sess, found
  22. }
  23. func createSession(awsAccessKeyId, awsSecretAccessKey, region, endpoint string, forcePathStyle bool) (s3iface.S3API, error) {
  24. sessionsLock.Lock()
  25. defer sessionsLock.Unlock()
  26. cacheKey := fmt.Sprintf("%s|%s", region, endpoint)
  27. if t, found := s3Sessions[cacheKey]; found {
  28. return t, nil
  29. }
  30. config := &aws.Config{
  31. Region: aws.String(region),
  32. Endpoint: aws.String(endpoint),
  33. S3ForcePathStyle: aws.Bool(forcePathStyle),
  34. S3DisableContentMD5Validation: aws.Bool(true),
  35. }
  36. if awsAccessKeyId != "" && awsSecretAccessKey != "" {
  37. config.Credentials = credentials.NewStaticCredentials(awsAccessKeyId, awsSecretAccessKey, "")
  38. }
  39. sess, err := session.NewSession(config)
  40. if err != nil {
  41. return nil, fmt.Errorf("create aws session in region %s: %v", region, err)
  42. }
  43. sess.Handlers.Build.PushBack(func(r *request.Request) {
  44. r.HTTPRequest.Header.Set("User-Agent", "SeaweedFS/"+version.VERSION_NUMBER)
  45. })
  46. t := s3.New(sess)
  47. s3Sessions[region] = t
  48. return t, nil
  49. }
  50. func deleteFromS3(sess s3iface.S3API, sourceBucket string, sourceKey string) (err error) {
  51. _, err = sess.DeleteObject(&s3.DeleteObjectInput{
  52. Bucket: aws.String(sourceBucket),
  53. Key: aws.String(sourceKey),
  54. })
  55. return err
  56. }