PCG logo
Artikel

Doppelte Kosten vermeiden: Automatische EFS-Backups und AWS-Backup-Pläne

In diesem Blogbeitrag werde ich Amazon Elastic File System (EFS) in Verbindung mit AWS Backup besprechen. Es ist durchaus möglich, dass Sie bei der Verwendung von EFS und AWS Backup versehentlich doppelte Backups erstellen, was zu doppelten AWS Backup-Kosten führt. In diesem Artikel erkläre ich, warum dies geschieht, und schlage eine Lösung vor, um dies mithilfe einer benutzerdefinierten AWS Config-Regel zu überwachen.

Was sind EFS und AWS Backup?

Amazon Elastic File System (EFS) ist ein Managed-File-System-Service, der skalierbaren, elastischen Speicher für die Verwendung mit AWS-Diensten und lokalen Ressourcen bietet. Er ermöglicht mehreren Instanzen den gleichzeitigen Zugriff auf Daten und ist damit ideal für Anwendungsfälle wie Big Data und Analysen, Datenverarbeitungsworkflows und Content Management.

AWS Backup ist ein Full-Managed-Service, der die Datensicherung über AWS-Services hinweg zentralisiert und automatisiert. Er vereinfacht den Prozess der Datensicherung und -wiederherstellung und sorgt für Geschäftskontinuität und die Einhaltung gesetzlicher Vorschriften.

Die „Falle“ der doppelten Backup-Kosten

Wenn ein neues Amazon Elastic File System (EFS) erstellt wird, ist die Funktion „Automatische Backups“ des EFS standardmäßig aktiviert. Dies führt zur Erstellung eines AWS-Sicherungsplans mit dem Namen „aws/efs/automatic-backup-plan“ und eines Sicherungsdepots mit dem Namen „aws/efs/automatic-backup-vault“, in dem die Backups automatisch mit einer Gesamtaufbewahrungszeit von 5 Wochen gespeichert werden.

image-6a0cf3119b0b

Erstellungsassistent zum Erstellen eines EFS-Dateisystems

image-7f6f8069a8ec

Automatische Backups sind standardmäßig aktiviert

Wenn jedoch AWS Backup Pläne auch auf alle Konten in der AWS-Organisation ausgeweitet werden oder wenn der Kontonutzer zusätzliche AWS Backup Pläne einrichtet, die das EFS entweder nach Ressourcentyp oder über Tags einschließen, wird das EFS-Dateisystem in verschiedenen Backup Vaults gesichert. Diese Redundanz führt zu doppelten AWS Backup Kosten.

image-c60b905350f4

Einen AWS Backup Plan erstellen

In diesem Beispiel habe ich zwei EFS-Dateisysteme erstellt: eines mit aktivierten „automatischen Sicherungen“ und eines ohne. Außerdem werden alle EFS-Dateisysteme mit einem benutzerdefinierten AWS Backup Plan gesichert. Infolgedessen wurden über Nacht zwei Sicherungen im Backup Vault „test-vault-efs“ und eine im „Automatic Backup“-Vault „aws/efs/automatic-backup-vault“ gespeichert.

image-764c92311d6d

AWS Backup Vault Ansicht

Wie können wir auf doppelte Backups für EFS-Dateisysteme achten?

Um zu überwachen, ob doppelte Backups für EFS-Dateisysteme erstellt werden, habe ich eine benutzerdefinierte AWS Config-Regel erstellt. Diese Regel prüft alle 12 Stunden, ob EFS-Dateisysteme Wiederherstellungspunkte in mehr als einem Backup Vault haben. Ist dies der Fall, wird das EFS als nicht konform gekennzeichnet.

Hier ist ein Beispiel mit meinen zwei Test-EFS-Dateisystemen, von denen eines konform und das andere nicht konform ist.

image-8b7456f8e0ea

AWS Config Custom Regel

Wenn EFS-Dateisysteme mit doppelten Backups gefunden werden (d. h. als nicht konform gekennzeichnet sind), können Sie die automatische EFS-Sicherung für diese Systeme einfach deaktivieren.

Darüber hinaus generiert die zugehörige AWS Lambda-Funktion ein Protokoll, das genau zeigt, welche EFS-Dateisysteme über Sicherungen in welchen Backup-Vaults verfügen.

image-8350d8846c92

Lambda-Log-Gruppen

Nachfolgend finden Sie die CloudFormation-Vorlage, die die Lambda-Funktion für die Prüfung, die entsprechende IAM-Rolle sowie die AWS-Konfigurationsregel, die alle 12 Stunden ausgeführt wird, erstellt.

Dieser Stack kann entweder direkt in Ihrem AWS-Konto oder in der gesamten AWS-Organisation über CloudFormation StackSet oder Lösungen wie CfCTExternal Link oder LZAExternal Link bereitgestellt werden. Wenn der AWS Config Aggregator in Ihrer Umgebung eingerichtet ist, haben Sie auch die Möglichkeit, in der gesamten AWS-Organisation nach doppelten Backups von EFS-Dateisystemen zu suchen.

yaml
Code kopiert!copy-button
AWSTemplateFormatVersion: '2010-09-09'
Description: >
  CloudFormation Template to create a Lambda function, IAM role, and AWS Config Rule to check if duplicate EFS backups exist.

Resources:
  # IAM Role for Lambda
  DuplicateEFSBackupCheckRole:
    Type: 'AWS::IAM::Role'
    Properties: 
      AssumeRolePolicyDocument: 
        Version: '2012-10-17'
        Statement: 
          - Effect: "Allow"
            Principal: 
              Service: 
                - 'lambda.amazonaws.com'
            Action: 
              - 'sts:AssumeRole'
      Policies:
        - PolicyName: 'DuplicateEFSBackupCheckPolicy'
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: 'Allow'
                Action:
                  - 'logs:CreateLogGroup'
                  - 'logs:CreateLogStream'
                  - 'logs:PutLogEvents'
                Resource: '*'
              - Effect: 'Allow'
                Action:
                  - 'elasticfilesystem:DescribeFileSystems'
                Resource: '*'
              - Effect: 'Allow'
                Action:
                  - 'backup:ListBackupVaults'
                  - 'backup:ListRecoveryPointsByBackupVault'
                Resource: '*'
              - Effect: 'Allow'
                Action:
                  - 'config:PutEvaluations'
                Resource: '*'

  # Lambda Function
  DuplicateEFSBackupCheckLambda:
    Type: 'AWS::Lambda::Function'
    Properties:
      Handler: 'index.lambda_handler'
      Role: !GetAtt 'DuplicateEFSBackupCheckRole.Arn'
      Code:
        ZipFile: |
          import boto3
          from botocore.exceptions import ClientError
          import json

          def lambda_handler(event, context):
              message = json.loads(event['invokingEvent'])
              
              if message['messageType'] == 'ScheduledNotification':
                  handle_scheduled_config(event, message, context)
              else:
                  print(f'Unexpected event {event}.')

          def handle_scheduled_config(event, message, context):
              efs_client = boto3.client('efs')
              backup_client = boto3.client('backup')
              
              # Get List of all EFS File Systems
              file_systems = efs_client.describe_file_systems()
              
              # Iterate over the EFS File Systems
              for fs in file_systems['FileSystems']:
                  compliance_status = 'COMPLIANT'
                  file_system_id = fs['FileSystemId']
                  region = boto3.session.Session().region_name
                  account_id = context.invoked_function_arn.split(":")[4]
                  
                  # Construct the File System ARN
                  file_system_arn = f'arn:aws:elasticfilesystem:{region}:{account_id}:file-system/{file_system_id}'
                  
                  # Get list of all backup vaults
                  backup_vaults = backup_client.list_backup_vaults()
                  
                  recovery_point_count = 0
                  vaults_with_recovery_points = []
                  
                  # Iterate over each backup vault
                  for vault in backup_vaults['BackupVaultList']:
                      vault_name = vault['BackupVaultName']
                      
                      # List recovery points for the file system in each vault
                      try:
                          recovery_points = backup_client.list_recovery_points_by_backup_vault(
                              BackupVaultName=vault_name,
                              ByResourceArn=file_system_arn
                          )
                          if 'RecoveryPoints' in recovery_points and recovery_points['RecoveryPoints']:
                              recovery_point_count += 1
                              vaults_with_recovery_points.append(vault_name)
                      except ClientError as e:
                          print(f"Error describing recovery points for vault {vault_name} and file system {file_system_id}: {e}")
                          continue
                  
                  # Print the vaults with recovery points for the current file system
                  if vaults_with_recovery_points:
                      print(f"File System {file_system_id} has recovery points in the following vaults: {', '.join(vaults_with_recovery_points)}")
                  
                  # If the file system has recovery points in more than one backup vault, mark as NON_COMPLIANT
                  if recovery_point_count > 1:
                      print(f"File System {file_system_id} is NON_COMPLIANT")
                      compliance_status = 'NON_COMPLIANT'
                  else:
                      print(f"File System {file_system_id} is COMPLIANT")
                  
                  # Send evaluation result to AWS Config
                  send_evaluation_result(file_system_id, compliance_status, message['notificationCreationTime'], event['resultToken'])

          def send_evaluation_result(resource_id, compliance_status, timestamp, result_token):
              # Prepare evaluation result
              evaluation_result = {
                  'ComplianceResourceType': 'AWS::EFS::FileSystem',
                  'ComplianceResourceId': resource_id,
                  'ComplianceType': compliance_status,
                  'OrderingTimestamp': timestamp
              }
              
              # Create AWS Config client
              config_client = boto3.client('config')
              
              try:
                  # Put the evaluation result to AWS Config
                  config_client.put_evaluations(
                      Evaluations=[evaluation_result],
                      ResultToken=result_token
                  )
              except ClientError as e:
                  print(f"Error sending evaluation result to AWS Config: {e}")
      Runtime: 'python3.12'
      Timeout: 300

  # Lambda Permission
  DuplicateEFSBackupCheckLambdaPermission:
    Type: 'AWS::Lambda::Permission'
    Properties:
      FunctionName: !GetAtt 'DuplicateEFSBackupCheckLambda.Arn'
      Action: 'lambda:InvokeFunction'
      Principal: 'config.amazonaws.com'
      SourceAccount: !Sub ${AWS::AccountId}

  # AWS Config Rule
  DuplicateEFSBackupCheckConfigRule:
    Type: 'AWS::Config::ConfigRule'
    Properties: 
      ConfigRuleName: 'duplicate-efs-backup-check'
      Description: 'Checks if an EFS file system has backups in more than one backup vault.'
      Scope: 
        ComplianceResourceTypes: 
          - 'AWS::EFS::FileSystem'
      Source: 
        Owner: 'CUSTOM_LAMBDA'
        SourceIdentifier: !GetAtt 'DuplicateEFSBackupCheckLambda.Arn'
        SourceDetails: 
          - EventSource: 'aws.config'
            MessageType: 'ScheduledNotification'
            MaximumExecutionFrequency: 'Twelve_Hours'

Warum nicht eine SCP verwenden?

Es könnte eine Frage aufkommen: Wenn AWS Backup Pläne in der gesamten AWS-Organisation automatisiert werden, um alle EFS-Dateisysteme zu sichern, warum wird dann nicht einfach eine SCP (Service Control Policy) verwendet, um automatische EFS-Sicherungen zu deaktivieren? Zum jetzigen Zeitpunkt (August 2024) ist es leider nicht möglich, eine SCP zu erstellen, die verhindert, dass automatische EFS-Sicherungen aktiviert werden.

Wenn Ihre AWS-Organisation zentral verwaltete AWS-Backup-Pläne zur Sicherung aller EFS-Dateisysteme verwendet, können Sie meine AWS Config Custom Rule in Verbindung mit einer AWS Config Remediation Aktion verwenden, um automatische EFS-Sicherungen zu deaktivieren.


Abschließende Worte

Ich hoffe, mein Artikel hat Ihnen gefallen und Sie finden meine benutzerdefinierte AWS-Konfigurationsregel nützlich für die Überwachung doppelter EFS-Sicherungen in Ihrer Umgebung. Die potenziellen Kosteneinsparungen können beträchtlich sein. Ich konnte mit diesem Ansatz bei einem Kunden bis zu 12.000 US-Dollar pro Monat einsparen! Sollten Sie weitere Unterstützung bei der AWS-Kostenoptimierung benötigen, steht Ihnen unser Team bei PCG jederzeit gerne zur Verfügung.

Entdecken Sie auch unseren Service AWS Cost Management and Optimisation!


Genutzte Services

Weiterlesen

Artikel
Cost Management
Kostenoptimierungsstrategien für die Cloud

Leitfaden zur Implementierung effektiver Kostenoptimierungsstrategien für die Cloud: Praktische Erkenntnisse, um die Effizienz zu maximieren, die Ausgaben zu minimieren und die Gesamtleistung zu verbessern.

Mehr erfahren
Artikel
3 Gründe, warum die Public Cloud Energiekosten senkt

Durch den Wechsel zur Public Cloud können Unternehmen bis zu 80% Energie sparen, so eine Studie von 451 Research.

Mehr erfahren
Fallstudie
Software
Managed Services
PCG Managed Services mit Fokus auf Enablement und Modernisierung

Trotz Fokus auf Migration und dem Enablement des MBIC-Teams, konnte MBIC während des laufenden Betriebs, gemeinsam mit den Managed Services der PCG, das fortlaufende Geschäft reibungslos absichern.

Mehr erfahren
Artikel
Cloud Security
Managed Services
Erstellen Sie belastbare Cloud-Architekturen mit AWS

Ein umfassender Leitfaden zum Aufbau belastbarer Cloud-Architekturen mit AWS, der EC2, S3, RDS, erweiterte Funktionen, Design für Fehler, Chaos Engineering, Bereitstellungen in mehreren Regionen, Hybrid-Setups und Automatisierung abdeckt.

Mehr erfahren
Alles sehen

Gemeinsam durchstarten

United Kingdom
Arrow Down