s3uploader.go 2.1 KB

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