gcp.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package loadenv
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "os"
  7. "time"
  8. secretmanager "cloud.google.com/go/secretmanager/apiv1"
  9. "cloud.google.com/go/secretmanager/apiv1/secretmanagerpb"
  10. "github.com/DarthSim/godotenv"
  11. "google.golang.org/api/option"
  12. )
  13. func loadGCPSecret() error {
  14. secretID := os.Getenv("IMGPROXY_ENV_GCP_SECRET_ID")
  15. secretVersion := os.Getenv("IMGPROXY_ENV_GCP_SECRET_VERSION_ID")
  16. secretProject := os.Getenv("IMGPROXY_ENV_GCP_SECRET_PROJECT_ID")
  17. secretKey := os.Getenv("IMGPROXY_ENV_GCP_KEY")
  18. if len(secretID) == 0 {
  19. return nil
  20. }
  21. if len(secretVersion) == 0 {
  22. secretVersion = "latest"
  23. }
  24. var (
  25. client *secretmanager.Client
  26. err error
  27. )
  28. ctx, ctxcancel := context.WithTimeout(context.Background(), time.Minute)
  29. defer ctxcancel()
  30. opts := []option.ClientOption{}
  31. if len(secretKey) > 0 {
  32. opts = append(opts, option.WithCredentialsJSON([]byte(secretKey)))
  33. }
  34. client, err = secretmanager.NewClient(ctx, opts...)
  35. if err != nil {
  36. return fmt.Errorf("Can't create Google Cloud Secret Manager client: %s", err)
  37. }
  38. req := secretmanagerpb.AccessSecretVersionRequest{
  39. Name: fmt.Sprintf("projects/%s/secrets/%s/versions/%s", secretProject, secretID, secretVersion),
  40. }
  41. resp, err := client.AccessSecretVersion(ctx, &req)
  42. if err != nil {
  43. return fmt.Errorf("Can't get Google Cloud Secret Manager secret: %s", err)
  44. }
  45. payload := resp.GetPayload()
  46. if payload == nil {
  47. return errors.New("Can't get Google Cloud Secret Manager secret: payload is empty")
  48. }
  49. data := payload.GetData()
  50. if len(data) == 0 {
  51. return nil
  52. }
  53. envmap, err := godotenv.Unmarshal(string(data))
  54. if err != nil {
  55. return fmt.Errorf("Can't parse config from Google Cloud Secrets Manager: %s", err)
  56. }
  57. for k, v := range envmap {
  58. if err = os.Setenv(k, v); err != nil {
  59. return fmt.Errorf("Can't set %s env variable from Google Cloud Secrets Manager: %s", k, err)
  60. }
  61. }
  62. return nil
  63. }