๐Ÿ›ณ DevOps/Cloud Infra

24*365 ์žฅ์•  ๋ชจ๋‹ˆํ„ฐ๋ง์— ๋Œ€ํ•ด์„œ(with AWS CloudWatch)

DevPoong 2023. 7. 13. 13:36

365์ผ 24์‹œ๊ฐ„ ์žฅ์•  ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฆ‰๊ฐ์ ์ธ ๋Œ€์‘์ด ๋ถˆ๊ฐ€ํ•  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.
์–ด๋–ค ์‹์œผ๋กœ ๊ธฐ์—…์—์„œ๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ AWS CloudWatch์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด ๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. 

์ „์ฒด์ ์ธ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

CloudWatch์—์„œ ์•Œ๋žŒ ๋ฐœ์ƒ -> SNS ํ‘ธ์‹œ ์„œ๋น„์Šค ํ˜ธ์ถœ -> Lambda ํ•จ์ˆ˜ ํŠธ๋ฆฌ๊ฑฐ -> Slack ์ฑ„๋„๋กœ ์•Œ๋žŒ์ „์†ก

1. Slack

์šฐ์„  Slack์—์„œ ์ƒˆ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •์—์„œ web hook์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

web hook์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์˜ˆ์‹œ ๋ช…๋ น์–ด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰์‹œํ‚จ๋‹ค.
OK๊ฐ€ ๋œจ๋ฉด ์ •์ƒ์ ์œผ๋กœ ์„ค์ •๋œ ๊ฒƒ์ด๋‹ค.

OK๊ฐ€ ๋œจ๋ฉด ๊ทธ ๋’ค์— slack channel์— ๋“ค์–ด๊ฐ€๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ web hook์€ ์ •์ƒ์ ์œผ๋กœ ์„ค์ •๋˜์—ˆ๋‹ค. ์ด์ œ๋Š” AWS๋ฅผ ๊ฑด๋“œ๋ฆด ์ฐจ๋ก€์ด๋‹ค!


2. SNS ํ† ํ”ฝ ์ƒ์„ฑ

CloudWatch์™€ ๊ฐ™์€ Publisher์—๊ฒŒ์„œ ์˜จ ๋ฉ”์‹œ์ง€๋ฅผ lambda์™€ ๊ฐ™์€ ์„œ๋ฒ„๋ฆฌ์Šค ์„œ๋น„์Šค์—๊ฒŒ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

Lambda์— ๋Œ€ํ•ด์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด, ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ์„œ๋ฒ„ ์…‹์—… ์—†์ด ๊ณง๋ฐ”๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ์ฃผ๋Š” ์„œ๋น„์Šค์ด๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด AWS์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฃผ์ œ ์ด๋ฆ„๋งŒ ์„ค์ •ํ•˜๋ฉด ์ถ”๊ฐ€๊ฐ€ ๋œ๋‹ค.

 


3. Lambda ์ƒ์„ฑ

๋ธ”๋ฃจํ”„๋ฆฐํŠธ ์‚ฌ์šฉ์„ ์ฒดํฌํ•˜๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งŒ๋“ค์–ด๋†“์€ slack ์‚ฌ๋ก€๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐฉ๊ธˆ ๋งŒ๋“ค์–ด๋†“์€ SNS๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.

๊ทธ๋‹ค์Œ์—๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ธํŒ…ํ•ด์ค˜์•ผ ํ•œ๋‹ค. slackChannel๊ณผ kmsEncryptedHookUrl์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
์ฑ„๋„ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“ค์–ด๋†“์€ ์Šฌ๋ž™ ์ฑ„๋„ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋ฉด ๋˜์ง€๋งŒ, kmsEncryptedHookUrl ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์•„๋ฌด๋‚˜ ๋‚ด๊ฐ€ ์–ด๋–ค ์ฑ„๋„๋กœ ๋ณด๋‚ด๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ฒŒ ์•”ํ˜ธํ™”๋ฅผ ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์•„์ง ์•”ํ˜ธํ™”๋ฅผ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž„์˜์˜ ๊ฐ’์„ ์ง‘์–ด๋„ฃ๊ณ  ๋‚˜์ค‘์— ์ˆ˜์ •ํ•œ๋‹ค.

์ด์ œ ๋žŒ๋‹ค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


4. KMS (Key Management Service)

๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์•”ํ˜ธํ™” ํ‚ค์ธ Customer Master Key(CMKs)๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” Lambda ํ•จ์ˆ˜์—์„œ Slack์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•  ๋•Œ web hook์„ ์•”ํ˜ธํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

aws kms create-key --region ap-northeast-2

์œ„ ๋ช…๋ น์„ ํ†ตํ•ด key๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์‚ฌ์šฉํ•  ๋•Œ ํŽธํ•˜๋„๋ก ๋ณ„์นญ์„ ๋ถ™์—ฌ์ค€๋‹ค.

aws kms create-alias --alias-name alias/test-kms-key --target-key-id {keyId} --region ap-northeast-2

 

์ด์ œ ํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ Slack URL์„ ์•”ํ˜ธํ™”ํ•ด์•ผ ํ•œ๋‹ค.

Lambda Function ๋‚ด์—์„œ Hook Url์„ Decryption ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.

HOOK_URL = "https://" + boto3.client('kms').decrypt( CiphertextBlob=b64decode(ENCRYPTED_HOOK_URL), EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']})['Plaintext'].decode('utf-8')

 

๊ทธ๋ฆฌ๊ณ  ์•„๋ฌด Lambda Function์—์„œ๋‚˜ ์•”ํ˜ธํ™”๋œ Web Hook Url์„ ๋ณตํ˜ธํ™”ํ•ด์„œ๋Š” ์•ˆ๋˜๋ฏ€๋กœ key์™€ Lamda Function๋„ ์ง€์ •ํ•ด ์ค€๋‹ค.

โ€ป ์ฃผ์˜: Web Hook Url์—์„œ https:// ๋Š” ๋นผ๊ณ  ๋„ฃ์–ด์•ผ ํ•จ. (๋ณตํ˜ธํ™” ์ฝ”๋“œ์— ์ด๋ฏธ https:// ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ)

์•„๋ž˜ ๋ช…๋ น์–ด๋Š” aws version 2.X ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.

aws kms encrypt --key-id alias/{kms key alias} --plaintext fileb://<(echo "hooks.slack.com/~~~") --region ap-northeast-2 --encryption-context LamdaFunctionName={lambda function name}

 

ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด "CiphertextBlob", "KeyId"์˜ key๋ฅผ ๊ฐ€์ง„ value๋“ค์ด ์ถœ๋ ฅ๋œ๋‹ค.

"CiphertextBlob"์˜ value๋ฅผ Lambda ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ž…๋ ฅํ–ˆ๋˜ kmsEncryptedHookUrl ํ™˜๊ฒฝ๋ณ€์ˆ˜์˜ ๊ฐ’์— ์ž…๋ ฅํ•˜์—ฌ ์ˆ˜์ •ํ•œ๋‹ค.

"KeyId"์˜ value๋ฅผ ์•”ํ˜ธํ™” ๊ตฌ์„ฑ์—์„œ ๊ณ ๊ฐ ๋งˆ์Šคํ„ฐ ํ‚ค ์‚ฌ์šฉ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ณ ๊ฐ ๋งˆ์Šคํ„ฐ ํ‚ค์˜ ์ž…๋ ฅ์œผ๋กœ ๋„ฃ๋Š”๋‹ค.

 

์ด์ œ Lambda ํ•จ์ˆ˜์— KMS ํ‚ค  Decrypt ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.

๋จผ์ € KMS Decrypt ์ •์ฑ…์„ ์•„๋ž˜์™€ ๊ฐ™์ด JSON ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1443036478000",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt"
      ],
      "Resource": [
        "<kms key Id ์ž…๋ ฅ>"
      ]
    }
  ]
}

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ Lambda ํ•จ์ˆ˜์— ์ž๋™ ์ƒ์„ฑ๋œ Role์— ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ์ •์ฑ…์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

5. Cloudwatch

๊ฒฝ๋ณด ์ƒ์„ฑ์—์„œ ๋จผ์ € ์ง€ํ‘œ๋ฅผ ์„ ํƒํ•ด์•ผํ•œ๋‹ค.

๋‚˜๋Š” EC2์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์„ ํƒํ•˜์˜€๋‹ค.

๊ทธ ๋’ค์— ๋ช‡๋ถ„๋งˆ๋‹ค ๊ฒฝ๋ณด๋ฅผ ๋ณด๋‚ผ์ง€์™€ ๊ฒฝ๊ณ„๊ฐ’๋“ค์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ๋‹ค์Œ ์ด์ „์— ์ƒ์„ฑํ•ด๋‘” SNS๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค. ์ด์ œ ๊ฒฝ๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด CPU ์‚ฌ์šฉ๋Ÿ‰์ด ์„ค์ •ํ•œ ๊ฐ’์ด ๋„˜์œผ๋ฉด ์Šฌ๋ž™์œผ๋กœ ์•Œ๋ฆผ์ด ์˜ค๊ฒŒ ๋œ๋‹ค.