# reference: https://aws.amazon.com/premiumsupport/knowledge-center/start-stop-lambda-eventbridge/ import boto3 import os import json import time import logging logging.basicConfig( format='%(asctime)s %(levelname)-8s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') logger = logging.getLogger(__name__) def start_instances(instances: list[str]) -> dict: ec2 = boto3.client('ec2', region_name=os.environ['AWS_REGION']) resp = ec2.start_instances(InstanceIds=instances) ec2.close() return resp def stop_instances(instances: list[str]) -> dict: ec2 = boto3.client('ec2', region_name=os.environ['AWS_REGION']) resp = ec2.stop_instances(InstanceIds=instances) ec2.close() return resp def instance_status(instances: list[str]) -> str: time.sleep(10) ec2 = boto3.client('ec2', region_name=os.environ['AWS_REGION']) ec2Array: list[dict] = [] response = ec2.describe_instances(InstanceIds=instances) for r in response['Reservations']: for i in r['Instances']: for t in i['Tags']: if t['Key'] == 'Name': ec2Array.append({'id': i['InstanceId'], 'name': t['Value'], 'state': i['State']['Name']}) ec2.close() return json.dumps(ec2Array) def lambda_handler(event, context): instances: list[str] = json.loads(os.environ['instances']) if event['action'] == 'start': logger.info('Starting instances: ' + str(instances)) resp = start_instances(instances) logger.info(instance_status(instances)) elif event['action'] == 'stop': logger.info('Stopping instances: ' + str(instances)) resp = stop_instances(instances) logger.info(instance_status(instances)) else: resp = "Event action not provided" return resp