توسعه دهنده در سه مرحله آسان با اجرای ابری

۱. مقدمه

چرا مدیریت برنامه‌ها اینقدر سخت است؟

یک دلیل بزرگ این است که توسعه‌دهندگان اغلب باید مدیران سیستم پاره وقت باشند. برای توسعه، استقرار و مدیریت یک برنامه وب مدرن در سطح تولید، این لیست (بخشی) از نگرانی‌ها را در نظر بگیرید:

4d018476b4a73b47.png

من در مورد شما نمی‌دانم، اما اینها همه چیزهایی هستند که نمی‌خواهم نگرانشان باشم! ​​چیزی که واقعاً می‌خواهم در موردش فکر کنم منطق برنامه‌ام است:

6dfd143d20e5548b.png

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

علاوه بر چالش‌های اداری ذکر شده در بالا، شما باید با موارد زیر نیز دست و پنجه نرم کنید:

  • وابستگی‌ها - محیطی که برنامه شما در آن اجرا می‌شود، باید تا حد امکان دقیقاً با محیطی که در آن آزمایش شده است، مطابقت داشته باشد. این می‌تواند شامل چندین بعد، از جمله سیستم عامل، کتابخانه‌های پشتیبانی، مفسر یا کامپایلر زبان، پیکربندی سخت‌افزار و بسیاری از عوامل دیگر باشد.
  • توزیع - انتقال از یک نسخه محلی از یک برنامه به برنامه‌ای که به طور گسترده در اینترنت به اشتراک گذاشته می‌شود، اغلب نیاز به تغییر محیط زمان اجرا، جهش کوانتومی در پیچیدگی و منحنی یادگیری شیب‌دار دارد.

Cloud Run این موارد و بسیاری از نگرانی‌های دیگر را برای شما برطرف می‌کند. اما به جای اینکه حرف من را باور کنیم، بیایید با هم یک برنامه بسازیم و ببینیم که انتقال از یک محیط توسعه محلی به یک برنامه ابری در سطح تولید، تنها در چند مرحله ساده چقدر آسان است.

کاری که انجام خواهی داد...

  • شما یک برنامه وب ساده خواهید ساخت و تأیید خواهید کرد که مطابق انتظار در محیط توسعه شما اجرا می‌شود.
  • سپس به یک نسخه کانتینر شده از همان برنامه خواهید رفت. در طول مسیر، بررسی خواهید کرد که کانتینر سازی به چه معناست و چرا اینقدر مفید است.
  • در نهایت، برنامه خود را در فضای ابری مستقر خواهید کرد و خواهید دید که مدیریت سرویس Cloud Run شما با استفاده از خط فرمان و کنسول Google Cloud چقدر آسان است.

آنچه یاد خواهید گرفت...

  • نحوه ایجاد یک برنامه وب سرور ساده در پایتون
  • چگونه برنامه خود را در یک کانتینر داکر بسته‌بندی کنیم که در هر مکانی اجرا شود
  • چگونه برنامه خود را در فضای ابری مستقر کنید تا هر کسی بتواند ساخته جدید شما را امتحان کند
  • چگونه مراحل فوق را با استفاده از Buildpacks ساده‌تر کنیم؟
  • نحوه استفاده از ابزار خط فرمان گوگل کلود و رابط کاربری وب کنسول کلود

آنچه نیاز خواهید داشت...

  • یک مرورگر وب
  • یک حساب گوگل

این آزمایشگاه برای توسعه‌دهندگان در تمام سطوح، از جمله مبتدیان، مناسب است. اگرچه از پایتون استفاده خواهید کرد، اما برای درک آنچه اتفاق می‌افتد نیازی به آشنایی با برنامه‌نویسی پایتون ندارید زیرا ما تمام کدهایی را که استفاده می‌کنید توضیح خواهیم داد.

۲. آماده شوید

5110b5081a1e1c49.png

این بخش شامل تمام مواردی است که برای شروع کار با این آزمایشگاه باید انجام دهید.

تنظیم محیط خودتنظیم

  1. وارد Cloud Console شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. (اگر از قبل حساب Gmail یا Google Workspace ندارید، باید یکی ایجاد کنید .)

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه‌های Google Cloud (نام بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). بعداً در این آزمایشگاه کد به آن PROJECT_ID گفته خواهد شد.

  1. در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در Cloud Console فعال کنید .

اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، نباید هزینه زیادی داشته باشد. حتماً دستورالعمل‌های بخش «پاکسازی» را که به شما نحوه خاموش کردن منابع را آموزش می‌دهد، دنبال کنید تا پس از این آموزش، متحمل هزینه نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

در این آزمایش، شما در یک جلسه Cloud Shell کار خواهید کرد، که یک مفسر فرمان است که توسط یک ماشین مجازی که در فضای ابری گوگل اجرا می‌شود، میزبانی می‌شود. شما می‌توانید به راحتی این بخش را به صورت محلی روی رایانه خود اجرا کنید، اما استفاده از Cloud Shell به همه امکان دسترسی به یک تجربه قابل تکرار در یک محیط سازگار را می‌دهد. پس از آزمایش، می‌توانید این بخش را دوباره روی رایانه خود امتحان کنید.

704a7b7491bd157.png

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 4292cbf4971c9786.png .

bce75f34b2c53987.png

اگر قبلاً Cloud Shell را شروع نکرده‌اید، یک صفحه میانی (در پایین صفحه) به شما نمایش داده می‌شود که توضیح می‌دهد چیست. در این صورت، روی ادامه کلیک کنید (و دیگر هرگز آن را نخواهید دید). آن صفحه یکبار مصرف به این شکل است:

70f315d7b402b476.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

fbe3a0674c982259.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز شما پر شده است. این ماشین یک دایرکتوری خانگی ۵ گیگابایتی دائمی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان به سادگی با یک مرورگر یا کروم‌بوک انجام داد.

پس از اتصال به 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].

چند متغیر محیطی در ترمینال خود تنظیم کنید که انجام مراحل بعدی را آسان‌تر کند:

export PROJ=$GOOGLE_CLOUD_PROJECT 
export APP=hello 
export PORT=8080
export REGION="us-central1"
export TAG="gcr.io/$PROJ/$APP"

فعال کردن APIها

در مراحل بعدی، خواهید دید که این سرویس‌ها کجا مورد نیاز هستند (و چرا)، اما فعلاً این دستور را اجرا کنید تا به پروژه خود دسترسی به سرویس‌های Cloud Build، Container Registry و Cloud Run بدهید:

gcloud services enable cloudbuild.googleapis.com         \
                       containerregistry.googleapis.com  \
                       run.googleapis.com          

این باید یک پیام موفقیت‌آمیز مشابه این ایجاد کند:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

۳. یک برنامه وب ساده بسازید

eef530b56b8e93a3.png

با کلیک روی دکمه‌ی Open Editor در بالای پنل Cloud Shell خود شروع کنید. این دکمه چیزی شبیه به این است:

9b81c8a37a6bcdd8.png

سپس خود را در یک محیط IDE مشابه Visual Studio Code خواهید یافت که در آن می‌توانید پروژه‌ها را ایجاد کنید، کد منبع را ویرایش کنید، برنامه‌های خود را اجرا کنید و غیره. اگر صفحه نمایش شما خیلی کوچک است، می‌توانید با کشیدن نوار افقی بین این دو ناحیه، که در اینجا هایلایت شده است، خط جداکننده بین کنسول و پنجره ویرایش/ترمینال خود را بزرگ یا کوچک کنید:

8dea35450851af53.png

شما می‌توانید با کلیک کردن روی دکمه‌های Open Editor و Open Terminal به ترتیب بین ویرایشگر و ترمینال جابجا شوید. اکنون سعی کنید بین این دو محیط جابجا شوید.

در مرحله بعد، با انتخاب File->New Folder، پوشه‌ای برای ذخیره کارهایتان برای این آزمایشگاه ایجاد کنید، hello را وارد کنید و روی OK کلیک کنید. تمام فایل‌هایی که در این آزمایشگاه ایجاد می‌کنید و تمام کارهایی که در Cloud Shell انجام می‌دهید، در این پوشه قرار خواهند گرفت.

حالا یک فایل requirements.txt ایجاد کنید. این به پایتون می‌گوید که برنامه شما به کدام کتابخانه‌ها وابسته است. برای این برنامه وب ساده، شما از یک ماژول محبوب پایتون برای ساخت سرورهای وب به نام Flask و یک چارچوب سرور وب به نام gunicorn استفاده خواهید کرد. در پنجره Cloud Editor، برای ایجاد یک فایل جدید، روی منوی File->New File کلیک کنید. وقتی از شما نام فایل جدید پرسیده شد، requirements.txt را وارد کنید و دکمه OK را فشار دهید. مطمئن شوید که فایل جدید در پوشه hello project قرار می‌گیرد.

خطوط زیر را در فایل جدید وارد کنید تا مشخص شود که برنامه شما به بسته پایتون فلسک و وب سرور gunicorn وابسته است.

Flask
gunicorn

لازم نیست این فایل را صریحاً ذخیره کنید زیرا ویرایشگر ابر به طور خودکار تغییرات را برای شما ذخیره می‌کند.

نسخه ۱: سلام دنیا!

با استفاده از همین تکنیک، یک فایل جدید دیگر با نام main.py ایجاد کنید. این فایل، فایل اصلی (و تنها) سورس پایتون برنامه شما خواهد بود. دوباره، مطمئن شوید که فایل جدید در پوشه پروژه hello قرار می‌گیرد.

کد زیر را در این فایل قرار دهید:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
    html = "<h1>Hello world!</h1>"
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

به ترمینال برگردید و با این دستور به پوشه پروژه بروید:

cd hello

دستور زیر را برای نصب وابستگی‌های پروژه خود اجرا کنید:

pip3 install -r requirements.txt

حالا با اجرای این دستور در ترمینال، برنامه خود را اجرا کنید:

python3 main.py

در این مرحله، برنامه شما روی ماشین مجازی اختصاص داده شده به جلسه cloud shell شما اجرا می‌شود. cloud shell شامل یک مکانیزم پروکسی است که به شما امکان می‌دهد از هر کجای اینترنت جهانی به سرورهای وب (مانند همانی که تازه شروع کرده‌اید) که روی ماشین مجازی شما اجرا می‌شوند، دسترسی داشته باشید.

روی دکمه web preview و سپس روی گزینه Preview on Port 8080 مانند تصویر زیر کلیک کنید:

fe45e0192080efd6.png

این یک برگه مرورگر وب را برای برنامه در حال اجرا باز می‌کند که باید چیزی شبیه به این باشد:

b1f06501509aefb9.png

نسخه ۲: تکرار مسیر URL

به ویرایشگر ابری (از طریق دکمه‌ی Open Editor ») برگردید و با به‌روزرسانی فایل main.py خود به شرح زیر، پشتیبانی از تکرار پسوند URL اختیاری را اضافه کنید:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])     # ← NEW
def say_hello(name="world"):               # ← MODIFIED
    html = f"<h1>Hello {name}!</h1>"       # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

به ترمینال برگردید (از طریق دکمه‌ی « Open Terminal ») و control-C را فشار دهید (کلید control را نگه دارید و همزمان «C» را فشار دهید) تا برنامه‌ی در حال اجرا متوقف شود و سپس با وارد کردن دستور زیر، آن را مجدداً راه‌اندازی کنید:

python3 main.py

دوباره، روی دکمه web preview و سپس روی گزینه Preview on Port 8080 کلیک کنید تا یک تب مرورگر وب برای برنامه در حال اجرا باز شود. دوباره باید پیام "سلام دنیا!" را ببینید، اما حالا متن URL بعد از کاراکتر اسلش را با هر رشته دلخواهی (مثلاً /your-name ) جایگزین کنید و مطمئن شوید که چیزی شبیه به این می‌بینید:

۹۳b۸۷۹۹۶f۸۸fa۳۷۰.png

نسخه ۳: رنگ‌های تصادفی

اکنون، با بازگشت به ویرایشگر ابری (از طریق دکمه‌ی Open Editor ) و به‌روزرسانی فایل main.py خود به شرح زیر، پشتیبانی از رنگ‌های پس‌زمینه‌ی تصادفی را اضافه کنید:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# This function decides whether foreground text should be
# displayed in black or white, to maximize fg/bg contrast.
def set_text_color(rgb):                      # ← NEW
    sum = round(                              # ← NEW
        (int(rgb[0]) * 0.299)                 # ← NEW
        + (int(rgb[1]) * 0.587)               # ← NEW
        + (int(rgb[2]) * 0.114)               # ← NEW
    )                                         # ← NEW
    return "black" if sum > 186 else "white"  # ← NEW


# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
# To verify each new invocation of these requests, the HTML document
# includes CSS styling to produce a randomly colored background.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])
def say_hello(name="world"):
    bg = random.sample(range(1, 255), 3)                       # ← NEW
    hex = (int(bg[0]) * 256) + (int(bg[1]) * 16) + int(bg[2])  # ← NEW
    fg_color = set_text_color(bg)                              # ← NEW
    bg_color = f"#{hex:06x}"                                   # ← NEW
    style = f"color:{fg_color}; background-color:{bg_color}"   # ← NEW
    html = f'<h1 style="{style}">Hello {name}!</h1>'           # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

به ترمینال برگردید (از طریق دکمه‌ی Open Terminal ») و control-C را فشار دهید (کلید control را نگه دارید و همزمان «C» را فشار دهید) تا برنامه‌ی در حال اجرا متوقف شود و سپس با وارد کردن دستور زیر، آن را مجدداً راه‌اندازی کنید:

python3 main.py

دوباره، روی دکمه web preview و سپس روی گزینه Preview on Port 8080 کلیک کنید تا یک تب مرورگر وب برای برنامه در حال اجرا باز شود. باید متن تولید شده را با هر پسوند مشخص شده یا رشته پیش‌فرض "Hello world!" در مقابل یک پس‌زمینه با رنگ تصادفی، مانند این، مشاهده کنید:

baf8d028f15ea7f4.png

چند بار صفحه را دوباره بارگذاری کنید تا ببینید که رنگ پس‌زمینه تصادفی هر بار که از برنامه بازدید می‌کنید تغییر می‌کند.

و با این کار، کار برنامه شما تمام شد - تبریک می‌گویم! در مرحله بعد، یاد خواهید گرفت که چگونه برنامه خود را در یک کانتینر بسته‌بندی کنید و چرا این کار مفید است.

۴. اپلیکیشن خود را کانتینرایز کنید

17cc234ec3325a8a.png

کانتینر چیست؟

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

صحبت از وابستگی‌ها شد، در مرحله قبل، وقتی برنامه خود را در یک محیط توسعه‌دهنده اجرا می‌کردید، باید pip3 install -r requirements.txt را اجرا می‌کردید و مطمئن می‌شدید که فایل requirements.txt شامل تمام کتابخانه‌های وابسته و نسخه‌های مربوطه است. با کانتینرها، هنگام تولید تصویر کانتینر، آن الزامات را نصب می‌کنید، بنابراین نیازی نیست که مصرف‌کننده کانتینر نگران نصب چیزی باشد .

این تصویر کانتینر، بلوک اصلی برای استقرار برنامه شما در Cloud Run را تشکیل می‌دهد. از آنجا که کانتینرها تقریباً در هر سرور مجازی یا واقعی قابل استفاده هستند، این به ما راهی می‌دهد تا برنامه شما را در هر مکانی که دوست دارید مستقر کنیم و برنامه خود را از یک ارائه دهنده خدمات به دیگری یا از محل کار به Cloud منتقل کنیم.

کانتینرها به برنامه‌های شما کمک می‌کنند تا:

  • قابل تکثیر - ظروف مستقل و کامل هستند
  • قابل حمل - کانتینرها بلوک‌های سازنده بین صنعتی هستند که قابلیت حمل برنامه را در بین ارائه دهندگان و محیط‌های ابری فراهم می‌کنند.

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

صحبت کافی است - بیایید یک کانتینر بسازیم! شما قرار است از یک فناوری خاص برای ایجاد یک کانتینر به نام Docker استفاده کنید.

در ویرایشگر ابری، یک فایل جدید به نام Dockerfile ایجاد کنید. این فایل، طرحی برای ساخت ایمیج شما است. این فایل به داکر در مورد محیط عملیاتی و کد منبع شما، نحوه نصب وابستگی‌ها، ساخت برنامه و اجرای کدتان اطلاعات می‌دهد.

# Use an official lightweight Python image.
FROM python:3.9-slim

# Copy local code to the container image.
WORKDIR /app
COPY main.py .
COPY requirements.txt .

# Install dependencies into this container so there's no need to 
# install anything at container run time.
RUN pip install -r requirements.txt

# Service must listen to $PORT environment variable.
# This default value facilitates local development.
ENV PORT 8080

# Run the web service on container startup. Here you use the gunicorn
# server, with one worker process and 8 threads. For environments 
# with multiple CPU cores, increase the number of workers to match 
# the number of cores available.
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 main:app

در ترمینال ابری، با اجرای دستور زیر، تصویر کانتینر خود را با استفاده از Cloud Build بسازید:

gcloud builds submit --tag $TAG

پس از ارسال به رجیستری، یک پیام SUCCESS حاوی نام تصویر مشاهده خواهید کرد که باید چیزی شبیه به این باشد: gcr.io/<project-id>/hello hello. اکنون تصویر در رجیستری کانتینر گوگل ذخیره شده است و می‌توانید هر زمان و هر کجا که دوست دارید دوباره از آن استفاده کنید.

شما می‌توانید با استفاده از این دستور، تمام تصاویر کانتینر مرتبط با پروژه فعلی خود را فهرست کنید:

gcloud container images list

اکنون با استفاده از این دستورات docker ، برنامه را به صورت محلی از Cloud Shell اجرا و آزمایش کنید:

docker run -p $PORT:$PORT -e PORT=$PORT $TAG

گزینه -p $PORT:$PORT به داکر می‌گوید که پورت خارجی $PORT (که در بالا روی ۸۰۸۰ تنظیم شده است) را در محیط میزبان به همان شماره پورت درون کانتینر در حال اجرا نگاشت کند. این کار کار را آسان‌تر می‌کند زیرا کد سروری که می‌نویسید و شماره پورت خارجی که هنگام آزمایش برنامه خود به آن متصل می‌شوید، یکسان خواهد بود (۸۰۸۰)، اما می‌توانید به راحتی از گزینه ‎-p برای نگاشت هر پورت خارجی دلخواه روی میزبان به هر پورت داخلی دلخواه درون کانتینر استفاده کنید.

گزینه -e PORT=$PORT به داکر می‌گوید که متغیر محیطی $PORT (که در بالا روی ۸۰۸۰ تنظیم شده است) را برای برنامه شما که درون کانتینر اجرا می‌شود، در دسترس قرار دهد.

اکنون آماده‌اید تا برنامه خود را با اشاره به کد پایتونی که درون کانتینر در حال اجرا است، در یک مرورگر وب آزمایش کنید. در پنجره Cloud Shell، مانند مرحله قبل، روی نماد «پیش‌نمایش وب» کلیک کنید و «پیش‌نمایش روی پورت ۸۰۸۰» را انتخاب کنید.

نتیجه باید آشنا به نظر برسد - باید متن تولید شده را در مقابل یک پس‌زمینه با رنگ تصادفی ببینید، درست همانطور که وقتی برنامه را مستقیماً در ترمینال Cloud Shell خود اجرا کردید، این کار را انجام دادید. صفحه را چند بار بارگیری مجدد کنید تا ببینید که رنگ پس‌زمینه تصادفی هر بار که از برنامه بازدید می‌کنید تغییر می‌کند.

تبریک! شما اکنون یک نسخه کانتینر شده از برنامه خود را اجرا کرده‌اید. در بخش بعدی، بدون دست زدن به یک خط کد، تصویر کانتینر خود را به یک برنامه وب با کیفیت تولید تبدیل خواهید کرد .

۵. به سوی ابر...

1b0665d94750ded6.gif

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

  • به طور قابل اعتمادی اجرا می‌شود - در صورتی که کامپیوتری که برنامه شما را اجرا می‌کند از کار بیفتد، تحمل خطای خودکار را دریافت می‌کنید
  • به طور خودکار مقیاس‌پذیر می‌شود - برنامه شما با سطوح وسیع ترافیک همگام می‌شود و در صورت عدم استفاده، به طور خودکار ردپای خود را کاهش می‌دهد.
  • هزینه‌های شما را به حداقل می‌رساند، زیرا برای منابعی که استفاده نمی‌کنید از شما هزینه دریافت نمی‌کند - فقط برای منابعی که هنگام پاسخگویی به ترافیک مصرف می‌کنید، هزینه دریافت می‌شود
  • از طریق یک نام دامنه سفارشی قابل دسترسی است - شما به یک راه حل تک کلیکی برای اختصاص یک نام دامنه سفارشی به سرویس خود دسترسی دارید.
  • زمان پاسخگویی عالی ارائه می‌دهد - شروع‌های سرد به طور معقولی پاسخگو هستند، اما می‌توانید با مشخص کردن حداقل پیکربندی نمونه، آن را به طور دقیق تنظیم کنید.
  • از رمزگذاری سرتاسری با استفاده از امنیت وب استاندارد SSL/TLS پشتیبانی می‌کند - وقتی سرویسی را مستقر می‌کنید، رمزگذاری وب استاندارد و گواهینامه‌های مورد نیاز مربوطه را به صورت رایگان و خودکار دریافت می‌کنید.

با استقرار برنامه خود در Google Cloud Run، همه موارد فوق و حتی بیشتر را دریافت خواهید کرد.

برنامه خود را روی Cloud Run مستقر کنید

ابتدا، بیایید برنامه شما را تغییر دهیم تا بتوانید نسخه جدید را از نسخه قدیمی تشخیص دهید. این کار را با تغییر فایل main.py انجام دهید تا پیام پیش‌فرض از "Hello world!" به "Hello from Cloud Run!" تغییر کند. به عبارت دیگر، این خط را در main.py به این صورت تغییر دهید:

def say_hello(name="world"):

به این:

def say_hello(name="from Cloud Run"):

Cloud Run منطقه‌ای است، به این معنی که زیرساختی که سرویس‌های Cloud Run شما را اجرا می‌کند در یک منطقه خاص قرار دارد و توسط گوگل مدیریت می‌شود تا به طور اضافی در تمام مناطق درون آن منطقه در دسترس باشد. در بخش "راه‌اندازی" در بالا، شما یک منطقه پیش‌فرض را از طریق متغیر محیطی REGION تعریف کردید.

تصویر کانتینر خود را بازسازی کنید و برنامه کانتینر شده خود را با دستور زیر در Cloud Run مستقر کنید:

gcloud builds submit --tag $TAG
gcloud run deploy "$APP"   \
  --image "$TAG"           \
  --platform "managed"     \
  --region "$REGION"       \
  --allow-unauthenticated
  • همچنین می‌توانید با استفاده از gcloud config set run/region $REGION یک منطقه پیش‌فرض تعریف کنید.
  • گزینه --allow-unauthenticated سرویس را به صورت عمومی در دسترس قرار می‌دهد. برای جلوگیری از درخواست‌های احراز هویت نشده، به جای آن --no-allow-unauthenticated استفاده کنید.

ایمیج مشخص شده در اینجا، ایمیج داکری است که در مرحله قبل ساختید. به لطف سرویس Cloud Build که ایمیج حاصل را در Google Container Registry ذخیره کرده است، سرویس Cloud Run می‌تواند آن را پیدا کرده و برای شما مستقر کند.

چند لحظه صبر کنید تا استقرار کامل شود. در صورت موفقیت، خط فرمان URL سرویس را نمایش می‌دهد:

Deploying container to Cloud Run service [hello] in project [PROJECT_ID...
✓ Deploying new service... Done.                                   
  ✓ Creating Revision... Revision deployment finished. Waiting for health check...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [hello] revision [hello-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://hello-....a.run.app

همچنین می‌توانید آدرس اینترنتی سرویس خود را با این دستور بازیابی کنید:

gcloud run services describe hello  \
  --platform managed                \
  --region $REGION                  \
  --format "value(status.url)"

این باید چیزی شبیه به این را نمایش دهد:

https://hello-....a.run.app

این لینک یک URL اختصاصی با امنیت TLS برای سرویس Cloud Run شما است. این لینک دائمی است (تا زمانی که سرویس خود را غیرفعال نکنید) و در هر کجای اینترنت قابل استفاده است. از مکانیسم پروکسی Cloud Shell که قبلاً ذکر شد، که به یک ماشین مجازی گذرا وابسته بود، استفاده نمی‌کند.

روی Service URL هایلایت شده کلیک کنید تا یک تب مرورگر وب برای برنامه در حال اجرا باز شود. نتیجه باید پیام "سلام از Cloud Run!" شما را در مقابل یک پس‌زمینه با رنگ‌های تصادفی نمایش دهد.

تبریک! برنامه شما اکنون در فضای ابری گوگل اجرا می‌شود. بدون نیاز به فکر کردن، برنامه شما به صورت عمومی در دسترس است، با رمزگذاری TLS (HTTPS) و مقیاس‌پذیری خودکار تا سطوح شگفت‌انگیز ترافیک.

اما به نظرم این روند می‌توانست حتی ساده‌تر هم باشد...

۶. ایجاد خودکار کانتینر

همه اینها خیلی جالب است، اما اگر نخواهم حتی به Dockerfiles و containerها فکر کنم چه؟ اگر مثل اکثر توسعه‌دهندگان، فقط بخواهم روی نوشتن کد برنامه‌ام تمرکز کنم و بگذارم شخص دیگری نگران containerize کردن آن باشد چه؟ خب، خوش‌شانس هستید زیرا Cloud Run از یک استاندارد متن‌باز به نام Buildpacks پشتیبانی می‌کند که دقیقاً به همین دلیل وجود دارد: خودکارسازی فرآیند ساخت یک container از مجموعه‌ای از فایل‌های منبع.

توجه داشته باشید که مواردی وجود دارد که یک توسعه‌دهنده ممکن است ترجیح دهد از یک Dockerfile صریح استفاده کند، به عنوان مثال اگر بخواهد درجه بالایی از سفارشی‌سازی در نحوه ساخت کانتینر خود داشته باشد. اما برای موارد رایج مانند این تمرین، buildpackها به خوبی کار می‌کنند و از نیاز به ساخت دستی Dockerfile جلوگیری می‌کنند. بیایید کد شما را برای استفاده از buildpackها تغییر دهیم.

ابتدا، بیایید برنامه شما را تغییر دهیم تا بتوانید نسخه جدید را از نسخه قدیمی تشخیص دهید. این کار را با تغییر فایل main.py انجام دهید تا پیام پیش‌فرض از "سلام از Cloud Run!" به "سلام از Cloud Run با Buildpacks!" تغییر کند. به عبارت دیگر، این خط را در main.py به این صورت تغییر دهید:

def say_hello(name="from Cloud Run"):

به این:

def say_hello(name="from Cloud Run with Buildpacks"):

حالا بیایید با ایجاد یک فایل جدید به نام Procfile از buildpacks بهره ببریم. آن فایل را در Cloud Editor ایجاد کنید و این یک خط متن را وارد کنید:

web: python3 main.py

این به سیستم buildback می‌گوید که چگونه برنامه شما را در کانتینر تولید شده خودکار اجرا کند. با این دستورالعمل کوچک، دیگر حتی به Dockerfile هم نیازی ندارید. برای تأیید این موضوع، Dockerfile خود را حذف کنید و دستور زیر را در ترمینال Cloud Shell اجرا کنید:

gcloud beta run deploy "$APP"  \
    --source .                 \
    --platform "managed"       \
    --region "$REGION"         \
    --allow-unauthenticated

این مشابه دستوری است که برای استقرار برنامه خود در مرحله قبل اجرا کردید، اما این بار گزینه --image را با گزینه --source . جایگزین کرده‌اید. این به دستور gcloud می‌گوید که می‌خواهید از buildpacks برای ایجاد تصویر کانتینر شما، بر اساس فایل‌های منبعی که در دایرکتوری فعلی پیدا می‌کند، استفاده کند ( dot در --source . خلاصه دایرکتوری فعلی است). از آنجا که سرویس به طور ضمنی از تصویر کانتینر مراقبت می‌کند، نیازی به مشخص کردن تصویر در این دستور gcloud ندارید.

یک بار دیگر، با کلیک بر روی Service URL هایلایت شده، برای باز کردن یک تب مرورگر وب به برنامه در حال اجرا، از صحت عملکرد این استقرار اطمینان حاصل کنید و مطمئن شوید که سرویس شما عبارت "سلام از Cloud Run with Buildpacks!" را در مقابل یک پس‌زمینه با رنگ تصادفی نمایش می‌دهد.

توجه داشته باشید که با استفاده از buildpacks برای ساخت Dockerfile خود، اساساً سه مرحله آسان را به دو مرحله کاهش داده‌اید:

  1. یک برنامه در محیط توسعه خود ایجاد کنید.
  2. دقیقاً همان کد را با یک دستور در فضای ابری مستقر کنید.

۷. آیا باید از خط فرمان استفاده کنم؟

نه! تقریباً مانند هر سرویس ابری گوگل، سه راه برای تعامل با Cloud Run وجود دارد:

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

بیایید یک نمونه اضافی از برنامه Cloud Run شما را با استفاده از رابط کاربری کنسول مستقر کنیم. از طریق منوی بالا سمت چپ به صفحه فرود Cloud Run Service بروید:

e2b4983b38c81796.png

سپس باید خلاصه‌ای از سرویس‌های Cloud Run خود را مانند این مشاهده کنید:

b335e7bf0a3af845.png

برای شروع فرآیند استقرار، روی پیوند «ایجاد سرویس» کلیک کنید:

51f61a8ddc7a4c0b.png

به عنوان نام سرویس، عبارت "hello-again" را وارد کنید، پلتفرم و منطقه استقرار پیش‌فرض را انتخاب کنید و روی "Next" کلیک کنید.

8a17baa45336c4c9.png

این URL را برای تصویر کانتینر وارد کنید: gcr.io/cloudrun/hello ، که کانتینری است که توسط گوگل برای اهداف آزمایشی ساخته شده است، و روی منوی کشویی "تنظیمات پیشرفته" کلیک کنید تا برخی از تنظیمات پیکربندی موجود را ببینید. به عنوان مثال، می‌توانید چند مورد را سفارشی کنید:

  • شماره پورت و نقطه ورود کانتینر (که نقطه ورود مشخص شده هنگام ساخت کانتینر را لغو می‌کند)
  • سخت‌افزار: حافظه و تعداد پردازنده‌ها
  • مقیاس‌بندی: حداقل و حداکثر نمونه‌ها
  • متغیرهای محیطی
  • موارد دیگر: تنظیم زمان انتظار درخواست، حداکثر تعداد درخواست‌ها در هر کانتینر، HTTP/2

برای پیشبرد پنجره گفتگو، روی دکمه «بعدی» کلیک کنید. پنجره گفتگوی بعدی به شما امکان می‌دهد نحوه فعال شدن سرویس خود را مشخص کنید. برای «ورود»، «اجازه دادن به همه ترافیک» و برای «احراز هویت»، «اجازه دادن به ترافیک غیرمجاز» را انتخاب کنید.

e78281d1cff3418.png

اینها آزادترین تنظیمات هستند، به این دلیل که به هر کسی اجازه می‌دهند از هر جایی در اینترنت عمومی، بدون مشخص کردن اعتبارنامه‌های احراز هویت، به برنامه Cloud Run شما دسترسی پیدا کند. ممکن است تنظیمات محدودکننده‌تری برای برنامه خود بخواهید، اما بیایید برای این تمرین یادگیری، آن را ساده نگه داریم.

اکنون برای ایجاد سرویس Cloud Run خود، روی دکمه Create کلیک کنید. پس از چند ثانیه، باید سرویس جدید خود را در فهرست خلاصه سرویس‌های Cloud Run خود مشاهده کنید. خط خلاصه، جدیدترین استقرار (تاریخ/زمان و توسط چه کسی) را به همراه برخی تنظیمات پیکربندی کلیدی ارائه می‌دهد. برای مشاهده جزئیات بیشتر در مورد سرویس جدید خود، روی لینک نام سرویس کلیک کنید.

برای تأیید سرویس خود، روی URL نشان داده شده در بالای صفحه خلاصه، همانطور که در مثال زیر هایلایت شده است، کلیک کنید:

6c35cf0636dddc51.png

شما باید چیزی شبیه به این را ببینید:

3ba6ab4fe0da1f84.png

اکنون که یک سرویس Cloud Run جدید را مستقر کرده‌اید، تب REVISIONS را انتخاب کنید تا روش‌هایی برای مدیریت چندین استقرار را مشاهده کنید.

۲۳۵۱ee7ec4a356f0.png

برای استقرار نسخه‌های جدید مستقیماً از کنسول، می‌توانید روی دکمه‌ی EDIT & DEPLOY NEW REVISION کلیک کنید، همانطور که در تصویر زیر به عنوان مثال هایلایت شده است:

a599fa88d00d6776.png

اکنون برای ایجاد یک نسخه جدید، روی آن دکمه کلیک کنید. در نزدیکی URL کانتینر، مطابق شکل زیر، روی دکمه SELECT کلیک کنید:

5fd1b1f8e1f11d40.png

در پنجره‌ای که ظاهر می‌شود، برنامه وب ساده‌ای را که قبلاً با استفاده از Buildpacks از Cloud Build مستقر کرده‌اید، پیدا کنید و سپس روی انتخاب کلیک کنید. مطمئن شوید که تصویر کانتینر را در زیر انتخاب کرده‌اید.

gcr.io/<project>/cloud-run-source-deploy

پوشه ، مانند این:

8a756c6157face3a.png

پس از انتخاب، به پایین صفحه بروید و روی دکمه DEPLOY کلیک کنید. اکنون نسخه جدیدی از برنامه خود را مستقر کرده‌اید. برای تأیید، دوباره به URL سرویس خود مراجعه کنید و مطمئن شوید که اکنون برنامه وب رنگارنگ "سلام از Cloud Run with Buildpacks!" خود را می‌بینید.

همانطور که می‌بینید، تب «ویرایش‌ها» خلاصه‌ای از هر ویرایشی که پیاده‌سازی کرده‌اید را ارائه می‌دهد و اکنون باید دو ویرایش برای این سرویس مشاهده کنید. می‌توانید با کلیک بر روی دکمه رادیویی سمت چپ نام ویرایش، یک ویرایش مشخص را انتخاب کنید که خلاصه‌ای از جزئیات ویرایش را در سمت راست صفحه نمایش می‌دهد. با انتخاب این دکمه‌ها، می‌توانید ببینید که دو ویرایش شما از دو تصویر کانتینر مختلف گرفته شده‌اند.

دکمه MANAGE TRAFFIC به شما این امکان را می‌دهد که توزیع درخواست‌های ورودی ارسال شده به یک نسخه خاص را تغییر دهید. این قابلیت برای تنظیم دقیق میزان ترافیک ارسال شده به یک نسخه خاص، چندین مورد استفاده ارزشمند را ممکن می‌سازد:

  • قناری در حال آزمایش نسخه جدیدی از برنامه شما با بخش کوچکی از ترافیک ورودی است
  • بازگرداندن ترافیک از یک نسخه مشکل‌دار به نسخه قبلی
  • تست A/B

دکمه MANAGE TRAFFIC را اینجا پیدا کنید:

519d3c22ae028287.png

با مشخص کردن تقسیم ترافیک ۵۰/۵۰ مانند این، تقسیم ترافیک ۵۰/۵۰ را بین دو نسخه خود پیکربندی کنید:

8c37d4f115d9ded4.png

حالا روی دکمه‌ی ذخیره کلیک کنید و با مراجعه‌ی مکرر به آدرس اینترنتی سرویس خود، تقسیم ۵۰/۵۰ را تأیید کنید و بررسی کنید که به طور متوسط، نیمی از درخواست‌های شما توسط نسخه‌ی فعلی ("سلام از Cloud Run with Buildpacks!") و نیمی دیگر توسط نسخه‌ی قبلی ("در حال اجرا است!") ارائه می‌شوند.

سایر تب‌های صفحه جزئیات سرویس، امکان نظارت بر عملکرد، ترافیک و گزارش‌ها را ارائه می‌دهند که بینش‌های ارزشمندی در مورد میزان سختی و کیفیت عملکرد سرویس شما ارائه می‌دهند. همچنین می‌توانید از طریق تب «مجوزها» دسترسی به سرویس خود را تنظیم کنید. چند لحظه وقت بگذارید و تب‌های این صفحه را بررسی کنید تا با قابلیت‌های موجود در اینجا آشنا شوید.

رابط برنامه‌نویسی

همانطور که قبلاً اشاره شد، شما همچنین می‌توانید سرویس‌های Cloud Run خود را به صورت برنامه‌نویسی شده ایجاد، مستقر و مدیریت کنید. برای کارهای دستی، این گزینه از خط فرمان یا کنسول وب پیشرفته‌تر است، اما قطعاً راهی برای خودکارسازی سرویس‌های Cloud Run است. شما می‌توانید از کتابخانه‌های کلاینت گوگل در چندین زبان برنامه‌نویسی محبوب استفاده کنید.

۸. اپلیکیشن خود را تست کنید

۱۹۸ada162d1f0bf1.png

در این مرحله آخر، شما یک تست بارگذاری مصنوعی اجرا خواهید کرد تا برنامه خود را تحت فشار قرار دهید و ببینید که چگونه با تقاضای ورودی مقیاس‌پذیر می‌شود. شما از ابزاری به نام hey استفاده خواهید کرد که از قبل در Cloud Shell نصب شده است و به ما امکان اجرای تست‌های بارگذاری و ارائه نتایج را می‌دهد.

آزمون را اجرا کنید

در ترمینال Cloud Shell، این دستور را برای اجرای تست بار اجرا کنید:

hey -q 1000 -c 200 -z 30s https://hello-...run.app

آرگومان‌های دستور به شرح زیر تفسیر می‌شوند:

  • -q 1000 - سعی کنید بار را تقریباً با سرعت ۱۰۰۰ درخواست در ثانیه هدایت کنید
  • -c 200 - تخصیص ۲۰۰ کارگر موازی
  • -z 30s - تست بار را به مدت 30 ثانیه اجرا کن
  • مطمئن شوید که از آدرس اینترنتی سرویس خود به عنوان آخرین آرگومان در این خط فرمان استفاده می‌کنید.

نتایج آزمایش شما باید چیزی شبیه به این باشد:

 Summary:
 Total:        30.2767 secs
 Slowest:      3.3633 secs
 Fastest:      0.1071 secs
 Average:      0.1828 secs
 Requests/sec: 1087.2387
 Total data:   3028456 bytes
 Size/request: 92 bytes

Response time histogram:
 0.107 [1]     |
 0.433 [31346] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 0.758 [1472]  |■■
 1.084 [82]    |
 1.410 [4]     |
...

Latency distribution:
...
 50% in 0.1528 secs
 75% in 0.1949 secs
 90% in 0.2442 secs
 95% in 0.4052 secs
 99% in 0.7062 secs

Details (average, fastest, slowest):
...
 req write:    0.0000 secs, 0.0000 secs, 0.0232 secs
 resp wait:    0.1824 secs, 0.1070 secs, 3.2953 secs
 resp read:    0.0000 secs, 0.0000 secs, 0.0010 secs
Status code distribution:
 [200] 32918 responses

این خلاصه چندین نکته جالب را برای ما بیان می‌کند:

  • ۳۲۹۱۸ درخواست با سرعت تقریبی ۱ هزار در ثانیه به مدت ۳۰ ثانیه ارسال شد.
  • هیچ خطایی وجود نداشت (فقط ۲۰۰ پاسخ HTTP).
  • میانگین تأخیر ۱۸۰ میلی‌ثانیه بود.
  • حداقل زمان تأخیر ۱۰۷ میلی‌ثانیه و در بدترین حالت ۳.۳ ثانیه بود.
  • تأخیر صدک نودم، ۲۴۴ میلی‌ثانیه بود.

اگر تب METRICS را در کنسول Cloud Run بررسی کنید، می‌توانید داستان عملکرد سمت سرور را مشاهده کنید:

e635c6831c468dd3.png

۹. تمیز کردن

اگرچه Cloud Run در صورت عدم استفاده از سرویس، هزینه‌ای دریافت نمی‌کند، اما ممکن است همچنان برای ذخیره تصویر کانتینر ساخته شده هزینه دریافت شود.

شما می‌توانید پروژه GCP خود را حذف کنید تا از پرداخت هزینه‌ها جلوگیری شود، که باعث توقف پرداخت هزینه برای تمام منابع مورد استفاده در آن پروژه می‌شود، یا به سادگی تصویر کانتینر خود را با استفاده از این دستور حذف کنید:

gcloud container images delete $TAG

برای حذف سرویس‌های Cloud Run خود، از این دستورات استفاده کنید:

gcloud run services delete hello --platform managed --region $REGION --quiet
gcloud run services delete hello-again --platform managed --region $REGION --quiet

۱۰. تو موفق شدی!

9a31f4fdbbf1ddcb.png

تبریک می‌گوییم - شما با موفقیت یک برنامه Cloud Run را ساخته و مستقر کرده‌اید. در طول مسیر، در مورد کانتینرها و نحوه ساخت کانتینر خودتان یاد گرفتید. و دیدید که استقرار برنامه‌تان با Cloud Run، با استفاده از ابزار خط فرمان gcloud و کنسول Cloud چقدر آسان است. اکنون می‌دانید که چگونه ساخته‌های درخشان خود را با تمام دنیا به اشتراک بگذارید!

می‌خواهم شما را با یک سوال مهم تنها بگذارم:

وقتی برنامه‌تان را در محیط توسعه‌دهنده‌تان راه‌اندازی کردید، برای استقرار آن در فضای ابری، با تمام ویژگی‌های سطح تولید ارائه شده توسط Cloud Run، چند خط کد را باید تغییر می‌دادید؟

جواب، البته، صفر است. :)

Codelabs برای بررسی ...

ویژگی‌های جذاب دیگر برای کشف...

اسناد مرجع ...

۱۱. دعوت به اقدام

لوگوی فضای ابری گوگل

اگر از این آزمایشگاه کد لذت برده‌اید و احتمالاً زمان بیشتری را به صورت عملی با Google Cloud صرف خواهید کرد، واقعاً باید همین امروز به Google Cloud Innovators بپیوندید !

لوگوی اعضای عمومی نوآوران

Google Cloud Innovators رایگان است و شامل موارد زیر می‌شود:

  • بحث‌های زنده، جلسات پرسش و پاسخ (AMA) و جلسات نقشه راه برای یادگیری جدیدترین‌ها مستقیماً از گوگلی‌ها
  • آخرین اخبار گوگل کلود درست در صندوق ورودی شما
  • نشان دیجیتال و پس‌زمینه کنفرانس ویدیویی
  • ۵۰۰ واحد آزمایشگاه و یادگیری در Skills Boost

برای ثبت نام اینجا کلیک کنید!