Twelve-Factor App | Treat as Attached Resources

The fourth factor of the Twelve-Factor App methodology emphasizes treating backing services as attached resources.

Why Treat Backing Services as Attached Resources?

Treating backing services as attached resources means that they can be attached and detached from the application at any time without code changes.

Benefits:
  • Modularity: Allows for easy replacement or upgrading of services.
  • Scalability: Facilitates horizontal scaling of services.
  • Portability: Enhances application portability across different environments.

How to Treat Backing Services as Attached Resources

Use Connection Strings

Connection strings or URLs can be used to connect to backing services.

Example: Connecting to a PostgreSQL Database
import psycopg2

connection = psycopg2.connect(os.environ['DATABASE_URL'])
Utilize Service Discovery

In a microservices architecture, service discovery tools like Consul or Kubernetes DNS can be used to locate and connect to services.

Example: Kubernetes DNS for Redis
 
apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  selector:
    app: redis

In the application, connect using the service name:

 
import redis

r = redis.StrictRedis(host='redis', port=6379)

Deployment Strategies with Backing Services

Backing services must be managed to ensure seamless connectivity and operation.

Example:
  • Provisioning: Create and configure the required backing services.
  • Integration: Ensure that the application can connect to the services.
  • Monitoring: Monitor the health and performance of the backing services.

Treating backing services as attached resources fosters a flexible and resilient architecture.