Назад | Перейти на главную страницу

Функция AWS Lambda для создания нескольких баз данных создает только первую

У меня есть функция AWS Lambda, которую я пытаюсь использовать для создания 3 новых баз данных каждую ночь. Он берет самый последний снимок с каждого сервера и запускает restore_db_instance_from_db_snapshot. Он предназначен для предоставления нашим разработчикам доступа к производственным данным без очевидного использования производственной базы данных.

Проблема, с которой я столкнулся, заключается в том, что он предназначен для итерации и создания 3 баз данных, однако он только доходит до первой базы данных и останавливается. Это нормальное поведение, и если да, то как его исправить?

Вот моя функция -

import os
import boto3
import botocore
import datetime
import re
import logging

region = 'us-east-1'
db_subnet = 'default'

db_list = [
  { 'cluster': 'true', 'snapshot_base_name': 'main-production', 'new_db_instance_name': 'main-development', 'instance_class': 'db.r4.large' , 'environment': 'main'},
  { 'cluster': 'false', 'snapshot_base_name': 'cs-production', 'new_db_instance_name': 'cs-development', 'instance_class': 'db.t2.micro' , 'environment': 'cs'},
  { 'cluster': 'false', 'snapshot_base_name': 'acc-production', 'new_db_instance_name': 'acc-development', 'instance_class': 'db.t2.micro', 'environment': 'acc' }
]

publicly_accessible = True
multi_az = False
copy_tags_to_snapshot = False
port = 5432

def byTimestamp(snap):
  if 'SnapshotCreateTime' in snap:
    return datetime.datetime.isoformat(snap['SnapshotCreateTime'])
  else:
    return datetime.datetime.isoformat(datetime.datetime.now())

def restore_db():
    client = boto3.client('rds', region_name=region)
    try:
        for db in db_list:
            is_cluster = db['cluster'] == 'true'
            environment  = db['environment']
            password = os.environ[environment]

            if is_cluster:
              source_snaps = client.describe_db_cluster_snapshots(DBClusterIdentifier = db['snapshot_base_name'])['DBClusterSnapshots']
              source_snap = sorted(source_snaps, key=byTimestamp, reverse=True)[0]['DBClusterSnapshotIdentifier']

              response = client.restore_db_cluster_from_snapshot(
                DBClusterIdentifier=db['new_db_instance_name'],
                SnapshotIdentifier=source_snap,
                Port=port,
                Engine='aurora-postgresql')

              response = client.create_db_instance(
                DBInstanceIdentifier=db['new_db_instance_name'],
                DBInstanceClass=db['instance_class'],
                Engine='aurora-postgresql',
                DBClusterIdentifier=db['new_db_instance_name'])

            else:
                source_snaps = client.describe_db_snapshots(DBInstanceIdentifier = db['snapshot_base_name'])['DBSnapshots']
                source_snap = sorted(source_snaps, key=byTimestamp, reverse=True)[0]['DBSnapshotIdentifier']

                response = client.restore_db_instance_from_db_snapshot(
                    DBInstanceIdentifier=db['new_db_instance_name'],
                    DBSnapshotIdentifier=source_snap,
                    DBInstanceClass=db['instance_class'],
                    Port=port,
                    MultiAZ=multi_az,
                    PubliclyAccessible=publicly_accessible,
                    CopyTagsToSnapshot=copy_tags_to_snapshot)

            return response

    except botocore.exceptions.ClientError as e:
        raise Exception("Could not restore: %s" % e)

def lambda_handler(event, context):
   return restore_db()