본문 바로가기
Cloud/AWS

【AWS】 EC2の自動起動・停止設定(Event Bridge + Lambda)

by migre 2023. 7. 11.

 


はじめに

  • 今回の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/

 

Automatically tag new AWS resources based on identity or role | Amazon Web Services

You might have heard the adage to “tag early, tag often” in infrastructure planning and design sessions. Using accurate, meaningful tags on your AWS resources is a best practice. Consistently applied resource tags deliver organizational benefits such a

aws.amazon.com