Tìm hiểu chuyên sâu về Artifact Registry

1. Tổng quan

Artifact Registry là trình quản lý gói được quản lý hoàn toàn và cung cấp một công cụ hợp nhất để quản lý các gói ngôn ngữ và hình ảnh vùng chứa OCI (chẳng hạn như Maven và npm).

Artifact Registry được tích hợp đầy đủ với nhiều dịch vụ khác của Google Cloud, chẳng hạn như trong các ví dụ sau:

  • Cloud Build có thể tải trực tiếp các cấu phần phần mềm hình ảnh lên Artifact Registry.
  • Cloud Deploy có thể triển khai Trực tiếp các hình ảnh trong Artifact Registry vào nhiều môi trường thời gian chạy.
  • Nó cung cấp hình ảnh cho các thời gian chạy vùng chứa như Cloud Run và GKE, đồng thời cho phép các chức năng tối ưu hoá hiệu suất nâng cao như truyền trực tuyến hình ảnh.
  • Artifact Registry có thể đóng vai trò là điểm phát hiện cho Artifact Analysis để liên tục giám sát các lỗ hổng bảo mật đã biết.
  • Cloud IAM cung cấp chế độ kiểm soát nhất quán và chi tiết đối với quyền truy cập và quyền đối với cấu phần phần mềm.

Phòng thí nghiệm này sẽ hướng dẫn bạn tìm hiểu nhiều tính năng trong số này dưới dạng một hướng dẫn thực hành.

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

Mục tiêu học tập của phòng thực hành này là gì?

  • Tạo các kho lưu trữ riêng biệt cho Vùng chứa và Gói ngôn ngữ
  • Tạo và sử dụng hình ảnh vùng chứa bằng Artifact Registry
  • Sử dụng Artifact Registry để phân tích trạng thái bảo mật và nội dung của các cấu phần phần mềm
  • Định cấu hình và sử dụng Artifact Registry cho các phần phụ thuộc Java Maven

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

  1. Đă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.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 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 luôn có thể cập nhật thông tin này.
  • Mã dự án là mã 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ó được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án.
  • Để bạn nắm được thông tin, 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.
  1. 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 đá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 nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá 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 gcloud

Trong Cloud Shell, hãy đặt mã dự án và số dự án. Lưu các giá trị này dưới dạng biến PROJECT_IDPROJECT_NUMBER.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

Bật các dịch vụ của Google

gcloud services enable \
  cloudresourcemanager.googleapis.com \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  containerregistry.googleapis.com \
  containerscanning.googleapis.com \
  binaryauthorization.googleapis.com \
  cloudbuild.googleapis.com

Lấy mã nguồn

Mã nguồn cho phòng thí nghiệm này nằm trong tổ chức GoogleCloudPlatform trên GitHub. Sao chép bằng lệnh bên dưới.

git clone https://github.com/GoogleCloudPlatform/java-docs-samples

3. Đẩy hình ảnh vùng chứa

Tạo kho lưu trữ Docker trên Artifact Registry

Như đã đề cập trước đó, Artifact Registry hỗ trợ nhiều định dạng kho lưu trữ cho phép bạn quản lý hình ảnh vùng chứa và gói ngôn ngữ. Các hoạt động tương tác với nhiều loại kho lưu trữ cấu phần phần mềm được xác định trong các quy cách và là các tiêu chuẩn được áp dụng rộng rãi. Ví dụ: các yêu cầu đối với phần phụ thuộc Maven khác với các yêu cầu đối với phần phụ thuộc Node.

Để hỗ trợ các quy cách API cấu phần phần mềm cụ thể, Artifact Registry cần quản lý các cấu phần phần mềm của bạn trong các loại kho lưu trữ tương ứng. Khi tạo một kho lưu trữ mới, bạn sẽ truyền cờ --repository-format để cho biết loại kho lưu trữ.

Để tạo kho lưu trữ đầu tiên cho các hình ảnh Docker, hãy chạy lệnh sau từ Cloud Shell:

gcloud artifacts repositories create container-example --repository-format=docker \
--location=us-central1 --description="Example Docker repository"

Nhấp vào Uỷ quyền nếu lời nhắc uỷ quyền Cloud Shell xuất hiện

Truy cập vào Google Cloud Console – Artifact Registry – Repositories (Kho lưu trữ) và xem kho lưu trữ Docker mới tạo có tên container-example. Nếu nhấp vào kho lưu trữ này, bạn có thể thấy rằng kho lưu trữ này hiện đang trống

5b854eb010e891c2.png

Định cấu hình quy trình xác thực Docker cho Artifact Registry

Khi kết nối với Artifact Registry, bạn phải cung cấp thông tin đăng nhập để cấp quyền truy cập. Thay vì thiết lập thông tin đăng nhập riêng biệt, bạn có thể định cấu hình Docker để sử dụng thông tin đăng nhập gcloud một cách liền mạch.

Từ Cloud Shell, hãy chạy lệnh sau để định cấu hình Docker sử dụng Google Cloud CLI nhằm xác thực các yêu cầu đối với Artifact Registry ở khu vực us-central1,

gcloud auth configure-docker us-central1-docker.pkg.dev

Nếu lệnh sẽ nhắc bạn xác nhận thay đổi cấu hình docker Cloud Shell, hãy nhấn phím Enter.

Khám phá Ứng dụng mẫu

Một ứng dụng mẫu được cung cấp trong kho lưu trữ git mà bạn đã sao chép ở bước trước. Chuyển sang thư mục java và xem lại mã xử lý ứng dụng.

cd java-docs-samples/run/helloworld/
ls

Thư mục này chứa một ứng dụng Java mẫu hiển thị một trang web đơn giản: ngoài nhiều tệp không liên quan đến phòng thí nghiệm cụ thể này, thư mục này còn chứa mã nguồn trong thư mục src và một Dockerfile mà chúng ta sẽ dùng để tạo một hình ảnh vùng chứa.

Tạo hình ảnh vùng chứa

Trước khi có thể lưu trữ hình ảnh vùng chứa trong Artifact Registry, bạn cần tạo một hình ảnh.

Chạy lệnh sau để tạo hình ảnh vùng chứa và gắn thẻ hình ảnh đó bằng đường dẫn đầy đủ đến sổ đăng ký cấu phần phần mềm:

docker build -t us-central1-docker.pkg.dev/$PROJECT_ID/container-example/java-hello-world:tag1 .

Đẩy Hình ảnh vùng chứa vào Artifact Registry

Chạy lệnh sau để chuyển hình ảnh vùng chứa đến kho lưu trữ đã tạo trước đó:

docker push us-central1-docker.pkg.dev/$PROJECT_ID/container-example/java-hello-world:tag1

Xem lại hình ảnh trong Artifact Registry

Truy cập vào Google Cloud Console – Artifact Registry – Repositories (Google Cloud Console – Artifact Registry – Kho lưu trữ). Mở kho lưu trữ container-example rồi xác minh rằng hình ảnh java-hello-world có trong đó.

88e4b26e8536afb2.png

Nhấp vào hình ảnh và lưu ý hình ảnh được gắn thẻ tag1. Vì chúng tôi đã bật tính năng tự động quét hình ảnh thông qua dịch vụ containerscanning.googleapis.com, nên bạn có thể thấy rằng tính năng Quét lỗ hổng bảo mật đang chạy hoặc đã hoàn tất. Sau khi quá trình này hoàn tất, bạn có thể xem số lượng lỗ hổng bảo mật được phát hiện cho bản sửa đổi hình ảnh này. Chúng ta sẽ tìm hiểu về các lỗ hổng và thông tin chi tiết khác về cấu phần phần mềm trong phần tiếp theo.

55406d03cf0c96b8.png

4. Kiểm tra hình ảnh vùng chứa

Bây giờ bạn đã đẩy hình ảnh đầu tiên vào kho lưu trữ container-example, chúng ta có thể xem xét hình ảnh đó chi tiết hơn. Trên thẻ phiên bản, hãy nhấp vào phiên bản mà chúng ta vừa tạo. Cách xem hình ảnh chi tiết hơn:

44c3f28dd457ed1d.png

Nút sao chép ở trên đặc biệt hữu ích vì nút này cung cấp một cách dễ dàng để truy cập vào URI hình ảnh đủ điều kiện cho phiên bản hình ảnh đó, bao gồm cả hàm băm SHA. Sau đó, bạn có thể dùng URI này để kéo một phiên bản hình ảnh cụ thể hoặc làm tài liệu tham khảo về hình ảnh trong một Kubernetes Deployment hoặc Cloud Run Service. Để kiểm thử URI hình ảnh, bạn có thể chạy lệnh sau trong Cloud Shell:

docker pull $IMAGE_URI

Tìm hiểu về các phần phụ thuộc

Khi chuyển đến thẻ "Dependencies" (Phần phụ thuộc) ở trên cùng, bạn có thể thấy tất cả các phần phụ thuộc đã được phát hiện trong hình ảnh của mình. Xin lưu ý rằng danh sách này liệt kê cả các phần phụ thuộc ở phần phụ thuộc ngôn ngữ và cấp hệ điều hành. Bạn cũng có thể xem giấy phép phần mềm được đính kèm với từng phần phụ thuộc.

af03348529575dbc.png

Nếu quan sát kỹ, bạn có thể thấy thông tin SBOM chưa được điền sẵn. Để điền SOM cho cấu phần phần mềm của bạn, bạn có thể chạy lệnh sau trong Cloud Shell bằng cách sử dụng URI hình ảnh đủ điều kiện mà chúng ta có thể sao chép từ thanh đường dẫn ở trên cùng.

gcloud artifacts sbom export --uri $IMAGE_URI

Sau khi bạn làm mới trang, trang này sẽ chứa một đường liên kết đến SBOM được tạo tự động và lưu trữ trong Cloud Storage. Nếu dựa vào SBOM cho hình ảnh, bạn có thể muốn tự động tạo SBOM cho các cấu phần phần mềm và đưa quá trình tạo vào quy trình CI/CD.

Khám phá các lỗ hổng bảo mật trong hình ảnh

Khi nhấp vào thẻ "Lỗ hổng bảo mật" ở đầu chế độ xem, bạn có thể thấy tất cả các lỗ hổng bảo mật được phát hiện trong hình ảnh của mình. Ngoài thông tin tóm tắt về các lỗ hổng bảo mật ở trên cùng, bạn có thể xem danh sách đầy đủ các lỗ hổng bảo mật trong bảng ở dưới cùng. Mỗi hàng liên kết đến bản tin CVE, cho biết mức độ nghiêm trọng và gói mà CVE bắt nguồn. Đối với những lỗ hổng có bản sửa lỗi, công cụ này cũng hướng dẫn cách cập nhật các phần phụ thuộc để khắc phục lỗ hổng.

fda03e6fd758ddef.png

5. Kho lưu trữ ảo và từ xa

Trong phần trước, chúng ta đã sử dụng một kho lưu trữ hình ảnh duy nhất để đẩy và kéo hình ảnh. Điều này rất phù hợp với các trường hợp sử dụng quy mô nhỏ nhưng lại gây ra nhiều thách thức, đặc biệt là đối với các tổ chức lớn hơn có nhiều nhóm cần có quyền tự chủ đối với kho lưu trữ của họ. Các nhóm hoặc đơn vị kinh doanh thường có kho lưu trữ hình ảnh riêng với các quyền và cấu hình riêng. Để đơn giản hoá việc sử dụng hình ảnh trong các kho lưu trữ này và để bảo vệ người dùng khỏi cơ cấu tổ chức cơ bản, Artifact Registry cung cấp các kho lưu trữ ảo có thể tổng hợp tài nguyên từ nhiều kho lưu trữ cơ bản. Một kiến trúc tiềm năng có thể như sau:

c6488dc5a6bfac3.png

Kho lưu trữ từ xa cho Docker Hub

Docker Hub là một sổ đăng ký hình ảnh công khai phổ biến và lưu trữ nhiều hình ảnh vùng chứa nguồn mở. Mặc dù việc sử dụng trực tiếp kho lưu trữ công khai rất đơn giản, nhưng việc này sẽ gặp phải một số thách thức trong môi trường sản xuất mà chúng ta có thể khắc phục bằng kho lưu trữ từ xa trong Artifact Registry.

Kho lưu trữ từ xa cho phép bạn uỷ quyền các yêu cầu cho sổ đăng ký thượng nguồn và lưu vào bộ nhớ đệm hình ảnh trong quá trình này. Điều này không chỉ giảm thời gian tải hình ảnh xuống mà còn loại bỏ sự phụ thuộc vào thời gian hoạt động của dịch vụ bên ngoài, đồng thời cho phép bạn áp dụng các chính sách bảo mật và truy cập tương tự như những chính sách mà bạn áp dụng cho hình ảnh của riêng mình.

Để tạo một kho lưu trữ từ xa cho Docker Hub, bạn có thể chạy lệnh sau trong Cloud Shell:

gcloud artifacts repositories create dockerhub \
  --repository-format=docker \
  --mode=remote-repository \
  --remote-docker-repo=docker-hub \
  --location=us-central1 \
  --description="Example Remote Repo for Docker Hub"

Giờ đây, bạn sẽ thấy một kho lưu trữ khác trong danh sách kho lưu trữ Artifact Registry:

7e174a9944c5f34c.png

Để kiểm tra xem kho lưu trữ từ xa có thể uỷ quyền các yêu cầu cho kho lưu trữ từ xa hay không, hãy chạy lệnh sau trong Cloud Shell để kéo hình ảnh nginx:

docker pull us-central1-docker.pkg.dev/$PROJECT_ID/dockerhub/nginx:stable-alpine

Sau khi kéo thành công, bạn cũng có thể xem kho lưu trữ trong Cloud Console và hình ảnh nginx được lưu vào bộ nhớ đệm hiện cung cấp cùng một báo cáo về phần phụ thuộc và lỗ hổng bảo mật mà chúng ta đã thấy cho hình ảnh mà bạn tự tạo.

Tạo kho lưu trữ ảo

Bằng cách làm theo các quy trình mà chúng ta đã sử dụng cho đến nay, bạn có thể tạo một số kho lưu trữ cho mỗi nhóm hoặc doanh nghiệp và xác định rõ quyền sở hữu cũng như quyền IAM cho từng kho lưu trữ. Chúng tôi cũng có thể tạo các proxy cho kho lưu trữ từ xa, giúp việc sử dụng hình ảnh của bên thứ ba trở nên dễ dàng và an toàn hơn. Nhược điểm của số lượng lớn kho lưu trữ này sẽ rõ ràng nếu bạn chuyển góc nhìn sang người tiêu dùng của những hình ảnh này. Làm cách nào để nhà phát triển biết nên sử dụng kho lưu trữ hình ảnh nào trong quá trình triển khai?

Để đơn giản hoá việc sử dụng và ẩn các kho lưu trữ cơ bản sau một lớp trừu tượng, bạn có thể tạo một kho lưu trữ ảo trong Artifact Registry bằng lệnh sau trong Cloud Shell:

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com \
    --role roles/artifactregistry.reader

cat <<EOF > /tmp/upstream.json
[{
"id" : "hello-repo",
"repository" : "projects/$PROJECT_ID/locations/us-central1/repositories/container-example",
"priority" : 100
},{
"id" : "dockerhub",
"repository" : "projects/$PROJECT_ID/locations/us-central1/repositories/dockerhub",
"priority" : 101
}]
EOF

gcloud artifacts repositories create all-images \
    --repository-format=docker \
    --mode=virtual-repository \
    --location=us-central1 \
    --upstream-policy-file=/tmp/upstream.json \
    --description="Example Virtual Repo"

Giờ đây, chúng ta có thể kéo các hình ảnh từ kho lưu trữ ảo mà không cần hiển thị cấu trúc cơ bản. Để xác minh mọi thứ hoạt động như mong đợi, bạn có thể chạy các lệnh sau trong Cloud Shell:

docker pull us-central1-docker.pkg.dev/$PROJECT_ID/all-images/java-hello-world:tag1

docker pull us-central1-docker.pkg.dev/$PROJECT_ID/all-images/nginx:stable-alpine

6. Triển khai lên Cloud Run

Khi đã có các kho lưu trữ và hình ảnh tương ứng, giờ đây, chúng ta có thể chuyển sang sử dụng chúng trong quá trình triển khai. Để minh hoạ một ví dụ về trường hợp sử dụng và tránh triển khai cơ sở hạ tầng bổ sung, chúng ta sẽ triển khai vùng chứa của mình lên Cloud Run. Nói một cách đơn giản, bạn có thể triển khai bằng cách chạy lệnh sau trong Cloud Shell:

gcloud run deploy hello-world \
  --image us-central1-docker.pkg.dev/$PROJECT_ID/all-images/java-hello-world:tag1 \
  --region us-central1 \
  --allow-unauthenticated

Sau khi quá trình triển khai hoàn tất, URL được tạo tự động sẽ xuất hiện. Bạn có thể truy cập vào dịch vụ của mình thông qua URL này.

Deploying container to Cloud Run service [hello-world] in project [my-project] region [us-central1]
OK Deploying... Done.                                                                      
  OK Creating Revision...                                                                  
  OK Routing traffic...
  OK Setting IAM Policy...                                                                    
Done.                                                                                      
Service [hello-world] revision [hello-world-00001-wtc] has been deployed and is serving 100 percent of traffic.
Service URL: https://hello-world-13746229022.us-central1.run.app

Nếu mở URL đó trong một thẻ trình duyệt mới, bạn sẽ thấy thông báo "Hello World" thành công.

852a8748c1543736.png

7. Tăng cường bảo mật chuỗi cung ứng

Giờ đây, khi hình ảnh vùng chứa của bạn đã được triển khai trực tiếp, có lẽ đây là thời điểm thích hợp để xem xét cách chúng ta có thể củng cố chuỗi cung ứng đầu cuối. Trong phần trước, chúng ta đã xem xét cách tính năng phân tích vùng chứa của Artifact Registry cung cấp thông tin chi tiết về các thư viện và giấy phép được dùng trong hình ảnh. Tuy nhiên, vẫn có khả năng những đối tượng xấu đưa nội dung gây hại vào hình ảnh của bạn trong chuỗi cung ứng. Trong phần này, chúng ta sẽ khám phá cách sử dụng khung SLSA để giới thiệu chứng thực cho các cấu phần phần mềm bản dựng và thậm chí tận dụng chữ ký mật mã của chính các cấu phần phần mềm để đảm bảo chỉ những cấu phần phần mềm đáng tin cậy mới có thể được triển khai vào thời gian chạy Cloud Run.

Chứng thực SLSA bằng Cloud Build

Khung SLSA cung cấp nhiều mức bằng chứng cho các cấu phần phần mềm trong chuỗi cung ứng. Thoạt nhìn, quy cách và việc triển khai có vẻ khó khăn, nhưng với Cloud Build, việc tạo chứng thực SLSA đơn giản như thêm quy cách cloudbuild.yaml với requestedVerifyOption được đặt thành VERIFIED.

Đối với ứng dụng của mình, chúng ta có thể chạy lệnh sau trong Cloud Shell để tạo một tệp cloudbuild.yaml trong thư mục helloworld.

cat <<EOF > cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', '\$_IMAGE_URI', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', '\$_IMAGE_URI']
images:
- '\$_IMAGE_URI'
options:
  requestedVerifyOption: VERIFIED
substitutions:
  _IMAGE_URI: us-central1-docker.pkg.dev/$PROJECT_ID/container-example/java-hello-world:latest
EOF

Bây giờ, chúng ta sẽ tạo một Cloud Build Job mới để tạo phiên bản mới của Hình ảnh Java Hello World bằng cách chạy lệnh sau trong Cloud Shell.

gcloud builds submit --substitutions=_IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/container-example/java-hello-world:cloud-build

Sau khi bản dựng hoàn tất, chúng ta có thể chuyển đến giao diện người dùng Cloud Build trong Google Cloud Console và xem Cấp độ SLSA mà chúng ta đạt được bằng cách mở bản dựng rồi xem Cấu phần phần mềm của bản dựng trong phần Tóm tắt bản dựng. Hình ảnh bạn thấy ở đó có một nút để xem "Thông tin chi tiết về bảo mật". Khi nhấp vào đó, bạn sẽ thấy chứng thực SLSA cũng như các báo cáo quen thuộc về lỗ hổng bảo mật mà chúng ta đã thấy trước đây trong giao diện người dùng Artifact Registry khi đẩy bản dựng cục bộ.

f6154004bfcddc16.png

Bạn cũng có thể truy xuất nguồn gốc SLSA cho hình ảnh của chúng tôi bằng cách chạy lệnh sau trong Cloud Shell:

gcloud artifacts docker images describe \
"us-central1-docker.pkg.dev/$PROJECT_ID/container-example/java-hello-world:cloud-build" \
 --show-provenance 

Yêu cầu Nguồn gốc Cloud Build bằng Binary Authorization

Với quy trình Cloud Build, bạn có muốn đảm bảo rằng tất cả hình ảnh mà chúng ta triển khai cho hoạt động sản xuất đều được tạo bằng môi trường tạo bản dựng có thể lập trình và tái tạo đó không?

Đây là lúc Binary Authorization phát huy tác dụng. Tính năng này cho phép bạn đặt một người kiểm soát trước thời gian chạy vùng chứa để kiểm tra hình ảnh vùng chứa và xác minh sự tồn tại của một chứng thực đáng tin cậy. Nếu không tìm thấy chứng thực, hệ thống sẽ tạo các mục nhật ký kiểm tra hoặc chặn hoàn toàn việc triển khai, tuỳ thuộc vào cấu hình.

Để thay đổi cấu hình Uỷ quyền nhị phân mặc định của dự án nhằm yêu cầu chứng thực tích hợp do Cloud Run phát hành, chúng ta sẽ chạy lệnh sau trong Cloud Shell:

cat << EOF > /tmp/policy.yaml
defaultAdmissionRule:
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
  evaluationMode: REQUIRE_ATTESTATION
  requireAttestationsBy:
  - projects/$PROJECT_ID/attestors/built-by-cloud-build
name: projects/$PROJECT_ID/policy
EOF

gcloud container binauthz policy import /tmp/policy.yaml

Tất nhiên, bạn cũng có thể thêm Attestor tuỳ chỉnh của riêng mình, nhưng điều đó nằm ngoài phạm vi của lớp học lập trình này và được coi là một bài tập về nhà ngoại khoá không bắt buộc.

Để thực thi uỷ quyền nhị phân trên Dịch vụ Cloud Run, chúng ta chạy lệnh sau trong Cloud Shell:

gcloud run services update hello-world \
  --region us-central1 \
  --binary-authorization=default

Hãy kiểm thử xem Uỷ quyền nhị phân có được áp dụng đúng cách hay không bằng cách triển khai lại hình ảnh được tạo cục bộ trước

gcloud run deploy hello-world \
  --image us-central1-docker.pkg.dev/$PROJECT_ID/all-images/java-hello-world:tag1 \
  --region us-central1

Như dự kiến, bạn sẽ nhận được một thông báo lỗi giải thích lý do không triển khai được hình ảnh. Thông báo này sẽ có dạng như sau:

Image us-central1-docker.pkg.dev/my-project/all-images/java-hello-world@sha256:71eebbf04bf7d1d023e5de5e18f786ea3b8b6411bf64c8def3301c71baca0518 denied by attestor projects/my-project/attestors/built-by-cloud-build: No attestations found that were valid and signed by a key trusted by the attestor

Do đó, để triển khai một phiên bản mới cho dịch vụ Cloud Run, chúng ta cần cung cấp một hình ảnh được tạo bằng Cloud Build.

gcloud run deploy hello-world \
  --image us-central1-docker.pkg.dev/$PROJECT_ID/all-images/java-hello-world:cloud-build \
  --region us-central1

Lần này, quá trình triển khai sẽ thành công và cho thấy thông báo triển khai thành công tương tự như thông báo dưới đây:

Deploying container to Cloud Run service [hello-world] in project [my-project] region [us-central1]
OK Deploying... Done.                                                                      
  OK Creating Revision...                                                                  
  OK Routing traffic...                                                                    
Done.                                                                                      
Service [hello-world] revision [hello-world-00005-mq4] has been deployed and is serving 100 percent of traffic.
Service URL: https://hello-world-13746229022.us-central1.run.app

8. Quản lý các gói ngôn ngữ Java Maven

Trong phần này, bạn sẽ thấy cách thiết lập một kho lưu trữ Java Artifact Registry và tải các gói lên kho lưu trữ đó, tận dụng các gói này trong nhiều ứng dụng.

Tạo kho lưu trữ gói Maven

Từ Cloud Shell, hãy chạy lệnh sau để tạo một kho lưu trữ cho các cấu phần phần mềm Java:

gcloud artifacts repositories create java-repo \
    --repository-format=maven \
    --location=us-central1 \
    --description="Example Java Maven Repo"

Nhấp vào Uỷ quyền nếu lời nhắc uỷ quyền Cloud Shell xuất hiện

Truy cập vào Google Cloud Console – Artifact Registry – Repositories (Kho lưu trữ cấu phần phần mềm – Kho lưu trữ) và lưu ý đến kho lưu trữ Maven mới tạo có tên là java-repo. Nếu nhấp vào kho lưu trữ này, bạn có thể thấy rằng kho lưu trữ này hiện đang trống.

Thiết lập chế độ xác thực cho Kho lưu trữ Artifact

Sử dụng lệnh sau để cập nhật vị trí đã biết cho Thông tin xác thực mặc định của ứng dụng (ADC) bằng thông tin đăng nhập tài khoản người dùng của bạn để trình trợ giúp thông tin đăng nhập Artifact Registry có thể xác thực bằng thông tin đăng nhập đó khi kết nối với các kho lưu trữ:

gcloud auth login --update-adc

Định cấu hình Maven cho Artifact Registry

Chạy lệnh sau để in cấu hình kho lưu trữ cần thêm vào dự án Java của bạn:

gcloud artifacts print-settings mvn \
    --repository=java-repo \
    --location=us-central1 | tee config.xml

Mở pom.xml trong Cloud Shell Editor bằng cách chạy lệnh sau trong Cloud Shell từ thư mục helloworld:

cloudshell edit pom.xml

và thêm các chế độ cài đặt được trả về vào các phần thích hợp trong tệp,

Cập nhật phần distributionManagement

<distributionManagement>
   <snapshotRepository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/java-repo</url>
   </snapshotRepository>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/java-repo</url>
   </repository>
</distributionManagement>

Cập nhật phần kho lưu trữ

 <repositories>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/java-repo</url>
     <releases>
       <enabled>true</enabled>
     </releases>
     <snapshots>
       <enabled>true</enabled>
     </snapshots>
   </repository>
 </repositories>

Cập nhật mục extensions (tiện ích) trong phần build (bản dựng)

   <extensions>
     <extension>
       <groupId>com.google.cloud.artifactregistry</groupId>
       <artifactId>artifactregistry-maven-wagon</artifactId>
       <version>2.1.0</version>
     </extension>
   </extensions>

Sau đây là ví dụ về tệp hoàn chỉnh để bạn tham khảo. Nhớ thay thế <PROJECT> bằng mã dự án của bạn.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.example.run</groupId>
 <artifactId>helloworld</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <parent>
   <groupId>com.google.cloud.samples</groupId>
   <artifactId>shared-configuration</artifactId>
   <version>1.2.0</version>
 </parent>
 <dependencyManagement>
   <dependencies>
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-dependencies</artifactId>
       <version>${spring-boot.version}</version>
       <type>pom</type>
       <scope>import</scope>
     </dependency>
   </dependencies>
 </dependencyManagement>
 <properties>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
   <maven.compiler.target>17</maven.compiler.target>
   <maven.compiler.source>17</maven.compiler.source>
   <spring-boot.version>3.2.2</spring-boot.version>
 </properties>
 <dependencies>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
   </dependency>
   <dependency>
     <groupId>org.junit.vintage</groupId>
     <artifactId>junit-vintage-engine</artifactId>
     <scope>test</scope>
   </dependency>
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <scope>test</scope>
   </dependency>
 </dependencies>
 <!-- [START Artifact Registry Config] -->
 <distributionManagement>
   <snapshotRepository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/java-repo</url>
   </snapshotRepository>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/java-repo</url>
   </repository>
 </distributionManagement>

 <repositories>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/java-repo</url>
     <releases>
       <enabled>true</enabled>
     </releases>
     <snapshots>
       <enabled>true</enabled>
     </snapshots>
   </repository>
 </repositories>
  <build>
   <extensions>
     <extension>
       <groupId>com.google.cloud.artifactregistry</groupId>
       <artifactId>artifactregistry-maven-wagon</artifactId>
       <version>2.2.0</version>
     </extension>
   </extensions>
 <!-- [END Artifact Registry Config] -->

   <plugins>
     <plugin>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-maven-plugin</artifactId>
       <version>${spring-boot.version}</version>
       <executions>
         <execution>
           <goals>
             <goal>repackage</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
     <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>jib-maven-plugin</artifactId>
       <version>3.4.0</version>
       <configuration>
         <to>
           <image>gcr.io/PROJECT_ID/helloworld</image>
         </to>
       </configuration>
     </plugin>
   </plugins>
 </build>
 </project>

Tải gói Java lên Artifact Registry

Khi Artifact Registry được định cấu hình trong Maven, bạn có thể dùng Artifact Registry để lưu trữ các tệp Jar Java cho các dự án khác trong tổ chức của mình.

Chạy lệnh sau để tải gói Java lên Artifact Registry:

mvn deploy

Kiểm tra gói Java trong Artifact Registry

Chuyển đến bảng điều khiển Cloud – Artifact Registry – Kho lưu trữ Nhấp vào java-repo rồi kiểm tra để đảm bảo rằng cấu phần phần mềm nhị phân helloworld có ở đó:

a95d370ee0fd9af0.png

9. 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!

Nội dung bạn đã đề cập

  • Tạo kho lưu trữ cho vùng chứa và gói ngôn ngữ
  • Quản lý hình ảnh vùng chứa bằng Artifact Registry
  • Tích hợp Artifact Registry với Cloud Code
  • Đã định cấu hình Maven để sử dụng Artifact Registry cho các phần phụ thuộc Java

Dọn dẹp

Chạy lệnh sau trong Cloud Shell để xoá toàn bộ dự án

gcloud projects delete $PROJECT_ID