[AWS] Cloudwatch: ๋กœ๊ทธ ๊ตฌ์„ฑ in EC2

Fargate๋‚˜ Lambda ๊ฐ™์€ ์™„์ „๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค๋ฅผ ์“ฐ๋ฉด cloudwatch์— ์˜ํ•œ ๋กœ๊น…์ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋ผ์„œ ์ด๋Ÿฐ๊ฑธ ์‹ ๊ฒฝ์„ ์“ธ ํ•„์š”๋Š” ์—†๋‹ค.

ํ•˜์ง€๋งŒ EC2๋กœ ์ง์ ‘ ๋ญ˜ ์„ธํŒ…ํ•ด์„œ ์“ด๋‹ค๋“ ์ง€, ์˜จํ”„๋ ˆ์Šค ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์“ด๋‹ค๋“ ์ง€ ํ•˜๋ฉด ์ง์ ‘ ๋กœ๊ทธ ๊ทธ๋ฃน์„ ๊ตฌ์„ฑํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ๋กœ๊ทธ๊ฐ€ ๋“ค์–ด๊ฐ€๋„๋ก ์„ธํŒ…์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐœ์ƒํ•œ ํ‘œ์ค€ ์ถœ๋ ฅ์„ cloudwatch์— ์ €์žฅํ•˜๋„๋ก ๊ตฌ์„ฑ์„ ํ•œ๋ฒˆ ํ•ด๋ณด๊ฒ ๋‹ค.
์•„๋‹ˆ๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ aws-sdk๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ cloudwatch api๋กœ ๋กœ๊ทธ๋ฅผ ์ง‘์–ด๋„ฃ๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด๊ธด ํ•˜๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ์ „์ž๋งŒ์„ ๋‹ค๋ฃฌ๋‹ค. ํ›„์ž๋Š” ์ฝ”๋“œ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ๋ฒˆ๊ฑฐ๋กœ์›Œ์„œ ๊ทธ๋ ‡์ง€, ๋ฐฉ๋ฒ• ์ž์ฒด๋Š” ํ›จ์”ฌ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.

ํ…Œ์ŠคํŠธํ™˜๊ฒฝ์€ EC2 Amazon Linux 2๋‹ค.




๋กœ๊ทธ ๊ทธ๋ฃน ์ƒ์„ฑ

๋จผ์ € ๋กœ๊ทธ ๊ทธ๋ฃน๋ถ€ํ„ฐ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ฃผ๊ฒ ๋‹ค.




์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ (Node.js)

๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ๋ฅผ ์ฐ๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ๋ฐ๋ชฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ–ˆ๋‹ค.

function sleep(milliseconds) {
  return new Promise((resolve) => {
    setTimeout(() => resolve(null), milliseconds);
  });
}

async function loop() {
  while (true) {
    console.log(`@ daemon is trying`);

    // Do something
    const random = Math.random();
    console.log(`@ random: ${random}`);

    console.log(`$ wait 10 second`);
    await sleep(10 * 1000);
  }
}

loop();

๊ทธ๋ฆฌ๊ณ , node.js์˜ ์ถœ๋ ฅ์„ ํŠน์ • ๋กœ๊ทธ ํŒŒ์ผ์— ์Œ“์•„์ฃผ๋„๋ก ์‹คํ–‰์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
node.js๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ์ถœ๋ ฅ์„ ๊ฐ–๋‹ค๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๊ณ 

ํŒŒ์ผ์„ ์—ด์–ด๋ณด๋ฉด

์ž˜ ๋“ค์–ด๊ฐ€์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๊ฑด ์–ธ์–ด ํŠน์„ฑ์— ๋”ฐ๋ผ ์ž˜ ๋Œ€์ฒ˜ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.
nodejs๋Š” ์—†์ง€๋งŒ, ์ž๋™์œผ๋กœ ๋กœ๊ทธํŒŒ์ผ์ด ์Œ“์ด๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๊ทธ๊ฑธ ์“ฐ๋ฉด ๋œ๋‹ค.




๊ถŒํ•œ ๋ถ€์—ฌ (EC2)

ํ”„๋กœ๊ทธ๋žจ์ด cloudwatch์— ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด, ์•„๋ž˜ ๊ถŒํ•œ์„ ์ค˜์•ผ ํ•œ๋‹ค.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams"
    ],
      "Resource": [
        "*"
    ]
  }
 ]
}

EC2์˜ ๊ฒฝ์šฐ์—๋Š” EC2 ์ž์ฒด์— ์—ญํ• ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋˜๊ณ , ์˜จํ”„๋ ˆ๋ฏธ์Šค์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ ACCESS_KEY์™€ SECRET_KEY๋ฅผ ์ง์ ‘ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด์•ผํ•  ๊ฒƒ์ด๋‹ค.

์•„๋ฌดํŠผ ๋ฐ”๊ฟ”์ค€๋‹ค.




cloudwatch-agent ๊ตฌ์„ฑ

์ด๊ฒŒ ๋กœ๊ทธํŒŒ์ผ์„ ์ฝ์–ด์„œ ์ž๋™์œผ๋กœ cloudwatch์— ์จ์ค„ ๋…€์„์ด๋‹ค.
๋ชจ๋‹ˆํ„ฐ๋ง์ด๋‚˜ ์ง€ํ‘œ ๊ด€๋ฆฌ ๋“ฑ๋“ฑ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ธ๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” ๋กœ๊น…์šฉ์œผ๋กœ๋งŒ ์“ฐ๊ฒ ๋‹ค.

๊น”๊ณ 

sudo yum install amazon-cloudwatch-agent -y

์„ค์ •ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

sudo vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
{
	"logs": {
		"logs_collected": {
			"files": {
				"collect_list": [
					{
						"file_path": "/home/ec2-user/app/app.log",
						"log_group_name": "test-log-group"
					}
				]
			}
		}
	}
}

๋งŒ๋“ค์—ˆ๋˜ ๋กœ๊ทธ ๊ทธ๋ฃน๋ช…์„ ๋„ฃ๊ณ , nodejs(ํ˜น์€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค)์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ๋กœ๊ทธํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—์ด์ „ํŠธ๋ฅผ ์žฌ์‹คํ–‰ํ•˜๋ฉด

sudo systemctl start amazon-cloudwatch-agent
sudo systemctl status amazon-cloudwatch-agent

์ด๋ ‡๊ฒŒ ์ž˜ ๋“ค์–ด์™€์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ธฐ์กด์— ๋“ค์–ด์žˆ๋˜ ๋กœ๊ทธ์— ๋Œ€ํ•ด์„œ๋„ ๋™๊ธฐํ™”๋ฅผ ํ•ด์ฃผ๊ณ , ์ƒˆ๋กœ ๋“ค์–ด์™€์„œ ๊ฐฑ์‹ ๋˜๋Š” ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ๋„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋ฅผ ํ•ด์ค€๋‹ค.



์ฐธ์กฐ
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/QuickStartEC2Instance.html
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html
https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html
https://stackoverflow.com/questions/10815218/where-is-nodejs-log-file