< strong>
Implémentez quelque chose comme Cloud automator Essayez div>
Contexte
En premier lieu, l'histoire de cette époque est "l'architecture sans serveur", "Cloud Automator" et "re: Invent".
Architecture sans serveur
Cela a été un sujet brûlant. Architecture sans serveur.
C'est bien d'être libre des opérations serveur, n'est-ce pas?
Cloud Automator
Cloud Automator est un outil SaaS qui automatise des opérations telles que la sauvegarde. Il est fourni par <a href="http://www.serverworks.co.jp/" target=blank"> Serverworks .
Ce que vous pouvez faire avec Cloud Automator et ses cas d'utilisation typiques sont les suivants.
--Démarrez l'instance EC2 uniquement pendant les heures ouvrables
- Sauvegarde automatique EBS et RDS
- Il n'y a pas de mal à voler, mais cette fois, le but n'est pas là, donc je ne présenterai pas le produit. Cloud Automator n'est qu'une histoire, donc je ne sais pas
re:Invent
Vous avez annoncé "Python support" et "Schedule-based execution".
Beaucoup de gens devraient être enthousiasmés par cette nouvelle.
Je voulais faire quelque chose qui intègre ces deux choses.
Que faire cette fois
Implémentons l'un des cas d'utilisation de Cloud Automator présentés dans ↑, "Automatisation du démarrage / arrêt de l'instance EC2" dans Lambda.
Lancez l'instance à 10h00 et déposez-la à 19h00. En mettant en œuvre cela, vous pouvez éviter d'oublier accidentellement de supprimer l'instance et de facturer une grande somme d'argent.
Diagramme
Comme ça.
Le Lambda actuel peut être démarré selon un calendrier, alors profitez-en.
Les composants sont les trois suivants.
--Lambda Function ... Fonction [1] pour démarrer à une certaine heure et notifier l'occurrence d'un "événement"
--SNS Sujet pour recevoir l'occurrence d'événement et appeler "action"
--Lambda Function ... Fonction [2] qui exécute des "actions" telles que Start / Stop (ou notification d'exécution) de l'instance cible
- Comme cela fonctionne sans le sujet SNS en bas à droite, nous ne le traiterons pas cette fois.
procédure
- Création d'un rôle IAM
- Créez un modèle pour la rubrique SNS et la fonction Lambda
- Mise en œuvre de la notification par e-mail sur le sujet SNS
- Paramètres de la source d'événements de la fonction Lambda
- Implémenter et tester la fonction Lambda
- Définir un minuteur pour la source d'événements de Lambda
Création d'un rôle IAM
Dans cette configuration, il existe deux types de fonctions Lambda, alors affectez-leur le rôle IAM approprié.
La fonction [1] utilise sns: Publish,
Dans la fonction [2], donnons les permissions de sns: Publish et ec2: StartInstances, ec2: StopInstances.
Cette fois, nous allons créer un rôle IAM à attribuer à Lambda, nous allons donc sélectionner ** Lambda pour le type de rôle **. Ne vous trompez pas.
Créer un modèle pour le sujet SNS et la fonction Lambda
Seul l'extérieur sera fait en premier.
Créez deux fonctions [1](pour déclencher l'heure de démarrage / d'arrêt), une fonction [2](pour exécuter le démarrage / l'arrêt) et au moins une rubrique SNS.
Incorporez le code de fonction dans un modèle approprié.
L'attribution de rôle IAM sera celle que vous avez créée précédemment.
Enregistrons Arn de la fonction [1] dans ** Subscriptions of Topic **.
Notification par e-mail mise en œuvre sur le sujet SNS
Vous pouvez l'utiliser pour vérifier l'opération en enregistrant votre propre adresse e-mail dans la rubrique créée ci-dessus.
Cela fonctionne même si ce n'est pas le pire.
Après avoir entré votre adresse e-mail dans Créer un abonnement, cliquez sur «Confirmer l'abonnement» et vous recevrez un e-mail de confirmation. L'inscription de l'abonnement est terminée lorsque vous suivez le lien fourni dans le texte.
Paramètres de source d'événements de la fonction Lambda
Définissez la source d'événement pour la fonction Lambda.
Tout d'abord, réglez la fonction [1] pour qu'elle démarre sur une base temporelle.
Vous pouvez écrire comme Cron. L'heure est actuellement uniquement UTC. Si vous souhaitez démarrer JST à 10h00 en semaine, cela ressemblera à l'illustration ci-dessus.
La fonction [2] est la même.
Sélectionnez simplement le sujet SNS. Il listera les sujets candidats au moment de l'établissement.
Fonction Lambda implémentée et testée
Voici un exemple de code.
#Exemple de code de fonction Lambda pour informer l'heure de démarrage d'EC2
import json
import boto3
sns_client = boto3.client("sns")
def lambda_handler(event, context):
print("Received event: " + json.dumps(event, indent=2))
# publish to SNS Topic ...
topic_arn = "my-topic-arn"
message = dict(Action="start", InstanceIds=["instance-id"])
param = dict(TopicArn=topic_arn, Subject="subject", Message=json.dumps(message))
return sns_client.publish(**param)
Il transmet des informations à Topic sur l'instance "quelle action (Démarrer / Arrêter)" doit être effectuée. Spécifications des paramètres
message = dict(Action="start", InstanceIds=["instance-id"])
La description ici est tout. Il est très absurde que le code soit directement tapé sur l'ID d'instance, mais allons-y sans nous en soucier.
Voici un exemple de code d'une fonction qui exécute en fait une action (démarrage / arrêt d'une instance).
import json
import boto3
ec2_client = boto3.client("ec2")
def lambda_handler(event, context):
# Get parameter
param = json.loads(event["Records"][0]["Sns"]["Message"])
# Invoke action
if param.get("Action", "") == "start":
ret = ec2_client.start_instances(InstanceIds=param.get("InstanceIds", []))
elif param.get("Action", "") == "stop":
ret = ec2_client.stop_instances(InstanceIds=param.get("InstanceIds", []))
return ret
Ne dites pas que la méthode d'acquisition des paramètres est sale. ..
Regardez les paramètres contenus dans Message et démarrez ou arrêtez l'instance appropriée.
La mise en œuvre est terminée comme ceci.
Questions et points de réflexion
Il y a beaucoup de choses, mais j'aimerais mentionner celles qui sont particulièrement préoccupantes. Si tout peut être amélioré, cela peut être utile même s'il est mis sur place.
Spécifiez directement l'instance
Les paramètres nécessaires doivent être tirés de l'extérieur. Dois-je au moins spécifier une balise?
En tant qu'appareil pour augmenter la polyvalence,
Il est envisageable d'implémenter la "Fonction Lambda qui crée la" Fonction Lambda créée cette fois "", d'encapsuler la Fonction avec API Gateway et de laisser l'instance cible être spécifiée par le paramètre POST. .. Méta-programmation. Je veux faire ça un jour.
Code sale
Je n'ai pas envisagé la gestion des erreurs ou quoi que ce soit.
À propos du message de SNS
Au stade de sa transmission au paramètre, JSON est converti une fois en chaîne de caractères, mais il devrait être possible de le transmettre en tant qu'objet JSON. Je n'ai pas assez étudié dans ce domaine.
Résumé
J'ai essayé d'automatiser EC2 Start / Stop à l'aide de Lambda.
Il y a encore beaucoup à faire et j'espère que nous pourrons le mettre à jour bientôt.
c'est tout.