1. Tổng quan
Trong phòng thí nghiệm này, bạn sẽ triển khai cổng thông tin nhân viên cho phép nhân viên xem, cập nhật và xoá đơn đặt hàng trong ứng dụng Cymbal Eats. Bạn sẽ sử dụng Identity Aware Proxy (IAP) để bảo mật quyền truy cập vào cổng thông tin mà không cần sử dụng Mạng riêng ảo (VPN). IAP giúp đơn giản hoá việc triển khai mô hình truy cập không tin tưởng và mất ít thời gian hơn so với VPN cho nhân viên từ xa tại chỗ và trong môi trường đám mây với một điểm kiểm soát duy nhất để quản lý quyền truy cập vào các ứng dụng của bạn.

Identity-Aware Proxy là gì?
Identity-Aware Proxy (IAP) là một dịch vụ của Google Cloud, có chức năng chặn các yêu cầu được gửi đến ứng dụng của bạn, xác thực người dùng đưa ra yêu cầu bằng Dịch vụ nhận dạng của Google và chỉ cho phép các yêu cầu đi qua nếu yêu cầu đó đến từ một người dùng được phép truy cập vào ứng dụng. Ngoài ra, nó có thể sửa đổi tiêu đề của yêu cầu để thêm thông tin về người dùng đã xác thực.
Kiến thức bạn sẽ học được
- Cách định cấu hình Nhóm điểm cuối mạng (NEG) phi máy chủ
- Cách định cấu hình trình cân bằng tải
- Cách bật IAP để hạn chế quyền truy cập
- Cách hạn chế quyền truy cập bằng IAP
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 là giá trị 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 mã này 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.
Thiết lập môi trường
- Tạo các biến môi trường liên quan đến dự án và tài nguyên
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
- Bật API dịch vụ IAP và Cloud Resource Manager
gcloud services enable \
iap.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudidentity.googleapis.com \
compute.googleapis.com
- Nhân bản kho lưu trữ ứng dụng mẫu và chuyển đến thư mục
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
- Triển khai Cổng thông tin nhân viên bằng tập lệnh thiết lập. Đợi tập lệnh hoàn tất rồi mới chuyển sang bước tiếp theo
./setup.sh
Kết quả ví dụ
... Done. Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic. Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
- Nhấp vào đường liên kết URL dịch vụ

3. Định cấu hình Nhóm thiết bị đầu cuối mạng (NEG) không dùng máy chủ
Bạn sẽ tạo một Nhóm điểm cuối mạng không máy chủ( NEG không máy chủ) cho dịch vụ Cloud Run của giao diện người dùng nhân viên. NEG không máy chủ cho phép bạn sử dụng các ứng dụng không máy chủ của Google Cloud với tính năng Cân bằng tải HTTP(S) bên ngoài.

- Tạo một nhóm thiết bị đầu cuối mạng cho dịch vụ giao diện người dùng của nhân viên.
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
--project $PROJECT_ID \
--region=$REGION \
--network-endpoint-type=serverless \
--cloud-run-service=employee-ui-service
Ví dụ về kết quả đầu ra
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg]. Created network endpoint group [employee-ui-iap-neg].
Tạo một dịch vụ phụ trợ và thêm NEG không máy chủ
Dịch vụ phụ trợ xác định cách Cloud Load Balancing phân phối lưu lượng truy cập. Cấu hình dịch vụ phụ trợ chứa một tập hợp các giá trị, chẳng hạn như giao thức dùng để kết nối với các dịch vụ phụ trợ, nhiều chế độ cài đặt phân phối và phiên, các chế độ kiểm tra tình trạng và thời gian chờ. Các chế độ cài đặt này giúp bạn kiểm soát chi tiết cách hoạt động của bộ cân bằng tải.
- Tạo dịch vụ phụ trợ
gcloud compute backend-services create employee-ui-iap-backend \
--global
Ví dụ về kết quả đầu ra
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend]. NAME: employee-ui-iap-backend BACKENDS: PROTOCOL: HTTP
- Thêm NEG không máy chủ làm phần phụ trợ cho dịch vụ phụ trợ
gcloud compute backend-services add-backend employee-ui-iap-backend \
--global \
--network-endpoint-group=employee-ui-iap-neg \
--network-endpoint-group-region=$REGION
Ví dụ về kết quả đầu ra
Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
- Tạo một bản đồ URL để định tuyến các yêu cầu đến đến dịch vụ phụ trợ
gcloud compute url-maps create employee-ui-iap-url-map \
--default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map]. NAME: employee-ui-iap-url-map DEFAULT_SERVICE: backendServices/employee-ui-iap-backend
4. Định cấu hình các thành phần của Trình cân bằng tải
Sơ đồ sau đây cho thấy trình cân bằng tải sử dụng một phần phụ trợ NEG không máy chủ để chuyển các yêu cầu đến một dịch vụ Cloud Run không máy chủ.

Đặt trước địa chỉ IP tĩnh
- Đặt trước một địa chỉ IPv4 tĩnh và lưu trữ miền
gcloud compute addresses create employee-ui-iap-ip \
--network-tier=PREMIUM \
--ip-version=IPV4 \
--global
Ví dụ về kết quả đầu ra
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
- Lưu trữ miền nip.io
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io
Tạo tài nguyên chứng chỉ SSL do Google quản lý
- Tạo tài nguyên chứng chỉ SSL do Google quản lý
gcloud compute ssl-certificates create employee-ui-iap-cert \
--description=employee-ui-iap-cert \
--domains=$DOMAIN \
--global
Ví dụ về kết quả đầu ra
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert]. NAME: employee-ui-iap-cert TYPE: MANAGED CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00 EXPIRE_TIME: MANAGED_STATUS: PROVISIONING 34.102.234.98.nip.io: PROVISIONING
Tạo một proxy HTTPS mục tiêu
- Tạo đích đến là proxy HTTPS để định tuyến các yêu cầu đến bản đồ URL của bạn
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
--ssl-certificates employee-ui-iap-cert \
--url-map employee-ui-iap-url-map
Ví dụ về kết quả đầu ra
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy]. NAME: employee-ui-iap-http-proxy SSL_CERTIFICATES: employee-ui-iap-cert URL_MAP: employee-ui-iap-url-map CERTIFICATE_MAP:
Định cấu hình quy tắc chuyển tiếp
- Tạo quy tắc chuyển tiếp để định tuyến các yêu cầu đến đến proxy
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
--load-balancing-scheme=EXTERNAL \
--network-tier=PREMIUM \
--address=employee-ui-iap-ip \
--global \
--ports=443 \
--target-https-proxy employee-ui-iap-http-proxy
Kết quả ví dụ
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].
Hạn chế lưu lượng truy cập đến dịch vụ Cloud Run
Hạn chế lưu lượng truy cập đến chỉ chấp nhận các yêu cầu nội bộ và yêu cầu đến qua tính năng Cân bằng tải HTTP(S).

- Cập nhật dịch vụ để chỉ cho phép lưu lượng truy cập đến từ các yêu cầu nội bộ và yêu cầu thông qua Trình cân bằng tải HTTP(S)
gcloud run services update employee-ui-service \
--ingress internal-and-cloud-load-balancing \
--region $REGION
Kết quả ví dụ
OK Deploying... Done. OK Creating Revision... OK Routing traffic... Done. Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic. Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
- Nhấp vào đường liên kết URL dịch vụ

Quyền truy cập vào URL dịch vụ Cloud Run hiện bị cấm.
5. Bật Cloud Identity-Aware Proxy (IAP) trên Bộ cân bằng tải
IAP cho phép bạn thiết lập một lớp uỷ quyền trung tâm cho các ứng dụng được truy cập bằng HTTPS. Bạn có thể sử dụng mô hình kiểm soát quyền truy cập ở cấp ứng dụng thay vì tường lửa ở cấp mạng.

Định cấu hình màn hình xin phép bằng OAuth
Thương hiệu là màn hình xin phép bằng OAuth chứa thông tin về thương hiệu cho người dùng. Thương hiệu có thể bị hạn chế đối với người dùng nội bộ hoặc người dùng công khai. Thương hiệu nội bộ cho phép một thành viên của cùng tổ chức Google Workspace với dự án truy cập vào quy trình OAuth. Thương hiệu công khai giúp mọi người có quyền truy cập vào Internet đều có thể sử dụng quy trình OAuth.
- Tạo thương hiệu
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")
gcloud alpha iap oauth-brands create \
--application_title="Cymbal Eats" \
--support_email=$USER_EMAIL
Ví dụ về kết quả đầu ra
Created [462858740426]. applicationTitle: Cymbal Eats name: projects/462858740426/brands/462858740426 orgInternalOnly: true
Tạo ứng dụng khách OAuth IAP
- Tạo một ứng dụng khách bằng tên thương hiệu ở bước trước
gcloud alpha iap oauth-clients create \
projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
--display_name=cymbal-eats-employee-ui
Ví dụ về kết quả đầu ra
Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com]. displayName: cymbal-eats-employee-ui name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com secret: [secret-removed]
- Lưu trữ tên, mã nhận dạng và khoá bí mật của ứng dụng khách
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
--filter="displayName:cymbal-eats-employee-ui")
export CLIENT_ID=${CLIENT_NAME##*/}
export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
- Trong Cloud Console, hãy chọn dự án trong trình đơn thả xuống để chọn dự án
- Chuyển đến màn hình xin phép bằng OAuth trong Cloud Console

- Nhấp vào MAKE EXTERNAL (ĐẶT LÀ NGƯỜI DÙNG BÊN NGOÀI) trong phần User Type (Loại người dùng)
- Chọn Thử nghiệm làm Trạng thái xuất bản

- Nhấp vào XÁC NHẬN
6. Hạn chế quyền truy cập bằng IAP
Hạn chế quyền truy cập vào dịch vụ phụ trợ bằng IAP, sau đó xác minh rằng ứng dụng không thể truy cập.
- Bật IAP trên dịch vụ phụ trợ
gcloud iap web enable --resource-type=backend-services \
--oauth2-client-id=$CLIENT_ID \
--oauth2-client-secret=$CLIENT_SECRET \
--service=employee-ui-iap-backend
Xác minh cấu hình IAP
- Xác minh rằng chứng chỉ SSL đang ở trạng thái ĐANG HOẠT ĐỘNG
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
- Lấy URL dịch vụ
echo https://$DOMAIN
Kết quả ví dụ
https://34.102.234.98.nip.io
- Nhấp vào URL của dịch vụ để mở cổng thông tin dành cho nhân viên.

- Đăng nhập bằng thông tin đăng nhập phòng thí nghiệm của bạn.

- Đóng trình duyệt
Cấp cho người dùng quyền truy cập vào cổng thông tin dành cho nhân viên
- Thêm một liên kết chính sách IAM cho vai trò
'roles/iap.httpsResourceAccessor'đối với người dùng được tạo ở bước trước
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=employee-ui-iap-backend \
--member=user:$USER_EMAIL \
--role='roles/iap.httpsResourceAccessor'
Kết quả ví dụ
Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].
Kiểm tra quyền truy cập vào dịch vụ
Xác nhận rằng bạn đã được cấp quyền truy cập vào cổng thông tin dành cho nhân viên
- Lấy URL dịch vụ
echo https://$DOMAIN
Kết quả ví dụ
https://34.102.234.98.nip.io
- Nhấp vào URL của dịch vụ để mở cổng thông tin dành cho nhân viên.

Giờ đây, bạn đã có quyền truy cập vào cổng thông tin dành cho nhân viên.
(Không bắt buộc) Triển khai tất cả các phần phụ thuộc. Việc triển khai các vi dịch vụ này có thể mất khoảng 20 phút.
unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL
cd ~/cymbal-eats
./setup.sh
./get-site-urls.sh
7. Xin chúc mừng!
Xin chúc mừng, bạn đã hoàn tất lớp học lập trình này!
Bước tiếp theo:
Khám phá các lớp học lập trình khác của Cymbal Eats:
- Kích hoạt quy trình công việc trên đám mây bằng Eventarc
- Kích hoạt quá trình xử lý sự kiện từ Cloud Storage
- Kết nối với CloudSQL riêng tư từ Cloud Run
- Kết nối với cơ sở dữ liệu được quản lý toàn diện từ Cloud Run
- Kích hoạt các công việc trên Cloud Run bằng Cloud Scheduler
- Triển khai an toàn lên Cloud Run
- Bảo mật lưu lượng truy cập vào Cloud Run
- Kết nối với AlloyDB riêng tư từ chế độ Tự vận hành của GKE
Dọn dẹp
Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong hướng dẫn này, hãy xoá dự án chứa các tài nguyên đó hoặc giữ lại dự án rồi xoá từng tài nguyên.
Xoá dự án
Cách dễ nhất để không bị tính phí là xoá dự án mà bạn đã tạo cho hướng dẫn này.