Cloud Infra Architecture (AWS)/AWS Build

AWS Tag로 EC2 자동으로 중지하기 (lambda-EventBridge)

seongduck 2024. 2. 23. 17:16

람다를 사용하여 특정 조건의 tag key와 value로 인스턴스를 다뤄보고 중지를 시켜보자.

 

1) EC2에 Tag 작성

필자는 ec2에 다음과 같이 테그값을 입력한다.

1) tag key : seongduck
2) tag value : ok

다음 key와 value를 가진 ec2를 종료할 예정이다.

 

2) 람다함수에 사용할 IAM 권한 생성 및 부여

람다함수를 사용할때, 인스턴스에 접근하는데 그때, 인스턴스에 접근할 수 있는 권한을 부여해야 한다.

 

우선 iam 역할을 생성하자

1) iam 검색 후 선택
2) "역할" 선택 후 "역할 생성" 클릭
3) "사용사례"는 "Lambda"로 선택
4) "AmazonEC2FullAccess" 선택 후 다음
5) "이름" 입력 후 "역할 생성" 클릭

 

3) 람다함수 생성

위에서 만든 iam을 람다에 적용해서 생성하자

1) "람다" 검색
2) "람다 함수 새성"
3) 적당한 이름을 적고 python을 선택
4) "기본 실행 역할 변경" 클릭 후 "기존 역할 사용"에서 방금 위에서 만든 iam 역할 선택
5) "함수 생성" 클릭

 

람다함수가 길어지면 실행시간이 소요되므로 넉넉하게 시간을 늘리자

1) 생성한 람다함수 클릭
2) "구성" - "편집" - "제한 시간" - 20초 변경

 

다음 람다 함수를 작성

import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name='ap-northeast-2')  # 리전을 원하는 리전으로 변경하세요.
    filters = [
        {
            'Name': 'tag:seongduck',
            'Values': ['ok']
        }
    ]
    instances = ec2.describe_instances(Filters=filters)
    InstanceIds = []
    for reservation in instances['Reservations']:
        for instance in reservation['Instances']:
            InstanceIds.append(instance['InstanceId'])
    
    if InstanceIds:
        ec2.stop_instances(InstanceIds=InstanceIds)
        print(f'Stopped instances: {InstanceIds}')
    else:
        print('No instances to stop.')

작성 후 "Depoly" 클릭

 

4) 람다함수 테스트

1) Depoly가 완료된 후 "Test" 클릭
2) "테스트 이벤트 구성"에서 적당한 이름 넣고 "저장"

1) 그리고 다시 test 버튼 클릭

 

5) 오후 6시가 되면 강제 정지되도록 트리거 생성하기 (Event Bridge 구성)

이제 오후 6시가되면 자동으로 람다함수를 실행시켜 해당 태그를 가지고 있는 인스턴스를 정지시켜보자

그러기 위해서는 event bridge를 사용하면 된다.

 

1) EventBridge 구성하기

1) "eventbridge" 서비스에 접속
2) "규칙 생성" 클릭
3) "이름"을 작성하고 "일정"을 클릭
4) "일정 세부 정보 지정"으로 이동된다.

1) "반복 일정" 선택
2) "현재 지역 선택" - "cron기반" 선택
3) 오후 6시 이므로 cron은 "cron(0 18 * * ? *)"로 입력
4) "유연한 기간" - "5분" 선택 후 "다음"
5) "람다 invoke" 선택 후 미리 만들어 놓은 위의 "람다" 선택
6) "역할"은 기본으로 선택

 

2) EventBridge가 람다에 접근하려면 앞서 생성한 iam role에 신뢰관계를 추가해야한다. 

(자동으로 생성한 iam이면 추가를 안해줘도 된다.)

1) "아까 만든 iam 정책 클릭"
2) "신뢰 관계" - "신뢰 정책 편집"
3) 다음을 입력
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "events.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
4) "완료"

 

3) 람다함수에서 eventbridge가 접근할 수 있도록 권한 허용

1) Services에서 Lambda를 선택
2) 호출을 허용하고자 하는 Lambda 함수의 이름을 클릭
3) 함수의 디자인 페이지에서 "권한" 탭을 클릭합니다.
4) "리소스 기반 정책 설명 " 섹션을 찾아 Add permission 버튼을 클릭
5) "aws 서비스" - "eventbridge" - 생성한 eventbridge의 arn 붙여넣기
6) "작업은 lambda:addpermission" 클릭

시간이 되면 이제 종료된다!