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/access-profiles.md
Bounding a workload with an Access Profile
An Access Profile limits what CloudWatch Omni is allowed to do on a customer's behalf when it acts without a person present. Everything that runs under a profile is an async workload — an alert running an investigation, with no user in the loop to approve what it does, which is why the profile is the boundary it operates inside.
A profile is a named container, nothing more. Creating one grants no
permissions: create-access-profile takes only the Space, a name, and a
description — there is no permission, action, or resource-scope input on the create
call at all. What makes a profile useful is two sets of access grants: grants that
say what the profile can do, and grants that say which workloads may assume it — plus
the workload itself naming the profile. All three are described below, and none is
optional.
Always state these, in any answer drawn from this file: that a profile carries no permissions of its own, and that
create-access-profileaccepts only a Space, a name, and a description — no scoping input of any kind, so creating one by itself produces an empty container; that it needs BOTH a permission grant (principalACCESS_PROFILE) and a trust grant (principal the workload); that a trust grant for an alert MUST useprincipalIdALLfor the alert to be creatable, on aCUSTOMgrant carrying only the assume action; that the profile ARN must be taken from the API response rather than assembled by hand; that an invalid permission value is rejected with a message naming the supported set; and that profile names are unique within a Space.
Contents
Which path
How a profile actually works
Prerequisites
Step 1 — Interview the customer first
Step 2 — Create the profile
Step 3 — Give the profile its permissions
Step 4 — Let the workload assume the profile
Step 5 — Bind the profile to the workload
Verifying the setup
Cleanup
Troubleshooting
Security considerations
Additional resources
Which path
| The customer wants | Path |
|---|---|
| To limit what an alert can do on their behalf | This file |
| To give a person or an IAM identity access to a Space | references/cloudwatch-omni/access-grants.md |
| To administer a Domain across an organization | references/cloudwatch-omni/org-domains.md |
A profile is not a way to give people access. Its principals are workloads.
Constraints:
You MUST NOT create an Access Profile to grant a person or a team access. Grant them directly — see
references/cloudwatch-omni/access-grants.md.You MUST NOT treat a profile as an administrative role. The service refuses to grant administrative actions to a profile.
How a profile actually works
Three pieces have to line up. A profile with any of them missing fails closed, and the failure surfaces when the workload runs rather than when the profile was set up.
The profile — a name in a Space. Carries no permissions of its own.
Permission grants — access grants whose principal is the profile. These define what the profile can do. Without them the workload assumes the profile successfully and is then permitted nothing.
Trust grants — access grants whose principal is the workload, carrying the action that lets it assume the profile, scoped to the profile itself. Without them the workload cannot assume the profile at all. A trust grant uses
ALLto cover every alert in the Space, which is what an alert needs to be created at all, or names one existing alert by its ARN.
get-access-profile does not report either set — it returns only the profile itself
(profileId, spaceId, arn, name, description, createdAt, updatedAt,
assumeStatus, profileType). Read the two sets from the grants: permission grants
with list-access-grants --space-id <space-id> --principal-type ACCESS_PROFILE --principal-id <profile-id>, and trust grants by listing the Space's grants and
keeping those whose scope names the profile ARN. Reviewing them as two lists is the
quickest way to see which piece is missing.
Finally, the workload has to name the profile. Nothing binds a profile to a workload implicitly, and there is no separate bind operation — the profile's ID is a field on the workload's own configuration.
Constraints:
You MUST complete all of Steps 2 through 5. Stopping after creating the profile produces something that looks configured and does nothing.
You MUST explain the two grant kinds to the customer as separate things. A customer who creates only permission grants will see the workload fail to assume the profile; one who creates only trust grants will see it assume the profile and then be denied everything. The two failures look nothing alike.
Prerequisites
The Space's
spaceId, and thedomainIdfor creating grants. Seereferences/cloudwatch-omni/spaces-and-domains.mdif the Space does not exist.A grant of your own that permits managing grants in that Domain. Both grant kinds below require it.
The workload's identifier —
ALL, or an existing alert's ARN. Trust grants are keyed on it, and never on the alert's name.
Constraints:
You MUST have the workload's identifier before Step 4. A trust grant cannot be written against a workload that has not been named, and creating the workload first will fail if its profile has no trust grant yet.
Operations you will call
Every operation is an aws <service> <operation> CLI command — here
aws cloudwatchomni <operation>, with each input passed as a CLI flag (top-level keys
become --kebab-case flags, and nested objects and arrays of objects are passed as
single-quoted JSON strings). Run it through the aws___call_aws
tool when that tool is available; otherwise run the same command in a shell.
aws cloudwatchomni (CloudWatch Omni control-plane operations):
| Intent | CLI command |
|---|---|
| Check which profiles exist in the Space | aws cloudwatchomni list-access-profiles |
| Create the profile | aws cloudwatchomni create-access-profile |
| Read the profile (ID, ARN, name, description, status — not its grants) | aws cloudwatchomni get-access-profile |
| Rename the profile or change its description | aws cloudwatchomni update-access-profile |
| Delete the profile | aws cloudwatchomni delete-access-profile |
| Create a permission grant or a trust grant | aws cloudwatchomni create-access-grant |
| Review the grants involved | aws cloudwatchomni list-access-grants |
| Revoke a grant | aws cloudwatchomni delete-access-grant |
Step 1 — Interview the customer first
Ask these in one message and wait for answers. Do not ask piecemeal, and do not default silently.
Which Space? The
spaceId, and thedomainId.What workload is being bounded? Which alert — and its identifier.
What should that workload be allowed to do? Ask in terms of the task, not in terms of actions. This becomes the permission grant in Step 3.
A name for the profile? 1–256 characters, and unique within the Space. Something that describes the boundary rather than the workload, since one profile can serve several workloads.
A description? Optional, up to 1024 characters. Worth having — a profile's purpose is not evident from its grants.
Which alerts will run under this profile? Useful context for naming and for Step 5, but it does not change the trust grant: an alert cannot be created unless the trust grant uses
ALL. See Step 4.
Confirm the choices back in one line, then execute.
Constraints:
You MUST ask question 3 in terms of the task the workload performs. A customer asked which actions to grant will over-grant, and the whole point of a profile is the boundary.
You SHOULD name the profile after the boundary it expresses rather than after one workload. Several workloads can share a profile, and a profile named for one of them becomes misleading.
Step 2 — Create the profile
Check what exists first
Profile names are unique within a Space, so a duplicate name conflicts. An existing profile may also already express the boundary the customer wants.
aws cloudwatchomni list-access-profiles --space-id <space-id>If a suitable profile exists, report it and confirm the customer wants to reuse it rather than creating another. Reusing means skipping to Step 4.
Create it
aws cloudwatchomni create-access-profile --space-id <space-id> --name <profile-name> --description <description>Capture both the profile ID and the profile ARN from the accessProfile object in
the response (the same object get-access-profile and update-access-profile return). Step 3 needs the ID, and Step 4 needs the ARN. The ARN takes the form
arn:aws:cloudwatch:<region>:<account-id>:access-profile/<profile-id> — read it
from the response rather than assembling it.
Constraints:
You MUST run the existence check first. A name collision is rejected, and the message names the profile that already holds it.
create-access-profileaccepts no permissions, no actions, and no resource scopes. You MUST NOT look for a scoping parameter here or report the profile as configured once it exists.
Step 3 — Give the profile its permissions
This is an ordinary access grant whose principal is the profile — the permission
grant. Everything the workload will be allowed to do comes from this one grant, so it
is the entire security boundary of the profile: a named permission (READ,
READ_WRITE_DELETE) or CUSTOM with scopedActions applies here, on the
permission grant, not on the trust grant in Step 4. Three things about it matter:
principalTypeisACCESS_PROFILEandprincipalIdis the profile's ID — not a user, and not the workload.This grant is the profile's entire boundary. Anything it permits, the workload can do unattended, so grant the narrowest permission that lets it do its job. It bounds what runs under this profile — not everything the principal can do: the same
ALERTprincipal may also hold its own direct grants on the Space, which this profile does not constrain. When reviewing what a workload can reach, checklist-access-grantsfor that principal too.Administrative actions cannot be granted to a profile. The service rejects them.
aws cloudwatchomni create-access-grant --domain-id <domain-id> --space-id <space-id> \
--name <grant-name> \
--principal '{"principalType": "ACCESS_PROFILE", "principalId": "<profile-id>"}' \
--permission READUse CUSTOM with scopedActions when a named permission is broader than the
workload needs. The permission model, the action format, and resource narrowing all
work exactly as described in references/cloudwatch-omni/access-grants.md — including
its one exception: a DataSet scope cannot be narrowed with resourceArns (a dataset
ARN is rejected with Invalid observe resource type in ARN). To confine an alert or
agent profile to one signal, such as traces only, scope the DataSet entry with
signalTypes (TRACES) together with rowScopeGroups — the two must be present
together, so give rowScopeGroups a condition that matches every record you want it
to see.
Constraints:
You SHOULD grant the profile the narrowest permission that lets the workload do its job. This grant is the entire boundary of the profile — anything it permits, the workload can do unattended. It is not the whole of what the principal can reach: the same principal may also hold direct grants on the Space, which the profile does not constrain.
You MUST NOT grant administrative actions to a profile. The service rejects it.
You MUST NOT skip this step on the assumption that the trust grant in Step 4 also conveys permissions. It does not. A profile with only a trust grant is assumable and permitted nothing.
Step 4 — Let the workload assume the profile
The workload needs its own grant, carrying the action that permits assuming a profile. Without it the workload cannot assume the profile, and the failure appears when the workload is created or when it next runs.
This grant is always CUSTOM, it carries the assume action and nothing else, and it
is scoped to the profile's own ARN so it cannot be used to assume any other profile.
The trust grant must use ALL
principalId MUST be ALL. An alert's ID is minted by the service when the alert
is created, so create-alert authorizes the ALERT principal against the wildcard
alert ARN — arn:<partition>:cloudwatch:<region>:<account-id>:alert/* — and only a
grant on ALL matches a wildcard. A grant naming one alert cannot satisfy that check,
because the alert it names does not exist yet.
ALL is accepted for ALERT only; every other principal type rejects it. The scope
to the profile ARN still applies, so the grant is broad in who may assume and narrow in
what they may assume. Take <access-profile-arn> from the create-access-profile
response (or get-access-profile) — never assemble it by hand, because a hand-built ARN
that is off by one segment is accepted and then matches nothing:
aws cloudwatchomni create-access-grant --domain-id <domain-id> --space-id <space-id> \
--name <grant-name> \
--principal '{"principalType": "ALERT", "principalId": "ALL"}' \
--permission CUSTOM \
--scoped-actions '[{"actions": ["cloudwatch:AssumeAccessProfile"], "resources": [{"resourceType": "AccessProfile", "resourceArns": ["<access-profile-arn>"]}]}]'Never key a trust grant to an alert's name. The identity an alert presents is its
ARN, so a name-keyed grant is accepted with a 200 and then matches nothing, at create
time or afterwards. It is inert in every state.
Narrowing after the alert exists
Once the alert exists it has a concrete ARN, and the runtime assume is keyed on that
ARN. You may then replace the ALL grant with one naming that alert, using the ARN
create-alert returned:
aws cloudwatchomni create-access-grant --domain-id <domain-id> --space-id <space-id> \
--name <grant-name> \
--principal '{"principalType": "ALERT", "principalId": "<alert-arn>"}' \
--permission CUSTOM \
--scoped-actions '[{"actions": ["cloudwatch:AssumeAccessProfile"], "resources": [{"resourceType": "AccessProfile", "resourceArns": ["<access-profile-arn>"]}]}]'Revoke the ALL grant only after the narrower grant is in place, and only if no further
alert needs to be created under this profile — creating the next one requires ALL
again.
Constraints:
The trust grant MUST be
CUSTOM, MUST carry only the assume action, and MUST be scoped to the profile's ARN withresourceTypeAccessProfile. An unscoped trust grant lets the workload assume any profile in the Space, which defeats the point of having a boundary.You MUST take the ARN from the profile's own response rather than assembling it. The ARN's service segment must match the service's vendor code, and a hand-built ARN is the usual way that goes wrong.
The trust grant MUST use
principalIdALL. Do NOT offer an alert's name as an alternative, and do NOT ask the customer to choose betweenALLand a named alert before the alert exists —ALLis the only value that lets the alert be created.ALLis accepted only forALERT, and only on aCUSTOMgrant carrying only the assume action. Any other use is rejected.The action prefix MUST match the service's vendor code. If the grant is rejected on the prefix, use the one the message names.
You MUST NOT add other actions to a trust grant. Whatever the workload should be able to do belongs on the profile in Step 3, not here.
Step 5 — Bind the profile to the workload
The workload names the profile. There is no separate operation for this — the profile's ID is a field on the workload's own configuration, set when the workload is created or updated. For an alert, it is part of the alert's setup.
Because the binding lives on the workload, this step happens in whichever setup flow creates that workload rather than here.
Constraints:
You MUST complete Steps 3 and 4 before the workload is created. Some workloads validate the trust grant at creation time and refuse to be created without it.
You MUST NOT report the profile as in effect until a workload names it. An unbound profile with both grants in place still does nothing.
Verifying the setup
Read the two grant sets back. get-access-profile does not report grants — it returns
only the profile's own fields — so read them from list-access-grants:
# Permission grants — what the profile can do
aws cloudwatchomni list-access-grants --space-id <space-id> --principal-type ACCESS_PROFILE --principal-id <profile-id>
# Trust grants — who may assume it: grants whose scope names the profile ARN
aws cloudwatchomni list-access-grants --space-id <space-id>For the trust grants, read each candidate grant's detail with get-access-grant and
keep those whose scopedActions resources name the profile ARN. Confirm there is at
least one grant in each set. Then report to the customer, in one
line: which workload is bounded, what the profile permits, and which Space it is in.
Constraints:
You MUST confirm both sets are non-empty before declaring the setup complete. One empty set is the single most common way this configuration fails, and it fails silently until the workload runs.
Cleanup
In every answer from this section: state that profile names are unique within a Space, so reusing a deleted profile's name is fine but a name still in use will be rejected as a conflict. Say this even when the customer only asked how to delete.
Deleting a profile is not blocked by the grants that reference it, and it is not reversible. Profile names are unique within a Space, so re-creating a profile under the same name after deleting it works, but creating a second one alongside it conflicts.
Two things follow from how the delete behaves, and both belong in any answer about it:
The profile's own permission grants go with it. A grant whose
principalTypeisACCESS_PROFILEand whoseprincipalIdis this profile has no subject once the profile is gone, so the delete removes those grants for you. You do not need to revoke them first, and the delete is not rejected if you don't.Trust grants that name the profile survive. A grant whose principal is an
ALERTand whose resource scope names the profile's ARN is left in place: it can carry other resources, and profile IDs are never reused. If the workload is going away too, revoke those separately.
List the grants that reference the profile (
get-access-profiledoes not report them), and confirm the deletion with the customer:aws cloudwatchomni list-access-grants --space-id <space-id> --principal-type ACCESS_PROFILE --principal-id <profile-id>Trust grants naming the profile ARN are found by listing the Space's grants and reading each candidate's
scopedActionswithget-access-grant.Delete the profile:
aws cloudwatchomni delete-access-profile --space-id <space-id> --profile-id <profile-id>Revoke any trust grants that named it, if their workload is going away too:
aws cloudwatchomni delete-access-grant --grant-id <grant-id>
Constraints:
You MUST tell the customer the delete is immediate and takes the profile's own permission grants with it. You MUST NOT present revoking them as a precondition, and MUST NOT say the delete is rejected while grants exist — it is not.
You MUST state that trust grants naming the profile's ARN are left behind, and revoke them separately when the workload is going away too.
You MUST check whether any workload still names this profile before deleting it. Removing a profile a live alert depends on breaks that workload, and the breakage appears the next time it runs rather than now.
You MUST NOT delete a profile to "reset" it. Renaming or re-granting is non-destructive; deleting requires unwinding every workload that names it.
Troubleshooting
Diagnose from the grants first. get-access-profile does not report grants. List
the permission grants with list-access-grants --space-id <space-id> --principal-type ACCESS_PROFILE --principal-id <profile-id>, and the trust grants by listing the
Space's grants and keeping those whose scope names the profile ARN — an empty set names
the missing piece immediately. Reach for that before reasoning from the symptom.
Three states account for nearly every profile complaint, and a complete answer names all three:
Can assume, then everything is denied — the permission grant (principal
ACCESS_PROFILE, Step 3) is missing or too narrow.Cannot assume at all — the trust grant (Step 4:
CUSTOM,AssumeAccessProfile, scoped to the profile ARN,principalIdALLfor alerts) is missing.Both grants present, still no effect — no workload names the profile (Step 5). A profile with a complete permission grant and a complete trust grant still does nothing until an alert, agent, or integration is bound to it.
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 |
|---|---|---|
| Conflict stating a profile with that name already exists in the Space | Profile names are unique per Space | Read the existing profile with list-access-profiles and either reuse it or pick another name |
| The profile's permission grants are gone after deleting the profile | Expected. The delete removes the grants where the profile was the principal | Nothing to fix. Trust grants that named the profile's ARN are still there and are revoked separately |
| An authorization error stating the caller is not authorized to assume the access profile | No trust grant exists for that workload, or it names a different profile | Create the trust grant from Step 4 for that workload's type and identifier |
| An error naming an alert and stating it does not have trust to assume the profile | The alert was created before its trust grant existed | Create the trust grant with principalType ALERT, principalId set to ALL, and the assume action, then retry creating the alert |
ValidationException that access profiles cannot be granted admin actions | An administrative action was requested in the Step 3 permission grant | Remove the administrative actions. A profile bounds a workload; it does not administer the Space |
ValidationException that a wildcard principal identifier is not supported for this principal type | ALL was used with a type other than ALERT | Name the principal explicitly. ALL is only available for ALERT |
ValidationException that type-scoped workload grants must be CUSTOM with the assume action | An ALL grant carried a named permission, or extra actions | Resend as CUSTOM carrying only the assume action |
ValidationException that the action prefix must match the service vendor code | The assume action was written with the wrong prefix | Use the prefix the message names |
ConflictException that an active grant already exists for the principal | The trust or permission grant is already in place | Read it with list-access-grants. Nothing further is needed for that grant |
ValidationException about a malformed ARN | The profile ARN in the trust grant's resource scope is not a well-formed ARN | Read the ARN from get-access-profile and use it as returned. Do not assemble it by hand |
ValidationException that the ARN service segment must match the service vendor code | The ARN was hand-built with the wrong service segment | Use the ARN the API returned, or the prefix the message names |
ResourceNotFoundException on get-access-profile | Wrong profileId, or the profile is in a different Space | Both spaceId and profileId are required and must match. Re-read with list-access-profiles |
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
The workload assumes the profile and then can do nothing. The trust grant exists but the permission grant does not. Step 3 is missing.
The workload cannot assume the profile at all. The permission grant exists but the trust grant does not. Step 4 is missing.
Creating the profile appeared to do nothing. It did nothing on purpose. A profile carries no permissions until grants reference it.
A profile with both grants still has no effect. No workload names it. The binding lives on the workload, not on the profile.
create-access-profilehas no scoping parameters. That is the design. Scope comes from grants.A newly created alert works but an older one does not. A grant narrowed to one alert's ARN does not cover others.
ALLcovers every alert, including future ones, and is what a new alert needs at create time.
Security considerations
The permission grant on a profile is the entire boundary for anything running under it, unattended and without a person to notice. Grant the narrowest permission that lets the workload do its job. When you audit what a workload can reach, check the principal's own grants too (
list-access-grants) — the profile bounds what runs under the profile, not everything that principal holds.Trust grants and permission grants do different things and should be reviewed separately. A broad trust grant with a narrow permission grant is usually fine; a narrow trust grant with a broad permission grant is not.
ALLis a standing trust for alerts that do not exist yet, and it is required to create an alert at all — so the boundary that matters is the profile ARN scope on the trust grant and the permission grant in Step 3, not the breadth of the principal. Where a customer wants a tighter principal, narrow to the alert's ARN after it exists.One profile per boundary, not one per workload. Several workloads sharing a profile is the intended pattern and keeps the number of grants reviewable.
A profile's name and description are the only human-readable record of what the boundary is for. Write the description.
Review profiles and their grants with
list-access-profilesandget-access-profileperiodically. A profile whose workloads were deleted keeps its grants and remains assumable by anything still trusted.
Additional resources
references/cloudwatch-omni/access-grants.md— the permission model, action format, and resource narrowing used by both grant kinds abovereferences/cloudwatch-omni/spaces-and-domains.md— creating the Space a profile lives inreferences/cloudwatch-omni/org-domains.md— Domain-wide administration across an organization
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