पुष्टि किए गए Cloud Functions शुरू करने का तरीका जानें

1. परिचय

खास जानकारी

Cloud Functions, डेवलपर के लिए लाइटवेट कंप्यूट सलूशन है. इसकी मदद से डेवलपर, एक ही मकसद के लिए बनाए गए ऐसे अलग-अलग फ़ंक्शन बना सकते हैं जिन्हें एचटीटीपीएस का इस्तेमाल करके ट्रिगर किया जा सकता है या सर्वर या रनटाइम एनवायरमेंट को मैनेज किए बिना, CloudEvents का जवाब दिया जा सकता है.

Cloud Functions को कंट्रोल करने के लिए दो मुख्य तरीके हैं: पहचान के आधार पर ऐक्सेस हासिल करना और नेटवर्क पर आधारित ऐक्सेस कंट्रोल का इस्तेमाल करके ऐक्सेस हासिल करना. यह कोडलैब पहले तरीके पर फ़ोकस करता है और फ़ंक्शन शुरू करने के लिए, पहचान के आधार पर ऐक्सेस पाने की तीन स्थितियों के बारे में आपको बताता है:

  1. लोकल डेवलपमेंट के लिए फ़ंक्शन शुरू करने के लिए अपने gcloud Identity टोकन का इस्तेमाल करें और टेस्टिंग के मकसद से
  2. प्रोडक्शन के लिए इस्तेमाल किए जाने वाले क्रेडेंशियल का इस्तेमाल करने के लिए, स्थानीय तौर पर डेवलप और टेस्ट करते समय, सेवा खाते के नाम से काम करना
  3. Google Cloud API की पुष्टि करने के लिए, Google क्लाइंट लाइब्रेरी का इस्तेमाल करें. जैसे, जब किसी सेवा को फ़ंक्शन शुरू करने की ज़रूरत हो

आपको इनके बारे में जानकारी मिलेगी

  • Cloud Function पर पुष्टि करने की प्रक्रिया को कॉन्फ़िगर करने और यह पुष्टि करने का तरीका कि पुष्टि करने की प्रक्रिया सही तरीके से कॉन्फ़िगर की गई है
  • अपनी gcloud पहचान के लिए टोकन देकर, लोकल डेवलपमेंट एनवायरमेंट से पुष्टि किए गए फ़ंक्शन को शुरू करें
  • सेवा खाता बनाने और उसे फ़ंक्शन शुरू करने के लिए सही भूमिका देने का तरीका
  • किसी लोकल डेवलपमेंट एनवायरमेंट की किसी सेवा के नाम पर काम करने का तरीका, जिसमें फ़ंक्शन शुरू करने के लिए सही भूमिकाएं दी गई हों

2. सेटअप और ज़रूरी शर्तें

ज़रूरी शर्तें

  • आपने Cloud Console में लॉग इन किया है
  • आपने पहले भी, 2nd gen पर एचटीटीपी फ़ंक्शन को ट्रिगर करने वाला एचटीटीपी डिप्लॉय किया है
  • (ज़रूरी नहीं) तीसरे उदाहरण के लिए, यह कोडलैब Node.js और npm का इस्तेमाल करता है. हालांकि, आपके पास ऐसे किसी भी रनटाइम का इस्तेमाल करने का विकल्प होता है जो Google की पुष्टि करने वाली क्लाइंट लाइब्रेरी के साथ काम करता हो.

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें 853e55310c205094.png पर क्लिक करें.

55efc1aaa7a4d3ad.png

अगर आपने Cloud Shell का इस्तेमाल पहली बार किया है, तो आपको बीच में आने वाली स्क्रीन दिखेगी. इसमें यह बताया जाएगा कि यह क्या है. अगर आपको बीच के लेवल पर मिलने वाली स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

9c92662c6a846a5c.png

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में डेवलपमेंट के सभी ज़रूरी टूल मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री ऑफ़र करता है और Google Cloud में चलता है. यह नेटवर्क की परफ़ॉर्मेंस और ऑथेंटिकेशन को बेहतर बनाता है. अगर सभी नहीं, तो इस कोडलैब में आपका बहुत सारा काम ब्राउज़र से किया जा सकता है.

Cloud Shell से कनेक्ट करने के बाद, आपको दिखेगा कि आपकी पुष्टि हो चुकी है और प्रोजेक्ट आपके प्रोजेक्ट आईडी पर सेट है.

  1. यह पुष्टि करने के लिए Cloud Shell में नीचे दिया गया कमांड चलाएं कि आपकी पुष्टि हो गई है:
gcloud auth list

कमांड आउटपुट

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell में यह कमांड चलाएं, ताकि यह पुष्टि की जा सके कि gcloud के लिए कमांड को आपके प्रोजेक्ट के बारे में जानकारी है:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो आप इसे इस निर्देश की मदद से सेट कर सकते हैं:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. पुष्टि किया गया Cloud फ़ंक्शन बनाना और उसकी जांच करना

यह कोडलैब, Cloud Functions के लिए कंसोल क्विकस्टार्ट के लिए उन्हीं निर्देशों का पालन करता है, जिनमें एक खास अपवाद है: आपके फ़ंक्शन के लिए पुष्टि करना ज़रूरी होगा.

पुष्टि करने की प्रक्रिया का मतलब है कि फ़ंक्शन को शुरू करने वाले सिद्धांत में, Cloud Functions Invoker (और 2nd gen के लिए Cloud Run Invoker) की भूमिकाएं होनी चाहिए; ऐसा न होने पर, यह फ़ंक्शन 403 : ऐक्सेस नहीं दिया जा सकता गड़बड़ी दिखाएगा. यह कोडलैब किसी सिद्धांत के लिए, न्योता देने वाले को सही भूमिकाएं देने का तरीका दिखाएगा.

पुष्टि किया गया फ़ंक्शन बनाएं

Cloud Console को इस्तेमाल करने का तरीका यहां बताया गया है:

  1. Cloud Functions की खास जानकारी पेज पर जाएं और फ़ंक्शन बनाएं पर क्लिक करें
  2. Environment विकल्प में जाकर, 2nd gen को चुनें
  3. फ़ंक्शन को my-authent पूछाd-Function नाम दें
  4. पुष्टि करने वाले फ़ील्ड में, डिफ़ॉल्ट को पुष्टि करना ज़रूरी है के तौर पर रहने दें

936eee0d5930d12b.png

  1. आगे बढ़ें पर क्लिक करें
  2. इस कोडलैब के लिए, कोई भी भाषा चुनी जा सकती है
  3. फिर डिप्लॉय करें दबाएं

आपके फ़ंक्शन को डिप्लॉय करने में करीब एक मिनट लगता है.

gcloud के आसान कमांड के लिए, लोकल एनवायरमेंट वैरिएबल सेटअप करें

सबसे पहले, आपको इस कोडलैब में इस्तेमाल किए गए gcloud निर्देशों को आसानी से पढ़ने लायक बनाने के लिए, कुछ एनवायरमेंट वैरिएबल बनाने होंगे.

आपको अपने फ़ंक्शन के लिए क्षेत्र तय करना होगा. इस उदाहरण में us-central1 का इस्तेमाल किया गया है.

REGION="us-central1"

इसके बाद, फ़ंक्शन यूआरएल को एनवायरमेंट वैरिएबल के तौर पर सेव किया जा सकता है, ताकि इसे बाद में इस्तेमाल किया जा सके.

PROJECT_ID=$(gcloud config get-value project)
FUNCTION_URL="$(gcloud functions describe my-authenticated-function --gen2 --region us-central1 --format='get(serviceConfig.uri)')"

पहचान छिपाकर कॉल करने वाले (कॉलर) के तौर पर शुरू करने की कोशिश करके पुष्टि करें कि फ़ंक्शन के लिए पुष्टि करने की ज़रूरत है

यह पुष्टि करने के लिए कि आपको 403 कोड वाली गड़बड़ी मिल रही है या नहीं, पुष्टि किए बिना फ़ंक्शन शुरू करने की सुविधा.

किसी कमांड लाइन से, यह curl कमांड चलाएं:

curl $FUNCTION_URL

आपको ये नतीजे दिखेंगे:

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>403 Forbidden</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Forbidden</h1>
<h2>Your client does not have permission to get URL <code>/</code> from this server.</h2>
<h2></h2>
</body></html>

अब आपको तीन स्थितियों में पुष्टि करने की सुविधा मिलेगी. इन स्थितियों में, पुष्टि करके अपने फ़ंक्शन को शुरू किया जा सकता है.

4. पहली स्थिति: अपने gcloud आइडेंटिटी टोकन का इस्तेमाल करना

डेवलपर के तौर पर, आपको फ़ंक्शन को स्थानीय तौर पर डेवलप करते समय उसकी जांच करने का तरीका चाहिए. इस सेक्शन में, आपको फटाफट जांच करके यह पुष्टि करनी होगी कि आपकी पहचान का इस्तेमाल करके, फ़ंक्शन की पुष्टि सही तरीके से की गई है या नहीं.

इस निर्देश की मदद से, gcloud का इस्तेमाल करके पुष्टि करें कि आपकी पहचान की पुष्टि हो गई है:

gcloud auth list

आपको अपनी चालू पहचान के बगल में एक तारे का निशान दिखेगा. उदाहरण के लिए:

Credentialed Accounts
ACTIVE  ACCOUNT

*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

सही पहचान का इस्तेमाल करने की पुष्टि करने के बाद, आपको खाते के ईमेल पते को एनवायरमेंट वैरिएबल में सेव करना होगा.

ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")

gcloud init सेट अप करने और gcloud auth लॉगिन सेट अप करने के बारे में आपको ज़्यादा जानकारी, दस्तावेज़ में मिल सकती है.

इसके बाद, फ़ंक्शन को शुरू करें और उसे अपना आइडेंटिटी टोकन पास करें.

curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token)"

अब आपको नतीजा दिखेगा:

Hello World!

समस्या का हल

अगर आपको 403 'अनुमति नहीं मिली है' गड़बड़ी मिलती है, तो पक्का करें कि 2nd gen फ़ंक्शन के लिए, आपकी पहचान में Cloud Functions इनवोकर की भूमिका या Cloud Run Invoker की भूमिका शामिल हो. आईएएम कंसोल का इस्तेमाल करके, मुख्य खाते को दी गई भूमिकाओं की पुष्टि की जा सकती है.

हालांकि, डेवलपमेंट के दौरान अपने फ़ंक्शन की जांच करने के लिए, अपने आइडेंटिटी टोकन का इस्तेमाल करना एक तेज़ तरीका है, लेकिन आपके पुष्टि किए गए फ़ंक्शन के कॉलर को सही भूमिकाओं की ज़रूरत होगी; ऐसा न करने पर, कॉल करने वाले (कॉलर) को 403 कोड वाली गड़बड़ी का मैसेज मिलेगा.

आपको फ़ंक्शन शुरू करने के लिए भूमिकाओं वाले पहचान और सेवा खातों की संख्या को सीमित करके, कम से कम अधिकारों के सिद्धांत का पालन करना होगा.

नया सेवा खाता बनाना और उसे ज़रूरी भूमिकाएं देना.

5. दूसरी स्थिति: सेवा खाते के नाम पर काम करना

ऐसी स्थिति में, स्थानीय तौर पर डेवलप और टेस्ट करते समय, किसी सेवा खाते को किसी दूसरे के नाम पर काम करना होगा. इसका मतलब है कि किसी सेवा खाते की अनुमतियों का इस्तेमाल करना होगा. सेवा खाते की पहचान चुराकर, अपने फ़ंक्शन के क्रेडेंशियल की जांच भी की जा सकती है.

ऐसा करने पर, आपको भूमिकाओं की पुष्टि करने के साथ-साथ, कम से कम अधिकारों के नियम का पालन करने में भी मदद मिलेगी. इसके लिए, आपको सिर्फ़ स्थानीय जांच के लिए, अन्य पहचानों को Cloud Function Invoker की भूमिका नहीं देनी होगी.

इस कोडलैब के लिए, आपको एक नया सेवा खाता बनाना होगा. इसमें सिर्फ़ उस फ़ंक्शन को शुरू करने की भूमिकाएं होंगी जिसे आपने इस कोडलैब में बनाया है.

नया सेवा खाता बनाना

सबसे पहले, आपको gcloud कमांड में इस्तेमाल किए गए सेवा खातों को दिखाने के लिए कुछ अतिरिक्त एनवायरमेंट वैरिएबल बनाने होंगे.

SERVICE_ACCOUNT_NAME="invoke-functions-codelab"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com

इसके बाद, आपको सेवा खाता बनाना होगा.

gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
  --display-name="Cloud Function Authentication codelab"

साथ ही, सेवा खाते को Cloud Function शुरू करने वाले की भूमिका दें

gcloud functions add-iam-policy-binding my-authenticated-function \
  --region=us-central1 --gen2 \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role='roles/cloudfunctions.invoker'

सेवा खाते के नाम का इस्तेमाल करके, फ़ंक्शन शुरू करें

इसके लिए, आपको नए सेवा खाते का आईडी टोकन हासिल करके, उसके नाम पर काम करना होगा.

झूठी पहचान बताने के लिए ज़रूरी भूमिकाएं जोड़ें

किसी सेवा खाते के नाम पर काम करने के लिए, आपके उपयोगकर्ता खाते के पास सेवा खाता टोकन क्रिएटर (roles/iam.serviceAccountTokenCreator) की भूमिका होनी चाहिए, ताकि सेवा खाते के लिए आईडी टोकन जनरेट किया जा सके.

gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT_ADDRESS  \
  --member user:$ACCOUNT_EMAIL \
  --role='roles/iam.serviceAccountTokenCreator'

सेवा खाते के आईडी टोकन का इस्तेमाल करें

अब सेवा खाते का आईडी टोकन पास करके, फ़ंक्शन को शुरू किया जा सकता है.

curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token --impersonate-service-account $SERVICE_ACCOUNT_ADDRESS)" 

और आपको ये चीज़ें दिखेंगी:

WARNING: This command is using service account impersonation. All API calls will be executed as [invoke-functions-codelab@<project-id>.iam.gserviceaccount.com].
Hello World!

6. तीसरी स्थिति: Google की क्लाइंट लाइब्रेरी का इस्तेमाल करना

कोडलैब के इस आखिरी हिस्से के लिए, किसी सेवा खाते के लिए आईडी टोकन जनरेट करने के लिए, स्थानीय तौर पर छोटी सेवा चलाएं. इसके बाद, Google की पुष्टि वाली क्लाइंट लाइब्रेरी और ऐप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल (एडीसी) का इस्तेमाल करके, फ़ंक्शन को प्रोग्राम के तौर पर कॉल करें. आप दस्तावेज़ों के क्लाइंट लाइब्रेरी के बारे में जानकारी देने वाले सेक्शन में Google क्लाइंट लाइब्रेरी के बारे में ज़्यादा पढ़ सकते हैं.

ADC का इस्तेमाल करना खास तौर पर तब अहम है, जब आपको Google Cloud के अन्य संसाधनों (जैसे कि Cloud Storage, Vision API वगैरह) के साथ इंटरैक्ट करते समय, फ़ंक्शन को स्थानीय तौर पर लिखना और टेस्ट करना हो (जैसे, लैपटॉप पर, Cloud Shell में वगैरह). इस उदाहरण के लिए, आपको दिखेगा कि कैसे कोई सेवा किसी ऐसे फ़ंक्शन को शुरू करती है जिसके लिए पुष्टि करने की ज़रूरत होती है. ADC और लोकल डेवलपमेंट के बारे में ज़्यादा जानकारी के लिए, यह ब्लॉग पोस्ट देखें अपने Cloud Functions को स्थानीय तौर पर कैसे डेवलप और टेस्ट करें | Google Cloud ब्लॉग

सेवा खाते के नाम पर काम करने के लिए, gcloud कमांड चलाएं

ADC, ऐप्लिकेशन के एनवायरमेंट के हिसाब से क्रेडेंशियल अपने-आप ढूंढता है और उन क्रेडेंशियल का इस्तेमाल Google Cloud API की पुष्टि करने के लिए करता है. –प्रतिरूपित सेवा-खाता फ़्लैग आपको Google Cloud API के लिए पुष्टि करने के लिए, किसी सेवा खाते की पहचान का इस्तेमाल करके, उसके नाम पर काम करने की अनुमति देता है.

किसी सेवा खाते के नाम पर काम करने के लिए, यह कमांड इस्तेमाल किया जा सकता है:

gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS

अब आपकी पहचान के बजाय, उस सेवा खाते के तौर पर gcloud कमांड इस्तेमाल किए जा रहे हैं.

पुष्टि किए गए फ़ंक्शन को शुरू करने के लिए, एक सेवा बनाएं और उसे चलाएं

हर रनटाइम की अपनी Google Auth क्लाइंट लाइब्रेरी होती है, जिसे आप इंस्टॉल कर सकते हैं. यह कोडलैब आपको स्थानीय तौर पर Node.js ऐप्लिकेशन बनाने और चलाने के बारे में जानकारी देता है.

Node.js को इस्तेमाल करने का तरीका यहां दिया गया है:

  1. नया Node.js ऐप्लिकेशन बनाएं
npm init
  1. Google Auth क्लाइंट लाइब्रेरी इंस्टॉल करना
npm install google-auth-library
  1. index.js फ़ाइल बनाएं
  2. अपने Cloud Function का यूआरएल वापस पाएं, जिसे आपको आगे के चरण में अपने कोड में जोड़ना होगा.
echo $FUNCTION_URL
  1. index.js में यह कोड जोड़ें. target Audience वैरिएबल को अपने Cloud Function यूआरएल में बदलना न भूलें.

index.js

// Cloud Functions uses your function's url as the `targetAudience` value

const targetAudience = '<YOUR-CLOUD-FUNCTION-URL>';

// For Cloud Functions, endpoint(`url`) and `targetAudience` should be equal

const url = targetAudience;

const { GoogleAuth } = require('google-auth-library');
const auth = new GoogleAuth();

async function request() {
    console.info(`request ${url} with target audience ${targetAudience}`);

    // this call retrieves the ID token for the impersonated service account
    const client = await auth.getIdTokenClient(targetAudience);

    const res = await client.request({ url });
    console.info(res.data);
}

request().catch(err => {
    console.error(err.message);
    process.exitCode = 1;
});
  1. ऐप्लिकेशन चलाएं
node index.js

और आपको "नमस्ते दुनिया!"

समस्या का हल

अगर आपको गड़बड़ी की अनुमति ‘iam.serviceAccounts.getOpenIdToken' दिखती है संसाधन पर अस्वीकार किया गया (या हो सकता है कि यह मौजूद न हो)., कृपया सेवा खाता टोकन क्रिएटर की भूमिका लागू होने के लिए कुछ मिनट इंतज़ार करें.

अगर आपको इस एनवायरमेंट में आईडी टोकन फ़ेच करने की गड़बड़ी का मैसेज मिलता है, तो GCE (जीसीई) का इस्तेमाल करें या अपने खाते के क्रेडेंशियल JSON फ़ाइल में GOOGLE_APPLICATION_CREDENTIALS के एनवायरमेंट वैरिएबल को सेट करें. ऐसा भी हो सकता है कि आप कमांड देना भूल गए हों

gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS

7. बधाई हो!

कोडलैब पूरा करने के लिए बधाई!

हमारा सुझाव है कि आप Cloud Functions सुरक्षित करने के तरीके से जुड़े दस्तावेज़ देखें.

हमारा सुझाव है कि आप अपने लोकल डेवलपर एनवायरमेंट में Cloud फ़ंक्शन को डेवलप करने और उनकी जांच करने का तरीका जानने के लिए, Cloud Functions के साथ लोकल डेवलपमेंट पर इस ब्लॉग पोस्ट का भी सुझाव दें.

इसमें हमने इन विषयों के बारे में बताया

  • Cloud Function पर पुष्टि करने की प्रक्रिया को कॉन्फ़िगर करने और यह पुष्टि करने का तरीका कि पुष्टि करने की प्रक्रिया सही तरीके से कॉन्फ़िगर की गई है
  • अपनी gcloud पहचान के लिए टोकन देकर, लोकल डेवलपमेंट एनवायरमेंट से पुष्टि किए गए फ़ंक्शन को शुरू करें
  • सेवा खाता बनाने और उसे फ़ंक्शन शुरू करने के लिए सही भूमिका देने का तरीका
  • किसी लोकल डेवलपमेंट एनवायरमेंट की किसी सेवा के नाम पर काम करने का तरीका, जिसमें फ़ंक्शन शुरू करने के लिए सही भूमिकाएं दी गई हों

8. व्यवस्थित करें

अनजाने में लगने वाले शुल्क से बचने के लिए, (उदाहरण के लिए, मुफ़्त टियर में आपको हर महीने Cloud फ़ंक्शन चालू करने की समयावधि के मुकाबले, Cloud फ़ंक्शन का अनजाने में इस्तेमाल किए जाने की संख्या से ज़्यादा बार अनुरोध किया गया है. आपके पास Cloud फ़ंक्शन को मिटाने या दूसरे चरण में बनाए गए प्रोजेक्ट को मिटाने का विकल्प है.

सेवा खाते के नाम पर काम करने से रोकने के लिए, अपनी पहचान का इस्तेमाल करके फिर से लॉगिन करें:

gcloud auth application-default login

'क्लाउड फ़ंक्शन' को मिटाने के लिए, https://console.cloud.google.com/functions/ पर जाकर 'क्लाउड फ़ंक्शन' के क्लाउड कंसोल पर जाएं. पक्का करें कि दूसरे चरण में बनाया गया प्रोजेक्ट ही चुना गया हो.

मेरा पुष्टि करने वाला वह फ़ंक्शन चुनें जिसे आपने पहले डिप्लॉय किया था. इसके बाद, मिटाएं पर क्लिक करें.

अगर आपको पूरा प्रोजेक्ट मिटाना है, तो https://console.cloud.google.com/cloud-resource-manager पर जाएं और दूसरे चरण में बनाया गया प्रोजेक्ट चुनें. इसके बाद, 'मिटाएं' चुनें. अगर प्रोजेक्ट मिटाया जाता है, तो आपको Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.