s3uploader.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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, err := session.NewSession()
  34. if err != nil {
  35. return "", err
  36. }
  37. creds := credentials.NewChainCredentials(
  38. []credentials.Provider{
  39. &credentials.StaticProvider{Value: credentials.Value{
  40. AccessKeyID: u.accessKey,
  41. SecretAccessKey: u.secretKey,
  42. }},
  43. &credentials.EnvProvider{},
  44. &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(sess), ExpiryWindow: 5 * time.Minute},
  45. })
  46. cfg := &aws.Config{
  47. Region: aws.String(u.region),
  48. Credentials: creds,
  49. }
  50. key := util.GetRandomString(20) + ".png"
  51. log.Debug("Uploading image to s3", "bucket = ", u.bucket, ", key = ", key)
  52. file, err := os.Open(imageDiskPath)
  53. if err != nil {
  54. return "", err
  55. }
  56. sess, err = session.NewSession(cfg)
  57. if err != nil {
  58. return "", err
  59. }
  60. svc := s3.New(sess, cfg)
  61. params := &s3.PutObjectInput{
  62. Bucket: aws.String(u.bucket),
  63. Key: aws.String(key),
  64. ACL: aws.String(u.acl),
  65. Body: file,
  66. ContentType: aws.String("image/png"),
  67. }
  68. _, err = svc.PutObject(params)
  69. if err != nil {
  70. return "", err
  71. }
  72. return "https://" + u.bucket + ".s3-" + u.region + ".amazonaws.com/" + key, nil
  73. }