Quyền truy cập riêng tư của Cloud Run vào điểm cuối Toàn cầu và điểm cuối theo Khu vực của Cloud Storage

1. Giới thiệu

Điểm cuối Google API

API Google Cloud cung cấp nhiều loại điểm cuối để truy cập vào các dịch vụ, chủ yếu khác nhau về cách xử lý việc định tuyến yêu cầu, quyền lưu trú dữ liệu và khả năng cách ly theo khu vực.

Vui lòng xem tài liệu về sản phẩm để biết các loại điểm cuối API.

Sau đây là thông tin chi tiết về các điểm cuối Toàn cầu, Khu vực và Vị trí:

  1. Điểm cuối toàn cầu
  • Định dạng: {service}.googleapis.com (ví dụ: storage.googleapis.com)
  • Nội dung mô tả: Các điểm cuối này cung cấp một điểm truy cập duy nhất trên toàn cầu vào một dịch vụ. Các URL này không chỉ định một khu vực.
  • Định tuyến: Yêu cầu được định tuyến bằng Global Google Front Ends (GFE) và Global Service Load Balancing, thường hướng lưu lượng truy cập đến khu vực gần nhất còn hoạt động tốt để giảm thiểu độ trễ.
  • Chấm dứt TLS: Xảy ra tại GFE gần với máy khách nhất, có thể nằm ngoài khu vực Google Cloud nơi dữ liệu hoặc tài nguyên cư trú.
  • Nơi lưu trữ dữ liệu: Không có gì đảm bảo cho dữ liệu đang được truyền. Dữ liệu có thể vượt qua ranh giới khu vực sau khi được giải mã tại GFE.
  • Cách ly theo khu vực: Hạn chế. Mặc dù các dịch vụ phụ trợ thường mang tính khu vực, nhưng điểm truy cập và tính năng cân bằng tải lại mang tính toàn cầu. Điều này có nghĩa là các vấn đề ở một phần của cơ sở hạ tầng toàn cầu có thể ảnh hưởng đến các dịch vụ ở những khu vực khác.
  • Trường hợp sử dụng: Quyền truy cập cho mục đích chung, trong đó độ trễ thấp cho người dùng ở nhiều nơi là yếu tố then chốt và việc lưu trữ dữ liệu nghiêm ngặt trong quá trình truyền tải không phải là mối lo ngại chính.
  1. Điểm cuối theo khu vực (REP)
  • Định dạng: {service}.{location}.rep.googleapis.com (ví dụ: storage.us-east1.rep.googleapis.com)
  • Nội dung mô tả: Các vùng này được thiết kế để đảm bảo khả năng cô lập mạnh mẽ theo khu vực và nơi lưu trữ dữ liệu. Vị trí (một khu vực cụ thể trên Google Cloud) được chỉ định dưới dạng miền con. Đây là tiêu chuẩn hiện đại và đang thay thế Điểm cuối theo vị trí.
  • Định tuyến: Sử dụng một ngăn xếp giao diện người dùng hoàn toàn theo khu vực, bao gồm cả Trình cân bằng tải bên ngoài theo khu vực và Cân bằng tải dịch vụ theo khu vực . Toàn bộ đường dẫn yêu cầu, từ DNS đến phần phụ trợ dịch vụ, đều nằm trong khu vực được chỉ định.
  • Chấm dứt TLS: Xảy ra trong khu vực được chỉ định trên Trình cân bằng tải bên ngoài theo khu vực.
  • Nơi lưu trữ dữ liệu: Đảm bảo dữ liệu vẫn nằm trong khu vực được chỉ định cả trong quá trình truyền và sử dụng, đáp ứng các yêu cầu nghiêm ngặt về việc tuân thủ và chủ quyền.
  • Tính độc lập theo khu vực: Mạnh. Sự cố ở cơ sở hạ tầng giao diện người dùng của một khu vực không ảnh hưởng đến các khu vực khác.
  • Trường hợp sử dụng: Các ứng dụng yêu cầu nghiêm ngặt về nơi lưu trữ dữ liệu, khả năng cách ly cao theo khu vực và khả năng tuân thủ.

Xin lưu ý rằng không phải API nào của Google cũng có điểm cuối theo khu vực. Hãy kiểm tra tại đây để biết tất cả các điểm cuối theo khu vực được hỗ trợ.

Điểm cuối theo khu vực đa khu vực (mREP) cũng là điểm cuối theo khu vực, chẳng hạn như us (Hoa Kỳ), eu (Liên minh Châu Âu), v.v. (ví dụ: storage.us.rep.googleapis.com)

  1. Điểm cuối theo vị trí (LEP)
  • Định dạng: {location}-{service}.googleapis.com (ví dụ: us-east1-storage.googleapis.com)
  • Mô tả: Đây là những điểm cuối của phương pháp trước đây để cung cấp quyền truy cập theo vị trí cụ thể. Vị trí này là một phần của tên máy chủ chính. Lưu ý: Điểm cuối theo vị trí đang được thay thế bằng Điểm cuối theo khu vực.
  • Định tuyến: Vẫn dựa vào Giao diện người dùng toàn cầu của Google.
  • Chấm dứt TLS: Thường xảy ra tại GFE, có thể không nằm ở khu vực được chỉ định trong tên máy chủ.
  • Quyền lưu trú dữ liệu: Không thể đảm bảo rằng dữ liệu vẫn nằm trong khu vực được chỉ định trong quá trình truyền đối với lưu lượng truy cập từ Internet công cộng.
  • Phân lập theo khu vực: Yếu hơn Điểm cuối theo khu vực vì chúng sử dụng cơ sở hạ tầng giao diện người dùng toàn cầu.
  • Trường hợp sử dụng: Trước đây được dùng cho một số trường hợp truy cập theo khu vực, nhưng hiện tại thường không được khuyến khích sử dụng mà thay vào đó là Điểm cuối theo khu vực để đảm bảo chắc chắn hơn.

Private Service Connect cho API của Google

Private Service Connect là một tính năng của mạng Google Cloud, cho phép người dùng truy cập vào các dịch vụ của nhà cung cấp. Trong đó có khả năng kết nối với các API của Google thông qua một điểm cuối riêng tư được lưu trữ trong VPC của người dùng.

Cách sử dụng điểm cuối PSC để truy cập vào API của Google:

Cách sử dụng phần phụ trợ PSC để truy cập vào API của Google:

Cloud Run gửi lưu lượng truy cập đến mạng VPC

Tính năng truyền dữ liệu trực tiếp ra khỏi VPC mang đến cơ sở hạ tầng nâng cao và cấu hình truyền dữ liệu ra khỏi VPC đơn giản hơn cho Cloud Run, bao gồm cả những lợi ích sau:

  • Thiết lập: Các dịch vụ và công việc của Cloud Run có thể gửi lưu lượng truy cập đến một mạng VPC mà không cần phải quản lý trình kết nối Serverless VPC Access.
  • Chi phí: Bạn chỉ phải trả phí lưu lượng truy cập mạng, phí này sẽ giảm xuống bằng 0 giống như chính dịch vụ này.
  • Bảo mật: Bạn có thể sử dụng trực tiếp các thẻ mạng trên bản sửa đổi dịch vụ để có được mức độ bảo mật mạng chi tiết hơn.
  • Hiệu suất: Độ trễ thấp hơn, thông lượng cao hơn.

Bạn có thể cho phép dịch vụ, hàm, tác vụ hoặc nhóm worker Cloud Run gửi tất cả lưu lượng truy cập đến một mạng VPC bằng cách sử dụng tính năng truyền dữ liệu trực tiếp ra khỏi VPC.

2. Kiến thức bạn sẽ học được

  • Cách tạo điểm cuối PSC cho API toàn cầu của Google.
  • Cách tạo điểm cuối PSC cho API khu vực của Google.
  • Cách thay đổi điểm cuối API trong mã Cloud Run và định cấu hình mạng cho lưu lượng truy cập đi.

3. Cấu trúc tổng thể của phòng thí nghiệm

8f5328678688f210.png

4. Các bước chuẩn bị

Các vai trò IAM cần thiết để thực hiện bài thực hành

Bạn bắt đầu bằng cách chỉ định các vai trò IAM bắt buộc cho tài khoản GCP ở cấp dự án.

  • Quản trị viên mạng máy tính (roles/compute.networkAdmin) Vai trò này cho phép bạn kiểm soát hoàn toàn các tài nguyên mạng của Compute Engine.
  • Quản trị viên ghi nhật ký (roles/logging.admin) Vai trò này cho phép bạn truy cập vào tất cả các quyền ghi nhật ký và các quyền phụ thuộc.
  • Quản trị viên sử dụng dịch vụ (roles/serviceusage.serviceUsageAdmin) Vai trò này cho phép bạn bật, tắt và kiểm tra trạng thái dịch vụ, kiểm tra các thao tác, cũng như sử dụng hạn mức và thông tin thanh toán cho một dự án người dùng.
  • Quản trị viên DNS (roles/dns.admin) Vai trò này cho phép bạn có quyền đọc-ghi đối với tất cả tài nguyên Cloud DNS
  • Quản trị viên Cloud Run (roles/run.admin) Vai trò này cho phép bạn kiểm soát hoàn toàn mọi tài nguyên Cloud Run.
  • Quản trị viên bộ nhớ (roles/storage.admin): Vai trò này cho phép bạn có toàn quyền kiểm soát các đối tượng và bộ chứa.

Bật API

Trong Cloud Shell, hãy đảm bảo dự án của bạn được định cấu hình đúng cách và thiết lập các biến môi trường.

Trong Cloud Shell, hãy thực hiện các bước sau:

gcloud auth login
gcloud config set project <your project id>
export project_id=<your project id>
export region=<your region>
export zone=$region-a
echo $project_id
echo $region

Bật tất cả các API cần thiết của Google trong dự án. Trong Cloud Shell, hãy thực hiện các bước sau:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  compute.googleapis.com \
  dns.googleapis.com \
  servicedirectory.googleapis.com \
  networkconnectivity.googleapis.com

Tạo VPC

Trong dự án, hãy tạo một mạng VPC ở chế độ mạng con tuỳ chỉnh. Thực hiện các thao tác sau trong Cloud Shell:

gcloud compute networks create mynet \
    --subnet-mode=custom

Tạo mạng con

Trong Cloud Shell, hãy thực hiện các bước sau để tạo một mạng con IPV4:

gcloud compute networks subnets create mysubnet \
    --network=mynet \
    --range=10.0.0.0/24 \
    --region=$region

Tạo Cloud NAT và Cloud Router

Cloud NAT được dùng để cho phép các công việc Cloud Run kết nối với các trang web bên ngoài.

gcloud compute routers create $region-cr \
   --network=mynet \
   --region=$region 
gcloud compute routers nats create $region-nat \
    --router=$region-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

5. Tạo điểm cuối PSC cho Cloud Storage

Bạn sẽ tạo 2 điểm cuối PSC cho Cloud Storage, một cho phạm vi Toàn cầu và một cho phạm vi Khu vực.

Tạo điểm cuối PSC có phạm vi toàn cầu

Với Private Service Connect, bạn có thể tạo các điểm cuối riêng tư có phạm vi toàn cầu bằng cách sử dụng địa chỉ IP nội bộ toàn cầu trong mạng VPC.

Bạn sẽ cần phân bổ một địa chỉ IP duy nhất chưa được xác định trong VPC của mình. Vui lòng tham khảo tài liệu về yêu cầu đối với địa chỉ IP này.

Trong Cloud Shell, hãy thực hiện các thao tác sau để tạo một địa chỉ IP. Vui lòng thay đổi –addresses=<pscendpointip> để sử dụng địa chỉ IP mà bạn đã phân bổ.

gcloud compute addresses create pscglobalip \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=<pscendpointip> \
    --network=mynet
pscendpointip=$(gcloud compute addresses list --filter=name:pscglobalip --format="value(address)")
echo $pscendpointip

Tạo một quy tắc chuyển tiếp để kết nối điểm cuối với các API và dịch vụ của Google.

gcloud compute forwarding-rules create pscendpoint \
    --global \
    --network=mynet \
    --address=pscglobalip \
    --target-google-apis-bundle=all-apis

Kiểm tra p.googleapis.com trong Cloud DNS

Khi bạn tạo một điểm cuối, các cấu hình DNS sau đây sẽ tự động được tạo:

  • Một vùng DNS riêng tư của Thư mục dịch vụ được tạo cho p.googleapis.com.
  • Bản ghi DNS được tạo trong p.googleapis.com cho một số API và dịch vụ thường dùng của Google. Các API và dịch vụ này có sẵn khi sử dụng Private Service Connect và có tên DNS mặc định kết thúc bằng googleapis.com.

Các Điểm cuối toàn cầu được đăng ký với Thư mục dịch vụ. Bạn sẽ sử dụng storage-[psc endpoint name].p.googleapis.com để truy cập vào Cloud Storage. Bạn có thể xem tài liệu về sản phẩm tại đây để biết thông tin chi tiết.

Kiểm tra xem bạn đã tạo vùng p.googleaps.com hay chưa bằng cách chạy lệnh.

gcloud dns managed-zones list

Nếu muốn sử dụng tên DNS mặc định là storage.googleapis.com, bạn sẽ tạo một vùng riêng tư storage.googleapis.com trong Cloud DNS và thêm bản ghi đỉnh trỏ đến điểm cuối PSC của địa chỉ IP có phạm vi toàn cầu.

Tạo điểm cuối PSC có phạm vi theo khu vực cho Cloud Storage

Bạn sẽ cần một IP từ mạng con VPC. Chạy lệnh bên dưới, một IP từ mạng con sẽ được phân bổ cho điểm cuối PSC.

gcloud network-connectivity regional-endpoints create psc-regional-endpoint \
    --region=$region \
    --network=projects/$project_id/global/networks/mynet \
    --subnetwork=projects/$project_id/regions/$region/subnetworks/mysubnet \
    --target-google-api=storage.us-central1.rep.googleapis.com

Lấy địa chỉ IP điểm cuối được tạo từ bước trên.

regionalip=$(gcloud network-connectivity regional-endpoints describe psc-regional-endpoint --region=$region --format="value(address)")
echo $regionalip

Bạn sẽ sử dụng storage.us-central1.rep.googleapis.com để truy cập vào Cloud Storage. Bạn cần tạo một vùng riêng tư cho storage.us-central1.rep.googleapis.com và bản ghi đỉnh của địa chỉ IP mà bạn vừa tạo cho điểm cuối theo khu vực trong Cloud DNS.

Tạo vùng riêng tư cho Điểm cuối theo khu vực của Cloud Storage

Bạn sẽ sử dụng storage.[tên khu vực].rep.googleapis.com để truy cập vào điểm cuối theo khu vực của Cloud Storage.

Bạn sẽ cần tạo một vùng riêng tư trong Cloud DNS và thêm một bản ghi đỉnh trỏ đến địa chỉ IP của điểm cuối theo khu vực của Cloud Storage.

Trong lệnh bên dưới, us-central1 là khu vực ví dụ. Bạn nên tạo vùng có tên là khu vực của mình.

gcloud dns managed-zones create psc-regional-endpoint-zone \
  --description="" \
  --dns-name="storage.us-central1.rep.googleapis.com" \
  --visibility="private" \
  --networks="mynet"

gcloud dns record-sets create storage.us-central1.rep.googleapis.com. \
  --rrdatas=$regionalip \
  --ttl=300 \
  --type=A \
  --zone=psc-regional-endpoint-zone

6. Định cấu hình công việc trên Cloud Run bằng điểm cuối PSC có phạm vi toàn cầu

Lấy mã

Trước tiên, bạn sẽ khám phá một ứng dụng Node.js để chụp ảnh màn hình các trang web và lưu trữ chúng vào Cloud Storage. Sau đó, bạn sẽ tạo một hình ảnh vùng chứa cho ứng dụng và chạy ứng dụng đó dưới dạng một công việc trên Cloud Run.

Trong Cloud Shell, hãy chạy lệnh sau để sao chép mã xử lý ứng dụng từ kho lưu trữ này:

git clone https://github.com/GoogleCloudPlatform/jobs-demos.git

Chuyển đến thư mục chứa ứng dụng:

cd jobs-demos/screenshot

Bạn sẽ thấy bố cục tệp sau:

|

├── Dockerfile

├── README.md

├── screenshot.js

├── package.json

Sau đây là nội dung mô tả ngắn gọn về từng tệp:

  • screenshot.js chứa mã Node.js cho ứng dụng. Ứng dụng này chụp ảnh màn hình các trang web và lưu trữ trong Cloud Storage.
  • package.json xác định các phần phụ thuộc của thư viện.
  • Dockerfile xác định hình ảnh vùng chứa.

Mở mã screenshot.js, bạn sẽ thay đổi apiEndpoint thành điểm cuối toàn cầu PSC. Tìm mã và thay thế const storage = new Storage(); bằng nội dung sau:

const storage = new Storage(
    {
      apiEndpoint:'https://storage-pscendpoint.p.googleapis.com.',
      useAuthWithCustomEndpoint: true
    }
  );

Triển khai một công việc

Trước khi tạo một công việc, bạn cần tạo một tài khoản dịch vụ mà bạn sẽ dùng để chạy công việc đó.

gcloud iam service-accounts create screenshot-sa --display-name="Screenshot app service account"

Cấp vai trò storage.admin cho tài khoản dịch vụ để tài khoản này có thể dùng để tạo bộ chứa và đối tượng.

gcloud projects add-iam-policy-binding $project_id \
  --role roles/storage.admin \
  --member serviceAccount:screenshot-sa@$project_id.iam.gserviceaccount.com

Cấp vai trò Storage Object User , Logs Writer và Artifact Registry Repository Administrator cho tài khoản dịch vụ Compute mặc định.

project_number=$(gcloud projects describe $project_id --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $project_id \
  --role roles/storage.objectUser \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding $project_id \
  --role roles/logging.logWriter \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding $project_id \
  --role roles/artifactregistry.repoAdmin \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

Bạn sẽ bật tính năng truyền dữ liệu trực tiếp ra khỏi VPC cho các lệnh Cloud Run để gửi tất cả lưu lượng truy cập đến một mạng VPC.

Trong Cloud Shell, hãy thực hiện các bước sau:

gcloud run jobs deploy screenshot-1 \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$region \
  --set-env-vars=BUCKET_NAME=screenshot-$project_id-$RANDOM \
  --service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
  --vpc-egress=all-traffic \
  --network=mynet \
  --subnet=mysubnet

Chạy lệnh

Trong Cloud Shell, hãy thực hiện các bước sau:

gcloud run jobs execute screenshot-1 --region=$region

Kiểm tra trạng thái của công việc và nhật ký. Chuyển đến bảng điều khiển Cloud Run và tìm công việc đó. Bạn nhấp vào tác vụ và kiểm tra Nhật ký của nhật ký. Bạn sẽ thấy kết quả thực thi công việc tương tự như bên dưới.

bae25d504ea20384.png

Để xem nhật ký thực thi chi tiết của công việc, hãy nhấp vào Xem nhật ký tại tác vụ. Bạn sẽ thấy nhật ký công việc tương tự như bên dưới.

aa0468dc463f4320.png

Đã tạo một nhóm mới. Bạn có thể chuyển đến bảng điều khiển Cloud Storage và kiểm tra bộ chứa mới được tạo. Xin lưu ý rằng khi bạn sử dụng Điểm cuối toàn cầu của Cloud Storage, bộ chứa sẽ là bộ chứa đa khu vực. Bạn có thể kiểm tra những hình ảnh đã tải lên nhóm lưu trữ.

Kết quả kiểm thử cho thấy Cloud Run đã truy cập riêng vào Điểm cuối toàn cầu của Cloud Storage mà bạn đã thay đổi trong công việc Cloud Run:

apiEndpoint:‘https://storage-pscendpoint.p.googleapis.com.'

7. Định cấu hình công việc Cloud Run bằng điểm cuối PSC có phạm vi theo khu vực

Trong mã, bạn sẽ thay đổi apiEndpoint thành điểm cuối PSC có phạm vi theo khu vực.

Tìm mã và thay thế const storage = new Storage(); bằng nội dung sau ( chúng tôi sử dụng us-central1 làm ví dụ. Vui lòng thay đổi thành khu vực của bạn) :

const storage = new Storage(
    {
      apiEndpoint:'https://storage.us-central1.rep.googleapis.com.',
      useAuthWithCustomEndpoint: true
    }
  );

Triển khai một công việc

Đảm bảo bạn đang ở trong thư mục chứa ứng dụng (jobs-demos/screenshot).

pwd

Bạn bật tính năng truyền dữ liệu trực tiếp ra khỏi VPC cho các công việc để gửi tất cả lưu lượng truy cập đến một mạng VPC.

Trong Cloud Shell, hãy thực hiện các bước sau:

gcloud run jobs deploy screenshot-2 \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$region \
  --set-env-vars=BUCKET_NAME=screenshot-$PROJECT_ID-$RANDOM \
  --service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
  --vpc-egress=all-traffic \
  --network=mynet \
  --subnet=mysubnet

Chạy lệnh

Trong Cloud Shell, hãy thực hiện các bước sau:

gcloud run jobs execute screenshot-2 --region=$region

Kiểm tra trạng thái của công việc và nhật ký. Chuyển đến bảng điều khiển Cloud Run và tìm công việc đó. Bạn nhấp vào công việc và kiểm tra Nhật ký của công việc đó. Bạn sẽ thấy kết quả thực thi công việc tương tự như bên dưới.

1065ce25136d355e.png

Để xem nhật ký chi tiết về quá trình thực thi công việc, hãy nhấp vào Xem nhật ký. Bạn sẽ thấy nhật ký công việc tương tự như bên dưới.

837afb2f95a7049b.png

Đã tạo một nhóm mới. Bạn có thể chuyển đến bảng điều khiển Cloud Storage và kiểm tra bộ chứa mới được tạo. Xin lưu ý rằng khi bạn sử dụng Điểm cuối theo khu vực của Cloud Storage, bộ chứa sẽ là bộ chứa một khu vực. Bạn có thể kiểm tra những hình ảnh đã tải lên nhóm lưu trữ.

Kết quả kiểm thử cho thấy Cloud Run đã truy cập riêng vào Điểm cuối theo khu vực của Cloud Storage mà bạn đã thay đổi trong công việc Cloud Run:

apiEndpoint:‘https://storage.us-central1.rep.googleapis.com.'

8. Dọn dẹp

Dọn dẹp công việc trên Cloud Run

gcloud run jobs delete screenshot-1 \
  --region=$region --quiet
gcloud run jobs delete screenshot-2 \
  --region=$region --quiet

gcloud iam service-accounts delete screenshot-sa@$project_id.iam.gserviceaccount.com --quiet

Dọn dẹp điểm cuối PSC

gcloud compute forwarding-rules delete pscendpoint \
    --global --quiet
gcloud network-connectivity regional-endpoints delete psc-regional-endpoint \
    --region=$region --quiet
gcloud compute addresses delete pscglobalip \
    --global --quiet

Dọn dẹp Cloud NAT, Cloud Router và VPC

gcloud compute routers nats delete $region-nat \
    --router=$region-cr \
    --region=$region --quiet
gcloud compute routers delete $region-cr \
    --region=$region --quiet
gcloud compute networks subnets delete mysubnet \
    --region=$region --quiet
gcloud compute networks delete mynet --quiet

9. Xin chúc mừng

Bạn đã thử nghiệm thành công quyền truy cập riêng tư của Cloud Run vào Cloud Storage thông qua Điểm cuối toàn cầu và Điểm cuối theo khu vực.