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
--Créer un serveur Windows
Créez un EC2 pour obtenir une sauvegarde.
Le groupe de sécurité est défini au minimum.
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.
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.
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.
Cette fois, nous utiliserons le document "AWS EC2-CreateVssSnapshot" créé par AWS.
À partir des éléments cibles, sélectionnez le serveur que vous venez de mentionner et exécutez le document.
À partir de l'historique des commandes, vérifiez que l'état de la commande exécutée a réussi.
L'instantané a été pris avec succès.
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.
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.
Puisque des instantanés ont également été créés, il ne semble y avoir aucun problème.
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. ..