Skip to content

hypest/simple-webapp-localstack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

44 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Simple Counter App with Rails, AWS, and LocalStack

A Rails web application that implements a simple counter and sends count updates to other app instances via AWS SQS, all running in a LocalStack development environment within devcontainers.

πŸ—οΈ Project Structure

simple-app-localstack/
β”œβ”€β”€ .devcontainer/           # VS Code devcontainer configuration
β”‚   └── devcontainer.json    # Container setup with Rails, AWS CLI, Terraform
β”œβ”€β”€ app/                     # Rails application
β”‚   β”œβ”€β”€ Gemfile             # Ruby dependencies
β”‚   β”œβ”€β”€ config/             # Rails configuration
β”‚   └── ...                 # Standard Rails structure
β”œβ”€β”€ infrastructure/          # Terraform configuration
β”‚   β”œβ”€β”€ main.tf             # Provider and LocalStack configuration
β”‚   β”œβ”€β”€ sqs.tf              # SQS queue definitions
β”‚   └── outputs.tf          # Terraform outputs
β”œβ”€β”€ scripts/                # Setup and utility scripts
β”‚   └── setup.sh            # Development environment setup
β”œβ”€β”€ app-docker-images/      # Dockerfiles for app images (dev/prod)
└── README.md               # This file

πŸš€ Getting Started

Prerequisites

  • Docker and Docker Compose
  • VS Code with the following extensions:
    • Dev Containers extension
    • AWS Toolkit
    • LocalStack Toolkit

Setup

  1. Open in VS Code: Open this project in VS Code
  2. Reopen in Container: When prompted, click "Reopen in Container" or use the Command Palette (Cmd+Shift+P) and select "Dev Containers: Reopen in Container"
  3. Wait for Setup: The devcontainer will automatically:
    • Build the development environment
    • Install all dependencies
    • Set up LocalStack infrastructure
    • Configure the Rails application

Development Workflow

Once the devcontainer is running:

  1. Start the Rails server:

    cd /workspace/app
    rails server
  2. Access the application: http://localhost:3000

  3. Access LocalStack: http://localhost:4566

  4. Monitor SQS queues:

    aws --endpoint-url=http://localstack:4566 sqs list-queues

🏒 Architecture

Services

  • Rails App: Main web application with counter functionality
  • LocalStack: Local AWS services emulation (SQS)
  • Redis: Session store and Sidekiq backend
  • Sidekiq: Background job processing

AWS Resources (via LocalStack)

  • SQS Queue: counter-queue for inter-app communication
  • SQS DLQ: counter-queue-dlq for failed messages

πŸ”§ Configuration

Environment Variables

The devcontainer automatically sets up these environment variables:

AWS_DEFAULT_REGION=us-east-1
AWS_ACCESS_KEY_ID=test
AWS_SECRET_ACCESS_KEY=test
LOCALSTACK_ENDPOINT=http://localstack:4566
COUNTER_QUEUE_URL=http://localstack:4566/000000000000/counter-queue
REDIS_URL=redis://redis:6379/0

Terraform Configuration

Infrastructure is defined in the infrastructure/ directory:

  • LocalStack provider configuration
  • SQS queue and DLQ creation
  • Outputs for queue URLs

πŸ“ Next Steps

After setting up the basic structure, you'll want to:

  1. Generate Rails components:

    rails generate controller Counter index
    rails generate model CounterEvent count:integer message:text
  2. Implement the counter logic:

    • Counter controller with increment/decrement actions
    • SQS message publishing
    • Background job for message processing
  3. Add views and styling:

    • Counter display
    • Action buttons
    • Real-time updates (via ActionCable or polling)

πŸ› οΈ Useful Commands

Rails

rails server                    # Start the Rails server
rails console                   # Rails console
rails generate --help           # See available generators
rails db:migrate                # Run database migrations

Terraform

cd infrastructure
terraform plan                  # Preview changes
terraform apply                 # Apply changes
terraform destroy               # Destroy infrastructure

AWS CLI (LocalStack)

# List SQS queues
aws --endpoint-url=http://localstack:4566 sqs list-queues

# Send a test message
aws --endpoint-url=http://localstack:4566 sqs send-message \
  --queue-url http://localstack:4566/000000000000/counter-queue \
  --message-body "Test message"

# Receive messages
aws --endpoint-url=http://localstack:4566 sqs receive-message \
  --queue-url http://localstack:4566/000000000000/counter-queue

Docker

./scripts/start-supporting-services.sh   # starts Redis and registry via docker run
./scripts/registry-bridge.sh status      # show registry status and list images

## 🧰 Devcontainer image and developer tooling

This repository now builds the devcontainer from a Dockerfile (`.devcontainer/Dockerfile`) so we can bake developer tools into the image.

- Tools installed in the devcontainer image:
   - `redis-cli` (provided by `redis-tools`) β€” quick Redis checks and troubleshooting
   - `jq` β€” JSON CLI processor
   - `http` (HTTPie) β€” friendlier HTTP client than curl for quick API calls

### Rebuild the devcontainer

After pulling the repo changes you'll need to rebuild the devcontainer so the new Dockerfile is used. In VS Code:

1. Open the Command Palette (Ctrl/Cmd+Shift+P)
2. Select `Dev Containers: Rebuild and Reopen in Container`

Or using the Dev Container CLI:

```bash
npm i -g @devcontainers/cli
devcontainer build --workspace-folder . --file .devcontainer/Dockerfile
devcontainer up --workspace-folder .

Quick checks inside the devcontainer

which redis-cli jq http You can use the helper scripts to manage supporting services (registry and Redis) and the Local Docker registry:

./scripts/start-supporting-services.sh   # starts Redis and registry via docker run
./scripts/registry-bridge.sh start       # starts the local registry only (if needed)
./scripts/registry-bridge.sh status      # show registry status and list images
./scripts/registry-bridge.sh clean       # remove registry container & data

Use the helper script to start local supporting services (Redis and a local Docker registry):

./scripts/start-supporting-services.sh

If you need to stop/remove them:

docker rm -f redis registry || true

## πŸ› Troubleshooting

### LocalStack not responding

```bash
# Check LocalStack health
curl http://localhost:4566/health

# Restart LocalStack (example using Docker)
docker restart <localstack-container-name>

# Or if you use the LocalStack CLI or supervisor, restart via that tool

Rails server issues

# Check if gems are installed
bundle check

# Reinstall gems
bundle install

# Check database
rails db:create db:migrate

Port conflicts

  • Rails: 3000
  • LocalStack: 4566
  • Redis: 6379

Make sure these ports are available on your host machine.

πŸ“š Technologies Used

  • Ruby on Rails 7.0: Web framework
  • LocalStack: Local AWS development
  • Terraform: Infrastructure as Code
  • Docker: Containerization
  • Sidekiq: Background job processing
  • Redis: In-memory data store
  • AWS SDK: AWS service integration
  • SQLite: Development database

About

Learning Rails, Terraform, AWS, LocalStack

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published