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 giá trị bí mật dưới dạng BLOB nhị phân hoặc chuỗi văn bản. Với các quyền thích hợp, bạn có thể xem nội dung của giá trị bí mật.
Secret Manager hoạt động hiệu quả trong việc lưu trữ thông tin cấu hình như mật khẩu cơ sở dữ liệu, khoá API hoặc chứng chỉ TLS mà một ứ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 giá trị bí mật bằng thư viện ứng dụng Python
- Cách truy cập vào các giá trị 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á trải nghiệm của mình với Python như thế nào?
Bạn đánh giá trải nghiệm của mình khi sử dụng các dịch vụ của Google Cloud như thế nào?
2. Thiết lập và yêu cầu
Thiết lập môi trường tự học
- Đă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ị cho 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 tên 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 của Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console 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 đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử mã nhận dạng của riêng mình và xem mã đó có dùng được hay không. Bạn không thể thay đổi mã này sau bước này và mã này sẽ tồn tại trong suốt thời gian của dự án. - Để bạn tham khảo, 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 API/tài nguyên trên đám mây. 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 để không phải 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.
Bắt đầu Cloud Shell
Mặc dù bạn 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 đám mây.
Kích hoạt Cloud Shell
- Trên 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 (dưới màn hình đầ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 lại màn hình đó). Đây là màn hình một lần đó:

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

Máy ảo này được tải tất cả các công cụ phát triển mà bạn cần. Máy ảo này cung cấp một thư mục chính 5 GB liên tục và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện hầu hết, nếu không phả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.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Kết quả 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
Kết quả lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt bằng lệnh này:
gcloud config set project <PROJECT_ID>
Kết quả lệnh
Updated property [core/project].
3. Bật Secret Manager API
Trước khi có thể bắt đầu sử dụng Secret Manager API, bạn phải bật API này. Khi sử dụng Cloud Shell, bạn có thể bật API này 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
Đối với một phần của hướng dẫn này, bạn sẽ sử dụng trình thông dịch Python tương tác có tên là IPython, đượ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 giá trị bí mật
Một giá trị bí mật chứa một hoặc nhiều phiên bản giá trị bí mật. Bạn có thể tạo các giá trị này bằng dòng lệnh gcloudcommand-line, nhưng cũng có thể tạo bằng Python.
Để sử dụng một giá trị bí mật, trước tiên, bạn cần tạo giá trị bí mật bằng tên của giá trị bí mật, sau đó thêm một phiên bản của giá trị bí mật, là giá trị của giá trị bí mật.
Đặt Mã dự án trong IPython:
PROJECT_ID = "<PROJECT_ID>"
Tạo giá trị 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 giá trị 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 giá trị bí mật
Bây giờ, giá trị bí mật đã tồn tại, bạn có thể gán cho giá trị bí mật một giá trị 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 giá trị 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
Giá trị 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
Lưu ý rằng phiên bản mới của giá trị 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 giá trị 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 giá trị bí mật, bạn có thể chỉ định một phiên bản cụ thể hoặc chỉ 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 các giá trị bí mật. Lưu trữ thông tin đăng nhập cơ sở dữ liệu dưới dạng giá trị bí mật, sau đó sử dụng các giá trị này để xác thực hoặc lưu trữ chứng nhận và sử dụng các chứng nhận đó; nhưng không in trực tiếp các giá trị bí mật, vì điều này sẽ làm mất mục đích giữ bí mật các giá trị đó.
Bạn sẽ thực hiện các thao tác trên các giá trị bí mật, đánh giá giá trị của các giá trị đó mà không in trực tiếp. Thay vào đó, bạn sẽ in một hàm băm của giá trị 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 giá trị 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ả 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ả 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ả tương tự như lệnh cuối cùng:
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
Gọi lại hàm, nhưng lần nà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 kết quả khác:
9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177
8. Sử dụng Secret Manager với Cloud Functions
Bạn có thể sử dụng các giá trị 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 bạn muốn sử dụng Python trong Cloud Functions, bạn có thể làm theo lớp học lập trình Hàm HTTP Cloud Functions bằng Python.
Đóng IPython bằng cách gọi hàm exit:
exit
Bạn sẽ được trả 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 sử dụng Cloud Shell, bạn có thể bật API này bằng lệnh sau:
gcloud services enable cloudfunctions.googleapis.com cloudbuild.googleapis.com
Tạo một thư mục mới để xây dựng 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ã từ phía trên cùng bên phải của Cloud Shell:

Chuyển đến tệp main.py bên 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 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 việc có thể truy cập vào các giá trị bí mật này trong một hàm sẽ hữu ích hơn nhiều.
Khi sử dụng hàm access_secret_version mà bạn đã tạo trước đó, bạn có thể sử dụng hàm đó làm cơ sở cho Cloud Function.
Sao chép mã sau 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 quá trình thiết lập môi trường. Điều này yêu cầu bạn 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 và thêm gói google-cloud-secret-manager vào tệp đó:
requirements.txt
google-cloud-secret-manager==2.10.0
Bây giờ, 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 giá trị bí mật
Trước khi có thể triển khai hàm, bạn cần cho phép Cloud Functions có khả năng truy cập vào giá trị bí mật.
Chuyển về Terminal:

Cấp quyền truy cập cho Tài khoản dịch vụ Cloud Functions để truy cập vào giá trị bí mật:
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 Function
Với quá trình thiết lập trong 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 mà 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 đây (đã cắt bớt):
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)')
Bây giờ, hãy kiểm thử xem có thể truy cập vào hàm bằng giá trị trả về dự kiến hay không 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 mới nhất của giá trị bí mật, được đặt để chứa chuỗi "Again", vì vậy, hàm này đang hoạt động như dự kiến.
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 bị tính phí vào tài khoản Google Cloud cho các tài nguyên được sử dụng trong hướng dẫn này:
- 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.