[ AWS Terraform ] 로깅 코드 추가
로깅인지 모니터링인지는 잘 모르겠으나 ..
GPT 대답 첨부함
이렇게 확인하는 과정을 추가하는 것을 일반적으로 "로깅(logging)" 또는 **"모니터링(monitoring)"**이라고 합니다. 좀 더 구체적으로는 "유저 데이터 스크립트 로깅(user data script logging)" 또는 **"설치 스크립트 모니터링(installation script monitoring)"**과 같은 용어를 사용할 수 있습니다.
이 용어들은 시스템 설정이나 애플리케이션 설치 시 로그 파일을 생성하거나 외부 모니터링 서비스에 로그를 전송하여 각 단계의 성공 여부와 발생한 오류를 추적하는 행위를 의미합니다. CloudWatch를 사용하여 로그를 수집하고 모니터링하는 것은 **"클라우드 모니터링(cloud monitoring)"**의 일환입니다. 이를 통해 인프라스트럭처의 상태를 실시간으로 모니터링하고 문제가 발생했을 때 빠르게 대응할 수 있습니다.
- 로깅(logging): 시스템 또는 애플리케이션에서 발생하는 이벤트를 기록하는 것. 주로 디버깅, 감사, 운영 관리를 목적으로 합니다.
- 모니터링(monitoring): 시스템의 성능, 상태, 또는 이벤트를 실시간으로 추적하고 시각화하는 것. CloudWatch 같은 도구를 사용하여 시스템 로그를 수집하고 분석할 수 있습니다.
- 유저 데이터 스크립트 로깅(user data script logging): EC2 인스턴스의 user data 스크립트 실행 결과를 로그 파일에 기록하는 것.
- 설치 스크립트 모니터링(installation script monitoring): 설치 과정에서 발생하는 이벤트와 상태를 추적하여 성공 여부를 모니터링하는 것.
- 클라우드 모니터링(cloud monitoring): 클라우드 인프라스트럭처의 상태와 성능을 추적하고 분석하는 것.
이 용어들은 시스템 운영과 관리에서 중요한 역할을 하며, 특히 DevOps와 관련된 환경에서 자주 사용됩니다.
Terraform에서는 user_data 스크립트를 통해 인스턴스 내부에서 실행된 명령의 출력을 직접적으로 Terraform 측에서 확인할 수 없습니다. 그러나 로그 파일을 사용하거나 CloudWatch Logs와 같은 AWS 서비스를 통해 인스턴스 내부에서 발생한 이벤트를 모니터링할 수 있습니다.
여기서는 두 가지 방법을 제안합니다:
- 로컬 로그 파일을 사용: 모든 출력 메시지를 로컬 로그 파일에 저장합니다.
- CloudWatch Logs를 사용: CloudWatch Logs에 출력을 보냅니다.
1. 로컬 로그 파일을 사용한 예시
각 명령의 출력 메시지를 로컬 로그 파일에 기록하도록 스크립트를 수정합니다.
resource "aws_instance" "jenkins" {
ami = "ami-062cf18d655c0b1e8" // Ubuntu 24.04 이미지 ID
instance_type = "t2.medium"
subnet_id = aws_subnet.Public_A1.id
key_name = "KDT_Project2_AWS"
vpc_security_group_ids = [aws_security_group.jenkins.id]
tags = {
Name = "Jenkins_Instance"
}
user_data = <<-EOF
#!/bin/bash
LOG_FILE=/var/log/user_data.log
exec > >(tee -a $LOG_FILE) 2>&1
echo "호스트 이름 변경"
hostnamectl set-hostname jenkins-instance
echo "127.0.1.1 jenkins-instance" >> /etc/hosts
echo "호스트 이름 변경 성공!"
echo "SSH 포트 변경"
sed -i 's/#Port 22/Port 51228/' /etc/ssh/sshd_config
systemctl restart sshd
echo "SSH 포트 변경 성공!"
echo "PEM 파일 생성 및 권한 설정"
echo "${key_pair_content}" > /home/ubuntu/KDT_Project2_AWS.pem
chmod 400 /home/ubuntu/KDT_Project2_AWS.pem
echo "PEM 파일 생성 및 권한 설정 성공!"
echo "Docker 및 Jenkins 설치"
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo "Docker 설치 성공!"
echo "자바 설치"
sudo apt update
sudo apt install -y openjdk-17-jdk
echo "자바 설치 성공!"
echo "젠킨스 설치"
sudo apt update
curl -fsSL https://pkg.jenkins.io/debian/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt update
sudo apt install -y jenkins
echo "젠킨스 설치 성공!"
echo "빌드를 위해 gradle 설치"
sudo apt install -y gradle
echo "gradle 설치 성공!"
sudo systemctl start jenkins
sudo systemctl enable jenkins
echo "Jenkins 서비스를 시작하고 부팅 시 자동으로 시작하도록 설정 성공!"
echo "Docker와 Jenkins 설치가 완료되었습니다."
EOF
}
resource "aws_eip" "jenkins_eip" {
instance = aws_instance.jenkins.id
vpc = true
}
// 다른 인스턴스의 user_data도 동일한 방식으로 수정합니다.
이렇게 하면 user_data 스크립트의 모든 출력이 /var/log/user_data.log 파일에 기록됩니다.
Terraform 측에서 직접적으로 출력을 확인할 수는 없지만, SSH를 통해 인스턴스에 접속하여 로그 파일을 확인할 수 있습니다.
2. CloudWatch Logs를 사용한 예시
인스턴스의 로그를 CloudWatch Logs로 전송하는 방법입니다. 이를 위해서는 먼저 EC2 인스턴스 프로필과 CloudWatch Logs 권한을 설정해야 합니다.
CloudWatch Logs 설정
먼저 CloudWatch Logs에 로그를 전송할 수 있는 IAM 역할을 생성합니다.
resource "aws_iam_role" "ec2_cloudwatch_role" {
name = "ec2-cloudwatch-role"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Action = "sts:AssumeRole",
Principal = {
Service = "ec2.amazonaws.com"
},
Effect = "Allow",
Sid = ""
}
]
})
}
resource "aws_iam_role_policy_attachment" "ec2_cloudwatch_attach" {
role = aws_iam_role.ec2_cloudwatch_role.name
policy_arn = "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy"
}
resource "aws_iam_instance_profile" "ec2_cloudwatch_instance_profile" {
name = "ec2-cloudwatch-instance-profile"
role = aws_iam_role.ec2_cloudwatch_role.name
}
그런 다음 인스턴스에 CloudWatch Logs 에이전트를 설치하고 설정합니다.
resource "aws_instance" "jenkins" {
ami = "ami-062cf18d655c0b1e8" // Ubuntu 24.04 이미지 ID
instance_type = "t2.medium"
subnet_id = aws_subnet.Public_A1.id
key_name = "KDT_Project2_AWS"
iam_instance_profile = aws_iam_instance_profile.ec2_cloudwatch_instance_profile.name
vpc_security_group_ids = [aws_security_group.jenkins.id]
tags = {
Name = "Jenkins_Instance"
}
user_data = <<-EOF
#!/bin/bash
LOG_FILE=/var/log/user_data.log
exec > >(tee -a $LOG_FILE) 2>&1
echo "호스트 이름 변경"
hostnamectl set-hostname jenkins-instance
echo "127.0.1.1 jenkins-instance" >> /etc/hosts
echo "호스트 이름 변경 성공!"
echo "SSH 포트 변경"
sed -i 's/#Port 22/Port 51228/' /etc/ssh/sshd_config
systemctl restart sshd
echo "SSH 포트 변경 성공!"
echo "PEM 파일 생성 및 권한 설정"
echo "${key_pair_content}" > /home/ubuntu/KDT_Project2_AWS.pem
chmod 400 /home/ubuntu/KDT_Project2_AWS.pem
echo "PEM 파일 생성 및 권한 설정 성공!"
echo "CloudWatch Logs 설치 및 설정"
sudo apt-get update
sudo apt-get install -y awscli
sudo apt-get install -y unzip
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
sudo tee /opt/aws/amazon-cloudwatch-agent/bin/config.json > /dev/null << 'EOF'
{
"agent": {
"metrics_collection_interval": 60,
"logfile": "/var/log/amazon-cloudwatch-agent.log"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/user_data.log",
"log_group_name": "jenkins_instance",
"log_stream_name": "{instance_id}/user_data.log",
"timezone": "UTC"
}
]
}
}
}
}
EOF
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
echo "CloudWatch Logs 설치 및 설정 성공!"
echo "Docker 및 Jenkins 설치"
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo "Docker 설치 성공!"
echo "자바 설치"
sudo apt update
sudo apt install -y openjdk-17-jdk
echo "자바 설치 성공!"
echo "젠킨스 설치"
sudo apt update
curl -fsSL https://pkg.jenkins.io/debian/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt update
sudo apt install -y jenkins
echo "젠킨스 설치 성공!"
echo "빌드를 위해 gradle 설치"
sudo apt install -y gradle
echo "gradle 설치 성공!"
sudo systemctl start jenkins
sudo systemctl enable jenkins
echo "Jenkins 서비스를 시작하고 부팅 시 자동으로 시작하도록 설정 성공!"
echo "Docker와 Jenkins 설치가 완료되었습니다."
EOF
}
resource "aws_eip" "jenkins_eip" {
instance = aws_instance.jenkins.id
vpc = true
}
// 다른 인스턴스의 user_data도 동일한 방식으로 수정합니다.
이렇게 하면 /var/log/user_data.log 파일의 모든 로그가 CloudWatch Logs에 업로드됩니다.
CloudWatch Logs 콘솔에서 jenkins_instance 로그 그룹을 확인할 수 있습니다.