কম্পিউটার

GCE, ক্লাউড স্টোরেজ, এবং PubSub এর সাথে রুবিতে একটি আপটাইম মনিটরিং সিস্টেম তৈরি করুন

আপটাইম পর্যবেক্ষণে ওয়েবসাইট, 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 স্থাপনার পাশাপাশি স্থাপন করা উচিত. সম্পূর্ণ সেটআপ নিম্নলিখিত মত দেখায়:

GCE, ক্লাউড স্টোরেজ, এবং PubSub এর সাথে রুবিতে একটি আপটাইম মনিটরিং সিস্টেম তৈরি করুন

ব্ল্যাকবক্স র‍্যাপার সমস্ত কনফিগার করা শেষ পয়েন্টগুলি অনুসন্ধান করে এবং প্রমিথিউস অন্য যে কোনও লক্ষ্যের মতো রপ্তানিকারককে স্ক্র্যাপ করে। তারপরে, গ্রাফানা প্রমিথিউস থেকে গ্রাফ করার জন্য ডেটা পুনরুদ্ধার করে। আমরা blackbox_exporter --config.file blackbox.yml এর মত এক্সপোর্টার বাইনারি চালাই . ব্ল্যাকবক্স এক্সপোর্টার আমাদের বাইনারি বন্ধ না করে এবং পুনরায় চালু না করে একটি নতুন কনফিগারেশন সহ রপ্তানিকারককে লাইভ রিলোড করার অনুমতি দেয়। সেকেন্ডে পরিমাপ করা ব্যবধানের সাথে এন্ডপয়েন্ট স্ক্র্যাপ করার সময় এটি খুব কার্যকর হতে পারে।

BlackboxWrapper পরিষেবার বৈশিষ্ট্য

কোডের গভীরে ডাইভ করার আগে, আসুন পরিষেবার বৈশিষ্ট্যগুলি হাইলাইট করি:

  • BlackboxWrapper পরিষেবা দুটি প্রক্রিয়া চালাবে৷
    • প্রথম প্রক্রিয়া blackbox_exporter চালায় বাইনারি।
    • দ্বিতীয় প্রক্রিয়া GCP থেকে বালতি পরিবর্তনের জন্য শোনে এবং প্রথম প্রক্রিয়াটি পুনরায় চালু করে।
  • পরিষেবাটি একটি ডকার ইমেজ হিসাবে স্থাপন করা হবে, যা আমাদেরকে blackbox_exporter এর পাশাপাশি পরিষেবাটি প্যাকেজ করতে সক্ষম করবে বাইনারি।

GCE, ক্লাউড স্টোরেজ, এবং PubSub এর সাথে রুবিতে একটি আপটাইম মনিটরিং সিস্টেম তৈরি করুন

আসুন বিল্ডিং শুরু করি

প্রথমে, একটি অ্যাপ ডিরেক্টরি তৈরি করুন এবং তারপরে ডিরেক্টরিতে প্রবেশ করুন৷

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 পতাকাটি স্থাপনা পর্যায়ে সেট করা হয়, যা নিশ্চিত করে যে আমরা গিটহাব অ্যাকশন সিক্রেটস থেকে একটি নিরাপদ ফ্যাশনে কন্টেইনারে প্রয়োজনীয় পরিবেশের ভেরিয়েবল পাস করি।

সিক্রেটস এবং এনভায়রনমেন্ট ভেরিয়েবল

এরপরে, আমরা গিথুব অ্যাকশনের জন্য সিক্রেট সেট আপ করব।

GCE, ক্লাউড স্টোরেজ, এবং PubSub এর সাথে রুবিতে একটি আপটাইম মনিটরিং সিস্টেম তৈরি করুন

আমরা --container-env দিয়ে আমাদের কন্টেইনারের জন্য পরিবেশের ভেরিয়েবল সেট করি পতাকা যেহেতু আমরা এটিকে Github অ্যাকশন থেকে সেট করছি, তাই আমরা হয় সংবেদনশীল ডেটার জন্য সিক্রেট ব্যবহার করতে পারি অথবা অ-সংবেদনশীল ডেটার জন্য env ভেরিয়েবল ব্যবহার করতে পারি৷

GCP সম্পদ তৈরি করা

আসুন GCP কনসোলে একটি বালতি তৈরি করি।

GCE, ক্লাউড স্টোরেজ, এবং PubSub এর সাথে রুবিতে একটি আপটাইম মনিটরিং সিস্টেম তৈরি করুন

আমরা GCP কনসোলে একটি PubSub বিষয়ও তৈরি করব।

GCE, ক্লাউড স্টোরেজ, এবং PubSub এর সাথে রুবিতে একটি আপটাইম মনিটরিং সিস্টেম তৈরি করুন

ক্লাউড স্টোরেজ বাকেটের পরিষেবা এজেন্ট সেট করুন - IAM ভূমিকা - pubsub.publisher কনসোলে প্রতিটি প্রজেক্টের একটি সম্পর্কিত ক্লাউড স্টোরেজ পরিষেবা অ্যাকাউন্ট রয়েছে যা কিছু ব্যাকগ্রাউন্ড অ্যাকশনের জন্য দায়ী, যেমন PubSub বিজ্ঞপ্তি। এটি কিভাবে খুঁজে পেতে হয় তা জানতে এখানে ক্লিক করুন৷

GCE, ক্লাউড স্টোরেজ, এবং PubSub এর সাথে রুবিতে একটি আপটাইম মনিটরিং সিস্টেম তৈরি করুন

অবশেষে, আমরা GCP কনসোলে একটি সাবস্ক্রিপশন তৈরি করি।

GCE, ক্লাউড স্টোরেজ, এবং PubSub এর সাথে রুবিতে একটি আপটাইম মনিটরিং সিস্টেম তৈরি করুন

ভয়লা ! 🎉 আমাদের ক্লাউড ফাংশন সফলভাবে স্থাপন করা হয়েছে।

উপসংহার

আপনি যদি এটি এতদূর তৈরি করে থাকেন তবে আপনি একটি কুকি প্রাপ্য 🍪। আমি মনে করি এটি অর্জন করা একাধিক অপ্টিমাইজেশন সহ একটি সম্ভাব্য দুর্দান্ত সমাধানের প্রথম সংস্করণ। উদাহরণস্বরূপ, আমরা নিম্নলিখিতগুলি অর্জন করতে পারি:

  • ব্ল্যাকবক্স_এক্সপোর্টারকে একাধিক অঞ্চল সমর্থন করার জন্য একটি সার্ভারহীন ফাংশন হিসাবে স্থাপন করুন, যা আপটাইম নিরীক্ষণের জন্য আদর্শ, এবং ক্লাউড স্টোরেজে বালতি কনফিগারেশন আপডেট করার জন্য দায়ী একটি মাস্টার সার্ভার স্থাপন করুন৷
  • সম্ভবত, পূর্ববর্তী পয়েন্ট থেকে, আমরা এটিকে একটি অ্যাপে বিমূর্ত করতে পারি যা একই কার্যকারিতা অর্জনের জন্য জনপ্রিয় ক্লাউড প্রদানকারীদের সাথে সংহত করে, তাই এটিকে ক্লাউড-অজ্ঞেয়বাদী করে তোলে। P.S:জনপ্রিয় ক্লাউড প্রদানকারীরা (GCP, AWS, এবং Azure) সমস্ত পরিষেবা জুড়ে একই কার্যকারিতা প্রদান করে৷
  • পরবর্তী নিবন্ধে, আমরা ক্লাউড-স্টোরেজ অবজেক্ট সংস্করণের সাথে রোলব্যাক প্রদানের জন্য এই সমাধানটি তৈরি করব, যা আমাদেরকে ভুল আপডেটের সাথে কনফিগারেশন আপডেট করা থেকে পুনরুদ্ধার করতে সক্ষম করবে।

  • ডকারের সাথে মোতায়েন করা আমাদের জন্য প্যাকেজিং সমস্যার সমাধান করে, তবে আপনি ইতিমধ্যেই জানেন, পরিষেবাগুলি প্যাকেজ করার বিভিন্ন উপায় রয়েছে। আমি সরলতার জন্য এই নিবন্ধে ডকারকে বেছে নিয়েছি।

শব্দকোষ

  • প্রমিথিউস একটি ওপেন সোর্স সিস্টেম মনিটরিং এবং সতর্ককারী টুলকিট। এটিতে এমন একটি সার্ভার রয়েছে যা টাইম-সিরিজ ডেটা স্ক্র্যাপ করে এবং সঞ্চয় করে, অ্যাপ্লিকেশন কোড যন্ত্রের জন্য ক্লায়েন্ট লাইব্রেরি এবং সতর্কতাগুলি পরিচালনা করার জন্য একটি সতর্কতা পরিচালক৷
  • গ্রাফানা একটি ভিজ্যুয়ালাইজেশন সিস্টেম যা আপনাকে আপনার মেট্রিকগুলিকে জিজ্ঞাসা করতে, ভিজ্যুয়ালাইজ করতে, সতর্ক করতে এবং বুঝতে দেয়, সেগুলি যেখানেই সংরক্ষিত থাকুক না কেন৷
  • ব্ল্যাকবক্স এক্সপোর্টার এইচটিটিপি, এইচটিটিপিএস, ডিএনএস, টিসিপি, এবং আইসিএমপি-এর উপর এন্ডপয়েন্ট পরীক্ষা করার জন্য প্রমিথিউস টিম দ্বারা নির্মিত একটি ওপেন-সোর্স টুল৷

  1. রুবি দিয়ে কীভাবে পার্সার তৈরি করবেন

  2. SwiftUI এর সাথে কীভাবে ডিজাইন সিস্টেম তৈরি করবেন

  3. ক্লাউড টিউনআপ প্রো দিয়ে ইন্টারনেট কুকিজ এবং সিস্টেম রেজিস্ট্রি স্ক্যান করুন

  4. ক্লাউড স্টোরেজ:ডেটা সঞ্চয় এবং স্থানান্তরের ক্ষেত্রে উদ্ভাবন