AWS Cost Optimalisatie: FinOps Best Practices 2025
Transformeer je AWS uitgaven met bewezen FinOps strategieën die bedrijfswaarde creëren
Introductie
Naarmate cloud adoptie versnelt, wordt het effectief beheren van AWS kosten cruciaal voor zakelijk succes. FinOps (Financial Operations) biedt een raamwerk voor het maximaliseren van cloud waarde terwijl uitgaven worden geoptimaliseerd. Deze gids behandelt de essentiële FinOps praktijken voor AWS in 2025, specifiek afgestemd op de Nederlandse en EU markt.
De Drie Pijlers van FinOps
1. Zichtbaarheid & Toewijzing
Kostenzichtbaarheid:
- Implementeer uitgebreide tagging strategie
- Gebruik AWS Cost Explorer voor trendanalyse
- Schakel Cost and Usage Reports (CUR) in
- Deploy cost anomaly detection
Voorbeeld Tagging Strategie:
{
"CostCenter": "Engineering",
"Project": "WebApp",
"Environment": "Productie",
"Owner": "team@bedrijf.nl",
"Application": "KlantPortaal",
"BTW": "Hoog"
}
Geautomatiseerde Tagging met CDK:
import * as cdk from 'aws-cdk-lib';
const app = new cdk.App();
// Pas tags toe op stack niveau
cdk.Tags.of(app).add('CostCenter', 'Engineering');
cdk.Tags.of(app).add('ManagedBy', 'CDK');
cdk.Tags.of(app).add('Valuta', 'EUR');
2. Optimalisatie
Compute Optimalisatie:
- Rightsizing: Analyseer CloudWatch metrics om instance types af te stemmen op workload
- Savings Plans: Commit aan consistent gebruik voor tot 72% besparing
- Spot Instances: Gebruik voor fault-tolerant workloads (tot 90% besparing)
- Auto Scaling: Schaal gebaseerd op daadwerkelijke vraag
Storage Optimalisatie:
- S3 Intelligent-Tiering: Automatische kostenoptimalisatie
- EBS snapshots: Verwijder ongebruikte snapshots
- Lifecycle policies: Verplaats oude data naar goedkopere tiers
Voorbeeld S3 Lifecycle Policy:
import * as s3 from 'aws-cdk-lib/aws-s3';
new s3.Bucket(this, 'DataBucket', {
lifecycleRules: [
{
transitions: [
{
storageClass: s3.StorageClass.INFREQUENT_ACCESS,
transitionAfter: cdk.Duration.days(30),
},
{
storageClass: s3.StorageClass.GLACIER,
transitionAfter: cdk.Duration.days(90),
},
],
expiration: cdk.Duration.days(365),
},
],
});
3. Operatie & Cultuur
FinOps Cultuur:
- Cross-functionele samenwerking (Finance, Engineering, Directie)
- Regelmatige kostenreviews en optimalisatiecycli
- Kostenbewustzijn in ontwikkelproces
- Gedeelde verantwoordelijkheid voor cloud kosten
Automatisering:
# Geautomatiseerde resource cleanup
import boto3
from datetime import datetime, timedelta
ec2 = boto3.client('ec2', region_name='eu-west-1')
# Vind ongebruikte EBS volumes
volumes = ec2.describe_volumes(
Filters=[{'Name': 'status', 'Values': ['available']}]
)
for volume in volumes['Volumes']:
if volume['CreateTime'] < datetime.now(tz=volume['CreateTime'].tzinfo) - timedelta(days=30):
print(f"Verwijder ongebruikt volume: {volume['VolumeId']}")
ec2.delete_volume(VolumeId=volume['VolumeId'])
AWS FinOps Best Practices voor 2025
1. Implementeer Cost Anomaly Detection
AWS Cost Anomaly Detection gebruikt machine learning om ongebruikelijke uitgavenpatronen te identificeren:
# Schakel in via CLI
aws ce create-anomaly-monitor \
--anomaly-monitor Name=ProductieMonitor,MonitorType=DIMENSIONAL \
--cost-anomaly-detection-monitor-dimension-value LINKED_ACCOUNT
aws ce create-anomaly-subscription \
--anomaly-subscription Name=ProductieAlerts \
--monitor-arn arn:aws:ce::123456789012:anomalymonitor/abc123 \
--subscribers Type=EMAIL,Address=finops@bedrijf.nl \
--threshold-expression '{"Dimensions": {"Key": "ANOMALY_TOTAL_IMPACT_ABSOLUTE","Values": ["100"]}}'
2. Benut Graviton Processors
AWS Graviton3 biedt tot 40% betere prijs-prestatieverhouding:
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as ecs from 'aws-cdk-lib/aws-ecs';
// Gebruik Graviton-gebaseerde instances
const taskDefinition = new ecs.FargateTaskDefinition(this, 'Task', {
cpu: 1024,
memoryLimitMiB: 2048,
runtimePlatform: {
cpuArchitecture: ecs.CpuArchitecture.ARM64,
operatingSystemFamily: ecs.OperatingSystemFamily.LINUX,
},
});
3. Optimaliseer Data Transfer Kosten
Data transfer wordt vaak over het hoofd gezien maar kan aanzienlijk zijn:
Best Practices:
- Gebruik CloudFront voor content delivery (vermindert data transfer kosten)
- Houd data in dezelfde regio wanneer mogelijk
- Gebruik VPC endpoints om NAT Gateway kosten te vermijden
- Schakel S3 Transfer Acceleration alleen in wanneer nodig
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const vpc = new ec2.Vpc(this, 'VPC');
// Voeg S3 VPC Endpoint toe om NAT kosten te vermijden
vpc.addGatewayEndpoint('S3Endpoint', {
service: ec2.GatewayVpcEndpointAwsService.S3,
});
4. Implementeer Reserved Instance & Savings Plans Strategie
Commitment Strategie:
- Analyseer 30-dagen gebruikspatronen
- Begin met Compute Savings Plans (meest flexibel)
- Voeg EC2 Instance Savings Plans toe voor stabiele workloads
- Reserveer 70-80% van baseline gebruik
- Gebruik Spot/On-Demand voor variabele belasting
Geautomatiseerde Aanbevelingen:
import boto3
ce = boto3.client('ce', region_name='eu-west-1')
# Haal Savings Plans aanbevelingen op
recommendations = ce.get_savings_plans_purchase_recommendation(
SavingsPlansType='COMPUTE_SP',
TermInYears='ONE_YEAR',
PaymentOption='NO_UPFRONT',
LookbackPeriodInDays='THIRTY_DAYS'
)
for rec in recommendations['SavingsPlansPurchaseRecommendation']['SavingsPlansPurchaseRecommendationDetails']:
print(f"Uurlijkse Commitment: €{rec['HourlyCommitmentToPurchase']}")
print(f"Geschatte Besparing: €{rec['EstimatedMonthlySavingsAmount']}")
5. Database Kostenoptimalisatie
RDS Optimalisatie:
- Gebruik Aurora Serverless v2 voor variabele workloads
- Schakel RDS storage autoscaling in
- Gebruik read replicas strategisch
- Overweeg Graviton-gebaseerde instances
import * as rds from 'aws-cdk-lib/aws-rds';
const cluster = new rds.ServerlessCluster(this, 'Database', {
engine: rds.DatabaseClusterEngine.AURORA_POSTGRESQL,
scaling: {
minCapacity: rds.AuroraCapacityUnit.ACU_2,
maxCapacity: rds.AuroraCapacityUnit.ACU_16,
autoPause: cdk.Duration.minutes(10),
},
});
6. Container Kostenoptimalisatie
ECS/EKS Best Practices:
- Gebruik Fargate Spot voor fault-tolerant taken (70% besparing)
- Implementeer pod rightsizing met VPA (Vertical Pod Autoscaler)
- Gebruik Karpenter voor node provisioning (EKS)
- Schakel ECS container insights selectief in
Fargate Spot Voorbeeld:
import * as ecs from 'aws-cdk-lib/aws-ecs';
const service = new ecs.FargateService(this, 'Service', {
cluster,
taskDefinition,
capacityProviderStrategies: [
{
capacityProvider: 'FARGATE_SPOT',
weight: 2,
},
{
capacityProvider: 'FARGATE',
weight: 1,
base: 1,
},
],
});
Geavanceerde FinOps Strategieën
1. Multi-Account Kostentoewijzing
# Consolidated billing analyse
import boto3
import pandas as pd
ce = boto3.client('ce', region_name='eu-west-1')
response = ce.get_cost_and_usage(
TimePeriod={
'Start': '2025-01-01',
'End': '2025-01-31'
},
Granularity='MONTHLY',
Metrics=['UnblendedCost'],
GroupBy=[
{'Type': 'DIMENSION', 'Key': 'LINKED_ACCOUNT'},
{'Type': 'TAG', 'Key': 'CostCenter'}
]
)
# Converteer naar DataFrame voor analyse
df = pd.DataFrame(response['ResultsByTime'])
2. Geautomatiseerde Resource Scheduling
# Lambda functie voor EC2 scheduling
import boto3
import os
ec2 = boto3.client('ec2', region_name='eu-west-1')
def lambda_handler(event, context):
action = os.environ['ACTION'] # 'stop' of 'start'
# Haal instances op met Auto-Stop tag
instances = ec2.describe_instances(
Filters=[
{'Name': 'tag:AutoStop', 'Values': ['true']},
{'Name': 'instance-state-name', 'Values': ['running' if action == 'stop' else 'stopped']}
]
)
instance_ids = [
instance['InstanceId']
for reservation in instances['Reservations']
for instance in reservation['Instances']
]
if instance_ids:
if action == 'stop':
ec2.stop_instances(InstanceIds=instance_ids)
else:
ec2.start_instances(InstanceIds=instance_ids)
return {'statusCode': 200, 'body': f'{len(instance_ids)} instances ge{action}t'}
3. Kostentoewijzing Rapporten met QuickSight
Zet geautomatiseerde dashboards op:
- Schakel Cost and Usage Reports (CUR) in
- Configureer S3 bucket voor CUR levering
- Creëer Athena database vanuit CUR
- Bouw QuickSight dashboards voor stakeholders
FinOps KPI’s om te Volgen
Essentiële Metrics
- Unit Economics: Kosten per klant, per transactie
- Kosten per Omgeving: Productie vs Ontwikkeling uitgaven
- Waste Metrics: Ongebruikte resources, idle instances
- Commitment Coverage: % gedekt door Savings Plans/RIs
- Kosten Anomalieën: Ongebruikelijke uitgavenpatronen
- Rightsizing Mogelijkheden: Over-provisioned resources
Dashboard Voorbeeld
-- Athena query voor kosten per service
SELECT
line_item_product_code,
SUM(line_item_unblended_cost) as totale_kosten,
DATE_FORMAT(line_item_usage_start_date, '%Y-%m') as maand
FROM cur_database.cur_table
WHERE line_item_usage_start_date >= DATE '2025-01-01'
GROUP BY 1, 3
ORDER BY 2 DESC
Implementatie Roadmap
Maand 1: Fundament
- Implementeer tagging strategie
- Schakel Cost Explorer en CUR in
- Stel cost allocation tags op
- Creëer initiële dashboards
Maand 2: Quick Wins
- Verwijder ongebruikte resources
- Stop niet-productie resources na werktijd
- Schakel S3 Intelligent-Tiering in
- Ruim oude snapshots op
Maand 3: Optimalisatie
- Analyseer rightsizing aanbevelingen
- Koop Savings Plans voor baseline
- Implementeer geautomatiseerde scheduling
- Zet anomaly detection op
Maand 4: Cultuur & Automatisering
- Stel FinOps werkgroep op
- Creëer cost review cadans
- Implementeer geautomatiseerde optimalisatie
- Ontwikkel chargeback model
Nederlandse Markt Overwegingen
Voor Nederlandse bedrijven:
- EU Data Residency: Kies eu-west-1 (Ierland) of eu-central-1 (Frankfurt) voor lagere latency en compliance
- BTW/VAT Berekeningen: AWS factureert met 21% BTW voor Nederlandse bedrijven
- Euro-gebaseerde Rapportage: Configureer Cost Explorer voor EUR weergave
- Budget Cycli: Stem af op Nederlandse financiële planning (vaak kalenderjaar)
- Lokale Procurement Regels: Houd rekening met overheids aanbestedingsvoorschriften
BTW Optimalisatie Tips:
- Gebruik AWS Organizations voor gecentraliseerde facturering
- Bewaar facturen voor belastingaangifte (7 jaar bewaarplicht)
- Configureer cost allocation tags voor BTW-aftrek categorisering
- Werk samen met finance afdeling voor correcte boekhouding
Euro Kostenrapportage:
import boto3
ce = boto3.client('ce', region_name='eu-west-1')
# Haal kosten op in EUR
response = ce.get_cost_and_usage(
TimePeriod={
'Start': '2025-01-01',
'End': '2025-01-31'
},
Granularity='MONTHLY',
Metrics=['UnblendedCost'],
GroupBy=[
{'Type': 'DIMENSION', 'Key': 'SERVICE'}
]
)
# Kosten zijn automatisch in EUR voor NL accounts
for result in response['ResultsByTime']:
print(f"Periode: {result['TimePeriod']['Start']}")
for group in result['Groups']:
service = group['Keys'][0]
cost = group['Metrics']['UnblendedCost']['Amount']
print(f"{service}: €{float(cost):.2f}")
Conclusie
Effectieve FinOps gaat niet alleen over kostenreductie—het gaat om het maximaliseren van bedrijfswaarde uit cloud investeringen. Door deze best practices te implementeren, kun je:
- AWS uitgaven reduceren met 30-50%
- Kostenzichtbaarheid en verantwoordelijkheid verbeteren
- Snellere innovatie mogelijk maken met kostenvertrouwen
- Een cultuur van kostenbewustzijn opbouwen
Klaar om je AWS kosten te optimaliseren? Neem contact op met Forrict voor expert FinOps begeleiding afgestemd op Nederlandse organisaties.
Resources
- AWS Cost Management
- FinOps Foundation
- AWS Well-Architected Cost Optimization Pillar
- AWS Pricing Calculator
Fons Biemans
AWS expert en consultant bij Forrict, gespecialiseerd in cloud architectuur en AWS best practices voor Nederlandse bedrijven.

