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

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

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 12 4, 2024
account_circleTác giả: Giovanni Galloro, Daniel Strebel

1. Tổng quan

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

Cấu phần đăng ký cấu phần phần mềm được tích hợp đầy đủ với nhiều dịch vụ khác của Google Cloud, như trong các ví dụ sau:

  • Cloud Build có thể trực tiếp tải các cấu phần phần mềm hình ảnh lên Cấu phần phần mềm.
  • Cloud Deploy có thể triển khai Hình ảnh kho lưu trữ cấu phần phần mềm trực tiếp đến nhiều môi trường thời gian chạy.
  • Công cụ này cung cấp hình ảnh cho các môi trường thời gian chạy vùng chứa như Cloud Run và GKE, đồng thời hỗ trợ các tính 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 để tính năng Phân tích cấu phần phần mềm liên tục theo dõi các lỗ hổng đã biết.
  • Cloud IAM cung cấp quyền 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.

Trong lớp học này, bạn sẽ được hướng dẫn thực hành nhiều tính năng trong số này.

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

Mục tiêu học tập của lớp học này là gì?

  • Tạo các kho lưu trữ khác nhau 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 Cấu phần lưu trữ
  • Sử dụng Cấu phần đăng ký cấu phần phần mềm để phân tích trạng thái bảo mật và nội dung của cấu phần phần mềm
  • Định cấu hình và sử dụng Cấu phần phần mềm cho phần phụ thuộc Maven Java

2. Cách thiết lập và các 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ị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là duy nhất trên tất cả các dự án Google Cloud và không thể thay đổi (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ã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng email của riêng mình để xem có thể sử dụng 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ẽ được giữ nguyên trong suốt thời gian diễn ra dự án.
  • Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba 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 Cloud. Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí sau khi hoàn tất 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í 300 USD.

Thiết lập gcloud

Trong Cloud Shell, hãy đặt mã dự án và số dự án. Lưu các biến 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 Dịch vụ 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 lớp học lập trình này nằm trong tổ chức GoogleCloudPlatform trên GitHub. Hãy sao chép dự án 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 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 về phần phụ thuộc Maven khác với các yêu cầu về phần phụ thuộc Node.

Để hỗ trợ một quy cách API cấu phần phần mềm cụ thể, Cấu phần phần mềm đăng ký 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 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 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

Chuyển đến Google Cloud Console – Cấu phần phần mềm – Kho lưu trữ và lưu ý kho lưu trữ Docker mới tạo có tên là container-example. Nếu nhấp vào kho lưu trữ này, bạn có thể thấy kho lưu trữ này hiện đang trống

5b854eb010e891c2.png

Định cấu hình tính năng Xác thực Docker cho Artifact Registry

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

Trên Cloud Shell, hãy chạy lệnh sau để định cấu hình Docker nhằm sử dụng Google Cloud CLI để xác thực các yêu cầu đối với CSDL cấu phần phần mềm trong khu vực us-central1,

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

Nếu lệnh này nhắc bạn xác nhận thay đổi cấu hình docker của Cloud Shell, hãy nhấn 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 đã nhân bản ở bước trước. Chuyển sang thư mục java và xem lại mã ứ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 lớp học 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ẽ sử dụng để tạo 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 Kho lưu trữ cấu phần phần mềm, bạn cần tạo một hình ảnh vùng chứa.

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 đăng ký cấu phần phần mềm đầy đủ:

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 Cấu phần phần mềm lưu trữ

Chạy lệnh sau để đẩy hình ảnh vùng chứa vào 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 Cấu phần phần mềm

Truy cập vào Google Cloud Console – Cấu phần phần mềm – Kho lưu trữ. Mở kho lưu trữ container-example và 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 ta đã 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 đang chạy hoặc đã hoàn tất. Sau khi quá trình này hoàn tất, bạn có thể thấy số lượng lỗ hổng được phát hiện cho bản sửa đổi hình ảnh này. Chúng ta sẽ tìm hiểu 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

Giờ đây, khi bạn đã đẩy hình ảnh đầu tiên vào kho lưu trữ container-example, chúng ta có thể xem hình ảnh đó một cách 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 hiển thị hình ảnh chi tiết hơn:

44c3f28dd457ed1d.png

Nút sao chép ở trên đặc biệt hữu ích vì 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ể sử dụng URI này để lấy một phiên bản hình ảnh cụ thể hoặc làm tham chiếu hình ảnh trong một lượt triển khai Kubernetes hoặc Dịch vụ chạy trên đám mây. Để 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ề phần phụ thuộc

Chuyển đến thẻ "Phần phụ thuộc" ở trên cùng, bạn có thể thấy tất cả phần phụ thuộc được phát hiện trong hình ảnh. Lưu ý rằng tệp này liệt kê cả các phần phụ thuộc ở cấp phần phụ thuộc ngôn ngữ và cấp hệ điều hành. Bạn cũng có thể xem các 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 xem kỹ, bạn có thể thấy thông tin SBOM chưa được điền. Để điền SOM cho cấu phần phần mềm, bạn có thể chạy lệnh sau trong Cloud Shell bằ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 đường liên kết đến SBOM được tạo tự động và được lưu trữ trong Cloud Storage. Nếu dựa vào SBOM cho hình ảnh, bạn nên tự động tạo SBOM cho cấu phần phần mềm và đưa quy trình tạo vào quy trình CI/CD.

Khám phá lỗ hổng hình ảnh

Khi nhấp vào thẻ "Vulnerabilities" (Lỗ hổng bảo mật) ở đầu chế độ xem, bạn có thể thấy tất cả lỗ hổng bảo mật được phát hiện trong hình ảnh của mình. Ngoài phần tóm tắt về các lỗ hổng ở trên cùng, bạn có thể xem danh sách đầy đủ các lỗ hổng trong bảng ở cuối trang. 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 phát sinh lỗi. Đối với các lỗ hổng có bản sửa lỗi, công cụ này cũng đưa ra hướng dẫn về 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 hình ảnh duy nhất để đẩy và kéo hình ảnh. Cách 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 thách thức, đặc biệt là đối với các tổ chức lớn có nhiều nhóm cần quyền tự chủ đối với kho lưu trữ của họ. Thông thường, các nhóm hoặc đơn vị kinh doanh sẽ có kho 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ấu trúc tổ chức cơ bản, Kho lưu trữ cấu phần phần mềm 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. Cấu 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 kho đă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 bạn có thể gặp một số thách thức trong môi trường phát hành công khai mà chúng ta có thể khắc phục bằng Kho lưu trữ từ xa trong CSDL cấu phần phần mềm.

Kho lưu trữ từ xa cho phép bạn proxy các yêu cầu đến sổ đăng ký ngược dòng và lưu hình ảnh vào bộ nhớ đệm trong quá trình này. Điều này không chỉ giúp 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 chính sách bảo mật và quyền truy cập giống như áp dụng cho hình ảnh của riêng mình.

Để tạo 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ữ bổ sung trong danh sách kho lưu trữ Artifact Registry:

7e174a9944c5f34c.png

Để kiểm tra xem kho lưu trữ từ xa của bạn có thể proxy các yêu cầu đến kho lưu trữ từ xa hay không, hãy chạy lệnh sau trong Cloud Shell để lấy hình ảnh nginx:

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

Sau khi quá trình lấy dữ liệu 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 báo cáo về phần phụ thuộc và lỗ hổng giống như báo cáo mà chúng ta đã thấy đối với 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 ta cũng có thể tạo proxy cho các kho lưu trữ từ xa để sử dụng hình ảnh của bên thứ ba dễ dàng và an toàn hơn. Nhược điểm của việc có nhiều kho lưu trữ như vậy sẽ rõ ràng nếu bạn chuyển đổi quan điểm sang người dùng của những hình ảnh này. Nhà phát triển nên biết kho lưu trữ hình ảnh nào họ nên sử dụng trong quá trình triển khai như thế nào?

Để đơn giản hoá việc sử dụng và ẩn các kho lưu trữ cơ bản đằng sau một lớp trừu tượng, bạn có thể tạo một kho lưu trữ ảo trong CSDL Cấu phần phần mềm 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ể lấy 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

Giờ đây, khi đã có kho lưu trữ và hình ảnh tương ứng, chúng ta có thể chuyển sang sử dụng các kho lưu trữ và hình ảnh đó 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 thêm cơ sở hạ tầng, 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 triển khai xong, bạn sẽ thấy URL được tạo tự động để truy cập vào dịch vụ của mình.

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" (Xin chào thế giới) 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, đã đến lúc xem xét cách chúng ta có thể củng cố chuỗi cung ứng toàn diện. Trong phần trước, chúng ta đã xem xét cách phân tích vùng chứa của Cấu phần phần mềm cung cấp thông tin chi tiết về các thư viện và giấy phép được sử dụng trong hình ảnh. Tuy nhiên, các bên độc hại vẫn có thể đưa nội dung có 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 tính năng 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ã hoá của chính các cấu phần phần mềm đó để đảm bảo chỉ có thể triển khai các cấu phần phần mềm đáng tin cậy cho môi trường thời gian chạy Cloud Run.

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

Khung SLSA cung cấp nhiều cấp độ 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à cách triển khai có vẻ khó khăn, nhưng với Cloud Build, việc tạo chứng thực SLSA cũng đơn giản như việc thêm quy cách tạo 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 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 Công việc tạo bản dựng trên đám mây mới để tạo phiên bản mới của Hình ảnh Hello World bằng Java 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, sau đó 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 xuất hiện ở đó 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 lỗ hổng quen thuộc mà chúng ta đã thấy trước đó trong giao diện người dùng CSDL cấu phần phần mềm 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 ta 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 bản dựng trên đám mây bằng tính năng Uỷ quyền tệp nhị phân

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

Đây là lúc bạn cần đến tính năng Uỷ quyền tệp nhị phân. Tính năng này cho phép bạn đặt một trình kiểm soát truy cập vào trước môi trường 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 chứng thực đáng tin cậy. Nếu không tìm thấy thông tin chứng thực, thì hệ thống sẽ tạo các mục nhập nhật ký kiểm tra hoặc chặn hoàn toàn quá trình triển khai, tuỳ thuộc vào cấu hình.

Để thay đổi cấu hình Uỷ quyền tệp nhị phân mặc định của dự án thành 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

Rõ ràng là tại đây, bạn cũng có thể thêm các Trình chứng thực 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à bài tập về nhà không bắt buộc ngoài giờ học.

Để thực thi việc uỷ quyền tệp 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 tra xem tính năng Uỷ quyền tệp nhị phân của chúng ta có được áp dụng chính xác 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 thông báo lỗi giải thích lý do không thể triển khai hình ảnh, 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 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à hiển thị 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ẽ tìm hiểu cách thiết lập kho lưu trữ Java của Cấu phần phần mềm và tải các gói lên kho lưu trữ đó, tận dụng các gói đó trong nhiều ứng dụng.

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

Trên Cloud Shell, hãy chạy lệnh sau để tạo kho lưu trữ cho 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

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

Thiết lập tính năng xác thực vào Kho lưu trữ cấu phần phần mềm

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 xác thực tài khoản người dùng của bạn để trình trợ giúp thông tin xác thực Cấu phần phần mềm có thể xác thực bằng thông tin xác thực đó khi kết nối với 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ữ nhằm thêm vào dự án Java:

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

Mở pom.xml trong Trình chỉnh sửa Cloud Shell bằng cách chạy lệnh sau trong Cloud Shell từ trong 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 phần extensions (tiện ích) trong 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. Hãy 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 Cấu phần phần mềm lưu trữ

Khi đã định cấu hình Cấu phần phần mềm trong Maven, giờ đây, bạn có thể sử dụng Cấu phần phần mềm để 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 Cấu phần phần mềm:

mvn deploy

Kiểm tra gói Java trong Cấu phần phần mềm lưu trữ

Chuyển đến Cloud Console – Artifact Registry – Repositories (Cloud Console – Cấu phần phần mềm – Kho lưu trữ) Nhấp vào java-repo và kiểm tra để đảm bảo cấu phần phần mềm nhị phân helloworld có trong đó:

a95d370ee0fd9af0.png

9. Xin chúc mừng!

Xin chúc mừng, bạn đã hoàn thành lớp học lập trình!

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

  • Tạo kho lưu trữ cho vùng chứa và gói ngôn ngữ
  • Hình ảnh vùng chứa được quản lý bằng Artifact Registry
  • Tích hợp Artifact Registry với Cloud Code
  • Định cấu hình Maven để sử dụng Cấu phần phần mềm cho 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