s3uploader.go 2.1 KB

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