Je voulais le faire depuis longtemps, mais quand j'ai pensé que ce serait génial de le faire en Java, Je n'ai pas écrit qu'AWS Lambda peut fonctionner en Python, donc Cela fait 3 mois que j'ai décidé de relever le défi.
Je l'ai essayé pendant que diverses personnes l'écrivaient.
Créer une table dans DynamoDB, définir les informations de balise pour l'heure et l'instance, Indiquez si vous souhaitez démarrer ou arrêter.
La fonction Lambda (Python) s'exécute toutes les 10 minutes, S'il correspond à l'heure des données stockées dans DynamoDB, Pour toutes les instances dont les informations de balise correspondent Démarrer ou arrêter.
Créez une table "EC2" dans DynamoDB. Il y a quatre éléments. "Id" "Time" "Tag" "Start Stop".
Lambda Function(Python)
Il y a certains points avec lesquels je me suis personnellement battu.
Et le code est le suivant.
import boto3
import datetime
from boto3.dynamodb.conditions import Key, Attr
def lambda_handler(event, context):
# create EC2 client
ec2 = boto3.client('ec2')
# get the time(%H:%M)
timeInfo = datetime.datetime.now().strftime("%H:%M")
tableInfoList = getTableInfoList(timeInfo)
instanceList = getInstanceStartStopList(ec2, tableInfoList)
executeInstanceStartStop(ec2, instanceList)
# get the list of data (Id, StartEnd, Tag, Time)
# Id : Sequence
# StartEnd : "start" or "stop"
# Tag : Tag-key
# Time : %H:%M ex) 09:00
# @param timeInfo
# @return list of data(Id, StartEnd, Tag, Time)
def getTableInfoList(timeInfo):
dynamodb = boto3.resource('dynamodb')
#Set TableName
table = dynamodb.Table('EC2')
#Send the Query
#Query Parameter
# @param TimeInfo : [hh:mm]
#TimeInfo = "09:00"
tableInfoList = table.scan(
FilterExpression=Attr('Time').eq(timeInfo)
)['Items']
return tableInfoList
# get the list of data (Start or Stop Instance Ids)
# @param ec2
# @param tableInfoList
# @return instanceList Dictionaly('start', 'stop')
def getInstanceStartStopList(ec2, tableInfoList):
startInstanceIdList = []
stopInstanceIdList = []
for tableInfo in tableInfoList:
for reservation in ec2.describe_instances(Filters=[{'Name':'tag-key','Values':[tableInfo['Tag']]}])["Reservations"]:
for instance in reservation["Instances"]:
if (tableInfo['StartStop'] == 'start'):
startInstanceIdList.append(instance["InstanceId"])
elif (tableInfo['StartStop'] == 'stop'):
stopInstanceIdList.append(instance["InstanceId"])
instanceList = {"start":startInstanceIdList, "stop":stopInstanceIdList}
return instanceList
# Start of Stop Instances
# @param ec2
# @param instanceList
def executeInstanceStartStop(ec2, instanceList):
startInstanceIdList = instanceList["start"]
stopInstanceIdList = instanceList["stop"]
if not len(startInstanceIdList) == 0:
ec2.start_instances(InstanceIds=startInstanceIdList)
if not len(stopInstanceIdList) == 0:
ec2.stop_instances(stopInstanceIdList)
J'ai réussi à le faire par essais et erreurs.
A partir de maintenant, je pense à faire quelque chose qui accompagne ça.
Je ne sais pas quand ce sera. .. ..