1. ওভারভিউ
আর্টিফ্যাক্ট রেজিস্ট্রি হল সম্পূর্ণরূপে পরিচালিত প্যাকেজ ম্যানেজার এবং আপনার OCI কন্টেইনার ইমেজ এবং ভাষা প্যাকেজগুলি (যেমন Maven এবং npm) পরিচালনা করার জন্য একটি ইউনিফাইড টুল প্রদান করে।
আর্টিফ্যাক্ট রেজিস্ট্রি সম্পূর্ণরূপে Google ক্লাউডের অন্যান্য Google ক্লাউড পরিষেবাগুলির সাথে সম্পূর্ণরূপে একত্রিত হয়েছে যেমন নিম্নলিখিত উদাহরণগুলিতে:
- ক্লাউড বিল্ড সরাসরি আর্টিফ্যাক্ট রেজিস্ট্রিতে ইমেজ আর্টিফ্যাক্ট আপলোড করতে পারে।
- ক্লাউড ডিপ্লোয় আর্টিফ্যাক্ট রেজিস্ট্রি চিত্রগুলি সরাসরি বিভিন্ন রানটাইম পরিবেশে স্থাপন করতে পারে।
- এটি ক্লাউড রান এবং GKE-এর মতো কনটেইনার রানটাইমগুলিতে ছবি সরবরাহ করে এবং ইমেজ স্ট্রিমিংয়ের মতো উন্নত কর্মক্ষমতা অপ্টিমাইজেশান সক্ষম করে।
- আর্টিফ্যাক্ট রেজিস্ট্রি আর্টিফ্যাক্ট বিশ্লেষণের জন্য একটি সনাক্তকরণ পয়েন্ট হিসাবে কাজ করতে পারে যাতে পরিচিত দুর্বলতার জন্য ক্রমাগত নিরীক্ষণ করা যায়।
- ক্লাউড আইএএম আর্টিফ্যাক্ট অ্যাক্সেস এবং অনুমতিগুলির উপর ধারাবাহিক এবং দানাদার নিয়ন্ত্রণ প্রদান করে।
এই ল্যাবটি আপনাকে হ্যান্ডস-অন টিউটোরিয়াল আকারে এই বৈশিষ্ট্যগুলির অনেকগুলি মাধ্যমে নিয়ে যাবে।
যা শিখবেন
এই ল্যাবের শেখার উদ্দেশ্য কি?
- ধারক এবং ভাষা প্যাকেজের জন্য বিভিন্ন সংগ্রহস্থল তৈরি করুন
- আর্টিফ্যাক্ট রেজিস্ট্রি দিয়ে কন্টেইনার ইমেজ তৈরি করুন এবং ব্যবহার করুন
- আপনার শিল্পকর্মের নিরাপত্তা ভঙ্গি এবং বিষয়বস্তু বিশ্লেষণ করতে আর্টিফ্যাক্ট রেজিস্ট্রি ব্যবহার করুন
- জাভা মাভেন নির্ভরতার জন্য আর্টিফ্যাক্ট রেজিস্ট্রি কনফিগার করুন এবং ব্যবহার করুন
2. সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিসম্পন্ন পরিবেশ সেটআপ
- Google ক্লাউড কনসোলে সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন বা বিদ্যমান একটি পুনরায় ব্যবহার করুন৷ আপনার যদি ইতিমধ্যেই একটি Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে।
- প্রকল্পের নাম এই প্রকল্পের অংশগ্রহণকারীদের জন্য প্রদর্শনের নাম। এটি একটি অক্ষর স্ট্রিং যা Google API দ্বারা ব্যবহৃত হয় না। আপনি সবসময় এটি আপডেট করতে পারেন.
- প্রোজেক্ট আইডি সমস্ত Google ক্লাউড প্রোজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (সেট করার পরে পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত আপনি এটা কি যত্ন না. বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রকল্প আইডি উল্লেখ করতে হবে (সাধারণত
PROJECT_ID
হিসাবে চিহ্নিত)। আপনি যদি জেনারেট করা আইডি পছন্দ না করেন, তাহলে আপনি অন্য একটি এলোমেলো আইডি তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের চেষ্টা করতে পারেন, এবং এটি উপলব্ধ কিনা দেখতে পারেন। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রকল্পের সময়কালের জন্য থাকে। - আপনার তথ্যের জন্য, একটি তৃতীয় মান আছে, একটি প্রকল্প নম্বর , যা কিছু API ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি মান সম্পর্কে আরও জানুন।
- এরপরে, ক্লাউড রিসোর্স/এপিআই ব্যবহার করতে আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে। এই কোডল্যাবের মাধ্যমে চালানোর জন্য খুব বেশি খরচ হবে না, যদি কিছু হয়। এই টিউটোরিয়ালের বাইরে বিলিং এড়াতে সংস্থানগুলি বন্ধ করতে, আপনি আপনার তৈরি করা সংস্থানগুলি মুছতে বা প্রকল্প মুছতে পারেন। নতুন Google ক্লাউড ব্যবহারকারীরা $300 USD বিনামূল্যের ট্রায়াল প্রোগ্রামের জন্য যোগ্য৷
gCloud সেট আপ করুন
ক্লাউড শেলে, আপনার প্রকল্প আইডি এবং প্রকল্প নম্বর সেট করুন। সেগুলিকে PROJECT_ID
এবং PROJECT_NUMBER
ভেরিয়েবল হিসাবে সংরক্ষণ করুন৷
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
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
সোর্স কোড পান
এই ল্যাবের সোর্স কোডটি GitHub-এ GoogleCloudPlatform প্রতিষ্ঠানে অবস্থিত। নিচের কমান্ড দিয়ে ক্লোন করুন।
git clone https://github.com/GoogleCloudPlatform/java-docs-samples
3. কন্টেইনার ইমেজ ঠেলাঠেলি
আর্টিফ্যাক্ট রেজিস্ট্রিতে একটি ডকার সংগ্রহস্থল তৈরি করুন
আর্টিফ্যাক্ট রেজিস্ট্রি আগে উল্লিখিত বিভিন্ন রিপোজিটরি ফর্ম্যাট সমর্থন করে যা আপনাকে ধারক চিত্র এবং ভাষা প্যাকেজ পরিচালনা করতে দেয়। বিভিন্ন ধরণের আর্টিফ্যাক্ট ভান্ডারের সাথে মিথস্ক্রিয়াগুলি নির্দিষ্টকরণে সংজ্ঞায়িত করা হয় এবং ব্যাপকভাবে গৃহীত মান। উদাহরণস্বরূপ ম্যাভেন নির্ভরতার জন্য অনুরোধ নোড নির্ভরতার জন্য অনুরোধ থেকে ভিন্ন।
একটি নির্দিষ্ট আর্টিফ্যাক্ট এপিআই স্পেসিফিকেশন সমর্থন করার জন্য, আর্টিফ্যাক্ট রেজিস্ট্রি আপনার আর্টিফ্যাক্টগুলিকে সংশ্লিষ্ট রিপোজিটরি প্রকারে পরিচালনা করতে হবে। আপনি যখন একটি নতুন সংগ্রহস্থল তৈরি করেন তখন আপনি সংগ্রহস্থলের ধরন নির্দেশ করতে --repository-format
পতাকায় পাস করেন।
ডকার চিত্রগুলির জন্য একটি প্রথম সংগ্রহস্থল তৈরি করতে ক্লাউড শেল থেকে নিম্নলিখিত কমান্ডটি চালান:
gcloud artifacts repositories create container-example --repository-format=docker \
--location=us-central1 --description="Example Docker repository"
ক্লাউড শেল অনুমোদন প্রম্পট প্রদর্শিত হলে অনুমোদন ক্লিক করুন
Google ক্লাউড কনসোলে যান - আর্টিফ্যাক্ট রেজিস্ট্রি - রিপোজিটরি এবং আপনার সদ্য তৈরি ডকার রিপোজিটরি নামক container-example
লক্ষ্য করুন, আপনি যদি এটিতে ক্লিক করেন তবে আপনি দেখতে পাবেন যে এটি এই মুহূর্তে খালি
আর্টিফ্যাক্ট রেজিস্ট্রিতে ডকার প্রমাণীকরণ কনফিগার করুন
আর্টিফ্যাক্ট রেজিস্ট্রি শংসাপত্র সংযোগ করার সময় অ্যাক্সেস প্রদান করার জন্য প্রয়োজন হয়. পৃথক শংসাপত্র সেট আপ করার পরিবর্তে, ডকারকে আপনার জিক্লাউড শংসাপত্রগুলি নির্বিঘ্নে ব্যবহার করার জন্য কনফিগার করা যেতে পারে।
ক্লাউড শেল থেকে us-central1
অঞ্চলে আর্টিফ্যাক্ট রেজিস্ট্রির অনুরোধগুলি প্রমাণীকরণের জন্য Google ক্লাউড CLI ব্যবহার করতে ডকারকে কনফিগার করতে নিম্নলিখিত কমান্ডটি চালান,
gcloud auth configure-docker us-central1-docker.pkg.dev
যদি কমান্ডটি ক্লাউড শেল ডকার কনফিগারেশন পরিবর্তন করার জন্য নিশ্চিতকরণের জন্য অনুরোধ করে, এন্টার টিপুন।
নমুনা অ্যাপ্লিকেশন অন্বেষণ
আপনি আগের ধাপে ক্লোন করা গিট রিপোজিটরিতে একটি নমুনা অ্যাপ্লিকেশন সরবরাহ করা হয়েছে। জাভা ডিরেক্টরিতে পরিবর্তন করুন এবং অ্যাপ্লিকেশন কোড পর্যালোচনা করুন।
cd java-docs-samples/run/helloworld/
ls
ফোল্ডারটিতে একটি উদাহরণ জাভা অ্যাপ্লিকেশন রয়েছে যা একটি সাধারণ ওয়েব পৃষ্ঠা রেন্ডার করে: এই নির্দিষ্ট ল্যাবের জন্য প্রাসঙ্গিক নয় এমন বিভিন্ন ফাইল ছাড়াও, এতে সোর্স কোড রয়েছে, src
ফোল্ডারের নীচে, এবং একটি ডকারফাইল যা আমরা একটি ধারক চিত্র তৈরি করতে ব্যবহার করব।
কন্টেইনার ইমেজ তৈরি করুন
আর্টিফ্যাক্ট রেজিস্ট্রিতে কন্টেইনার ইমেজ সংরক্ষণ করার আগে আপনাকে একটি তৈরি করতে হবে।
কন্টেইনার ইমেজ তৈরি করতে নিম্নলিখিত কমান্ডটি চালান এবং সম্পূর্ণ আর্টিফ্যাক্ট রেজিস্ট্রি পাথ দিয়ে ট্যাগ করুন:
docker build -t us-central1-docker.pkg.dev/$PROJECT_ID/container-example/java-hello-world:tag1 .
কন্টেইনার ইমেজটিকে আর্টিফ্যাক্ট রেজিস্ট্রিতে পুশ করুন
পূর্বে তৈরি করা সংগ্রহস্থলে ধারক চিত্রটি পুশ করতে নিম্নলিখিত কমান্ডটি চালান:
docker push us-central1-docker.pkg.dev/$PROJECT_ID/container-example/java-hello-world:tag1
আর্টিফ্যাক্ট রেজিস্ট্রিতে চিত্রটি পর্যালোচনা করুন
Google ক্লাউড কনসোলে যান - আর্টিফ্যাক্ট রেজিস্ট্রি - সংগ্রহস্থল .
container-example
সংগ্রহস্থল খুলুন এবং java-hello-world
ইমেজ আছে কিনা তা যাচাই করুন।
ছবিতে ক্লিক করুন এবং tag1
ট্যাগ করা ছবিটি নোট করুন। যেহেতু আমরা containerscanning.googleapis.com
পরিষেবার মাধ্যমে চিত্রগুলির স্বয়ংক্রিয় স্ক্যানিং সক্ষম করেছি, আপনি দেখতে পাচ্ছেন যে দুর্বলতা স্ক্যানিং হয় চলছে বা ইতিমধ্যে সম্পন্ন হয়েছে৷ এটি সম্পূর্ণ হয়ে গেলে আপনি এই চিত্র সংশোধনের জন্য সনাক্ত করা দুর্বলতার সংখ্যা দেখতে পাবেন। আমরা পরবর্তী বিভাগে দুর্বলতা এবং অন্যান্য আর্টিফ্যাক্ট অন্তর্দৃষ্টি অন্বেষণ করব।
4. কনটেইনার ইমেজ পরিদর্শন
এখন আপনি আপনার প্রথম চিত্রটিকে container-example
সংগ্রহস্থলে ঠেলে দিয়েছেন, আমরা এটিকে আরও বিশদে দেখতে পারি। সংস্করণ ট্যাবে আমরা যে সংস্করণটি তৈরি করেছি সেটিতে ক্লিক করুন। আরো বিস্তারিতভাবে ইমেজ দেখাতে:
উপরের কপি বোতামটি বিশেষভাবে কার্যকর কারণ এটি SHA-হ্যাশ সহ সেই চিত্র সংস্করণে সম্পূর্ণরূপে যোগ্য চিত্র URI অ্যাক্সেস করার একটি সহজ উপায় প্রদান করে। এই URI তারপর একটি নির্দিষ্ট ইমেজ সংস্করণ টানতে বা কুবারনেটস ডিপ্লয়মেন্ট বা ক্লাউড রান সার্ভিসে একটি ইমেজ রেফারেন্স হিসাবে ব্যবহার করা যেতে পারে। ইমেজ ইউআরআই পরীক্ষা করতে আপনি ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালাতে পারেন:
docker pull $IMAGE_URI
নির্ভরতা বোঝা
উপরের "নির্ভরতা" ট্যাবে চলে গেলে আপনি আপনার ছবিতে সনাক্ত করা সমস্ত নির্ভরতা দেখতে পাবেন৷ মনে রাখবেন যে এটি ভাষা নির্ভরতা এবং OS স্তরে উভয় নির্ভরতা তালিকাভুক্ত করে। আপনি প্রতিটি নির্ভরতার সাথে সংযুক্ত সফ্টওয়্যার লাইসেন্সগুলিও দেখতে পারেন।
আপনি যদি ঘনিষ্ঠভাবে তাকান তবে আপনি দেখতে পাবেন যে SBOM তথ্য এখনও জনবহুল নয়। আপনার আর্টিফ্যাক্টের জন্য SOM পপুলেট করতে আপনি ক্লাউড শেল-এ সম্পূর্ণ যোগ্য ইমেজ URI ব্যবহার করে নিম্নলিখিত কমান্ডটি চালাতে পারেন যা আমরা উপরের ব্রেডক্রাম্ব বার থেকে কপি করতে পারি।
gcloud artifacts sbom export --uri $IMAGE_URI
একবার আপনি পৃষ্ঠাটি রিফ্রেশ করলে এটিতে এখন ক্লাউড স্টোরেজে সঞ্চিত স্বয়ংক্রিয়ভাবে তৈরি হওয়া SBOM-এর একটি লিঙ্ক থাকবে। আপনি যদি আপনার চিত্রগুলির জন্য SBOM-এর উপর নির্ভর করেন, তাহলে আপনি আপনার শিল্পকর্মের জন্য স্বয়ংক্রিয়ভাবে SBOMs তৈরি করতে এবং প্রজন্মকে আপনার CI/CD পাইপলাইনের অংশ করতে চাইতে পারেন।
ইমেজ দুর্বলতা অন্বেষণ
আপনি যখন দৃশ্যের উপরে "ভালনারেবিলিটিস" ট্যাবে ক্লিক করেন তখন আপনি আপনার ছবিতে সনাক্ত করা সমস্ত দুর্বলতা দেখতে পাবেন৷ উপরের দুর্বলতার সারাংশ ছাড়াও আপনি নীচের টেবিলে দুর্বলতার সম্পূর্ণ তালিকা দেখতে পারেন। প্রতিটি সারি CVE বুলেটিনের সাথে লিঙ্ক করে, এর তীব্রতা এবং এটি যে প্যাকেজ থেকে উদ্ভূত হয়েছে তা নির্দেশ করে। দুর্বলতাগুলির জন্য যেখানে একটি ফিক্স উপলব্ধ রয়েছে এটি দুর্বলতা ঠিক করার জন্য নির্ভরতাগুলি কীভাবে আপডেট করতে হয় তার নির্দেশনাও দেয়৷
5. ভার্চুয়াল এবং রিমোট রিপোজিটরি
পূর্ববর্তী বিভাগে আমরা আমাদের ছবিগুলিকে পুশ এবং টানতে একটি একক চিত্র সংগ্রহস্থল ব্যবহার করেছি। এটি ছোট স্কেল ব্যবহারের ক্ষেত্রে দুর্দান্ত কাজ করে তবে বিশেষত বৃহত্তর সংস্থাগুলির জন্য বিভিন্ন দলগুলির জন্য চ্যালেঞ্জগুলি প্রদান করে যেগুলির জন্য তাদের সংগ্রহস্থলগুলিতে স্বায়ত্তশাসনের প্রয়োজন৷ দল বা ব্যবসায়িক ইউনিটগুলির নিজস্ব অনুমতি এবং কনফিগারেশন সহ তাদের নিজস্ব চিত্র সংগ্রহস্থল থাকা সাধারণ। এই সংগ্রহস্থলগুলিতে চিত্রগুলির ব্যবহার সহজ করার জন্য এবং অন্তর্নিহিত সাংগঠনিক কাঠামো থেকে ভোক্তাকে রক্ষা করার জন্য, আর্টিফ্যাক্ট রেজিস্ট্রি ভার্চুয়াল সংগ্রহস্থল সরবরাহ করে যা একাধিক অন্তর্নিহিত সংগ্রহস্থল থেকে সংস্থানগুলিকে একত্রিত করতে পারে। একটি সম্ভাব্য আর্কিটেকচার এই মত দেখতে পারে:
ডকার হাবের জন্য রিমোট রিপোজিটরি
ডকার হাব একটি জনপ্রিয় পাবলিক ইমেজ রেজিস্ট্রি এবং অনেকগুলি ওপেন সোর্স কন্টেইনার ইমেজ হোস্ট করে। যদিও পাবলিক রিপোজিটরিটি সরাসরি ব্যবহার করা সহজ, এটি একটি উত্পাদন পরিবেশে বেশ কয়েকটি চ্যালেঞ্জ নিয়ে আসে যা আমরা আর্টিফ্যাক্ট রেজিস্ট্রিতে রিমোট রিপোজিটরিগুলির সাথে কাটিয়ে উঠতে পারি।
রিমোট রিপোজিটরিগুলি আপনাকে আপস্ট্রিম রেজিস্ট্রি এবং ক্যাশে চিত্রগুলিতে অনুরোধগুলি প্রক্সি করার ক্ষমতা দেয়। এটি শুধুমাত্র ছবিগুলির ডাউনলোডের সময়কে কমিয়ে দেয় না কিন্তু বহিরাগত পরিষেবার আপটাইমের উপর নির্ভরতাও সরিয়ে দেয় এবং আপনাকে একই সুরক্ষা এবং অ্যাক্সেস নীতিগুলি প্রয়োগ করার ক্ষমতা দেয় যা আপনি আপনার নিজের ছবিতে প্রয়োগ করেন৷
ডকার হাবের জন্য একটি দূরবর্তী সংগ্রহস্থল তৈরি করতে আপনি ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালাতে পারেন:
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"
আপনি এখন আপনার আর্টিফ্যাক্ট রেজিস্ট্রি সংগ্রহস্থল তালিকায় একটি অতিরিক্ত সংগ্রহস্থল দেখতে হবে:
আপনার রিমোট রিপোজিটরি রিমোট রিপোজিটরিতে প্রক্সি রিকোয়েস্ট করতে সক্ষম কিনা তা পরীক্ষা করতে ক্লাউড শেলে nginx ইমেজ টানতে নিম্নলিখিত কমান্ডটি চালান:
docker pull us-central1-docker.pkg.dev/$PROJECT_ID/dockerhub/nginx:stable-alpine
একবার টান সফল হলে আপনি ক্লাউড কনসোলের সংগ্রহস্থলটিও দেখতে পারেন এবং ক্যাশে করা nginx চিত্রটি এখন একই নির্ভরতা এবং দুর্বলতার প্রতিবেদন প্রদান করে যা আমরা আপনার নিজের তৈরি করা চিত্রটির জন্য দেখেছি।
একটি ভার্চুয়াল সংগ্রহস্থল তৈরি করা হচ্ছে
আমরা এখনও পর্যন্ত যে প্রক্রিয়াগুলি ব্যবহার করেছি তা অনুসরণ করে আপনি প্রতিটি দল বা ব্যবসার জন্য বেশ কয়েকটি সংগ্রহস্থল তৈরি করতে পারেন এবং প্রতিটির জন্য মালিকানা এবং IAM অনুমতিগুলি স্পষ্টভাবে সংজ্ঞায়িত করতে পারেন। আমরা দূরবর্তী সংগ্রহস্থলগুলির জন্য প্রক্সি তৈরি করতে পারি যাতে তৃতীয় পক্ষের ছবিগুলি ব্যবহার করা সহজ এবং নিরাপদ হয়৷ এই বিপুল সংখ্যক সংগ্রহস্থলের নেতিবাচক দিকটি স্পষ্ট হয় যদি আপনি এই চিত্রগুলির ভোক্তার দিকে আপনার দৃষ্টিভঙ্গি পরিবর্তন করেন। কীভাবে একজন বিকাশকারীকে জানা উচিত যে তাদের স্থাপনে কোন চিত্র সংগ্রহস্থলটি ব্যবহার করা উচিত?
খরচ সহজ করতে এবং একটি বিমূর্ত স্তরের পিছনে অন্তর্নিহিত সংগ্রহস্থলগুলি লুকানোর জন্য আপনি ক্লাউড শেল-এ নিম্নলিখিত কমান্ড সহ আর্টিফ্যাক্ট রেজিস্ট্রিতে একটি ভার্চুয়াল সংগ্রহস্থল তৈরি করতে পারেন:
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"
আমরা এখন অন্তর্নিহিত কাঠামোটি প্রকাশ না করে ভার্চুয়াল সংগ্রহস্থল থেকে চিত্রগুলি টানতে পারি। সবকিছু প্রত্যাশিত হিসাবে কাজ করে যাচাই করতে আপনি ক্লাউড শেলে নিম্নলিখিত কমান্ডগুলি চালাতে পারেন:
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. ক্লাউড রানে স্থাপন করুন
সংশ্লিষ্ট রিপোজিটরি এবং ইমেজগুলির জায়গায় আমরা এখন সেগুলিকে একটি স্থাপনায় ব্যবহার করতে পারি। একটি উদাহরণ ব্যবহারের ক্ষেত্রে ব্যাখ্যা করতে এবং অতিরিক্ত পরিকাঠামো স্থাপন এড়াতে আমরা আমাদের কন্টেইনারটি ক্লাউড রানে স্থাপন করব। ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালানোর মাধ্যমে এর সহজতম আকারে স্থাপনা অর্জন করা যেতে পারে:
gcloud run deploy hello-world \
--image us-central1-docker.pkg.dev/$PROJECT_ID/all-images/java-hello-world:tag1 \
--region us-central1 \
--allow-unauthenticated
একবার স্থাপনা শেষ হলে এটি স্বয়ংক্রিয়ভাবে উৎপন্ন URL দেখাবে যার অধীনে আপনি আপনার পরিষেবা অ্যাক্সেস করতে পারবেন।
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
আপনি যদি একটি নতুন ব্রাউজার ট্যাবে সেই URLটি খোলেন তবে আপনি সফল "হ্যালো ওয়ার্ল্ড" বার্তাটি দেখতে পাবেন।
7. সাপ্লাই চেইন নিরাপত্তা জোরদার করা
এখন যেহেতু আপনার কন্টেইনার ইমেজ এটিকে একটি লাইভ স্থাপনায় পরিণত করেছে, আমরা কীভাবে আমাদের শেষ থেকে শেষ সাপ্লাই চেইনকে শক্তিশালী করতে পারি তা দেখার জন্য এটি একটি ভাল সময় হতে পারে। পূর্ববর্তী বিভাগে আমরা দেখেছি কিভাবে আর্টিফ্যাক্ট রেজিস্ট্রির কন্টেইনার বিশ্লেষণ চিত্রটিতে ব্যবহৃত লাইব্রেরি এবং লাইসেন্সগুলির অন্তর্দৃষ্টি প্রদান করে। তবে দূষিত অভিনেতাদের পক্ষে সাপ্লাই চেইন বরাবর আপনার ছবিতে ক্ষতিকারক বিষয়বস্তু প্রবর্তন করা সম্ভব। এই বিভাগে আমরা অন্বেষণ করব কিভাবে আমরা SLSA ফ্রেমওয়ার্ক ব্যবহার করে বিল্ড আর্টিফ্যাক্টগুলির জন্য প্রত্যয়ন প্রবর্তন করতে পারি এবং এমনকি আর্টিফ্যাক্টগুলির নিজেদের ক্রিপ্টোগ্রাফিক স্বাক্ষরগুলিকে লিভারেজ করতে পারি যাতে শুধুমাত্র বিশ্বস্ত আর্টিফ্যাক্টগুলি আমাদের ক্লাউড রান রানটাইমে স্থাপন করা যায়।
ক্লাউড বিল্ডের সাথে SLSA প্রত্যয়ন
SLSA ফ্রেমওয়ার্ক সাপ্লাই চেইন আর্টিফ্যাক্টের জন্য বিভিন্ন স্তরের প্রমাণ প্রদান করে। স্পেসিফিকেশন এবং বাস্তবায়ন প্রথম নজরে ভয়ঙ্কর বলে মনে হতে পারে কিন্তু ক্লাউড বিল্ডের সাথে SLSA প্রত্যয়ন তৈরি করা যতটা সহজ, ততটাই সহজ, যতটা সহজে একটি cloudbuild.yaml
স্পেসিফিকেশন তৈরি করা requestedVerifyOption
VerifyOption VERIFIED
এ সেট করা।
আমাদের অ্যাপ্লিকেশনের জন্য আমরা helloworld ফোল্ডারে cloudbuild.yaml
ফাইল তৈরি করতে ক্লাউড শেল-এ নিম্নলিখিত কমান্ডটি চালাতে পারি।
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
এখন আমরা একটি নতুন ক্লাউড বিল্ড জব তৈরি করি যা ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালিয়ে আমাদের জাভা হ্যালো ওয়ার্ল্ড ইমেজের একটি নতুন সংস্করণ তৈরি করে।
gcloud builds submit --substitutions=_IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/container-example/java-hello-world:cloud-build
একবার বিল্ড সম্পূর্ণ হয়ে গেলে আমরা Google ক্লাউড কনসোলে ক্লাউড বিল্ড UI-তে যেতে পারি এবং আমাদের বিল্ড খোলার মাধ্যমে আমরা যে SLSA স্তর অর্জন করেছি তা দেখতে পারি এবং তারপর বিল্ড সারাংশের অধীনে বিল্ড আর্টিফ্যাক্টগুলি দেখতে পারি। সেখানে দেখা ছবিতে "সিকিউরিটি ইনসাইটস" দেখার জন্য একটি বোতাম রয়েছে। আপনি যখন এটিতে ক্লিক করেন তখন আপনি SLSA প্রমাণীকরণের পাশাপাশি পরিচিত দুর্বলতার প্রতিবেদনগুলি দেখতে পান যা আমরা আগে আর্টিফ্যাক্ট রেজিস্ট্রি UI-তে দেখেছিলাম যখন আমরা আমাদের স্থানীয় বিল্ডকে ঠেলে দিয়েছিলাম।
ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালানোর মাধ্যমে আমাদের চিত্রের জন্য SLSA উদ্ভবও পুনরুদ্ধার করা যেতে পারে:
gcloud artifacts docker images describe \
"us-central1-docker.pkg.dev/$PROJECT_ID/container-example/java-hello-world:cloud-build" \
--show-provenance
বাইনারি অনুমোদনের সাথে ক্লাউড বিল্ড প্রোভেন্যান্স প্রয়োজন
ক্লাউড বিল্ড পাইপলাইনটি জায়গায় থাকার সাথে এটি নিশ্চিত করা কি দুর্দান্ত হবে না যে আমরা উত্পাদনে যে সমস্ত চিত্র স্থাপন করি সেগুলি সেই প্রোগ্রামযোগ্য এবং পুনরুত্পাদনযোগ্য বিল্ড পরিবেশ ব্যবহার করে নির্মিত হয়েছিল?
এখানেই বাইনারি অনুমোদন আসে। এটি আপনাকে আপনার কন্টেইনার রানটাইমের সামনে একজন দারোয়ান রাখতে দেয় যা কন্টেইনার ইমেজ পরিদর্শন করে এবং একটি বিশ্বস্ত প্রত্যয়নের অস্তিত্ব যাচাই করে। যদি কোন প্রত্যয়ন পাওয়া না যায় তবে এটি হয় অডিট লগ এন্ট্রি তৈরি করে বা সম্পূর্ণরূপে কনফিগারেশনের উপর নির্ভর করে স্থাপনাকে ব্লক করে।
আমাদের প্রজেক্টের ডিফল্ট বাইনারি অথরাইজেশন কনফিগারেশন পরিবর্তন করতে ক্লাউড রান দ্বারা জারি করা বিল্ট-ইন প্রত্যয়ন প্রয়োজন, আমরা ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালাই:
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
এখানে আপনি স্পষ্টতই আপনার নিজস্ব কাস্টম অ্যাটেস্টর যোগ করতে পারেন তবে এটি এই কোডল্যাবের সুযোগের বাইরে এবং একটি ঐচ্ছিক অতিরিক্ত পাঠ্যক্রমিক হোমওয়ার্ক অনুশীলন হিসাবে রেখে দেওয়া হয়েছে।
আমাদের ক্লাউড রান সার্ভিসে বাইনারি অনুমোদন কার্যকর করতে আমরা ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালাই:
gcloud run services update hello-world \
--region us-central1 \
--binary-authorization=default
প্রথমে স্থানীয়ভাবে নির্মিত চিত্রটি পুনরায় স্থাপন করে আমাদের বাইনারি অনুমোদন সঠিকভাবে প্রয়োগ করা হয়েছে তা পরীক্ষা করা যাক
gcloud run deploy hello-world \
--image us-central1-docker.pkg.dev/$PROJECT_ID/all-images/java-hello-world:tag1 \
--region us-central1
প্রত্যাশিত হিসাবে আপনি একটি ত্রুটি বার্তা পাবেন যা ব্যাখ্যা করে যে কেন চিত্রটি স্থাপন করা যায়নি যা এইরকম কিছু দেখায়:
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
আমাদের ক্লাউড রান পরিষেবাতে একটি নতুন সংস্করণ স্থাপন করতে তাই আমাদের ক্লাউড বিল্ডের সাথে নির্মিত একটি চিত্র প্রদান করতে হবে।
gcloud run deploy hello-world \
--image us-central1-docker.pkg.dev/$PROJECT_ID/all-images/java-hello-world:cloud-build \
--region us-central1
এইবার মোতায়েন সফল হওয়া উচিত এবং নীচের মত একটি সফল স্থাপনার বার্তা দেখাতে হবে:
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. Java Maven ভাষার প্যাকেজ পরিচালনা করা
এই বিভাগে আপনি দেখতে পাবেন কিভাবে একটি আর্টিফ্যাক্ট রেজিস্ট্রি জাভা রিপোজিটরি সেট আপ করতে হয় এবং এতে প্যাকেজগুলি আপলোড করতে হয়, বিভিন্ন অ্যাপ্লিকেশনে সেগুলি ব্যবহার করে।
একটি Maven প্যাকেজ সংগ্রহস্থল তৈরি করুন
ক্লাউড শেল থেকে জাভা আর্টিফ্যাক্টগুলির জন্য একটি সংগ্রহস্থল তৈরি করতে নিম্নলিখিত কমান্ডটি চালান:
gcloud artifacts repositories create java-repo \
--repository-format=maven \
--location=us-central1 \
--description="Example Java Maven Repo"
ক্লাউড শেল অনুমোদন প্রম্পট প্রদর্শিত হলে অনুমোদন ক্লিক করুন
Google ক্লাউড কনসোলে যান - আর্টিফ্যাক্ট রেজিস্ট্রি - রিপোজিটরি এবং আপনার সদ্য তৈরি করা java-repo
নামের Maven সংগ্রহস্থলটি লক্ষ্য করুন, যদি আপনি এটিতে ক্লিক করেন তবে আপনি দেখতে পাবেন যে এটি এই মুহূর্তে খালি।
আর্টিফ্যাক্ট রিপোজিটরিতে প্রমাণীকরণ সেট আপ করুন
আপনার ব্যবহারকারীর অ্যাকাউন্টের শংসাপত্রগুলির সাথে অ্যাপ্লিকেশন ডিফল্ট শংসাপত্র (ADC) এর জন্য সুপরিচিত অবস্থান আপডেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন যাতে আর্টিফ্যাক্ট রেজিস্ট্রি শংসাপত্রের সাহায্যকারী সংগ্রহস্থলগুলির সাথে সংযোগ করার সময় তাদের ব্যবহার করে প্রমাণীকরণ করতে পারে:
gcloud auth login --update-adc
আর্টিফ্যাক্ট রেজিস্ট্রির জন্য Maven কনফিগার করুন
আপনার জাভা প্রকল্পে যোগ করতে সংগ্রহস্থল কনফিগারেশন মুদ্রণ করতে নিম্নলিখিত কমান্ডটি চালান:
gcloud artifacts print-settings mvn \
--repository=java-repo \
--location=us-central1 | tee config.xml
helloworld ডিরেক্টরির মধ্যে থেকে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড শেল এডিটরে pom.xml খুলুন:
cloudshell edit pom.xml
এবং ফাইলের উপযুক্ত বিভাগে প্রত্যাবর্তিত সেটিংস যোগ করুন,
ডিস্ট্রিবিউশন ম্যানেজমেন্ট বিভাগ আপডেট করুন
<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>
বিল্ডের অধীনে এক্সটেনশন বিভাগ আপডেট করুন
<extensions>
<extension>
<groupId>com.google.cloud.artifactregistry</groupId>
<artifactId>artifactregistry-maven-wagon</artifactId>
<version>2.1.0</version>
</extension>
</extensions>
এখানে আপনার রেফারেন্সের জন্য সম্পূর্ণ ফাইলের একটি উদাহরণ। আপনার প্রজেক্ট আইডি দিয়ে <PROJECT> প্রতিস্থাপন করা নিশ্চিত করুন।
<?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>
আপনার জাভা প্যাকেজটি আর্টিফ্যাক্ট রেজিস্ট্রিতে আপলোড করুন
ম্যাভেনে কনফিগার করা আর্টিফ্যাক্ট রেজিস্ট্রি সহ, আপনি এখন আপনার প্রতিষ্ঠানের অন্যান্য প্রকল্পগুলির দ্বারা ব্যবহারের জন্য জাভা জার সংরক্ষণ করতে আর্টিফ্যাক্ট রেজিস্ট্রি ব্যবহার করতে পারেন।
আর্টিফ্যাক্ট রেজিস্ট্রিতে আপনার জাভা প্যাকেজ আপলোড করতে নিম্নলিখিত কমান্ডটি চালান:
mvn deploy
আর্টিফ্যাক্ট রেজিস্ট্রিতে জাভা প্যাকেজটি পরীক্ষা করুন
ক্লাউড কনসোলে যান - আর্টিফ্যাক্ট রেজিস্ট্রি - রিপোজিটরি java-repo
ক্লিক করুন এবং helloworld
বাইনারি আর্টিফ্যাক্ট আছে কিনা তা পরীক্ষা করুন:
9. অভিনন্দন!
অভিনন্দন, আপনি কোডল্যাব শেষ করেছেন!
আপনি কভার করেছেন কি
- কনটেইনার এবং ভাষা প্যাকেজের জন্য সংগ্রহস্থল তৈরি করা হয়েছে
- আর্টিফ্যাক্ট রেজিস্ট্রি সহ পরিচালিত কন্টেইনার চিত্রগুলি
- ক্লাউড কোড সহ ইন্টিগ্রেটেড আর্টিফ্যাক্ট রেজিস্ট্রি
- জাভা নির্ভরতার জন্য আর্টিফ্যাক্ট রেজিস্ট্রি ব্যবহার করার জন্য Maven কনফিগার করা হয়েছে
ক্লিনআপ
পুরো প্রকল্পটি মুছে ফেলার জন্য ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান
gcloud projects delete $PROJECT_ID