CloudRun में V4 Signed URL बनाना

Oct 05 2020

मैं CloudRun का उपयोग करके तैनात ऐप से Google क्लाउड स्टोरेज संसाधनों में साइन किए गए URL बनाना चाहता हूं।

मैंने इस गाइड के बाद GCS भूमिका के साथ कस्टम सेवा खाते के साथ CloudRun की स्थापना की ।

मेरा इरादा CloudRun से Signed URL बनाने के लिए V4 साइनिंग का उपयोग करना था। नहीं है एक गाइड के इस प्रयोग-मामले में जहां एक फ़ाइल के लिए service_account.jsonजेडब्ल्यूटी config उत्पन्न करने के लिए प्रयोग किया जाता है। यह मेरे लिए स्थानीयहोस्ट पर काम करता है जब मैं Google के IAM से फ़ाइल डाउनलोड करता हूं। मैं इस फ़ाइल को रिपॉजिटरी में प्रतिबद्ध होने से बचाना चाहूंगा, जिसे मैंने CloudRun UI में प्रदान किया है।

मैं उम्मीद कर रहा था कि CloudRun इस सर्विस अकाउंट फ़ाइल को ऐप कंटेनर में इंजेक्ट करता है और इसे GOOGLE_APPLICATION_CREDENTIALSवेरिएबल में एक्सेस करता है लेकिन ऐसा नहीं है।

क्या आपके पास यह करने की सिफारिश है? धन्यवाद।

जवाब

2 JoseV Oct 06 2020 at 09:19

जैसा कि आप कहते हैं, गोलंग स्टोरेज क्लाइंट लाइब्रेरीज़ को यूआरएल पर हस्ताक्षर करने के लिए एक सर्विस अकाउंट जसन फ़ाइल की आवश्यकता होती है।

वर्तमान में इसके लिए GitHub में एक सुविधा अनुरोध खुला है, लेकिन आपको इस नमूने के साथ काम करने में सक्षम होना चाहिए जो मुझे यहां मिला :

import (
"context"
  "fmt"
  "time"
  "cloud.google.com/go/storage"
  "cloud.google.com/go/iam/credentials/apiv1"
  credentialspb "google.golang.org/genproto/googleapis/iam/credentials/v1"
)

const (
  bucketName = "bucket-name"
  objectName = "object"
  serviceAccount = "[PROJECTNUMBER][email protected]"
)

func main() {
  ctx := context.Background()

  c, err := credentials.NewIamCredentialsClient(ctx)
  if err != nil {
     panic(err)
  }

  opts := &storage.SignedURLOptions{
     Method: "GET",
     GoogleAccessID: serviceAccount,
     SignBytes: func(b []byte) ([]byte, error) {
        req := &credentialspb.SignBlobRequest{
            Payload: b,
            Name: serviceAccount,
        }
        resp, err := c.SignBlob(ctx, req)
        if err != nil {
           panic(err)
        }
        return resp.SignedBlob, err
     },
     Expires: time.Now().Add(15*time.Minute),
  }

  u, err := storage.SignedURL(bucketName, objectName, opts)
  if err != nil {
     panic(err)
  }

  fmt.Printf("\"%v\"", u)
}
AhmetB-Google Oct 05 2020 at 17:03

क्लाउड रन (और अन्य कंप्यूट प्लेटफ़ॉर्म) सेवा खाता कुंजी फ़ाइल को इंजेक्ट नहीं करता है। इसके बजाय, वे उदाहरण मेटाडेटा सेवाaccess_token पर उपलब्ध कराते हैं । फिर आप JWT के साथ इस एक्सेस टोकन को एक्सचेंज कर सकते हैं।

हालाँकि, अक्सर, Google के क्लाइंट लाइब्रेरीज़ और gcloudजीसीपी के कंप्यूट प्लेटफार्मों पर बॉक्स से बाहर काम करते हैं, जिन्हें स्पष्ट रूप से प्रमाणित करने की आवश्यकता नहीं होती है। इसलिए यदि आप अपने द्वारा लिंक किए गए पृष्ठ (gcloud या कोड नमूने) पर निर्देशों का उपयोग करते हैं, तो यह आउट-ऑफ-द-बॉक्स काम करना चाहिए।