1. بررسی اجمالی
در این کد لبه، شما بر روی استفاده از Secret Manager در پایتون تمرکز خواهید کرد.
Secret Manager به شما امکان ذخیره، مدیریت و دسترسی به اسرار را به عنوان حباب های باینری یا رشته های متنی می دهد. با مجوزهای مناسب می توانید محتویات راز را مشاهده کنید.
Secret Manager برای ذخیره اطلاعات پیکربندی مانند رمزهای عبور پایگاه داده، کلیدهای API یا گواهی های TLS مورد نیاز یک برنامه در زمان اجرا به خوبی کار می کند.
چیزی که یاد خواهید گرفت
- نحوه استفاده از Cloud Shell
- نحوه نصب کتابخانه سرویس گیرنده Secret Manager برای پایتون
- نحوه ایجاد و دسترسی به اسرار با استفاده از کتابخانه مشتری پایتون
- نحوه دسترسی به اسرار در توابع ابری با استفاده از کتابخانه مشتری پایتون
آنچه شما نیاز دارید
نظرسنجی
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را با پایتون چگونه ارزیابی می کنید؟
تجربه خود را در استفاده از خدمات Google Cloud چگونه ارزیابی می کنید؟
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. شما می توانید آن را در هر زمان به روز کنید.
- شناسه پروژه باید در تمام پروژههای Google Cloud منحصربهفرد باشد و تغییرناپذیر باشد (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (معمولاً به عنوان
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. برای اینکه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید، می توانید منابعی را که ایجاد کرده اید حذف کنید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
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].
3. Secret Manager API را فعال کنید
قبل از اینکه بتوانید از Secret Manager API استفاده کنید، باید API را فعال کنید. با استفاده از Cloud Shell می توانید API را با دستور زیر فعال کنید:
gcloud services enable secretmanager.googleapis.com
شما باید خروجی را مانند این ببینید:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
4. نصب کتابخانه سرویس گیرنده Secret Manager برای پایتون
کتابخانه سرویس گیرنده Secret Manager را نصب کنید:
pip3 install --user google-cloud-secret-manager==2.10.0
5. Python تعاملی را شروع کنید
برای بخشی از این آموزش، از یک مفسر تعاملی پایتون به نام IPython استفاده خواهید کرد که در Cloud Shell از پیش نصب شده است. یک جلسه را با اجرای ipython
در Cloud Shell شروع کنید:
ipython
شما باید چیزی شبیه به این را ببینید:
Python 3.9.2 (default, Feb 28 2021, 17:03:44) Type 'copyright', 'credits' or 'license' for more information IPython 8.3.0 -- An enhanced Interactive Python. Type '?' for help. In [1]:
6. ایجاد اسرار
یک راز حاوی یک یا چند نسخه مخفی است. آنها را می توان با استفاده از خط فرمان gcloud
ایجاد کرد، اما می توان آنها را با استفاده از پایتون نیز ایجاد کرد.
برای استفاده از یک راز، ابتدا باید راز را با نام راز ایجاد کنید، سپس نسخه ای از راز را اضافه کنید که ارزش راز است.
ID پروژه خود را در IPython تنظیم کنید:
PROJECT_ID = "<PROJECT_ID>"
یک راز ایجاد کنید
کد زیر را در جلسه IPython خود کپی کنید:
from google.cloud import secretmanager
def create_secret(secret_id):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the parent project.
parent = f"projects/{PROJECT_ID}"
# Build a dict of settings for the secret
secret = {'replication': {'automatic': {}}}
# Create the secret
response = client.create_secret(secret_id=secret_id, parent=parent, secret=secret)
# Print the new secret name.
print(f'Created secret: {response.name}')
برای ایجاد یک رمز جدید به نام my_secret_value
، تابع را فراخوانی کنید:
create_secret("my_secret_value")
شما باید خروجی زیر را ببینید:
Created secret: projects/<PROJECT_NUM>/secrets/my_secret_value
یک نسخه مخفی اضافه کنید
اکنون که راز وجود دارد، میتوانید با ایجاد یک نسخه به آن مقداری اختصاص دهید.
کد زیر را در جلسه IPython خود کپی کنید:
def add_secret_version(secret_id, payload):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the parent secret.
parent = f"projects/{PROJECT_ID}/secrets/{secret_id}"
# Convert the string payload into a bytes. This step can be omitted if you
# pass in bytes instead of a str for the payload argument.
payload = payload.encode('UTF-8')
# Add the secret version.
response = client.add_secret_version(parent=parent, payload={'data': payload})
# Print the new secret version name.
print(f'Added secret version: {response.name}')
برای ایجاد یک نسخه جدید مخفی، تابع را فراخوانی کنید:
add_secret_version("my_secret_value", "Hello Secret Manager")
شما باید خروجی زیر را ببینید:
Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/1
Secrets می تواند چندین نسخه داشته باشد. دوباره تابع را با مقدار دیگری فراخوانی کنید:
add_secret_version("my_secret_value", "Hello Again, Secret Manager")
شما باید خروجی زیر را ببینید:
Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/2
توجه کنید که چگونه نسخه جدید راز ما به طور قابل توجهی طولانی تر از نسخه اصلی ما است. این ویژگی بعداً ارجاع داده خواهد شد.
7. دستیابی به اسرار
دسترسی به یک نسخه مخفی، محتویات مخفی و همچنین ابرداده های اضافی در مورد نسخه مخفی را باز می گرداند. هنگامی که به یک نسخه مخفی دسترسی پیدا می کنید، می توانید یک نسخه خاص را مشخص کنید یا فقط با مشخص کردن "آخرین" آخرین نسخه را بخواهید.
رازها را باید مخفی نگه داشت. اعتبار پایگاه داده را به عنوان راز ذخیره کنید، سپس از آنها برای احراز هویت استفاده کنید، یا گواهینامه ها را ذخیره کنید و از آنها استفاده کنید. اما مستقیماً اسرار خود را چاپ نکنید، زیرا این کار هدف از مخفی نگه داشتن آنها را شکست می دهد.
شما میخواهید روی اسرار ما عملیات انجام دهید و ارزش آن را بدون چاپ مستقیم ارزیابی کنید. در عوض شما مقداری از مقدار راز را چاپ خواهید کرد.
کد زیر را در جلسه IPython خود کپی کنید:
def access_secret_version(secret_id, version_id="latest"):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the secret version.
name = f"projects/{PROJECT_ID}/secrets/{secret_id}/versions/{version_id}"
# Access the secret version.
response = client.access_secret_version(name=name)
# Return the decoded payload.
return response.payload.data.decode('UTF-8')
import hashlib
def secret_hash(secret_value):
# return the sha224 hash of the secret value
return hashlib.sha224(bytes(secret_value, "utf-8")).hexdigest()
برای بازیابی راز به عنوان هش مقدار آن، تابع را فراخوانی کنید:
secret_hash(access_secret_version("my_secret_value"))
شما باید خروجی شبیه هش را ببینید (ممکن است مقدار دقیق با این خروجی مطابقت نداشته باشد):
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
از آنجایی که شما نسخه ای را مشخص نکردید، آخرین مقدار بازیابی شد.
برای تأیید، با تابعی که شماره نسخه مورد انتظار را اضافه می کند تماس بگیرید:
secret_hash(access_secret_version("my_secret_value", version_id=2))
شما باید همان خروجی دستور آخر را ببینید:
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
دوباره تابع را فراخوانی کنید، اما این بار با مشخص کردن نسخه اول:
secret_hash(access_secret_version("my_secret_value", version_id=1))
این بار باید هش متفاوتی را مشاهده کنید که خروجی متفاوتی را نشان می دهد:
9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177
8. استفاده از Secret Manager با توابع ابری
میتوانید از اسرار بسیاری از بخشهای Google Cloud استفاده کنید. در این بخش، شما بر روی توابع ابری، ارائه محاسبات بدون سرور مبتنی بر رویداد Google تمرکز خواهید کرد.
اگر علاقه مند به استفاده از Python در توابع ابری هستید، می توانید HTTP Google Cloud Functions را در Python Codelab دنبال کنید.
IPython را با فراخوانی تابع exit
ببندید:
exit
شما باید به Cloud Shell خود برگردید:
yourname@cloudshell:~ (<PROJECT_ID>)$
قبل از شروع استفاده از Cloud Functions API، باید API را فعال کنید. با استفاده از Cloud Shell می توانید API را با دستور زیر فعال کنید:
gcloud services enable cloudfunctions.googleapis.com cloudbuild.googleapis.com
یک پوشه جدید برای ساخت تابع خود ایجاد کنید و فایل های خالی برای نوشتن در آنها ایجاد کنید:
mkdir secret-manager-api-demo cd secret-manager-api-demo touch main.py touch requirements.txt
ویرایشگر کد را از سمت راست بالای Cloud Shell باز کنید:
به فایل main.py
داخل پوشه secret-manager-api-demo
بروید. این جایی است که شما تمام کدهای خود را قرار می دهید.
9. نوشتن یک Cloud Function برای دسترسی به اسرار
در حالی که ذخیره و بازیابی مقادیر مخفی از خط فرمان یا پایانه IPython مفید است، دسترسی به این اسرار در یک تابع بسیار مفیدتر است.
با استفاده از تابع access_secret_version
که قبلا ایجاد کردید، می توانید از آن به عنوان پایه ای برای عملکرد Cloud خود استفاده کنید.
کد زیر را در فایل main.py
کپی کنید:
main.py
import os
from google.cloud import secretmanager
project_id = os.environ["PROJECT_ID"]
client = secretmanager.SecretManagerServiceClient()
name = f"projects/{project_id}/secrets/my_secret_value/versions/latest"
response = client.access_secret_version(name=name)
my_secret_value = response.payload.data.decode("UTF-8")
def secret_hello(request):
if "Again" in my_secret_value:
return "We meet again!\n"
return "Hello there.\n"
قبل از اینکه بتوانید عملکرد خود را گسترش دهید، باید تنظیمات محیط را نهایی کنید. این مستلزم آن است که وابستگی تابع خود را تنظیم کنید.
یک فایل جدید به نام requirements.txt
ایجاد کنید و بسته google-cloud-secret-manager
به آن اضافه کنید:
الزامات. txt
google-cloud-secret-manager==2.10.0
اکنون باید پوشهای داشته باشید که حاوی یک main.py
و یک requirements.txt
باشد.
اجازه دسترسی به راز شما
قبل از اینکه بتوانید عملکرد خود را اجرا کنید، باید به Cloud Functions اجازه دهید به راز شما دسترسی داشته باشد.
به ترمینال برگردید:
برای دسترسی به راز خود به حساب خدمات Cloud Functions اجازه دسترسی بدهید:
export PROJECT_ID=$(gcloud config get-value core/project) gcloud secrets add-iam-policy-binding my_secret_value \ --role roles/secretmanager.secretAccessor \ --member serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com
شما باید خروجی زیر را ببینید:
Updated IAM policy for secret [my_secret_value]. bindings: - members: - serviceAccount:<PROJECT_ID>@appspot.gserviceaccount.com role: roles/secretmanager.secretAccessor etag: BwWiRUt2oB4= version: 1
10. استقرار عملکرد ابری خود
با توجه به تنظیمات خود در بخش های قبلی، اکنون می توانید عملکرد Cloud خود را مستقر و آزمایش کنید.
در پوشه ای که فقط شامل دو فایلی است که ایجاد کرده اید، تابع را مستقر کنید:
gcloud functions deploy secret_hello \ --runtime python39 \ --set-env-vars PROJECT_ID=${PROJECT_ID} \ --trigger-http \ --allow-unauthenticated
شما باید خروجی زیر را ببینید (قطع شده):
Deploying function (may take a while - up to 2 minutes)...done. ... entryPoint: secret_hello httpsTrigger: url: https://<REGION>-<PROJECT_ID>.cloudfunctions.net/secret_hello ... status: ACTIVE ...
URL تابع خود (متادیتا httpsTrigger.url
) را با دستور زیر بازیابی کنید:
FUNCTION_URL=$(gcloud functions describe secret_hello --format 'value(httpsTrigger.url)')
اکنون، با فراخوانی تابع خود، تابع را میتوان با مقدار بازگشتی مورد انتظار در دسترس قرار داد:
curl $FUNCTION_URL
شما باید خروجی زیر را ببینید:
We meet again!
این تابع به جدیدترین نسخه راز ارجاع میدهد، که شامل رشته "دوباره" تنظیم شده بود، بنابراین این تابع همانطور که انتظار میرود عمل میکند.
11. تبریک!
شما یاد گرفتید که چگونه با استفاده از Python از Secret Manager API استفاده کنید!
تمیز کردن
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آموزش:
- در Cloud Console، به صفحه مدیریت منابع بروید.
- در لیست پروژه، پروژه خود را انتخاب کنید و سپس روی حذف کلیک کنید.
- در گفتگو، ID پروژه را تایپ کنید و سپس بر روی Shut down کلیک کنید تا پروژه حذف شود.
بیشتر بدانید
- مدیر مخفی: https://cloud.google.com/secret-manager/
- پایتون در Google Cloud: https://cloud.google.com/python/
- کتابخانه های سرویس گیرنده ابری برای پایتون: https://googlecloudplatform.github.io/google-cloud-python/
مجوز
این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.