এই মডিউল কী করে #
একটি ইনস্ট্যান্সের বলার মতো অনেক কিছু থাকে: fail2ban একটি IP ব্যান করেছে, aide সিস্টেমের একটি ফাইল বদলাতে দেখেছে, গত রাতের ব্যাকআপ ব্যর্থ হয়েছে, রুট ডিস্ক ৯৫ % ছুঁয়েছে। প্রতিটি মডিউল যদি নিজের মতো করে জানায় —এখানে একটি মেইল, ওখানে একটি লগ লাইন— তবে কেউই কিছু জানতে পারে না, আর দশটি ইনস্ট্যান্স হলে সমস্যাটি দশ গুণ হয়ে যায়।
global-alerts মডিউল হলো imaxe-এর কেন্দ্রীয় অ্যালার্ট বাস: একটিই কমান্ড যার ভেতর দিয়ে এই সব বিজ্ঞপ্তি যায়, আর একটিই গন্তব্য যেখানে সেগুলো পৌঁছায় — আপনার পুরো ফ্লিটের ভাগ করা একটি Amazon SNS টপিক। সেখান থেকে SNS আপনার ইচ্ছেমতো বিলি করে: মেইল, SMS, একটি Lambda ফাংশন, একটি SQS সারি, আপনার অন-কল ব্যবস্থা। প্রকাশ হয় ইনস্ট্যান্সের IAM রোল দিয়ে (sns:Publish অনুমতি), তাই কোনো ক্রেডেনশিয়াল সংরক্ষণের দরকার নেই। আর পাঠানোর আগেই শব্দ ছেঁকে ফেলে: তীব্রতার সীমা আপনার আগ্রহের স্তরে না পৌঁছানো সব কিছু বাদ দেয়, আর ডিডুপ্লিকেশন উইন্ডো একই অ্যালার্টকে চল্লিশবার আপনাকে জাগানো থেকে আটকায়।
SNS যদি না মেলে —নেটওয়ার্ক বন্ধ, রোলের এখনো অনুমতি নেই, রিজিয়নে পৌঁছানো যাচ্ছে না— অ্যালার্ট হারায় না: সেটি ডিস্কে সারিতে জমা হয় আর systemd-এর একটি টাইমার প্রতি ৫ মিনিটে আবার চেষ্টা করে।
আপনার দরকার একটি SNS টপিকের ARN (arn:aws:sns:রিজিয়ন:অ্যাকাউন্ট:টপিক) আর ইনস্ট্যান্সের সেখানে প্রকাশ করার ক্ষমতা। আপনি যদি লঞ্চার থেকে AMI চালু করে থাকেন, CloudFormation টেমপ্লেট আগেই টপিক তৈরি করে, আপনার মেইল সাবস্ক্রাইব করে, sns:Publishসহ IAM রোল বানায় এবং ARN ট্যাগ হিসেবে ইনস্ট্যান্সে পাঠায়: মডিউল নিজেই কনফিগার হয়ে যায় এবং এখানে করার কিছু থাকে না।
সাধারণ কাজ #
কী করতে চান বেছে নিন। প্রতিটি রেসিপিতে কমান্ড আগে থেকেই লেখা — ARN আর লেখাটা আপনার নিজেরটা দিয়ে বদলে কপি চাপুন।
1
SNS টপিক সেট করা
ইনস্ট্যান্সকে বলুন তার বিজ্ঞপ্তি কোথায় প্রকাশ করতে হবে।
ubuntu ব্যবহারকারী দিয়ে SSH-এ আপনার সার্ভারে যুক্ত হোন।
মডিউলটিকে আপনার টপিকের ARN-এ তাক করুন। রিজিয়ন ARN থেকেই বেরিয়ে আসে, তাই সাধারণত সেটি আলাদা করে বলার দরকার হয় না:
$ sudo imaxe global-alerts configure \
--topic-arn arn:aws:sns:eu-west-1:123456789012:imaxe-alertsএকই টপিকে একাধিক ইনস্ট্যান্স প্রকাশ করছে? --source দিয়ে প্রত্যেকটিকে চেনা যায় এমন উৎস-লেবেল দিন (ডিফল্টে hostname ব্যবহৃত হয়):
$ sudo imaxe global-alerts configure --source web-prod-1/etc/imaxe/global-alerts.yml-এ থাকে এবং পাঠানো চালু হয়ে যায়। এবার পরীক্ষামূলক অ্যালার্ট পাঠানো রেসিপিতে যান।2
পরীক্ষামূলক অ্যালার্ট পাঠানো
চ্যানেলে ভরসা করার আগে দেখে নিন IAM রোল সত্যিই প্রকাশ করে কি না।
কনফিগার করা টপিকে একটি পরীক্ষামূলক অ্যালার্ট প্রকাশ করুন:
$ sudo imaxe global-alerts testপরীক্ষাটি সীমা আর ডিডুপ্লিকেশন এড়িয়ে যায় —এটি সবসময়ই বেরোয়— আর কিছু ব্যর্থ হলে নিঃশব্দে সারিতে না রেখে আপনাকে AWS-এর আসল ত্রুটি ফিরিয়ে দেয়। টপিকে সাবস্ক্রাইব করা ঠিকানার ইনবক্স দেখুন (আর স্প্যাম ফোল্ডারও)।
MessageId দেখেন এবং বিজ্ঞপ্তি পৌঁছায়, চ্যানেলটি কাজ করছে। AuthorizationError এলে বুঝবেন ওই টপিকে ইনস্ট্যান্সের sns:Publish অনুমতি নেই।3
স্ক্রিপ্ট থেকে অ্যালার্ট পাঠানো
মডিউলগুলো যে চ্যানেল ব্যবহার করে, সেটিই আপনার নিজের কাজেও।
নিজস্ব তীব্রতা আর উৎসসহ একটি অ্যালার্ট:
$ sudo imaxe global-alerts send --severity critical \
--source backup --subject "ব্যাকআপ ব্যর্থ" \
"ডেটাবেসের রাতের ব্যাকআপ ত্রুটিসহ শেষ হয়েছে"লেখাটি অন্য কোনো কমান্ড তৈরি করলে, বার্তার জায়গায় - দিয়ে সেটি stdin দিয়ে পাঠান:
$ df -h / | sudo imaxe global-alerts send --severity warning -কয়েক মিনিট পরপর চলে এমন কিছুতে একটি স্থিতিশীল ডিডুপ্লিকেশন কী দিন: কনফিগার করা উইন্ডোর মধ্যে কেবল প্রথমটিই বেরোবে:
$ sudo imaxe global-alerts send --severity warning \
--dedup-key root-disk-full "রুট ডিস্ক ৯৫% এ"--dedup-key ছাড়া মডিউল উৎস + তীব্রতা + বিষয় থেকে একটি কী বানিয়ে নেয়।4
বাসের অবস্থা দেখা
টপিক, রিজিয়ন, AWS-এর CLI আর অপেক্ষমাণ অ্যালার্ট — এক নজরে।
বর্তমান অবস্থার সারসংক্ষেপ:
$ sudo imaxe global-alerts statusআসলে কোন কনফিগারেশনটি কার্যকর তা যাচাই করতে —ইনস্ট্যান্সের ট্যাগ থেকে আসা অংশসহ, যেটির অগ্রাধিকার ফাইলের চেয়ে বেশি—:
$ sudo imaxe global-alerts show
$ sudo imaxe global-alerts status --json--json দিলে সেটি সরাসরি কোনো প্যানেল বা স্ক্রিপ্টে ব্যবহারের উপযোগী।5
শব্দ কমানো
তীব্রতার সীমা বাড়ান আর ডিডুপ্লিকেশন উইন্ডো প্রশস্ত করুন।
শুধু গুরুত্বপূর্ণটুকু জানতে চাইলে warning-এর নিচের সব বাদ দিন:
$ sudo imaxe global-alerts configure --min-severity warningডিডুপ্লিকেশন উইন্ডোর কোনো ফ্ল্যাগ নেই: সেটি কনফিগারেশন ফাইলে ঠিক করা হয়। একই অ্যালার্ট বারবার এলে সেটি বাড়িয়ে দিন:
dedup_window: 1h # 30s, 5m, 1h… (ডিফল্ট 5m)test তবু সবসময় প্রকাশ করে, তাই চ্যানেল যাচাইয়ের উপায়টি আপনার হাতেই থাকে।6
সারি দেখা ও আবার পাঠানো
SNS সাড়া না দিলে কী বাকি থেকে গেল, আর কীভাবে পাঠাতে বাধ্য করবেন।
দেখুন কী অপেক্ষমাণ আর সাম্প্রতিক পাঠানো কী-গুলো কী:
$ sudo imaxe global-alerts historyপুনঃচেষ্টা systemd-এর টাইমার প্রতি ৫ মিনিটে এমনিতেই করে, তবে অনুমতি বা নেটওয়ার্ক ঠিক করার পর আপনি সেটি জোর করেও চালাতে পারেন:
$ sudo imaxe global-alerts flush
$ systemctl status imaxe-global-alerts-flush.timer7
মডিউল নিঃশব্দ করা
কনফিগারেশন না হারিয়ে প্রকাশ করা বন্ধ করুন।
অ্যালার্ট পাঠানো নিষ্ক্রিয় করুন এবং পুনঃচেষ্টার টাইমার সরিয়ে দিন:
$ sudo imaxe global-alerts removeটপিক, রিজিয়ন আর বাকি সেটিংস ফাইলেই থেকে যায়: আবার চালু করতে একটি configure-ই যথেষ্ট, সেটিই মডিউলটিকে পুনরায় সক্রিয় করে।
send-গুলো ব্যর্থ হয় না: stderr-এ জানিয়ে দেয় যে মডিউল নিষ্ক্রিয় এবং কোড 0 নিয়ে শেষ হয়।মডিউলটি ইনস্ট্যান্সের রোলের ক্রেডেনশিয়াল দিয়ে প্রকাশ করে, সংরক্ষিত কী দিয়ে নয়। রোল যদি ওই টপিকে sns:Publish অনুমতি না দেয়, অ্যালার্ট একের পর এক সারিতে জমতে থাকবে আর কখনোই পৌঁছাবে না। একটি imaxe global-alerts test সঙ্গে সঙ্গে তা জানিয়ে দেয়, আর AWS যেভাবে ত্রুটি ফেরত দেয় ঠিক সেভাবেই দেখায়।
সংক্ষিপ্তসার #
imaxe global-alerts <সাবকমান্ড> [--topic-arn ARN] [--severity স্তর] [ফ্ল্যাগ]সব সাবকমান্ডের root অধিকার লাগে (sudo ব্যবহার করুন), কারণ সেগুলো /etc/imaxe/-এ লেখে, অবস্থা /var/lib/imaxe/-এ রাখে এবং একটি systemd ইউনিট সামলায়। সামলানোর মতো কোনো গোপন তথ্য নেই: প্রকাশ হয় ইনস্ট্যান্সের IAM রোল দিয়ে। মেশিন-পাঠযোগ্য আউটপুট পেতে status, show, history বা flush-এর সঙ্গে --json যোগ করুন।
সাবকমান্ড #
| সাবকমান্ড | কী করে | প্রাসঙ্গিক ফ্ল্যাগ |
|---|---|---|
| status | অবস্থা: কনফিগার করা টপিক, কার্যকর রিজিয়ন, AWS-এর CLI আছে কি না, আর সারিতে থাকা অ্যালার্ট। | --json |
| configure | SNS টপিক আর পাঠানোর অপশন ঠিক করে। মডিউল নিষ্ক্রিয় থাকলে আবার সক্রিয় করে। | --topic-arn, --region, --source, --min-severity |
| send | একটি অ্যালার্ট প্রকাশ করে। অপারেটর ও বাকি মডিউলগুলো এই চ্যানেলই ব্যবহার করে। | --severity, --source, --subject, --dedup-key |
| test | সীমা ও ডিডুপ্লিকেশন এড়িয়ে পরীক্ষামূলক অ্যালার্ট প্রকাশ করে, আর ব্যর্থ হলে আসল ত্রুটি জানায়। | --severity |
| show | কার্যকর কনফিগারেশন দেখায় (ফাইল + আগে থেকে প্রয়োগ হওয়া ইনস্ট্যান্স ট্যাগ)। | --json |
| history | সারিতে অপেক্ষমাণ অ্যালার্ট আর সম্প্রতি পাঠানো ডিডুপ্লিকেশন কী। | --json |
| flush | সারিতে থাকা অ্যালার্ট আবার পাঠায়। systemd টাইমারও এটিই চালায়। | --json |
| remove | পাঠানো নিষ্ক্রিয় করে আর টাইমার সরায়। কনফিগারেশন রেখে দেয়। | — |
আর্গুমেন্ট ও ফ্ল্যাগ #
| ফ্ল্যাগ | ধরন | ডিফল্ট | বিবরণ |
|---|---|---|---|
| --topic-arn আবশ্যক | string | — | গন্তব্য SNS টপিকের ARN (arn:aws:sns:রিজিয়ন:অ্যাকাউন্ট:টপিক)। এটি ছাড়া মডিউল প্রকাশ করতে পারে না। |
| --region | string | ARN থেকে | AWS রিজিয়ন। না দিলে টপিকের ARN থেকে বের করা হয়; তাতেও না হলে IMDS বা AWS_REGION থেকে। |
| --source | string | hostname | উৎস লেবেল। configure-এ ইনস্ট্যান্সের; send-এ ওই নির্দিষ্ট অ্যালার্টের (যেমন যে মডিউল সেটি পাঠাচ্ছে)। |
| --min-severity | string | info | সীমা: এই স্তরের নিচের অ্যালার্ট বাদ দেয়। মান: info, warning, critical। |
| --severity | string | info | send/test-এ: এই অ্যালার্টের স্তর। সংক্ষিপ্ত রূপ warn ও crit-ও চলে। |
| --subject | string | বার্তা থেকে | সংক্ষিপ্ত বিষয়। না দিলে বার্তা থেকেই বের করে নেওয়া হয়। |
| --dedup-key | string | স্বয়ংক্রিয় | ডিডুপ্লিকেশন কী: dedup_window-এর ভেতরের পুনরাবৃত্তি চেপে দেয়। ডিফল্টে উৎস + তীব্রতা + বিষয় দিয়ে হিসাব হয়। |
| <বার্তা> আবশ্যক | পজিশনাল | — | send-এ: অ্যালার্টের লেখা, অথবা stdin থেকে পড়তে -। |
| --json | bool | false | status, show, history ও flush-এ ফলাফল JSON হিসেবে stdout-এ দেয়। |
যখন কোনো অ্যালার্ট বাদ পড়ে —মডিউল নিষ্ক্রিয়, তীব্রতা সীমার নিচে, বা উইন্ডোর ভেতরে পুনরাবৃত্তি— তখন send সেটি stderr-এ ব্যাখ্যা করে এবং কোড 0 নিয়ে শেষ হয়। এতে যে স্ক্রিপ্ট সেটি পাঠিয়েছিল, সে আপনারই বসানো একটি ফিল্টারের কারণে ভেঙে পড়ে না।
ইনস্ট্যান্স ট্যাগ দিয়ে কনফিগারেশন #
প্রতিটি ডিপ্লয়মেন্টকে তার নিজের টপিকে তাক করতে হয়, আর সেজন্য AMI নতুন করে বানানোর কোনো মানে হয় না। তাই মডিউলটি ফাইল ছাড়াও imaxe.global-alerts. উপসর্গযুক্ত ইনস্ট্যান্স ট্যাগ IMDSv2 দিয়ে পড়ে: সেগুলো থাকলে তারা YAML-এর চেয়ে অগ্রাধিকার পায়। লঞ্চারের CloudFormation টেমপ্লেট ঠিক এটিই করে, আর সেগুলো পড়া যাওয়ার জন্য সে MetadataOptions.InstanceMetadataTags: enabled-ও দাবি করে।
| ট্যাগ | সমতুল্য | মান |
|---|---|---|
| imaxe.global-alerts.topic_arn | topic_arn | গন্তব্য SNS টপিকের ARN। |
| imaxe.global-alerts.region | region | AWS রিজিয়ন; ফাঁকা = ARN বা IMDS থেকে বের করা হয়। |
| imaxe.global-alerts.source | source | উৎস লেবেল; ফাঁকা = hostname। |
| imaxe.global-alerts.min_severity | min_severity | info · warning · critical |
| imaxe.global-alerts.dedup_window | dedup_window | সময়কাল: 30s, 5m, 1h… |
| imaxe.global-alerts.enabled | enabled | true/false (1/0, yes/no, on/off-ও চলে)। |
AWS-এর বাইরে, বা IMDS বন্ধ থাকলে, পড়াটি মিলিসেকেন্ডে ব্যর্থ হয় আর মডিউল ফাইলে যা লেখা তাই নিয়ে চলতে থাকে। সত্যিই কী কার্যকর হলো দেখতে imaxe global-alerts show।
ফাইল ও পাথ #
| পাথ | বিষয়বস্তু |
|---|---|
| /etc/imaxe/global-alerts.yml | মডিউলের কনফিগারেশন: টপিক, রিজিয়ন, উৎস, সীমা আর ডিডুপ্লিকেশন উইন্ডো। |
| /var/lib/imaxe/state/global-alerts/spool/ | অপেক্ষমাণ অ্যালার্টের সারি, প্রতিটি আলাদা .json ফাইলে, সময়ের ক্রমে। |
| /var/lib/imaxe/state/global-alerts/sent.json | ডিডুপ্লিকেশন কী-গুলোর রেকর্ড, শেষ পাঠানোর সময়সহ। |
| /etc/systemd/system/imaxe-global-alerts-flush.timer | পুনঃচেষ্টার টাইমার: বুটের ২ মিনিট পরে শুরু হয় আর প্রতি ৫ মিনিটে পুনরাবৃত্তি করে। |
global-alerts.yml-এর উদাহরণ:
enabled: true
topic_arn: arn:aws:sns:eu-west-1:123456789012:imaxe-alerts
region: "" # ফাঁকা = ARN বা IMDS থেকে বের করা হয়
source: "" # ফাঁকা = ইনস্ট্যান্সের hostname
min_severity: info
dedup_window: 5mঅবস্থা (সারি আর ডিডুপ্লিকেশন রেকর্ড) ইচ্ছে করেই /var/lib/imaxe/-এ থাকে, /etc/-এ নয়: এটি অবস্থা, কনফিগারেশন নয়। দুটি পাথই IMAXE_CONFIG_DIR আর IMAXE_STATE_DIR পরিবেশ চলক দিয়ে সরানো যায়।
অ্যালার্টের ফরম্যাট #
SNS বার্তার মূল অংশ সংস্করণযুক্ত JSON (schema: 1), যাতে সাবস্ক্রাইবার সেটি মেইলে পড়া ছাড়াও কোনো Lambda বা সারি দিয়ে সামলাতে পারে:
{
"schema": 1,
"severity": "critical",
"source": "backup",
"subject": "ব্যাকআপ ব্যর্থ",
"message": "ডেটাবেসের রাতের ব্যাকআপ ত্রুটিসহ শেষ হয়েছে",
"host": "web-prod-1",
"instance_id": "i-0abc123def4567890",
"region": "eu-west-1",
"ts": "2026-07-25T03:14:07Z",
"dedup_key": "9f2c1b7e44a0d513"
}SNS বার্তার বিষয় তৈরি হয় [imaxe][তীব্রতা] host: বিষয় এভাবে, ছাপযোগ্য ASCII-তে পরিষ্কার করে ১০০ অক্ষরে কেটে দেওয়া হয় — এটিই SNS-এর সীমা।
এক্সিট কোড ও লগ #
প্রতিবার চালানোর পর একটি কোড ফেরত আসে, যা echo $? দিয়ে দেখা যায় — স্ক্রিপ্টে শৃঙ্খল বানাতে কাজে লাগে:
মডিউলটি imaxe-এর স্বাস্থ্য পরীক্ষারও জবাব দেয়: সক্রিয় অথচ টপিক না থাকলে health ব্যর্থ হয়, ফলে প্রথম অ্যালার্টের দরকার পড়ার আগেই একটি imaxe health ব্যাপারটা ধরিয়ে দেয়।
$ sudo imaxe global-alerts test; echo "এক্সিট: $?"
$ journalctl -u imaxe-global-alerts-flush.service -n 50সমস্যা সমাধান #
| লক্ষণ | সম্ভাব্য কারণ | সমাধান |
|---|---|---|
| NO TOPIC আসে (কোড 64) | ফাইলেও টপিকের ARN নেই, ট্যাগেও নেই। | configure --topic-arn … চালান, অথবা দেখুন ইনস্ট্যান্সে imaxe.global-alerts.topic_arn ট্যাগ আছে কি না এবং মেটাডেটায় ট্যাগ চালু আছে কি না। |
| বারবার «SNS নেই; অ্যালার্ট সারিতে» | ইনস্ট্যান্সের রোলে ওই টপিকে sns:Publish নেই, অথবা ARN অন্য অ্যাকাউন্ট বা রিজিয়নের। | AWS-এর সঠিক ত্রুটি দেখতে test চালান, রোলের পলিসি ঠিক করুন, তারপর flush। |
| status-এ «aws CLI আছে: false» | ইনস্ট্যান্সে AWS-এর CLI ইনস্টল করা নেই; মডিউল সেটির মাধ্যমেই প্রকাশ করে। | AWS-এর CLI ইনস্টল করুন। imaxe-এর AMI-তে সেটি আগে থেকেই থাকে; নিজের হোস্টে যোগ করে নিতে হয়। |
| আপনি কিছু কনফিগার করেন আর show তবু অন্য মান দেখায় | কোনো imaxe.global-alerts.* ট্যাগ ফাইলটিকে ছাপিয়ে যাচ্ছে: নকশা অনুযায়ীই তার অগ্রাধিকার। | YAML-এর বদলে ইনস্ট্যান্সের ট্যাগ (বা CloudFormation স্ট্যাকের প্যারামিটার) বদলান। |
| একই রকম কয়েকটি অ্যালার্টের কেবল প্রথমটি আসে | ডিডুপ্লিকেশন উইন্ডো সেগুলো চেপে দিচ্ছে। | এটিই প্রত্যাশিত। dedup_window কমান, অথবা সেগুলো সত্যিই আলাদা ঘটনা হলে আলাদা --dedup-key ব্যবহার করুন। |
| কিছুই আসে না, ত্রুটিও নেই | মডিউল নিষ্ক্রিয়, অথবা তীব্রতা min_severity-এর নিচে। | show আপনাকে enabled আর সীমা দেখায়; configure পাঠানো আবার চালু করে। |
| অ্যালার্ট প্রকাশ হয় কিন্তু মেইলে পৌঁছায় না | SNS টপিকের সাবস্ক্রিপশন নিশ্চিত করা হয়নি। | AWS-এর নিশ্চিতকরণ মেইলটি খুঁজুন (স্প্যাম দেখুন) আর SNS কনসোলে সাবস্ক্রিপশন গ্রহণ করুন। |
অ্যালার্ট মডিউল নিয়ে আটকে গেছেন?
«imaxe <module> status --json» এর আউটপুট সহ আমাদের লিখুন, আমরা দ্রুত উত্তর দেব।