Splunk Observability Cloud <-> AWS Integration
Render-first skill that owns the entire AWSCloudWatch integration object in
Splunk Observability Cloud. The skill is standalone reusable and does not
require any other Splunk Observability skill to run, but it hands off to other
skills for adjacent surfaces (logs, Lambda APM, dashboards, detectors, OTel
collectors).
The workflow is render-first by default. Live API changes only happen when the
user explicitly asks for --apply.
Coverage Model
Every rendered section gets an explicit coverage status in
coverage-report.json:
api_apply — a documented public REST API supports create / update / delete /
validate (e.g. POST /v2/integration).
api_validate — a documented public REST API supports read or validation only
(e.g. preflighting ec2:DescribeRegions permission via the live integration's
reported region list).
deeplink — the skill renders a deterministic Splunk Observability Cloud UI
link and validates referenced data where an API allows (e.g. the AWS
guided-setup deeplink for AWS-managed Metric Streams).
handoff — the skill renders deterministic operator steps for cross-skill
workflows (e.g. logs path -> splunk-app-install for Splunk_TA_AWS).
not_applicable — the section does not apply to the chosen target (e.g.
Splunk-managed Metric Streams permissions when connection.mode is polling,
or any AWS integration on realm: us2-gcp because that realm is GCP-hosted
and has no AWS STS region mapping).
Safety Rules
- Never ask for Splunk Observability tokens, AWS access keys, or AWS secret
access keys in conversation.
- Never pass any secret on the command line or as an environment-variable
prefix.
- Use
--token-file for the Splunk Observability Cloud admin user API access
token. Token files must be chmod 600. Override only with
--allow-loose-token-perms (emits a WARN — use only for short-lived scratch
tokens).
- For
authentication.mode: security_token (GovCloud / China), use
--aws-access-key-id-file and --aws-secret-access-key-file. Both files
must be chmod 600.
- Reject direct secret flags:
--token, --access-token, --api-token,
--o11y-token, --admin-token, --sf-token, --external-id,
--aws-access-key-id, --aws-secret-access-key, --aws-secret-key,
--password.
- Prefer
SPLUNK_O11Y_REALM and SPLUNK_O11Y_TOKEN_FILE from the repo
credentials file when present; these store only realms and token-file
paths, never token values.
- Strip every secret from
00-09-*.md, apply-plan.json, payloads/,
current-state.json, state/apply-state.json, and any other rendered
artifact on disk. The Splunk Observability admin token is referenced as
${SPLUNK_O11Y_TOKEN_FILE} everywhere, never inlined.
- The renderer FAILs render when the operator passes the deprecated
enableLogsSync field with a clear pointer to the Splunk_TA_AWS handoff.
- The renderer FAILs render when
regions: [] (the canonical schema rejects an
empty list and Splunk highly discourages it because new AWS regions
auto-onboard and inflate cost).
bash skills/shared/scripts/write_secret_file.sh /tmp/splunk_o11y_token
helps the user create a token file without exposing the secret in shell
history.
Five-mode UX
| Mode |
Flag |
Purpose |
| quickstart |
--quickstart |
Single-shot: render + apply for the most common External-ID + Splunk-managed Metric Streams scenario. Always runs --discover first; pivots to --quickstart-from-live if an integration already exists. |
| render |
--render (default) |
Produces the numbered plan tree under --output-dir. Never touches live state. |
| discover |
--discover |
Read-only sweep that polls GET /v2/integration?type=AWSCloudWatch, writes current-state.json, and emits a drift-report.md against the rendered plan. |
| doctor |
--doctor |
Runs the troubleshooting catalog and emits doctor-report.md with prioritized fixes and the exact setup.sh --apply command for each fix. |
| apply |
--apply [SECTIONS] |
Applies the rendered plan; without arguments runs every section in dependency order; with --apply integration,iam,streams runs only the named sections. |
Plus quality-of-life flags:
--quickstart-from-live — turn the live integration into a template.observed.yaml
the operator can edit; never overwrites their template.example.
--explain — print the apply plan in plain English, no API calls; for
change-management approvals.
--rollback <section> — render (do not auto-run) the reverse-engineered
commands for steps that have a public reversible API.
--list-namespaces — print the supported AWS service / namespace catalog
(mirrors references/namespaces-catalog.md).
--list-recommended-stats — print the per-namespace per-metric stat catalog
used by collect_only_recommended_stats: true.
--privatelink-domain {legacy,new} — pick signalfx.com (default; matches
current Splunk-published PrivateLink doc) vs observability.splunkcloud.com
PrivateLink hostnames.
--cfn-template-url URL — override the default
https://o11y-public.s3.amazonaws.com/aws-cloudformation-templates/release/template_metric_streams_regional.yaml
(or the StackSets equivalent when metric_streams.use_stack_sets: true).
--accept-drift FIELD[,FIELD...] — needed for --apply when discover shows
the live integration differs from the rendered spec on a field with side
effects (e.g. flipping useMetricStreamsSync).
Primary Workflow
Collect non-secret values: realm, integration name, AWS account ID(s),
IAM role name, regions, services list (or all_built_in), connection
mode (polling vs Splunk-managed Metric Streams vs AWS-managed Metric
Streams), custom namespaces, multi-account toggle.
Create or update a JSON / YAML spec from template.example.
Render and validate:
bash skills/splunk-observability-aws-integration/scripts/setup.sh \
--render \
--spec skills/splunk-observability-aws-integration/template.example \
--output-dir splunk-observability-aws-integration-rendered
Review splunk-observability-aws-integration-rendered/:
README.md — TL;DR and ordered next-step commands.
architecture.mmd — Mermaid topology of the rendered integration.
00-prerequisites.md through 09-handoff.md — numbered per-section plans.
coverage-report.json — per-section coverage status.
apply-plan.json — apply ordering with idempotency keys (no secrets).
payloads/ — per-step request bodies for REST calls and CFN parameters.
aws/ — CloudFormation template stubs (regional or StackSets) and
Terraform .tf files for the AWS-side resources and the Splunk-side
integration object.
iam/ — per-use-case IAM JSON (foundation, polling, streams, tag-sync,
Cassandra-special-case, GovCloud security-token).
scripts/ — per-step apply scripts and cross-skill handoff drivers.
support-tickets/ — pre-filled tickets when Splunk Support is required.
Apply only when explicitly requested:
bash skills/splunk-observability-aws-integration/scripts/setup.sh \
--apply \
--spec skills/splunk-observability-aws-integration/template.example \
--realm us1 \
--token-file /tmp/splunk_o11y_admin_token
To run only a subset of sections:
bash skills/splunk-observability-aws-integration/scripts/setup.sh \
--apply integration,iam \
--spec my-aws-integration.yaml
Supported Sections
Specs use api_version: splunk-observability-aws-integration/v1 and can
include the following top-level blocks (full reference in
reference.md):
prerequisites — region/realm preflight, FedRAMP/GovCloud/GCP carve-out,
IAM permission check stubs, CFN template URL HTTP HEAD probe.
authentication — external_id or security_token mode, AWS account ID,
IAM role name, returned external ID.
connection — polling vs Splunk-managed vs AWS-managed vs Terraform-only
mode; pollRate, metadataPollRate, inactiveMetricsPollRate.
regions — explicit AWS region list (cannot be empty).
services — all_built_in / explicit / namespace_filtered /
custom_only; collect_only_recommended_stats; metric_stats_to_syncs;
namespace_sync_rules (for built-in AWS/* namespaces).
custom_namespaces — simple_list (serializes to customCloudwatchNamespaces)
OR sync_rules (serializes to customNamespaceSyncRules); they conflict.
sync_custom_namespaces_only toggle.
guards — enable_check_large_volume, ignore_all_status_metrics,
sync_load_balancer_target_group_tags, enable_aws_usage.
metric_streams — use_metric_streams_sync, managed_externally,
named_token, cloudformation, cloudformation_template_url,
use_stack_sets, terraform.
private_link — enable, endpoint_types, service_name_overrides.
terraform_provider — source (splunk-terraform/signalfx), version
(~> 9.0 default).
multi_account — enabled, control_account_id, member_accounts,
cfn_stacksets.
handoffs — lambda_apm, logs_via_splunk_ta_aws, dashboards,
detectors, otel_collector_for_ec2_eks.
Hand-offs to Other Skills
Out of Scope
- AWS log collection via the Splunk AWS log collector Lambda (handed off to
Splunk_TA_AWS; the enableLogsSync API field is deprecated and rejected
by the renderer).
- Lambda APM instrumentation via the OpenTelemetry Lambda layer (handed off to
splunk-observability-aws-lambda-apm-setup).
- Native O11y AWS dashboard / detector CRUD (handed off to
splunk-observability-dashboard-builder and
splunk-observability-native-ops).
- AppDynamics for AWS workloads (separate AppDynamics SaaS workflow).
- Splunk Cloud Platform Data Manager AWS log onboarding (different product;
Splunk Cloud Platform side, not Splunk Observability Cloud).
Validation
bash skills/splunk-observability-aws-integration/scripts/validate.sh \
--output-dir splunk-observability-aws-integration-rendered
Static checks: required-files, IAM JSON shape, secrets-leak scan across every
rendered file, CFN template URL HTTP HEAD probe (--live).
With --live: GET /v2/integration?type=AWSCloudWatch round-trip, drift
report against template.example.
See reference.md and the focused references under references/ for full
detail. The plan and corrections that produced this skill are recorded in
.cursor/plans/splunk_o11y_aws_integration_skill_*.plan.md.
Source: chambear2809/splunk-cisco-skills — distributed by TomeVault.
1---2name: chambear2809-splunk-cisco-skills-splunk-observability-aws-in3description: Splunk Observability Cloud <-> AWS Integration4---56# Splunk Observability Cloud <-> AWS Integration78Render-first skill that owns the entire `AWSCloudWatch` integration object in9Splunk Observability Cloud. The skill is **standalone reusable** and does not10require any other Splunk Observability skill to run, but it hands off to other11skills for adjacent surfaces (logs, Lambda APM, dashboards, detectors, OTel12collectors).1314The workflow is render-first by default. Live API changes only happen when the15user explicitly asks for `--apply`.1617## Coverage Model1819Every rendered section gets an explicit coverage status in20`coverage-report.json`:2122- `api_apply` — a documented public REST API supports create / update / delete /23 validate (e.g. `POST /v2/integration`).24- `api_validate` — a documented public REST API supports read or validation only25 (e.g. preflighting `ec2:DescribeRegions` permission via the live integration's26 reported region list).27- `deeplink` — the skill renders a deterministic Splunk Observability Cloud UI28 link and validates referenced data where an API allows (e.g. the AWS29 guided-setup deeplink for AWS-managed Metric Streams).30- `handoff` — the skill renders deterministic operator steps for cross-skill31 workflows (e.g. logs path -> `splunk-app-install` for `Splunk_TA_AWS`).32- `not_applicable` — the section does not apply to the chosen target (e.g.33 Splunk-managed Metric Streams permissions when `connection.mode` is `polling`,34 or any AWS integration on `realm: us2-gcp` because that realm is GCP-hosted35 and has no AWS STS region mapping).3637## Safety Rules3839- Never ask for Splunk Observability tokens, AWS access keys, or AWS secret40 access keys in conversation.41- Never pass any secret on the command line or as an environment-variable42 prefix.43- Use `--token-file` for the Splunk Observability Cloud admin user API access44 token. Token files must be `chmod 600`. Override only with45 `--allow-loose-token-perms` (emits a WARN — use only for short-lived scratch46 tokens).47- For `authentication.mode: security_token` (GovCloud / China), use48 `--aws-access-key-id-file` and `--aws-secret-access-key-file`. Both files49 must be `chmod 600`.50- Reject direct secret flags: `--token`, `--access-token`, `--api-token`,51 `--o11y-token`, `--admin-token`, `--sf-token`, `--external-id`,52 `--aws-access-key-id`, `--aws-secret-access-key`, `--aws-secret-key`,53 `--password`.54- Prefer `SPLUNK_O11Y_REALM` and `SPLUNK_O11Y_TOKEN_FILE` from the repo55 `credentials` file when present; these store only realms and token-file56 paths, never token values.57- Strip every secret from `00-09-*.md`, `apply-plan.json`, `payloads/`,58 `current-state.json`, `state/apply-state.json`, and any other rendered59 artifact on disk. The Splunk Observability admin token is referenced as60 `${SPLUNK_O11Y_TOKEN_FILE}` everywhere, never inlined.61- The renderer FAILs render when the operator passes the deprecated62 `enableLogsSync` field with a clear pointer to the `Splunk_TA_AWS` handoff.63- The renderer FAILs render when `regions: []` (the canonical schema rejects an64 empty list and Splunk highly discourages it because new AWS regions65 auto-onboard and inflate cost).66- `bash skills/shared/scripts/write_secret_file.sh /tmp/splunk_o11y_token`67 helps the user create a token file without exposing the secret in shell68 history.6970## Five-mode UX7172| Mode | Flag | Purpose |73|------|------|---------|74| quickstart | `--quickstart` | Single-shot: render + apply for the most common External-ID + Splunk-managed Metric Streams scenario. Always runs `--discover` first; pivots to `--quickstart-from-live` if an integration already exists. |75| render | `--render` (default) | Produces the numbered plan tree under `--output-dir`. Never touches live state. |76| discover | `--discover` | Read-only sweep that polls `GET /v2/integration?type=AWSCloudWatch`, writes `current-state.json`, and emits a `drift-report.md` against the rendered plan. |77| doctor | `--doctor` | Runs the troubleshooting catalog and emits `doctor-report.md` with prioritized fixes and the exact `setup.sh --apply` command for each fix. |78| apply | `--apply [SECTIONS]` | Applies the rendered plan; without arguments runs every section in dependency order; with `--apply integration,iam,streams` runs only the named sections. |7980Plus quality-of-life flags:8182- `--quickstart-from-live` — turn the live integration into a `template.observed.yaml`83 the operator can edit; never overwrites their `template.example`.84- `--explain` — print the apply plan in plain English, no API calls; for85 change-management approvals.86- `--rollback <section>` — render (do not auto-run) the reverse-engineered87 commands for steps that have a public reversible API.88- `--list-namespaces` — print the supported AWS service / namespace catalog89 (mirrors `references/namespaces-catalog.md`).90- `--list-recommended-stats` — print the per-namespace per-metric stat catalog91 used by `collect_only_recommended_stats: true`.92- `--privatelink-domain {legacy,new}` — pick `signalfx.com` (default; matches93 current Splunk-published PrivateLink doc) vs `observability.splunkcloud.com`94 PrivateLink hostnames.95- `--cfn-template-url URL` — override the default96 `https://o11y-public.s3.amazonaws.com/aws-cloudformation-templates/release/template_metric_streams_regional.yaml`97 (or the StackSets equivalent when `metric_streams.use_stack_sets: true`).98- `--accept-drift FIELD[,FIELD...]` — needed for `--apply` when discover shows99 the live integration differs from the rendered spec on a field with side100 effects (e.g. flipping `useMetricStreamsSync`).101102## Primary Workflow1031041. Collect non-secret values: realm, integration name, AWS account ID(s),105 IAM role name, regions, services list (or `all_built_in`), connection106 mode (polling vs Splunk-managed Metric Streams vs AWS-managed Metric107 Streams), custom namespaces, multi-account toggle.1081092. Create or update a JSON / YAML spec from `template.example`.1101113. Render and validate:112113 ```bash114 bash skills/splunk-observability-aws-integration/scripts/setup.sh \115 --render \116 --spec skills/splunk-observability-aws-integration/template.example \117 --output-dir splunk-observability-aws-integration-rendered118 ```1191204. Review `splunk-observability-aws-integration-rendered/`:121 - `README.md` — TL;DR and ordered next-step commands.122 - `architecture.mmd` — Mermaid topology of the rendered integration.123 - `00-prerequisites.md` through `09-handoff.md` — numbered per-section plans.124 - `coverage-report.json` — per-section coverage status.125 - `apply-plan.json` — apply ordering with idempotency keys (no secrets).126 - `payloads/` — per-step request bodies for REST calls and CFN parameters.127 - `aws/` — CloudFormation template stubs (regional or StackSets) and128 Terraform `.tf` files for the AWS-side resources and the Splunk-side129 integration object.130 - `iam/` — per-use-case IAM JSON (foundation, polling, streams, tag-sync,131 Cassandra-special-case, GovCloud security-token).132 - `scripts/` — per-step apply scripts and cross-skill handoff drivers.133 - `support-tickets/` — pre-filled tickets when Splunk Support is required.1341355. Apply only when explicitly requested:136137 ```bash138 bash skills/splunk-observability-aws-integration/scripts/setup.sh \139 --apply \140 --spec skills/splunk-observability-aws-integration/template.example \141 --realm us1 \142 --token-file /tmp/splunk_o11y_admin_token143 ```144145 To run only a subset of sections:146147 ```bash148 bash skills/splunk-observability-aws-integration/scripts/setup.sh \149 --apply integration,iam \150 --spec my-aws-integration.yaml151 ```152153## Supported Sections154155Specs use `api_version: splunk-observability-aws-integration/v1` and can156include the following top-level blocks (full reference in157[reference.md](reference.md)):158159- `prerequisites` — region/realm preflight, FedRAMP/GovCloud/GCP carve-out,160 IAM permission check stubs, CFN template URL HTTP HEAD probe.161- `authentication` — `external_id` or `security_token` mode, AWS account ID,162 IAM role name, returned external ID.163- `connection` — polling vs Splunk-managed vs AWS-managed vs Terraform-only164 mode; `pollRate`, `metadataPollRate`, `inactiveMetricsPollRate`.165- `regions` — explicit AWS region list (cannot be empty).166- `services` — `all_built_in` / `explicit` / `namespace_filtered` /167 `custom_only`; `collect_only_recommended_stats`; `metric_stats_to_syncs`;168 `namespace_sync_rules` (for built-in `AWS/*` namespaces).169- `custom_namespaces` — `simple_list` (serializes to `customCloudwatchNamespaces`)170 OR `sync_rules` (serializes to `customNamespaceSyncRules`); they conflict.171 `sync_custom_namespaces_only` toggle.172- `guards` — `enable_check_large_volume`, `ignore_all_status_metrics`,173 `sync_load_balancer_target_group_tags`, `enable_aws_usage`.174- `metric_streams` — `use_metric_streams_sync`, `managed_externally`,175 `named_token`, `cloudformation`, `cloudformation_template_url`,176 `use_stack_sets`, `terraform`.177- `private_link` — `enable`, `endpoint_types`, `service_name_overrides`.178- `terraform_provider` — `source` (`splunk-terraform/signalfx`), `version`179 (`~> 9.0` default).180- `multi_account` — `enabled`, `control_account_id`, `member_accounts`,181 `cfn_stacksets`.182- `handoffs` — `lambda_apm`, `logs_via_splunk_ta_aws`, `dashboards`,183 `detectors`, `otel_collector_for_ec2_eks`.184185## Hand-offs to Other Skills186187- AWS log ingestion -> `bash skills/splunk-app-install/scripts/install_app.sh188 --source splunkbase --app-id 1876` (Splunk Add-on for AWS, Splunkbase 1876,189 min v8.1.1). Renderer preflights for `Splunk_TA_amazon_security_lake` and190 emits an uninstall step before the v7+ upgrade.191- Log Observer Connect to surface those logs in O11y ->192 [`splunk-observability-cloud-integration-setup`](../splunk-observability-cloud-integration-setup/SKILL.md).193- Native O11y dashboards for AWS namespaces ->194 [`splunk-observability-dashboard-builder`](../splunk-observability-dashboard-builder/SKILL.md).195- Detectors / AutoDetect alerting ->196 [`splunk-observability-native-ops`](../splunk-observability-native-ops/SKILL.md).197- OTel collector on EC2 / EKS for richer host telemetry than `CWAgent` ->198 [`splunk-observability-otel-collector-setup`](../splunk-observability-otel-collector-setup/SKILL.md).199- Lambda APM via the Splunk OpenTelemetry Lambda layer (publisher200 `254067382080`) ->201 [`splunk-observability-aws-lambda-apm-setup`](../splunk-observability-aws-lambda-apm-setup/SKILL.md).202 Renderer emits a hand-off stub in `09-handoff.md`.203204## Out of Scope205206- AWS log collection via the Splunk AWS log collector Lambda (handed off to207 `Splunk_TA_AWS`; the `enableLogsSync` API field is deprecated and rejected208 by the renderer).209- Lambda APM instrumentation via the OpenTelemetry Lambda layer (handed off to210 [`splunk-observability-aws-lambda-apm-setup`](../splunk-observability-aws-lambda-apm-setup/SKILL.md)).211- Native O11y AWS dashboard / detector CRUD (handed off to212 `splunk-observability-dashboard-builder` and213 `splunk-observability-native-ops`).214- AppDynamics for AWS workloads (separate AppDynamics SaaS workflow).215- Splunk Cloud Platform Data Manager AWS log onboarding (different product;216 Splunk Cloud Platform side, not Splunk Observability Cloud).217218## Validation219220```bash221bash skills/splunk-observability-aws-integration/scripts/validate.sh \222 --output-dir splunk-observability-aws-integration-rendered223```224225Static checks: required-files, IAM JSON shape, secrets-leak scan across every226rendered file, CFN template URL HTTP HEAD probe (`--live`).227228With `--live`: `GET /v2/integration?type=AWSCloudWatch` round-trip, drift229report against `template.example`.230231See `reference.md` and the focused references under `references/` for full232detail. The plan and corrections that produced this skill are recorded in233`.cursor/plans/splunk_o11y_aws_integration_skill_*.plan.md`.234235---236> Source: [chambear2809/splunk-cisco-skills](https://github.com/chambear2809/splunk-cisco-skills) — distributed by [TomeVault](https://tomevault.io).237<!-- tomevault:4.0:skill_md:2026-05-22 -->