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.
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.
- Brak akcji IAM Cost Explorera. Rola wykonawcza nie ma
ce:GetCostAndUsage(i pokrewnych). TwardyAccessDeniedExceptionz wywołaniace:to właśnie to. - 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:GetTableczys3:GetObjectna buckecie CUR. Objawia się to jako “table not found” lub odmowa Athena/S3, a nie błąd Cost Explorera. - 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
ResultsByTimebez błędu to sygnatura tego przypadku.
Częste przyczyny:
ce:GetCostAndUsagepoza 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:GetDatabaseorazs3:GetObjectna 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
- AWS FinOps agent: AccessDenied przy akcji optymalizującej koszty - odpowiednik po stronie zapisu, gdy agent widzi dane, ale nie może zadziałać
- AWS FinOps agent: koszt, funkcje i runbooki - jak krok odczytu wpisuje się w model obserwuje/rekomenduje/działa
- Amazon Bedrock AgentCore: architektura, komponenty i cennik - platforma, na której działa agent
- AgentCore Identity: AccessDenied przy działaniu w imieniu użytkownika - powiązany błąd dostępu na warstwie tożsamości
- Dokumentacja dostępu i uprawnień AWS Cost Explorer