AWS Bedrock AgentCore FinOps agenci AI

AWS Bedrock AgentCore: agent nie może odczytać danych o kosztach (AccessDenied lub pusty wynik)

Napraw agenta FinOps na Bedrock AgentCore, który zwraca AccessDenied lub pusty wynik przy odczycie danych o kosztach, diagnozując akcję IAM Cost Explorera, ścieżkę zapytań CUR plus Athena oraz zakres konta management kontra member.

Jerzy Kopaczewski ·
Agent FinOps na Amazon Bedrock AgentCore jest wart tyle, ile jego wgląd w rachunek. Gdy agent zwraca AccessDenied albo, co bardziej myli, udane wywołanie z pustymi danymi o kosztach, problem prawie zawsze leży na ścieżce odczytu: akcja IAM Cost Explorera, trasa zapytań CUR plus Athena albo konto, z którego agent czyta. Ten runbook rozdziela te trzy przypadki i naprawia każdy z nich.

Ten runbook dotyczy strony odczytu, czyli sytuacji, w której agent w ogóle nie widzi danych o kosztach. Stronę zapisu, gdy agent widzi dane, ale ma odrzuconą akcję na podstawie wniosku, opisaliśmy w runbooku AWS FinOps agent: AccessDenied przy akcji optymalizującej koszty. Gdzie to mieści się w projekcie agenta, wyjaśniamy w artykule AWS FinOps agent: koszt, funkcje i runbooki. W temacie projektu warstwy odczytu i zakresu kont umów konsultację.

Objawy

Błąd przyjmuje jedną z dwóch postaci. Najpierw ustal, którą, bo twarda odmowa i pusty, lecz udany wynik mają różne przyczyny.

# 1. Twarda odmowa IAM na API kosztowym
An error occurred (AccessDeniedException) when calling the GetCostAndUsage
operation: User: arn:aws:sts::...:assumed-role/agentcore-exec-role is not
authorized to perform: ce:GetCostAndUsage

# 2. Sukces, ale brak danych (przypadek po cichu mylący)
{ "ResultsByTime": [] }
# ...albo zapytanie Athena po CUR zwracające zero wierszy lub "table not found".

Widoczny wpływ:

  • Agent się uruchamia, ale każde podsumowanie kosztów jest puste lub kończy się błędem, bez trendów, anomalii i rekomendacji
  • Inne funkcje AgentCore (runtime, pamięć, gateway) działają, zawodzi tylko odczyt danych o kosztach
  • W konfiguracji Organizations agent widzi wydatki własnego konta, ale nic z reszty organizacji

Przyczyna

Dane o kosztach na AWS są osiągalne dwiema różnymi trasami, a agent FinOps zwykle korzysta z jednej lub obu: API Cost Explorer (ce:*, zagregowane, niemal w czasie rzeczywistym) oraz raport Cost and Usage Report (CUR) odpytywany przez Athenę (szczegółowy, na poziomie pozycji). Każda ma własny tryb obsługi, a trzeci problem, dotyczący zakresu konta, daje mylący pusty wynik.

  1. Brak akcji IAM Cost Explorera. Rola wykonawcza nie ma ce:GetCostAndUsage (i pokrewnych). Twardy AccessDeniedException z wywołania ce: to właśnie to.
  2. Niepodłączona ścieżka CUR i Athena. Agent odpytuje CUR przez Athenę, ale CUR nie jest skonfigurowany, brakuje tabeli w katalogu Glue albo rola nie ma athena:StartQueryExecution, glue:GetTable czy s3:GetObject na buckecie CUR. Objawia się to jako “table not found” lub odmowa Athena/S3, a nie błąd Cost Explorera.
  3. Zły zakres konta (pułapka pustego wyniku). Wywołanie się udaje, ale nic nie zwraca, bo agent czyta z konta member, podczas gdy dane rozliczeniowe są na koncie management (płatnika), albo Cost Explorer po prostu nigdy nie został włączony. Puste ResultsByTime bez błędu to sygnatura tego przypadku.

Częste przyczyny:

  • ce:GetCostAndUsage poza rolą: najczęstsza twarda odmowa
  • CUR nieskonfigurowany lub brak uprawnień Athena/Glue/S3: ścieżka szczegółowa jest niekompletna
  • Odczyt z konta member: widoczność rozliczeń jest na koncie management lub na wyznaczonym koncie kosztowym, a nie na dowolnym koncie member
  • Cost Explorer nigdy nie włączony: pierwsze włączenie jest wymagane, a dane uzupełniają się z opóźnieniem

Naprawa

Krok 1: Odróżnij twardą odmowę od pustego wyniku

Odczytaj odpowiedź. AccessDeniedException z wywołania ce: to brak akcji IAM (krok 2). Odmowa Athena/Glue/S3 lub “table not found” to ścieżka CUR (krok 3). Udane wywołanie zwracające puste dane to prawie zawsze zakres konta (krok 4), a nie uprawnienia, więc nie poszerzaj IAM, by to weryfikować.

Krok 2: Nadaj akcje odczytu Cost Explorera (ograniczone do odczytu)

Dodaj akcje odczytu Cost Explorera do roli wykonawczej agenta. Są one z natury tylko do odczytu, więc utrzymaj je takimi i nie łącz ich z żadnymi akcjami ce: zapisu lub modyfikacji, których agent nie potrzebuje.

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "FinOpsAgentCostExplorerRead",
    "Effect": "Allow",
    "Action": [
      "ce:GetCostAndUsage",
      "ce:GetCostForecast",
      "ce:GetDimensionValues",
      "ce:GetAnomalies"
    ],
    "Resource": "*"
  }]
}

Akcje ce: nie obsługują ARN na poziomie zasobu, więc Resource: "*" jest tu oczekiwany. Ograniczeniem jest to, że są to akcje tylko do odczytu, a nie to, że są związane z zasobem.

Krok 3: Podłącz ścieżkę CUR plus Athena (jeśli agent korzysta z danych szczegółowych)

Jeśli agent potrzebuje szczegółów na poziomie pozycji, potwierdź cały łańcuch: CUR dostarcza dane do bucketa S3, tabela w katalogu Glue na niego wskazuje, a rola potrafi uruchomić zapytanie Athena i odczytać wyniki.

  • Potwierdź, że CUR istnieje i dostarcza dane do swojego bucketa S3 (dane CUR pojawiają się z opóźnieniem do 24 godzin po pierwszej konfiguracji)
  • Nadaj athena:StartQueryExecution, athena:GetQueryResults, glue:GetTable / glue:GetDatabase oraz s3:GetObject na buckecie CUR i buckecie wyników Athena
  • Sprawdź, czy nazwa tabeli Glue, którą odpytuje agent, odpowiada tabeli CUR faktycznie utworzonej

Krok 4: Napraw zakres konta, czytaj z konta management lub wyznaczonego konta kosztowego

Jeśli wywołanie się udaje, ale nic nie zwraca, agent czyta z niewłaściwego konta. Dane o kosztach całej organizacji są na koncie management (płatnika) lub na wyznaczonym koncie zarządzania kosztami, a nie na dowolnym koncie member.

  • Skieruj agenta na konto management albo ustaw delegowanego administratora dla Cost Explorera i rozliczeń, a następnie niech agent przyjmuje tam rolę
  • Potwierdź, że Cost Explorer jest włączony (pierwsze włączenie jest wymagane raz na konto management) i że minęło dość czasu, by dane się zapełniły
  • Dla agenta działającego tylko na koncie member przyjmij, że zawsze zobaczy wyłącznie wycinek tego konta, co jest poprawne, a nie błędne

Weryfikacja

Potwierdź, że agent odczytuje niepuste dane o kosztach tą ścieżką, z której korzysta.

# Ścieżka Cost Explorer: uruchom dokładne wywołanie agenta, jako jego rola
aws ce get-cost-and-usage \
  --time-period Start=2026-09-01,End=2026-09-22 \
  --granularity DAILY --metrics "UnblendedCost" \
  --region us-east-1
# Oczekuj: zapełnionej tablicy ResultsByTime, a nie [] ani AccessDenied.

Dla ścieżki CUR uruchom zapytanie Athena agenta bezpośrednio i potwierdź, że zwraca wiersze. Oczekiwany stan końcowy: agent tworzy realne podsumowanie kosztów z trendami i anomaliami, czytając z właściwego konta (management lub wyznaczonego), z Cost Explorerem tylko do odczytu i bez przypiętych akcji zapisu.

Powiązane