{"id":19327813,"url":"https://github.com/ekedonald/lemp-stack-implementation-on-aws","last_synced_at":"2026-04-08T22:31:02.289Z","repository":{"id":200127902,"uuid":"693843526","full_name":"ekedonald/LEMP-Stack-Implementation-On-AWS","owner":"ekedonald","description":"This project shows the steps taken to implement a Linux, Nginx, MySQL and PHP (LEMP) Stack on AWS.","archived":false,"fork":false,"pushed_at":"2023-10-14T12:58:42.000Z","size":6084,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-16T22:02:52.863Z","etag":null,"topics":["aws-ec2","linux","mysql","nginx","php"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ekedonald.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-09-19T20:32:31.000Z","updated_at":"2023-10-06T12:46:50.000Z","dependencies_parsed_at":"2023-10-15T21:47:06.792Z","dependency_job_id":null,"html_url":"https://github.com/ekedonald/LEMP-Stack-Implementation-On-AWS","commit_stats":null,"previous_names":["ekedonald/lemp-stack-implementation-on-aws"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ekedonald/LEMP-Stack-Implementation-On-AWS","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ekedonald%2FLEMP-Stack-Implementation-On-AWS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ekedonald%2FLEMP-Stack-Implementation-On-AWS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ekedonald%2FLEMP-Stack-Implementation-On-AWS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ekedonald%2FLEMP-Stack-Implementation-On-AWS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ekedonald","download_url":"https://codeload.github.com/ekedonald/LEMP-Stack-Implementation-On-AWS/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ekedonald%2FLEMP-Stack-Implementation-On-AWS/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31577444,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws-ec2","linux","mysql","nginx","php"],"created_at":"2024-11-10T02:18:51.871Z","updated_at":"2026-04-08T22:31:02.259Z","avatar_url":"https://github.com/ekedonald.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# LEMP Stack Implementation On AWS\n___\n## What Is A LEMP Stack?\nLEMP is an open-source web application stack used to develop web applications. The term LEMP is an acronym that represents **L** for the **Linux Operating system**, **Nginx** (pronounced as **engine-x**, hence the **E** in the acronym) **web server**, **M** for **MySQL database**, and **P** for **PHP scripting language**.\n\nThe __LEMP__ stack is a combination of four open-source technologies that are used in web development. These technologies include:\n\n* __Linux__: The operating system that runs the web server.\n\n* __Nginx__: The web server software that handles HTTP requests.\n\n* __MySQL__: The relational database management system that stores the website's data.\n\n* __PHP__: The programming language used to build dynamic web applications.\n\n## LEMP Stack Architecture\n### Linux\nLinux is the operating system and the first layer of the architecture. It binds every other layer together. It is free and open-source and well known to be highly secure and less vulnerable to malware and viruses even if compared to Windows or macOS.\n\n### Nginx\nIt is a web server that follows an event-driven approach and handles multiple requests within one thread. Nginx supports all Unix-like OS and also supports Windows partially. \n\nWhen a web browser requests a web page that request is handled by the web server, here that web server is Nginx. Then the web server passes that request to server-side technologies used in the LEMP stack for instance as a server-side scripting language like PHP to communicate with the server and database.\n\n### MySQL\nIt is an open-source SQL-based database that is used to store data and manipulate data while maintaining data consistency and integrity. It organizes data in tabular form in rows and columns.\n\n### PHP\nIt is a scripting language that works on the server-side and communicates with the database MySQL and does all operations that user requests like fetching data, adding data, manipulating data, or processing the data.\n\n## How Does The LEMP Stack Work?\nThe LEMP stack works by using Nginx as the web server, which listens for HTTP requests and forwards them to the appropriate PHP script. The PHP script generates a response, which is then sent back to the user via Nginx.\n\nMySQL is used to store and manage the website’s data. PHP communicates with MySQL to retrieve and store data as needed.\n\n## How To Set Up A LEMP Stack On AWS\n\n### Prerequisites \n1. Ensure you have an AWS Account. If you don't have an account, [sign up for AWS here.](https://portal.aws.amazon.com/billing/signup#/start/email)\n\n### Step 1: Launch An EC2 Instance\nThe following steps are taken to launch an EC2 Instance on AWS:\n\n* On the EC2 Dashboard, click on the __Launch Instance__ button.\n\n![Launch Instance1](./images/1.%20Launch%20Instance1.png)\n\n* Give the EC2 Instance a name of your choice, type \"ubuntu\" on the AMI search bar and hit enter.\n\n![Launch Instance2](./images/1.%20Launch%20Instance2.png)\n\n* Select __Ubuntu Server 22.04 LTS (HVM), SSD Volume Type__ as your preferred AMI.\n\n![Launch Instance3](./images/1.%20Launch%20Instance3.png)\n\n* Create a new key pair login, the key pair login is used to SSH into the Instance.\n\n![Launch Instance4](./images/1.%20Launch%20Instance4.png)\n\n* Give the key pair a name of your choice, select the `.pem` format and a private key will be sent to the Downloads directory on your computer.\n\n![Launch Instance5](./images/1.%20Launch%20Instance5.png)\n\n* Create a security group and allow SSH traffic from an IP address as shown below:\n\n![Launch Instance6](./images/1.%20Launch%20Instance6.png)\n\n* Click on the Launch Instance button.\n\n![Launch Instance7](./images/1.%20Launch%20Instance7.png)\n\n### Step 2: SSH Into The EC2 Instance\nThe following steps are taken to SSH into the EC2 Instance.\n\n* On the EC2 Dashboard, click on the Running Instance tab.\n\n![Launch Instance8](./images/1.%20Launch%20Instance8.png)\n\n* Click on the Instance ID of the Running Instance.\n\n![Launch Instance9](./images/1.%20Launch%20Instance9.png)\n\n* Click on the Connect button of the Instance ID summary.\n\n![Launch Instance10](./images/1.%20Launch%20Instance10.png)\n\n* The highlighted commands in the image below are used to SSH into the EC2 Instance.\n\n![Launch Instance11](./images/1.%20Launch%20Instance11.png)\n\n* On your terminal, run the following command `cd Downloads` to go to the location of the `.pem` private key file.\n\n* Run the code shown below to change file permisssions of the `.pem` private key file:\n\n```bash\nsudo chmod 400 \u003cprivate-key-name\u003e.pem\n```\n\n![SSH Instance1](./images/1.%20SSH%20Instance1.png)\n\n* Finally, SSH into the EC2 Instance by running the command shown below:\n\n```bash\nssh -i \u003cprivate-key-name\u003e.pem ubuntu@\u003cPublic-IP-address\u003e\n```\n![SSH Instance2](./images/1.%20SSH%20Instance2.png)\n\n### Step 3: Installing The Nginx Web Server\nThe following steps are taken to install the Nginx web server:\n\n* Update the list of packages in the package manager.\n\n```bash\nsudo apt update\n```\n\n![apt update](./images/2.%20apt%20update.png)\n\n* Run the Nginx package installation with the `-y` flag to confirm the installation.\n\n```bash\nsudo apt install nginx -y\n```\n\n![install nginx](./images/2.%20install%20nginx.png)\n\n* To verify that Nginx was successful and is running as a service in Ubuntu, run the following command:\n\n```bash\nsudo systemctl status nginx\n```\n\n![sysytemctl status nginx](./images/2.%20systemctl%20status%20nginx.png)\n\n### Step 4: Updating The Firewall\nBefore any traffic can be received by the web server, you need to open TCP port 80 which is the default port browsers use to connect to access web pages on the internet. \n\nThe following steps are taken to open TCP port 80:\n\n* On the EC2 Dashboard, click on the Running Instances tab.\n\n![Launch Instance8](./images/1.%20Launch%20Instance8.png)\n\n* Click on the Instance ID.\n\n![Launch Instance9](./images/1.%20Launch%20Instance9.png)\n\n* On the Instance Summary of the EC2 Instance, click on the Security tab highlighted as shown below:\n\n![Inbound Rules1](./images/2.%20Inbound%20Rules1.png)\n\n* Click on the Security Group highlighted below:\n\n![Inbound Rules2](./images/2.%20Inbound%20Rules2.png)\n\n* Click on the Edit Inbound Rules button as shown below:\n\n![Inbound Rules3](./images/2.%20Inbound%20Rules3.png)\n\n* Click on the Add Rule button as shown below:\n\n![Inbound Rules4](./images/2.%20Inbound%20Rules4.png)\n\n* Add a rule that allows HTTP (port 80) and all IPv4 addresses to connect and save the rule.\n\n![Inbound Rules5](./images/2.%20Inbound%20Rules5.png)\n\n* Finally, the server can now be accessed locally and from any IPv4 address. To check if you can access the server locally in Ubuntu, run the following command:\n\n```bash\ncurl http://localhost:80\n```\n\n![curl http localhost](./images/2.%20curl%20localhost.png)\n\n* To check if your Nginx server can respond to requests from the Internet, open your browser and run the following URL:\n\n```bash\nhttp://\u003cPublic-IP-Address\u003e:80\n```\n\n![http public IP](./images/2.%20http%20public%20IP.png)\n\nThe public IP address can be retrieved by clicking on the Instance ID of the Running Instance as shown below:\n\n![IP address1](./images/2.%20IP%20address1.png)\n\nHowever, It can also be retrieved by running the following command:\n\n```bash\ncurl -s http://169.254.169.254/latest/meta-data/public-ipv4\n```\n\n![IP address2](./images/2.%20IP%20address2.png)\n\n### Step 5: Installing MySQL\nThe following steps are taken to install MySQL:\n\n* Install the MySQL package using apt with the `-y` flag to confirm the installation.\n\n```bash\nsudo apt install mysql-server -y\n```\n\n![install mysql](./images/3.%20install%20mysql-server.png)\n\n* Log into the MySQL console by running the following command:\n\n```bash\nsudo mysql\n```\n\nThis will connect to the MySQL server as the administrative user root. You should see an output like this:\n\n![sudo mysql](./images/3.%20sudo%20mysql.png)\n\n* Run a security script that comes pre-installed with MySQL. This script removes insecure default settings and locks down access to your database system. Before running the script, you will set a password for the root user, using *mysql_native_password* as the default authentication method. You are defining this user's password as `PassWord.1`.\n\n```bash\nALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PassWord.1';\n```\n\n![sql aunthentication](./images/3.%20sql%20aunthentication1.png)\n\n* Exit the MySQL shell by running the `exit` command below:\n\n![exit mysql](./images/3.%20mysql%20exit.png)\n\n* Start the interactive script by running the command below:\n\n```bash\nsudo mysql_secure_installation\n```\n\n![sudo mysql_secure_installation](./images/3.%20sudo%20mysql%20secure%20installation.png)\n\n* This will ask if you want to configure the `VALIDATE PASSWORD PLUGIN`. Enabling this feature is something of a judgment call. If enabled, passwords that don't match the specified criteria will be rejected by MySQL with an error. It is safe to leave validation disabled, but you should always use strong, unique passwords for database credentials. Answer `y` for yes for the validate password plugin prompt.\n\n![validate password1](./images/3.%20validate%20password1.png)\n\n* If you select \"yes\", you will be asked to select the level of password validation. Keep in mind that if you enter `2` for the strongest level, your password will need to contain a numeric, mixed case and special character e.g. `PassWord.1`. Note the highlighted password has already been set so you select `n` to leave the password for root unchanged.\n\n![validate password2](./images/3.%20validate%20password2.png)\n\n* Decline to change the password for root by typing `n`.\n\n![validate password3](./images/3.%20validate%20password3.png)\n\n* Remove anonymous users by typing `y`.\n\n![validate password4](./images/3.%20validate%20password4.png)\n\n* Disallow root login remotely by typing `y`.\n\n![validate password5](./images/3.%20validate%20password5.png)\n\n* Remove the test database and access by typing `y`.\n\n![validate password6](./images/3.%20validate%20password6.png)\n\n* Reload privilege tables by typing `y`.\n\n![validate password7](./images/3.%20validate%20password7.png)\n\n### Step 6: Installing PHP\nNginx requires an external program to handle PHP processing and act as a bridge between the PHP interpreter itself and the web server. This allows for better overall performance in most PHP-based websites but it requires additional configuration. You'll need to install `php-fpm` i.e. PHP FastCGI Process Manager and tell Nginx to pass PHP requests to this software for processing. \n\nAdditionally, you'll need `php-mysql`, a PHP module that allows PHP to communicate with MySQL-based databases. Core PHP packages will automatically be installed as dependencies.\n\n* To install these 2 packages run the following command with the `-y` flag to confirm installation:\n\n```bash\nsudo apt install php-fpm php-mysql\n```\n\n### Step 7: Configuring Nginx To Use PHP Processor\nThe following steps are taken to configure Nginx to use a PHP processor:\n\n* Create the root web directory for *your_domain* as shown below:\n\n```bash\nsudo mkdir /var/www/projectLEMP\n```\n\n* Assign ownership of the directory with $USER environment variable which will reference your current system user as shown below:\n\n```bash\nsudo chown -R $USER:$USER /var/www/projectLEMP\n```\n\n![mkdir projectLEMP](./images/4.%20mkdir%20projectLEMP.png)\n\n* Open a new configuration file in Nginx's `sites-available` directory using your preferred command line. Here, we'll use `nano`:\n\n```bash\nsudo nano /etc/nginx/sites-available/projectLEMP\n```\n\n* This will create a new blank file, copy and paste the following command into the configuration file:\n\n```bash\n#/etc/nginx/sites-available/projectLEMP\n\nserver {\n    listen 80;\n    server_name projectLEMP www.projectLEMP;\n    root /var/www/projectLEMP;\n\n    index index.html index.htm index.php;\n\n    location / {\n        try_files $uri $uri/ =404;\n    }\n\n    location ~ \\.php$ {\n        include snippets/fastcgi-php.conf;\n        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;\n     }\n\n    location ~ /\\.ht {\n        deny all;\n    }\n\n}\n```\n\n![sudo nano /etc/nginx/sites-available/prpjectLEMP](./images/4.%20nano%20:etc:nginx:sites-available:projectLEMP.png)\n\nHere's what each of these directives and location blocks do:\n\n1. `listen`: Defines what port Nginx will listen on. In this case, it will listen on port `80`, the default port for HTTP.\n\n2. `root`: Defines the document root where the files served by this website are stored.\n\n3. `index`: Defines in which order Nginx will prioritize index files for this website. It is a common practice to list `index.html` files with higher precedence than `index.php` files to allow for quickly setting up a maintenance landing page in PHP applications. You can adjust these settings to better suit your application needs.\n\n4. `server_name`: Defines which domain names and/or IP addresses this server block should respond for. **Point this directive to your server's domain name or public IP address**.\n\n5. `location /`: The first location block includes a `try_files` directive, which checks for the existence of files or directories matching a URI request. If Nginx cannot find the appropriate resource, it will return a 404 error.\n\n6. `location ~ \\-php$`: This location block handles the actual PHP processing by pointing Nginx to the fastogi-php.conf configuration file and the `php7.4-fpm.sock` file, which declares what socket is associated with `php-fpm`.\n\n7. `location ~ /\\.ht`: The last location block deals with `htaccess` files, which Nginx does not process. By adding the deny all directive, if any `.htaccess` files happen to find their way into the document root,they will not be served to visitors.\n\n* When you're done editing, save and close the file. \n\n* Activate your configuration by linking to the configuration file from Nginx's `sites-enabled` directory using the command below.\n\n```bash\nsudo ln -s /etc/nginx/sites-available/projectLEMP /etc/nginx/sites-enabled/\n```\n\n* This will tell Nginx to use the configuration the next time it is reloaded. You can test your configuration for syntax errors by running the following command:\n\n```bash\nsudo nginx -t\n```\n\nYou'll see the following message if no errors were reported.\n\n![sudo nginx -t](./images/4.%20sudo%20nginx%20-t.png)\n\n* Disable the default Nginx host configured to listen on port 80 using the command below.\n\n```bash\nsudo unlink /etc/nginx/sites-enabled/default\n```\n\n* Reload Nginx to apply changes.\n\n```bash\nsystemctl reload nginx\n```\n\n* The website is now active but the webroot `/var/www/projectLEMP` is still empty. Create an `index.html` file in that directory to test if the new server block is functional as shown below:\n\n```bash\nsudo echo 'Hello LEMP from hostname' $(curl -s http://169.254.169.254/latest/meta-data/public-hostname) 'with public IP' $(curl -s http://169.254.169.254/latest/meta-data/public-ipv4) \u003e /var/www/projectLEMP/index.html\n```\n\n* Go to your browser and open the website URL using your IP address.\n\n```bash\nhttp://\u003cPublic-IP-Address\u003e:80\n```\n\n![http public IP](./images/4.%20http%20public%20IP.png)\n\n* Finally, if you see the text from the *echo* command appended to the `index.html` file, it means the Nginx site is working.\n\n### Step 8: Testing PHP With Nginx\nThe LEMP stack is completely installed and fully operational. You can test it to validate that Nginx can correctly hand `.php` files off to your PHP processor.\n\n* Create and open a new file called `info.php` within your document root with your text editor.\n\n```bash\nnano /var/www/projectLEMP/info.php\n```\n\n* Copy and paste the code below into the new file. This is a valid PHP code that will return information about your server.\n\n```bash\n\u003c?php\nphpinfo();\n```\n\n![php info](./images/5.%20php%20info.png)\n\n* You can now access this page in your web browser by visiting the public IP address you've set up in your Nginx configuration file, followed by `/info.php`:\n\n```bash\nhttp://public_IP_address/info.php\n```\n\n* You will see a web page containing detailed information about your server.\n\n![http IP address info/php](./images/5.%20http%20public%20IP%20:info.png)\n\n* After checking the relevant information about your PHP server through that page, it's best to remove the file as it contains sensitive information about your PHP environment and Ubuntu server.\n\n```bash\nsudo rm /var/www/projectLEMP/info.php\n```\n\n### Step 9: Retrieving Data From MySQL Database With PHP\nThe following steps are taken to retrieve data from MySQL database with PHP:\n\n* Connect to the MySQL console using the root account.\n\n```bash\nsudo mysql\n```\n\n* Create a database from your MySQL console.\n\n```bash\nmysql\u003e CREATE DATABASE `example_database`;\n```\n\n![create database](./images/6.%20CREATE%20DATABASE.png)\n\n* Create a new user and grant him full privileges on the database. The command below creates a new user named `example_user` using *mysql_native_password* as the default authentication method. The user's password is defined as `PassWord.1` but you can choose any password of your choice.\n\n```bash\nmysql\u003e  CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'PassWord.1';\n```\n\n![create user](./images/6.%20CREATE%20USER.png)\n\n* Give the new user permission over the `example_database`. This will give the **example_user** user full privileges over the **example_database** while preventing the user from creating or modifying other databases on your server.\n\n```bash\nmysql\u003e GRANT ALL ON example_database.* TO 'example_user'@'%';\n```\n\n![grant all](./images/6.%20GRANT%20ALL.png)\n\n* Exit the MySQL shell.\n\n```bash\nmysql\u003e exit\n```\n\n![mysql exit](./images/6.%20mysql%20exit.png)\n\n* Test if the new user has the proper permissions by logging into the MySQL console again, this time using the custom user credentials.\n\n```bash\nmysql -u example_user -p\n```\n\n![mysql example user](./images/6.%20mysql%20-u%20example%20user.png)\n\nNote that the `-p` flag in this command will prompt you for the password used when creating the `example_user` user.\n\n* After logging into the MySQL console, confirm that you have access to the `example_database` database.\n\n```bash\nmysql\u003e SHOW DATABASE;\n```\n\n![show database](./images/6.%20SHOW%20DATABASES.png)\n\n* Create a test table named **todo_list** using the command below.\n\n```bash\nCREATE TABLE example_database.todo_list (item_id INT AUTO_INCREMENT,content VARCHAR(255),PRIMARY KEY(item_id));\n```\n![create table](./images/6.%20CREATE%20TABLE.png)\n\n* Inset a few rows of content in the test table. This is done a couple of times to populate the table.\n\n```bash\nmysql\u003e INSERT INTO example_database.todo_list (content) VALUES (\"My first important item\");\n```\n\n![insert into1](./images/6.%20INSERT%20INTO1.png)\n\n![insert into2](./images/6.%20INSERT%20INTO2.png)\n\n* To confirm that the data was successfully saved to your table, run the following command:\n\n```bash\nmysql\u003e  SELECT * FROM example_database.todo_list;\n```\n\n* You will see the following output:\n\n![select from](./images/6.%20SELECT%20FROM.png)\n\n* Exit the MySQL console.\n\n```bash\nmysql\u003e exit\n```\n\n![mysql exit](./images/6.%20mysql%20exit.png)\n\n* Create a new PHP script that will connect to MySQL and query for your content in your custom web root directory using the following command:\n\n```bash\nnano /var/www/projectLEMP/todo_list.php\n```\n* Copy the code below into the `todo_list.php` script.\n\n```bash\n\u003c?php\n$user = \"example_user\";\n$password = \"PassWord.1\";\n$database = \"example_database\";\n$table = \"todo_list\";\n\ntry {\n  $db = new PDO(\"mysql:host=localhost;dbname=$database\", $user, $password);\n  echo \"\u003ch2\u003eTODO\u003c/h2\u003e\u003col\u003e\";\n  foreach($db-\u003equery(\"SELECT content FROM $table\") as $row) {\n    echo \"\u003cli\u003e\" . $row['content'] . \"\u003c/li\u003e\";\n  }\n  echo \"\u003c/ol\u003e\";\n} catch (PDOException $e) {\n    print \"Error!: \" . $e-\u003egetMessage() . \"\u003cbr/\u003e\";\n    die();\n}\n```\n\n![nano /var/www/projectLEMP/todo_list](./images/6.%20nano%20:var:www:projectLEMP:todo_list.png)\n\n* Save and close when editing is complete.\n\n* You can now access this page in your web browser by visiting the public IP address configured for your website followed by `/todo_list.php`.\n\n```bash\nhttp://\u003cpublic_IP_address\u003e/todo_list.php\n```\n\n![http public ip todo_list](./images/6.%20http%20public%20IP%20:todo_list.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fekedonald%2Flemp-stack-implementation-on-aws","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fekedonald%2Flemp-stack-implementation-on-aws","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fekedonald%2Flemp-stack-implementation-on-aws/lists"}