- AWS의 IAM, Lambda, CloudWatch 를 활용하여 EC2 인스턴스 자동 시작/중지 기능을 추가할 수 있습니다.
- 위의 설정을 완료한 후 원하는 EC2 인스턴스의 tag 에 아래와 같이 추가하면 CloudWatch에서 설정한 시간에 인스턴스가 자동 시작/중지됩니다.
- Name='Ec2AutoStart', Value='True'
- Name='Ec2AutoStop', Value='True'
- 아래와 같은 순서로 진행합니다.
- IAM 정책 생성
- IAM 역할 생성
- Lambda 함수 생성
- CloudWatch 이벤트 규칙 생성
- EC2 인스턴스에 태그 추가
- 결과 확인
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 인스턴스가 정상적으로 기동/중지되었는지 확인합니다.
'인프라 > AWS 실습' 카테고리의 다른 글
[AWS]실습 2_Windows Server - Active Directory 구축하기 ③ (미완) (0) | 2022.06.17 |
---|---|
[AWS]실습 2_Windows Server - Active Directory 구축하기 ② (0) | 2022.06.16 |
[AWS]실습 1_Windows Server - Active Directory 구축하기 ① (0) | 2022.06.15 |