6-deploying-a-secure-laravel-application-on-aws-with-cicd-pipelines.html

Deploying a Secure Laravel Application on AWS with CI/CD Pipelines

Deploying applications in the cloud can seem daunting, but with the right tools and processes, you can streamline your workflow and enhance your project's security. In this article, we’ll explore how to deploy a secure Laravel application on Amazon Web Services (AWS) using Continuous Integration and Continuous Deployment (CI/CD) pipelines. We will cover essential concepts, provide actionable insights, and walk you through code examples to ensure a smooth deployment.

Understanding the Basics

What is Laravel?

Laravel is a powerful PHP framework designed for building web applications. It follows the MVC (Model-View-Controller) architectural pattern, offering an elegant syntax and a variety of built-in features like routing, authentication, and caching.

Why AWS for Deployment?

AWS is a leading cloud service provider that offers a wide range of services to host and manage applications. Here are some benefits of using AWS for your Laravel application:

  • Scalability: AWS services can scale with your application's needs.
  • Security: Built-in security features help protect your data.
  • Global Reach: AWS has data centers worldwide, ensuring low-latency access for users.

What are CI/CD Pipelines?

CI/CD stands for Continuous Integration and Continuous Deployment. These practices automate the process of integrating code changes, running tests, and deploying applications. This automation enhances team collaboration and helps maintain code quality.

Step-by-Step Guide to Deploying Laravel on AWS

Prerequisites

Before we start, ensure you have the following:

  • An AWS account.
  • Laravel application code ready to deploy.
  • AWS CLI installed on your local machine.
  • A code repository (e.g., GitHub or Bitbucket).

Step 1: Setting Up AWS Environment

  1. Create an EC2 Instance:
  2. Log in to the AWS Management Console.
  3. Navigate to EC2 and click “Launch Instance.”
  4. Choose an Amazon Machine Image (AMI), preferably Ubuntu.
  5. Select an instance type (e.g., t2.micro for free tier).
  6. Configure security group settings to allow HTTP (port 80) and SSH (port 22).

  7. Install Required Software: After launching your instance, connect via SSH and install necessary packages:

bash sudo apt update sudo apt install -y apache2 php libapache2-mod-php php-mysql composer unzip

  1. Set Up Database: Use Amazon RDS for a managed database service. Create a new RDS instance and note the endpoint, username, and password.

  2. Configure Laravel Environment: Update your .env file in the Laravel project to connect to the RDS instance:

plaintext DB_CONNECTION=mysql DB_HOST=<your_rds_endpoint> DB_PORT=3306 DB_DATABASE=<your_database_name> DB_USERNAME=<your_username> DB_PASSWORD=<your_password>

Step 2: Deploying the Application

  1. Upload Your Laravel Code: You can use SCP or Git to transfer your code to the EC2 instance.

Using Git:

bash git clone <your_repository_url> cd <your_repository_name>

  1. Install Dependencies: Run the following commands to install Laravel dependencies:

bash composer install npm install npm run production

  1. Set Permissions: Ensure the storage and bootstrap/cache directories are writable:

bash sudo chown -R www-data:www-data storage bootstrap/cache

  1. Configure Apache: Create a new configuration file for your Laravel app:

bash sudo nano /etc/apache2/sites-available/laravel.conf

Add the following content:

```apache ServerName your-domain.com DocumentRoot /var/www/html/your-laravel-app/public

   <Directory /var/www/html/your-laravel-app/public>
       AllowOverride All
       Require all granted
   </Directory>

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

```

Enable the new site and rewrite module:

bash sudo a2ensite laravel.conf sudo a2enmod rewrite sudo systemctl restart apache2

Step 3: Setting Up CI/CD with GitHub Actions

  1. Create GitHub Actions Workflow: In your Laravel project, create a .github/workflows/ci-cd.yml file:

```yaml name: CI/CD Pipeline

on: push: branches: - main

jobs: build: runs-on: ubuntu-latest

   steps:
     - name: Checkout code
       uses: actions/checkout@v2

     - name: Set up PHP
       uses: shivammathur/setup-php@v2
       with:
         php-version: '8.0' # Set your PHP version

     - name: Install dependencies
       run: |
         composer install
         npm install
         npm run production

     - name: Deploy to AWS
       env:
         AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
         AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
         INSTANCE_IP: ${{ secrets.INSTANCE_IP }}
       run: |
         ssh -o StrictHostKeyChecking=no ec2-user@$INSTANCE_IP "cd /var/www/html/your-laravel-app && git pull origin main && composer install && npm install && npm run production && php artisan migrate"

```

  1. Add Secrets:
  2. Go to your GitHub repository settings.
  3. Add AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and INSTANCE_IP as secrets.

Step 4: Security Best Practices

  • Use HTTPS: Set up SSL using AWS Certificate Manager and configure your Apache server to enforce HTTPS.
  • Regular Updates: Keep your Laravel and server dependencies updated.
  • Environment Variables: Keep sensitive configurations in environment variables and never hard-code them.

Conclusion

Deploying a secure Laravel application on AWS with CI/CD pipelines enhances your development process, increases reliability, and saves time. By following these steps, you ensure your application is robust, scalable, and secure. Embrace the power of automation, and let CI/CD streamline your deployment process. Happy coding!

SR
Syed
Rizwan

About the Author

Syed Rizwan is a Machine Learning Engineer with 5 years of experience in AI, IoT, and Industrial Automation.