Skip to main content

Grafana Application Guide

Grafana is an open-source platform for monitoring and observability that allows you to query, visualize, alert on, and understand your metrics.

Status: Available (Not Yet Tested)


Quick Reference

PropertyValue
Application IDgrafana
CategoryMonitoring
Default Imagegrafana/grafana:latest
Application Port3000
Default CPU512 (Fargate)
Default Memory1024 MB (Fargate)
Default Instancet3.micro (EC2)
Health Check Path/api/health
Health Check Grace300 seconds
Supports FargateYes
Supports EC2Yes
OIDC SupportYes (via generic_oauth)
Database RequiredOptional

Capabilities

  • Multi-source metrics visualization
  • Interactive dashboards
  • Alerting and notifications
  • Team and user management
  • Plugin ecosystem (panels, data sources)
  • Dashboard templating
  • Annotations and events
  • Explore mode for ad-hoc queries
  • Dashboard sharing and embedding
  • Built-in support for Prometheus, CloudWatch, InfluxDB, etc.

Optional Ports

Grafana does not have optional ports. All traffic flows through port 3000.


Database Configuration

Development

Uses SQLite (H2 embedded) - single instance only.

PropertyValue
EnginePostgreSQL 14+
Instance Classdb.t3.micro (default)
Storage20 GB (default)
Database Namegrafana

When using RDS, environment variables are set:

  • GF_DATABASE_TYPE: postgres
  • GF_DATABASE_HOST: RDS endpoint
  • GF_DATABASE_NAME: grafana
  • GF_DATABASE_USER: grafana
  • GF_DATABASE_PASSWORD: From Secrets Manager

Authentication

Supported Auth Modes

ModeStatusDescription
application-oidcAvailableNative OIDC via generic_oauth
alb-oidcAvailableALB-level authentication
noneAvailableLocal accounts only

OIDC Integration Details

Grafana uses generic_oauth provider configured via environment variables.

Features:

  • Auto-create users on first login
  • Group/role mapping from OIDC claims
  • Admin role assignment via group membership
  • PKCE support
  • Automatic user provisioning

Callback Path: /login/generic_oauth

Role Mapping:

  • Users in admin group → Grafana Admin role
  • Others → Grafana Editor role

Environment Variables

CloudForge automatically configures:

VariableDescriptionExample
GF_SERVER_ROOT_URLExternal URL (critical for OAuth)https://grafana.example.com
GF_SERVER_DOMAINDomain namegrafana.example.com
GF_SERVER_ENFORCE_DOMAINAllow ALB health checksfalse
GF_SERVER_PROTOCOLProtocol (ALB handles HTTPS)http
GF_DATABASE_TYPEDatabase typepostgres or sqlite3

OIDC Variables (when enabled):

VariableDescription
GF_AUTH_GENERIC_OAUTH_ENABLEDEnable OAuth
GF_AUTH_GENERIC_OAUTH_CLIENT_IDOAuth client ID
GF_AUTH_GENERIC_OAUTH_CLIENT_SECRETOAuth client secret
GF_AUTH_GENERIC_OAUTH_AUTH_URLAuthorization endpoint
GF_AUTH_GENERIC_OAUTH_TOKEN_URLToken endpoint
GF_AUTH_GENERIC_OAUTH_API_URLUserInfo endpoint

Storage Configuration

Container (Fargate)

PropertyValue
Data Path/var/lib/grafana
EFS Path/grafana
Volume NamegrafanaData
Container User472:472
EFS Permissions755

EC2

PropertyValue
EBS Device/dev/xvdh
Data Path/var/lib/grafana
Log Paths/var/log/grafana/grafana.log, /var/log/userdata.log

Deployment Context Examples

Development - Minimal Setup

{
"stackName": "Grafana-Dev",
"applicationId": "grafana",
"applicationName": "Grafana Dev",
"description": "Grafana development environment",
"environment": "development",

"runtime": "fargate",
"securityProfile": "dev",
"topology": "application-service",

"networkMode": "public-no-nat",
"region": "us-east-1",

"authMode": "none",

"cpu": 512,
"memory": 1024,

"enableMonitoring": true,
"logRetentionDays": "7"
}

Cost estimate: ~$25/month

Development - With OIDC

{
"stackName": "Grafana-Dev-Auth",
"applicationId": "grafana",
"applicationName": "Grafana Dev",
"description": "Grafana with Cognito authentication",
"environment": "development",

"runtime": "fargate",
"securityProfile": "dev",
"topology": "application-service",

"domain": "dev.example.com",
"subdomain": "grafana",
"enableSsl": true,

"networkMode": "private-with-nat",
"region": "us-east-1",

"authMode": "application-oidc",
"cognitoAutoProvision": true,
"cognitoDomainPrefix": "grafana-dev-yourcompany",
"cognitoCreateGroups": true,
"cognitoAdminGroupName": "GrafanaAdmins",
"cognitoUserGroupName": "GrafanaViewers",

"cpu": 512,
"memory": 1024,

"enableMonitoring": true,
"logRetentionDays": "30"
}

Cost estimate: ~$70/month

Production - With Database

{
"stackName": "Grafana-Production",
"applicationId": "grafana",
"applicationName": "Grafana",
"description": "Production Grafana with PostgreSQL",
"environment": "production",

"runtime": "ec2",
"securityProfile": "production",
"topology": "application-service",

"domain": "example.com",
"subdomain": "grafana",
"enableSsl": true,

"networkMode": "private-with-nat",
"region": "us-east-1",

"authMode": "application-oidc",
"cognitoAutoProvision": true,
"cognitoDomainPrefix": "grafana-prod-yourcompany",
"cognitoMfaEnabled": true,
"cognitoMfaMethod": "totp",
"cognitoCreateGroups": true,
"cognitoAdminGroupName": "GrafanaAdmins",
"cognitoUserGroupName": "GrafanaViewers",

"instanceType": "t3.small",
"minInstanceCapacity": 2,
"maxInstanceCapacity": 4,
"enableAutoScaling": true,

"provisionDatabase": true,
"databaseEngine": "postgres",
"databaseVersion": "15",
"databaseInstanceClass": "db.t3.micro",
"databaseAllocatedStorageGB": 20,
"databaseMultiAz": true,
"databaseName": "grafana",
"databaseBackupRetentionDays": 30,

"complianceFrameworks": "SOC2",
"scopeConfigRulesToDeployment": false,
"awsConfigEnabled": true,
"guardDutyEnabled": true,
"wafEnabled": true,
"albAccessLogging": true,
"enableFlowlogs": true,

"enableMonitoring": true,
"enableEncryption": true,
"logRetentionDays": "730",
"retainStorage": true
}

Cost estimate: ~$250/month

Observability Stack (with Prometheus)

Deploy Grafana alongside Prometheus for complete observability.

{
"stackName": "Grafana-Observability",
"applicationId": "grafana",
"applicationName": "Grafana Observability",
"description": "Grafana for observability stack",
"environment": "production",

"runtime": "fargate",
"securityProfile": "production",
"topology": "application-service",

"domain": "example.com",
"subdomain": "metrics",
"enableSsl": true,

"networkMode": "private-with-nat",
"region": "us-east-1",

"authMode": "alb-oidc",
"cognitoAutoProvision": true,
"cognitoDomainPrefix": "grafana-obs-yourcompany",
"cognitoMfaEnabled": true,

"cpu": 1024,
"memory": 2048,
"minInstanceCapacity": 2,
"maxInstanceCapacity": 4,

"provisionDatabase": true,
"databaseEngine": "postgres",
"databaseVersion": "15",
"databaseInstanceClass": "db.t3.small",
"databaseAllocatedStorageGB": 50,
"databaseMultiAz": true,

"complianceFrameworks": "SOC2",
"awsConfigEnabled": true,
"wafEnabled": true,

"enableMonitoring": true,
"enableEncryption": true,
"logRetentionDays": "365"
}

Cost estimate: ~$300/month


Health Check Configuration

PropertyDefaultDescription
Path/api/healthHealth check endpoint
Grace Period300 secondsTime before health checks start
Interval30 secondsTime between checks
Timeout5 secondsResponse timeout

Compliance Considerations

SOC2

Automatic Controls:

  • Encryption at rest
  • Encryption in transit (TLS)
  • Network isolation
  • CloudWatch logging

User Responsibilities:

  • Configure session timeouts
  • Disable anonymous access
  • Implement dashboard access controls
  • Enable audit logging (Grafana Enterprise)
  • Configure data source access controls

Post-Deployment Tasks

1. Initial Login

  1. Navigate to https://grafana.your-domain.com
  2. If OIDC: Click "Sign in with OAuth"
  3. If local: Default credentials admin / admin

2. Add Data Sources

  1. Configuration > Data Sources
  2. Click Add data source
  3. Select type (Prometheus, CloudWatch, etc.)
  4. Configure connection

Example Prometheus data source:

URL: http://prometheus:9090
Access: Server (default)

Example CloudWatch data source:

Authentication Provider: AWS SDK Default
Default Region: us-east-1

3. Import Dashboards

  1. Dashboards > Import
  2. Enter Grafana.com dashboard ID or upload JSON
  3. Select data source

Recommended dashboards:

  • AWS CloudWatch: 11541, 139
  • Prometheus: 1860 (Node Exporter)
  • Docker: 893

4. Configure Alerting

  1. Alerting > Contact points
  2. Add notification channels (Slack, Email, PagerDuty)
  3. Create alert rules on dashboards

Troubleshooting

Grafana won't start

Check logs:

# Fargate
aws logs tail /aws/ecs/grafana --follow

# EC2
ssh ec2-user@instance 'tail -f /var/log/grafana/grafana.log'

OIDC login fails

  1. Verify GF_SERVER_ROOT_URL matches actual URL
  2. Check Cognito callback URLs
  3. Verify OAuth client configuration

Dashboards not loading

  1. Check data source connectivity
  2. Verify IAM permissions for CloudWatch
  3. Check network security groups