You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
docuseal/cdk_deploy/README.md

154 lines
4.5 KiB

# CP Docuseal CDK Infrastructure
This directory contains AWS CDK v2 infrastructure code for deploying the CP Docuseal app. At present it only deploys to development and staging; production will follow.
## Architecture Overview
This infrastructure is basically nicked wholesale from the Integration Station application, just dialed down a notch as our needs are a bit less than theirs.
- **Internal Application Load Balancer (ALB)** - Routes traffic to ECS services within the VPC
- **Amazon ECS Cluster** - Runs containerized applications on EC2 instances (ARM64 t4g.small)
- **ECS Service** - Manages container deployment and scaling
- **ECS Task Definition** - Defines container configuration and resource requirements
- **CloudWatch Logging** - Centralized logging for application monitoring
- **Security Groups** - Network security controls
- **ECR Integration** - Uses existing "integration-station" ECR repository
## Prerequisites
1. **AWS CLI** configured with appropriate permissions
2. **Node.js** (version 22 or later)
3. **AWS CDK v2** installed globally: `npm install -g aws-cdk`
4. **Existing AWS Infrastructure**:
- VPC with public and private subnets
- ECR repository named "cp-docuseal"
- Appropriate IAM permissions for CDK deployment
## Setup
1. **Install dependencies**:
```bash
cd cdk_deploy
npm install
```
2. **Bootstrap CDK** (application setup ONLY):
```bash
npm run bootstrap
```
3. **Update VPC and Subnet IDs**:
Edit `app.js` and replace the placeholder IDs with your actual VPC and subnet IDs:
```javascript
vpcId: 'vpc-your-actual-vpc-id',
privateSubnetIds: ['subnet-your-private-1', 'subnet-your-private-2'],
publicSubnetIds: ['subnet-your-public-1', 'subnet-your-public-2']
```
## Environment Configuration
The infrastructure supports three environments with different resource allocations:
### Development
- **Instances**: 1 ECS instance
- **CPU**: 512 units
- **Memory**: 1024 MB
### Staging
- **Instances**: 1 ECS instance
- **CPU**: 512 units
- **Memory**: 1024 MB
### Production
- N/A
## Deployment
### Deploy to Development
```bash
npm run deploy:dev
```
### Deploy to Staging
```bash
npm run deploy:staging
```
### Deploy to Production - NOT YET SUPPORTED
```bash
npm run deploy:prod
```
### View CloudFormation Template
```bash
npm run synth
```
### Compare Changes
```bash
npm run diff
```
## Cleanup
### Destroy Development Environment
```bash
npm run destroy:dev
```
### Destroy Staging Environment
```bash
npm run destroy:staging
```
### Destroy Production Environment - NOT YET SUPPORTED
```bash
npm run destroy:prod
```
## Important Notes
1. **Internal ALB**: The Application Load Balancer is configured as internal-only and deployed in private subnets for security.
2. **ARM64 Instances**: The ECS cluster uses t4g.small ARM64 instances for cost efficiency. Ensure your container images are built for ARM64 architecture.
3. **Health Checks**: The ALB target group is configured to perform health checks on `/health` endpoint. Make sure your application responds to this endpoint.
4. **Logging**: All ECS tasks automatically log to CloudWatch under `/ecs/cp-docuseal-{environment}` log groups.
5. **Security**: Security groups are configured to allow:
- ALB: HTTP (80) and HTTPS (443) traffic
- ECS: Traffic from ALB on port 3000
## Troubleshooting
1. **VPC Lookup Issues**: Ensure the VPC IDs and subnet IDs in `app.js` are correct and exist in your AWS account.
2. **ECR Repository**: Verify that the "cp-docuseal" ECR repository exists and contains the required Docker images.
3. **Permissions**: Ensure your AWS credentials have sufficient permissions for:
- EC2 (VPC, Security Groups, Launch Templates)
- ECS (Clusters, Services, Tasks)
- ELB (Application Load Balancers, Target Groups)
- CloudWatch (Log Groups)
- IAM (Roles and Policies)
4. **Container Health**: If services fail to start, check CloudWatch logs for container startup issues.
## Customization
You can modify the following aspects:
- **Instance Types**: Change `ec2.InstanceClass.T4G` and `ec2.InstanceSize.SMALL` in the stack
- **Container Port**: Update port mappings if your application uses a different port
- **Resource Limits**: Adjust CPU and memory allocations in the environment configurations
- **Auto Scaling**: Modify `minCapacity` and `maxCapacity` for different scaling behaviors
## Stack Outputs
After deployment, the stack provides:
- **ALB DNS Name**: Internal DNS name for the Application Load Balancer
- **ECS Cluster Name**: Name of the created ECS cluster
- **ECS Service Name**: Name of the ECS service