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

Vengala Vinay

Having 9+ 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 9+ Years of Experience in Software Development.
Expertised in Php Development, WordPress Custom Theme Development (From scratch using underscores or Genesis Framework or using any blank theme or Premium Theme), Custom Plugin Development. Hands on Experience on 3rd Party Php Extension like Chilkat, nSoftware.

Recent Posts

  • Step-by-Step: Diagnosing indexing lock conflicts and high CPU during bulk stock updates on DigitalOcean Servers
  • How to Debug and Fix memory leaks and socket exhaustion in daemon processes in Modern C++ Applications
  • Infrastructure as Code: Provisioning Secure PHP Clusters on DigitalOcean Using Terraform
  • Fixing Slow Largest Contentful Paint (LCP) caused by unoptimized database queries in Legacy Laravel Codebases Without Breaking API Contracts
  • An Auditor’s Checklist for Securing Laravel Backends on Google Cloud

Copyright © 2026 · Vinay Vengala