――Lors de l'utilisation d'EC2 pour l'environnement de développement, il est facile d'oublier l'arrêt de l'instance lors du retour à la maison. «Il semble qu'il y ait un dicton:" Si la poussière s'accumule, elle devient une montagne. "
―― J'espère que vous pouvez avoir une idée des paramètres de rôle et d'interface graphique ici. [Méthode de classe] J'ai essayé de démarrer et d'arrêter automatiquement EC2 dans l'événement de planification de Lambda [Évitez d'oublier d'arrêter ou de supprimer EC2, RDS et ELB! Événement de planification Lambda] (http://dev.classmethod.jp/cloud/aws/lambda-scheduled-event-info/ "Évitez d'oublier d'arrêter ou de supprimer EC2, RDS, ELB! Événement LambdaSchedule")
--Pour le jugement des jours de la semaine ou des samedis et dimanches, si vous spécifiez MON-FRI dans ScheduleEvent (cron) de Lambda, il ne peut être exécuté que les jours de la semaine, mais si nécessaire en raison du problème UTC décrit plus tard, date standard python.weekday () etc. utilisation ――Il existe différentes façons de juger les vacances, mais au final, je me fie aux vacances japonaises de Google Agenda. Donc, j'ai un module python créé par Google, donc je vais l'utiliser. [google-api-python-client] (https://github.com/google/google-api-python-client "google-api-python-client")
--Lambda a deux façons d'écrire du code, l'une consiste à écrire lors de l'édition en ligne sur le navigateur, et l'autre consiste à compresser chaque module et à télécharger le code si vous souhaitez utiliser un module externe. --Google-api-python-client ne peut pas être utilisé, bien sûr, alors installez-le localement dans n'importe quel répertoire avec pip.
cd [Annuaire approprié]
sudo pip install --upgrade google-api-python-client -t ./
#Ecrire le fichier principal à exécuter sur Lambda dans le même répertoire
vim hoge.py
hoge.py
import boto3
import datetime
import sys
from apiclient.discovery import build
# https://console.developers.google.com/projet d'ici
API_KEY = '[Clé API de développement Google]'
CALENDAR_ID = 'ja.japanese#[email protected]'
#Les vacances de fin d'année et de nouvel an et les vacances d'entreprise ne démarrent pas automatiquement(YYYY-MM-Énumérer avec DD)。
company_holiday_list = []
#Nom de la fonction(Ici lambda_handler)Et le nom du fichier(Ici hoge.py)À
#Définir le nom du gestionnaire de Lambda ex.) hoge.lambda_handler
def lambda_handler(event, context):
client = boto3.client('ec2')
#Démarre automatiquement lorsque le nom de la balise «Arrêt automatique» est AUTO/Arrêtez
#Si le nom de tag «Arrêt automatique» est activé, seul l'arrêt automatique est effectué.
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)
#Confirmation du nom de l'événement de la source d'allumage
try:
#En cas de démarrage automatique, ne fonctionne que les jours de semaine sauf les samedis, dimanches et jours fériés
if '[ARN de la source de l'événement(ScheduleEvent pour le démarrage automatique)Copie]' in event['resources']:
if not str(datetime.date.today()) in holiday_list:
client.start_instances(InstanceIds=get_instanceid(query_start))
elif '[ARN de la source de l'événement(ScheduleEvent pour arrêt automatique)Copie]' in event['resources']:
client.stop_instances(InstanceIds=get_instanceid(query_stop))
elif '[ARN de la source de l'événement(ScheduleEvent pour l'arrêt automatique X minutes notification à l'avance)Copie]' in event['resources'] \
and (not str(datetime.date.today()) in holiday_list):
#Il est préférable d'écrire ici un processus qui vous informe de Slack 5 ou 10 minutes à l'avance.(Arrêt automatique de la prévention des explosions)
except Exception as e:
#La gestion des erreurs. Comme jeter une trace de pile dans 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()
--Télécharger le code vers Lambda
zip -r ~/hoge.zip .
aws lambda update-function-code --function-name [Nom de la fonction défini lors de la création de Lambda] --zip-file fileb://~/hoge.zip
-Veuillez réécrire [Event source ARN] dans votre propre environnement m (_ _) m La partie ARN dans l'image ci-dessous est un copier-coller. --Je ne veux pas diviser les fonctions Lambda en plusieurs fonctions par démarrage / arrêt automatique, donc Branche s'il s'agit de démarrage ou d'arrêt en fonction de l'événement source de déclenchement (nom ScheduleEvent). --Lambda's Schedule Event est UTC, alors soyez prudent lorsque vous le définissez et le manipulez! Par exemple, je veux que JST démarre automatiquement à 8 heures du matin! Dans ce cas, si c'est UTC, la date changera de JST, donc elle ne démarrera pas automatiquement.
Recommended Posts