1. Tổng quan
Trong lớp học lập trình này, bạn sẽ tập trung vào việc sử dụng Secret Manager trong Python.
Secret Manager cho phép bạn lưu trữ, quản lý và truy cập vào các dữ liệu bí mật dưới dạng các BLOB nhị phân hoặc chuỗi văn bản. Nếu có quyền thích hợp, bạn có thể xem nội dung của khoá bí mật.
Secret Manager hoạt động hiệu quả khi lưu trữ thông tin cấu hình, chẳng hạn như mật khẩu cơ sở dữ liệu, khoá API hoặc chứng chỉ TLS mà ứng dụng cần trong thời gian chạy.
Kiến thức bạn sẽ học được
- Cách sử dụng Cloud Shell
- Cách cài đặt thư viện ứng dụng Secret Manager cho Python
- Cách tạo và truy cập vào các khoá bí mật bằng thư viện ứng dụng Python
- Cách truy cập vào các bí mật trong Cloud Functions bằng thư viện ứng dụng Python
Bạn cần có
- Một dự án trên Google Cloud
- Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
- Làm quen với cách sử dụng Python 3
Bản khảo sát
Bạn sẽ sử dụng hướng dẫn này như thế nào?
Bạn đánh giá thế nào về trải nghiệm của mình với Python?
Bạn đánh giá thế nào về trải nghiệm khi sử dụng các dịch vụ của Google Cloud?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.



- Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
- Mã dự án phải là duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là
PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có dùng được hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ giữ nguyên trong suốt thời gian diễn ra dự án. - Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh phát sinh phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
Khởi động Cloud Shell
Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.

Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (bên dưới phần hiển thị đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong lớp học lập trình này chỉ bằng một trình duyệt hoặc Chromebook.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạn.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Đầu ra của lệnh
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project
Đầu ra của lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt nó bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Đầu ra của lệnh
Updated property [core/project].
3. Bật Secret Manager API
Bạn phải bật Secret Manager API trước khi có thể bắt đầu sử dụng API này. Khi dùng Cloud Shell, bạn có thể bật API bằng lệnh sau:
gcloud services enable secretmanager.googleapis.com
Bạn sẽ thấy kết quả như sau:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
4. Cài đặt thư viện ứng dụng Secret Manager cho Python
Cài đặt Thư viện ứng dụng Secret Manager:
pip3 install --user google-cloud-secret-manager==2.10.0
5. Bắt đầu Python tương tác
Trong một phần của hướng dẫn này, bạn sẽ sử dụng một trình thông dịch Python tương tác có tên là IPython. Trình thông dịch này được cài đặt sẵn trong Cloud Shell. Bắt đầu một phiên bằng cách chạy ipython trong Cloud Shell:
ipython
Bạn sẽ thấy như sau:
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. Tạo khoá bí mật
Một bí mật chứa một hoặc nhiều phiên bản bí mật. Bạn có thể tạo các tệp này bằng dòng lệnh gcloud, nhưng cũng có thể tạo bằng Python.
Để sử dụng một mã thông báo bí mật, trước tiên, bạn cần tạo mã thông báo bí mật đó bằng tên của mã thông báo bí mật, sau đó, bạn thêm một phiên bản của mã thông báo bí mật, đó là giá trị của mã thông báo bí mật.
Đặt mã dự án trong IPython:
PROJECT_ID = "<PROJECT_ID>"
Tạo một khoá bí mật
Sao chép mã sau vào phiên 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}')
Gọi hàm để tạo một khoá bí mật mới có tên là my_secret_value:
create_secret("my_secret_value")
Bạn sẽ thấy kết quả sau đây:
Created secret: projects/<PROJECT_NUM>/secrets/my_secret_value
Thêm phiên bản bí mật
Giờ đây, khi đã có một bí mật, bạn có thể chỉ định giá trị cho bí mật đó bằng cách tạo một phiên bản.
Sao chép mã sau vào phiên 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}')
Gọi hàm để tạo một phiên bản bí mật mới:
add_secret_version("my_secret_value", "Hello Secret Manager")
Bạn sẽ thấy kết quả sau đây:
Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/1
Khoá bí mật có thể có nhiều phiên bản. Gọi lại hàm bằng một giá trị khác:
add_secret_version("my_secret_value", "Hello Again, Secret Manager")
Bạn sẽ thấy kết quả sau đây:
Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/2
Bạn có thể thấy phiên bản mới của khoá bí mật dài hơn đáng kể so với phiên bản ban đầu. Thuộc tính này sẽ được tham chiếu sau.
7. Truy cập vào các khoá bí mật
Việc truy cập vào một phiên bản bí mật sẽ trả về nội dung bí mật, cũng như siêu dữ liệu bổ sung về phiên bản bí mật đó. Khi truy cập vào một phiên bản bí mật, bạn có thể chỉ định một phiên bản cụ thể hoặc chỉ cần yêu cầu phiên bản mới nhất bằng cách chỉ định "latest".
Bạn nên giữ bí mật. Lưu trữ thông tin đăng nhập cơ sở dữ liệu dưới dạng bí mật, sau đó dùng thông tin đó để xác thực hoặc lưu trữ chứng chỉ và sử dụng chứng chỉ; nhưng không in trực tiếp các bí mật của bạn, vì việc này sẽ làm mất mục đích giữ bí mật.
Bạn sẽ thực hiện các thao tác trên các khoá bí mật của chúng tôi, đánh giá giá trị của khoá mà không in trực tiếp. Thay vào đó, bạn sẽ in ra một hàm băm của giá trị khoá bí mật.
Sao chép mã sau vào phiên 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()
Gọi hàm để truy xuất khoá bí mật dưới dạng hàm băm của giá trị:
secret_hash(access_secret_version("my_secret_value"))
Bạn sẽ thấy kết quả đầu ra giống như một hàm băm (giá trị chính xác có thể không khớp với kết quả đầu ra này):
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
Vì bạn không chỉ định phiên bản, nên giá trị mới nhất đã được truy xuất.
Gọi hàm thêm số phiên bản dự kiến để xác nhận:
secret_hash(access_secret_version("my_secret_value", version_id=2))
Bạn sẽ thấy kết quả giống như lệnh cuối cùng:
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
Gọi lại hàm, nhưng lần này hãy chỉ định phiên bản đầu tiên:
secret_hash(access_secret_version("my_secret_value", version_id=1))
Lần này, bạn sẽ thấy một hàm băm khác, cho biết một đầu ra khác:
9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177
8. Sử dụng Secret Manager với Cloud Functions
Bạn có thể sử dụng các bí mật trong nhiều phần của Google Cloud. Trong phần này, bạn sẽ tập trung vào Cloud Functions, dịch vụ điện toán không máy chủ dựa trên sự kiện của Google.
Nếu muốn sử dụng Python trong Cloud Functions, bạn có thể làm theo HTTP Google Cloud Functions trong Codelab Python.
Đóng IPython bằng cách gọi hàm exit:
exit
Bạn sẽ được chuyển về Cloud Shell:
yourname@cloudshell:~ (<PROJECT_ID>)$
Trước khi có thể bắt đầu sử dụng Cloud Functions API, bạn phải bật API này. Khi dùng Cloud Shell, bạn có thể bật API bằng lệnh sau:
gcloud services enable cloudfunctions.googleapis.com cloudbuild.googleapis.com
Tạo một thư mục mới để tạo hàm, tạo các tệp trống để ghi vào:
mkdir secret-manager-api-demo cd secret-manager-api-demo touch main.py touch requirements.txt
Mở trình soạn thảo mã ở phía trên cùng bên phải của Cloud Shell:

Chuyển đến tệp main.py trong thư mục secret-manager-api-demo. Đây là nơi bạn sẽ đặt tất cả mã của mình.
9. Viết một Cloud Function để truy cập vào các giá trị bí mật
Mặc dù việc lưu trữ và truy xuất các giá trị bí mật từ dòng lệnh hoặc thiết bị đầu cuối IPython rất hữu ích, nhưng sẽ hữu ích hơn nhiều nếu bạn có thể truy cập vào các giá trị bí mật này trong một hàm.
Bằng cách sử dụng hàm access_secret_version mà bạn đã tạo trước đó, bạn có thể dùng hàm đó làm cơ sở cho Cloud Functions.
Sao chép mã nguồn sau đây vào tệp 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"
Trước khi có thể triển khai hàm, bạn cần hoàn tất việc thiết lập môi trường. Bạn phải thiết lập phần phụ thuộc hàm.
Tạo một tệp mới có tên là requirements.txt rồi thêm gói google-cloud-secret-manager vào tệp đó:
requirements.txt
google-cloud-secret-manager==2.10.0
Lúc này, bạn sẽ có một thư mục chỉ chứa main.py và requirements.txt.
Cho phép truy cập vào khoá bí mật
Trước khi triển khai hàm, bạn cần cho phép Cloud Functions truy cập vào khoá bí mật của bạn.
Chuyển về cửa sổ dòng lệnh:

Cấp quyền truy cập cho Tài khoản dịch vụ Cloud Functions để truy cập vào khoá bí mật của bạn:
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
Bạn sẽ thấy kết quả sau đây:
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. Triển khai Cloud Functions
Với chế độ thiết lập ở các phần trước, giờ đây, bạn có thể triển khai và kiểm thử Cloud Function.
Trong thư mục chỉ chứa 2 tệp bạn đã tạo, hãy triển khai hàm:
gcloud functions deploy secret_hello \
--runtime python39 \
--set-env-vars PROJECT_ID=${PROJECT_ID} \
--trigger-http \
--allow-unauthenticated
Bạn sẽ thấy kết quả sau (đã rút gọn):
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 ...
Truy xuất URL của hàm (siêu dữ liệu httpsTrigger.url) bằng lệnh sau:
FUNCTION_URL=$(gcloud functions describe secret_hello --format 'value(httpsTrigger.url)')
Giờ đây, bạn có thể truy cập vào hàm kiểm thử bằng giá trị trả về dự kiến bằng cách gọi hàm:
curl $FUNCTION_URL
Bạn sẽ thấy kết quả sau đây:
We meet again!
Hàm này tham chiếu đến phiên bản gần đây nhất của khoá bí mật, được đặt để chứa chuỗi "Again", vì vậy, hàm này đang hoạt động như mong đợi.
11. Xin chúc mừng!
Bạn đã tìm hiểu cách sử dụng Secret Manager API bằng Python!
Dọn dẹp
Để tránh phát sinh phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được dùng trong hướng dẫn này, hãy làm như sau:
- Trong Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
- Trong danh sách dự án, hãy chọn dự án của bạn rồi nhấp vào Xoá.
- Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.
Tìm hiểu thêm
- Secret Manager: https://cloud.google.com/secret-manager/
- Python trên Google Cloud: https://cloud.google.com/python/
- Thư viện ứng dụng đám mây cho Python: https://googlecloudplatform.github.io/google-cloud-python/
Giấy phép
Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.