मैं डॉक्स यहां वर्णित अनुसार क्लाउड टास्क का उपयोग करके क्लाउड रन सेवा शुरू करने का प्रयास कर रहा हूं .

मेरे पास क्लाउड रन सेवा चल रही है। अगर मैं सेवा को सार्वजनिक रूप से सुलभ बनाता हूं, तो यह अपेक्षा के अनुरूप व्यवहार करती है।

मैंने क्लाउड कतार बनाई है और मैं स्थानीय स्क्रिप्ट के साथ क्लाउड कार्य शेड्यूल करता हूं। यह मेरे अपने खाते का उपयोग कर रहा है। स्क्रिप्ट इस तरह दिखती है

from google.cloud import tasks_v2

client = tasks_v2.CloudTasksClient()

project = 'my-project'
queue = 'my-queue'
location = 'europe-west1'
url = 'https://url_to_my_service'

parent = client.queue_path(project, location, queue)

task = {
        'http_request': {
            'http_method': 'GET',
            'url': url,
            'oidc_token': {
               'service_account_email': 'my-service-account@my-project.iam.gserviceaccount.com'
            }
        }
}

response = client.create_task(parent, task)
print('Created task {}'.format(response.name))

मैं देखता हूं कि कार्य कतार में दिखाई देता है, लेकिन यह विफल हो जाता है और तुरंत पुनः प्रयास करता है। इसका कारण (लॉग की जाँच करके) यह है कि क्लाउड रन सेवा 401 प्रतिक्रिया देता है।

मेरे अपने उपयोगकर्ता की भूमिकाएं "सेवा खाता टोकन निर्माता" और "सेवा खाता उपयोगकर्ता" हैं। इसमें स्पष्ट रूप से "क्लाउड टास्क एनक्यूअर" नहीं है, लेकिन चूंकि मैं कतार में कार्य बनाने में सक्षम हूं, मुझे लगता है कि मुझे आवश्यक अनुमतियां विरासत में मिली हैं। सेवा खाता "my-service-account@my-project.iam.gserviceaccount.com" (जिसका उपयोग मैं ओआईडीसी टोकन प्राप्त करने के लिए कार्य में करता हूं) में - दूसरों के बीच - निम्नलिखित भूमिकाएँ हैं:

  • क्लाउड टास्क एनक्यूअर (हालांकि मुझे नहीं लगता कि इसे इसकी आवश्यकता है क्योंकि मैं अपने खाते से कार्य बना रहा हूं)
  • क्लाउड टास्क टास्क रनर
  • क्लाउड टास्क व्यूअर
  • सेवा खाता टोकन निर्माता (मुझे यकीन नहीं है कि इसे मेरे अपने खाते में जोड़ा जाना चाहिए - वह जो कार्य को शेड्यूल करता है - या सेवा खाते में जो क्लाउड रन को कॉल करना चाहिए)
  • सेवा खाता उपयोगकर्ता (यहां वही)
  • क्लाउड रन इन्वोकर

इसलिए मैंने एक गंदी चाल चली: मैंने सेवा खाते के लिए एक कुंजी फ़ाइल बनाई, इसे स्थानीय रूप से डाउनलोड किया और कुंजी फ़ाइल के साथ मेरे gcloud कॉन्फ़िगरेशन में एक खाता जोड़कर स्थानीय रूप से प्रतिरूपित किया। अगला, मैं दौड़ता हूँ

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://url_to_my_service

यह चलने लगा! (वैसे, यह तब भी काम करता है जब मैं अपने खाते में वापस जाता हूं)

अंतिम परीक्षण: यदि मैं कार्य बनाते समय oidc_token को कार्य से हटा देता हूं, तो मुझे क्लाउड रन से 403 प्रतिक्रिया मिलती है! 401 नहीं... अगर मैं सेवा खाते से "क्लाउड रन इनवोकर" भूमिका को हटा देता हूं और स्थानीय रूप से कर्ल के साथ फिर से प्रयास करता हूं, तो मुझे 401 के बजाय 403 भी मिलते हैं।

अगर मैं अंततः क्लाउड रन सेवा को सार्वजनिक रूप से सुलभ बनाता हूं, तो सब कुछ काम करता है।

इसलिए, ऐसा लगता है कि क्लाउड कार्य सेवा खाते के लिए क्लाउड रन सेवा पर ठीक से प्रमाणित करने के लिए टोकन उत्पन्न करने में विफल रहता है।

मुझे किसकी याद आ रही है?

4
bartaelterman 9 अप्रैल 2020, 19:23
मैंने भी.. पत्र के दस्तावेज़ों का अनुसरण किया: cloud.google.com/ कार्य/दस्तावेज़/निर्माण-http-लक्ष्य-कार्य लेकिन लक्ष्य सेवा से 401 प्रतिक्रियाएँ प्राप्त कर रहा हूँ। कार्य को कतारबद्ध करने वाले सेवा खाते को केवल अनुमतियों की आवश्यकता होनी चाहिए 1. Cloud Tasks Enqueuer 2. Service Account User 3. Cloud Run Invoker (या आप जिस भी Google सेवा को लक्षित कर रहे हैं, उसके लिए आवेदक)। कतारबद्ध सेवा खाता ईमेल को कार्य में कतारबद्ध होने से पहले जोड़ दिया जाता है ताकि क्लाउड कार्य कतार इसका उपयोग टोकन उत्पन्न करने के लिए कर सके... मैं यह देखने जा रहा हूं कि क्या यह समस्या 24 घंटों में हल हो जाती है जैसे आपने किया था। यह बहुत निराशाजनक है
 – 
teaMonkeyFruit
4 मई 2020, 02:50
1
शायद ध्यान देने योग्य भी: क्लाउड शेड्यूलर से क्लाउड रन को ट्रिगर करने का प्रयास करते समय मुझे हाल ही में 401 प्रतिक्रियाएं भी मिलीं। मैं ओआईडीसी टोकन का भी उपयोग कर रहा था और यह पता चला कि मैंने दर्शकों में गलत यूआरएल सेट किया है। क्लाउड टास्क के लिए, ऐसा लगता है कि ओआईडीसी टोकन परदे के पीछे हो रहा है, लेकिन मुझे अब लग रहा है कि वहां कुछ गलत हो रहा है।
 – 
bartaelterman
5 मई 2020, 09:45
1
मैं यह समझ गया। और मेरे लिए निराशाजनक बात यह है कि मुझे इस मुद्दे को पहले हल करना पड़ा है... यदि आप audience फ़ील्ड को oidc_token के लिए स्पष्ट रूप से पॉप्युलेट नहीं करते हैं, तो कार्य से लक्ष्य url का उपयोग किया जाता है, में ऊपर आपका उदाहरण: https://url_to_my_service. यहां समस्या यह है कि यदि आप कस्टम डोमेन के साथ क्लाउड रन का उपयोग कर रहे हैं (क्लाउड रन जनरेटेड डोमेन के बजाय), तो आपको एक त्रुटि मिलेगी क्योंकि OIDC audience कस्टम डोमेन का समर्थन नहीं करता है। मेरा फिक्स क्लाउड रन जेनरेट यूआरएल के साथ दर्शकों को स्पष्ट रूप से पॉप्युलेट करना था, फिर यह काम करता था।
 – 
teaMonkeyFruit
15 मई 2020, 03:07

3 जवाब

सबसे बढ़िया उत्तर

अगले दिन मैं इस मुद्दे को पुन: पेश करने में सक्षम नहीं हूं। मैं क्लाउड रन इनवोकर भूमिका को हटाकर 403 प्रतिक्रियाओं को पुन: उत्पन्न कर सकता हूं, लेकिन मुझे अब कल के समान कोड के साथ 401 प्रतिक्रियाएं नहीं मिलती हैं। मुझे लगता है कि यह Google की ओर से एक अस्थायी मुद्दा था?

साथ ही, मैंने देखा है कि अपडेट की गई नीतियां वास्तव में लागू होने में कुछ समय लगता है (1 से 2 मिनट)।

1
bartaelterman 10 अप्रैल 2020, 22:39

1.मैंने इस कोड का उपयोग करके एक निजी क्लाउड रन सर्विस बनाया है :

import os

from flask import Flask
from flask import request


app = Flask(__name__)

@app.route('/index', methods=['GET', 'POST'])
def hello_world():
    target = os.environ.get('TARGET', 'World')
    print(target)
    return str(request.data)

if __name__ == "__main__":
    app.run(debug=True,host='0.0.0.0',port=int(os.environ.get('PORT', 8080)))
   

2.मैंने --role=roles/run.invoker के साथ एक सेवा खाता बनाया है जिसे मैं क्लाउड कार्य के साथ जोड़ूंगा

 gcloud iam service-accounts create SERVICE-ACCOUNT_NAME \
 --display-name "DISPLAYED-SERVICE-ACCOUNT_NAME"  
 gcloud iam service-accounts list

 gcloud run services add-iam-policy-binding SERVICE \
 --member=serviceAccount:SERVICE-ACCOUNT_NAME@PROJECT-ID.iam.gserviceaccount.com \ 
 --role=roles/run.invoker 

3.मैंने एक कतार बनाई

gcloud tasks queues create my-queue

4.मैं एक test.py . बनाता हूं

from google.cloud import tasks_v2
from google.protobuf import timestamp_pb2
import datetime

# Create a client.
client = tasks_v2.CloudTasksClient()

# TODO(developer): Uncomment these lines and replace with your values.
project = 'your-project'
queue = 'your-queue'
location = 'europe-west2' # app engine locations
url = 'https://helloworld/index'
payload = 'Hello from the Cloud Task'

# Construct the fully qualified queue name.
parent = client.queue_path(project, location, queue)

# Construct the request body.
task = {
        'http_request': {  # Specify the type of request.
            'http_method': 'POST',
            'url': url,  # The full url path that the task will be sent to.
            'oidc_token': {
                'service_account_email': "your-service-account"
            },
             'headers' : {
             'Content-Type': 'application/json',
           }
        }
}

# Convert "seconds from now" into an rfc3339 datetime string.
d = datetime.datetime.utcnow() + datetime.timedelta(seconds=60)

# Create Timestamp protobuf.
timestamp = timestamp_pb2.Timestamp()
timestamp.FromDatetime(d)

# Add the timestamp to the tasks.
task['schedule_time'] = timestamp
task['name'] = 'projects/your-project/locations/app-engine-loacation/queues/your-queue/tasks/your-task'


converted_payload = payload.encode()

# Add the payload to the request.
task['http_request']['body'] = converted_payload


# Use the client to build and send the task.
response = client.create_task(parent, task)

print('Created task {}'.format(response.name))
#return response

मैं अपने उपयोगकर्ता खाते के साथ Google क्लाउड शेल में कोड चलाता हूं जिसमें स्वामी की भूमिका होती है।

6. प्राप्त प्रतिक्रिया का रूप है:

Created task projects/your-project/locations/app-engine-loacation/queues/your-queue/tasks/your-task

7. लॉग की जाँच करें, सफलता

enter image description here

2
TehTris 4 जून 2021, 00:28
इसे साझा करने के लिए धन्यवाद। मैं जो कुछ कर रहा हूं, उसमें केवल यही अंतर है कि आप भूमिका को सेवा खाते से कैसे बांधते हैं। जब आप gcloud कमांड का उपयोग करते हैं तो मैंने कंसोल UI का उपयोग किया। क्या उससे कोई अंतर पड़ेगा?
 – 
bartaelterman
10 अप्रैल 2020, 22:37

मेरे जैसे लोगों के लिए, क्लाउड कार्य HTTP अनुरोधों पर निरंतर UNAUTHORIZED प्रतिक्रिया होने पर दस्तावेज़ीकरण और स्टैक ओवरफ्लो के माध्यम से संघर्ष करना:

जैसा कि थ्रेड में लिखा गया था, आप बेहतर ढंग से oidcToken के लिए audience प्रदान करते हैं जिसे आप CloudTasks को भेजते हैं। सुनिश्चित करें कि आपका अनुरोधित यूआरएल बिल्कुल आपके संसाधन के बराबर है।

उदाहरण के लिए, यदि आपके पास my-awesome-cloud-function नाम का क्लाउड फ़ंक्शन है और आपका कार्य अनुरोध url https://REGION-PROJECT-ID.cloudfunctions.net/my-awesome-cloud-function/api/v1/hello है, तो आपको यह सुनिश्चित करने की आवश्यकता है, कि आपने फ़ंक्शन url स्वयं सेट किया है।

{ 
  serviceAccountEmail: SERVICE-ACCOUNT_NAME@PROJECT-ID.iam.gserviceaccount.com,
  audience: https://REGION-PROJECT-ID.cloudfunctions.net/my-awesome-cloud-function 
}

अन्यथा ऐसा लगता है कि पूर्ण यूआरएल का उपयोग किया जाता है और एक त्रुटि की ओर जाता है।

1
Kostiantyn Levytskyi 9 जुलाई 2021, 16:49