|
1 |
| -# Infrastructure Documentation |
2 |
| - |
3 |
| -This document describes the AWS infrastructure defined in `template.yaml` for the ServiceLifecycle Lambda with PostgreSQL example. |
4 |
| - |
5 |
| -## Architecture Overview |
6 |
| - |
7 |
| -The infrastructure consists of a secure VPC setup with public and private subnets, a Lambda function in public subnets, and an RDS PostgreSQL database in private subnets. The architecture follows AWS best practices for security and connectivity. |
8 |
| - |
9 |
| -```mermaid |
10 |
| -graph TD |
11 |
| - subgraph "AWS Cloud" |
12 |
| - subgraph "VPC (10.0.0.0/16)" |
13 |
| - subgraph "Public Subnets" |
14 |
| - Lambda["Lambda Function"] |
15 |
| - NAT["NAT Gateway"] |
16 |
| - IGW["Internet Gateway"] |
17 |
| - end |
18 |
| - |
19 |
| - subgraph "Private Subnets" |
20 |
| - RDS["PostgreSQL RDS"] |
21 |
| - SSM1["SSM Endpoint"] |
22 |
| - SSM2["SSM Messages Endpoint"] |
23 |
| - SSM3["EC2 Messages Endpoint"] |
24 |
| - end |
25 |
| - |
26 |
| - Lambda -- "Egress to DB (5432)" --> RDS |
27 |
| - Lambda -- "Egress to AWS APIs (443)" --> Internet |
28 |
| - |
29 |
| - RDS -- "Ingress from Lambda (5432)" --> Lambda |
30 |
| - RDS -- "Ingress from SSM (5432)" --> SSM1 |
31 |
| - |
32 |
| - NAT -- "Outbound traffic" --> IGW |
33 |
| - IGW -- "Internet Access" --> Internet |
34 |
| - end |
35 |
| - |
36 |
| - SecretsManager["Secrets Manager"] |
37 |
| - APIGateway["API Gateway"] |
38 |
| - EC2["Amazon EC2"] |
39 |
| - |
40 |
| - APIGateway --> Lambda |
41 |
| - Lambda --> SecretsManager |
42 |
| - EC2 -- "Via SSM Endpoints" --> SSM1 |
43 |
| - SSM1 --> RDS |
44 |
| - end |
45 |
| - |
46 |
| - User["User"] --> APIGateway |
47 |
| - Admin["Admin"] --> EC2 |
48 |
| -``` |
49 |
| - |
50 |
| -## Key Components |
51 |
| - |
52 |
| -### Networking |
53 |
| - |
54 |
| -1. **VPC**: A dedicated VPC with CIDR block `10.0.0.0/16` |
55 |
| -2. **Subnets**: |
56 |
| - - Public Subnets (10.0.1.0/24, 10.0.2.0/24): For Lambda and NAT Gateway |
57 |
| - - Private Subnets (10.0.3.0/24, 10.0.4.0/24): For RDS and VPC endpoints |
58 |
| -3. **Internet Gateway**: Provides internet access for public subnets |
59 |
| -4. **NAT Gateway**: Allows outbound internet access from private subnets |
60 |
| -5. **Route Tables**: Separate route tables for public and private subnets |
61 |
| - |
62 |
| -### Security |
63 |
| - |
64 |
| -1. **Security Groups**: |
65 |
| - - **Lambda Security Group**: Restricts outbound traffic to: |
66 |
| - - PostgreSQL (5432) within the VPC |
67 |
| - - HTTPS (443) to the internet |
68 |
| - - **Database Security Group**: Allows inbound PostgreSQL connections only from: |
69 |
| - - Lambda Security Group |
70 |
| - - SSM Endpoint Security Group |
71 |
| - - **SSM Endpoint Security Group**: Allows HTTPS inbound for SSM connections |
72 |
| - |
73 |
| -2. **Encryption**: |
74 |
| - - RDS storage encryption enabled |
75 |
| - - SSL/TLS for database connections with certificate verification |
76 |
| - - Secrets Manager for secure credential storage |
77 |
| - |
78 |
| -### Compute & Database |
79 |
| - |
80 |
| -1. **Lambda Function**: |
81 |
| - - Runtime: provided.al2 (Swift) |
82 |
| - - Memory: 512MB |
83 |
| - - Timeout: 60 seconds |
84 |
| - - VPC integration with public subnets |
85 |
| - |
86 |
| -2. **RDS PostgreSQL**: |
87 |
| - - Instance class: db.t3.micro |
88 |
| - - Engine version: 15.7 |
89 |
| - - Storage: 20GB gp2 |
90 |
| - - Placed in private subnets |
91 |
| - - Not publicly accessible |
92 |
| - |
93 |
| -### Access & Management |
94 |
| - |
95 |
| -1. **Secrets Manager**: |
96 |
| - - Stores database credentials |
97 |
| - - Auto-generates secure password |
98 |
| - - Referenced by Lambda and RDS |
99 |
| - |
100 |
| -2. **VPC Endpoints**: |
101 |
| - - SSM Endpoint |
102 |
| - - SSM Messages Endpoint |
103 |
| - - EC2 Messages Endpoint |
104 |
| - - Enables CloudShell access to private resources |
105 |
| - |
106 |
| -3. **Function URL**: |
107 |
| - - HTTP endpoint for invoking Lambda function |
| 1 | +# Infrastructure Architecture |
| 2 | + |
| 3 | +This document describes the AWS infrastructure deployed by the ServiceLifecycle example's SAM template. |
| 4 | + |
| 5 | +## Overview |
| 6 | + |
| 7 | +The infrastructure consists of a secure VPC setup with public and private subnets, a PostgreSQL RDS instance in private subnets, and a Lambda function with VPC access. The architecture follows AWS best practices for security and network isolation. |
| 8 | + |
| 9 | +## Network Architecture |
| 10 | + |
| 11 | +### VPC Configuration |
| 12 | +- **VPC**: Custom VPC with CIDR block `10.0.0.0/16` |
| 13 | +- **DNS Support**: DNS hostnames and DNS resolution enabled |
| 14 | + |
| 15 | +### Subnet Layout |
| 16 | +- **Public Subnets**: |
| 17 | + - Public Subnet 1: `10.0.1.0/24` (AZ 1) |
| 18 | + - Public Subnet 2: `10.0.2.0/24` (AZ 2) |
| 19 | + - Used for Lambda functions and NAT Gateway |
| 20 | + - Auto-assign public IP addresses enabled |
| 21 | + |
| 22 | +- **Private Subnets**: |
| 23 | + - Private Subnet 1: `10.0.3.0/24` (AZ 1) |
| 24 | + - Private Subnet 2: `10.0.4.0/24` (AZ 2) |
| 25 | + - Used for RDS PostgreSQL database |
| 26 | + - No public IP addresses assigned |
| 27 | + |
| 28 | +### Network Components |
| 29 | +- **Internet Gateway**: Provides internet access for public subnets |
| 30 | +- **NAT Gateway**: Deployed in Public Subnet 1, allows private subnets to access the internet |
| 31 | +- **Route Tables**: |
| 32 | + - Public Route Table: Routes traffic to the Internet Gateway |
| 33 | + - Private Route Table: Routes traffic through the NAT Gateway |
| 34 | + |
| 35 | +## Security Groups |
| 36 | + |
| 37 | +### Lambda Security Group |
| 38 | +- **Outbound Rules**: |
| 39 | + - PostgreSQL (5432): Restricted to VPC CIDR `10.0.0.0/16` |
| 40 | + - HTTPS (443): Open to `0.0.0.0/0` for AWS service access |
| 41 | + |
| 42 | +### Database Security Group |
| 43 | +- **Inbound Rules**: |
| 44 | + - PostgreSQL (5432): Only allows connections from the Lambda Security Group |
| 45 | + |
| 46 | +## Database Configuration |
| 47 | + |
| 48 | +### PostgreSQL RDS Instance |
| 49 | +- **Instance Type**: `db.t3.micro` (cost-optimized) |
| 50 | +- **Engine**: PostgreSQL 15.7 |
| 51 | +- **Storage**: 20GB GP2 (SSD) |
| 52 | +- **Network**: Deployed in private subnets with no public access |
| 53 | +- **Security**: |
| 54 | + - Storage encryption enabled |
| 55 | + - SSL/TLS connections supported |
| 56 | + - Credentials stored in AWS Secrets Manager |
| 57 | +- **High Availability**: Multi-AZ disabled (development configuration) |
| 58 | +- **Backup**: Automated backups disabled (development configuration) |
| 59 | + |
| 60 | +### Database Subnet Group |
| 61 | +- Spans both private subnets for availability |
| 62 | + |
| 63 | +## Lambda Function Configuration |
| 64 | + |
| 65 | +### Service Lifecycle Lambda |
| 66 | +- **Runtime**: Custom runtime (provided.al2) |
| 67 | +- **Architecture**: ARM64 |
| 68 | +- **Memory**: 512MB |
| 69 | +- **Timeout**: 60 seconds |
| 70 | +- **Network**: Deployed in public subnets with access to both internet and private resources |
| 71 | +- **Environment Variables**: |
| 72 | + - `LOG_LEVEL`: trace |
| 73 | + - `DB_HOST`: RDS endpoint address |
| 74 | + - `DB_USER`: Retrieved from Secrets Manager |
| 75 | + - `DB_PASSWORD`: Retrieved from Secrets Manager |
| 76 | + - `DB_NAME`: Database name from parameter |
| 77 | + |
| 78 | +## API Gateway |
| 79 | + |
| 80 | +- **Type**: HTTP API |
| 81 | +- **Integration**: Direct Lambda integration |
| 82 | +- **Authentication**: None (for demonstration purposes) |
| 83 | + |
| 84 | +## Secrets Management |
| 85 | + |
| 86 | +### Database Credentials |
| 87 | +- **Storage**: AWS Secrets Manager |
| 88 | +- **Secret Name**: `{StackName}-db-credentials` |
| 89 | +- **Content**: |
| 90 | + - Username: "postgres" |
| 91 | + - Password: Auto-generated 16-character password |
| 92 | + - Special characters excluded: `"@/\` |
| 93 | + |
| 94 | +## SAM Outputs |
| 95 | + |
| 96 | +The template provides several outputs to facilitate working with the deployed resources: |
| 97 | + |
| 98 | +- **APIGatewayEndpoint**: URL to invoke the Lambda function |
| 99 | +- **DatabaseEndpoint**: Hostname for the PostgreSQL instance |
| 100 | +- **DatabasePort**: Port number for PostgreSQL (5432) |
| 101 | +- **DatabaseName**: Name of the created database |
| 102 | +- **DatabaseSecretArn**: ARN of the secret containing credentials |
| 103 | +- **DatabaseConnectionInstructions**: Instructions for retrieving connection details |
| 104 | +- **ConnectionDetails**: Consolidated connection information |
108 | 105 |
|
109 | 106 | ## Security Considerations
|
110 | 107 |
|
111 |
| -1. **Network Isolation**: Database is in private subnets, not directly accessible from the internet |
112 |
| -2. **Least Privilege**: Security groups follow principle of least privilege |
113 |
| -3. **Encryption**: Data at rest is encrypted |
114 |
| -4. **Secure Credentials**: No hardcoded credentials, using Secrets Manager |
115 |
| -5. **SSL/TLS**: Database connections use SSL/TLS with certificate verification |
| 108 | +This infrastructure implements several security best practices: |
116 | 109 |
|
117 |
| -## Accessing the Database |
118 |
| - |
119 |
| -The database is in a private subnet and not directly accessible from the internet. To connect: |
120 |
| - |
121 |
| -1. **From Lambda**: Direct connection through VPC networking |
122 |
| -2. **From Amazon EC2**: Through SSM VPC endpoints |
123 |
| -3. **From your local machine**: Options include: |
124 |
| - - SSH tunnel through a bastion host |
125 |
| - - AWS Session Manager port forwarding |
126 |
| - - AWS Cloud9 environment in the same VPC |
127 |
| - |
128 |
| -## Deployment |
129 |
| - |
130 |
| -Deploy this infrastructure using AWS SAM: |
131 |
| - |
132 |
| -```bash |
133 |
| -sam deploy |
134 |
| -``` |
135 |
| - |
136 |
| -## Outputs |
137 |
| - |
138 |
| -After deployment, the following information is available in CloudFormation outputs: |
139 |
| - |
140 |
| -- API Gateway endpoint URL |
141 |
| -- Database endpoint hostname and port |
142 |
| -- Database name |
143 |
| -- Secret ARN for retrieving credentials |
144 |
| -- Connection instructions |
| 110 | +1. **Network Isolation**: Database is placed in private subnets with no direct internet access |
| 111 | +2. **Least Privilege**: Security groups restrict traffic to only necessary ports and sources |
| 112 | +3. **Encryption**: Database storage is encrypted at rest |
| 113 | +4. **Secure Credentials**: Database credentials are managed through AWS Secrets Manager |
| 114 | +5. **Secure Communication**: Lambda function connects to database over encrypted connections |
145 | 115 |
|
146 | 116 | ## Cost Optimization
|
147 | 117 |
|
148 |
| -The template uses cost-effective resources: |
149 |
| -- db.t3.micro RDS instance (eligible for free tier) |
| 118 | +The template uses cost-effective resources suitable for development: |
| 119 | + |
| 120 | +- `db.t3.micro` instance (eligible for free tier) |
150 | 121 | - Minimal storage allocation (20GB)
|
151 |
| -- Single-AZ deployment |
| 122 | +- No Multi-AZ deployment |
152 | 123 | - No automated backups
|
153 | 124 |
|
154 | 125 | For production workloads, consider adjusting these settings based on your requirements.
|
0 commit comments