• Skip to secondary menu
  • Skip to main content
  • Skip to primary sidebar
  • Home
  • Projects
  • Products
  • Themes
  • Tools
  • Request for Quote

Vengala Vinay

Having 12+ Years of Experience in Software Development

  • Home
  • WordPress
  • PHP
    • Codeigniter
  • Django
  • Magento
  • Selenium
  • Server
Home » Dockerizing and Orchestrating Legacy Shopify Systems on Modern AWS Infrastructure

Dockerizing and Orchestrating Legacy Shopify Systems on Modern AWS Infrastructure

Understanding the Challenge: Legacy Shopify and Modern Infrastructure

Migrating legacy Shopify systems, often characterized by monolithic architectures, custom themes with deeply embedded Liquid logic, and reliance on specific PHP versions, to a modern, scalable cloud infrastructure like AWS presents unique challenges. The primary goal is to achieve greater agility, resilience, and cost-efficiency through containerization and orchestration. This involves encapsulating the existing Shopify application and its dependencies into Docker containers and managing them using orchestration platforms like Amazon Elastic Container Service (ECS) or Amazon Elastic Kubernetes Service (EKS).

Containerizing the Shopify Application

The first step is to create a Dockerfile that accurately represents the Shopify application’s runtime environment. This typically involves a base PHP image, installation of necessary extensions (e.g., `php-gd`, `php-mysql`, `php-curl`), and configuration for web server integration (e.g., Nginx or Apache).

Dockerfile Example (PHP 7.4 with Apache)

# Use an official PHP runtime as a parent image
FROM php:7.4-apache

# Install system dependencies
RUN apt-get update && apt-get install -y \
    libzip-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libpq-dev \
    unzip \
    git \
    cron \
    # Add any other system packages required by your Shopify theme/apps
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd zip pdo_mysql && \
    # Clean up
    apt-get clean && rm -rf /var/lib/apt/lists/*

# Set working directory
WORKDIR /var/www/html

# Copy Shopify application files
# Assuming your Shopify files are in a 'shopify_app' directory locally
COPY ./shopify_app/ /var/www/html/

# Configure Apache for PHP and rewrite rules
COPY docker/apache/000-default.conf /etc/apache2/sites-available/000-default.conf
COPY docker/apache/apache2.conf /etc/apache2/apache2.conf

# Enable Apache modules
RUN a2enmod rewrite && a2enmod headers

# Install Composer and its dependencies
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
    composer install --no-dev --optimize-autoloader

# Configure PHP settings (e.g., memory_limit, upload_max_filesize)
COPY docker/php/php.ini /usr/local/etc/php/conf.d/custom.ini

# Expose port 80
EXPOSE 80

# Start Apache in the foreground
CMD ["apache2-foreground"]

Apache Configuration Snippets

Create a custom Apache configuration file (e.g., docker/apache/000-default.conf) to ensure proper handling of Shopify’s routing and static assets.

<VirtualHost *:80>
    DocumentRoot /var/www/html
    DirectoryIndex index.php index.html

    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php/$1 [L]
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

PHP Configuration Snippets

memory_limit = 512M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
date.timezone = UTC

Database Considerations: MySQL/MariaDB

Legacy Shopify systems often rely on a MySQL or MariaDB database. For containerized deployments, it’s best practice to run the database in a separate container or leverage AWS managed database services like Amazon RDS. If running in a separate container, ensure proper volume mounting for data persistence and configure networking for inter-container communication.

Docker Compose for Local Development

version: '3.8'

services:
  shopify_app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:80"
    volumes:
      - ./shopify_app:/var/www/html
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_USER: shopify_user
      DB_PASSWORD: shopify_password
      DB_NAME: shopify_db

  db:
    image: mariadb:10.5
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: shopify_db
      MYSQL_USER: shopify_user
      MYSQL_PASSWORD: shopify_password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Orchestration with Amazon ECS

Amazon ECS provides a highly scalable, fast, and reliable way to deploy, manage, and scale containerized applications. We’ll define Task Definitions and Services to manage our Shopify containers.

ECS Task Definition Example (JSON)

{
    "family": "shopify-legacy-app",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "1024",
    "memory": "2048",
    "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
    "taskRoleArn": "arn:aws:iam::123456789012:role/shopifyAppTaskRole",
    "containerDefinitions": [
        {
            "name": "shopify-web",
            "image": "YOUR_AWS_ACCOUNT_ID.dkr.ecr.YOUR_REGION.amazonaws.com/shopify-legacy:latest",
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp"
                }
            ],
            "environment": [
                {
                    "name": "DB_HOST",
                    "value": "your-rds-endpoint.region.rds.amazonaws.com"
                },
                {
                    "name": "DB_USER",
                    "value": "shopify_user"
                },
                {
                    "name": "DB_PASSWORD",
                    "value": "YOUR_SECURE_PASSWORD"
                },
                {
                    "name": "DB_NAME",
                    "value": "shopify_db"
                }
            ],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/shopify-legacy-app",
                    "awslogs-region": "YOUR_REGION",
                    "awslogs-stream-prefix": "ecs"
                }
            }
        }
    ]
}

ECS Service Configuration

When creating an ECS Service, you’ll associate it with a Cluster, the Task Definition, and configure networking (VPC, Subnets, Security Groups). For public-facing applications, integrate with an Application Load Balancer (ALB) to distribute traffic across container instances and manage SSL termination.

Key ECS Service Parameters:

  • Cluster: The ECS cluster where tasks will run.
  • Task Definition: The JSON definition created above.
  • Desired Tasks: Number of instances of the task to run.
  • Load Balancing: Configure an ALB target group pointing to the container port (e.g., 80).
  • Networking: Specify VPC, subnets, and security groups. The security group for the task must allow inbound traffic on port 80 from the ALB’s security group.
  • Auto Scaling: Configure scaling policies based on CPU utilization, memory, or custom metrics.

Leveraging Amazon RDS for Database Management

For production environments, using Amazon RDS for your MySQL or MariaDB instance is highly recommended. This offloads database administration tasks like patching, backups, and scaling. Ensure your ECS task’s security group allows inbound traffic on the database port (e.g., 3306) from the ECS task’s security group.

RDS Security Group Configuration

In your RDS instance’s security group, add an inbound rule:

Type: MySQL/Aurora
Protocol: TCP
Port Range: 3306
Source: Security Group ID of your ECS Task/Service

CI/CD Pipeline for Containerized Shopify

Automating the build, test, and deployment process is crucial. AWS CodePipeline, CodeBuild, and CodeDeploy can be integrated to create a robust CI/CD pipeline.

Pipeline Stages:

  • Source: Triggered by code commits to a Git repository (e.g., AWS CodeCommit, GitHub).
  • Build: AWS CodeBuild uses the Dockerfile to build the container image and push it to Amazon ECR (Elastic Container Registry).
  • Deploy: AWS CodeDeploy (or direct ECS deployment) updates the ECS Service with the new container image.

CodeBuild `buildspec.yml` Example

version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin YOUR_AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
      - REPOSITORY_URI=YOUR_AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/shopify-legacy
      - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c1-7)
      - IMAGE_NAME=${REPOSITORY_URI}:${IMAGE_TAG}
      - IMAGE_LATEST=${REPOSITORY_URI}:latest

  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $IMAGE_NAME -t $IMAGE_LATEST .
      - echo Pushing the Docker image...
      - docker push $IMAGE_NAME
      - docker push $IMAGE_LATEST

  post_build:
    commands:
      - echo Build completed on `date`
      - echo Writing image definitions file...
      - printf '{"ImageURI":"%s"}\n' $IMAGE_NAME > imagedefinitions.json
      - aws ecs update-service --cluster shopify-legacy-cluster --service shopify-legacy-app-service --force-new-deployment --task-definition YOUR_TASK_DEFINITION_ARN # Or use CodeDeploy for more advanced strategies

artifacts:
  files: imagedefinitions.json

Monitoring and Logging

Essential for maintaining a healthy production environment. Configure CloudWatch Logs for container logs and CloudWatch Metrics for ECS service and container performance. Set up Alarms for critical metrics like high error rates, low availability, or resource exhaustion.

CloudWatch Log Group Configuration

In the ECS Task Definition, the logConfiguration section for the container specifies the CloudWatch Log Group. Ensure this log group exists or is created automatically.

"logConfiguration": {
    "logDriver": "awslogs",
    "options": {
        "awslogs-group": "/ecs/shopify-legacy-app",
        "awslogs-region": "YOUR_REGION",
        "awslogs-stream-prefix": "ecs"
    }
}

Security Best Practices

Secure your containerized Shopify deployment by:

  • Using IAM roles with least privilege for ECS tasks and CodeBuild.
  • Storing sensitive information (database credentials, API keys) in AWS Secrets Manager or Parameter Store, and referencing them in the Task Definition.
  • Regularly updating base Docker images and application dependencies to patch vulnerabilities.
  • Configuring strict security group rules for both ECS tasks and RDS instances.
  • Implementing Web Application Firewall (WAF) on the ALB for protection against common web exploits.

Conclusion

Containerizing and orchestrating legacy Shopify systems on AWS provides a robust foundation for scalability, resilience, and agility. By carefully defining Docker images, leveraging ECS for orchestration, integrating with RDS for database management, and automating deployments with a CI/CD pipeline, you can modernize your Shopify infrastructure and unlock its full potential.

Primary Sidebar

A little about the Author

Having 12+ Years of Experience in Software Development, Vinay is a principal software architect, senior systems engineer, and elite technical consultant. He specializes in bespoke PHP/WordPress development, high-performance Magento 2 & Shopify architectures, custom plugin/theme development from scratch, and legacy code modernization (including VB6, VB.NET, PyQt, and Crystal Reports). Known for solving complex database bottlenecks, speed optimization (Core Web Vitals), and advanced security code auditing, Vinay engineers production-ready systems designed to scale under heavy concurrent load conditions.



Chat on WhatsApp

Recent Posts

  • Debugging Guide: Diagnosing PHP-FPM child process pool exhaustion in multi-site network environments with modern tools
  • Debugging and Resolving complex namespace class loading collisions issues during heavy concurrent database traffic
  • Step-by-Step Guide: Offloading high-frequency customer support tickets metadata writes to a Redis KV store
  • How to refactor legacy event ticket registers queries using modern WP_Query and custom Transient caching
  • Step-by-Step Guide: Offloading high-frequency member profile directories metadata writes to a Redis KV store

Categories

  • apache (1)
  • Business & Monetization (390)
  • Centos (4)
  • Comparisons & Decision Making (55)
  • Debian (2)
  • Debugging & Troubleshooting (662)
  • Desktop Applications (14)
  • DevOps (7)
  • DevOps & Cloud Scaling (962)
  • Django (1)
  • Laravel (4)
  • Migration & Architecture (192)
  • Mobile Applications (24)
  • MySQL (1)
  • Performance & Optimization (873)
  • PHP (5)
  • PHP Development (49)
  • Plugins & Themes (244)
  • Programming Languages (9)
  • Python (20)
  • Ruby on Rails (1)
  • Security & Compliance (647)
  • SEO & Growth (492)
  • Server (118)
  • Ubuntu (9)
  • VB6 & VB.NET (8)
  • Web Applications & Frontend (19)
  • Web Assembly (Wasm) (2)
  • WordPress (22)
  • WordPress Plugin Development (726)
  • WordPress Theme Development (357)

Recent Posts

  • Debugging Guide: Diagnosing PHP-FPM child process pool exhaustion in multi-site network environments with modern tools
  • Debugging and Resolving complex namespace class loading collisions issues during heavy concurrent database traffic
  • Step-by-Step Guide: Offloading high-frequency customer support tickets metadata writes to a Redis KV store

Top Categories

  • DevOps & Cloud Scaling (962)
  • Performance & Optimization (873)
  • WordPress Plugin Development (726)
  • Debugging & Troubleshooting (662)
  • Security & Compliance (647)
  • SEO & Growth (492)

Our Products

  • ERP & LMS Systems (4)
  • Directories & Marketplaces (4)
  • Healthcare Portals (3)
  • Point of Sale (POS) (2)
  • E-Commerce Engines (2)

Our Services

  • E-Commerce Development (10)
  • WordPress Development (8)
  • Python & Desktop GUI (7)
  • General Consulting (7)
  • Legacy Modernization (5)
  • Mobile App Development (4)

Copyright © 2026 · Vinay Vengala