فارسی

با توابع ابری گوگل و تریگرهای HTTP، قدرت محاسبات بدون سرور را کشف کنید. راهنمایی برای ساخت برنامه‌های مقیاس‌پذیر و رویداد محور برای توسعه‌دهندگان.

توابع ابری گوگل: راهنمای جامع برای تریگرهای HTTP

توابع ابری گوگل (GCF) یک محیط اجرایی بدون سرور است که به شما امکان می‌دهد خدمات ابری را بسازید و به هم متصل کنید. با توابع ابری، شما توابع ساده و تک‌منظوره می‌نویسید که به رویدادهای ساطع شده از زیرساخت و خدمات ابری شما متصل می‌شوند. تابع شما زمانی اجرا می‌شود که رویدادی که شما آن را نظارت می‌کنید، رخ دهد. این رویکرد به شما امکان می‌دهد تا برنامه‌های رویدادمحور را بدون مدیریت سرورها یا ران‌تایم‌ها توسعه دهید.

یکی از متداول‌ترین راه‌ها برای فعال کردن یک تابع ابری از طریق یک درخواست HTTP است. این راهنما به دنیای تریگرهای HTTP در توابع ابری گوگل می‌پردازد و دانش لازم برای ساخت برنامه‌های قدرتمند، مقیاس‌پذیر و مقرون‌به‌صرفه را در اختیار شما قرار می‌دهد.

تریگرهای HTTP چه هستند؟

یک تریگر HTTP به شما اجازه می‌دهد تا تابع ابری خود را در پاسخ به یک درخواست HTTP اجرا کنید. اساساً، وقتی یک درخواست HTTP به یک URL خاص ارسال می‌شود، توابع ابری گوگل به طور خودکار تابع مرتبط را اجرا می‌کند. این امر تریگرهای HTTP را برای ساخت APIها، وب‌هوک‌ها و برنامه‌های وب رویدادمحور ایده‌آل می‌سازد.

مزایای کلیدی استفاده از تریگرهای HTTP:

ایجاد یک تابع ابری با تریگر HTTP

بیایید فرآیند ایجاد یک تابع ابری ساده با یک تریگر HTTP را مرور کنیم. ما یک تابع ایجاد خواهیم کرد که با پیام "!Hello, World" پاسخ می‌دهد. این مثال را می‌توان با تغییر رشته خروجی برای مناطق مختلف جهانی تطبیق داد.

پیش‌نیازها:

مراحل:

  1. ایجاد یک پروژه جدید (اگر ندارید):

    اگر هنوز یک پروژه GCP ندارید، یکی در کنسول گوگل کلود ایجاد کنید.

  2. فعال کردن API توابع ابری:

    در کنسول کلود، به API توابع ابری بروید و آن را فعال کنید.

  3. ایجاد یک دایرکتوری برای تابع:

    یک دایرکتوری جدید برای تابع ابری خود ایجاد کنید. برای مثال:

    mkdir hello-http
    cd hello-http
  4. نوشتن کد تابع:

    یک فایل با نام `main.py` (یا `index.js` برای Node.js) با کد زیر ایجاد کنید:

    پایتون (main.py):

    def hello_http(request):
        """تابع ابری HTTP.
        آرگومان‌ها:
            request (flask.Request): آبجکت درخواست.
            
        بازمی‌گرداند:
            متن پاسخ، یا هر مجموعه‌ای از مقادیر که می‌تواند به یک
            آبجکت Response با استفاده از `make_response` تبدیل شود
            .
        """
        request_json = request.get_json(silent=True)
        request_args = request.args
    
        if request_json and 'name' in request_json:
            name = request_json['name']
        elif request_args and 'name' in request_args:
            name = request_args['name']
        else:
            name = 'World'
        return f'Hello, {name}!'

    Node.js (index.js):

    exports.helloHttp = (req, res) => {
      let name = 'World';
      if (req.body.name) {
        name = req.body.name;
      } else if (req.query.name) {
        name = req.query.name;
      }
      res.status(200).send(`Hello, ${name}!`);
    };
  5. ایجاد یک فایل نیازمندی‌ها (فقط پایتون):

    اگر از پایتون استفاده می‌کنید، یک فایل با نام `requirements.txt` ایجاد کرده و هر گونه وابستگی که تابع شما نیاز دارد را اضافه کنید. برای این مثال، این کار کاملاً ضروری نیست، اما عادت خوبی است که یکی داشته باشید. اگر وابستگی ندارید، می‌توانید آن را خالی بگذارید.

  6. استقرار تابع:

    از دستور `gcloud functions deploy` برای استقرار تابع خود استفاده کنید. `YOUR_FUNCTION_NAME` را با نام مورد نظر برای تابع خود جایگزین کنید.

    پایتون:

    gcloud functions deploy YOUR_FUNCTION_NAME \
        --runtime python39 \
        --trigger-http \
        --allow-unauthenticated

    Node.js:

    gcloud functions deploy YOUR_FUNCTION_NAME \
        --runtime nodejs16 \
        --trigger-http \
        --allow-unauthenticated

    توضیح پارامترها:

    • `YOUR_FUNCTION_NAME`: نامی که می‌خواهید به تابع ابری خود بدهید.
    • `--runtime`: محیط اجرایی برای تابع شما (مثلاً `python39`, `nodejs16`).
    • `--trigger-http`: مشخص می‌کند که تابع باید توسط درخواست‌های HTTP فعال شود.
    • `--allow-unauthenticated`: به هر کسی اجازه می‌دهد تا تابع را بدون احراز هویت فراخوانی کند. هشدار: هنگام فعال کردن این گزینه در محیط‌های تولیدی احتیاط کنید! پیاده‌سازی احراز هویت و مجوزدهی مناسب را در نظر بگیرید.
  7. تست کردن تابع:

    پس از استقرار، دستور `gcloud` URL تابع شما را خروجی می‌دهد. سپس می‌توانید با ارسال یک درخواست HTTP به آن URL با استفاده از ابزاری مانند `curl` یا Postman آن را تست کنید.

    curl YOUR_FUNCTION_URL

    شما باید پیام "!Hello, World" را در پاسخ مشاهده کنید. همچنین می‌توانید یک نام را به عنوان پارامتر کوئری ارسال کنید:

    curl "YOUR_FUNCTION_URL?name=YourName"

    این باید "!Hello, YourName" را بازگرداند.

درک درخواست و پاسخ HTTP

وقتی یک تابع ابری توسط یک درخواست HTTP فعال می‌شود، یک آبجکت حاوی اطلاعات مربوط به درخواست را دریافت می‌کند. این آبجکت معمولاً شامل موارد زیر است:

سپس تابع شما باید یک پاسخ HTTP را برگرداند که شامل موارد زیر است:

مثال: مدیریت متدهای مختلف HTTP

در اینجا مثالی از نحوه مدیریت متدهای مختلف HTTP در تابع ابری شما آورده شده است:

پایتون (main.py):

from flask import escape

def http_method(request):
    """به هر درخواست HTTP پاسخ می‌دهد.
    آرگومان‌ها:
        request (flask.Request): آبجکت درخواست HTTP.
    بازمی‌گرداند:
        متن پاسخ یا هر مجموعه‌ای از مقادیر که می‌تواند به یک
        آبجکت Response با استفاده از
        `make_response` تبدیل شود.
    """
    if request.method == 'GET':
        return 'This is a GET request!'
    elif request.method == 'POST':
        request_json = request.get_json(silent=True)
        if request_json and 'message' in request_json:
            message = escape(request_json['message'])
            return f'This is a POST request with message: {message}'
        else:
            return 'This is a POST request without a message.'
    else:
        return 'Unsupported HTTP method.', 405

Node.js (index.js):

exports.httpMethod = (req, res) => {
  switch (req.method) {
    case 'GET':
      res.status(200).send('This is a GET request!');
      break;
    case 'POST':
      if (req.body.message) {
        const message = req.body.message;
        res.status(200).send(`This is a POST request with message: ${message}`);
      } else {
        res.status(200).send('This is a POST request without a message.');
      }
      break;
    default:
      res.status(405).send('Unsupported HTTP method!');
      break;
  }
};

به یاد داشته باشید که تابع به‌روز شده را با استفاده از دستور `gcloud functions deploy` مستقر کنید.

ایمن‌سازی تریگرهای HTTP شما

امنیت هنگام کار با تریگرهای HTTP، به ویژه هنگام برخورد با داده‌های حساس یا عملیات حیاتی، بسیار مهم است. در اینجا برخی ملاحظات امنیتی کلیدی آورده شده است:

احراز هویت و مجوزدهی

به طور پیش‌فرض، توابع ابری که توسط HTTP فعال می‌شوند، در صورت استفاده از `--allow-unauthenticated` به صورت عمومی قابل دسترسی هستند. در اکثر سناریوهای تولیدی، شما می‌خواهید دسترسی را به کاربران یا سرویس‌های مجاز محدود کنید. گوگل کلود چندین گزینه برای احراز هویت و مجوزدهی ارائه می‌دهد:

اعتبارسنجی ورودی

همیشه داده‌های ورودی دریافت شده توسط تابع ابری خود را اعتبارسنجی کنید تا از آسیب‌پذیری‌های امنیتی مانند تزریق SQL یا اسکریپت‌نویسی بین سایتی (XSS) جلوگیری کنید. از تکنیک‌های مناسب پاک‌سازی و گریز (escaping) برای محافظت در برابر ورودی‌های مخرب استفاده کنید.

HTTPS

اطمینان حاصل کنید که تابع ابری شما فقط از طریق HTTPS قابل دسترسی است تا ارتباط بین کلاینت و تابع رمزگذاری شود. توابع ابری گوگل به طور خودکار نقاط پایانی HTTPS را ارائه می‌دهند.

محدودسازی نرخ درخواست (Rate Limiting)

محدودسازی نرخ درخواست را برای جلوگیری از سوء استفاده و حملات انکار سرویس (DoS) پیاده‌سازی کنید. می‌توانید از سرویس‌هایی مانند Google Cloud Armor برای محافظت از توابع ابری خود در برابر ترافیک بیش از حد استفاده کنید.

موارد استفاده از تریگرهای HTTP

تریگرهای HTTP چندمنظوره هستند و می‌توانند در طیف گسترده‌ای از برنامه‌ها استفاده شوند. در اینجا برخی از موارد استفاده رایج آورده شده است:

مثال‌هایی در صنایع مختلف

تکنیک‌های پیشرفته

استفاده از متغیرهای محیطی

متغیرهای محیطی به شما امکان می‌دهند تا تابع ابری خود را بدون کدنویسی سخت اطلاعات حساس یا مقادیر پیکربندی در کد خود، پیکربندی کنید. می‌توانید متغیرهای محیطی را با استفاده از دستور `gcloud functions deploy` یا در کنسول گوگل کلود تنظیم کنید.

gcloud functions deploy YOUR_FUNCTION_NAME \
    --runtime python39 \
    --trigger-http \
    --set-env-vars API_KEY=YOUR_API_KEY,DATABASE_URL=YOUR_DATABASE_URL

در کد خود، می‌توانید به متغیرهای محیطی با استفاده از دیکشنری `os.environ` (پایتون) یا آبجکت `process.env` (Node.js) دسترسی پیدا کنید.

پایتون:

import os

def your_function(request):
    api_key = os.environ.get('API_KEY')
    # از کلید API در تابع خود استفاده کنید
    return f'API Key: {api_key}'

Node.js:

exports.yourFunction = (req, res) => {
  const apiKey = process.env.API_KEY;
  // از کلید API در تابع خود استفاده کنید
  res.status(200).send(`API Key: ${apiKey}`);
};

مدیریت وظایف ناهمزمان

برای وظایف طولانی‌مدت یا محاسباتی سنگین، بهتر است از پردازش ناهمزمان برای جلوگیری از مسدود شدن درخواست HTTP استفاده کنید. می‌توانید از سرویس‌هایی مانند Google Cloud Tasks یا Cloud Pub/Sub برای واگذاری این وظایف به صف‌های جداگانه استفاده کنید.

مدیریت خطا و لاگ‌برداری

مدیریت خطا و لاگ‌برداری قوی را در توابع ابری خود پیاده‌سازی کنید تا مشکلات را به سرعت شناسایی و حل کنید. از Google Cloud Logging برای جمع‌آوری لاگ‌ها از توابع خود و نظارت بر عملکرد آنها استفاده کنید.

بهترین شیوه‌ها

عیب‌یابی مشکلات رایج

نتیجه‌گیری

توابع ابری گوگل با تریگرهای HTTP راهی قدرتمند و انعطاف‌پذیر برای ساخت برنامه‌های بدون سرور ارائه می‌دهند. با درک مفاهیم و تکنیک‌های مورد بحث در این راهنما، می‌توانید از قدرت توابع ابری برای ایجاد راه‌حل‌های مقیاس‌پذیر، مقرون‌به‌صرفه و رویدادمحور برای مخاطبان جهانی استفاده کنید. انقلاب بدون سرور را در آغوش بگیرید و پتانسیل کامل برنامه‌های ابری خود را آزاد کنید!