はじめに
- 今回のEC2インスタンスの自動起動・自動停止には、 Event BridgeとLambdaを通じて、それぞれの
EC2インスタンスを、それぞれのタイミングで起動、停止させる方法をご紹介します。 - EC2に付けたTagを読んで、Lambdaがインスタンスの起動、停止タイミングを決定します。
(現在の文章では時間単位の設定のみ可能になります。) - LambdaのIAMロールは、EC2 Full Access権限を使用しております。
図式化
リソス
◼︎Amazon EventBridge
ec2-auto-stop-start
毎時、Lambdaを動けるようにトリガーとして動作します。
◼︎AWS Lambda
ec2_instances_auto_start_stop (python3.10)
Lambda Code(lambda_function)
import boto3
from datetime import datetime
# Tokyo Region
region = 'ap-northeast-1'
# MON ~ SUN
day_t = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
def lambda_handler(event, context):
print("Function Start")
now_date = day_t[datetime.today().weekday()]
now_hour = int(datetime.now().strftime('%H')) + 9
print("now >> date: " + now_date + ", hour: " + str(now_hour))
# Search for instance's tags
ec2 = boto3.client('ec2', region_name=region)
response = ec2.describe_tags(
Filters=[
{
'Name': 'resource-type',
'Values': ['instance']
}
]
)
# Save the Values
enable_instances = []
autostop_instances = []
day_instances = {}
time_instances = {}
# Acquisition of Tags information
for tag in response['Tags']:
if tag['Key'] == "AUTOSTART_ENABLE" and tag['Value'].lower() == "true":
enable_instances.append(tag['ResourceId'])
if tag['Key'] == "DAY":
day_instances[tag['ResourceId']] = tag['Value']
if tag['Key'] == "TIME":
time_instances[tag['ResourceId']] = tag['Value']
if tag['Key'] == "AUTOSTOP_ENABLE" and tag['Value'].lower() == "true":
autostop_instances.append(tag['ResourceId'])
# AUTO_STOP_ENABLE Tag is "true" and now_hour =19 than Stop instances
for instance in autostop_instances:
if now_hour == 19:
ec2.stop_instances(InstanceIds=[instance])
# AUTO_START_ENABLE Tag is "true" than Stop/START instances
for instance in enable_instances:
try:
# Date Tag is "true" than
days = day_instances[instance].split(",")
is_day = False
for d in days:
if now_date == d:
is_day = True
# Time tag is "true" than
times = time_instances[instance].split("-")
is_start_time = False
is_end_time = False
if int(times[1].strip()) == now_hour:
is_end_time = True
elif int(times[0].strip()) == now_hour:
is_start_time = True
if is_day == True and is_end_time == True:
# Stop instances
ec2.stop_instances(InstanceIds=[instance])
elif is_day == True and is_start_time == True:
# Start instances
ec2.start_instances(InstanceIds=[instance])
except Exception as ex:
print(ex)
print("Function End")
東京リージョンのEC2の情報を取得して、対象のEC2を自動で起動ー停止させるようにします。
「関数名:region」を変更すると他のリージョンでも対応できます。
◼︎Amazon Cloud watch
/aws/lambda/ec2_instances_auto_start_stop
実行時間、対象インスタント(RequestID)、Function開始、終了など、わかるようにしておきました。
設定方法
◼︎Defaultの設定、任意のタイミングで起動させたい場合(19時に終了)
Key | Value |
AUTOSTOP_ENABLE | true、false |
*停止させたくない場合は、True以外のデータを入れることで対応できます。
◼︎起動ー停止時間をカスタマイズしたい場合
KEY | VALUE |
AUTOSTART_ENABLE | true,false |
TIME | 00-23 (必要な時間 "-"文字で、値を取得しますので、こちらでお願いします) |
DAY | MON,TUE,WED,THU,FRI,SAT,SUN(必要な日","文値を取得しますので、こちらでお願いします) |
終わりに
Scheduled eventsでも、簡単に設定もできますので、是非ご参考いただければと思っております。
Scheduled event:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html
参考:
https://aws.amazon.com/jp/blogs/mt/auto-tag-aws-resources/