24시간 이상 켜져 있는 EC2 인스턴스를 Lambda로 자동 종료하는 구성을 만들어 봤습니다.
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 24시간 이상 켜져 있는 EC2 인스턴스를 Lambda로 자동 종료하는 구성을 만들어 봤습니다.
IAM 정책 & 역할 구성
먼저 Lambda 함수에서 EC2 인스턴스에 접근할 수 있는 권한을 할당하기 위해 IAM 정책과 역할을 생성합시다. 정책에는 EC2 인스턴스를 읽어올 수 있는 권한과 정지시킬 수 있는 권한을 추가합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:DescribeInstances",
"ec2:StopInstances"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
Lambda 함수 생성
정책과 역할을 생성했다면, 이제 Lambda 함수를 생성하고 코드를 작성합시다. Lambda의 런타임은 [Python 3.13]입니다. 24시간이라고 했지만, 테스트용으로 10분이 지난 EC2 인스턴스가 정지되는지 확인해 봅시다. 또한, EC2 인스턴스를 2대 생성하여 하나의 EC2 인스턴스에는 [DoNotStop, True] 라는 태그 값을 넣어 해당 태그를 소유한 EC2 인스턴스는 예외 처리(정지안됨)를 합시다.
import boto3
from datetime import datetime, timezone, timedelta
ec2 = boto3.client('ec2')
def lambda_handler(event, context):
now = datetime.now(timezone.utc)
threshold = timedelta(minutes=10) # 10분 기준
# 실행 중인 인스턴스 가져오기
instances = ec2.describe_instances(
Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]
)
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
instance_id = instance['InstanceId']
launch_time = instance['LaunchTime']
uptime = now - launch_time
# 태그 예외 처리 (예: DoNotStop=true 면 정지 안 함)
tags = {tag['Key']: tag['Value'] for tag in instance.get('Tags', [])}
if tags.get('DoNotStop', '').lower() == 'true':
print(f"{instance_id} → DoNotStop 태그로 제외")
continue
# 10분 이상 켜져 있으면 정지
if uptime > threshold:
print(f"{instance_id} → {uptime} 경과로 정지합니다.")
ec2.stop_instances(InstanceIds=[instance_id])
else:
print(f"{instance_id} → {uptime} 경과로 아직 미정지")
이어서, EventBridge Scheduler를 설정하여 정기적으로 Lambda가 실행되게 할 수 있습니다. 이와 관련한 설정은 아래 블로그를 통해 확인할 수 있습니다.
결과 확인
조금 전 말했던 것 처럼 테스트를 위해 EC2 인스턴스를 2대 생성했으며, [test-ec2-2]에는 [DoNotStop, True] 태그를 지정했습니다. 즉, 정지되는 EC2 인스턴스는 [test-ec2-1]입니다.
시간이 지나면 [test-ec2-1] EC2 인스턴스는 정지되고,[test-ec2-2] EC2 인스턴스는 정지되지 않은 것을 확인할 수 있습니다.
이제 검증은 끝났으므로 24시간 이상 켜져있는 EC2 인스턴스를 대상으로 코드를 다시 작성해 봅시다.
import boto3
from datetime import datetime, timezone, timedelta
ec2 = boto3.client('ec2')
def lambda_handler(event, context):
now = datetime.now(timezone.utc)
threshold = timedelta(hours=24)
# EC2 인스턴스 조회
instances = ec2.describe_instances(
Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]
)
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
instance_id = instance['InstanceId']
launch_time = instance['LaunchTime']
uptime = now - launch_time
# 태그 확인 (예외 처리)
tags = {tag['Key']: tag['Value'] for tag in instance.get('Tags', [])}
if tags.get('DoNotStop', '').lower() == 'true':
continue
# 24시간 이상인 인스턴스 종료
if uptime > threshold:
print(f"{instance_id} 런칭 {uptime} 경과 → 중지")
ec2.stop_instances(InstanceIds=[instance_id])
이렇게 간단하게 코드를 작성하여 매번 수동으로 정지할 필요도 없고, 정지한 것을 놓쳐서 요금이 청구될 일도 없으므로 자동화 시킬 수 있는 부분은 Lambda 함수를 이용해서 자동화 시키는 것이 보다 편한 것 같습니다.
본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 jaewookkim533@yahoo.com로 보내주시면 감사하겠습니다.