[Linux] sh를 이용한 AWS Launch Template 자동 업데이트

홍종훈·2024년 1월 28일

Linux

목록 보기
1/1


얼마전에 오토스케일링을 공부했던 내용으로 오토스케일링을 라이브 서버에 적용했다.

1. AWS 오토 스케일링이란?

AWS 오토스케일링은 Amazon Web Services에서 제공하는 서비스로, 클라우드 환경에서 애플리케이션의 가용성을 유지하고, 사용자 정의 규칙에 따라 자동으로 컴퓨팅 리소스를 조정한다. 오토스케일링은 트래픽의 변화에 맞춰 필요한 만큼의 EC2 인스턴스를 자동으로 추가하거나 제거하여 비용을 최적화하고, 성능을 유지한다.

1-1. AWS 오토스케일링의 주요 기능

  1. 동적 스케일링: 사용자 정의 지표에 따라 EC2 인스턴스의 수를 자동으로 조정한다.

  2. 예측 스케일링: 머신 러닝 모델을 사용하여 예상되는 트래픽 변화를 학습하고, 필요에 따라 인스턴스를 미리 추가하거나 제거한다.

  3. 스케줄링: 특정 시간이나 날짜에 맞춰 인스턴스의 수를 조정합니다. 예를 들어, 특정 시간에 트래픽이 증가하는 것을 예상할 때 유용하다.

1-2. 구성 요소

  1. Auto Scaling 그룹: 하나 이상의 EC2 인스턴스를 포함하며, 이 그룹의 크기, 최소/최대 인스턴스 수, 스케일링 정책 등을 정의.

  2. 런치 템플릿 또는 런치 구성: Auto Scaling 그룹에서 새 인스턴스를 생성할 때 사용하는 EC2 인스턴스의 구성을 정의.

  3. 스케일링 정책: 트래픽 증가 또는 감소에 따라 인스턴스를 언제, 어떻게 조정할지 결정하는 규칙.

1-3. 오토스케일링의 이점

  1. 가용성 향상: 트래픽이 증가할 때 자동으로 인스턴스를 추가하여 애플리케이션의 가용성을 유지한다.

  2. 비용 절감: 필요할 때만 인스턴스를 실행하여 비용을 최적화한다.

  3. 유연성 및 자동화: 수동 개입 없이 시스템이 자동으로 리소스를 조정한다.

오토스케일링에 대해 정리한 내용은 다음 노션 링크에 있습니다.

https://flint-hole-d62.notion.site/AWS-Auto-Scaling-e417918a4c514b81aa1fc6e33d3a539e?pvs=4

2. 문제상황


오토 스케일링을 사용하는 것은 좋지만,

오토 스케일링은 이미 만들어져있는 템플릿을 기반으로 인스턴스를 실행시키기 때문에

서버에 업데이트가 있을 때마다 인스턴스의 이미지를 뽑고 템플릿에 등록해줘야 한다.

이 작업을 수동으로 하기엔 귀찮기도 하고

어떤 서버는 적용했지만, 어떤 서버는 적용되지 않는 휴먼에러가 발생할 수 있다.

따라서, 서버 업데이트 로직에 서버가 업데이트 될때 해당 인스턴스의 이미지를 만들고, 템플릿에 적용시키는 로직을 추가해야 했다.

3. 해결방법

3-1. 서버 업데이트 로직에 aws 명령어 추가하기

각 인스턴스엔 서버가 업데이트됐을 때 실행하는 sh파일이 있는데, 해당 파일에 aws명령어를 추가했다.

#!/bin/sh

# 변수 선언
s3repo="s3-path"
serverType="serverType"
template_id="templateId"
region="region" 

id=$(ec2-metadata -i | grep "instance-id" | awk '{print $2}')
echo "Current Instance ID: $id"
region=$(ec2-metadata -z | grep "placement" | awk '{print $2}' | sed 's/[a-z]$//')
echo "Current Region: $region"

# ... 서버 업데이트 로직

# 이미지 생성 후 템플릿 업데이트 로직
image_name="illang-service-$(date +%Y%m%d%H%M%S)"
echo "Creating new EC2 instance image from Instance ID: $id"
new_ami_id=$(aws ec2 create-image --instance-id $id --name $image_name --no-reboot --query 'ImageId' --output text)
echo "New AMI ID: $new_ami_id"

echo "Waiting for AMI to be available..."
aws ec2 wait image-available --image-ids $new_ami_id
echo "AMI is available now."

echo "Fetching the latest launch template version..."
current_version=$(aws ec2 describe-launch-template-versions --launch-template-id $template_id --query 'LaunchTemplateVersions | sort_by(@, &VersionNumber) | [-1].VersionNumber' --output text --region $region)
echo "Current launch template version: $current_version"

echo "Creating new launch template version..."
new_version_number=$(aws ec2 create-launch-template-version --launch-template-id $template_id --source-version $current_version --launch-template-data "{\"ImageId\":\"$new_ami_id\"}" --query 'LaunchTemplateVersion.VersionNumber' --output text)
echo "New launch template version: $new_version_number"

echo "Updating default version of the launch template..."
aws ec2 modify-launch-template --launch-template-id $template_id --default-version $new_version_number --region $region
echo "Launch template default version updated to $new_version_number"

# 슬랙 메시지 전송 로직
echo "[Slack Message - $serverType Server]"
now=$(date +"%Y-%m-%d %H:%M:%S")
echo $now

awsURL="https://$region.console.aws.amazon.com/ec2/home?region=$region#InstanceDetails:instanceId=${id}"
echo $awsURL

curl -X POST -H 'Content-type: application/json' \
--data '{"blocks":[{"type": "section","text": {"type": "mrkdwn","text": "*[ Server Deploy ]*"}},{"type": "section","fields": [{"type": "mrkdwn","text": "*Server Name:* '"${serverType}"' Server"},{"type": "mrkdwn","text": "*Instance ID:* <'"${awsURL}"'|'"${id}"'>"},{"type": "mrkdwn","text": "*Server Type:* KR"},{"type": "mrkdwn","text": "*AWS Region:* '"${region}"'"}]},{"type": "divider"}]}' \
$slackUrl

해당 명령어를 사용하기 위해선 Aws configure로 등록되어있는 IAM 사용자에게 아래의 권한이 필요하다.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"ec2:DescribeImages",
				"ec2:CreateImage"
			],
			"Resource": "*"
		}
	]
}
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"ec2:DescribeLaunchTemplateVersions",
				"ec2:ModifyLaunchTemplate",
				"ec2:CreateLaunchTemplateVersion"
			],
			"Resource": "*"
		}
	]
}

아래의 권한을 Aws Configure에 등록되어있는 IAM 사용자에게 부여한 후 쉘스크립트를 동작시키면

서버의 업데이트 내용을 반영한 서버가 뜨고, 템플릿의 버전도 Default가 Latest로 바뀌는 것을 확인할 수 있다.

이 과정 후에도 문제가 되는 부분이 작게 있었다.

오토 스케일링을 적용했을 때에 오토 스케일링 그룹이 스케일 아웃 됐다가 스케일 인 되는 경우

팀원들이 알고있는 메인 인스턴스가 사라질 수도 있다는 것이다.

이 부분을 해결하기 위해 오토스케일링 축소 보호를 각 메인 인스턴스에 적용해두었다.

스케일 인 보호 활성화 명령어는 다음과 같다.

aws autoscaling set-instance-protection --instance-ids <instance-id> --auto-scaling-group-name <asg-name> --protected-from-scale-in

4. 끝

이로써 라이브 환경 세팅의 한 부분을 해결할 수 있었다.

AWS의 공식문서가 워낙 잘 작성되어있어 어렵지 않게 기능을 적용했다.

명령어로 나 대신 컴퓨터가 정확하게 일을 해준다는 것은 너무너무 좋은 것 같다.

profile
Search Engineer

0개의 댓글