1. مقدمه
چرا مدیریت برنامه ها اینقدر سخت است؟
یک دلیل بزرگ این است که توسعه دهندگان اغلب باید مدیران سیستم پاره وقت باشند. به منظور توسعه، استقرار و مدیریت یک برنامه کاربردی وب مدرن در سطح تولید، این فهرست (جزئی) نگرانی ها را در نظر بگیرید:
من در مورد شما نمی دانم، اما اینها همه چیزهایی هستند که نمی خواهم نگران آنها باشم! چیزی که من واقعاً می خواهم به آن فکر کنم منطق برنامه من است:
به طور خلاصه، این همان چیزی است که Cloud Run در مورد آن است - به شما این امکان را می دهد که روی برنامه خود تمرکز کنید و تمام مدیریت و نگهداری را به شخص دیگری واگذار کنید، یعنی Google، که میلیون ها ساعت را برای اصلاح و تکمیل مهارت های خود سرمایه گذاری کرده است. در این حوزه
علاوه بر چالش های اداری که در بالا ذکر شد، باید با موارد زیر نیز مقابله کنید:
- وابستگی ها - محیطی که برنامه شما در آن اجرا می شود، باید تا حد امکان دقیقاً با محیطی که در آن آزمایش شده است مطابقت داشته باشد. این می تواند ابعاد مختلفی را شامل شود، از جمله سیستم عامل، کتابخانه های پشتیبانی، مترجم یا کامپایلر زبان، پیکربندی سخت افزار و بسیاری عوامل دیگر.
- توزیع - انتقال از تجسم محلی یک برنامه به برنامه ای که به طور گسترده در اینترنت به اشتراک گذاشته شده است، اغلب نیاز به تغییر محیط زمان اجرا، یک جهش کوانتومی در پیچیدگی و یک منحنی یادگیری تند دارد.
Cloud Run از این موارد و بسیاری دیگر از نگرانی ها برای شما مراقبت می کند. اما به جای اینکه حرف من را قبول کنم، بیایید با هم یک برنامه بسازیم و ببینیم که انتقال از یک محیط توسعه محلی به یک برنامه ابری درجه تولید تنها در چند مرحله ساده چقدر آسان است.
کاری که خواهی کرد...
- شما یک برنامه وب ساده میسازید و تأیید میکنید که مطابق انتظار در محیط توسعه خود اجرا میشود.
- سپس به یک نسخه کانتینری از همان برنامه منتقل خواهید شد. در طول مسیر، خواهید فهمید که کانتینرسازی به چه معناست و چرا اینقدر مفید است.
- در نهایت، برنامه خود را در فضای ابری مستقر خواهید کرد و خواهید دید که مدیریت سرویس Cloud Run خود با استفاده از خط فرمان و کنسول Google Cloud چقدر آسان است.
چیزی که یاد خواهید گرفت...
- چگونه یک برنامه وب سرور ساده در پایتون ایجاد کنیم
- نحوه بسته بندی برنامه خود در یک ظرف Docker که در هر جایی اجرا می شود
- چگونه برنامه خود را در فضای ابری مستقر کنید تا هر کسی بتواند ایجاد جدید شما را امتحان کند
- چگونه می توان مراحل بالا را حتی بیشتر با استفاده از Buildpacks ساده کرد
- نحوه استفاده از ابزار خط فرمان Google Cloud و رابط کاربری وب کنسول Cloud
آنچه شما نیاز خواهید داشت ...
- یک مرورگر وب
- یک اکانت گوگل
این آزمایشگاه برای توسعه دهندگان در تمام سطوح، از جمله مبتدیان هدف قرار گرفته است. اگرچه از پایتون استفاده می کنید، اما برای اینکه بفهمید چه اتفاقی می افتد، نیازی به آشنایی با برنامه نویسی پایتون ندارید زیرا ما تمام کدهایی را که استفاده می کنید توضیح خواهیم داد.
2. راه اندازی کنید
این بخش تمام کارهایی را که برای شروع کار با این آزمایشگاه باید انجام دهید را پوشش می دهد.
تنظیم محیط خود به خود
- به کنسول Cloud وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. (اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .)
شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID
نامیده خواهد شد.
- در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورتحساب را در Cloud Console فعال کنید .
اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. حتماً دستورالعملهای موجود در بخش «تمیز کردن» را دنبال کنید که به شما توصیه میکند چگونه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در این آزمایشگاه شما قرار است در یک جلسه Cloud Shell کار کنید، که یک مفسر دستور است که توسط یک ماشین مجازی در حال اجرا در ابر گوگل میزبانی می شود. شما به همین راحتی می توانید این بخش را به صورت محلی در رایانه شخصی خود اجرا کنید، اما استفاده از Cloud Shell به همه امکان دسترسی به یک تجربه تکرارپذیر در یک محیط سازگار را می دهد. پس از پایان آزمایشگاه، می توانید دوباره این بخش را در رایانه شخصی خود امتحان کنید.
Cloud Shell را فعال کنید
- از Cloud Console، روی Activate Cloud Shell کلیک کنید .
اگر قبلاً Cloud Shell را راهاندازی نکردهاید، یک صفحه میانی (در زیر تاشو) برای شما نمایش داده میشود که آن را توصیف میکند. اگر اینطور است، روی Continue کلیک کنید (و دیگر آن را نخواهید دید). در اینجا به نظر می رسد که آن صفحه یک بار مصرف:
تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.
این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز شما بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. بیشتر، اگر نه همه، کار شما در این کد لبه را می توان به سادگی با یک مرورگر یا Chromebook انجام داد.
پس از اتصال به Cloud Shell، باید ببینید که قبلاً احراز هویت شده اید و پروژه قبلاً روی ID پروژه شما تنظیم شده است.
- برای تایید احراز هویت، دستور زیر را در 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`
- دستور زیر را در 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.
3. یک برنامه وب ساده بسازید
با کلیک بر روی دکمه Open Editor
در بالای پانل Cloud Shell خود شروع کنید. به نظر می رسد این است:
سپس خود را در یک محیط IDE مشابه Visual Studio Code خواهید دید که در آن می توانید پروژه ها را ایجاد کنید، کد منبع را ویرایش کنید، برنامه های خود را اجرا کنید، و غیره. کنسول و پنجره ویرایش/ترمینال شما با کشیدن نوار افقی بین آن دو منطقه، که در اینجا برجسته شده است:
با کلیک کردن بر روی دکمههای 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 قرار می گیرد.
خطوط زیر را در فایل جدید وارد کنید تا مشخص کنید برنامه شما به بسته Python Flask و وب سرور gunicorn بستگی دارد.
Flask gunicorn
شما نیازی به ذخیره صریح این فایل ندارید زیرا ویرایشگر Cloud تغییرات را به صورت خودکار برای شما ذخیره می کند.
نسخه 1: سلام دنیا!
با استفاده از همین تکنیک، فایل جدید دیگری به نام main.py
ایجاد کنید. این فایل اصلی (و تنها) منبع پایتون برنامه شما خواهد بود. دوباره مطمئن شوید که فایل جدید در پوشه hello
project قرار می گیرد.
کد زیر را در این فایل قرار دهید:
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
در این مرحله، برنامه شما بر روی ماشین مجازی اختصاص داده شده به جلسه پوسته ابری شما اجرا می شود. پوسته ابری شامل یک مکانیسم پروکسی است که به شما امکان می دهد از هر نقطه از اینترنت جهانی به سرورهای وب (مانند چیزی که به تازگی شروع کرده اید) در ماشین مجازی شما در حال اجرا باشد، دسترسی داشته باشید.
روی دکمه web preview
و سپس آیتم منوی Preview on Port 8080
مانند زیر کلیک کنید:
با این کار یک برگه مرورگر وب به برنامه در حال اجرا شما باز می شود که باید چیزی شبیه به این باشد:
نسخه 2: تکرار مسیر URL
به Cloud Editor (از طریق دکمه 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
را وارد کنید (کلید کنترل را در حین فشردن "C" نگه دارید) تا برنامه در حال اجرا متوقف شود و سپس با وارد کردن:
python3 main.py
دوباره، روی دکمه web preview
و سپس روی آیتم منوی Preview on Port 8080
کلیک کنید تا یک برگه مرورگر وب برای برنامه در حال اجرا شما باز شود. شما باید دوباره "سلام جهان!" پیام دهید، اما اکنون متن URL زیر کاراکتر اسلش را با هر رشته ای که انتخاب می کنید (به عنوان مثال /your-name
) جایگزین کنید و بررسی کنید که چیزی شبیه به این را می بینید:
نسخه 3: رنگ های تصادفی
اکنون، با بازگشت به Cloud Editor (از طریق دکمه 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
را وارد کنید (کلید کنترل را در حین فشردن "C" نگه دارید) تا برنامه در حال اجرا متوقف شود و سپس با وارد کردن:
python3 main.py
دوباره، روی دکمه web preview
و سپس روی آیتم منوی Preview on Port 8080
کلیک کنید تا یک برگه مرورگر وب برای برنامه در حال اجرا شما باز شود. شما باید متن تولید شده را با هر پسوند مشخص شده یا پیش فرض "Hello world!" رشته ای که در مقابل یک پس زمینه رنگی تصادفی نمایش داده می شود، مانند این:
صفحه را چند بار بارگیری مجدد کنید تا ببینید هر بار که از برنامه بازدید می کنید رنگ پس زمینه تصادفی تغییر می کند.
و با آن، برنامه شما تمام شد - تبریک می گویم! در مرحله بعد، یاد خواهید گرفت که چگونه برنامه خود را در یک ظرف بسته بندی کنید، و چرا این کار مفیدی است.
4. برنامه خود را کانتینر کنید
کانتینر چیست؟
Containerها به طور کلی، و Docker به طور خاص، به ما این توانایی را می دهند که یک جعبه ماژولار ایجاد کنیم که در آن یک برنامه را با تمام وابستگی های آن در کنار هم اجرا کنیم. ما نتیجه را یک تصویر ظرف می نامیم. در این بخش، یک Image Container ایجاد میکنید که از آن برای کپسوله کردن برنامه خود و همه وابستگیهای آن استفاده میکنید.
صحبت از وابستگی ها شد، در مرحله قبل، زمانی که برنامه خود را در محیط توسعه دهنده اجرا می کردید، باید pip3 install -r requirements.txt
اجرا می کردید و مطمئن می شدید که فایل requires.txt شامل تمام کتابخانه های وابسته و نسخه های مربوطه شما باشد. با کانتینرها، زمانی که تصویر کانتینر را تولید میکنید، آن الزامات را نصب میکنید، بنابراین نیازی نیست مصرفکننده ظرف نگران نصب چیزی باشد .
این تصویر کانتینر بلوک اصلی برای استقرار برنامه شما در Cloud Run را تشکیل می دهد. از آنجایی که کانتینرها را می توان تقریباً بر روی هر سرور مجازی یا واقعی استفاده کرد، این به ما راهی می دهد تا برنامه شما را در هر مکانی که دوست دارید مستقر کنیم و برنامه خود را از یک ارائه دهنده سرویس به ارائه دهنده دیگر یا از داخل محل به Cloud منتقل کنیم.
کانتینرها به ایجاد برنامه های کاربردی شما کمک می کنند:
- قابل تکرار - ظروف مستقل و کامل هستند
- قابل حمل - کانتینرها بلوک های سازنده بین صنعتی هستند که قابلیت حمل برنامه را در ارائه دهندگان و محیط های ابری امکان پذیر می کنند.
به طور خلاصه، کانتینرها توانایی "یک بار نوشتن و اجرا در همه جا" را ارائه می دهند. یکی از استثناهای این قانون این است که کانتینر تولید شده برای اجرا بر روی نوع پردازنده ای که آن را ایجاد کرده اید محدود می شود، اما راه هایی برای تولید نسخه های کانتینر برای سایر تنظیمات سخت افزاری نیز وجود دارد.
بحث بس است - بیا ظرف بسازیم! شما قرار است از یک فناوری خاص برای ایجاد یک ظرف به نام Docker استفاده کنید.
در Cloud Editor یک فایل جدید به نام Dockerfile
ایجاد کنید. این فایل طرحی برای ساخت تصویر شماست. این برنامه به Docker در مورد محیط عملیاتی و کد منبع شما، نحوه نصب وابستگی ها، ساخت برنامه و اجرای کد خود می گوید.
# 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 Terminal، با اجرای دستور زیر، تصویر کانتینر خود را با استفاده از Cloud Build بسازید:
gcloud builds submit --tag $TAG
پس از فشار دادن به رجیستری، پیام SUCCESS
حاوی نام تصویر را مشاهده خواهید کرد که باید چیزی شبیه به این باشد: gcr.io/<project-id>/hello
. این تصویر اکنون در رجیستری کانتینر Google ذخیره میشود و میتوان آن را در هر زمان و هر کجا که دوست داشتید دوباره استفاده کرد.
با استفاده از این دستور می توانید تمام تصاویر کانتینر مرتبط با پروژه فعلی خود را فهرست کنید:
gcloud container images list
اکنون برنامه را به صورت محلی از Cloud Shell با استفاده از این دستورات docker
اجرا و آزمایش کنید:
docker run -p $PORT:$PORT -e PORT=$PORT $TAG
گزینه -p $PORT:$PORT
به Docker میگوید که پورت خارجی $PORT
(که روی 8080 در بالا تنظیم شده است) را در محیط میزبان به همان شماره پورت داخل کانتینر در حال اجرا نگاشت کند. این کار زندگی را آسانتر میکند زیرا کد سروری که مینویسید و شماره پورت خارجی که هنگام آزمایش برنامهتان به آن متصل میشوید یکسان خواهد بود (8080)، اما میتوانید به همین راحتی از گزینه -p برای ترسیم هر پورت خارجی دلخواه در آن استفاده کنید. میزبان هر پورت داخلی دلخواه در داخل کانتینر است.
گزینه -e PORT=$PORT
به Docker میگوید که متغیر محیطی $PORT
(که روی 8080 در بالا تنظیم شده است) را در دسترس برنامه شما قرار دهد که در داخل کانتینر اجرا میشود.
اکنون با اشاره کردن یک مرورگر وب به کد پایتون در حال اجرا در داخل کانتینر، آماده آزمایش برنامه خود هستید. در پنجره Cloud Shell، روی آیکون "Web preview" کلیک کنید و همانطور که در مرحله قبل انجام دادید "Preview on port 8080" را انتخاب کنید.
نتیجه باید آشنا به نظر برسد - باید متن تولید شده را در مقابل یک پسزمینه رنگی تصادفی ببینید، درست مانند زمانی که برنامه را مستقیماً در ترمینال Cloud Shell خود اجرا کردید. صفحه را چند بار بارگیری مجدد کنید تا ببینید هر بار که از برنامه بازدید می کنید رنگ پس زمینه تصادفی تغییر می کند.
تبریک می گویم! اکنون یک نسخه کانتینری از برنامه خود را اجرا کرده اید. در بخش بعدی، بدون لمس خط کد، تصویر ظرف خود را به یک برنامه وب با کیفیت تولید تبدیل میکنید .
5. به ابر ...
اکنون که برنامه خود را محفظهای کردهاید، میخواهید این ویژگی شگفتانگیز را با سایر نقاط جهان به اشتراک بگذارید، بنابراین وقت آن رسیده که آن را در Cloud اجرا کنید. اما شما واقعاً دوست دارید بیشتر از اشتراک گذاری آن انجام دهید. شما می خواهید مطمئن شوید:
- قابل اطمینان اجرا می شود - در صورت خراب شدن رایانه ای که برنامه شما را اجرا می کند، تحمل خطا به صورت خودکار دریافت می کنید
- به صورت خودکار مقیاس می شود - برنامه شما با سطوح وسیعی از ترافیک همگام می شود و به طور خودکار در صورت عدم استفاده، ردپای آن را کاهش می دهد
- هزینه های شما را با هزینه نکردن برای منابعی که استفاده نمی کنید به حداقل می رساند - فقط برای منابع مصرف شده در هنگام پاسخگویی به ترافیک هزینه دریافت می کنید
- از طریق یک نام دامنه سفارشی قابل دسترسی است - شما به یک راه حل با یک کلیک برای اختصاص یک نام دامنه سفارشی به سرویس خود دسترسی دارید
- زمان پاسخگویی عالی را ارائه می دهد - شروع سرد به طور معقولی پاسخگو هستند، اما می توانید با تعیین حداقل پیکربندی نمونه آن را تنظیم کنید
- از رمزگذاری سرتاسر با استفاده از امنیت وب استاندارد 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 شما را اجرا میکند در یک منطقه خاص قرار دارد و توسط Google مدیریت میشود تا بهطور اضافی در تمام مناطق آن منطقه در دسترس باشد. در قسمت "Get Set Up" در بالا، یک منطقه پیش فرض را از طریق متغیر محیطی 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
همچنین می توانید URL سرویس خود را با این دستور بازیابی کنید:
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
کلیک کنید تا یک برگه مرورگر وب به برنامه در حال اجرا شما باز شود. نتیجه باید "Hello from Cloud Run!" پیام در مقابل پس زمینه رنگی تصادفی.
تبریک می گویم! برنامه شما اکنون در Google's Cloud اجرا می شود. بدون نیاز به فکر کردن در مورد آن، برنامه شما با رمزگذاری TLS (HTTPS) و مقیاسبندی خودکار به سطوح شگفتانگیز ترافیک در دسترس عموم قرار میگیرد.
اما من فکر می کنم این روند می تواند حتی ساده تر باشد ...
6. به صورت خودکار ظرف را ایجاد کنید
همه اینها خیلی جالب است، اما اگر نخواهم حتی به Dockerfiles و کانتینرها فکر کنم چه می شود. چه میشود اگر مانند بسیاری از توسعهدهندگان، فقط بخواهم روی نوشتن کد برنامهام تمرکز کنم و اجازه بدهم شخص دیگری نگران ذخیرهسازی آن باشد. خوب، شما خوش شانس هستید زیرا Cloud Run از یک استاندارد منبع باز به نام Buildpacks پشتیبانی می کند که دقیقاً به همین دلیل وجود دارد: برای خودکار کردن فرآیند تولید یک ظرف از مجموعه ای از فایل های منبع.
توجه داشته باشید که برخی موارد وجود دارد که یک توسعه دهنده ممکن است ترجیح دهد از یک Dockerfile صریح استفاده کند، به عنوان مثال اگر می خواهد درجه بالایی از سفارشی سازی در نحوه ساخت کانتینر خود داشته باشد. اما برای موارد معمولی مانند این تمرین، بیلدپکها به خوبی کار میکنند و از نیاز به ساخت دستی Dockerfile
اجتناب میکنند. بیایید کد شما را برای استفاده از buildpack تغییر دهیم.
ابتدا، اجازه دهید برنامه خود را تغییر دهیم تا بتوانید نسخه جدید را از نسخه قبلی تشخیص دهید. این کار را با تغییر فایل main.py
انجام دهید تا پیام پیش فرض از "Hello from Cloud Run!" به "Hello from Cloud Run with Buildpacks!". به عبارت دیگر، این خط در main.py
را از این تغییر دهید:
def say_hello(name="from Cloud Run"):
به این:
def say_hello(name="from Cloud Run with Buildpacks"):
حالا بیایید با ایجاد یک فایل جدید به نام Procfile
از buildpack ها استفاده کنیم. ادامه دهید و آن فایل را در 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
برجسته شده، تأیید کنید که این استقرار کار می کند تا یک برگه مرورگر وب به برنامه در حال اجرا شما باز شود و مطمئن شوید که سرویس شما "Hello from Cloud Run with Buildpacks" را نمایش می دهد. در مقابل یک پس زمینه تصادفی رنگی.
توجه داشته باشید که با استفاده از buildpack ها برای ساخت Dockerfile
خود، اساساً سه مرحله آسان را به دو کاهش داده اید:
- یک برنامه در محیط توسعه خود ایجاد کنید.
- دقیقاً همان کد را با یک دستور در فضای ابری مستقر کنید.
7. آیا باید از خط فرمان استفاده کنم؟
نه! مانند تقریباً هر سرویس Google Cloud، سه راه برای تعامل با Cloud Run وجود دارد:
- ابزار خط فرمان gcloud که به تازگی آن را مشاهده کردید.
- یک رابط کاربری وب غنی، از طریق کنسول Cloud، که از سبک تعاملی بصری نقطه و کلیک پشتیبانی می کند.
- از نظر برنامهریزی، با استفاده از کتابخانههای سرویس گیرنده Google در دسترس برای بسیاری از زبانهای محبوب، از جمله جاوا، سی شارپ، پایتون، Go، جاوا اسکریپت، روبی، C/C++ و غیره.
بیایید یک نمونه اضافی از برنامه Cloud Run را با استفاده از رابط کاربری کنسول اجرا کنیم. از طریق منوی سمت چپ بالا به صفحه فرود سرویس Cloud Run بروید:
سپس باید خلاصه ای از خدمات Cloud Run خود را مشاهده کنید، مانند این:
برای شروع فرآیند استقرار، روی پیوند "ایجاد سرویس" کلیک کنید:
«Hello-again» را به عنوان نام سرویس وارد کنید، پلتفرم و منطقه پیشفرض استقرار را انتخاب کنید و روی «بعدی» کلیک کنید.
این URL را برای تصویر کانتینر وارد کنید: gcr.io/cloudrun/hello
، که محفظهای است که توسط Google برای اهداف آزمایشی ساخته شده است، و روی منوی کشویی «تنظیمات پیشرفته» کلیک کنید تا برخی از تنظیمات پیکربندی متعددی را که در دسترس شما هستند، مشاهده کنید. برای اشاره به چند مورد که می توانید سفارشی کنید:
- شماره پورت و نقطه ورودی کانتینر (که نقطه ورود مشخص شده هنگام ساخت کانتینر را لغو می کند)
- سخت افزار: حافظه و تعداد CPU
- مقیاس بندی: نمونه های حداقل و حداکثر
- متغیرهای محیطی
- سایر موارد: تنظیم زمان درخواست، حداکثر تعداد درخواست در هر ظرف، HTTP/2
برای پیشبرد گفتگو، روی دکمه "Next" کلیک کنید. گفتگوی بعدی به شما امکان می دهد نحوه راه اندازی سرویس خود را مشخص کنید. برای "Ingress"، "Allow all traffic" و برای "Authentication"، "Allow unauthenticated traffic" را انتخاب کنید.
اینها آزادانهترین تنظیمات هستند، زیرا به هر کسی اجازه میدهند به برنامه Cloud Run شما، از هر نقطه از اینترنت عمومی، بدون تعیین اعتبار احراز هویت دسترسی داشته باشند. ممکن است بخواهید تنظیمات محدودتری برای برنامه خود داشته باشید، اما بیایید آن را برای این تمرین یادگیری ساده نگه داریم.
اکنون روی دکمه Create
کلیک کنید تا سرویس Cloud Run شما ایجاد شود. پس از چند ثانیه، باید مشاهده کنید که سرویس جدید شما در لیست خلاصه خدمات Cloud Run ظاهر می شود. خط خلاصه جدیدترین استقرار (تاریخ/زمان و توسط چه کسی) را در کنار برخی تنظیمات پیکربندی کلیدی ارائه میکند. روی پیوند نام سرویس کلیک کنید تا جزئیات مربوط به سرویس جدید خود را بیابید.
برای تأیید سرویس خود، روی URL نشان داده شده در بالای صفحه خلاصه همانطور که در مثال زیر مشخص شده است کلیک کنید:
شما باید چیزی شبیه به این را ببینید:
اکنون که یک سرویس Cloud Run جدید را راه اندازی کرده اید، برگه REVISIONS
را انتخاب کنید تا راه هایی برای مدیریت چندین استقرار مشاهده کنید.
برای استقرار نسخههای جدید مستقیماً از کنسول، میتوانید روی دکمه EDIT & DEPLOY NEW REVISION
کلیک کنید، همانطور که در تصویر مثال زیر مشخص شده است:
اکنون روی آن دکمه کلیک کنید تا یک ویرایش جدید ایجاد شود. در نزدیکی URL ظرف، روی دکمه SELECT
کلیک کنید، همانطور که در زیر نشان داده شده است:
در گفتگویی که ظاهر میشود، برنامه وب سادهای را که قبلاً با استفاده از Buildpacks از Cloud Build اجرا کردهاید پیدا کنید و سپس روی انتخاب کلیک کنید. مطمئن شوید که تصویر ظرف را در زیر انتخاب کرده اید
gcr.io/<project>/cloud-run-source-deploy
پوشه ، مانند این:
پس از انتخاب، به پایین بروید و روی دکمه DEPLOY
کلیک کنید. اکنون یک ویرایش جدید از برنامه خود اجرا کرده اید. برای تأیید، مجدداً از URL سرویس خود بازدید کنید و تأیید کنید که اکنون «Hello from Cloud Run with Buildpacks» رنگارنگ خود را می بینید. برنامه وب
همانطور که می بینید، تب revisions خلاصه ای از هر ویرایشی را که اجرا کرده اید ارائه می دهد و اکنون باید دو ویرایش را برای این سرویس مشاهده کنید. میتوانید با کلیک بر روی دکمه رادیویی سمت چپ نام ویرایش، یک نسخه را انتخاب کنید، که خلاصهای از جزئیات ویرایش را در سمت راست صفحه نمایش میدهد. با انتخاب آن دکمه ها، می توانید ببینید که دو ویرایش شما از دو تصویر ظرف مختلف گرفته شده اند.
دکمه MANAGE TRAFFIC
شما را قادر می سازد تا توزیع درخواست های دریافتی ارسال شده به یک ویرایش معین را تغییر دهید. این توانایی برای تنظیم دقیق میزان ترافیک ارسال شده به یک ویرایش داده شده، چندین مورد استفاده ارزشمند را امکان پذیر می کند:
- قناری نسخه جدیدی از برنامه شما را با بخش کوچکی از ترافیک ورودی آزمایش می کند
- ترافیک را از نسخه مشکل دار به نسخه قبلی برگردانید
- تست A/B
دکمه MANAGE TRAFFIC
را در اینجا پیدا کنید:
با تعیین تقسیم ترافیک 50/50 به این صورت، تقسیم ترافیک 50/50 را بین دو نسخه خود پیکربندی کنید:
اکنون روی دکمه SAVE کلیک کنید و با مراجعه مکرر به URL سرویس خود تقسیم 50/50 را تأیید کنید و بررسی کنید که به طور متوسط نیمی از درخواست های شما توسط نسخه فعلی ("Hello from Cloud Run with Buildpacks!") و نیمی از درخواست های شما توسط ویرایش فعلی ارائه شده است. با ویرایش قبلی ("در حال اجرا است!").
سایر برگهها در صفحه جزئیات خدمات امکان نظارت بر عملکرد، ترافیک و گزارشها را ارائه میدهند که اطلاعات ارزشمندی را در مورد میزان سختی و عملکرد سرویس شما ارائه میدهد. شما همچنین می توانید از طریق برگه "مجوزها" دسترسی به سرویس خود را تنظیم کنید. چند لحظه ای را به کاوش در برگه های این صفحه اختصاص دهید تا حسی از قابلیت های موجود در اینجا پیدا کنید.
رابط برنامه نویسی
همانطور که قبلا ذکر شد، شما همچنین می توانید خدمات Cloud Run خود را به صورت برنامه ای ایجاد، استقرار و مدیریت کنید. برای کارهای دستی، این گزینه از خط فرمان یا کنسول وب پیشرفتهتر است، اما قطعاً راهی برای خودکارسازی سرویسهای Cloud Run است. شما می توانید از کتابخانه های سرویس گیرنده گوگل در چندین زبان برنامه نویسی محبوب استفاده کنید.
8. برنامه خود را تست کنید
در این مرحله نهایی، شما یک تست بار مصنوعی را برای تست استرس برنامه خود اجرا می کنید و مشاهده می کنید که چگونه با تقاضای ورودی مقیاس می شود. شما قصد دارید از ابزاری به نام hey استفاده کنید که از قبل در پوسته ابری نصب شده است و به ما توانایی اجرای تست های بارگذاری و ارائه نتایج را می دهد.
تست را اجرا کنید
در ترمینال Cloud Shell، این دستور را برای اجرای تست بارگذاری اجرا کنید:
hey -q 1000 -c 200 -z 30s https://hello-...run.app
آرگومان های فرمان به صورت زیر تفسیر می شوند:
-
-q 1000
- سعی کنید بار را تقریباً با 1000 درخواست در ثانیه هدایت کنید. -
-c 200
- 200 کارگر موازی اختصاص دهید -
-z 30s
- تست بار را به مدت 30 ثانیه اجرا کنید - مطمئن شوید که از URL سرویس خود به عنوان آخرین آرگومان در این خط فرمان استفاده می کنید
نتایج آزمایش شما باید چیزی شبیه به این باشد:
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
این خلاصه چندین مورد مورد علاقه را به ما می گوید:
- 32918 درخواست با سرعت تقریباً 1K / ثانیه برای 30 ثانیه ارسال شد.
- هیچ خطایی وجود نداشت (فقط 200 پاسخ HTTP).
- میانگین تأخیر 180 میلیثانیه بود.
- حداقل تأخیر 107 میلیثانیه و بدترین حالت 3.3 ثانیه بود
- تأخیر صدک 90 244 میلیثانیه بود.
اگر برگه METRICS
را در کنسول Cloud Run بررسی کنید، می توانید سمت سرور داستان عملکرد را ببینید:
9. تمیز کردن
در حالی که 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
10. تو این کار را کردی!
تبریک - شما با موفقیت یک برنامه تولیدی Cloud Run را ساختید و به کار گرفتید. در طول مسیر، با کانتینرها و نحوه ساخت کانتینر خود آشنا شدید. و دیدید که چقدر آسان است که برنامه خود را با Cloud Run با استفاده از ابزار خط فرمان gcloud
و کنسول Cloud اجرا کنید. اکنون می دانید چگونه خلاقیت های درخشان خود را با تمام جهان به اشتراک بگذارید!
من می خواهم شما را با یک سوال مهم ترک کنم:
هنگامی که برنامه خود را در محیط توسعهدهنده خود کار کردید، باید چند خط کد را تغییر دهید تا آن را با تمام ویژگیهای درجه تولید ارائه شده توسط Cloud Run در فضای ابری اجرا کنید؟
جواب البته صفر است. :)
Codelabs برای بررسی...
- با Node.js در Cloud Run یک Slack Bot بسازید
- اجرای Cloud Run را با رویدادهایی از Eventarc فعال کنید
- Hello Cloud Run برای Anthos Codelab
- یک کانتینر را با Cloud Run در Node.js مستقر کرده و اجرا کنید
- سایر نرم افزارهای Cloud Run Codelabs
سایر ویژگی های جالب برای کشف ...
- استقرار مداوم از Git با استفاده از Cloud Build
- استفاده از اسرار از Secret Manager
- معرفی WebSockets، HTTP/2 و جریان های دوطرفه gRPC برای اجرای ابری
- موارد Cloud Run min: شروع سرد بدون سرور خود را به حداقل برسانید
- خدمات رسانی به ترافیک از چندین منطقه
اسناد مرجع ...
11. فراخوانی برای اقدام
اگر از این CodeLab لذت بردید و به احتمال زیاد وقت بیشتری را با Google Cloud می گذرانید ، باید امروز واقعاً به Google Cloud Innovors بپیوندید !
مبتکران Google Cloud رایگان است و شامل:
- بحث های زنده ، AMA و جلسات نقشه راه برای یادگیری آخرین مستقیم از Googlers
- آخرین اخبار Google Cloud درست در صندوق ورودی شما
- نشان دیجیتال و پیش زمینه کنفرانس ویدیویی
- 500 اعتبار آزمایشگاه و یادگیری در مورد مهارت ها
برای ثبت نام اینجا را کلیک کنید!