특정 태그가 있는 Instance 자동 시작/정지 bot 너를 AWS Lambda로 만들기
마법의 말, 경비 절감
(잔업 많은 회사라면 존재를 누구나가 잊었을 무렵에 비극의 Shutdown을 가차없이 풀어 비교적 존재 미움받기 쉽다)
선인님의 참고 등
[클래스 메소드]
Lambda Schedule 이벤트에서 EC2를 자동 시작 및 자동 중지해 보았습니다.
EC2와 RDS, ELB 정지 잊어버리고 삭제 잊지 않도록! LambdaSchedule 이벤트
이번에 하고 싶은 일
평일 or 주말 or 공휴일
그래서, Google 근제의 python 모듈이 있으므로 사용하게 한다.
google-api-python-client
Lambda에서 외부 모듈을 사용할 때는 zip으로 코드 전체 업로드
cd [適当なディレクトリ]
sudo pip install --upgrade google-api-python-client -t ./
# 同じディレクトリ内でLambdaで実行するメインファイルを書く
vim hoge.py
hoge.py
import boto3
import datetime
import sys
from apiclient.discovery import build
# https://console.developers.google.com/project ここらへんから
API_KEY = '[Googleの開発APIキー]'
CALENDAR_ID = 'ja.japanese#[email protected]'
# 年末年始とか会社の休みは自動起動しない(YYYY-MM-DDで列挙)。
company_holiday_list = []
# 関数名(ここではlambda_handler)と、ファイル名(ここではhoge.py)を
# LambdaのHandler名に設定する ex.) hoge.lambda_handler
def lambda_handler(event, context):
client = boto3.client('ec2')
# タグ名「AutoShutdown」がAUTOだと自動起動/停止
# タグ名「AutoShutdown」がONだと自動停止のみ行う
query_start = [
{'Name': 'tag:AutoShutdown', "Values": ['AUTO']},
{'Name': 'instance-state-name', "Values": ['stopped']}
]
query_stop = [
{'Name': 'tag:AutoShutdown', "Values": ['ON', 'AUTO']},
{'Name': 'instance-state-name', "Values": ['running']}
]
service = build(serviceName='calendar', version='v3', developerKey=API_KEY)
events = service.events().list(calendarId=CALENDAR_ID).execute()
holiday_list = []
for item in events['items']:
holiday_list.append(item['start']['date'])
holiday_list.extend(company_holiday_list)
# 発火元event名の確認
try:
# 自動起動の場合は土日祝日を除く平日のみ動作させる
if '[Event sourceのARN(自動起動用ScheduleEvent)をコピー]' in event['resources']:
if not str(datetime.date.today()) in holiday_list:
client.start_instances(InstanceIds=get_instanceid(query_start))
elif '[Event sourceのARN(自動停止用ScheduleEvent)をコピー]' in event['resources']:
client.stop_instances(InstanceIds=get_instanceid(query_stop))
elif '[Event sourceのARN(自動停止X分前告知用ScheduleEvent)をコピー]' in event['resources'] \
and (not str(datetime.date.today()) in holiday_list):
# 5分とか10分前にSlack通知するような処理をここに書くとより親切(自動停止爆死予防)
except Exception as e:
# エラー処理。Slackにスタックトレース投げるとか。
print("SUCCESS: task succeeded")
return
def get_instanceid(query):
client = boto3.client('ec2')
response = client.describe_instances(Filters=query)
ec2_count = len(response['Reservations'])
ec2_list = []
if not ec2_count == 0:
for i in range(0, ec2_count):
ec2_list.append(response['Reservations'][i]['Instances'][0]['InstanceId'])
return ec2_list
else:
print("SUCCESS: specified hosts is None")
sys.exit()
zip -r ~/hoge.zip .
aws lambda update-function-code --function-name [Lambda作成時に設定したfunction名] --zip-file fileb://~/hoge.zip
일단 보충
이하의 화상으로 말하는 ARN의 부분을 말과 코피페입니다.
발화원 event(ScheduleEvent명)에 의해 start인지 stop인지를 분기시킨다.
예를 들면 JST에서 아침 8시에 자동 기동시키고 싶다! 그렇다면, UTC라면 JST와 날짜가 바뀌기 때문에 자동 기동하지 않는다든가.
※이 엔트리는 python 초보자가 작성한 것으로, 완전한 동작을 보증하는 것은 아닙니다. 오히려 좋은 가감한 아레입니다.
Reference
이 문제에 관하여(특정 태그가 있는 Instance 자동 시작/정지 bot 너를 AWS Lambda로 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jrsyo/items/1d2969e91f88d4cf6a4c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)