s3uploader.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package imguploader
  2. import (
  3. "os"
  4. "time"
  5. "github.com/aws/aws-sdk-go/aws"
  6. "github.com/aws/aws-sdk-go/aws/credentials"
  7. "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
  8. "github.com/aws/aws-sdk-go/aws/ec2metadata"
  9. "github.com/aws/aws-sdk-go/aws/session"
  10. "github.com/aws/aws-sdk-go/service/s3"
  11. "github.com/grafana/grafana/pkg/log"
  12. "github.com/grafana/grafana/pkg/util"
  13. )
  14. type S3Uploader struct {
  15. region string
  16. bucket string
  17. acl string
  18. secretKey string
  19. accessKey string
  20. log log.Logger
  21. }
  22. func NewS3Uploader(region, bucket, acl, accessKey, secretKey string) *S3Uploader {
  23. return &S3Uploader{
  24. region: region,
  25. bucket: bucket,
  26. acl: acl,
  27. accessKey: accessKey,
  28. secretKey: secretKey,
  29. log: log.New("s3uploader"),
  30. }
  31. }
  32. func (u *S3Uploader) Upload(imageDiskPath string) (string, error) {
  33. sess := session.New()
  34. creds := credentials.NewChainCredentials(
  35. []credentials.Provider{
  36. &credentials.StaticProvider{Value: credentials.Value{
  37. AccessKeyID: u.accessKey,
  38. SecretAccessKey: u.secretKey,
  39. }},
  40. &credentials.EnvProvider{},
  41. &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(sess), ExpiryWindow: 5 * time.Minute},
  42. })
  43. cfg := &aws.Config{
  44. Region: aws.String(u.region),
  45. Credentials: creds,
  46. }
  47. key := util.GetRandomString(20) + ".png"
  48. log.Debug("Uploading image to s3", "bucket = ", u.bucket, ", key = ", key)
  49. file, err := os.Open(imageDiskPath)
  50. if err != nil {
  51. return "", err
  52. }
  53. svc := s3.New(session.New(cfg), cfg)
  54. params := &s3.PutObjectInput{
  55. Bucket: aws.String(u.bucket),
  56. Key: aws.String(key),
  57. ACL: aws.String(u.acl),
  58. Body: file,
  59. ContentType: aws.String("image/png"),
  60. }
  61. _, err = svc.PutObject(params)
  62. if err != nil {
  63. return "", err
  64. }
  65. return "https://" + u.bucket + ".s3.amazonaws.com/" + key, nil
  66. }