1
0

gcp.go 2.0 KB

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