skip to content

Your workloads are split across a dozen AWS accounts and an on-call engineer has to assume a role into each one to read its CloudWatch data. How does AWS cross-account observability change that, and what does it not give you?

level: seniorimportance: should knowfreq 42%

answer

  1. one console instead of role hopping
  2. sink central, link per source
  3. the data owner initiates sharing
  4. read-only, one-way, nothing copied
  5. one sink per region

basics

~20 s

CloudWatch cross-account observability designates a monitoring account that creates an Observability Access Manager sink; each source account creates a link to that sink naming the resource types it shares. The monitoring account then reads metrics, log groups and traces in place — one console, no role hopping.

solid answer

~50 s

You set up **CloudWatch cross-account observability** with Observability Access Manager. The monitoring account creates a **sink** — one per region — with a policy saying which accounts or organization may attach. Each source account creates a **link** to that sink ARN, choosing which resource types to share: `AWS::CloudWatch::Metric`, `AWS::Logs::LogGroup`, `AWS::XRay::Trace` and a few others, and a label template such as `$AccountName` so data is attributable in the UI. After that an engineer in the monitoring account graphs source-account metrics on one dashboard, runs Logs Insights across accounts, and follows a trace end to end without assuming a role. What it does **not** do: it moves no data, it is one-way and read-only, and it grants nothing by itself — a person in the monitoring account still needs IAM permission there. Links can be filtered, so a source account can share only some namespaces or log groups. And it is per region, so a multi-region estate needs a sink per region.

code

bash · 8 lines
bash
# Monitoring account: create the sink (one per region)
aws oam create-sink --name central-observability

# Source account: attach a link to that sink
aws oam create-link \
  --label-template '$AccountName' \
  --resource-types AWS::CloudWatch::Metric AWS::Logs::LogGroup AWS::XRay::Trace \
  --sink-identifier arn:aws:oam:eu-west-1:111122223333:sink/abcd1234

go deeper

for a junior

Know that AWS lets you nominate a monitoring account so CloudWatch data from other accounts can be viewed in one place instead of logging into each account.

for a middle

Explain the sink-and-link model: the monitoring account creates a sink, each source account creates a link naming the resource types it shares, and the arrangement is per region.

for a senior

Show that you understand the direction and the limits — the source opts in, it is read-only, nothing is copied or re-billed, links can be filtered, and principals still need their own IAM permissions.

for a principal

Own the rollout: a dedicated monitoring account, organization-scoped sink policies, links vended automatically with every new account, and a clear decision about where alarms and paging responsibility sit.

## The problem it solves Multi-account is the AWS-recommended isolation boundary, and it is also the reason incident response is slow. Telemetry is regional and account-scoped, so an engineer chasing one request across three accounts logs into three consoles, or maintains a role-assumption dance, and cannot draw a single graph of the whole thing. ## Sinks and links Cross-account observability is implemented by **Observability Access Manager (OAM)**, and it has exactly two objects: - A **sink** in the **monitoring account** — the account whose console you want to live in. One per region. Its resource policy states who may attach to it, typically expressed with an organization condition rather than an account list so new accounts work automatically. - A **link** in each **source account**, pointing at the sink's ARN and declaring what it shares. ```bash # in the monitoring account aws oam create-sink --name central-observability # in each source account aws oam create-link \ --label-template '$AccountName' \ --resource-types AWS::CloudWatch::Metric AWS::Logs::LogGroup AWS::XRay::Trace \ --sink-identifier arn:aws:oam:eu-west-1:111122223333:sink/abcd1234 ``` The direction matters and is frequently asked: the **source account initiates the sharing**. The monitoring account cannot reach in and take data; it can only publish a sink that source accounts choose to attach to. That is what makes the model acceptable to a security team — sharing is a decision the data owner makes. ## The resource types A link names the categories it exposes, including `AWS::CloudWatch::Metric`, `AWS::Logs::LogGroup`, `AWS::XRay::Trace`, and further types such as Application Signals services. Sharing is per type, so a source account may expose metrics but withhold log groups. Links also support **filtering**, so you can share a subset — particular log groups, particular metric namespaces — rather than everything. That is the lever to use when a source account holds sensitive log data: share metrics broadly, share logs narrowly. The `--label-template` matters more than it looks. Everything in the monitoring account's UI comes from several accounts at once, and `$AccountName` is what stops "which `payments` log group is this?" from being a question during an incident. ## What the monitoring account can then do - Put **metrics from several accounts on one dashboard widget**, with the account chosen per widget or driven by a dashboard variable. - Run **Logs Insights queries across log groups in several accounts** in a single query. - Follow a **trace across account boundaries** in one view, which is the single biggest win when the request path crosses account lines. ## What it explicitly is not - **Not a data movement.** Nothing is copied. The telemetry stays in the source account, in its log groups, under its retention and its KMS keys, and is billed there. If you wanted a copy, that is a subscription filter or Metric Streams — a different mechanism entirely. - **Not an authorization grant to people.** The link gives the *monitoring account* read access; individual principals in it still need their own IAM permissions. Setting up a sink does not make every engineer in the monitoring account a reader. - **Not two-way.** Source accounts get nothing from the monitoring account and cannot see each other. - **Not global.** Sinks are per region. A multi-region estate needs one per region, and the monitoring account switches region as it always did. - **Not a substitute for owning alarms.** Alarms and their actions have historically been the responsibility of the account that owns the resource. Be deliberate about where alarms live and who is paged, rather than assuming the monitoring account inherits the whole notification story. ## The predecessor, and why it still comes up Before OAM, cross-account dashboards were done with an IAM role in each source account named **`CloudWatchCrossAccountSharingRole`**, which the monitoring account assumed to render graphs. You will still meet it in older estates. It was narrower — dashboard and console rendering — and had no notion of sharing log groups or traces wholesale. If you find it, treat it as legacy and plan the move to sinks and links. ## Rolling it out The practical order is: pick the monitoring account (a dedicated one, not the organization management account); create the sink per region with an organization-scoped policy; deploy links from source accounts as code so new accounts get one automatically at vending time; start with metrics and traces; add log groups deliberately, with filters where the content is sensitive. Then delete the per-account bookmark sprawl, because the failure mode of this feature is that half the estate is linked and nobody trusts the central view enough to use it.

  • Which side creates the link, and why does that direction matter?
    The source account creates the link to the monitoring account's sink. The monitoring account can only publish a sink and state who may attach; it cannot reach into an account that has not opted in. That makes sharing a decision of the data owner, which is what gets the design past a security review.
  • A source account holds log groups with regulated data. Can it still join?
    Yes. Resource types are chosen per link, and links support filtering, so the account can share metrics and traces while sharing no log groups at all, or only a named subset. Sharing is not all-or-nothing, and it stays under the source account's control.
  • Does cross-account observability reduce the source account's CloudWatch bill?
    No. Nothing is moved or copied — the logs, metrics and traces stay where they are, billed to the account that produced them under its own retention. Cross-account observability changes who can read the data, not where it lives or who pays for it.
  • An engineer in the monitoring account still gets access denied on a source account's log group. What is wrong?
    Almost certainly their own IAM permissions in the monitoring account. The link grants the account read access; it does not grant individual principals anything. Check also that the source account's link actually includes AWS::Logs::LogGroup, and that any link filter is not excluding that group.

saying these in an interview costs you the question

  • Thinking the monitoring account can pull data without the source opting in
  • Believing the telemetry is copied into the monitoring account
  • Assuming a sink covers every region
  • Expecting the link alone to grant engineers access
  • Treating cross-account sharing as all-or-nothing per account

context