Splunk Observability Cloud <-> AWS Integration
Prerequisites
| Tool or access |
Purpose |
Verify |
| Bash and Python 3 |
Run bundled setup and validation helpers |
bash --version && python3 --version |
| Required product/platform access |
Inspect or configure the selected target |
Complete the documented preflight |
| Credential files for live modes |
Keep secrets out of chat |
Verify paths only |
Workflow Overview
┌───────────┐ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐
│ Preflight │ → │ Render/review │ → │ Apply/handoff │ → │ Validate evidence │
└───────────┘ └───────────────┘ └───────────────┘ └─────────────────┘
When to Activate
- Connect AWS to Splunk Observability Cloud, configure CloudWatch Metric Streams, render IAM policies, manage the
AWSCloudWatch REST/Terraform object, monitor Bedrock metrics, set up multi-account AWS Organizations onboarding,
audit drift,.
- Preview and review the splunk observability aws integration workflow before any live apply phase.
- Diagnose failed prerequisites, generated assets, configuration, or validation evidence.
Scope
Follow the documented read-only or render-first path whenever it is available.
This skill does not imply permission to mutate live systems. Require explicit
apply flags, protected credentials, and operator review for state changes.
Examples
Inspect the supported setup modes before selecting one:
bash skills/splunk-observability-aws-integration/scripts/setup.sh --help
Expected output: usage, supported modes, and required arguments are displayed
without changing the target environment.
Inspect validation modes before running completion checks:
bash skills/splunk-observability-aws-integration/scripts/validate.sh --help
Expected output: offline, live, and completion options are displayed when the
skill supports them; help exits without mutation.
Troubleshooting
| Issue |
Cause |
Resolution |
| Preflight fails |
A required tool or access path is missing |
Resolve it before rendering or applying |
| Rendered assets are incomplete |
Required non-secret inputs are absent |
Complete intake and render again |
| Apply is blocked |
Review, credentials, or explicit acceptance is missing |
Use the documented handoff |
| Validation is incomplete |
Live evidence is unavailable |
Record the gap and keep completion open |
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).
- Secret files must always be regular, non-symlink, single-hardlink files no
larger than 64 KiB containing one non-empty printable-ASCII value with at
most one trailing LF or CRLF. Readers use
O_NOFOLLOW,
bounded double reads, and stable metadata/content fingerprints;
--allow-loose-token-perms relaxes only the mode check.
- Authenticated API calls are pinned to supported HTTPS realm hosts and refuse
every redirect so
X-SF-Token cannot be forwarded to another URL.
- 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 |
Render the common scenario and print the supported SecurityToken apply plus ExternalId handoff. No live changes. |
| 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 selected sections. SecurityToken integration and regional streams can mutate; IAM, ExternalId two-phase setup, and StackSets fail closed to explicit handoffs. |
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).
Overrides must be absolute HTTPS URLs on port 443, end in .yaml or .yml,
and contain no credentials, query, fragment, whitespace, or control
characters. The rendered AWS CLI command shell-quotes the validated URL.
--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 SecurityToken mode only when explicitly requested. ExternalId mode
uses the rendered two-phase handoff and direct apply refuses a partial
disabled integration:
The rendered iam/iam-trust.json intentionally uses
${SPLUNK_AWS_ACCOUNT_ID_FROM_POST_RESPONSE} until the create response is
available. After POST /v2/integration, replace that placeholder with the
returned sfxAwsAccountArn before deploying the IAM trust policy.
bash skills/splunk-observability-aws-integration/scripts/setup.sh \
--apply integration,validation \
--spec skills/splunk-observability-aws-integration/template.example \
--realm us1 \
--token-file /tmp/splunk_o11y_admin_token \
--aws-access-key-id-file /tmp/aws_access_key_id \
--aws-secret-access-key-file /tmp/aws_secret_access_key
To run only a subset of sections:
bash skills/splunk-observability-aws-integration/scripts/setup.sh \
--apply integration \
--spec my-security-token-aws-integration.yaml \
--token-file /tmp/splunk_o11y_admin_token \
--aws-access-key-id-file /tmp/aws_access_key_id \
--aws-secret-access-key-file /tmp/aws_secret_access_key
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, and a secrets-leak scan across
every rendered file.
With --live, the CFN HTTPS probe is mandatory only when the rendered plan
uses that template. The live API check requires exactly one enabled integration
matching the rendered name, AWS account, regions, polling/stream mode, services,
custom namespaces, rates, and guards, then calls
GET /v2/integration/validate/{id}. Missing credentials, tools, or evidence
fail validation. The validation endpoint requires a short-lived administrator
User API session token.
For the cross-domain AWS/EKS/O11y production gate, render clean packets with
scripts/staging/render-aws-eks-o11y.py and run
scripts/staging/validate-aws-eks-o11y.sh. See
../../scripts/staging/README.md. The gate
is read-only and records a private, sanitized JSON report.
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.
1---2name: splunk-observability-aws-integration3description: Use when the user asks to connect AWS to Splunk Observability Cloud, configure CloudWatch Metric Streams, render IAM policies, manage the AWSCloudWatch REST/Terraform object, monitor Bedrock metrics, set up multi-account AWS Organizations onboarding, audit drift, or migrate polling to Metric Streams. Hand off Lambda APM, AWS logs, dashboards, detectors, and EC2/EKS host telemetry to their owning skills. Render, preflight, apply, validate, discover, and diagnose the Splunk Observability Cloud AWSCloudWatch integration across polling, Splunk-managed Metric Streams, AWS-managed Metric Streams, and Terraform paths. Covers IAM trust and policy stubs, External ID and SecurityToken auth, CloudFormation and StackSets assets, Terraform payloads, field conflict checks, recommended stats, namespace sync rules, PrivateLink ingest stubs, drift adoption, and troubleshooting.4---56# Splunk Observability Cloud <-> AWS Integration78## Prerequisites910| Tool or access | Purpose | Verify |11|---|---|---|12| Bash and Python 3 | Run bundled setup and validation helpers | `bash --version && python3 --version` |13| Required product/platform access | Inspect or configure the selected target | Complete the documented preflight |14| Credential files for live modes | Keep secrets out of chat | Verify paths only |1516## Workflow Overview1718```text19┌───────────┐ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐20│ Preflight │ → │ Render/review │ → │ Apply/handoff │ → │ Validate evidence │21└───────────┘ └───────────────┘ └───────────────┘ └─────────────────┘22```2324## When to Activate2526- Connect AWS to Splunk Observability Cloud, configure CloudWatch Metric Streams, render IAM policies, manage the27 AWSCloudWatch REST/Terraform object, monitor Bedrock metrics, set up multi-account AWS Organizations onboarding,28 audit drift,.29- Preview and review the splunk observability aws integration workflow before any live apply phase.30- Diagnose failed prerequisites, generated assets, configuration, or validation evidence.3132## Scope3334Follow the documented read-only or render-first path whenever it is available.35This skill does not imply permission to mutate live systems. Require explicit36apply flags, protected credentials, and operator review for state changes.3738## Examples3940Inspect the supported setup modes before selecting one:4142```bash43bash skills/splunk-observability-aws-integration/scripts/setup.sh --help44```4546Expected output: usage, supported modes, and required arguments are displayed47without changing the target environment.4849Inspect validation modes before running completion checks:5051```bash52bash skills/splunk-observability-aws-integration/scripts/validate.sh --help53```5455Expected output: offline, live, and completion options are displayed when the56skill supports them; help exits without mutation.5758## Troubleshooting5960| Issue | Cause | Resolution |61|---|---|---|62| Preflight fails | A required tool or access path is missing | Resolve it before rendering or applying |63| Rendered assets are incomplete | Required non-secret inputs are absent | Complete intake and render again |64| Apply is blocked | Review, credentials, or explicit acceptance is missing | Use the documented handoff |65| Validation is incomplete | Live evidence is unavailable | Record the gap and keep completion open |6667Render-first skill that owns the entire `AWSCloudWatch` integration object in68Splunk Observability Cloud. The skill is **standalone reusable** and does not69require any other Splunk Observability skill to run, but it hands off to other70skills for adjacent surfaces (logs, Lambda APM, dashboards, detectors, OTel71collectors).7273The workflow is render-first by default. Live API changes only happen when the74user explicitly asks for `--apply`.7576## Coverage Model7778Every rendered section gets an explicit coverage status in79`coverage-report.json`:8081- `api_apply` — a documented public REST API supports create / update / delete /82 validate (e.g. `POST /v2/integration`).83- `api_validate` — a documented public REST API supports read or validation only84 (e.g. preflighting `ec2:DescribeRegions` permission via the live integration's85 reported region list).86- `deeplink` — the skill renders a deterministic Splunk Observability Cloud UI87 link and validates referenced data where an API allows (e.g. the AWS88 guided-setup deeplink for AWS-managed Metric Streams).89- `handoff` — the skill renders deterministic operator steps for cross-skill90 workflows (e.g. logs path -> `splunk-app-install` for `Splunk_TA_AWS`).91- `not_applicable` — the section does not apply to the chosen target (e.g.92 Splunk-managed Metric Streams permissions when `connection.mode` is `polling`,93 or any AWS integration on `realm: us2-gcp` because that realm is GCP-hosted94 and has no AWS STS region mapping).9596## Safety Rules9798- Never ask for Splunk Observability tokens, AWS access keys, or AWS secret99 access keys in conversation.100- Never pass any secret on the command line or as an environment-variable101 prefix.102- Use `--token-file` for the Splunk Observability Cloud admin user API access103 token. Token files must be `chmod 600`. Override only with104 `--allow-loose-token-perms` (emits a WARN — use only for short-lived scratch105 tokens).106- Secret files must always be regular, non-symlink, single-hardlink files no107 larger than 64 KiB containing one non-empty printable-ASCII value with at108 most one trailing LF or CRLF. Readers use `O_NOFOLLOW`,109 bounded double reads, and stable metadata/content fingerprints;110 `--allow-loose-token-perms` relaxes only the mode check.111- Authenticated API calls are pinned to supported HTTPS realm hosts and refuse112 every redirect so `X-SF-Token` cannot be forwarded to another URL.113- For `authentication.mode: security_token` (GovCloud / China), use114 `--aws-access-key-id-file` and `--aws-secret-access-key-file`. Both files115 must be `chmod 600`.116- Reject direct secret flags: `--token`, `--access-token`, `--api-token`,117 `--o11y-token`, `--admin-token`, `--sf-token`, `--external-id`,118 `--aws-access-key-id`, `--aws-secret-access-key`, `--aws-secret-key`,119 `--password`.120- Prefer `SPLUNK_O11Y_REALM` and `SPLUNK_O11Y_TOKEN_FILE` from the repo121 `credentials` file when present; these store only realms and token-file122 paths, never token values.123- Strip every secret from `00-09-*.md`, `apply-plan.json`, `payloads/`,124 `current-state.json`, `state/apply-state.json`, and any other rendered125 artifact on disk. The Splunk Observability admin token is referenced as126 `${SPLUNK_O11Y_TOKEN_FILE}` everywhere, never inlined.127- The renderer FAILs render when the operator passes the deprecated128 `enableLogsSync` field with a clear pointer to the `Splunk_TA_AWS` handoff.129- The renderer FAILs render when `regions: []` (the canonical schema rejects an130 empty list and Splunk highly discourages it because new AWS regions131 auto-onboard and inflate cost).132- `bash skills/shared/scripts/write_secret_file.sh /tmp/splunk_o11y_token`133 helps the user create a token file without exposing the secret in shell134 history.135136## Five-mode UX137138| Mode | Flag | Purpose |139|------|------|---------|140| quickstart | `--quickstart` | Render the common scenario and print the supported SecurityToken apply plus ExternalId handoff. No live changes. |141| render | `--render` (default) | Produces the numbered plan tree under `--output-dir`. Never touches live state. |142| 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. |143| doctor | `--doctor` | Runs the troubleshooting catalog and emits `doctor-report.md` with prioritized fixes and the exact `setup.sh --apply` command for each fix. |144| apply | `--apply [SECTIONS]` | Applies selected sections. SecurityToken integration and regional streams can mutate; IAM, ExternalId two-phase setup, and StackSets fail closed to explicit handoffs. |145146Plus quality-of-life flags:147148- `--quickstart-from-live` — turn the live integration into a `template.observed.yaml`149 the operator can edit; never overwrites their `template.example`.150- `--explain` — print the apply plan in plain English, no API calls; for151 change-management approvals.152- `--rollback <section>` — render (do not auto-run) the reverse-engineered153 commands for steps that have a public reversible API.154- `--list-namespaces` — print the supported AWS service / namespace catalog155 (mirrors `references/namespaces-catalog.md`).156- `--list-recommended-stats` — print the per-namespace per-metric stat catalog157 used by `collect_only_recommended_stats: true`.158- `--privatelink-domain {legacy,new}` — pick `signalfx.com` (default; matches159 current Splunk-published PrivateLink doc) vs `observability.splunkcloud.com`160 PrivateLink hostnames.161- `--cfn-template-url URL` — override the default162 `https://o11y-public.s3.amazonaws.com/aws-cloudformation-templates/release/template_metric_streams_regional.yaml`163 (or the StackSets equivalent when `metric_streams.use_stack_sets: true`).164 Overrides must be absolute HTTPS URLs on port 443, end in `.yaml` or `.yml`,165 and contain no credentials, query, fragment, whitespace, or control166 characters. The rendered AWS CLI command shell-quotes the validated URL.167- `--accept-drift FIELD[,FIELD...]` — needed for `--apply` when discover shows168 the live integration differs from the rendered spec on a field with side169 effects (e.g. flipping `useMetricStreamsSync`).170171## Primary Workflow1721731. Collect non-secret values: realm, integration name, AWS account ID(s),174 IAM role name, regions, services list (or `all_built_in`), connection175 mode (polling vs Splunk-managed Metric Streams vs AWS-managed Metric176 Streams), custom namespaces, multi-account toggle.1771782. Create or update a JSON / YAML spec from `template.example`.1791803. Render and validate:181182 ```bash183 bash skills/splunk-observability-aws-integration/scripts/setup.sh \184 --render \185 --spec skills/splunk-observability-aws-integration/template.example \186 --output-dir splunk-observability-aws-integration-rendered187 ```1881894. Review `splunk-observability-aws-integration-rendered/`:190 - `README.md` — TL;DR and ordered next-step commands.191 - `architecture.mmd` — Mermaid topology of the rendered integration.192 - `00-prerequisites.md` through `09-handoff.md` — numbered per-section plans.193 - `coverage-report.json` — per-section coverage status.194 - `apply-plan.json` — apply ordering with idempotency keys (no secrets).195 - `payloads/` — per-step request bodies for REST calls and CFN parameters.196 - `aws/` — CloudFormation template stubs (regional or StackSets) and197 Terraform `.tf` files for the AWS-side resources and the Splunk-side198 integration object.199 - `iam/` — per-use-case IAM JSON (foundation, polling, streams, tag-sync,200 Cassandra-special-case, GovCloud security-token).201 - `scripts/` — per-step apply scripts and cross-skill handoff drivers.202 - `support-tickets/` — pre-filled tickets when Splunk Support is required.2032045. Apply SecurityToken mode only when explicitly requested. ExternalId mode205 uses the rendered two-phase handoff and direct apply refuses a partial206 disabled integration:207208 The rendered `iam/iam-trust.json` intentionally uses209 `${SPLUNK_AWS_ACCOUNT_ID_FROM_POST_RESPONSE}` until the create response is210 available. After `POST /v2/integration`, replace that placeholder with the211 returned `sfxAwsAccountArn` before deploying the IAM trust policy.212213 ```bash214 bash skills/splunk-observability-aws-integration/scripts/setup.sh \215 --apply integration,validation \216 --spec skills/splunk-observability-aws-integration/template.example \217 --realm us1 \218 --token-file /tmp/splunk_o11y_admin_token \219 --aws-access-key-id-file /tmp/aws_access_key_id \220 --aws-secret-access-key-file /tmp/aws_secret_access_key221 ```222223 To run only a subset of sections:224225 ```bash226 bash skills/splunk-observability-aws-integration/scripts/setup.sh \227 --apply integration \228 --spec my-security-token-aws-integration.yaml \229 --token-file /tmp/splunk_o11y_admin_token \230 --aws-access-key-id-file /tmp/aws_access_key_id \231 --aws-secret-access-key-file /tmp/aws_secret_access_key232 ```233234## Supported Sections235236Specs use `api_version: splunk-observability-aws-integration/v1` and can237include the following top-level blocks (full reference in238[reference.md](reference.md)):239240- `prerequisites` — region/realm preflight, FedRAMP/GovCloud/GCP carve-out,241 IAM permission check stubs, CFN template URL HTTP HEAD probe.242- `authentication` — `external_id` or `security_token` mode, AWS account ID,243 IAM role name, returned external ID.244- `connection` — polling vs Splunk-managed vs AWS-managed vs Terraform-only245 mode; `pollRate`, `metadataPollRate`, `inactiveMetricsPollRate`.246- `regions` — explicit AWS region list (cannot be empty).247- `services` — `all_built_in` / `explicit` / `namespace_filtered` /248 `custom_only`; `collect_only_recommended_stats`; `metric_stats_to_syncs`;249 `namespace_sync_rules` (for built-in `AWS/*` namespaces).250- `custom_namespaces` — `simple_list` (serializes to `customCloudwatchNamespaces`)251 OR `sync_rules` (serializes to `customNamespaceSyncRules`); they conflict.252 `sync_custom_namespaces_only` toggle.253- `guards` — `enable_check_large_volume`, `ignore_all_status_metrics`,254 `sync_load_balancer_target_group_tags`, `enable_aws_usage`.255- `metric_streams` — `use_metric_streams_sync`, `managed_externally`,256 `named_token`, `cloudformation`, `cloudformation_template_url`,257 `use_stack_sets`, `terraform`.258- `private_link` — `enable`, `endpoint_types`, `service_name_overrides`.259- `terraform_provider` — `source` (`splunk-terraform/signalfx`), `version`260 (`~> 9.0` default).261- `multi_account` — `enabled`, `control_account_id`, `member_accounts`,262 `cfn_stacksets`.263- `handoffs` — `lambda_apm`, `logs_via_splunk_ta_aws`, `dashboards`,264 `detectors`, `otel_collector_for_ec2_eks`.265266## Hand-offs to Other Skills267268- AWS log ingestion -> `bash skills/splunk-app-install/scripts/install_app.sh269 --source splunkbase --app-id 1876` (Splunk Add-on for AWS, Splunkbase 1876,270 min v8.1.1). Renderer preflights for `Splunk_TA_amazon_security_lake` and271 emits an uninstall step before the v7+ upgrade.272- Log Observer Connect to surface those logs in O11y ->273 [`splunk-observability-cloud-integration-setup`](../splunk-observability-cloud-integration-setup/SKILL.md).274- Native O11y dashboards for AWS namespaces ->275 [`splunk-observability-dashboard-builder`](../splunk-observability-dashboard-builder/SKILL.md).276- Detectors / AutoDetect alerting ->277 [`splunk-observability-native-ops`](../splunk-observability-native-ops/SKILL.md).278- OTel collector on EC2 / EKS for richer host telemetry than `CWAgent` ->279 [`splunk-observability-otel-collector-setup`](../splunk-observability-otel-collector-setup/SKILL.md).280- Lambda APM via the Splunk OpenTelemetry Lambda layer (publisher281 `254067382080`) ->282 [`splunk-observability-aws-lambda-apm-setup`](../splunk-observability-aws-lambda-apm-setup/SKILL.md).283 Renderer emits a hand-off stub in `09-handoff.md`.284285## Out of Scope286287- AWS log collection via the Splunk AWS log collector Lambda (handed off to288 `Splunk_TA_AWS`; the `enableLogsSync` API field is deprecated and rejected289 by the renderer).290- Lambda APM instrumentation via the OpenTelemetry Lambda layer (handed off to291 [`splunk-observability-aws-lambda-apm-setup`](../splunk-observability-aws-lambda-apm-setup/SKILL.md)).292- Native O11y AWS dashboard / detector CRUD (handed off to293 `splunk-observability-dashboard-builder` and294 `splunk-observability-native-ops`).295- AppDynamics for AWS workloads (separate AppDynamics SaaS workflow).296- Splunk Cloud Platform Data Manager AWS log onboarding (different product;297 Splunk Cloud Platform side, not Splunk Observability Cloud).298299## Validation300301```bash302bash skills/splunk-observability-aws-integration/scripts/validate.sh \303 --output-dir splunk-observability-aws-integration-rendered304```305306Static checks: required-files, IAM JSON shape, and a secrets-leak scan across307every rendered file.308309With `--live`, the CFN HTTPS probe is mandatory only when the rendered plan310uses that template. The live API check requires exactly one enabled integration311matching the rendered name, AWS account, regions, polling/stream mode, services,312custom namespaces, rates, and guards, then calls313`GET /v2/integration/validate/{id}`. Missing credentials, tools, or evidence314fail validation. The validation endpoint requires a short-lived administrator315User API session token.316317For the cross-domain AWS/EKS/O11y production gate, render clean packets with318`scripts/staging/render-aws-eks-o11y.py` and run319`scripts/staging/validate-aws-eks-o11y.sh`. See320[`../../scripts/staging/README.md`](../../scripts/staging/README.md). The gate321is read-only and records a private, sanitized JSON report.322323See `reference.md` and the focused references under `references/` for full324detail. The plan and corrections that produced this skill are recorded in325`.cursor/plans/splunk_o11y_aws_integration_skill_*.plan.md`.