•  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 인스턴스가 정상적으로 기동/중지되었는지 확인합니다.

 

 

①번 글에서 접속하였던 원격 데스크톱 환경(Windows Server 2022)에서 이어서 진행합니다.

이전 ①번 글 링크 : https://witch49.tistory.com/34

 

 

 

진행할 순서는 아래와 같다.

1) hostname(컴퓨터 이름) 변경

2) Active Directory 설치

3) AD 설정

4) 도메인 계정 생성

5) 공유 폴더 설정

 

1) hostname(컴퓨터 이름) 변경

1. 파일 탐색기 > 컴퓨터 우클릭 > 속성 클릭

 

2. Advanced system settings > Change.. > 원하는 컴퓨터 이름 입력 후 OK.

 

3. 바뀐 이름을 적용하려면 컴퓨터를 재시작해야 한다. 알림창이 뜨면 'Restart Now'를 클릭해 재부팅한다.

 

2) Active Directory 설치

1. 윈도우 버튼 > Server Manager 클릭

 

2. 우측 상단의 Manage > Add Roles and Features 클릭

 

3. 내용을 확인하면서 'Next'를 눌러 설치를 진행한다.

 

4. 'Role-based or feature-based installation' 선택 후 Next.

 

5. 'Select a server from the server pool' 선택 후 Next.

 

6. 'Active Directory Domain Services' 와 'DNS Server' 선택 후 Next.

 

7. 내용 확인 후 Next.(딱히 변경한 설정 없음)

 

8. 내용 확인 후 Next

 

9. 내용 확인 후 Next

 

10. 'Install' 을 눌러 설치를 진행한다.

 

 

3) AD 설정

1. 설치가 완료되면 'Promote this server to a domain controller' 를 클릭하여

현재 서버를 domain controller로 승격시킨다.

만약 그냥 Close를 눌러 닫았다면 대시 보드에서도 선택이 가능하다.

(사진 출처 : https://hec-ker.tistory.com/314)

 

2. 'Add a new forest' 를 선택하여 Root domain name 입력 후 'Next' 클릭.

 

3. 비밀번호 입력 후 Next

 

4. 내용 확인 후 Next

 

5. 도메인 이름 입력 후 Next

 

6. 필요 시 경로 변경 후 Next

 

7. 설정을 제대로 하였는지 확인 후 Next

 

8. Install을 눌러 설치

 

9. 설치가 완료되면 자동으로 서버가 재부팅된다.

다시 원격 데스크톱으로 접속하여 제대로 설치되었는지 확인한다.

패스워드가 틀렸다고 접속이 안될 경우, AWS 웹 화면에서 인스턴스를 재부팅하면 된다.

 

4) 도메인 계정 생성

1. 우측 상단의  Tools > Active Directory Users and Computers 클릭

 

2. Users 우클릭 > New > User 선택

 

3. 내용 입력 후 Next

 

4. 비밀번호를 입력하고 필요한 옵션 선택 후 Next

 

5. 내용 확인 후 Finish를 눌러서 계정 생성을 완료한다.

 

6. 계정 권한을 변경해준다.

Tools > Active Directory Users and Computers 선택

 

7. Users를 더블클릭하여 방금 생성한 계정 우클릭 > Properties 선택

 

8. Member Of 탭을 선택하여 Add 버튼 클릭하고, 필요한 권한을 가진 그룹 이름 기입 후 OK를 눌러 추가를 완료한다.

 

5) 공유 폴더 설정

아래 내용은 Administrator 계정으로 진행한다.

 

1. Window + R 키 누른 후 fsmgmt.msc 입력

 

2. 'Shares' 폴더 더블클릭 후 우클릭 > New > Share... 을 선택하여 공유 폴더를 새로 생성한다.

 

3. 설치 절차에 맞게 진행한다.

필요한 옵션 선택 후 Finish

생성을 완료하고 목록에 생성한 폴더가 있는지 확인한다.

 

4. 방금 만든 폴더에 테스트용 파일을 하나 저장한다.

 

5. 생성한 파일 우클릭 > Properties 선택

 

6. 'Publish' 탭에 'Publish this share in Active Directory' 체크 후 OK

 

7. 새로 생성했던 유저로 로그인하여 공유 폴더가 보이는지 확인

 

 

 

● 참고 사이트

https://honglab.tistory.com/125

https://hec-ker.tistory.com/318?category=882233 

 

+ Recent posts