This document outlines our environment configuration management strategy using AWS Systems Manager Parameter Store. The system is designed to manage Docker Compose environment variables across different deployment environments (DEV, BETA, PROD).
- AWS Systems Manager Parameter Store: Central configuration storage
- EC2 instances: Application hosting environment
- EKS: Configs and Secrets management
- IAM Roles: Access control for configurations
- Shell Scripts: Configuration deployment utilities
%%{init: {"theme": "redux", "look":"neo"} }%%
flowchart TD
subgraph AWS["AWS Services"]
direction LR
SSM["AWS SSM Parameter Store"]
IAM["IAM Roles & Policies"]
end
subgraph DEV["Development Environment (EC2)"]
D_Params["Dev Parameters"]
D_Script["generate"]
D_Env[".env"]
D_Docker["Docker Compose"]
D_App["Application"]
end
subgraph BETA["Beta Environment (EC2)"]
B_Params["Beta Parameters"]
B_Script["generate"]
B_Env[".env"]
B_Docker["Docker Compose"]
B_App["Application"]
end
subgraph EKS_Components["EKS Components"]
IRSA["IAM Role"]
SecretStore["External Secrets Operator"]
ConfigMap["ConfigMaps"]
K8S_Secret["Kubernetes Secrets"]
end
subgraph EKS_Deploy["Deployment"]
Pod1["Pod 1"]
Pod2["Pod 2"]
Pod3["Pod 3"]
end
subgraph EKS["Production Environment (EKS)"]
direction TB
EKS_Components
EKS_Deploy
end
SSM --> D_Params & B_Params & SecretStore
IRSA --> SecretStore
D_Params --> D_Script
D_Script --> D_Env
D_Env --> D_Docker
D_Docker --> D_App
B_Params --> B_Script
B_Script --> B_Env
B_Env --> B_Docker
B_Docker --> B_App
SecretStore --> K8S_Secret & ConfigMap
K8S_Secret --> Pod1 & Pod2 & Pod3
ConfigMap --> Pod1 & Pod2 & Pod3
SSM:::aws
IAM:::aws
D_Script:::script
D_Docker:::docker
D_App:::app
B_Script:::script
B_Docker:::docker
B_App:::app
SecretStore:::k8s
ConfigMap:::k8s
K8S_Secret:::k8s
Pod1:::k8s
Pod2:::k8s
Pod3:::k8s
classDef aws fill:#FF9900,stroke:#232F3E,stroke-width:2px,color:white
classDef env fill:#E8F6F3,stroke:#148F77,stroke-width:2px
classDef role fill:#D4EFDF,stroke:#27AE60,stroke-width:2px
classDef script fill:#E8DAEF,stroke:#8E44AD,stroke-width:2px
classDef docker fill:#D6EAF8,stroke:#2E86C1,stroke-width:2px
classDef app fill:#FCF3CF,stroke:#D4AC0D,stroke-width:2px
classDef eks fill:#F5EEF8,stroke:#8E44AD,stroke-width:2px
classDef k8s fill:#EBF5FB,stroke:#3498DB,stroke-width:2px
style EKS fill:#BBDEFB
style BETA fill:#E1BEE7
style DEV fill:#C8E6C9
Parameters are organized hierarchically in SSM Parameter Store using the following convention:
/[application]/[environment]/[parameter_name]
Example:
/myapp/dev/DB_HOST
/myapp/dev/DB_PORT
/myapp/beta/DB_HOST
/myapp/prod/DB_HOST
Common parameters across environments:
DATABASE_CONFIG
├── DB_HOST
├── DB_PORT
├── DB_NAME
├── DB_USER
└── DB_PASSWORD (SecureString)
APP_CONFIG
├── API_KEY (SecureString)
├── LOG_LEVEL
├── APP_PORT
└── DEBUG_MODE
- All parameters maintain version history in SSM
- Latest version is automatically used
- Version labels:
latest: Most recent versionstable: Last known working versionprevious: Prior version for rollback
- Always include change description when updating parameters
- Test parameter changes in DEV before promoting to higher environments
- Maintain at least 5 previous versions for rollback capability
- Document version changes in change log
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ssm:GetParameters",
"ssm:GetParametersByPath"
],
"Resource": [
"arn:aws:ssm:region:account:parameter/myapp/dev/*"
]
}
]
}- DEV environment: Full read/write access to /myapp/dev/*
- BETA environment: Read-only access to /myapp/beta/*
- PROD environment: Read-only access to /myapp/prod/*
Location: /opt/myapp/scripts/generate-env.sh
Purpose: Generates environment-specific .env file from SSM parameters
Usage: ./generate-env.sh <environment>
Example: ./generate-env.sh dev- CI/CD pipeline triggers deployment
- Generate-env script pulls parameters from SSM
- .env file is created in application directory
- Docker Compose uses .env file for environment variables
- Application containers are started
- Parameter retrieval validation
- Environment file syntax check
- Container environment variable verification
- Application health check
- Use SecureString for sensitive values
- Encrypt parameters using AWS KMS
- Regular rotation of sensitive parameters
- Audit parameter access through CloudTrail
- Principle of least privilege
- Environment isolation
- Regular access review
- MFA for parameter modifications
- Parameter changes in PROD
- Failed parameter access attempts
- Configuration retrieval failures
- Parameter version changes
- Access patterns
- Configuration updates
- Deployment events
- Daily parameter snapshot
- Cross-region replication for PROD
- Version history maintenance
- Regular recovery testing
- Identify last known good configuration
- Restore parameters from backup/previous version
- Verify parameter integrity
- Update application configuration
- Validate application functionality
- Create change request
- Test in lower environment
- Peer review required
- Schedule update window
- Apply changes
- Verify application stability
- Emergency change approval process
- Immediate rollback plan
- Post-change review
- Documentation update
- Use descriptive parameter names
- Include parameter descriptions
- Maintain parameter documentation
- Regular parameter review
- Clean up unused parameters
- Never hardcode environment values
- Use parameter hierarchies effectively
- Implement proper error handling
- Regular testing of configuration changes
-
Parameter access denied
- Verify IAM roles and permissions
- Check parameter path
- Validate AWS credentials
-
Missing parameters
- Verify parameter existence
- Check environment name
- Validate parameter path
-
Invalid configuration
- Verify parameter format
- Check environment file syntax
- Validate parameter values
External Secrets Operator (ESO), which syncs SSM params to K8S cluster.
For non-secure params, will use ConfigMaps and for secure params will use K8S secrets. @rox-dand fyi