Administrator guide
Administrators manage Cloud Certainty TraceHound from Administration in the portal
(PortalUrl): connections, grants, roles, settings and prices, usage, the collector, the audit log
and the licence. Everything is stored in the stack's DynamoDB table in your account, and every
change is written to the audit log.
Administration has the pages Connections, Grants, Roles, Settings, Usage, Collector, Audit log and Licence and about. Without a valid licence only Licence and about opens.
Connections
A connection is one IAM role TraceHound assumes in one AWS account, with the Regions it shows (Administration › Connections).
| Connection | Role | Set by |
|---|---|---|
Local (local) | The hub stack's role /tracehound/<NamePrefix>-local-<Region>, in the hub account | The stack: LocalAccessLevel, LocalRegions (empty means the stack's Region) and LogGroupPrefixes. It can't be changed or deleted in the portal |
| Spoke | A role created by the spoke role template (spoke-role.yaml) in another account, /tracehound/<RoleName> (tracehound-spoke by default). It trusts only the hub role, and only with your external ID | The spoke stack's AccessLevel and LogGroupPrefixes, and the Regions you choose here |
Access levels
The access level of a connection's role is the ceiling for everyone, administrators included. Grants can narrow it per user or group but never widen it.
| Access level | TraceHound may | Permissions it allows |
|---|---|---|
Read (default) | List log groups with their settings and sizes, read their metrics, streams, tags and filters, run Logs Insights queries, search and read events, and run Live Tail | browse, read, export |
Manage | Read plus changing the retention of log groups | plus manage (Team and above) |
Whatever the level, a role whose stack sets LogGroupPrefixes reads events from, and changes, only
the log groups under those prefixes; it still lists every log group with its size and metrics. The
roles never have logs:Unmask, so masked data stays masked
(log group access).
Use Read unless you want people to change retention through TraceHound.
Add a connection
- Deploy the spoke role in the account
(installation guide). How to connect
another AWS account at the bottom of the page shows the steps, the template URL and an AWS CLI
command. Set
TrustedPrincipalto the hub stack'sSpokeTrustedPrincipaloutput and choose anExternalIdsecret of 16 to 128 characters. - Choose Add connection and enter:
- Id: a short name used in links, for example
production. It can't be changed later, andlocalis reserved. - Name and AWS account id.
- Access level: the same as the spoke stack's
AccessLevel. The role in the account is what really enforces it. - Role ARN: the spoke stack's
RoleArnoutput,arn:aws:iam::<account>:role/tracehound/<RoleName>. It must be in that account and under the/tracehound/path. - External ID: the same secret you gave the spoke stack (Generate makes one you can then give the stack). It is stored and never shown again; when you edit the connection, leave it empty to keep it.
- Regions to show: as many as you like; one role covers every Region of the account.
- Id: a short name used in links, for example
- Save connection, then choose Test. The test assumes the role and, for each Region, reports the number of log groups and their stored bytes, or the AWS error.
Each distinct AWS account counts against your plan's account limit, the hub account included (3 on Starter, 10 on Team, 50 on Business, unlimited on Enterprise). When the limit is reached, Add connection is disabled. Deleting a connection makes TraceHound stop using the role, and grants on it stop applying; the role stays in the account until you delete its stack. The collector adds a new connection's Regions on its next hourly run.
Grants
A grant gives a user or a group permissions on the log groups whose names match some patterns, on a connection (or all) in some Regions (or all) (Administration › Grants). A new grant, or a change, applies on the user's next request.
| Field | Values |
|---|---|
| Subject | A user (their sign-in email) or a group (the name as your IdP sends it in the groups claim) |
| Connection | One connection, or All connections (including ones you add later) |
| Regions | Some Regions, or All Regions |
| Log group patterns | One per line, up to 50, matched against the whole name and case-sensitive, as IAM matches ARNs: * matches any run of characters (/ included) and ? exactly one. Letters, digits and _ . / # - besides the wildcards. For example /aws/lambda/payments-*, /ecs/orders, or * for every log group |
| Permissions | Any of the table below |
| Description | Optional, for your records |
| Permission | Allows | Implies | Needs |
|---|---|---|---|
browse | See the log group: settings, stored bytes, storage history, ingestion, tags, metric and subscription filters, streams and related resources | ||
read | Read events: Logs Insights queries, search, context around an event, live tail, Trace and field discovery | browse | |
export | Export results and events from the browser (CSV, JSON), and create snapshots (Team and above) | read | |
manage | Change the retention of the log group | browse | a Manage connection, Team and above |
The Pattern tester next to the patterns shows, for a connection and Region you choose, how many log groups match and what they store, which pattern matches each, and which patterns match nothing. Try a name checks a single name. Log groups created later that match the patterns are covered automatically.
How grants combine
- A user's permissions are the union of every grant that matches them, through their email or any of their groups, capped by the connection's access level and the plan.
- A log group no grant covers doesn't exist for the user ("not found"): TraceHound doesn't reveal it. A log group they can see but not use in that way answers "forbidden".
- Administrators have every permission on every log group, still bounded by each connection's access level and the plan.
- Saved queries and dashboards never grant anything: they run with the viewer's own permissions.
Check access, under the grants, answers "what may this person do with this log group?": enter an email and groups, a connection, a Region and a log group name, and it shows the effective permissions, what the connection's access level removes, and the grants that matched. It works from the grants on the page; the API checks every request again.
How grants are enforced
Grants are enforced twice. TraceHound checks them on every request, and every AWS call runs with
temporary credentials (15 minutes) that a per-request session policy limits to the user's grants:
Logs Insights queries, event searches, field lists and Live Tail only on the ARNs of the log groups
the user may read, and retention changes only on the one log group being changed. Even if
TraceHound's own check had a bug, AWS would refuse anything outside the grants.
Every session carries the user's email as its source identity, so CloudTrail in each account names the person behind every CloudWatch Logs call.
If someone's grants would make a session policy larger than AWS allows, TraceHound refuses the
request ("too many grants") rather than widening it. Combine grants: use groups, and patterns such
as /aws/lambda/payments-* instead of many single names.
Examples
| Goal | Grant |
|---|---|
| The payments team reads and exports its functions' logs | group payments, connection production, all Regions, patterns /aws/lambda/payments-*, export |
| Developers read every Lambda and ECS log in staging, but only browse production | Two grants for group developers: connection staging, patterns /aws/lambda/* and /ecs/*, read; and connection production, pattern *, browse |
| The platform team cleans up retention everywhere | group platform, all connections (those with access level Manage), all Regions, pattern *, manage (and read if they also search) |
| Security reads CloudTrail and VPC Flow Logs everywhere | group security, all connections, all Regions, patterns aws-cloudtrail-logs* and /aws/vpc/*, export |
| An on-call engineer reads everything in one account | user [email protected], connection production, all Regions, pattern *, read |
Roles
| Role | Can |
|---|---|
| User | Use the log groups their grants allow: browse, read, export and change retention, as granted. Own saved queries, dashboards and snapshots |
| Administrator | Every permission on every log group of every connection (still bounded by each connection's access level and the plan), plus Administration. Administrators see everyone's query history, and can open, change and delete anyone's saved queries, dashboards and snapshots |
- Everyone who signs in without a role entry is a User, and sees no log groups until a grant applies to them.
- Roles and grants match the user's email or groups. The email must be trusted: asserted by
your SAML IdP, verified by your OIDC IdP (
email_verified), or marked verified in the Cognito user pool (Identity providers). - In Administration › Roles, under Grant a role, choose User or Group, enter the email or the group name exactly as your IdP sends it (group names are case-sensitive), choose Administrator or User, and Save role. A role for a user wins over a role for one of their groups, so you can make a group administrators and keep one member a User. A change applies on the user's next request.
- You can't remove your own Administrator role. Grant it to at least one more person or group.
The bootstrap admin
BootstrapAdminEmail (a stack parameter) is the bootstrap admin. The first person who signs in
with that email is bound to it by their immutable user ID (the Cognito sub) and is always an
Administrator, which prevents lock-out. The Roles page shows the entry as set by the stack. The
binding is recorded in the audit log (bootstrap.bind). Someone else who later signs in with the
same email address but a different user ID is not the bootstrap admin.
Recovering the bootstrap admin
Reset the binding when the bootstrap admin's user ID changes (the user was recreated, the IdP issues
a new subject, or you switched IdentityProvider). Either:
- Use a different person: update the stack and change
BootstrapAdminEmail. The first sign-in with the new email takes over the binding. - Keep the same email: update the stack with
BootstrapAdminEmailset to another address you can sign in with, and sign in with it once. Then set it back and sign in with the original email, which takes the binding over again.
If another Administrator can still sign in, they can simply grant the Administrator role to the person by email under Administration › Roles.
Settings
Administration › Settings:
| Setting | Default | Meaning |
|---|---|---|
| Logs Insights price per GB scanned (US dollars) | 0.005 | 0.0001 to 10. Used for the cost of every query, in History and Usage |
| Standard ingestion per GB (US dollars) | 0.50 | 0.01 to 10. Used for log group cost estimates |
| Infrequent Access ingestion per GB (US dollars) | 0.25 | 0.01 to 10. Used for Infrequent Access and Delivery log groups |
| Storage per GB-month (US dollars) | 0.03 | 0.001 to 10. Used for storage costs and retention savings |
| Live tail per session minute (US dollars) | 0.01 | 0 to 10. Used for live tail costs |
| Default reuse age (minutes) | 5 | 0 to 1,440. How long a person's own earlier result of the same query is shown again instead of running it, for dashboard panels and Explore's reuse option. 0 turns reuse off |
| Live tail minutes per user per day | 0 (no limit) | 0 to 1,440. Once a person's live tails have run this many session minutes in a UTC day, their new tails are refused until the next day |
| Longest snapshot lifetime (days) | 30 | 1 to 3,650. The most days a snapshot may last before it expires |
| Daily Logs Insights scan budget per user (GB) | 0 (no budget) | Business and above. Once a person's queries have scanned this much in a UTC day, new queries are refused ("You have used today's scan budget of N GB.") until the next day. A query's bytes count when it finishes, so the last query of the day can go over |
| Allowed IP ranges (CIDR) | empty (any network) | Business and above. One IPv4 or IPv6 range per line, at most 200. People outside these ranges can sign in but can't use TraceHound (snapshots and live tail included). A list that doesn't contain your own address is refused, so you can't lock yourself out |
The prices are CloudWatch's us-east-1 list prices by default; Reset to defaults restores them. Set your Region's prices, or your negotiated ones. Every estimate in TraceHound uses them; your AWS bill is the record.
Usage
Administration › Usage shows what your teams ran through TraceHound over the last 7, 30 or 90 days, per UTC day:
- Insights queries, Failed and cancelled, Reused, Bytes scanned, Live tail minutes and the Estimated cost, with queries per day and bytes scanned, live tail minutes or cost per day.
- Top users and Top Regions (Business and above): the 50 users and the 50 connections and Regions that cost the most over the period, with their queries, bytes scanned and live tail minutes.
Each query is counted once, when it reaches its final state (succeeded, failed or cancelled), however many people or panels were watching it. A result TraceHound showed again from someone's own earlier run starts no query and costs nothing. Live tail minutes are counted per session minute of each shared session, once, however many people watched it. Estimated costs use the prices in Settings; your AWS bill is the record. Usage covers only what runs through TraceHound, and is kept for 400 days.
Collector
Administration › Collector shows the storage history collector in every connection and Region: when it last ran, the last day it recorded, whether its 90-day ingestion backfill is done, how many log groups it tracked and any error.
Every hour the collector records each log group's stored bytes and yesterday's ingestion from
CloudWatch metrics. The first run in a Region backfills 90 days of ingestion; stored bytes history
starts the day TraceHound is installed. GetMetricData costs about $0.01 per 1,000 metrics, so a
Region with 2,000 log groups costs about $0.04 a day. Storage history is kept for 90 days on Starter,
365 on Team, 730 on Business and 1,825 on Enterprise.
Collect now starts a run at once (recorded in the audit log as collector.run); new numbers
appear within a few minutes. An error in one Region, such as an access error from a spoke role, is
shown there and doesn't stop the others; the next run tries again. A Region with more than 20,000
log groups is recorded for its first 20,000 and says so.
Audit log
Administration › Audit log lists events by UTC day, newest first, with the time, the actor, the action, the target and the source IP. Open an event for its details. Filter this page searches the events shown.
| Action | When |
|---|---|
bootstrap.bind | The bootstrap admin was bound to a user |
role.put, role.delete | A role was granted or removed |
connection.put, connection.delete | A connection was added, changed or deleted (whether the external ID changed is recorded, never the ID itself) |
grant.put, grant.delete | A grant was added, changed or deleted |
settings.put | Settings were changed |
licence.refresh | An administrator checked the licence |
update.available | A new release was found |
loggroup.retention | The retention of a log group was changed (the connection, Region, log group, and the old and new retention) |
result.export | Someone exported a query's full result (at most once per query and person per hour) |
collector.run | An administrator started the collector |
query.put, query.delete | A saved query was created, changed or deleted |
dashboard.put, dashboard.delete | A dashboard was created, changed or deleted |
snapshot.create, snapshot.delete | A snapshot was created or deleted |
access.denied | A request to read events, run a query, export, take a snapshot, tail or change retention was refused for a missing permission or because it came from an address outside the IP allowlist |
Events are kept for your plan's audit days: 30 on Starter, 90 on Team, 365 on Business and 3,650 on
Enterprise. Each event is also written as a JSON line (with "kind":"audit") to the API's
CloudWatch log group, /aws/lambda/<NamePrefix>-api (live tail refusals to
/aws/lambda/<NamePrefix>-livetail), kept for the stack's LogRetentionDays, so you can forward it
to your SIEM.
Every query, with who ran it, is in the query history, which administrators can see for everyone, day by day, under History › Everyone.
For a full trail, CloudTrail in each account records the CloudWatch Logs calls TraceHound makes, as
it records them for any client, with sourceIdentity set to the user's email and the role session
name th-<email>.
Licence and about
Administration › Licence and about shows your licence, your plan and the installed version.
Licence
TraceHound reads your AWS Marketplace licence from AWS License Manager in the hub account. The page shows the status, the plan, the entitlements, when the licence is valid until and when it was last checked. Check licence now reads it again (TraceHound otherwise rechecks every 10 minutes).
| Status | Meaning |
|---|---|
| Active | The licence is valid |
| Grace period | License Manager is unreachable, or an active licence disappeared (for example while you move between plans). The last active plan keeps working for 72 hours |
| Expired | The grace period ended without an active licence |
| No licence | The account has no TraceHound licence |
Without a valid licence every page except this one says a licence is required. Nothing is deleted; subscribing again unlocks TraceHound.
Plan
What your plan includes lists the limits and features of your plan, and Compare plans shows all four:
| Starter | Team | Business | Enterprise | |
|---|---|---|---|---|
| AWS accounts | 3 | 10 | 50 | unlimited |
| Saved queries per user | 50 | 500 | 2,000 | unlimited |
| Dashboards per user | 5 | 50 | 500 | unlimited |
| Versions kept per query or dashboard | 5 | 25 | 50 | 100 |
| Query history kept | 30 days | 90 days | 365 days | 730 days |
| Storage history kept | 90 days | 365 days | 730 days | 1,825 days |
| Audit log kept | 30 days | 90 days | 365 days | 3,650 days |
| Fastest dashboard refresh | 5 minutes | 1 minute | 30 seconds | 10 seconds |
| Rows per snapshot | no snapshots | 10,000 | 50,000 | 100,000 |
| Overview, log group inventory, storage and ingestion history, cost estimates and recommendations, Explore, Trace, Live Tail, private saved queries and dashboards with templates and versions, history with cost, grants, daily usage, the audit log, IAM Identity Center and Cognito sign-in | yes | yes | yes | yes |
| Retention changes, shared queries and dashboards, snapshots, SAML and OIDC sign-in | yes | yes | yes | |
| IP allowlist, daily scan budgets, usage by user and Region | yes | yes |
Features your plan doesn't include show a plan badge, and TraceHound refuses them. To change plan, see Changing plan.
Version and updates
The version card shows the installed version and, when update checks are on (UpdateChecks), the
latest release, its summary and release notes, whether it is a security release, the oldest supported
version, and How to upgrade with the template URL and an AWS CLI command. A banner on the
Administration pages announces a newer release. See Upgrading.
Something unclear or missing? Email [email protected].