আপটাইম পর্যবেক্ষণে ওয়েবসাইট, API এবং সার্ভারের উপলব্ধতা পরীক্ষা করা জড়িত। মনিটর একটি নির্দিষ্ট ব্যবধানের মধ্যে একটি প্রদত্ত এন্ডপয়েন্ট উপলব্ধ কিনা তা নির্ণয় করে। লক্ষ্য হল প্রাপ্যতার চুক্তিবদ্ধ স্তর অর্জন করা, যেমনটি সিস্টেমের SLA-তে উল্লেখ করা হয়েছে, এবং চুক্তি পূরণ না হলে পার্থক্য নির্ধারণ করা।
এই নিবন্ধে, আমরা Prometheus blackbox_exporter-এর উপর ভিত্তি করে একটি আপটাইম মনিটরিং সিস্টেম তৈরি করব। যদিও এটি একটি কাস্টম HTTP মনিটরিং সিস্টেম তৈরি করা তুচ্ছ হতে পারে, রপ্তানিকারকের চারপাশে একটি মোড়ক তৈরি করা আমাদেরকে আরও অনেক প্রোব কৌশল অ্যাক্সেস করতে এবং আমাদের সিস্টেমের অন্যান্য উপাদানগুলিকে দ্রুত নিরীক্ষণ করতে সক্ষম করে৷
এই নিবন্ধটি বেশ কয়েকটি প্রযুক্তির ব্যবহার কভার করে, এবং আপটাইম সিস্টেমের বিশদ বিবরণে ডুব দেওয়ার আগে আমি প্রতিটি উপাদান বর্ণনা করব৷
Google Compute Engine (GCE) কি?
কম্পিউট ইঞ্জিন হল Google-এর ক্লাউড কম্পিউটিং পরিষেবা যা AWS-এর EC2 কম্পিউট অফারের মতো। ছোট মেশিন (32 vCPU এবং 128 GB মেমরি পর্যন্ত সমর্থন করে) থেকে স্ট্যান্ডার্ড মেশিন (224 vCPU এবং 896 GB মেমরি পর্যন্ত সমর্থন করে) এবং নিবিড় কাজের চাপের জন্য অন্যান্য উচ্চ-সম্পন্ন মেশিন পর্যন্ত বিভিন্ন কাজের চাপের জন্য GCE যথেষ্ট নিরাপদ এবং কাস্টমাইজযোগ্য। এটি প্রতি-সময়ে আপনার চাহিদা অনুযায়ী স্কেল করার জন্য কম্পিউটার অন-ডিমান্ড ব্যবহার করে।
জিসিই কন্টেইনার, ইনস্ট্যান্স টেমপ্লেট এবং ম্যানেজড ইনস্ট্যান্স গ্রুপ সহ অ্যাপ স্থাপনের জন্য বিভিন্ন স্থাপনার পদ্ধতি সমর্থন করে। এই নিবন্ধটির উদ্দেশ্যে, আমরা আমাদের রুবি আপটাইম মনিটরকে স্থাপনার জন্য একটি ডকার কন্টেইনারে বান্ডিল করব৷
ক্লাউড স্টোরেজ কি?
Google ক্লাউড স্টোরেজ হল AWS-এর S3 পরিষেবার অনুরূপ একটি অত্যন্ত উপলব্ধ অবজেক্ট-স্টোরেজ পরিষেবা৷ ক্লাউড স্টোরেজ অনেক স্টোরেজ বৈশিষ্ট্য প্রদান করে যা আধুনিক অ্যাপের জন্য বেশ কয়েকটি ব্যবহার-কেস সক্ষম করে। রুবিতে ক্লাউড স্টোরেজ শুরু করতে, আমরা google-cloud-storage
ব্যবহার করব প্রমাণীকরণের জন্য রত্ন, সেইসাথে ক্লাউড স্টোরেজ থেকে ফাইল আপলোড এবং ডাউনলোড করুন:
require 'google/cloud/storage'
def upload_file bucket_name:, file_path:, file_name: nil
storage = Google::Cloud::Storage.new
bucket = storage.bucket bucket_name
file = bucket.create_file file_path, file_name
end
def download_file bucket_name: file_path, file_name: nil
storage = Google::Cloud::Storage.new
bucket = storage.bucket bucket_name
file = bucket.file file_name
file.download file_path
end
দ্রষ্টব্য :আপনাকে GOOGLE_APPLICATION_CREDENTIALS
সেট আপ করতে হবে আপনার পরিবেশে সঠিক পরিষেবা অ্যাকাউন্ট কী নির্দেশ করতে। সমস্ত Google ক্লায়েন্ট রত্ন অনুমোদনের জন্য এই পরিবেশ পরিবর্তনশীল জন্য অনুসন্ধান করে; অন্যথায়, আপনাকে Google::Cloud::Storage.new
-এ প্রমাণীকরণের নির্দিষ্ট প্যারামিটার পাস করতে হবে . যদি আপনার অ্যাপটি একটি GCE VM-এ চলছে, তবে, এটি ইতিমধ্যেই পরিবেশে সেট আপ করা আছে৷
ক্লাউড পাবসাব কি?
Cloud PubSub হল Google ক্লাউড দ্বারা প্রদত্ত একটি প্রকাশ/সাবস্ক্রাইব মেসেজিং পরিষেবা। যোগাযোগের এই ফর্মটি AWS-এর SNS-এর মতো অ্যাসিঙ্ক্রোনাস পরিষেবা থেকে পরিষেবা যোগাযোগের সুবিধার্থে ব্যবহৃত হয়। অ্যাসিঙ্ক্রোনাস যোগাযোগের সাথে সিস্টেম তৈরি করা আমাদের সিস্টেমের কর্মক্ষমতা, মাপযোগ্যতা এবং নির্ভরযোগ্যতা উন্নত করতে সাহায্য করতে পারে। রুবিতে ক্লাউড পাবসাবের সাথে শুরু করতে, আমরা google-cloud-pubsub
ব্যবহার করব ইভেন্টে প্রমাণীকরণ, প্রকাশ এবং শোনার জন্য রত্ন:
require 'google/cloud/pubsub'
def publish_message topic_id:, message: nil
pubsub = Google::Cloud::Pubsub.new
topic = pubsub.topic topic_id
topic.publish_async message do |result|
raise "Failed to publish message" unless result.succeeded?
puts "Message published asynchronously"
end
topic.async_publisher.stop.wait!
rescue StandardError => e
puts "Received error while publishing: #{e.message}"
end
def receive_message subscription_id: nil, wait_time: 200.seconds
pubsub = Google::Cloud::Pubsub.new
subscription = pubsub.subscription subscription_id
subscriber = subscription.listen do |received_message|
puts "Received message: #{received_message.data}"
received_message.acknowledge!
end
subscriber.start
sleep wait_time
end
দ্রষ্টব্য :ক্লাউড স্টোরেজের জন্য বর্ণিত প্রমাণীকরণ এখানেও প্রযোজ্য৷
৷ক্লাউড স্টোরেজ এবং PubSub ব্যবহার করার সময়, আমরা খুব আকর্ষণীয় সমাধান তৈরি করতে পারি। প্রায়শই, আমরা একটি অবজেক্ট আপলোড করতে চাই এবং আপডেটগুলি ট্র্যাক করতে চাই - এটি জীবন-চক্র - কিছু ইভেন্টের উপর ভিত্তি করে তৈরি করা, আপডেট করা, মুছে ফেলা এবং নির্দিষ্ট পদক্ষেপ নেওয়া। যদি এটি এখনও বিমূর্ত মনে হয়, আসুন দুটি ব্যবহার-কেস অন্বেষণ করি:
- ইমেজ সার্ভিস:একটি ইমেজ সার্ভিস তৈরি করা। ধরা যাক যে আমরা ক্লাউডিনারির মতো কিছু তৈরি করতে চাই যা ইমেজ এবং ভিডিও স্টোরেজ প্রদান করে, সেইসাথে এই ডেটাতে রূপান্তর সঞ্চালন করে। যদিও ক্লাউড স্টোরেজ PubSub-এর সাহায্যে ডেটা সঞ্চয় ও সংস্করণে সহায়তা করতে পারে, আমরা একটি বালতি থেকে ইভেন্ট শুনতে পারি এবং গ্রাহকের একটি প্রাক-প্রক্রিয়াজাত সংস্করণের অনুরোধ করার আগেও ডেটাতে নির্দিষ্ট ধরনের প্রাক-প্রসেসিং করতে পারি।
- কনফিগারেশন ফাইল বিতরণ করুন। অবকাঠামো প্রকৌশলের একটি সাধারণ সমস্যা হল বিভিন্ন সার্ভারে কনফিগারেশন রোল আউট করা এবং সহজ রোলব্যাক প্রদান করা। কল্পনা করুন যে আমরা সার্ভার কনফিগারেশনের জন্য দায়ী একটি কেন্দ্রীয় সার্ভার রাখতে চাই, এবং আমরা একবার কনফিগারেশন আপডেট করতে এবং আমাদের সার্ভারের একটি ফ্লিটে কনফিগারেশন বিতরণ করতে চেয়েছিলাম। ক্লাউড স্টোরেজ এবং ক্লাউড পাবসাব ব্যবহার করে, আমরা আমাদের সার্ভারে এজেন্ট তৈরি করতে পারি যারা অবজেক্টের বিজ্ঞপ্তি পেতে এবং এই ইভেন্টগুলির উপর ভিত্তি করে পদক্ষেপ নিতে PubSub-এর মাধ্যমে শোনে। উপরন্তু, যদি এটি একটি খারাপ পরিবর্তন ছিল (ভুল কনফিগারেশন পরিবর্তনগুলি ডাউনটাইমের একটি সাধারণ কারণ 😩), আমরা অবজেক্ট সংস্করণের সাথে একটি রোলব্যাক করতে পারি৷
এই নিবন্ধে, আমরা উপরে বর্ণিত দ্বিতীয় ব্যবহার-কেস ব্যবহার করে ব্ল্যাকবক্স রপ্তানিকারকের জন্য একটি রুবি মোড়ক তৈরি করব। র্যাপার একটি প্রক্রিয়ায় রপ্তানিকারককে চালাবে এবং GCP-তে একটি বালতি থেকে কনফিগারেশন পরিবর্তনগুলি দেখার জন্য অন্য প্রক্রিয়া চালাবে এবং তারপর রপ্তানিকারককে লাইভ রিলোড করবে। তুমি কী তৈরী? আসুন মজা করি!
ব্ল্যাকবক্স এক্সপোর্টার কি?
ব্ল্যাকবক্স এক্সপোর্টার হল একটি ওপেন-সোর্স টুল যা প্রমিথিউস টিম দ্বারা তৈরি করা হয়েছে HTTP, HTTPS, DNS, TCP এবং ICMP-তে শেষ পয়েন্টগুলি অনুসন্ধান করার জন্য। রপ্তানিকারক একটি Grafana এবং Prometheus স্থাপনার পাশাপাশি স্থাপন করা উচিত. সম্পূর্ণ সেটআপ নিম্নলিখিত মত দেখায়:
ব্ল্যাকবক্স র্যাপার সমস্ত কনফিগার করা শেষ পয়েন্টগুলি অনুসন্ধান করে এবং প্রমিথিউস অন্য যে কোনও লক্ষ্যের মতো রপ্তানিকারককে স্ক্র্যাপ করে। তারপরে, গ্রাফানা প্রমিথিউস থেকে গ্রাফ করার জন্য ডেটা পুনরুদ্ধার করে। আমরা blackbox_exporter --config.file blackbox.yml
এর মত এক্সপোর্টার বাইনারি চালাই . ব্ল্যাকবক্স এক্সপোর্টার আমাদের বাইনারি বন্ধ না করে এবং পুনরায় চালু না করে একটি নতুন কনফিগারেশন সহ রপ্তানিকারককে লাইভ রিলোড করার অনুমতি দেয়। সেকেন্ডে পরিমাপ করা ব্যবধানের সাথে এন্ডপয়েন্ট স্ক্র্যাপ করার সময় এটি খুব কার্যকর হতে পারে।
BlackboxWrapper পরিষেবার বৈশিষ্ট্য
কোডের গভীরে ডাইভ করার আগে, আসুন পরিষেবার বৈশিষ্ট্যগুলি হাইলাইট করি:
-
BlackboxWrapper
পরিষেবা দুটি প্রক্রিয়া চালাবে৷- প্রথম প্রক্রিয়া
blackbox_exporter
চালায় বাইনারি। - দ্বিতীয় প্রক্রিয়া GCP থেকে বালতি পরিবর্তনের জন্য শোনে এবং প্রথম প্রক্রিয়াটি পুনরায় চালু করে।
- প্রথম প্রক্রিয়া
- পরিষেবাটি একটি ডকার ইমেজ হিসাবে স্থাপন করা হবে, যা আমাদেরকে
blackbox_exporter
এর পাশাপাশি পরিষেবাটি প্যাকেজ করতে সক্ষম করবে বাইনারি।
আসুন বিল্ডিং শুরু করি
প্রথমে, একটি অ্যাপ ডিরেক্টরি তৈরি করুন এবং তারপরে ডিরেক্টরিতে প্রবেশ করুন৷
৷mkdir blackbox-wrapper && cd blackbox-wrapper
আমাদের আদর্শ রুবি অ্যাপ্লিকেশনের মতো, আমরা bundler
ব্যবহার করব আমাদের মোড়কের নির্ভরতা পরিচালনা করতে। একটি জেমফাইল তৈরি করুন:
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
ruby '2.7.2'
gem 'google-cloud-storage'
gem 'google-cloud-pubsub'
gem 'rake'
gem 'pry'
তারপর bundle install
চালান .
এখন আমরা আমাদের কোড ধরে রাখার জন্য একটি ফাইল তৈরি করব:app.rb
.
এই ফাইলটি আমাদের পরিষেবার এন্ট্রি পয়েন্ট হিসাবে কাজ করবে। যেহেতু আমরা আমাদের অ্যাপটি একটি পাত্রে স্থাপন করব, তাই এই ফাইলটি CMD
-এ নির্দিষ্ট করা হবে আমাদের Dockerfile
-এ কমান্ড পরে।
touch app.rb
ডকারফাইল তৈরি করা হচ্ছে
যদিও কিছু আইটেম উদ্দেশ্যমূলকভাবে এই ফাইল থেকে বাদ দেওয়া হয়েছে. নীচের কোডটি এই নিবন্ধটির জন্য প্রয়োজনীয় গুরুত্বপূর্ণ উপাদানগুলিকে হাইলাইট করে:
FROM ruby:2.7.2
RUN mkdir /app
WORKDIR /app
COPY . .
# Install other dependencies
...
# Download & Install blackbox exporter
RUN curl -SL \
https://github.com/prometheus/blackbox_exporter/releases/download/v0.18.0/blackbox_exporter-0.18.0.linux-386.tar.gz | \
tar xvz -C /tmp && \
mv /tmp/blackbox_exporter-0.18.0.linux-386/blackbox_exporter /usr/local/bin && \
mkdir /etc/blackbox && \
mv /tmp/blackbox_exporter-0.18.0.linux-386/blackbox.yml /etc/blackbox/
# Specify entry point.
CMD ["bundle", "exec", "ruby", "app.rb" ]
উপরের থেকে, আমাদের নিম্নলিখিতগুলি নোট করা উচিত:
- আমরা একটি রুবি ছবি ব্যবহার করেছি -
ruby:2.7.2
- রুবি ইনস্টল করা বেস ইমেজ হিসাবে। - আমরা
blackbox_exporter
ইনস্টল করেছি বাইনারি এবং এটিকে আমাদেরPATH
থেকে অ্যাক্সেসযোগ্য একটি ডিরেক্টরিতে সরানো হয়েছে . - আমরা
app.rb
চালানোর জন্য কন্টেইনারটির এন্ট্রিপয়েন্ট নির্দিষ্ট করেছি কন্টেইনার স্টার্ট আপে।
র্যাপার পরিষেবা তৈরি করা
এটি আমাদের রুবি পরিষেবা যা সবকিছুকে একত্রিত করে। main.rb
-এ , নিম্নলিখিত রাখুন:
require 'rubygems'
require 'bundler/setup'
require "google/cloud/pubsub"
require "google/cloud/storage"
CONFIG_BUCKET = ENV['BUCKET_NAME']
TOPIC = ENV['PUBSUB_TOPIC']
TOPIC_SUBSCRIPTION = ENV['TOPIC_SUBSCRIPTION']
class ProcessNotification
def initialize(file, attr, blackbox_exporter)
@file = file
@attr = attr
@blackbox_exporter = blackbox_exporter
end
def call
return if @attr['eventType'] == 'OBJECT_DELETE'
@blackbox_exporter.write @file
@blackbox_exporter.reload
end
end
class BlackBoxExporter
CONFIG_FILE = '/etc/blackbox/blackbox.yml'
def initialize
@blackbox_pid = nil
end
def start
return unless @blackbox_pid.nil?
@blackbox_pid = fork do
exec('blackbox_exporter', '--config.file', CONFIG_FILE)
end
end
def write(file)
file.download CONFIG_FILE
end
def reload
# Send SIGHUP signal
Process.kill('HUP', @blackbox_pid)
end
def shutdown
Process.kill('KILL', @blackbox_pid)
end
end
class Subscriber
class NotificationConfigError < StandardError
end
SUPPORTED_FILE_TYPES = ['blackbox.yml']
def initialize(blackbox_exporter)
@pubsub = Google::Cloud::Pubsub.new
@storage = Google::Cloud::Storage.new
@subscription_name = ENV['TOPIC_SUBSCRIPTION'] # Retrieve a subscription
@bucket = @storage.bucket CONFIG_BUCKET
@subscription = @pubsub.subscription @subscription_name
@blackbox_exporter = blackbox_exporter
end
def listen
create_notification_config
puts "Starting subscriber"
@subscriber = @subscription.listen do |received_message|
process_notification(received_message)
end
@subscriber.on_error do |exception|
process_exception(exception)
end
@subscriber.start
end
def process_notification(received_message)
data = received_message.message.data
published_at = received_message.message.published_at
attributes = received_message.message.attributes
puts "Data: #{data}, published at #{published_at}, Attr: #{attributes}"
received_message.acknowledge!
parsed_data = JSON.parse(data)
file_name = parsed_data['name']
return unless SUPPORTED_FILE_TYPES.include?(file_name)
file = @bucket.file file_name
process_notification = ProcessNotification.new(file, attributes, @blackbox_exporter)
process_notification.call
end
def process_exception(exception)
puts "Exception: #{exception.class} #{exception.message}"
end
def shutdown
@subscriber.stop!(10)
end
def create_notification_config
topic = @pubsub.topic TOPIC
notification_exists = @bucket.notifications.count == 1
unless notification_exists
@bucket.notifications.each do |notification|
notification.delete
end
end
@bucket.create_notification topic.name
rescue StandardError => e
raise NotificationConfigError, e.message
end
end
class BlackboxWrapper
def initialize
@blackbox_exporter = BlackBoxExporter.new
@subscriber = Subscriber.new(@blackbox_exporter)
end
def start
@blackbox_exporter.start
@subscriber.listen
at_exit do
@blackbox_exporter.shutdown
@subscriber.shutdown
end
# Block, letting processing threads continue in the background
sleep
end
end
blackbox_wrapper = BlackboxWrapper.new
blackbox_wrapper.start
যদিও উপরেরটি অনেক কোডিং, আসুন এটিকে নীচে থেকে শুরু করে ভেঙে ফেলার চেষ্টা করি:
BlackboxWrapper
:এই ক্লাসটি আমাদের পরিষেবার প্রবেশদ্বার। -.start
পদ্ধতি নিম্নলিখিত কাজ করে:-
blackbox_exporter
শুরু করে এন্ডপয়েন্ট অনুসন্ধান শুরু করার জন্য একটি ভিন্ন প্রক্রিয়ায় বাইনারি। -
subscriber
শুরু করে বালতি পরিবর্তনের জন্য শোনার জন্য অন্য প্রক্রিয়ায়৷ - এটা তখন
sleep
বলে অ্যাপটি অসীমভাবে চলে তা নিশ্চিত করতে মূল প্রক্রিয়ায়।
-
- কিভাবে
BlackboxExporter
করে কাজ?-
.start
পদ্ধতিটিexec
ব্যবহার করেblackbox_exporter
চালানোর জন্য কার্নেল পদ্ধতি অন্য প্রক্রিয়ায় বাইনারি। -
.reload
পদ্ধতিSIGHUP
পাঠায়blackbox_exporter
লাইভ রিলোড করার সংকেত নতুন কনফিগারেশন সহ বাইনারি। আপনি হয়তোProcessNotification
থেকে উল্লেখ করেছেন ক্লাস, এক্সপোর্টার পুনরায় লোড করার আগে কনফিগারেশন ফাইলের অবস্থানে একটি নতুন কনফিগারেশন ফাইল লেখা হয়৷
-
- কিভাবে
subscriber
করে কাজ?-
.listen
পদ্ধতিটি একটিNotificationConfiguation
তৈরি করে শুরু হয় . একটিNotificationConfiguration
একটি নিয়ম যা তিনটি জিনিস নির্দিষ্ট করে:- বিজ্ঞপ্তি পেতে পাব/সাব-এ একটি বিষয়।
- যে ইভেন্টটি পাঠানোর জন্য বিজ্ঞপ্তিগুলিকে ট্রিগার করে৷ বিজ্ঞপ্তিগুলিকে ট্রিগার করতে পারে এমন বিভিন্ন ইভেন্টের ধরন দেখতে এখানে ক্লিক করুন৷
- বিজ্ঞপ্তির মধ্যে থাকা তথ্য।
-
#create_notification_config
পদ্ধতিটি নিশ্চিত করে যে শুধুমাত্র একটিNotificationConfiguation
আছে; অন্যথায়, এটি সবকিছু মুছে ফেলবে এবং একটি তৈরি করবে। এটি নিশ্চিত করে যে বিজ্ঞপ্তিগুলি একবার পাঠানো হয়৷ -
.listen
পদ্ধতিটি@subscription.listen
ও কল করে আমরা যে বালতিতে সদস্যতা নিয়েছি তাতে বিজ্ঞপ্তি পরিবর্তনের জন্য শুনতে শুরু করতে। উল্লেখ্য যে এটি অন্য প্রক্রিয়ায় অসীমভাবে চলে, যেমন ব্যাখ্যা করা হয়েছে। -
#process_notification
প্রেরিত প্রতিটি বিজ্ঞপ্তি আপডেটের জন্য পদ্ধতি বলা হয়। মনে রাখবেন যে আমাদেরSUPPORTED_FILE_TYPES
আছে , যা আমরা আমাদের যত্নের বালতিতে থাকা ফাইলগুলি সনাক্ত করতে ব্যবহার করি এবং বাকিগুলি সম্পর্কে কিছুই করি না৷
৷
-
ProcessNotification
:এটি বিজ্ঞপ্তিগুলি প্রক্রিয়াকরণ, আপডেট করা কনফিগারেশন ডাউনলোড করা, এটি একটি ফাইলে লেখা এবংblackbox_exporter
পুনরায় লোড করার জন্য দায়ী। বাইনারি।
পরিষেবা স্থানীয়ভাবে চালানো
স্থানীয়ভাবে পরিষেবাটি চালানোর জন্য এবং এটি পরীক্ষা করতে, অ্যাপ ডিরেক্টরির রুটে নিম্নলিখিতটি চালান:
export BUCKET_NAME='{insert-bucket-name}'
export PUBSUB_TOPIC='{insert-pubsub-topic}'
export TOPIC_SUBSCRIPTION='{insert-subscription-name}'
export GOOGLE_APPLICATION_CREDENTIALS='{insert-path-to-service-key-json}'
bundle exec ruby app.rb
Google Compute Engine-এ আমাদের পরিষেবা স্থাপন করা হচ্ছে
ক্লাউডের বিভিন্ন দিকগুলির মতো, একই ফলাফল অর্জনের অনেক উপায় রয়েছে, তবে আধুনিক সফ্টওয়্যার ইঞ্জিনিয়ারিং বেশ কয়েকটি ভাল কারণে CI/CD প্রক্রিয়াগুলিকে উত্সাহিত করে। যেমন, আমরা সেটআপ-জিক্লাউড ব্যবহার করে গিথুব অ্যাকশন থেকে আমাদের পরিষেবা স্থাপনের উপর ফোকাস করব
আসুন আমাদের স্থাপনার ফাইল (.github/workflows/deploy.yml) সেট আপ করি।
name: Build and Deploy to Google Compute Engine
on:
push:
branches:
- main
env:
PROJECT_ID: ${{ secrets.GCE_PROJECT }}
GCE_INSTANCE: ${{ secrets.GCE_INSTANCE }}
GCE_INSTANCE_ZONE: us-central1-a
BUCKET_NAME: demo-configurations
PUBSUB_TOPIC: demo-configurations-bucket-notifications
TOPIC_SUBSCRIPTION: demo-bucket-changes-subscription
jobs:
setup-build-publish-deploy:
name: Setup, Build, Publish, and Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
# Setup gcloud CLI
- uses: google-github-actions/setup-gcloud@master
with:
version: '290.0.1'
service_account_key: ${{ secrets.GCE_SA_KEY }}
project_id: ${{ secrets.GCE_PROJECT }}
# Configure Docker to use the gcloud command-line tool as a credential
# helper for authentication
- run: |-
gcloud --quiet auth configure-docker
# Build the Docker image
- name: Build
run: |-
docker build --tag "gcr.io/$PROJECT_ID/$GCE_INSTANCE-image:$GITHUB_SHA" .
# Push the Docker image to Google Container Registry
- name: Publish
run: |-
docker push "gcr.io/$PROJECT_ID/$GCE_INSTANCE-image:$GITHUB_SHA"
- name: Deploy
run: |-
gcloud compute instances update-container "$GCE_INSTANCE" \
--zone "$GCE_INSTANCE_ZONE" \
--container-image "gcr.io/$PROJECT_ID/$GCE_INSTANCE-image:$GITHUB_SHA" \
--container-env "BUCKET_NAME=$BUCKET_NAME,PUBSUB_TOPIC=$PUBSUB_TOPIC,TOPIC_SUBSCRIPTION=$TOPIC_SUBSCRIPTION"
মনে রাখবেন যে --container-env
পতাকাটি স্থাপনা পর্যায়ে সেট করা হয়, যা নিশ্চিত করে যে আমরা গিটহাব অ্যাকশন সিক্রেটস থেকে একটি নিরাপদ ফ্যাশনে কন্টেইনারে প্রয়োজনীয় পরিবেশের ভেরিয়েবল পাস করি।
সিক্রেটস এবং এনভায়রনমেন্ট ভেরিয়েবল
এরপরে, আমরা গিথুব অ্যাকশনের জন্য সিক্রেট সেট আপ করব।
আমরা --container-env
দিয়ে আমাদের কন্টেইনারের জন্য পরিবেশের ভেরিয়েবল সেট করি পতাকা যেহেতু আমরা এটিকে Github অ্যাকশন থেকে সেট করছি, তাই আমরা হয় সংবেদনশীল ডেটার জন্য সিক্রেট ব্যবহার করতে পারি অথবা অ-সংবেদনশীল ডেটার জন্য env ভেরিয়েবল ব্যবহার করতে পারি৷
GCP সম্পদ তৈরি করা
আসুন GCP কনসোলে একটি বালতি তৈরি করি।
আমরা GCP কনসোলে একটি PubSub বিষয়ও তৈরি করব।
ক্লাউড স্টোরেজ বাকেটের পরিষেবা এজেন্ট সেট করুন - IAM ভূমিকা - pubsub.publisher
কনসোলে প্রতিটি প্রজেক্টের একটি সম্পর্কিত ক্লাউড স্টোরেজ পরিষেবা অ্যাকাউন্ট রয়েছে যা কিছু ব্যাকগ্রাউন্ড অ্যাকশনের জন্য দায়ী, যেমন PubSub বিজ্ঞপ্তি। এটি কিভাবে খুঁজে পেতে হয় তা জানতে এখানে ক্লিক করুন৷
অবশেষে, আমরা GCP কনসোলে একটি সাবস্ক্রিপশন তৈরি করি।
ভয়লা ! 🎉 আমাদের ক্লাউড ফাংশন সফলভাবে স্থাপন করা হয়েছে।
উপসংহার
আপনি যদি এটি এতদূর তৈরি করে থাকেন তবে আপনি একটি কুকি প্রাপ্য 🍪। আমি মনে করি এটি অর্জন করা একাধিক অপ্টিমাইজেশন সহ একটি সম্ভাব্য দুর্দান্ত সমাধানের প্রথম সংস্করণ। উদাহরণস্বরূপ, আমরা নিম্নলিখিতগুলি অর্জন করতে পারি:
- ব্ল্যাকবক্স_এক্সপোর্টারকে একাধিক অঞ্চল সমর্থন করার জন্য একটি সার্ভারহীন ফাংশন হিসাবে স্থাপন করুন, যা আপটাইম নিরীক্ষণের জন্য আদর্শ, এবং ক্লাউড স্টোরেজে বালতি কনফিগারেশন আপডেট করার জন্য দায়ী একটি মাস্টার সার্ভার স্থাপন করুন৷
- সম্ভবত, পূর্ববর্তী পয়েন্ট থেকে, আমরা এটিকে একটি অ্যাপে বিমূর্ত করতে পারি যা একই কার্যকারিতা অর্জনের জন্য জনপ্রিয় ক্লাউড প্রদানকারীদের সাথে সংহত করে, তাই এটিকে ক্লাউড-অজ্ঞেয়বাদী করে তোলে। P.S:জনপ্রিয় ক্লাউড প্রদানকারীরা (GCP, AWS, এবং Azure) সমস্ত পরিষেবা জুড়ে একই কার্যকারিতা প্রদান করে৷
-
পরবর্তী নিবন্ধে, আমরা ক্লাউড-স্টোরেজ অবজেক্ট সংস্করণের সাথে রোলব্যাক প্রদানের জন্য এই সমাধানটি তৈরি করব, যা আমাদেরকে ভুল আপডেটের সাথে কনফিগারেশন আপডেট করা থেকে পুনরুদ্ধার করতে সক্ষম করবে।
-
ডকারের সাথে মোতায়েন করা আমাদের জন্য প্যাকেজিং সমস্যার সমাধান করে, তবে আপনি ইতিমধ্যেই জানেন, পরিষেবাগুলি প্যাকেজ করার বিভিন্ন উপায় রয়েছে। আমি সরলতার জন্য এই নিবন্ধে ডকারকে বেছে নিয়েছি।
শব্দকোষ
- প্রমিথিউস একটি ওপেন সোর্স সিস্টেম মনিটরিং এবং সতর্ককারী টুলকিট। এটিতে এমন একটি সার্ভার রয়েছে যা টাইম-সিরিজ ডেটা স্ক্র্যাপ করে এবং সঞ্চয় করে, অ্যাপ্লিকেশন কোড যন্ত্রের জন্য ক্লায়েন্ট লাইব্রেরি এবং সতর্কতাগুলি পরিচালনা করার জন্য একটি সতর্কতা পরিচালক৷
- গ্রাফানা একটি ভিজ্যুয়ালাইজেশন সিস্টেম যা আপনাকে আপনার মেট্রিকগুলিকে জিজ্ঞাসা করতে, ভিজ্যুয়ালাইজ করতে, সতর্ক করতে এবং বুঝতে দেয়, সেগুলি যেখানেই সংরক্ষিত থাকুক না কেন৷
- ব্ল্যাকবক্স এক্সপোর্টার এইচটিটিপি, এইচটিটিপিএস, ডিএনএস, টিসিপি, এবং আইসিএমপি-এর উপর এন্ডপয়েন্ট পরীক্ষা করার জন্য প্রমিথিউস টিম দ্বারা নির্মিত একটি ওপেন-সোর্স টুল৷