180 lines
5.6 KiB
Markdown
180 lines
5.6 KiB
Markdown
# RabbitMQ Tenant Module
|
|
|
|
This module creates a RabbitMQ virtual host (vhost) and user (tenant) on a VPS-hosted RabbitMQ instance using SSH tunneling for secure access to the Management API.
|
|
|
|
## Features
|
|
|
|
- Creates SSH tunnel to VPS-hosted RabbitMQ Management API
|
|
- Creates isolated virtual host and user for tenant
|
|
- Configures full permissions for user on their vhost
|
|
- Generates secure random password
|
|
- Outputs connection details for application use
|
|
- Supports explicit dependencies via `wait_on`
|
|
|
|
## Requirements
|
|
|
|
- SSH access to VPS with key-based authentication
|
|
- RabbitMQ admin credentials
|
|
- RabbitMQ Management plugin enabled
|
|
- `terraform-ssh-tunnel` module (automatically downloaded)
|
|
- `cyrilgdn/rabbitmq` provider (automatically configured)
|
|
|
|
## Usage
|
|
|
|
### Basic Example
|
|
|
|
```hcl
|
|
module "app_tenant" {
|
|
source = "./quadlets/modules/rabbitmq/tenant"
|
|
|
|
tenant_name = "myapp"
|
|
admin_username = var.rabbitmq_admin_username
|
|
admin_password = var.rabbitmq_admin_password
|
|
server_ip = "203.0.113.10"
|
|
ssh_user = "fourlights"
|
|
|
|
# Wait for RabbitMQ service to be ready
|
|
wait_on = module.rabbitmq.installed
|
|
}
|
|
|
|
# Use the connection details
|
|
output "app_mq_connection" {
|
|
value = {
|
|
host = module.app_tenant.host
|
|
port = module.app_tenant.port
|
|
vhost = module.app_tenant.vhost
|
|
username = module.app_tenant.username
|
|
password = module.app_tenant.password
|
|
}
|
|
sensitive = true
|
|
}
|
|
```
|
|
|
|
### With Custom Management Port
|
|
|
|
```hcl
|
|
module "custom_tenant" {
|
|
source = "./quadlets/modules/rabbitmq/tenant"
|
|
|
|
tenant_name = "custom_app"
|
|
admin_username = var.rabbitmq_admin_username
|
|
admin_password = var.rabbitmq_admin_password
|
|
server_ip = "203.0.113.10"
|
|
target_port = 25672 # Custom Management API port
|
|
|
|
wait_on = module.rabbitmq.installed
|
|
}
|
|
```
|
|
|
|
### Multiple Tenants
|
|
|
|
```hcl
|
|
module "tenant_1" {
|
|
source = "./quadlets/modules/rabbitmq/tenant"
|
|
|
|
tenant_name = "app1"
|
|
admin_username = var.rabbitmq_admin_username
|
|
admin_password = var.rabbitmq_admin_password
|
|
server_ip = var.vps_ip
|
|
|
|
wait_on = module.rabbitmq.installed
|
|
}
|
|
|
|
module "tenant_2" {
|
|
source = "./quadlets/modules/rabbitmq/tenant"
|
|
|
|
tenant_name = "app2"
|
|
admin_username = var.rabbitmq_admin_username
|
|
admin_password = var.rabbitmq_admin_password
|
|
server_ip = var.vps_ip
|
|
|
|
wait_on = module.rabbitmq.installed
|
|
}
|
|
```
|
|
|
|
### Using Connection String
|
|
|
|
```hcl
|
|
module "app_tenant" {
|
|
source = "./quadlets/modules/rabbitmq/tenant"
|
|
|
|
tenant_name = "myapp"
|
|
admin_username = var.rabbitmq_admin_username
|
|
admin_password = var.rabbitmq_admin_password
|
|
server_ip = var.vps_ip
|
|
|
|
wait_on = module.rabbitmq.installed
|
|
}
|
|
|
|
# Use in application configuration
|
|
resource "kubernetes_secret" "rabbitmq_credentials" {
|
|
metadata {
|
|
name = "rabbitmq-connection"
|
|
}
|
|
|
|
data = {
|
|
connection_string = module.app_tenant.connection_string
|
|
}
|
|
}
|
|
```
|
|
|
|
## Inputs
|
|
|
|
| Name | Description | Type | Default | Required |
|
|
|------|-------------|------|---------|----------|
|
|
| tenant_name | Name of the tenant (used for vhost name and username) | string | - | yes |
|
|
| admin_username | RabbitMQ admin username | string | - | yes |
|
|
| admin_password | RabbitMQ admin password | string | - | yes |
|
|
| server_ip | VPS server IP address | string | - | yes |
|
|
| ssh_user | SSH user for connecting to VPS | string | "fourlights" | no |
|
|
| ssh_private_key_path | Path to SSH private key | string | "~/.ssh/id_rsa" | no |
|
|
| target_port | RabbitMQ Management API port on VPS | number | 15672 | no |
|
|
| wait_on | Resources to wait on before creating tenant | any | null | no |
|
|
|
|
## Outputs
|
|
|
|
| Name | Description | Sensitive |
|
|
|------|-------------|-----------|
|
|
| host | RabbitMQ connection host (VPS IP for AMQP) | no |
|
|
| port | RabbitMQ AMQP connection port (5672) | no |
|
|
| management_host | RabbitMQ Management API host (via SSH tunnel) | no |
|
|
| management_port | RabbitMQ Management API port (via SSH tunnel) | no |
|
|
| vhost | Virtual host name | no |
|
|
| username | RabbitMQ username | no |
|
|
| password | RabbitMQ password | yes |
|
|
| connection_string | Full AMQP connection string | yes |
|
|
| installed | Installation complete flag | no |
|
|
|
|
## How It Works
|
|
|
|
1. **SSH Tunnel**: The module uses `terraform-ssh-tunnel` to create a secure SSH tunnel from your local machine to the VPS RabbitMQ Management API (port 15672)
|
|
2. **Provider Configuration**: The RabbitMQ provider is configured to connect through the tunnel
|
|
3. **Resource Creation**: Creates a RabbitMQ virtual host, user, and permissions
|
|
4. **Password Generation**: Generates a cryptographically secure random password
|
|
5. **Outputs**: Provides connection details for your application to use
|
|
|
|
## Connection Details
|
|
|
|
- **Management API**: Accessed via SSH tunnel (for Terraform operations)
|
|
- **AMQP Protocol**: Direct connection to VPS on port 5672 (for application connections)
|
|
- **Virtual Host**: Isolated messaging environment for the tenant
|
|
- **Permissions**: User has full configure, write, and read permissions on their vhost
|
|
|
|
## Notes
|
|
|
|
- The SSH tunnel is only used for management operations (creating vhost/user/permissions)
|
|
- Applications connect directly to the VPS AMQP port (5672), not through the tunnel
|
|
- The virtual host and user will have the same name as `tenant_name`
|
|
- User is granted `configure=".*"`, `write=".*"`, `read=".*"` on their vhost
|
|
- Password is stored in Terraform state (sensitive)
|
|
- Ensure RabbitMQ Management plugin is enabled on the VPS instance
|
|
|
|
## Permissions Explained
|
|
|
|
The tenant user receives the following permissions on their vhost:
|
|
|
|
- **configure**: Can declare exchanges, queues, and bindings
|
|
- **write**: Can publish messages
|
|
- **read**: Can consume messages
|
|
|
|
All permissions use the `.*` regex pattern, granting full access within the vhost. |