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

1. परिचय

खास जानकारी

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

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

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

आपको क्या सीखने को मिलेगा

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

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

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

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

Cloud Shell चालू करें

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

55efc1aaa7a4d3ad.png

अगर आपने Cloud Shell को पहली बार शुरू किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें 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. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो इस कमांड का इस्तेमाल करके इसे सेट किया जा सकता है:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. पुष्टि की गई Cloud Function बनाना और उसे टेस्ट करना

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

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

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

Cloud Console का इस्तेमाल करने के लिए, यह तरीका अपनाएं:

  1. Cloud Functions की खास जानकारी पेज पर जाएं और फ़ंक्शन बनाएं पर क्लिक करें
  2. एनवायरमेंट विकल्प में जाकर, दूसरी जनरेशन चुनें
  3. फ़ंक्शन का नाम my-authenticated-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 login के बारे में ज़्यादा जानकारी दी गई है.

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

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

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

Hello World!

समस्या का हल

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

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

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

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

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 Functions invoker की भूमिका असाइन करें

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 Auth क्लाइंट लाइब्रेरी और ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल (एडीसी) का इस्तेमाल करके, प्रोग्राम के हिसाब से फ़ंक्शन को कॉल किया जा सकेगा. Google की क्लाइंट लाइब्रेरी के बारे में ज़्यादा जानने के लिए, दस्तावेज़ों के क्लाइंट लाइब्रेरी के बारे में जानकारी सेक्शन पढ़ें.

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

किसी सेवा खाते से मिलता-जुलता खाता बनाने के लिए, gcloud कमांड रन करना

एडीसी, ऐप्लिकेशन के एनवायरमेंट के आधार पर क्रेडेंशियल अपने-आप ढूंढ लेता है. साथ ही, उन क्रेडेंशियल का इस्तेमाल करके, Google Cloud API की पुष्टि करता है. –impersonate-service-account फ़्लैग की मदद से, किसी सेवा खाते की पहचान का इस्तेमाल करके, 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 फ़ंक्शन का यूआरएल पाएं. इसे अगले चरण में अपने कोड में जोड़ना होगा.
echo $FUNCTION_URL
  1. index.js में यह कोड जोड़ें. टारगेटऑडियंस वैरिएबल को अपने Cloud Functions के यूआरएल में बदलना न भूलें.

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 का इस्तेमाल करें या GOOGLE_APPLICATION_CREDENTIALS एनवायरमेंट वैरिएबल को सेवा खाते के क्रेडेंशियल वाली JSON फ़ाइल पर सेट करें, तो हो सकता है कि आपने यह कमांड न चलाई हो

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

7. बधाई हो!

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

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

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

हमने क्या-क्या बताया

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

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

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

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

gcloud auth application-default login

Cloud फ़ंक्शन को मिटाने के लिए, Cloud Function Cloud Console पर जाएं. इसके लिए, https://console.cloud.google.com/functions/ पर जाएं. पक्का करें कि आपने दूसरे चरण में जो प्रोजेक्ट बनाया था वह फ़िलहाल चुना गया प्रोजेक्ट हो.

पहले डिप्लॉय किए गए my-authenticated-function को चुनें. इसके बाद, मिटाएं पर क्लिक करें.

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