## AWS Lambda + CloudWatch 를 이용해 주기적으로 AWS EC2 중지, 시작하는 방법(How to stop and start AWS EC2 periodically using AWS Lambda + CloudWatch)
[해당 글](https://ghkdgh2365.blogspot.com/2020/12/aws-lambda-cloudwatch-aws-rds-how-to.html)을 쓴 김에 쓰는 글입니다.
### AWS Lambda + CloudWatch 설정
먼저 크게
1. AWS Lambda 설정
2. IAM 정책 설정,
3. CloudWatch 설정
순으로 나눠서 설정해보자.
#### 1. AWS Lambda 설정
AWS 계정은 있다고 가정하고, AWS에 로그인하고 들어가 서비스에서 **AWS Lambda** 를 클릭한다. 그 다음 **함수 생성**을 클릭.
**새로 작성** 을 선택하고(그대로 두고) **함수 이름** 을 작성합니다. 런타임(사용할 언어)의 경우 여기선, Python 2.7로 하겠습니다.
그리고 **권한**은 그대로 **기본 Lambda 권한을 가진 새 역할 생성** 으로 두고 **함수 생성**을 클릭합니다. 생성이 되면 생성된 함수에 들어가 코드를 삽입합니다.
**함수 코드**는 다음과 같이 삽입합니다. 아래의 코드는 EC2를 중지하는 코드입니다.
```
import boto3
region = 'ap-northeast-2' # EC2가 존재하는 region
instances = ['i-0dd344443184503fa'] # EC2 Instance id
def lambda_handler(event, context):
ec2 = boto3.client('rds', region_name=region)
ec2.stop_instances(InstanceIds=instances)
print 'stopped your EC2: ' + str(instances)
```
EC2를 시작하는 경우엔 `ec2.stop_instances` 대신 `ec2.start_instances` 를 적어주면 됩니다.
##### 함수 코드를 수정한 후에는 꼭 저장을 하고, 배포 버튼을 눌러야합니다 !!!
그리고 **권한** 탭을 선택하고 **편집** 버튼을 누릅니다. 이 때, **역할 이름** 을 복사하거나 기억해두세요. **IAM 설정** 시 필요합니다. **편집**에 들어간 후, **제한 시간**을 **10초**로 변경합니다. 더 길게 해도 됩니다. 이제 **IAM 정책**을 설정하고, 해당 **Lambda의 권한**을 설정해봅시다.
#### 2. IAM 정책 설정
**IAM**에 가서 **정책**에 들어가 **정책 생성** 을 클릭합니다. 그 다음 **JSON** 탭을 선택한 후 아래 **코드**를 삽입하고 **정책 검토** 를 클릭합니다.
```
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"ec2:Start*",
"ec2:Stop*"
],
"Resource": "*"
}
]
}
```
**정책 검토** 단계에서 의미있는 **이름** 과 **설명** 을 작성하고 **정책 생성** 을 클릭합니다.
생성이 되면, **IAM 역할** 메뉴에 들어가서 위의 **역할 이름** 을 검색한 후, 클릭해서 들어갑니다. 그 다음 **정책 연결** 을 누른 후, 위에서 생성한 정책 이름을 검색해서 체크한 후 **정책 연결** 버튼을 클릭합니다. 그러면 IAM 정책 설정이 완료됐습니다. 마지막으로 **CloudWatch** 설정을 해보겠습니다.
#### 3. CloudWatch 설정
**AWS CloudWatch** 에 들어간 후, 왼쪽 메뉴 중 **규칙** 메뉴를 선택합니다. 그 다음, **규칙 생성** 버튼을 클릭합니다.
**일정** 버튼을 클릭하고 **Cron 표현식**으로 원하는 일정으로 설정합니다. 저의 경우 매주 목요일 오후 7시 40분 마다 호출할 예정이기 때문에 다음과 같이 Cron 표현식을 적었습니다. UTC 기준으로 설정하는 것이기 때문에 한국 시간으로 19:40 THU 는 10:40 THU 로 써야하고 이는 아래와 같이 적습니다.
```
40 10 ? * THU *
```
Cron 표현식에 대한 정보는 [이 곳](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)에서 확인해보실 수 있습니다. 참고로 [CronMaker](http://www.cronmaker.com/?1) 와 같은 사이트에서 도움을 받을 수 있습니다.
그 다음 오른쪽 **대상** 에선 Lambda 함수를 선택하고, 위에서 만든 함수 이름을 찾아 선택하고 **세부 정보 구성** 을 선택합니다. 의미있는 **이름**과 **설명**을 작성한 후 **규칙 생성** 버튼을 클릭합니다. 이제 설정이 끝났습니다. 기다려보면 확인할 수 있습니다. 참고로 **Lambda**가 잘 실행되는지 확인해보기 위해선 해당 Lambda 페이지에서 **테스트** 버튼을 눌러서 테스트해볼 수 있습니다.
**참고한 사이트**
https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html
https://qastack.kr/server/867642/how-to-start-and-stop-aws-ec2-instance-based-on-a-time-based-schedule
https://docs.aws.amazon.com/ko_kr/autoscaling/plans/userguide/security_iam_id-based-policy-examples.html
http://www.cronmaker.com/?1
댓글
댓글 쓰기