A DynamoDB driver for the Laravel Auditing package, allowing you to store audit logs in AWS DynamoDB instead of a traditional database.
- High Performance: Store audit logs in DynamoDB for better scalability
- Auto-scaling: DynamoDB handles scaling automatically
- TTL Support: Automatic cleanup of old audit logs
- Flexible Schema: NoSQL structure for varying audit data
- Query Service: Built-in service for querying audit logs
- Laravel Integration: Seamless integration with Laravel Auditing
- Queue Support: Optional queue processing for improved performance
composer require infinitypaul/laravel-dynamodb-auditingphp artisan vendor:publish --tag=dynamodb-auditing-configAdd the following to your .env file:
# Enable DynamoDB auditing
AUDIT_DRIVER=dynamodb
# DynamoDB Configuration
DYNAMODB_AUDIT_TABLE=your-audit-table-name
DYNAMODB_AUDIT_TTL_DAYS=730
# Queue Configuration (optional - improves performance)
DYNAMODB_AUDIT_QUEUE_ENABLED=false
# DYNAMODB_AUDIT_QUEUE_CONNECTION=redis # Optional: override default queue connection
# DYNAMODB_AUDIT_QUEUE_NAME=audits # Optional: override default queue
# AWS Credentials (production)
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_DEFAULT_REGION=us-east-1
# Local Development (optional)
DYNAMODB_ENDPOINT=http://localhost:8000
DYNAMODB_ACCESS_KEY_ID=dummy
DYNAMODB_SECRET_ACCESS_KEY=dummyIn your config/audit.php, set the driver:
'driver' => env('AUDIT_DRIVER', 'dynamodb'),The package uses the following DynamoDB table structure:
- Partition Key (PK):
USER#{user_id}or{auditable_type}#{auditable_id} - Sort Key (SK):
{timestamp}#{event}#{audit_id}
audit_id- Unique identifier for the audituser_id- ID of the user who performed the actionevent- Type of event (created, updated, deleted, etc.)auditable_type- Model class nameauditable_id- Model IDold_values- JSON of old valuesnew_values- JSON of new valuesurl- Request URLip_address- User's IP addressuser_agent- User's browser/clientcreated_at- TimestampTTL- Time-to-live for automatic cleanup
One command does everything:
# Interactive installer - handles complete setup
php artisan audit:install-dynamodb
# For local development
php artisan audit:install-dynamodb --local
# Skip all confirmations
php artisan audit:install-dynamodb --local --forceThe installer automatically:
- β Checks for migration conflicts
- β Publishes configuration
- β Creates DynamoDB table
- β Tests the installation
- β Provides next steps
If you prefer step-by-step control:
# Setup local DynamoDB table (requires DynamoDB Local running on port 8000)
php artisan audit:setup-dynamodb --local
# Or force recreate if table exists
php artisan audit:setup-dynamodb --local --force# Test DynamoDB audit functionality
php artisan audit:test-dynamodb
# Test with specific model
php artisan audit:test-dynamodb --model="App\Models\User" --id=1Once configured, the package works automatically with Laravel Auditing:
use OwenIt\Auditing\Contracts\Auditable;
class User extends Model implements Auditable
{
use \OwenIt\Auditing\Auditable;
// Your model code
}For high-traffic applications, enable queue processing to improve performance:
# Enable queue processing (uses your existing Laravel queue configuration)
DYNAMODB_AUDIT_QUEUE_ENABLED=true
# Optional: Override default queue settings
# DYNAMODB_AUDIT_QUEUE_CONNECTION=redis # Use specific queue connection
# DYNAMODB_AUDIT_QUEUE_NAME=audits # Use specific queue nameBenefits of Queue Processing:
- Faster Response Times: Audit writes don't block user requests
- Better Scalability: Handle high-volume audit operations
- Resilience: Failed audit writes are automatically retried
- Non-blocking: User operations continue even if DynamoDB is temporarily unavailable
Queue Worker Setup:
# If using default queue configuration, just run your normal queue workers
php artisan queue:work
# If using a specific queue name, target that queue
php artisan queue:work --queue=auditsNote: When queue processing is enabled, audit logs are processed asynchronously, so they may not be immediately available for querying.
Use the provided AuditQueryService:
use InfinityPaul\LaravelDynamoDbAuditing\AuditQueryService;
$auditService = app(AuditQueryService::class);
// Get all audits with pagination
$result = $auditService->getAllAudits(
limit: 25,
lastEvaluatedKey: null,
filters: [
'user_id' => 123,
'event' => 'updated',
'entity_type' => 'App\\Models\\User'
]
);
// Get specific audit by ID
$audit = $auditService->getAuditById('audit_12345');| Variable | Description | Default |
|---|---|---|
AUDIT_DRIVER |
Audit driver to use | database |
DYNAMODB_AUDIT_TABLE |
DynamoDB table name | optimus-audit-logs |
DYNAMODB_AUDIT_TTL_DAYS |
Days before auto-deletion (null = infinite) | 730 |
DYNAMODB_AUDIT_QUEUE_ENABLED |
Enable queue processing for better performance | false |
DYNAMODB_AUDIT_QUEUE_CONNECTION |
Queue connection to use (null = use default) | null |
DYNAMODB_AUDIT_QUEUE_NAME |
Queue name for audit jobs (null = use default) | null |
DYNAMODB_ENDPOINT |
Local DynamoDB endpoint | null |
AWS_ACCESS_KEY_ID |
AWS access key | Required for production |
AWS_SECRET_ACCESS_KEY |
AWS secret key | Required for production |
AWS_DEFAULT_REGION |
AWS region | us-east-1 |
The config/dynamodb-auditing.php file allows you to customize:
- AWS credentials and region
- Table name and TTL settings
- Local vs production configurations
Control automatic cleanup of audit logs:
# Auto-delete after 2 years (default)
DYNAMODB_AUDIT_TTL_DAYS=730
# Auto-delete after 1 year
DYNAMODB_AUDIT_TTL_DAYS=365
# Auto-delete after 30 days
DYNAMODB_AUDIT_TTL_DAYS=30
# Infinite retention (never auto-delete)
DYNAMODB_AUDIT_TTL_DAYS=nullImportant: Setting DYNAMODB_AUDIT_TTL_DAYS=null will keep audit logs forever, which may increase storage costs over time.
DynamoDB excels at audit log storage because:
- Consistent Performance: O(1) read/write operations regardless of table size
- Horizontal Scaling: Automatically scales to handle millions of records
- Efficient Queries: Partition + Sort key design enables fast lookups
- No Performance Degradation: Unlike SQL databases, performance doesn't degrade with table growth
Run the package tests:
composer test- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Submit a pull request
The package provides several Artisan commands for setup and testing:
| Command | Description | Options |
|---|---|---|
audit:install-dynamodb |
π Interactive installer - complete setup | --local, --production, --force |
audit:setup-dynamodb |
Create DynamoDB table for audit logs | --local, --force |
audit:test-dynamodb |
Test DynamoDB audit functionality | --model, --id |
audit:prevent-migration |
Remove conflicting MySQL audit migrations | --check |
# π RECOMMENDED: Interactive installer (does everything)
php artisan audit:install-dynamodb --local
# Individual commands (if you prefer manual control)
php artisan audit:setup-dynamodb --local
php artisan audit:test-dynamodb
php artisan audit:prevent-migration --check
# Advanced usage
php artisan audit:setup-dynamodb --force # Force recreate table
php artisan audit:test-dynamodb --model="App\Models\Product" --id=5
php artisan audit:prevent-migration # Remove MySQL migrations- π¦ GitHub Repository: https://github.com/infinitypaul/laravel-dynamodb-auditing
- π Documentation: Available in the repository
- π Issues & Bug Reports: GitHub Issues
- π¬ Feature Requests: GitHub Issues
This package is open-sourced software licensed under the MIT license.