[AWS] health status ๊ตฌ๋…ํ•˜๊ธฐ

AWS๋Š” ์—ฌํƒ€ ์ธํ”„๋ผ ์„œ๋น„์Šค๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ—ฌ์Šค์ฒดํฌ์šฉ ์ฝ˜์†”์„ ์ œ๊ณตํ•œ๋‹ค.

์•„๋ž˜ ๋งํฌ์— ๋“ค์–ด๊ฐ€๋ฉด ๊ธ€๋กœ๋ฒŒ ์žฅ์• ๋‚˜ ์—…๋ฐ์ดํŠธ, ํ˜น์€ ๋‚ด ๊ณ„์ •์—์„œ ๋ฐœ์ƒํ•œ ํŠน์ˆ˜ํ•œ ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
https://health.aws.amazon.com/health/status

๊ฐ€๋” ๋“ค์–ด๊ฐ€์„œ ๋ญ”์ผ ์—†๋‚˜ ํ™•์ธํ•ด๋ณด๋ฉด ๋œ๋‹ค.

๊ทผ๋ฐ ์ด๊ฑธ ๋งค๋ฒˆ ๋“ค์–ด๊ฐ€์„œ ๋ณด๋Š” ๊ฒƒ๋„ ์ผ์ด๊ณ , ์ œ๋Œ€๋กœ ํ™œ์šฉ์„ ํ•˜๋ ค๋ฉด ์•Œ๋ฆผ์ด ์˜ค๊ฒŒ ํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.

AWS๋Š” ์ด๊ฑฐ์— ๋Œ€ํ•œ ๋ญ”๊ฐ€ ๊ตฌ๋…์ฒด๊ณ„๊ฐ€ ์ฉ ์ž˜ ๋˜์–ด์žˆ์ง€๋Š” ์•Š์•„์„œ ์ง์ ‘ ๊ตฌํ˜„์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
GCP๊ฐ€ RSS ํ”ผ๋“œ ํ˜•ํƒœ๋กœ ๊ตฌ๋…๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ์ƒ๋ฐ˜๋œ๋‹ค.

aws ์ƒํƒœ ์•Œ๋ฆผ์€ aws ์ž์ฒด์˜ ์ด๋ฒคํŠธ๋กœ ์ˆ˜์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ทธ๋ž˜์„œ eventbridge๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.




Slack ๊ตฌ๋… ์‹œ์Šคํ…œ ๊ตฌํ˜„

๋‚˜๋Š” ์Šฌ๋ž™ ์›นํ›…์„ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ ์Šฌ๋ž™ ํ†ตํ•ฉ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.
Lambda ํ•˜๋‚˜ ํŒŒ๊ณ , ์ ๋‹นํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•œ๋‹ค.

const axios = require('axios');

// ์Šฌ๋ž™ ์›นํ›… ๋งํฌ
const SLACK_URL = `https://hooks.slack.com/services/...`;

exports.handler = async (event) => {
    console.log(event);
    const detail = event?.detail;

    const status = detail?.statusCode;
    const region = event?.region;
    const service = detail?.service
    const description = detail?.eventDescription?.[0]?.latestDescription;

    const attachments = [
        {
            "color": "#ff0000",
            "pretext": "AWS ์ƒํƒœ ์•Œ๋ฆผ",
            "title": "Status ์ฝ˜์†” ์ด๋™",
            "title_link": "https://health.aws.amazon.com/health/status",
            "text": "AWS ์ƒํƒœ ์•Œ๋ฆผ",    
            "fields": [
                {
                    "title": "์ƒํƒœ",
                    "value": status,
                    "short": false
                },
                {
                    "title": "์„œ๋น„์Šค",
                    "value": service,
                    "short": false
                },
                {
                    "title": "๋ฆฌ์ „",
                    "value": region,
                    "short": false
                },
                {
                    "title": "๋‚ด์šฉ",
                    "value": description,
                    "short": false
                },
            ],
        }
    ];

   await axios.post(SLACK_URL, {
		username: 'Amazon Cloud Service Health Updates',
		attachments,
		channel: '์ฑ„๋„ID',
	});

    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

๋ฐ›์•„์„œ ์ ๋‹นํžˆ ํŒŒ์‹ฑํ•˜๊ณ  ์Šฌ๋ž™์— ์ด์ฃผ๋Š” ๋กœ์ง์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  eventbridge ๊ทœ์น™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฑธ์–ด์ค€๋‹ค.

์†Œ์Šค๋Š” aws.health๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๊ธˆ ๋งŒ๋“  ๋žŒ๋‹ค๋ฅผ ๊ฑธ์–ด์ฃผ๋ฉด ๋์ด๋‹ค.

์ด๊ฒŒ ์ด๋ฒคํŠธ ๋ฐœํ–‰์ž๊ฐ€ ๋‚ด๊ฐ€ ์•„๋‹ˆ๋ผ aws๋ผ์„œ ์‹ค์ œ ํ…Œ์ŠคํŠธ๋Š” ์–ด๋ ต๋‹ค.
๋งŒ์•ฝ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ๋‹ค ๋งŒ๋“ค์—ˆ์œผ๋ฉด ์ด๋ ‡๊ฒŒ ๋œฐ ๊ฒƒ์ด๋‹ค.

๋‚˜๋Š” ์ž˜ ์“ฐ๊ณ ์žˆ๋‹ค.