인프라/AWS 실습

[AWS] EC2 자동 시작/중지 기능 추가하기

마도학교 2022. 8. 30. 22:24
  •  AWS의 IAM, Lambda, CloudWatch 를 활용하여 EC2 인스턴스 자동 시작/중지 기능을 추가할 수 있습니다.
  • 위의 설정을 완료한 후 원하는 EC2 인스턴스의 tag 에 아래와 같이 추가하면 CloudWatch에서 설정한 시간에 인스턴스가 자동 시작/중지됩니다.
  • Name='Ec2AutoStart', Value='True'
  • Name='Ec2AutoStop', Value='True'
  • 아래와 같은 순서로 진행합니다.
  1. IAM 정책 생성
  2. IAM 역할 생성
  3. Lambda 함수 생성
  4. CloudWatch 이벤트 규칙 생성
  5. EC2 인스턴스에 태그 추가
  6. 결과 확인

 


1. IAM 정책 생성

  • JSON 코드
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:*:*:instance/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "logs:CreateLogGroup",
                "logs:PutLogEvents",
                "ec2:DescribeInstanceStatus"
            ],
            "Resource": "*"
        }
    ]
}

 

  • 새로 생성한 정책이 허용된 서비스와 엑세스 레벨이 아래와 같이 되어있는지 확인합니다.

 

 


2. IAM 역할 생성

  • 아래와 같이 역할을 생성합니다.

 


3. Lambda 함수 생성

  • 함수 생성 시 '기본 실행 역할 변경' > '기존 역할 사용' 선택 후 2번에서 생성하였던 IAM 역할을 선택합니다.

 

  • 함수 생성을 완료하면 아래의 내용을 코드 소스에 추가해줍니다. 'Deploy' 버튼을 눌러야 코드 소스가 배포됩니다.
import boto3

def lambda_handler(event, context):

    awsregion = boto3.session.Session().region_name
    print('RegionName', awsregion)
    ec2 = boto3.resource('ec2', region_name=awsregion)

    # all stopped EC2 instances.
    filters = [{
            'Name': 'tag:Ec2AutoStart',
            'Values': ['True']
        },
        {
            'Name': 'instance-state-name', 
            'Values': ['stopped']
        }
    ]

    # filter the instances
    instances = ec2.instances.filter(Filters=filters)
    print('instances :',instances)
    
    # locate all stopped instances
    RunningInstances = [instance.id for instance in instances]

    # print StoppedInstances 
    if len(RunningInstances) > 0:
        # perform the startup
        AutoStarting = ec2.instances.filter(InstanceIds=RunningInstances).start()
        print(AutoStarting)
    else:
        print("Nothing to see here")

 

  • '구성' > '일반 구성' 에서 제한 시간을 30초로 늘려줍니다.

 

  • 테스트 이벤트를 생성하고 작성한 함수가 정상적으로 동작하는지 확인합니다.

 

  • 위와 똑같은 방법으로 Stop 함수도 생성해줍니다.
import boto3

def lambda_handler(event, context):

    awsregion = boto3.session.Session().region_name
    print('RegionName', awsregion)
    ec2 = boto3.resource('ec2', region_name=awsregion)

    # All running EC2 instances.
    filters = [{
            'Name': 'tag:Ec2AutoStop',
            'Values': ['True']
        },
        {
            'Name': 'instance-state-name', 
            'Values': ['running']
        }
    ]

    # Filter the instances which are stopped
    instances = ec2.instances.filter(Filters=filters)
    print('instances :',instances)

    # Get all id of running EC2 Instances
    RunningInstances = [instance.id for instance in instances]

    # Print the instances for logging purposes
    # Print RunningInstances 
    if len(RunningInstances) > 0:
        # Perform Shutdown EC2 Instances
        shuttingDown = ec2.instances.filter(InstanceIds=RunningInstances).stop()
        print(shuttingDown)
    else:
        print("Nothing to see here")

 


4. CloudWatch 이벤트 규칙 생성

  • 아래와 같이 이벤트 규칙을 생성합니다.
  • 아래의 예제는 월~금 7시 50분에 EC2가 기동됩니다(한국시간 기준).
  • 참고) cron 표현식을 생성해주는 사이트 http://www.cronmaker.com/?1

 

  • 위와 같은 방법으로 Stop 이벤트 규칙도 생성해줍니다.
  • 아래 예제는 월~금 19시에 EC2가 중지됩니다(한국시간 기준).

 

  • 정상적으로 생성을 완료하였다면 아래와 같이 Lambda 함수 화면에서 CloudWatch Event 가 추가되어 있습니다.

 


5. EC2 인스턴스에 태그 추가

 

  • 아래와 같이 원하는 인스턴스에 태그를 붙여줍니다.

 


6. 결과 확인

  • CloudWatch의 로그 그룹을 확인하고 정상적으로 로그가 출력되었는지, 해당 시간에 EC2 인스턴스가 정상적으로 기동/중지되었는지 확인합니다.