[PYTHON] Exécutez Systems Manager à partir de Lambda pour obtenir une sauvegarde d'EC2

introduction

Je me demandais s'il y avait un bon moyen d'obtenir une sauvegarde régulière d'EC2, mais j'ai découvert que SSM pouvait prendre des instantanés, alors je l'ai exécuté à partir de Lambda. Je vais ignorer la création du serveur, mais comme j'utilise Systems Manager, j'utilise Windows Server 2019, sur lequel l'agent SSM est installé par défaut.

référence Installer et configurer l'agent SSM sur l'instance Windows

Ce que j'ai fait

--Créer un serveur Windows

Création de serveur Windows et paramètres de rôle IAM

Créez un EC2 pour obtenir une sauvegarde. image.png

Le groupe de sécurité est défini au minimum. image.png

Une fois que vous avez créé EC2, associez le rôle IAM afin que Systems Manager puisse s'exécuter sur votre instance. Cette fois, pour la vérification, seuls EC2FullAccess (pour l'acquisition de cliché) et SSMManagedInstanceCore (pour l'exécution SSM) sont définis. image.png

Quelques minutes après la création d'EC2, vous pouvez voir l'instance cible à partir de l'instance gérée de Systems Manager. image.png

Obtenez une sauvegarde de Systems Manager

J'aimerais obtenir une sauvegarde avec Lambda immédiatement, mais assurez-vous d'abord que je peux obtenir une sauvegarde de Systems Manager.

Appuyez sur le bouton de commande d'exécution. image.png

Cette fois, nous utiliserons le document "AWS EC2-CreateVssSnapshot" créé par AWS. image.png

À partir des éléments cibles, sélectionnez le serveur que vous venez de mentionner et exécutez le document. image.png

À partir de l'historique des commandes, vérifiez que l'état de la commande exécutée a réussi. image.png

L'instantané a été pris avec succès. image.png

Exécuter des documents Systems Manager à partir de Lambda

Maintenant que vous avez une sauvegarde de Systems Manager, exécutons Systems Manager à partir de Lambda.

Tout d'abord, créez un rôle IAM pour exécuter Lambda. Commencez avec uniquement l'autorisation d'exécution de Lambda et continuez tout en éliminant l'erreur. image.png

Au fait, le code Lambda ressemble à ceci (écrit en Python)

lambda_function.py


import json
import traceback
import boto3
import logging
from datetime import datetime

logger = logging.getLogger()
logger.setLevel(logging.INFO)

instance_id = 'i-0bec94e365078de8c'
document_name = 'AWSEC2-CreateVssSnapshot'
exec_date = datetime.now().strftime("%Y/%m/%d_%H:%M:%S")
snapshot_name = 'testserver-snapshot-' + exec_date

def lambda_execute_ssm(event):
    
    ssm = boto3.client('ssm')
    
    logger.info("Start Get Snapshot")

    ssm_result = ssm.send_command(
        InstanceIds = [ instance_id ],
        DocumentName = document_name,
        Parameters = {
            'ExcludeBootVolume': [
                'False',
            ],
            'description': [
                'Ssm Execute Document',
            ],
            'tags': [
                'Key=Name,Value={}'.format(snapshot_name),
            ]
        }
    )
    logger.info("exec lambda result -> {}".format(ssm_result))    
    logger.info("Completed!")

def lambda_handler(event, context):
    try:
        lambda_execute_ssm(event)
    except Exception:
        logger.error('Exception -> {}'.format(traceback.format_exc()))

Lorsque j'essaie d'exécuter Lambda dans cet état, l'erreur suivante se produit

botocore.exceptions.ClientError: An error occurred (AccessDeniedException) when calling the SendCommand operation: User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/lambda-ssm-handler/ssm-execution is not authorized to perform: ssm:SendCommand on resource: arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:instance/i-0bec94e365078de8c

En ce qui concerne le contenu de l'erreur, j'essaie d'exécuter SendCommand de SSM, mais il semble que la cause en soit que Lambda n'a pas cette autorité?

Lorsque j'ai joint une stratégie (AmazonSSMMaintenanceWindowRole) qui autorise SSM SendCommand au rôle de Lambda et que j'ai réexécuté Lambda, cela s'est terminé avec succès. image.png

Puisque des instantanés ont également été créés, il ne semble y avoir aucun problème. image.png

Supplément aux conclusions et constatations

Depuis que j'ai pu obtenir une sauvegarde de Lambda, il semble que je puisse l'obtenir régulièrement si je l'exécute selon un calendrier avec CloudEvent, etc.

De cette façon, vous devez également créer un Lambda pour la suppression, donc le gestionnaire de cycle de vie peut être meilleur à cet égard, mais le gestionnaire de cycle de vie a un décalage dans l'acquisition et une flexibilité à voir avec CloudWatch Event cron Il n'est pas possible de définir une planification, donc si vous en avez besoin, vous devez exécuter Lambda.

En fait, je voulais créer un endroit pour notifier SNS lorsque la commande SSM échoue, mais comme des erreurs se produisaient fréquemment lors du passage du rôle de notification SNS, j'ai décidé de prendre un instantané une fois. Je ne peux pas comprendre autour du rouleau IAM. ..

Recommended Posts

Exécutez Systems Manager à partir de Lambda pour obtenir une sauvegarde d'EC2
Comment obtenir une liste de liens à partir d'une page de wikipedia
Comment obtenir la valeur du magasin de paramètres dans lambda (en utilisant python)
Exécutez BigQuery à partir de Lambda
[Commande] Commande pour obtenir une liste de fichiers contenant des caractères pleine largeur
Je veux démarrer beaucoup de processus à partir de python
Comment obtenir une liste d'exceptions intégrées pour python
Couches AWS Lambda Une explication rapide de la création à la liaison
Envoyer une demande d'AWS Lambda à Amazon Elasticsearch Service
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
Essayez d'obtenir la liste des fils du bulletin d'information (je n'aime pas) avec Python.
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
TensorFlow Pour apprendre d'un grand nombre d'images ... ~ (presque) solution ~
[Python] Comment obtenir et modifier les lignes / colonnes / valeurs d'une table.
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
Comment utiliser la reconnaissance visuelle pour obtenir l'ID de ligne d'une fille
[Python] Obtenir la date de mise à jour d'un article d'actualité à partir de HTML
J'ai essayé d'obtenir une liste de noms AMI en utilisant Boto3
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Appelez dlm depuis python pour exécuter un modèle de régression à coefficient variable dans le temps
Comment obtenir un ingénieur de la trentaine
Créez une fonction pour obtenir le contenu de la base de données dans Go
Préparation à l'exécution de Flask sur EC2
[Lambda] [Python] Publier sur Twitter depuis Lambda!
[EC2] Comment exécuter le pilote Web sélénium
[EC2] Comment faire une capture d'écran de votre smartphone avec du sélénium
[Mémo Python] Je souhaite obtenir un nombre hexadécimal à 2 chiffres à partir d'un nombre décimal
Lors de l'exécution d'un shell Python à partir d'Electron, transmettez plusieurs arguments pour exécuter Python.
[Linux] Une commande pour obtenir une liste des commandes exécutées dans le passé
Pour trouver le nom de la vue avec l'espace de noms à partir de l'URL (path_info) dans Django
Comment obtenir un exemple de rapport à partir d'une valeur de hachage à l'aide de l'API de Virus Total
Obtenez le titre de la chanson à partir du titre de la vidéo que vous avez chanté
Obtenez le salaire moyen d'un emploi avec des conditions spécifiées sur Indeed.com
TensorFlow Pour apprendre d'un grand nombre d'images ... (Problème non résolu) → 12/18 Résolu
Let Code Day6 commençant à zéro "1342. Nombre d'étapes pour réduire un nombre à zéro"