143 أسطر
5.1 KiB
Python
143 أسطر
5.1 KiB
Python
import boto3
|
|
import os
|
|
import json
|
|
import zipfile
|
|
import io
|
|
import urllib.request
|
|
from datetime import datetime
|
|
|
|
class LambdaExporter:
|
|
def __init__(self, profile_name=None, region_name='us-east-1'):
|
|
"""
|
|
Initialize Lambda Exporter
|
|
|
|
Args:
|
|
profile_name (str): AWS profile name (optional)
|
|
region_name (str): AWS region name
|
|
"""
|
|
try:
|
|
if profile_name:
|
|
session = boto3.Session(profile_name=profile_name)
|
|
self.lambda_client = session.client('lambda', region_name=region_name)
|
|
else:
|
|
self.lambda_client = boto3.client('lambda', region_name=region_name)
|
|
except Exception as e:
|
|
print(f"Error initializing AWS client: {e}")
|
|
raise
|
|
|
|
def get_all_functions(self):
|
|
"""Retrieve all Lambda functions from the account"""
|
|
functions = []
|
|
try:
|
|
paginator = self.lambda_client.get_paginator('list_functions')
|
|
for page in paginator.paginate():
|
|
functions.extend(page['Functions'])
|
|
return functions
|
|
except Exception as e:
|
|
print(f"Error fetching functions: {e}")
|
|
return []
|
|
|
|
def export_function_code(self, function_name, output_dir):
|
|
"""Export function code to local directory"""
|
|
try:
|
|
# Get function details
|
|
response = self.lambda_client.get_function(FunctionName=function_name)
|
|
|
|
# Download code
|
|
code_url = response['Code']['Location']
|
|
with urllib.request.urlopen(code_url) as response:
|
|
code_data = response.read()
|
|
|
|
# Extract if it's a zip file
|
|
if zipfile.is_zipfile(io.BytesIO(code_data)):
|
|
with zipfile.ZipFile(io.BytesIO(code_data)) as zip_ref:
|
|
zip_ref.extractall(output_dir)
|
|
return True
|
|
else:
|
|
# Save as raw file
|
|
with open(os.path.join(output_dir, 'function_code.bin'), 'wb') as f:
|
|
f.write(code_data)
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"Error exporting code for {function_name}: {e}")
|
|
return False
|
|
|
|
def export_function_config(self, function_name, output_dir):
|
|
"""Export function configuration"""
|
|
try:
|
|
config = self.lambda_client.get_function_configuration(
|
|
FunctionName=function_name
|
|
)
|
|
|
|
# Convert to serializable format
|
|
config_serializable = json.loads(json.dumps(config, default=str))
|
|
|
|
with open(os.path.join(output_dir, 'configuration.json'), 'w') as f:
|
|
json.dump(config_serializable, f, indent=2)
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f"Error exporting config for {function_name}: {e}")
|
|
return False
|
|
|
|
def export_all_functions(self, base_dir='lambda_export'):
|
|
"""Export all Lambda functions"""
|
|
functions = self.get_all_functions()
|
|
|
|
if not functions:
|
|
print("No functions found or error retrieving functions")
|
|
return
|
|
|
|
print(f"Found {len(functions)} Lambda functions")
|
|
|
|
# Create export directory with timestamp
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
export_dir = os.path.join(base_dir, f"export_{timestamp}")
|
|
|
|
success_count = 0
|
|
|
|
for func in functions:
|
|
function_name = func['FunctionName']
|
|
print(f"\nProcessing: {function_name}")
|
|
|
|
# Create function directory
|
|
func_dir = os.path.join(export_dir, function_name)
|
|
os.makedirs(func_dir, exist_ok=True)
|
|
|
|
# Export configuration
|
|
config_success = self.export_function_config(function_name, func_dir)
|
|
|
|
# Export code
|
|
code_success = self.export_function_code(function_name, func_dir)
|
|
|
|
if config_success and code_success:
|
|
success_count += 1
|
|
print(f"✅ Successfully exported: {function_name}")
|
|
else:
|
|
print(f"⚠ Partially exported: {function_name}")
|
|
|
|
# Create export summary
|
|
summary = {
|
|
'export_date': datetime.now().isoformat(),
|
|
'total_functions': len(functions),
|
|
'successfully_exported': success_count,
|
|
'export_directory': export_dir
|
|
}
|
|
|
|
summary_file = os.path.join(export_dir, 'export_summary.json')
|
|
with open(summary_file, 'w') as f:
|
|
json.dump(summary, f, indent=2)
|
|
|
|
print(f"\n Export completed!")
|
|
print(f" Location: {os.path.abspath(export_dir)}")
|
|
print(f" Summary: {success_count}/{len(functions)} functions exported successfully")
|
|
|
|
# Usage
|
|
if __name__ == "__main__":
|
|
# For specific AWS profile (optional)
|
|
# exporter = LambdaExporter(profile_name='your-profile-name')
|
|
|
|
# Using default credentials
|
|
exporter = LambdaExporter()
|
|
exporter.export_all_functions() |