Setting Up Cloudwatch Observability
AWSOfficialPublished by AWS
- Skill
- Tool integration
- Cloud and DevOps
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides the end-to-end setup procedures for two distinct CloudWatch observability products: CloudWatch Application Observability (Omni) and classic CloudWatch Application Signals. It acts as a central routing hub, helping users identify the correct product based on their requirements and guiding them through the specific onboarding, instrumentation, and configuration steps for each. It covers resource creation, access management, and telemetry ingestion, while clearly delineating the boundaries between the two products to ensure correct implementation.
What it does
- Routes setup requests to the correct product path based on user intent and environment.
- Guides users through CloudWatch Omni Domain and Space creation, access grants, and profile configuration.
- Provides instructions for instrumenting applications and AI agents with the ADOT SDK for Omni.
- Details the onboarding process for classic CloudWatch Application Signals, including auto-instrumentation and add-ons.
- Supports telemetry ingestion configuration for Azure and Google Cloud environments.
- Manages integration setups for Slack and the AWS DevOps Agent.
When to use it
- When you need to set up CloudWatch Application Observability (Omni) for the first time.
- When you need to onboard a service to classic CloudWatch Application Signals.
- When you are unsure which CloudWatch observability product is appropriate for your workload.
- When you need to configure access grants, profiles, or integrations for an existing Space.
- When you need to instrument an application or AI agent to export telemetry to CloudWatch.
Advantages
- Prevents configuration conflicts by enforcing mutually exclusive setup paths for Omni and Application Signals.
- Provides a structured, step-by-step sequence for complex resource hierarchies like Domains and Spaces.
- Clarifies the distinction between setup tasks and day-to-day operational tasks.
- Ensures correct principal resolution and permission scoping for access grants and profiles.
Usage examples
- “How do I start setting up CloudWatch Application Observability?”
- The agent will explain the setup order (Domain, Space, grants, telemetry) and direct you to the app-basics reference to begin.
- “I need to onboard my EKS service to Application Signals.”
- The agent will route you to the Application Signals onboarding guide and the specific EKS-language instrumentation steps.
- “How do I give a team access to my CloudWatch Omni Space?”
- The agent will guide you through resolving the principal and using the access-grants reference to configure the appropriate permission level.
- “Can I connect my GitHub repository to CloudWatch Omni?”
- The agent will clarify that Omni does not support GitHub integration and stop the setup process.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/aws/setting-up-cloudwatch-observability/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip setting-up-cloudwatch-observability.zip -d .agents/skills
Documentation by AWS
Setting Up CloudWatch Observability
Scope: First-time CloudWatch observability setup, for both products — a CloudWatch Application Observability (Omni) Space from creation through first traces flowing, and onboarding a service to classic CloudWatch Application Signals. For using what is already set up (queries, dashboards, alarms, Omni alerts, evaluations, live debugging), route to aws-observability.
Two products, two reference folders
This skill owns setup for two products that share the CloudWatch name but are separate services. The folder a reference lives in is the signal for which product it belongs to — the same convention aws-observability uses:
| Folder | Product | What setup means there |
|---|---|---|
references/cloudwatch-omni/ | CloudWatch Omni (Application / Agent Observability) | Domain → Space → grants → telemetry in → plain ADOT SDK instrumentation. No add-on, no CloudWatch Agent application_signals config, no port 4316. |
references/cloudwatch/ | Classic CloudWatch | Onboarding a service to Application Signals: ADOT auto-instrumentation, the amazon-cloudwatch-observability EKS add-on, the CloudWatch Agent, monitored service, ServiceEvents, CI/CD git/deployment metadata, port 4316. |
The two instrumentation paths are mutually exclusive on a given workload — the Omni path explicitly forbids the Application Signals env vars and the add-on, and vice versa. Decide the product first (Routing Rules 1–4 below), then stay inside that folder. Enabling one does not replace the other; an account may run both, on different services.
Works best with the AWS MCP server — enables running AWS CLI commands directly. All guidance also works with standard AWS CLI access (aws cloudwatchomni ... on the Omni path; aws eks, aws iam, and aws application-signals on the Application Signals path).
Concepts — Omni (references/cloudwatch-omni/)
These are Omni's resources. None of them exist on the Application Signals path — that one has no Domain, Space, grant, or Dataset; its unit is a monitored service, and access is plain IAM. Do not ask an Application Signals onboarding customer for a spaceId.
| Term | What it is |
|---|---|
| Domain | The identity boundary. Carries the authorization provider (IAM or Identity Center) and owns the endpoint URL customers reach Omni through. One per account, or one shared across an AWS Organization. |
| Space | A workspace holding telemetry, in exactly one account and one Region. Created under a Domain. At most one per account per Region. Region rule: under an IAM-only Domain a Space may sit in a Region other than the Domain's; under an account-scoped Identity Center Domain the Space must be in the Domain's own Region; under an org-scoped Identity Center Domain it must be in a Region the instance is replicated to. |
| Access grant | Attaches a principal — person, group, IAM identity, or async workload — to one Space at a permission level. The only way anyone reaches data through a Space — it does not restrict the source CloudWatch log groups, which stay readable under their own IAM. |
| Access Profile | A named boundary for async workloads (alerts, integrations, agents) that act without a person in the loop. It is only a named container: create-access-profile takes a Space, a name, and a description and nothing else — no permission, action, or scope input. It does something only once two separate sets of grants exist (what the profile may do; which workloads may assume it) and a workload names it. |
| Dataset | What queries run against. Telemetry arrives through the CloudWatch OTLP endpoints, or by forwarding what is already in CloudWatch log groups. |
Omni setup order from nothing: Domain → Space → grants → telemetry in → instrumentation. (The Application Signals equivalent is much shorter and has no prerequisite resources — add-on/agent, IAM, then the per-platform enablement change; see references/cloudwatch/application-signals-onboarding.md.) "Telemetry in" (a collector exporting to CloudWatch's OTLP endpoints, plus dataset forwarding for what is already in CloudWatch) is its own step, separate from instrumenting the workloads. Access Profiles are conditional, not a step in the sequence — only when async workloads (alerts, integrations, agents) are involved. Whenever you give this sequence, also say that instrumentation or forwarding started before a Space exists appears to succeed while delivering telemetry nowhere the customer can see — a customer who checks Omni first reads a working, empty Space as a failure. For the concept relationships and the full arc, see references/cloudwatch-omni/app-basics.md.
This is a routing skill. Classify the user's setup request and delegate to the correct reference. Omni references live under references/cloudwatch-omni/; classic-CloudWatch (Application Signals) references live under references/cloudwatch/.
| User intent | Reference |
|---|---|
Onboard a service to Application Signals (auto-instrumentation, the amazon-cloudwatch-observability EKS add-on, CloudWatch Agent IAM for Application Signals, monitored service, reporting telemetry to Application Signals, ServiceEvents, the two onboarding tiers) | references/cloudwatch/application-signals-onboarding.md |
Propagate ServiceEvents git/deployment metadata through CI/CD (the 5 OTEL_AWS_SERVICE_EVENTS_* vars, per-provider patterns) | references/cloudwatch/application-signals-cicd-metadata.md |
| Per-platform × per-language Application Signals enablement steps once platform and language are known | The matching references/cloudwatch/appsignals-guides/<platform>-<language>.md (e.g. references/cloudwatch/appsignals-guides/eks-python.md) |
Turn on Dynamic Instrumentation for a service at onboarding time (the OTEL_AWS_DYNAMIC_INSTRUMENTATION_* vars and their IAM) | references/cloudwatch/application-signals-onboarding.md (Step 5d). Using it to debug is aws-observability |
| Understand what Omni is, its concepts, or where to start | references/cloudwatch-omni/app-basics.md |
| Instrument an AI agent (ADOT, OpenInference, framework detection, trace verification), or deploy an agent to production and get traces flowing to CloudWatch — env vars per platform (AgentCore, Lambda, or other platforms such as ECS/EC2/EKS), routing spans to a custom trace log group, IAM permissions needed, how the export authenticates (AWS credentials, no API token), ADOT version requirements | references/cloudwatch-omni/omni-agents-instrumentation/omni-agents-instrumentation.md (§ Production deployment for the deploy case) |
| Per-framework OpenInference guide (LangChain, LangGraph, Strands, CrewAI, OpenAI Agents, Vercel AI) once the agent framework is known | references/cloudwatch-omni/omni-agents-instrumentation/openinference-framework-guide.md, then the matching references/cloudwatch-omni/omni-agents-instrumentation/instrument-<framework>.md |
| Instrument an application (ADOT SDK on EC2/ECS/EKS/Lambda — Python, Node.js, Java, .NET) | references/cloudwatch-omni/instrumentation/instrumentation.md |
Emit a custom application or agent metric so it is queryable in Omni (why OTLP and not PutMetricData/EMF) | references/cloudwatch-omni/instrumentation/instrumentation.md (§ Custom metrics) |
| Create an account-scoped Space or Domain | references/cloudwatch-omni/spaces-and-domains.md |
| Whether a Space can be in a different Region from its Domain | references/cloudwatch-omni/spaces-and-domains.md (Prerequisites → Region rules) |
The AgentCore evaluation role that create-space asks for — what it is, whether to create one | references/cloudwatch-omni/spaces-and-domains.md (Step 3 → Also resolve the AgentCore evaluation role) |
Let Omni run Bedrock models for a Space (Agent Playground, evaluations run from Omni), or a Bedrock AccessDeniedException from those features | references/cloudwatch-omni/spaces-and-domains.md (Step 3 → Optional: let Omni invoke Bedrock models) |
| A Space that was created successfully but returns an authorization error when used | references/cloudwatch-omni/spaces-and-domains.md (Troubleshooting → If the Space was created but cannot be used) — a space access role trust-policy problem, not a grant problem |
| Create a Domain shared across an AWS Organization | references/cloudwatch-omni/org-domains.md |
| Configure access grants for people or IAM identities or alerts | references/cloudwatch-omni/access-grants.md |
An aws cloudwatchomni command reporting that the service is not supported, or a request to repair the customer's CLI or SDK so Omni commands work | Not a setup task — a local client-version problem. STOP and route to aws-observability |
| A programmatic caller denied on a Space it already had working — a CI role, SDK client, CloudFormation role, coding agent, or a workload under an Access Profile | references/cloudwatch-omni/access-grants.md (Grants, IAM, and Access Profiles), and aws-observability for the API-side view |
| Bound an alert, integration, or agent with an Access Profile | references/cloudwatch-omni/access-profiles.md |
| Deploy an OTel Collector so an instrumented app has somewhere to export to (EC2/ECS/EKS) — it exports to CloudWatch's own per-signal OTLP endpoints | references/cloudwatch-omni/instrumentation/collector.md |
An OTLP collector already running (a CloudWatch Agent with an opentelemetry section or OTLP on 4317/4318, or otelcol-contrib) whose telemetry does not arrive, in whole or for one signal such as traces | references/cloudwatch-omni/instrumentation/collector.md (Verify), then the platform collector guide it links for the troubleshooting table |
Enable Transaction Search so traces reach a Space (spans land in aws/spans only once it is on — per account, per Region) | references/cloudwatch-omni/instrumentation/collector.md (Step 1) |
| Forward telemetry already in CloudWatch into the Dataset | references/cloudwatch-omni/data-forwarding-and-centralization.md |
| Send your application's own telemetry from Azure (the logs/metrics/traces your service emits, via the CloudWatch agent on an Azure VM/AKS) | references/cloudwatch-omni/azure-ingestion/azure-ingestion.md (intent triage), then references/cloudwatch-omni/azure-ingestion/custom-telemetry.md (the CloudWatch-agent-on-VM/AKS procedure) |
| Send your application's own telemetry from Google Cloud (the logs/metrics/traces your service emits, via the CloudWatch agent on a GCE instance/GKE cluster) | references/cloudwatch-omni/gcp-ingestion/gcp-ingestion.md (intent triage), then references/cloudwatch-omni/gcp-ingestion/custom-telemetry.md (the CloudWatch-agent-on-GCE/GKE procedure) |
| Connect Slack to a Space for the first time | references/cloudwatch-omni/slack-integration.md |
| Connect the AWS DevOps Agent to a Space (Settings → Integrations → AWS DevOps Agent), an empty agent-space picker, or Investigations reporting the AWS DevOps Agent is not connected | references/cloudwatch-omni/devops-agent-integration.md. Creating the DevOps Agent space itself and running or chatting with investigations belong to the aws-agents-for-devsecops plugin |
| Whether a custom MCP tool server can be registered (Omni has none) | references/cloudwatch-omni/custom-mcp-integration.md |
Enable or configure CloudWatch Omni Intelligence for a Space — attach an optional customer-managed KMS key (put-intelligence-configuration), connect an intelligence integration (AWS_INTEGRATION, AWS_CONFIG_SLREC, EXTERNAL_AGENT), check current config, or troubleshoot enablement (404, AccessDenied, empty graph) | references/cloudwatch-omni/intelligence-setup.md |
Routing Rules
If the user is asking what Omni is, what a Domain or Space or grant means, where to start, or the end-to-end order of steps from nothing — rather than asking to perform one setup step — route to
references/cloudwatch-omni/app-basics.mdand answer the sequence from its "Setup order" section (not from a single procedure file such ascollector.md, which covers one step). It also carries the boundary against aws-observability. A question about one concept's rules — a Space's Region relative to its Domain, the rolescreate-spaceneeds — belongs to the procedure file for that concept (spaces-and-domains.md), which the routing table names.If the request is about instrumenting an AI agent project (adding OTel to a framework such as LangChain, LangGraph, Strands, CrewAI, OpenAI Agents, or Vercel AI), it is Omni — route to
references/cloudwatch-omni/omni-agents-instrumentation/omni-agents-instrumentation.md. There is no Application Signals path for an agent framework.If the request is about instrumenting a general application (a service on EC2, ECS, EKS, or Lambda in Python, Node.js, Java, or .NET — not an AI-agent framework), decide the product before opening any procedure file — the two paths are mutually exclusive on a workload:
Names Application Signals, ServiceEvents, a "monitored service", the service map, the
amazon-cloudwatch-observabilityadd-on, the CloudWatch Agent'sapplication_signalsconfiguration, or port 4316 → the CloudWatch path:references/cloudwatch/application-signals-onboarding.md, then the matchingreferences/cloudwatch/appsignals-guides/<platform>-<language>.md.Names Omni, Application Observability, a Space, a Domain, or a Dataset — or explicitly rules Application Signals out ("plain OTel", "no add-on", "no agent sidecar") → the Omni path:
references/cloudwatch-omni/instrumentation/instrumentation.md.Naming the CloudWatch Agent alone decides nothing: it is also the Omni path's default collector. An agent with an
opentelemetrysection or OTLP receivers on 4317/4318 is the Omni collector, and its delivery problems belong to rule 6.Names neither → rule 4.
If an instrumentation, ADOT, or collector request names neither product (neither Omni or a Space, nor Application Signals, ServiceEvents, or the
amazon-cloudwatch-observabilityadd-on), probe for a Space in the target Region before choosing.list-spacesis account-global: the--regionflag only selects the endpoint, and the response lists every Space in the account, each with its ownregion, so filter to the target Region rather than trusting a non-empty list:aws cloudwatchomni list-spaces --region <region> --query "items[?region=='<region>']". A Space in that Region → the Omni path,references/cloudwatch-omni/instrumentation/instrumentation.md. An empty filtered list → the customer has not adopted Omni in that Region, so Application Signals is the live product for them:references/cloudwatch/application-signals-onboarding.md. Either way the request stays in this skill — the probe picks the folder, not the skill. If the probe errors with an unknown service, that is the CLI model, not evidence Omni is absent — fall back to the customer's wording and ask only if still inconclusive.If the request is about Space/Domain creation or configuration, route to the matching setup reference. An authorization error that appears the moment a just-created Space is used is part of this — it is a space access role trust-policy problem (
create-spacenever verifies the role can be assumed), so route toreferences/cloudwatch-omni/spaces-and-domains.md→ "If the Space was created but cannot be used", not to the access-grants reference.If the user asks about getting telemetry to a destination — telemetry not yet reaching CloudWatch — deploy an OTel Collector on EC2/ECS/EKS so an instrumented workload has somewhere to send OTLP, and wire the app's
OTEL_EXPORTER_OTLP_ENDPOINTto it:references/cloudwatch-omni/instrumentation/collector.md. The same file covers an OTLP collector that is already deployed but whose telemetry does not arrive, in whole or for one signal (its Verify section and the platform guide's troubleshooting table). The collector exports straight to CloudWatch's own per-signal OTLP endpoints. If instead the telemetry is already in CloudWatch log groups and needs forwarding into the Dataset, route toreferences/cloudwatch-omni/data-forwarding-and-centralization.md. Both the collector's OTLP export and CloudWatch's OTLP endpoints authenticate with SigV4 (AWS credentials), including OIDC-federated credentials for a workload outside AWS (seereferences/cloudwatch-omni/azure-ingestion/custom-telemetry.mdorreferences/cloudwatch-omni/gcp-ingestion/custom-telemetry.md). A purely token-based ingestion path for a sender that cannot obtain AWS credentials at all is not covered by these skills; do not improvise one, and say so plainly.If the request is about getting Azure or Google Cloud telemetry into CloudWatch, route by cloud —
references/cloudwatch-omni/azure-ingestion/azure-ingestion.mdfor Azure,references/cloudwatch-omni/gcp-ingestion/gcp-ingestion.mdfor Google Cloud — and decide by intent. If the customer wants the telemetry their own application produces (the logs/metrics/traces from their code), that is supported via the CloudWatch agent on an Azure VM or AKS cluster, or on a GCE instance or GKE cluster — follow the reference. If they want telemetry their cloud's resources emit on their own (the equivalent of AWS VPC flow logs / Route 53 logs: Azure resource and platform logs, or Google Cloud Audit Logs), that is not supported — say so and do not attempt a setup. If the request names no cloud, ask which one before giving any steps.If the user asks to connect, enable, or authorize Slack for a Space for the first time (including granting the operator permission to use it), route to
references/cloudwatch-omni/slack-integration.md. Using Slack after it is connected (posting findings to a channel, mentioning the assistant, or searching Slack) happens in Slack and the console and is not covered by these skills; Slack as an alert notification target is covered by aws-observability's Omni alerts reference.Application Signals, ServiceEvents, and Dynamic Instrumentation are CloudWatch features, and they split by setup versus use — not by skill. Enabling them on a service that does not have them yet is setup and belongs here, under
references/cloudwatch/: Application Signals onboarding and ServiceEvents inreferences/cloudwatch/application-signals-onboarding.md(with the CI/CD metadata chain inreferences/cloudwatch/application-signals-cicd-metadata.md), and switching Dynamic Instrumentation on at instrumentation time in that same file's Step 5d. They must never appear in an Omni instrumentation change — for that they remain out of scope, and rule 3 is how you tell the two paths apart. Using them once the service reports — reading the service map, alarming on Application Signals metrics, or placing breakpoints and reading snapshots with Dynamic Instrumentation — is day-to-day work: STOP and route to aws-observability.If the user already has a working Space, or a service already reporting to Application Signals, and is asking about queries/dashboards/alarms/alerts/investigation, STOP and route to aws-observability.
If the user asks to register their own MCP tool server, connect a custom MCP server, or set up MCP authentication: CloudWatch Omni does not let customers add a custom MCP server. There is no console screen for it and the integration type is not enabled for customer use, so the attempt is refused. Say so plainly and stop; do not describe a setup flow, and do not offer a substitute. See
references/cloudwatch-omni/custom-mcp-integration.md.If the user asks to connect GitHub, link a GitHub organization or repositories, or enrich the application map from source code: CloudWatch Omni has no GitHub integration. Say so plainly and stop — do not walk through a setup. Do not offer a substitute: the Application Signals GitHub Action and the CloudWatch Logs GitHub audit-log source are separate CloudWatch features, not a way to connect GitHub to Omni, and a custom MCP server is not a GitHub integration. A GitHub-related feature found in public documentation is not evidence of an Omni GitHub integration.
If the user asks to enable or configure CloudWatch Omni Intelligence — attach or remove a customer-managed KMS key for intelligence data, add an intelligence integration (
AWS_INTEGRATION,AWS_CONFIG_SLREC, orEXTERNAL_AGENT), read the current intelligence configuration, or troubleshoot why it will not turn on (a 404UnknownOperationException, anAccessDeniedException, or an empty context graph) — route toreferences/cloudwatch-omni/intelligence-setup.md. That reference is the source of truth for the KMS ARN rules (full key ARN only,kms:Decrypt/kms:GenerateDataKey, exactly one of--kms-key-arn/--remove-kms-key, and that revoking the key makes intelligence data unrecoverable), the per-integration extra IAM, the two AccessDenied causes, and why "not enabled" is a 404 rather than an AccessDenied. Reading or interpreting the intelligence data once it is on is day-to-day use: STOP and route to the aws-observability skill — triaging insights, observations, or anomalies goes to itsintelligence.mdreference, which covers theListInsights/ListObservations/GetContextGraphoperations and the 404-vs-403-vs-local error rule; a pure topology or blast-radius question goes to itscontext-graph.mdreference. For Slack specifically, route toreferences/cloudwatch-omni/slack-integration.md; for a custom MCP server, route toreferences/cloudwatch-omni/custom-mcp-integration.md(not supported). Do not offer GitHub, PagerDuty, Teams,MODEL_PROVIDER, orCUSTOM_MCPas intelligence integration types.If the request names neither product — "add observability to my API", "how should I begin monitoring my workload", with no mention of Omni, a Space, a Domain, or of a CloudWatch feature — do not assume either one. Which product a customer wants to set up is their intent, not something the account's current state tells you, so ask, framed product versus product: CloudWatch Omni (Application/Agent Observability — Domains, Spaces, grants, a Dataset) or CloudWatch (log groups, alarms, Log Insights, Application Signals). Both answers are served here, from different reference folders, so this is a question about which product to set up — not about which skill to use, and not a reason to hand the request to aws-observability. In the same message, explain the boundary so they can choose — it is setup versus use: creating or configuring a Domain, Space, grant, or Access Profile, getting telemetry flowing for the first time, instrumenting an application or agent for Omni, and onboarding a service to Application Signals are all first-time setup and belong here; querying telemetry, building dashboards, configuring alarms or Omni alerts, investigating a live problem, and debugging with Dynamic Instrumentation are day-to-day use and belong to aws-observability. Do not start walking through Domain/Space creation or Application Signals onboarding until they confirm which product; having asked, stop and wait.
If the user asks to connect the AWS DevOps Agent to a Space, or the connect card or Investigations shows it is not connected, route to
references/cloudwatch-omni/devops-agent-integration.md. These skills cover only that Omni-side connection. Creating or configuring the DevOps Agent space, and running, following, or chatting with its investigations from a coding agent, belong to the agent's dedicatedaws-agents-for-devsecopsplugin; point the customer there rather than reconstructing that workflow.
Files
- ATTRIBUTION.mdAdded by AutoGineer960 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer67 B
- SKILL.md24.8 KiB
- references/cloudwatch-omni/access-grants.md84.2 KiB
- references/cloudwatch-omni/access-profiles.md27.1 KiB
- references/cloudwatch-omni/app-basics.md14.8 KiB
- references/cloudwatch-omni/azure-ingestion/azure-ingestion.md2.3 KiB
- references/cloudwatch-omni/azure-ingestion/custom-telemetry.md4.9 KiB
- references/cloudwatch-omni/custom-mcp-integration.md558 B
- references/cloudwatch-omni/data-forwarding-and-centralization.md21.2 KiB
- references/cloudwatch-omni/devops-agent-integration.md3.5 KiB
- references/cloudwatch-omni/gcp-ingestion/custom-telemetry.md7.0 KiB
- references/cloudwatch-omni/gcp-ingestion/gcp-ingestion.md2.0 KiB
- references/cloudwatch-omni/instrumentation/collector-ec2.md14.5 KiB
- references/cloudwatch-omni/instrumentation/collector-ecs.md12.3 KiB
- references/cloudwatch-omni/instrumentation/collector-eks.md22.8 KiB
- references/cloudwatch-omni/instrumentation/collector.md20.4 KiB
- references/cloudwatch-omni/instrumentation/ec2-dotnet.md18.4 KiB
- references/cloudwatch-omni/instrumentation/ec2-java.md11.0 KiB
- references/cloudwatch-omni/instrumentation/ec2-nodejs.md10.3 KiB
- references/cloudwatch-omni/instrumentation/ec2-python.md9.5 KiB
- references/cloudwatch-omni/instrumentation/ecs-dotnet.md14.8 KiB
- references/cloudwatch-omni/instrumentation/ecs-java.md9.2 KiB
- references/cloudwatch-omni/instrumentation/ecs-nodejs.md9.1 KiB
- references/cloudwatch-omni/instrumentation/ecs-python.md9.6 KiB
- references/cloudwatch-omni/instrumentation/eks-dotnet.md12.7 KiB
- references/cloudwatch-omni/instrumentation/eks-java.md8.3 KiB
- references/cloudwatch-omni/instrumentation/eks-nodejs.md8.8 KiB
- references/cloudwatch-omni/instrumentation/eks-python.md8.9 KiB
- references/cloudwatch-omni/instrumentation/instrumentation.md21.9 KiB
- references/cloudwatch-omni/instrumentation/lambda-dotnet.md9.8 KiB
- references/cloudwatch-omni/instrumentation/lambda-java.md8.2 KiB
- references/cloudwatch-omni/instrumentation/lambda-nodejs.md7.6 KiB
- references/cloudwatch-omni/instrumentation/lambda-python.md7.8 KiB
- references/cloudwatch-omni/intelligence-setup.md12.2 KiB
- references/cloudwatch-omni/omni-agents-instrumentation/instrument-crewai.md3.2 KiB
- references/cloudwatch-omni/omni-agents-instrumentation/instrument-langchain.md5.1 KiB
- references/cloudwatch-omni/omni-agents-instrumentation/instrument-langgraph.md4.1 KiB
- references/cloudwatch-omni/omni-agents-instrumentation/instrument-openai-agents.md6.0 KiB
- references/cloudwatch-omni/omni-agents-instrumentation/instrument-strands.md4.2 KiB
- references/cloudwatch-omni/omni-agents-instrumentation/instrument-vercel-ai.md502 B
- references/cloudwatch-omni/omni-agents-instrumentation/omni-agents-instrumentation.md33.8 KiB
- references/cloudwatch-omni/omni-agents-instrumentation/openinference-framework-guide.md4.3 KiB
- references/cloudwatch-omni/org-domains.md33.9 KiB
- references/cloudwatch-omni/slack-integration.md7.6 KiB
- references/cloudwatch-omni/spaces-and-domains.md35.3 KiB
- references/cloudwatch/application-signals-cicd-metadata.md6.5 KiB
- references/cloudwatch/application-signals-onboarding.md20.1 KiB
- references/cloudwatch/appsignals-guides/ec2-dotnet.md18.3 KiB
- references/cloudwatch/appsignals-guides/ec2-java.md12.4 KiB
- references/cloudwatch/appsignals-guides/ec2-nodejs.md20.9 KiB
- references/cloudwatch/appsignals-guides/ec2-python.md26.5 KiB
- references/cloudwatch/appsignals-guides/ecs-dotnet.md9.6 KiB
- references/cloudwatch/appsignals-guides/ecs-java.md6.9 KiB
- references/cloudwatch/appsignals-guides/ecs-nodejs.md7.9 KiB
- references/cloudwatch/appsignals-guides/ecs-python.md9.3 KiB
- references/cloudwatch/appsignals-guides/eks-dotnet.md5.3 KiB
- references/cloudwatch/appsignals-guides/eks-java.md5.3 KiB
- references/cloudwatch/appsignals-guides/eks-nodejs.md5.5 KiB
- references/cloudwatch/appsignals-guides/eks-python.md6.6 KiB
- references/cloudwatch/appsignals-guides/lambda-dotnet.md5.1 KiB
- references/cloudwatch/appsignals-guides/lambda-java.md5.6 KiB
- references/cloudwatch/appsignals-guides/lambda-nodejs.md6.4 KiB
- references/cloudwatch/appsignals-guides/lambda-python.md6.9 KiB
references/cloudwatch-omni/org-domains.md
Setting up a Domain for an AWS Organization
An org-scoped Domain is created once from the organization's management account and shared by every member account. Spaces are then created in member accounts under it. It is a separate operation family from the account-scoped Domain, with a different required role, a different deletion operation, and a prerequisite that lives in AWS Organizations rather than in Omni.
Not here yet if the customer already has an account-scoped Domain and only wants
a Space somewhere it does not allow (for example another Region under Identity
Center). Moving to an org Domain is then one option among several, and it starts by
deleting their Domain. Lay out the options from spaces-and-domains.md (Region
rules) first, and use this file only after they choose the org Domain.
Always state these, in any answer drawn from this file:
Trusted access for
observabilityadmin.amazonaws.commust be enabled in AWS Organizations first, and because that is an organization-wide change you MUST ask the customer before enabling it — even if they already said to proceed.
create-domain-for-organizationis management account only; a registered delegated administrator can do everything else but not that. An account-scoped Domain on the management account blocks an org Domain and must be deleted first, which is the customer's decision.A Domain grant is
ADMINonly and reaches every Space in the Domain, including future ones. PreferIDC_GROUP; do not useIAM_ROOTunless asked.Teardown order: every Space first, then the Domain, from its home Region, using
delete-domain-for-organization(delete-domainrejects an org Domain). Deleting the Domain removes its grants, so do not revoke them first.
Contents
Which path
What you get when setup completes
Prerequisites
Step 1 — Interview the customer first
Step 2 — Enable trusted access
Step 3 — Create the domain access role
Step 4 — Create the Domain
Step 5 — Create the Spaces
Step 6 — Grant Domain access
Verifying the setup
Cleanup
Troubleshooting
Security considerations
Additional resources
Which path
| The customer wants | Path |
|---|---|
| A Domain shared across an AWS Organization | Org-scoped — this file |
| A Domain for a single account | Account-scoped — see references/cloudwatch-omni/spaces-and-domains.md |
The two are mutually exclusive on the same account. A Domain of either scope already on the management account blocks creating the other.
Who may call what differs across the org operations. Establish the caller's account up front and match it against this table before calling anything:
| Operation | Eligible caller |
|---|---|
enable-aws-service-access on organizations | Management account only |
create-domain-for-organization | Management account only |
Every other *-for-organization operation | Management account, or a registered delegated administrator |
create-space | The member account that will own the Space, or the management account using credentials vended for that account |
Constraints:
You MUST confirm the caller is in the management account before attempting trusted access or
create-domain-for-organization. A delegated administrator can do everything else but neither of those.You MUST NOT use
create-domainordelete-domainon an org Domain. Those are the account-scoped operations and the service rejects the mismatch.
What you get when setup completes
A domain ID shaped
d-followed by up to 25 lowercase alphanumerics, a domain ARN, and a domain endpoint URL derived from the domain name.The Domain also reports the organization ID and the owner account ID, which is the management account.
A Space per member account per Region.
One or more domain access grants, each with a grant ID (a UUID), naming the principals who administer the Domain.
An org Domain ARN uses the resource type organization-domain, where an
account-scoped Domain uses domain. That difference is how you tell them apart in
a listing.
Quotas and scope rules to state up front:
One Domain per organization, keyed on the management account.
One Space per account per Region, unchanged from the account-scoped path.
A domain access grant applies to the whole Domain. It conveys access to every Space in the Domain, present and future — it is not scoped to one Space or one account.
Domain access grants carry exactly one permission and it is always
ADMIN. There is no read-only or scoped variant at the Domain level; narrower access is granted per Space.
Constraints:
You MUST tell the customer the domain name becomes part of the endpoint URL before they choose it.
You MUST tell the customer that a Domain-level grant reaches every Space in the organization's Domain and is
ADMIN-only. A customer who expects it to be limited to one account or one Space has misunderstood the blast radius.
Prerequisites
Trusted access for CloudWatch Observability Admin enabled in AWS Organizations. Step 2 checks and enables it. Without it every org operation fails authorization, and the failure does not name the missing prerequisite clearly.
A caller in the management account for trusted access and Domain creation.
An IAM role in the management account to pass as
domainAccessRoleArn. See Step 3.For an Identity Center Domain, the instance ARN. The Domain must be created in the instance's primary Region; the service verifies this.
Region rules:
An org Domain supports Spaces in Regions other than the Domain's own.
If the Domain uses Identity Center, a Space's Region must also be one the Identity Center instance is replicated to, with that Region's replication status
ACTIVE.aws sso-admin list-regions --instance-arn <idc-instance-arn>shows each Region and its status; a Region stillADDINGis rejected the same as one never added. Adding a Region (aws sso-admin add-region) changes the organization's Identity Center instance, so it is the customer's call: offer it alongside an already-replicated Region, and do not run it yourself.Not every Region is available for Spaces under a given org Domain. Confirm rather than assume, and read the rejection message when one comes back.
Constraints:
You MUST resolve trusted access before doing anything else. Every other failure mode in this document is easier to diagnose once it is ruled out.
You MUST NOT promise a Space in a given Region under an Identity Center org Domain without confirming Identity Center is replicated there.
Operations you will call
Every operation is an aws <service> <operation> CLI command, with the operation's
inputs passed as CLI flags (--kebab-key). Run it through the aws___call_aws
tool when that tool is available; otherwise run the same command in a shell. Policy documents appear below as standalone JSON blocks — pass each
as the corresponding flag value (--assume-role-policy-document).
aws organizations operations:
| Intent | Command |
|---|---|
| Check whether trusted access is enabled | aws organizations list-aws-service-access-for-organization |
| Enable trusted access | aws organizations enable-aws-service-access |
aws cloudwatchomni operations:
| Intent | Command |
|---|---|
| Discover which Domains exist, and of which scope | aws cloudwatchomni list-domains |
| Create the Domain | aws cloudwatchomni create-domain-for-organization |
| Read the Domain back | aws cloudwatchomni get-domain-for-organization |
| Change the Domain's name or providers | aws cloudwatchomni update-domain-for-organization |
| Delete the Domain | aws cloudwatchomni delete-domain-for-organization |
| List every Space across the organization | aws cloudwatchomni list-spaces-for-organization |
| Vend credentials for a member account | aws cloudwatchomni get-space-credentials-for-organization |
| Create a Space | aws cloudwatchomni create-space — requires BOTH --data-access-role-arn and --agent-core-evaluation-role-arn; see references/cloudwatch-omni/spaces-and-domains.md |
| Grant a principal Domain administration | aws cloudwatchomni create-domain-access-grant-for-organization |
| List Domain grants | aws cloudwatchomni list-domain-access-grants-for-organization |
| Read one Domain grant | aws cloudwatchomni get-domain-access-grant-for-organization |
| Revoke one Domain grant | aws cloudwatchomni delete-domain-access-grant-for-organization |
aws iam operations:
| Intent | Command |
|---|---|
| Create the domain access role | aws iam create-role |
| Attach a managed policy | aws iam attach-role-policy |
| Detach a managed policy | aws iam detach-role-policy |
| Delete the role | aws iam delete-role |
aws sso-admin operations:
| Intent | Command |
|---|---|
| Find the customer's Identity Center instances | aws sso-admin list-instances |
aws sts operations:
| Intent | Command |
|---|---|
| Confirm the calling identity and account | aws sts get-caller-identity |
Report the caller identity before starting, and confirm the account is the management account:
aws sts get-caller-identityStep 1 — Interview the customer first
Ask these in one message and wait for answers. Do not ask piecemeal, and do not default silently.
Region for the Domain?
Domain name? It becomes part of the endpoint URL. Lowercase letters, digits, and single hyphens between them; 3–63 characters.
Authorization provider — IAM, Identity Center, or both?
If Identity Center: the instance ARN. Also ask which Regions Spaces will be needed in, so replication can be checked before promises are made.
Domain access role — should the agent create a new role in the management account, or will the customer supply an existing role ARN? Recommend creating one.
Which member accounts need Spaces, and in which Regions? Also ask whether those accounts will create their own Spaces, or whether the management account should create them on their behalf.
Who administers the Domain? The principals to grant
ADMINto in Step 6.
Confirm the choices back in one line, then execute.
If the customer does not know their Identity Center instance ARN, look it up for them rather than sending them away to find it:
aws sso-admin list-instancesEach entry carries the instance ARN and its identity store ID. The public reference for this operation is sso-admin list-instances.
Constraints:
You SHOULD recommend creating the role rather than reusing one. Unlike the account-scoped path, the service actually attempts to assume this role at create time, so a role with the wrong trust policy fails the create outright.
You MUST ask which Regions Spaces are needed in when the Domain uses Identity Center. Discovering a Region is unavailable after the Domain exists means the Domain has to be recreated elsewhere or the Region abandoned.
You MUST tell the customer in this same message that a Domain-level grant reaches every Space in the Domain, so they choose the Step 6 principals accordingly.
Step 2 — Enable trusted access
Omni's organization operations depend on CloudWatch Observability Admin having
trusted access in AWS Organizations. The service principal is
observabilityadmin.amazonaws.com.
Check first
aws organizations list-aws-service-access-for-organizationThe response carries EnabledServicePrincipals, a list of entries each with a
ServicePrincipal and a DateEnabled. Look for observabilityadmin.amazonaws.com
among them. This call works from the management account or a registered delegated
administrator. The public reference is
organizations list-aws-service-access-for-organization.
Enable it if absent
Ask the customer before enabling — this changes an organization-wide setting.
Present the enable-aws-service-access command and get the customer's explicit
confirmation before running it; do not enable trusted access as an implied step of
the overall setup, because it affects every account in the organization.
aws organizations enable-aws-service-access --service-principal observabilityadmin.amazonaws.comThis call is management account only and returns no body. Re-run the check to confirm the principal now appears.
Constraints:
You MUST ask before enabling, and you MUST ask even when the customer has already told you to proceed. It is an organization-wide change affecting every account in the organization, their administrator may need to authorize it, and "go ahead" on the overall task is not consent for this specific change. Surface the command and wait.
You MUST use exactly
observabilityadmin.amazonaws.com. Do NOT usetelemetry-pipelines.observabilityadmin.amazonaws.com— that is a different principal for a different purpose and enabling it does not grant trusted access.If the check cannot be completed — access denied, or an ambiguous response — you MUST treat the result as inconclusive, not negative. Report that and stop. You MUST NOT enable trusted access on that basis.
If the enable call is denied, you MUST report that the caller is not in the management account and stop. A delegated administrator can read the setting but cannot change it.
Step 3 — Create the domain access role
This is the role the service assumes to operate on Spaces across the organization.
It MUST live in the management account, and unlike the account-scoped Space
role it is verified at create time — the service performs a real
sts:AssumeRole against it while handling create-domain-for-organization, and
the create fails if that does not succeed.
The ARN must match arn: followed by the partition, then
:iam::<management-account-id>:role/<role-name>, and be 20–2048 characters.
Create the role
Call create-role with AssumeRolePolicyDocument set to this trust policy. The
aws:SourceAccount and aws:SourceArn conditions are confused-deputy
protection — keep both. Note the resource type is organization-domain, not
domain.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudwatch.amazonaws.com"
},
"Action": ["sts:AssumeRole", "sts:TagSession", "sts:SetContext"],
"Condition": {
"StringEquals": {
"aws:SourceAccount": "<management-account-id>"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:cloudwatch:*:<management-account-id>:organization-domain/*"
}
}
}
]
}aws iam create-role --role-name <role-name> --assume-role-policy-document <trust-policy-json>Attach the managed policy
aws iam attach-role-policy --role-name <role-name> --policy-arn arn:aws:iam::aws:policy/CloudWatchOmniDomainAccessPolicyConstraints:
The role MUST be in the management account. A role in any other account is rejected, and the message names the management account requirement.
The
aws:SourceArnpattern MUST use theorganization-domainresource type and MUST stay wildcarded across Region and domain ID. The domain ID does not exist yet when the role is created, so a narrower pattern cannot match.You MUST NOT substitute a
*FullAccesspolicy or hand-write a broad inline policy. The Domain's permissions are defined by the managed policy above.You MUST NOT skip creating the role and hope
create-domain-for-organizationprovisions one. The role ARN is a required input.If the create-time assume check fails, you MUST report the trust policy as the cause and stop. Do NOT retry the Domain create — it will fail identically until the trust policy is fixed.
You MUST NOT attach the managed policy to a role the customer supplied without asking. They may be reusing it, and widening someone else's role is not yours to do.
Step 4 — Create the Domain
Check what already exists first
list-domains reports the Domains visible to the caller, of both scopes, and each
entry carries its ARN. Use the ARN's resource type to tell them apart —
organization-domain for an org Domain, domain for an account-scoped one. This
is the check to run when the customer has no domain ID yet.
aws cloudwatchomni list-domainsRead the result before creating anything:
An
organization-domainentry exists — the org Domain is already set up. Report its name and ID from the summary and its endpoint URL fromget-domain-for-organization(summaries do not carry it), confirm the customer wants to use it, and continue from Step 5 with itsdomainId.Only a
domainentry exists — an account-scoped Domain occupies the management account, and it blocks the org Domain. Tell the customer it must be deleted before an org Domain can be created, and that deleting it is their decision. Then stop. Do not create anything, and do not describe the situation merely as blocking.Nothing comes back — proceed.
Constraints:
You MUST run this check before
create-domain-for-organization.If an account-scoped Domain occupies the management account, you MUST say plainly that it has to be deleted before an org Domain can be created, and that deleting it is the customer's decision. Do NOT describe it vaguely as blocking.
You MUST distinguish the two ARN resource types rather than treating any returned Domain as the org Domain. Acting on an account-scoped Domain as though it were org-scoped produces confusing failures several steps later.
If the check cannot be completed — access denied, or an ambiguous response — you MUST treat the result as inconclusive, not negative. Report that and stop. You MUST NOT create a Domain on that basis.
Create it
For an IAM-only Domain:
aws cloudwatchomni create-domain-for-organization \
--name <domain-name> --identity-providers IAM \
--domain-access-role-arn arn:aws:iam::<management-account-id>:role/<role-name>For an Identity Center Domain, identityProviderConfiguration becomes
required and carries the instance ARN:
aws cloudwatchomni create-domain-for-organization \
--name <domain-name> --identity-providers IAM IDC \
--domain-access-role-arn arn:aws:iam::<management-account-id>:role/<role-name> \
--identity-provider-configuration '{"identityCenterConfiguration": {"identityCenterInstanceArn": "<idc-instance-arn>"}}'Capture domainId, domainArn, domainEndpointUrl, organizationId, and
ownerAccountId from the organizationDomain object in the response (the same
object get-domain-for-organization and update-domain-for-organization return).
Constraints:
You MUST create an Identity Center Domain in the instance's primary Region. The service verifies this; the rejection names the primary Region and the current Region, so read it rather than guessing.
You MUST capture
domainEndpointUrland give it to the customer. Every member account reaches Omni through it.
Step 5 — Create the Spaces
A Space lives in a member account. There are two ways to create one, and the choice was made in Step 1.
The Space itself — its name, its space access role, its encryption — works exactly
as it does under an account-scoped Domain. See
references/cloudwatch-omni/spaces-and-domains.md, picking up at its Space steps. The space
access role is still required and still belongs in the account that will own the
Space.
Path A — the member account creates its own Space
The member account calls create-space directly, passing the shared domainId.
Nothing about the call differs from the account-scoped path except that the Domain
was not created by that account.
Path B — the management account creates it on the member's behalf
The management account, or a registered delegated administrator, vends credentials for the target account and uses them to create the Space:
aws cloudwatchomni get-space-credentials-for-organization \
--context '{"domainId": "<domain-id>", "targetAccountId": "<target-account-id>"}' \
--credential-type SPACE_OPERATION--credential-type is required, and SPACE_OPERATION is its only value — always
pass it, and do not treat it as a choice to put to the customer. Omitting it is rejected
by the client before the request is sent.
The response carries temporary credentials for the target account. Use them to call
create-space against that account. Once a Space exists, credentials can be vended
for it directly by passing spaceId in the context instead of the
domainId/targetAccountId pair.
Enumerate what exists across the organization at any point:
aws cloudwatchomni list-spaces-for-organizationConstraints:
You MUST NOT tell a member account to call
create-domainfirst. The org Domain already exists and a second Domain in the member account is neither needed nor permitted alongside it.On Path B you MUST use the vended credentials for the
create-spacecall itself. Callingcreate-spacewith the management account's own credentials creates a Space in the management account, not the target account.Region availability is narrower than it looks. A Space may live in a Region other than the Domain's, but not every Region is available, and under an Identity Center Domain the Region must also be one Identity Center is replicated to.
Step 6 — Grant Domain access
A Domain with no grants has no administrators. Grant the principals the customer named in Step 1.
A grant applies to the entire Domain. It conveys administration of every Space in the Domain, including Spaces created later. There is no way to scope a Domain-level grant to one account or one Space — that is what per-Space grants are for.
aws cloudwatchomni create-domain-access-grant-for-organization \
--domain-id <domain-id> \
--name <grant-name> \
--principal '{"principalType": "<principal-type>", "principalId": "<principal-id>"}' \
--permission ADMINname is required: 1–64 characters matching ^[a-zA-Z0-9_-]+$. permission takes
the single value ADMIN. principalType is one of IDC_USER, IDC_GROUP,
IAM_USER, IAM_ROLE, or IAM_ROOT.
Capture the grant ID from the accessGrant object; it is what
delete-domain-access-grant-for-organization takes if a single grant needs
revoking later.
Review the grants with:
aws cloudwatchomni list-domain-access-grants-for-organization --domain-id <domain-id>Constraints:
permissionis a single value and it must beADMIN. The account-scoped permission values —READ,READ_WRITE_DELETE,SPACE_ADMIN, andCUSTOM— are not valid at the Domain level.You MUST state the blast radius when confirming a grant: the principal will administer every Space in the organization's Domain.
For an Identity Center Domain you SHOULD prefer
IDC_GROUPoverIDC_USER. Group membership changes without touching grants.You MUST NOT grant
IAM_ROOTunless the customer explicitly asks. It is the broadest principal available and rarely what they mean.
Verifying the setup
Read the Domain back rather than trusting the create response, and confirm the Spaces and grants landed:
aws cloudwatchomni get-domain-for-organization --domain-id <domain-id>
aws cloudwatchomni list-spaces-for-organization
aws cloudwatchomni list-domain-access-grants-for-organization --domain-id <domain-id>Then report to the customer, in one line: the domain endpoint URL, the domain ID, the organization ID, how many Spaces exist, and how many administrators were granted.
Constraints:
You MUST confirm at least one
ADMINgrant exists before declaring setup complete. A Domain nobody administers is not a working setup.
Cleanup
Order matters, and it spans accounts.
Every Space is deleted. The Domain cannot be deleted while any Space is associated with it. Use
list-spaces-for-organizationto enumerate what remains. A Space is deleted by its owning account, or by the management account using credentials vended throughget-space-credentials-for-organization.Delete the Domain, from its home Region — the Region it was created in:
aws cloudwatchomni delete-domain-for-organization --domain-id <domain-id>Use
delete-domain-for-organization, notdelete-domain— the account-scoped operation rejects an org Domain and tells you to use this one instead.Deleting the Domain removes its access grants. Do not revoke them first as hygiene; it is unnecessary work.
delete-domain-access-grant-for-organizationis for revoking one principal's access while the Domain stays in use.The domain access role — branch on who created it:
The agent created it in Step 3: detach the managed policy with
detach-role-policy, thendelete-role. A role with policies attached cannot be deleted.The customer supplied it: do NOT delete or modify it.
Trusted access can be left enabled. If the customer wants it off, that is an organization-wide change made through CloudWatch's own telemetry configuration controls rather than by disabling the Organizations integration directly.
Constraints:
You MUST delete every Space before the Domain, and you MUST say plainly which accounts are involved. Spaces in member accounts need either that account's credentials or credentials vended for it.
You MUST delete the Domain from its home Region. A delete from anywhere else is rejected and the message names the home Region.
You MUST use
delete-domain-for-organization.delete-domainrejects an org Domain and tells you to use this operation instead.Deleting Spaces is destructive. You MUST confirm with the customer first and say plainly that each Space's telemetry goes with it.
You SHOULD NOT disable trusted access as part of cleaning up a Domain. It is organization-wide and other CloudWatch features depend on it.
Troubleshooting
Rule: When a call returns an error, surface the error code and message verbatim, then map to the mitigation below. Do NOT invent error text, do NOT paraphrase what the service returned, and do NOT synthesize a mitigation for an error that is not listed.
| Error signal | Cause | Mitigation to surface |
|---|---|---|
| Authorization error stating trusted access is disabled | CloudWatch Observability Admin trusted access is not enabled for the organization | Run Step 2 — check with list-aws-service-access-for-organization and enable observabilityadmin.amazonaws.com. Nothing else works until it is on |
AccessDeniedException on enable-aws-service-access | Caller is not in the management account | Only the management account can enable trusted access. A delegated administrator can read the setting but not change it |
| Authorization error stating only the management account can create an organization domain | Caller is a member account or a delegated administrator | Domain creation must run from the management account. A delegated administrator can perform every other org operation |
ParamValidationError naming a missing required parameter on get-space-credentials-for-organization | credentialType was omitted — it is required, and the client rejects the call before sending it | Resend with --credential-type SPACE_OPERATION |
ValidationException that the management account ID could not be resolved | Caller is not in an organization, or trusted access is off | Confirm the account belongs to an organization and that trusted access is enabled |
ValidationException that domainAccessRoleArn must be a role in the management account | Role lives in a member account | Create the role in the management account. A member-account role cannot be used |
| An error stating the data access role could not be assumed, naming the trust policy | The create-time assume check failed | Fix the role's trust policy so the CloudWatch service can assume it, and confirm the aws:SourceArn uses the organization-domain resource type. Do NOT retry unchanged — it fails identically |
ConflictException naming a management account that already has a Domain | The management account already has a Domain. This fires whether that Domain is org-scoped or account-scoped — the two are mutually exclusive on one account | Run list-domains and read the ARN resource type. If it is organization-domain, use it. If it is domain, the account-scoped Domain must be deleted before an org Domain can be created. Do NOT retry the create |
ValidationException naming the Identity Center primary Region | Domain not being created in the instance's primary Region | Create the Domain in the primary Region the message names. list-instances on sso-admin shows the instances the caller can reach |
ValidationException that Identity Center is not replicated to a Region | A Space was requested in a Region where the Identity Center instance is not replicated | Nothing about the Domain or the request is wrong. Offer both and let the customer choose: create the Space in a Region already ACTIVE in sso-admin list-regions, or have the customer add that Region to the instance and retry once it reaches ACTIVE (see Region rules) |
| Error stating Spaces for organization domains must be created in the same Region as the organization domain | The target Region is not available for Spaces under this Domain | Create the Space in the Domain's Region, or ask the customer which Regions are enabled for Spaces in their organization |
| Error stating cross-account access requires management account or registered delegated administrator | Caller is an ordinary member account | Run the operation from the management account, or register the account as a delegated administrator |
| A Space appears in the management account instead of the target account | create-space was called with the management account's own credentials rather than the vended ones | Delete that Space, re-vend credentials with get-space-credentials-for-organization, and call create-space with those |
ResourceNotFoundException that the Domain is not an organization-scoped domain | delete-domain-for-organization was called on an account-scoped Domain | Use delete-domain for that Domain |
ValidationException that an organization-scoped domain cannot be deleted via DeleteDomain | Wrong deletion operation | Use delete-domain-for-organization |
| Error stating the Domain must be deleted from its home Region | Delete attempted from another Region | Retry from the Region named in the message |
ConflictException stating Spaces are still associated with the Domain | Spaces still exist under the Domain | Enumerate them with list-spaces-for-organization and delete each, then retry |
If the error does not match a row above, quote it verbatim, say it is unmapped, and ask the customer how to proceed.
Expectations that look like faults
Every org operation fails authorization at once. That is trusted access being off, not a permissions problem on the caller.
A Domain-level grant cannot be made read-only, or scoped to one account.
ADMINover the whole Domain is the only shape. Narrower access is granted per Space.A Space cannot be created in some Region. Region availability under an org Domain is narrower than it appears, and under an Identity Center Domain the Region must also have Identity Center replicated. Nothing about the Domain or the Space request is wrong.
Grants disappear when the Domain is deleted. That is expected — the service removes them with the Domain.
Security considerations
The domain access role is assumed for callers across the whole organization. It is the broadest role in this setup — keep both
aws:SourceAccountandaws:SourceArnconditions on its trust policy, keep theorganization-domainresource type pinned, and keep the role out of any workflow that does not need it.Keep the domain access role in the management account and nowhere else. The service requires this, and it keeps organization-wide capability from sitting in a member account.
A Domain access grant reaches every Space in the Domain. Treat it as an organization-wide grant, not an account-level one, and keep the list short.
Prefer
IDC_GROUPoverIDC_USERfor Domain administrators so that offboarding a person does not require finding and revoking their grant.Avoid
IAM_ROOTas a grant principal. Root has no session identity to attribute actions to.Credentials from
get-space-credentials-for-organizationare temporary and act in another account. Do not persist or log them, and do not reuse them beyond the operation they were vended for.Enumerate grants with
list-domain-access-grants-for-organizationperiodically.Delegated administrator is a standing organization-wide capability. Register only accounts the customer intends to keep in that role.
Trusted access is organization-wide and shared with other CloudWatch features. Enabling it is a deliberate decision for the organization administrator, not a side effect of setting up one Domain.
Additional resources
references/cloudwatch-omni/spaces-and-domains.md— account-scoped Domains, and the Space steps used under an org Domainreferences/cloudwatch-omni/instrumentation/collector.md— deploying a collector that exports to CloudWatch's OTLP endpoints, for telemetry not yet reaching CloudWatchreferences/cloudwatch-omni/data-forwarding-and-centralization.md— forwarding telemetry that is already in CloudWatch log groups into the Dataset
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs Python
Security
What our scanner noticed· Medium risk
- References to credential files
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- AWS
- Publisher
- AWS (Official)
- Source
- aws/agent-toolkit-for-aws · skills/specialized-skills/operations-skills/setting-up-cloudwatch-observability · commit 0a218f8
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by AWS.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download setting-up-cloudwatch-observability.zip