DevOps

CloudWatch PutMetricData AccessDenied: Monitoring-Berechtigungslücken beheben

2026-05-24 · 8 Min. Lesezeit

Ihr Monitoring ist gerade verstummt. Das Dashboard für Custom Metrics ist leer, die Alarme feuern nicht, und irgendwo in Ihren Anwendungslogs finden Sie dies:

An error occurred (AccessDenied) when calling the PutMetricData operation:
User: arn:aws:sts::123456789012:assumed-role/my-app-role/i-0abc123def456
is not authorized to perform: cloudwatch:PutMetricData on resource: *

Oder aus einer Lambda-Funktion:

[ERROR] ClientError: An error occurred (AccessDenied) when calling the
PutLogEvents operation: User: arn:aws:sts::123456789012:assumed-role/
my-lambda-role/my-function is not authorized to perform:
logs:PutLogEvents on resource: arn:aws:logs:us-east-1:123456789012:
log-group:/aws/lambda/my-function:log-stream:2026/05/24/[$LATEST]abc123

Wenn CloudWatch Ihre Metriken oder Logs ablehnt, wird Ihr gesamter Observability-Stack blind. Sie können keine Ausfälle erkennen, keine Performance-Probleme untersuchen, und Ihre Alarme hören auf zu funktionieren. Ich habe erlebt, wie dies dazu führte, dass Produktions-Incidents stundenlang länger dauerten als nötig, weil das Team keine Metriken hatte, um das ursprüngliche Problem zu diagnostizieren.

So beheben Sie systematisch jede CloudWatch-Berechtigungslücke.

Schritt 1: Identifizieren, was abgelehnt wird

Die Fehlermeldung verrät drei Dinge: den aufrufenden Principal, die verweigerte Aktion und die Ziel-Ressource. Analysieren Sie diese sorgfältig, denn jeder Punkt deutet auf eine andere Lösung hin.

Bestätigen Sie zunächst die aufrufende Identität:

aws sts get-caller-identity
{
    "UserId": "AROAEXAMPLEID:i-0abc123def456",
    "Account": "123456789012",
    "Arn": "arn:aws:sts::123456789012:assumed-role/my-app-role/i-0abc123def456"
}

Prüfen Sie dann, welche Policies an diese Rolle angehängt sind:

aws iam list-attached-role-policies --role-name my-app-role
aws iam list-role-policies --role-name my-app-role

Inspizieren Sie jede Policy, um die CloudWatch-Berechtigungen zu finden:

# Für verwaltete Policies
aws iam get-policy-version \
  --policy-arn arn:aws:iam::123456789012:policy/my-monitoring-policy \
  --version-id v1 \
  --query 'PolicyVersion.Document'
# Für Inline-Policies
aws iam get-role-policy \
  --role-name my-app-role \
  --policy-name MonitoringPermissions

Ursache 1: Fehlende cloudwatch:PutMetricData-Berechtigung

Die naheliegendste Ursache. Die IAM-Rolle hat cloudwatch:PutMetricData in keiner ihrer Policies. Dies passiert, wenn eine Rolle für einen bestimmten Zweck erstellt wurde und Monitoring später hinzugefügt wurde, ohne die Berechtigungen zu aktualisieren.

Die Mindest-Policy für das Veröffentlichen von Custom Metrics:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudwatch:PutMetricData"
      ],
      "Resource": "*"
    }
  ]
}

Beachten Sie, dass cloudwatch:PutMetricData keine Berechtigungen auf Ressourcenebene unterstützt — die Resource muss "*" sein. Sie können jedoch einschränken, in welche Namespaces eine Rolle publizieren darf, indem Sie den cloudwatch:namespace-Condition-Key verwenden:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudwatch:PutMetricData"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "cloudwatch:namespace": "MyApp/Production"
        }
      }
    }
  ]
}

Dies ist tatsächlich eine Best Practice — es verhindert, dass eine Rolle versehentlich Metriken in den falschen Namespace publiziert oder Metriken einer anderen Anwendung überschreibt.

Ursache 2: Namespace-Einschränkung stimmt nicht überein

Wenn Ihre Policy die cloudwatch:namespace-Bedingung verwendet, muss der Namespace in Ihrem PutMetricData-Aufruf exakt übereinstimmen. Dies ist case-sensitive.

Testen Sie mit der CLI:

aws cloudwatch put-metric-data \
  --namespace "MyApp/Production" \
  --metric-name "RequestCount" \
  --value 1 \
  --unit Count

Wenn die Policy MyApp/Production erlaubt, aber Ihre Anwendung Metriken an myapp/production sendet, wird der Aufruf abgelehnt. Überprüfen Sie den exakten Namespace-String in Ihrem Anwendungscode.

Eine häufige Variante dieses Problems tritt auf, wenn Teams umgebungsbasierte Namespaces wie MyApp/Staging und MyApp/Production verwenden, die IAM-Policy aber nur einen davon erlaubt. Verwenden Sie eine Wildcard-Bedingung für Flexibilität:

{
  "Condition": {
    "StringLike": {
      "cloudwatch:namespace": "MyApp/*"
    }
  }
}

Ursache 3: CloudWatch-Logs-Berechtigungen fehlen

CloudWatch Logs verwendet einen vollständig separaten Satz von IAM-Aktionen im Vergleich zu CloudWatch Metrics. Wenn Ihre Anwendung sowohl Metriken als auch Logs schreibt, benötigen Sie beide Berechtigungssätze.

Der vollständige Satz an CloudWatch-Logs-Berechtigungen für eine Anwendung:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Resource": [
        "arn:aws:logs:us-east-1:123456789012:log-group:/myapp/*",
        "arn:aws:logs:us-east-1:123456789012:log-group:/myapp/*:log-stream:*"
      ]
    }
  ]
}

Anders als PutMetricData unterstützen CloudWatch-Logs-Aktionen Berechtigungen auf Ressourcenebene. Sie können den Zugriff auf bestimmte Log-Gruppen per ARN-Muster einschränken. Die Ressource muss sowohl Log-Group- als auch Log-Stream-ARNs enthalten.

Ein häufiger Fehler ist, den Log-Group-ARN einzuschließen, aber den Log-Stream-ARN zu vergessen:

"Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/myapp/*"

Dies erlaubt CreateLogGroup und DescribeLogGroups, aber verweigert PutLogEvents, da diese Aktion auf einen Log Stream abzielt, nicht auf eine Log Group. Sie benötigen das *:log-stream:*-Suffix.

Ursache 4: Lambda-Ausführungsrolle ohne CloudWatch-Berechtigungen

Lambda-Funktionen erhalten automatisch CloudWatch-Logs-Berechtigungen durch die verwaltete Policy AWSLambdaBasicExecutionRole. Aber wenn Ihre Funktion Custom Metrics publiziert, benötigen Sie zusätzliche Berechtigungen.

Prüfen Sie, was Ihre Lambda-Rolle hat:

aws lambda get-function-configuration \
  --function-name my-function \
  --query 'Role'
aws iam list-attached-role-policies \
  --role-name my-lambda-role

Wenn Sie AWSLambdaBasicExecutionRole sehen, aber nicht CloudWatchFullAccess oder eine benutzerdefinierte Policy, kann die Funktion Logs schreiben, aber keine Metriken.

Die AWSLambdaBasicExecutionRole enthält nur:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "*"
    }
  ]
}

Um Custom-Metric-Berechtigungen hinzuzufügen, fügen Sie eine zusätzliche Policy an:

aws iam put-role-policy \
  --role-name my-lambda-role \
  --policy-name CloudWatchMetrics \
  --policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "cloudwatch:PutMetricData",
          "cloudwatch:GetMetricData",
          "cloudwatch:ListMetrics"
        ],
        "Resource": "*"
      }
    ]
  }'

Ursache 5: EC2-Instance-Profil ohne Monitoring-Berechtigungen

EC2-Instanzen verwenden Instance Profiles für den Zugriff auf AWS-Services. Wenn der CloudWatch Agent installiert ist, aber das Instance Profile die richtigen Berechtigungen nicht hat, scheitern Metriken und Logs stillschweigend oder mit AccessDenied-Fehlern im Agent-Log.

Instance Profile prüfen:

# Instance Profile von der Instanz abrufen
aws ec2 describe-instances \
  --instance-ids i-0abc123def456 \
  --query 'Reservations[0].Instances[0].IamInstanceProfile.Arn'
# Rollen im Instance Profile auflisten
aws iam get-instance-profile \
  --instance-profile-name my-instance-profile \
  --query 'InstanceProfile.Roles[*].RoleName'

Der CloudWatch Agent benötigt diese Mindest-Policy:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudwatch:PutMetricData",
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams",
        "ec2:DescribeTags",
        "ec2:DescribeVolumes",
        "ec2:DescribeInstances",
        "ssm:GetParameter"
      ],
      "Resource": "*"
    }
  ]
}

AWS bietet die verwaltete Policy CloudWatchAgentServerPolicy für diesen Zweck:

aws iam attach-role-policy \
  --role-name my-ec2-role \
  --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

Prüfen Sie das CloudWatch-Agent-Log auf spezifische Fehler:

# Auf Amazon Linux / RHEL
cat /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log | grep -i "error\|denied\|unauthorized"

Ursache 6: VPC-Endpoints für CloudWatch fehlen

Wenn Ihre Anwendung in einem privaten Subnetz ohne Internetzugang läuft, benötigt sie VPC-Endpoints, um CloudWatch und CloudWatch Logs zu erreichen. Ohne diese Endpoints laufen API-Aufrufe in einen Timeout, anstatt AccessDenied zurückzugeben — aber das Symptom sieht gleich aus: fehlende Metriken.

Vorhandene VPC-Endpoints prüfen:

aws ec2 describe-vpc-endpoints \
  --filters "Name=vpc-id,Values=vpc-abc123" \
  --query 'VpcEndpoints[*].{
    ServiceName: ServiceName,
    State: State,
    VpcEndpointType: VpcEndpointType
  }'

Sie benötigen Endpoints für beide Services:

# CloudWatch-Metrics-Endpoint
aws ec2 create-vpc-endpoint \
  --vpc-id vpc-abc123 \
  --service-name com.amazonaws.us-east-1.monitoring \
  --vpc-endpoint-type Interface \
  --subnet-ids subnet-abc123 subnet-def456 \
  --security-group-ids sg-abc123

# CloudWatch-Logs-Endpoint
aws ec2 create-vpc-endpoint \
  --vpc-id vpc-abc123 \
  --service-name com.amazonaws.us-east-1.logs \
  --vpc-endpoint-type Interface \
  --subnet-ids subnet-abc123 subnet-def456 \
  --security-group-ids sg-abc123

Die Security Group am VPC-Endpoint muss eingehende HTTPS-Verbindungen (Port 443) von der Security Group Ihrer Anwendung erlauben.

Ursache 7: Cross-Account-Observability nicht konfiguriert

Wenn Sie Metriken von einem Konto an ein zentrales Monitoring-Konto senden möchten, benötigen Sie CloudWatch Cross-Account Observability. Ohne diese Konfiguration schlagen PutMetricData-Aufrufe an den Namespace eines anderen Kontos fehl.

Richten Sie das Monitoring-Konto als Sink ein:

# Im Monitoring-Konto
aws oam create-sink \
  --name central-monitoring \
  --tags Key=Environment,Value=Production

Dann verknüpfen Sie Quellkonten:

# In jedem Quellkonto
aws oam create-link \
  --label-template '$AccountName' \
  --resource-types "AWS::CloudWatch::Metric" "AWS::Logs::LogGroup" \
  --sink-identifier arn:aws:oam:us-east-1:999999999999:sink/sink-id

Ursache 8: Ressourcenbasierte Policy auf Log-Gruppen

CloudWatch Logs unterstützt ressourcenbasierte Policies auf Log-Gruppen. Wenn eine Log-Gruppe eine restriktive Policy hat, kann selbst eine Rolle mit korrekten IAM-Berechtigungen abgelehnt werden.

Ressourcen-Policy prüfen:

aws logs describe-resource-policies
# Eine bestimmte Log-Gruppe auf Subscription Filter und Policies prüfen
aws logs describe-log-groups \
  --log-group-name-prefix "/myapp/" \
  --query 'logGroups[*].{
    logGroupName: logGroupName,
    retentionInDays: retentionInDays,
    kmsKeyId: kmsKeyId
  }'

Wenn die Log-Gruppe mit einem KMS-Schlüssel verschlüsselt ist, benötigt die schreibende Rolle zusätzlich kms:GenerateDataKey- und kms:Decrypt-Berechtigungen auf diesem Schlüssel.

Prävention und Best Practices

Verwenden Sie die verwalteten AWS-Policies als Ausgangspunkt. CloudWatchAgentServerPolicy für EC2, AWSLambdaBasicExecutionRole für Lambda, dann fügen Sie Custom-Metric-Berechtigungen nach Bedarf hinzu.

Testen Sie die Metrik-Publikation zuerst über die CLI. Bevor Sie Anwendungsänderungen deployen, verifizieren Sie von derselben Rolle aus:

aws cloudwatch put-metric-data \
  --namespace "MyApp/Production" \
  --metric-name "TestMetric" \
  --value 1 \
  --unit Count

Wenn dies erfolgreich ist, sind die IAM-Berechtigungen korrekt und Anwendungsfehler liegen im Code.

Konfigurieren Sie den CloudWatch Agent zentral über den AWS Systems Manager Parameter Store:

aws ssm put-parameter \
  --name "/cloudwatch-agent/config" \
  --type String \
  --value file://cloudwatch-agent-config.json

Überwachen Sie Ihr Monitoring. Erstellen Sie einen CloudWatch-Alarm auf die Heartbeat-Metrik des CloudWatch Agents. Wenn der Agent aufhört zu publizieren, werden Sie benachrichtigt, bevor Ihre Dashboards leer werden.

Verwenden Sie Namespace-Konventionen konsistent. Standardisieren Sie auf ein Format wie Firma/Anwendung/Umgebung, damit IAM-Condition-Policies vorhersehbar und wartbar sind.

Überprüfen Sie Berechtigungen vierteljährlich. IAM Access Analyzer kann Rollen identifizieren, die CloudWatch-Berechtigungen haben, die sie nicht mehr benötigen, und Rollen, denen erforderliche Berechtigungen fehlen.

Wann Sie Hilfe holen sollten

CloudWatch-Berechtigungsprobleme, die nach Überprüfung aller oben genannten Punkte bestehen bleiben, beinhalten oft komplexe Interaktionen zwischen SCPs, Permission Boundaries, VPC-Netzwerk und Cross-Account-Konfigurationen. Wenn Ihr Monitoring ausfällt, ist Ihre Fähigkeit, andere Probleme zu erkennen und zu diagnostizieren, beeinträchtigt — es lohnt sich, dies schnell zu beheben. Wir helfen Teams beim Aufbau zuverlässiger Observability-Stacks auf AWS. Wenn Ihr Monitoring Lücken hat oder Sie Hilfe beim Design einer Cross-Account-CloudWatch-Architektur benötigen, kontaktieren Sie uns für eine kostenlose Beratung. Wir prüfen Ihre Monitoring-Berechtigungen und stellen sicher, dass nichts durchs Raster fällt.

Brauchen Sie Hilfe mit Ihrer AWS-Infrastruktur?

Buchen Sie ein kostenloses 30-Minuten-Gespräch.