Set up MinIO gateway for multi-cloud storage federation with AWS S3 and Azure integration

Advanced 45 min Apr 10, 2026 283 views
Ubuntu 24.04 Debian 12 AlmaLinux 9 Rocky Linux 9

Learn to deploy MinIO as a unified storage gateway that seamlessly federates multiple cloud storage backends including AWS S3 and Azure Blob Storage. This advanced configuration provides intelligent failover, cost optimization, and vendor-neutral object storage management.

Prerequisites

  • Active AWS account with S3 access
  • Azure storage account
  • SSL certificates (self-signed acceptable for testing)
  • Minimum 4GB RAM
  • Network access to cloud services

What this solves

MinIO gateway provides a unified S3-compatible interface to multiple cloud storage backends, enabling storage federation across AWS S3, Azure Blob Storage, and other providers. This architecture allows applications to use standard S3 APIs while benefiting from intelligent tiering, automatic failover, and cost optimization across multiple cloud storage services.

Important: MinIO Gateway mode was deprecated in MINIO.RELEASE.2022-10-29T06-21-33Z. This tutorial demonstrates the modern approach using MinIO Multi-Cloud Object Browser and site replication features for multi-cloud federation.

Step-by-step installation

Update system packages

Start by updating your system packages to ensure you have the latest security patches.

sudo apt update && sudo apt upgrade -y
sudo apt install -y wget curl gnupg2 software-properties-common
sudo dnf update -y
sudo dnf install -y wget curl gnupg2 epel-release

Install MinIO server

Download and install the latest MinIO server binary from the official repository. MinIO provides pre-compiled binaries for all major Linux distributions.

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
minio --version

Install MinIO client

Install the MinIO client (mc) for command-line management and configuration of your multi-cloud storage federation.

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
mc --version

Create MinIO system user

Create a dedicated system user for running MinIO services securely. This follows security best practices by avoiding root execution.

sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user minio-user
sudo mkdir -p /etc/minio /opt/minio/data
sudo chown minio-user:minio-user /etc/minio /opt/minio/data
sudo chmod 755 /etc/minio /opt/minio/data

Configure MinIO server environment

Create the main configuration file with strong credentials and SSL settings. This configuration enables the multi-cloud federation capabilities.

MINIO_ROOT_USER="minioadmin"
MINIO_ROOT_PASSWORD="minio123!@#MinioSecure"
MINIO_VOLUMES="/opt/minio/data"
MINIO_OPTS="--console-address :9001"
MINIO_SERVER_URL="https://minio.example.com:9000"
MINIO_BROWSER_REDIRECT_URL="https://minio.example.com:9001"

Create SSL certificates directory

Set up SSL certificate storage for secure multi-cloud communication. Production deployments should use certificates from a trusted CA.

sudo mkdir -p /etc/minio/certs
sudo chown minio-user:minio-user /etc/minio/certs
sudo chmod 755 /etc/minio/certs

Generate self-signed certificates for testing

Create self-signed certificates for development and testing. Replace with proper CA-signed certificates in production.

sudo openssl req -new -x509 -days 365 -nodes \
  -out /etc/minio/certs/public.crt \
  -keyout /etc/minio/certs/private.key \
  -subj "/C=US/ST=CA/L=San Francisco/O=MinIO/OU=IT/CN=minio.example.com"
sudo chown minio-user:minio-user /etc/minio/certs/*
sudo chmod 644 /etc/minio/certs/public.crt
sudo chmod 600 /etc/minio/certs/private.key

Create systemd service

Configure MinIO as a systemd service for automatic startup and proper process management.

[Unit]
Description=MinIO Object Storage
Documentation=https://min.io/docs
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/opt/minio/
User=minio-user
Group=minio-user
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

Start and enable MinIO service

Enable the MinIO service to start automatically on boot and start it immediately.

sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio
sudo systemctl status minio

Configure AWS S3 backend integration

Configure MinIO client for local instance

Set up the MinIO client to connect to your local MinIO instance for configuration management.

mc alias set local https://localhost:9000 minioadmin minio123!@#MinioSecure --insecure
mc admin info local --insecure

Add AWS S3 as remote storage

Configure AWS S3 credentials and endpoint. Replace the placeholders with your actual AWS credentials and preferred region.

mc alias set s3 https://s3.amazonaws.com YOUR_AWS_ACCESS_KEY YOUR_AWS_SECRET_KEY --api S3v4 --path on
mc ls s3

Create S3 bucket for federation

Create a dedicated S3 bucket for your multi-cloud storage federation. This bucket will store replicated data from your MinIO instance.

mc mb s3/minio-federation-bucket
mc ls s3

Configure bucket versioning and lifecycle

Enable versioning and configure lifecycle policies for cost optimization and data management.

mc version enable s3/minio-federation-bucket
mc ilm add --expiry-days 30 --noncurrentversion-expiration-days 7 s3/minio-federation-bucket
mc ilm ls s3/minio-federation-bucket

Configure Azure Blob Storage backend

Install Azure CLI

Install Azure CLI to manage Azure Blob Storage integration and obtain necessary credentials.

curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
az --version
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
echo -e "[azure-cli]
name=Azure CLI
baseurl=https://packages.microsoft.com/yumrepos/azure-cli
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc" | sudo tee /etc/yum.repos.d/azure-cli.repo
sudo dnf install -y azure-cli
az --version

Configure Azure Blob Storage credentials

Set up Azure Blob Storage integration using connection strings. Replace with your actual Azure storage account details.

mc alias set azure https://your-storage-account.blob.core.windows.net your-storage-account your-access-key --api S3v2
mc ls azure

Create Azure container for federation

Create a container in Azure Blob Storage to participate in the multi-cloud federation.

mc mb azure/minio-federation-container
mc ls azure

Implement multi-cloud federation and failover

Configure site replication

Set up MinIO site replication to automatically synchronize data across multiple storage backends. This provides the foundation for multi-cloud federation.

mc admin replicate add local s3 azure --insecure
mc admin replicate info local --insecure

Create federated bucket

Create a bucket that will be automatically replicated across all configured storage backends.

mc mb local/federated-data --insecure
mc ls local --insecure

Configure bucket policies for federation

Set up bucket policies that enable cross-cloud access and replication. This policy allows read/write access for federated operations.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::federated-data"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:ListMultipartUploadParts",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::federated-data/*"
    }
  ]
}
mc policy set-json /tmp/federation-policy.json local/federated-data --insecure

Configure automatic failover

Set up health checking and automatic failover using MinIO's built-in high availability features.

{
  "backends": [
    {
      "name": "primary",
      "endpoint": "https://localhost:9000",
      "priority": 1,
      "health_check_interval": "30s"
    },
    {
      "name": "s3-fallback",
      "endpoint": "https://s3.amazonaws.com",
      "priority": 2,
      "health_check_interval": "60s"
    },
    {
      "name": "azure-fallback",
      "endpoint": "https://your-storage-account.blob.core.windows.net",
      "priority": 3,
      "health_check_interval": "60s"
    }
  ],
  "failover_timeout": "10s",
  "retry_attempts": 3
}
sudo chown minio-user:minio-user /etc/minio/failover-config.json
sudo chmod 644 /etc/minio/failover-config.json

Configure monitoring and alerts

Set up monitoring webhooks to track federation health and receive alerts about failover events. This integrates with common monitoring solutions.

mc admin config set local notify_webhook:federation \
  endpoint="https://your-monitoring-endpoint.example.com/webhook" \
  auth_token="your-webhook-token" \
  --insecure
mc admin service restart local --insecure

Configure firewall rules

Open necessary ports for MinIO federation traffic. These rules allow secure communication between federation nodes and cloud services.

sudo ufw allow 9000/tcp comment 'MinIO API'
sudo ufw allow 9001/tcp comment 'MinIO Console'
sudo ufw reload
sudo ufw status
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --permanent --add-port=9001/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

Verify your setup

Test your multi-cloud storage federation to ensure all components are working correctly.

# Check MinIO service status
sudo systemctl status minio

Verify federation configuration

mc admin info local --insecure

Test file upload and replication

echo "Test federation file" > test-federation.txt mc cp test-federation.txt local/federated-data/ --insecure

Verify replication across backends

mc ls local/federated-data --insecure mc ls s3/minio-federation-bucket mc ls azure/minio-federation-container

Test failover by temporarily stopping MinIO

sudo systemctl stop minio mc ls s3/minio-federation-bucket sudo systemctl start minio

Check replication status

mc admin replicate status local --insecure
Note: The console is available at https://your-server-ip:9001 with the credentials configured in /etc/default/minio. Use this interface to monitor federation status and manage storage policies.

Common issues

SymptomCauseFix
MinIO service fails to start Incorrect file permissions or missing SSL certificates sudo journalctl -u minio -f and fix permissions with sudo chown -R minio-user:minio-user /etc/minio
Cannot connect to cloud storage Invalid credentials or network restrictions Verify credentials with mc admin info remote-alias and check firewall rules
Replication not working Site replication not configured properly Remove and re-add replication with mc admin replicate remove then mc admin replicate add
SSL certificate errors Self-signed certificates or hostname mismatch Use --insecure flag for testing or install proper CA certificates
High memory usage Large file uploads or insufficient system resources Tune MINIO_CACHE_SIZE and monitor with mc admin top local

Next steps

Automated install script

Run this to automate the entire setup

Need help?

Don't want to manage this yourself?

We handle managed devops services for businesses that depend on uptime. From initial setup to ongoing operations.