# Spinifex Command Reference Implementation status of every CLI subcommand (`spx`) and AWS-compatible API action served by the Spinifex gateway. Tables list flag coverage only — for prerequisites, behaviour, and error semantics, read the linked source or `spinifex/docs/DESIGN.md`. **Status legend:** **DONE** — fully implemented · **STARTED** — partially implemented (caveat in note) · **NOT STARTED** — not implemented. --- ## Spinifex Admin CLI (`spx`) Platform-management commands not exposed via the AWS gateway. CLI-only. ### Service Management `spx service {start|stop|status}` — lifecycle for each cluster service. `stop`/`status` take no flags. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `spx service predastore start` | `--port` (8443), `--host` (0.0.0.0), `--base-path`, `--config-path`, `--debug`, `--tls-cert`, `--tls-key`, `--backend` (distributed/filesystem), `--node-id`, `--pprof`, `--pprof-output` | — | **DONE** | | `spx service predastore stop` / `status` | — | — | **DONE** | | `spx service viperblock start` | `--s3-host`, `--s3-bucket`, `--s3-region`, `--plugin-path` | — | **DONE** | | `spx service viperblock stop` / `status` | — | — | **DONE** | | `spx service nats start` | `--port` (4222), `--host`, `--debug`, `--data-dir`, `--jetstream` | — | **DONE** | | `spx service nats stop` / `status` | — | — | **DONE** | | `spx service spinifex start` | `--wal-dir` | — | **DONE** | | `spx service spinifex stop` / `status` | — | — | **DONE** | | `spx service awsgw start` | `--host` (0.0.0.0:9999), `--tls-cert`, `--tls-key`, `--debug` | — | **DONE** | | `spx service awsgw stop` / `status` | — | — | **DONE** | | `spx service spinifex-ui start` | `--port` (3000), `--host`, `--tls-cert`, `--tls-key` | — | **DONE** | | `spx service spinifex-ui stop` / `status` | — | — | **DONE** | | `spx service vpcd start` / `stop` / `status` | — | — | **DONE** | Viperblock `--plugin-path` is auto-detected via `nbdkit --dump-config plugindir` and overridable via `SPINIFEX_VIPERBLOCK_PLUGIN_PATH` in `/etc/spinifex/systemd.env`. ### Cluster Inspection | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `spx get nodes` | `--timeout` (3s) | — | **DONE** | | `spx get vms` (alias: `instances`) | `--timeout` (3s) | — | **DONE** | | `spx top nodes` | `--timeout` (3s) | — | **DONE** | ### Cluster Lifecycle | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `spx admin init` | `--nodes`, `--node`, `--bind`, `--port`, `--region`, `--az`, `--cluster-name`, `--cluster-bind`, `--cluster-routes`, `--predastore-nodes`, `--services`, `--formation-timeout`, `--token-ttl`, `--force` | — | **DONE** | | `spx admin join` | `--host`, `--node`, `--token`, `--bind`, `--port`, `--region`, `--az`, `--cluster-bind`, `--cluster-routes`, `--data-dir`, `--services` | — | **DONE** | | `spx admin cluster shutdown` | `--force`, `--timeout` (120s), `--dry-run` | — | **DONE** | | `spx admin cert renew` | `--extra-ip`, `--extra-dns` | — | **DONE** | | `spx admin upgrade` | `--yes`, `--config-dir`, `--spinifex-dir` | — | **DONE** | | `spx version` | — | — | **DONE** | ### Account Management | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `spx admin account create` | `--name` | — | **DONE** | | `spx admin account list` | — | — | **DONE** | ### Image Management | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `spx admin images import` | `--name`, `--file`, `--distro`, `--version`, `--arch`, `--platform`, `--boot-mode` (bios/uefi/uefi-preferred), `--tag`, `--force`, `--skip-verify` | — | **DONE** | | `spx admin images list` | — | — | **DONE** | | `spx admin images remove` | `--image-id`, `--force`, `--yes` | — | **DONE** | #### Image integrity verification (CMMC SI.L1-3.14.2) Catalog imports (`--name`) verify the image against the catalog-declared SHA-256/SHA-512 digest before extraction. The sums file is fetched over HTTPS only (cross-scheme redirects refused). Verification runs on fresh downloads *and* cache hits, so a poisoned cache is caught on the next import. On mismatch the import exits non-zero, the cached file is left for inspection, and the guidance is to re-run with `--force`. `--file` imports skip verification by design: operator-supplied media is outside Spinifex's trust boundary. The skip is recorded as an INFO `slog` event (`reason=local-file-import`). `--skip-verify` bypasses checksum verification for catalog imports — only for debugging upstream mirror issues. Logged at WARN (`reason=skip-verify-flag`) and to stderr. **Limitation:** verification confirms the image matches the digest the mirror served. A mirror compromise that swaps both image and sums file is not detected; GPG signature verification is a later phase. #### `spx admin images remove` caveats System AMIs (`ImageOwnerAlias = "system"`) cannot be removed via the AWS `DeregisterImage`/`DeleteSnapshot` flow — those reject system owners with `UnauthorizedOperation`. `spx admin images remove` is the admin-trust-boundary counterpart: it walks the transitive dependent set (copied snapshots, derived volumes, account AMIs created via `CopyImage`) and refuses if anything references the target. **TOCTOU window:** between the safety scan and the `config.json` delete a concurrent `RunInstances` could create a new dependent volume. The window is sub-second on a healthy cluster. The admin is expected to know fleet state; if the race fires the result is a `vol-` with deleted backing blocks, recovered by terminating the orphaned instance. **`--force` bypasses every safety check** (dependents, ownership, missing / corrupt `config.json`). Use only for salvage of orphaned blocks. Running `--force` against a live system AMI corrupts every dependent volume on the next disk read. ### GPU Management | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `spx admin gpu status` | `--node` | — | **DONE** | | `spx admin gpu enable` | — | — | **DONE** | | `spx admin gpu disable` | — | — | **DONE** | | `spx admin gpu setup` | — | — | **DONE** | `gpu setup` must run as root. `gpu enable`/`disable` must run on the target host (writes `spinifex.toml`, SIGHUPs `spinifex-daemon`). --- ## AWS-Compatible API ### EC2 — Instance Management | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `run-instances` | `--image-id`, `--instance-type`, `--count`, `--key-name`, `--user-data`, `--subnet-id`, `--block-device-mappings` (DeviceName, VolumeSize, VolumeType, Iops, DeleteOnTermination), `--placement` (GroupName), `--iam-instance-profile` (Name/Arn) | `--security-group-ids`, `--tag-specifications`, `--dry-run`, `--client-token`, `--disable-api-termination`, `--ebs-optimized`, `--network-interfaces`, `--private-ip-address`, `--monitoring`, `--credit-specification`, `--cpu-options`, `--metadata-options`, `--launch-template`, `--hibernate-options` | **DONE** | | `describe-instances` | `--instance-ids`, `--filters` (instance-state-name, instance-id, instance-type, vpc-id, subnet-id, tag:*, tag-key, tag-value) | `--max-results`, `--next-token`, `--dry-run` | **DONE** | | `start-instances` | `--instance-ids` | `--dry-run`, `--force` | **DONE** | | `stop-instances` | `--instance-ids` | `--force`, `--hibernate`, `--dry-run` | **DONE** | | `terminate-instances` | `--instance-ids`, `DeleteOnTermination` (per-volume) | `--dry-run` | **DONE** | | `reboot-instances` | `--instance-ids` | `--dry-run` | **DONE** | | `describe-instance-types` | `--filters` (capacity only) | `--instance-types`, `--max-results`, `--next-token`, `--dry-run`, other filters | **DONE** | | `modify-instance-attribute` | `--instance-id`, `--instance-type`, `--user-data`, `--disable-api-termination` | `--ebs-optimized`, `--source-dest-check`, `--instance-initiated-shutdown-behavior`, `--block-device-mappings`, `--groups`, `--ena-support`, `--sriov-net-support` | **DONE** | | `get-console-output` | `--instance-id` | `--latest`, `--dry-run` | **DONE** | | `describe-instance-attribute` | `--instance-id`, `--attribute` (instanceType, userData, disableApiTermination, instanceInitiatedShutdownBehavior, disableApiStop, ebsOptimized, enaSupport, sourceDestCheck, rootDeviceName, kernel, ramdisk) | `--dry-run` | **DONE** | | `describe-instance-credit-specifications` | `--instance-ids` | `--filters`, `--max-results`, `--dry-run` | **DONE** (stub — always returns `standard`) | | `describe-instance-status` | `--instance-ids`, `--include-all-instances`, `--filters` (availability-zone, instance-state-code, instance-state-name, tag:*) | `--max-results`, `--next-token`, `--dry-run`, event/instance-status/system-status filters | **DONE** (static health) | | `monitor-instances` | — | `--instance-ids` | **NOT STARTED** | | `unmonitor-instances` | — | `--instance-ids` | **NOT STARTED** | `run-instances --iam-instance-profile` enforces `iam:PassRole` on the contained role ARN and rejects cross-account profile ARNs. Placement strategies: `spread` (1 per node, atomic CAS) and `cluster` (pin all to one node). ### EC2 — IAM Instance Profile Associations Stored as `vm.VM.IamInstanceProfileArn` + `IamInstanceProfileAssociationId` (one ARN per instance). Association IDs (`iip-assoc-`) are regenerated on every Associate/Replace and never reused. Auto-disassociated on terminate; preserved across stop/start. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `associate-iam-instance-profile` | `--instance-id`, `--iam-instance-profile` (Name/Arn) | `--dry-run` | **DONE** | | `disassociate-iam-instance-profile` | `--association-id` | `--dry-run` | **DONE** | | `replace-iam-instance-profile-association` | `--association-id`, `--iam-instance-profile` (Name/Arn) | `--dry-run` | **DONE** | | `describe-iam-instance-profile-associations` | `--association-ids`, `--filters` (instance-id, state) | `--max-results`, `--next-token`, `--dry-run` | **DONE** | ### EC2 — Key Pairs | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-key-pair` | `--key-name`, `--key-type` (rsa/ed25519) | `--key-format`, `--tag-specifications`, `--dry-run` | **DONE** | | `describe-key-pairs` | `--key-names`, `--key-pair-ids`, `--filters` (key-pair-id, key-name, fingerprint, tag:*) | `--max-results`, `--dry-run` | **DONE** | | `delete-key-pair` | `--key-name`, `--key-pair-id` | `--dry-run` | **DONE** | | `import-key-pair` | `--key-name`, `--public-key-material` | `--tag-specifications`, `--dry-run` | **DONE** | ### EC2 — AMI Images | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `describe-images` | `--image-ids`, `--owners` (self/account-id/alias), `--filters` (name, state, architecture, image-id, is-public, owner-id, description, image-type, tag:*) | `--executable-users`, `--include-deprecated`, `--include-disabled`, `--max-results`, `--next-token`, `--dry-run` | **DONE** | | `create-image` | `--instance-id`, `--name`, `--description`, `--tag-specifications` | `--no-reboot`, `--block-device-mappings`, `--dry-run` | **DONE** | | `register-image` | `--name`, `--description`, `--architecture` (x86_64/arm64/i386), `--root-device-name`, `--virtualization-type` (hvm), `--boot-mode` (bios/uefi/uefi-preferred), `--block-device-mappings` (root w/ `Ebs.SnapshotId`+`VolumeSize`), `--tag-specifications` | `--billing-products`, `--uefi-data` | **DONE** | | `deregister-image` | `--image-id` | `--dry-run` | **DONE** | | `copy-image` | `--source-image-id`, `--source-region`, `--name`, `--description`, `--client-token`, `--copy-image-tags`, `--tag-specifications` (image only) | `--encrypted`, `--kms-key-id`, `--destination-outpost-arn`, `--dry-run` | **DONE** | | `describe-image-attribute` | `--image-id`, `--attribute` (`description`, `blockDeviceMapping`) | `--dry-run`, other attributes (`launchPermission`, `bootMode`, `kernel`, `ramdisk`, `sriovNetSupport`, `productCodes`, `tpmSupport`, `uefiData`, `imdsSupport`, `lastLaunchedTime`, `deregistrationProtection`) | **DONE** | | `modify-image-attribute` | `--image-id`, `--description` (top-level or structured) | `--launch-permission`, `--imds-support`, `--operation-type`, `--user-ids`, `--user-groups`, `--organization-arns`, `--product-codes`, `--dry-run`, other `--attribute` values | **DONE** | | `reset-image-attribute` | `--image-id`, `--attribute description` | `--attribute launchPermission`, `--dry-run` | **DONE** | | `import-image` | — | `--disk-containers`, `--description`, `--architecture`, `--platform` | **NOT STARTED** | `copy-image` is metadata-only — no block copy. The new snapshot inherits the source `VolumeID`. `register-image`/`copy-image` accept `uefi-preferred` as input but treat it as `uefi` at launch. ### EC2 — Volumes (EBS) | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `describe-volumes` | `--volume-ids`, `--filters` (volume-id, status, size, volume-type, attachment.instance-id, attachment.status, attachment.device, availability-zone, tag:*), persisted `DeleteOnTermination` | `--max-results`, `--next-token`, `--dry-run` | **DONE** | | `create-volume` | `--size`, `--availability-zone`, `--volume-type` (gp3), `--snapshot-id` | `--iops` (hardcoded 3000), `--encrypted` (hardcoded false), `--throughput`, `--tag-specifications` | **DONE** | | `delete-volume` | `--volume-id` | `--dry-run` | **DONE** | | `modify-volume` | `--volume-id`, `--size`, `--volume-type`, `--iops` | `--throughput`, `--dry-run`, `--multi-attach-enabled` | **DONE** | | `attach-volume` | `--volume-id`, `--instance-id`, `--device` (auto-assigns `/dev/sd[f-p]`) | `--dry-run` | **DONE** | | `detach-volume` | `--volume-id`, `--instance-id` (optional), `--device`, `--force` | `--dry-run` | **DONE** | | `describe-volume-status` | `--volume-ids`, `--filters` (volume-id, volume-status.status, availability-zone) | `--max-results`, `--next-token`, `--dry-run` | **DONE** | | `describe-volumes-modifications` | — | `--volume-ids`, `--filters`, `--max-results` | **NOT STARTED** | ### EC2 — Snapshots | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-snapshot` | `--volume-id`, `--description`, `--tag-specifications` | `--dry-run` | **DONE** | | `delete-snapshot` | `--snapshot-id` | `--dry-run` | **DONE** | | `describe-snapshots` | `--snapshot-ids`, `--filters` (snapshot-id, status, volume-id, volume-size, owner-id, tag:*) | `--owner-ids`, `--max-results`, `--dry-run` | **DONE** | | `copy-snapshot` | `--source-snapshot-id`, `--source-region`, `--description` | `--encrypted`, `--dry-run` | **DONE** | | `create-snapshots` | — | `--instance-specification`, `--description`, `--tag-specifications` | **NOT STARTED** | ### EC2 — Tags | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-tags` | `--resources`, `--tags` | `--dry-run` | **DONE** | | `delete-tags` | `--resources`, `--tags` | `--dry-run` | **DONE** | | `describe-tags` | `--filters` (resource-id, resource-type, key, value) | `--max-results`, `--next-token`, `--dry-run` | **DONE** | ### EC2 — Regions, AZs, Account Attributes | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `describe-regions` | — (returns configured region) | `--region-names`, `--filters`, `--all-regions`, `--dry-run` | **DONE** | | `describe-availability-zones` | — (returns configured AZ) | `--zone-names`, `--filters`, `--all-availability-zones` | **DONE** | | `describe-account-attributes` | `--attribute-names` | `--dry-run` | **DONE** | ### EC2 — Account Settings Persistence works (NATS JetStream KV) but stored values are not yet enforced by downstream services. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `enable-ebs-encryption-by-default` | — | `--dry-run` | **STARTED** (enforcement pending) | | `disable-ebs-encryption-by-default` | — | `--dry-run` | **STARTED** (enforcement pending) | | `get-ebs-encryption-by-default` | — | `--dry-run` | **STARTED** (enforcement pending) | | `enable-serial-console-access` | — | `--dry-run` | **STARTED** (enforcement pending) | | `disable-serial-console-access` | — | `--dry-run` | **STARTED** (enforcement pending) | | `get-serial-console-access-status` | — | `--dry-run` | **DONE** | | `enable-snapshot-block-public-access` | — | `--state` | **NOT STARTED** | | `disable-snapshot-block-public-access` | — | `--dry-run` | **NOT STARTED** | | `get-snapshot-block-public-access-state` | — | `--dry-run` | **NOT STARTED** | | `enable-image-block-public-access` | — | `--image-block-public-access-state` | **NOT STARTED** | | `disable-image-block-public-access` | — | `--dry-run` | **NOT STARTED** | | `get-image-block-public-access-state` | — | `--dry-run` | **NOT STARTED** | | `modify-instance-metadata-defaults` | — | `--http-tokens`, `--http-put-response-hop-limit`, `--http-endpoint`, `--instance-metadata-tags` | **NOT STARTED** | | `get-instance-metadata-defaults` | — | `--dry-run` | **NOT STARTED** | ### EC2 — VPC Core VPC/Subnet/ENI/SG CRUD stores metadata in NATS KV and publishes events to vpcd for OVN translation. Single AZ for Spinifex v1. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-vpc` | `--cidr-block`, `--tag-specifications` | `--instance-tenancy`, `--dry-run` | **DONE** | | `delete-vpc` | `--vpc-id` | `--dry-run` | **DONE** | | `describe-vpcs` | `--vpc-ids`, `--filters` (vpc-id, state, cidr-block, is-default, owner-id, tag:*) | `--max-results`, `--dry-run` | **DONE** | | `modify-vpc-attribute` | `--vpc-id`, `--enable-dns-hostnames`, `--enable-dns-support`, `--enable-network-address-usage-metrics` | `--dry-run` | **DONE** | | `describe-vpc-attribute` | `--vpc-id`, `--attribute` (enableDnsHostnames, enableDnsSupport, enableNetworkAddressUsageMetrics) | `--dry-run` | **DONE** | | `associate-vpc-cidr-block` | — | `--vpc-id`, `--cidr-block` | **NOT STARTED** | | `disassociate-vpc-cidr-block` | — | `--association-id` | **NOT STARTED** | | `create-subnet` | `--vpc-id`, `--cidr-block`, `--availability-zone`, `--tag-specifications` | `--dry-run` | **DONE** | | `delete-subnet` | `--subnet-id` | `--dry-run` | **DONE** | | `describe-subnets` | `--subnet-ids`, `--filters` (vpc-id, subnet-id, availability-zone, cidr-block, state, default-for-az, tag:*) | `--max-results`, `--dry-run` | **DONE** | | `modify-subnet-attribute` | `--subnet-id`, `--map-public-ip-on-launch` | `--assign-ipv6-address-on-creation`, `--dry-run` | **DONE** | | `associate-subnet-cidr-block` | — | `--subnet-id`, `--ipv6-cidr-block` | **NOT STARTED** | | `disassociate-subnet-cidr-block` | — | `--association-id` | **NOT STARTED** | ### EC2 — Security Groups | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-security-group` | `--group-name`, `--description`, `--vpc-id`, `--tag-specifications` | `--dry-run` | **DONE** | | `delete-security-group` | `--group-id` | `--dry-run` | **DONE** | | `describe-security-groups` | `--group-ids`, `--filters` (vpc-id, group-name, group-id, description, ip-permission.cidr, tag:*) | `--group-names`, `--max-results`, `--dry-run` | **DONE** | | `authorize-security-group-ingress` | `--group-id`, `--ip-permissions` | `--dry-run` | **DONE** | | `authorize-security-group-egress` | `--group-id`, `--ip-permissions` | `--dry-run` | **DONE** | | `revoke-security-group-ingress` | `--group-id`, `--ip-permissions` | `--dry-run` | **DONE** | | `revoke-security-group-egress` | `--group-id`, `--ip-permissions` | `--dry-run` | **DONE** | | `describe-security-group-rules` | `--filters` (group-id, security-group-rule-id, tag:*, tag-key), `--security-group-rule-ids` | `--max-results`, `--next-token`, `--dry-run` | **DONE** | ### EC2 — Internet Gateway | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-internet-gateway` | `--tag-specifications` | `--dry-run` | **DONE** | | `attach-internet-gateway` | `--internet-gateway-id`, `--vpc-id` | `--dry-run` | **DONE** | | `detach-internet-gateway` | `--internet-gateway-id`, `--vpc-id` | `--dry-run` | **DONE** | | `delete-internet-gateway` | `--internet-gateway-id` | `--dry-run` | **DONE** | | `describe-internet-gateways` | `--internet-gateway-ids`, `--filters` (internet-gateway-id, attachment.vpc-id, attachment.state, tag:*) | `--max-results`, `--dry-run` | **DONE** | ### EC2 — Egress-Only Internet Gateway KV CRUD only — no OVN/OVS integration. EIGWs are stored but have no effect on network topology. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-egress-only-internet-gateway` | `--vpc-id`, `--tag-specifications` | `--client-token`, `--dry-run` | **STARTED** (KV only, no OVN) | | `delete-egress-only-internet-gateway` | `--egress-only-internet-gateway-id` | `--dry-run` | **STARTED** (KV only, no OVN) | | `describe-egress-only-internet-gateways` | `--egress-only-internet-gateway-ids`, `--filters` (egress-only-internet-gateway-id, tag:*) | `--max-results`, `--next-token`, `--dry-run` | **STARTED** (KV only, no OVN) | ### EC2 — Route Tables | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-route-table` | `--vpc-id` | `--tag-specifications`, `--dry-run` | **DONE** | | `delete-route-table` | `--route-table-id` | `--dry-run` | **DONE** | | `describe-route-tables` | `--route-table-ids`, `--filters` (vpc-id, route-table-id, association.main, association.route-table-association-id, association.subnet-id, route.destination-cidr-block, route.gateway-id) | `--max-results`, `--next-token`, `--dry-run` | **DONE** | | `create-route` | `--route-table-id`, `--destination-cidr-block`, `--gateway-id`, `--nat-gateway-id` | `--egress-only-internet-gateway-id`, `--vpc-peering-connection-id`, `--dry-run` | **DONE** | | `delete-route` | `--route-table-id`, `--destination-cidr-block` | `--dry-run` | **DONE** | | `replace-route` | `--route-table-id`, `--destination-cidr-block`, `--gateway-id` | `--nat-gateway-id`, `--dry-run` | **DONE** | | `associate-route-table` | `--route-table-id`, `--subnet-id` | `--gateway-id`, `--dry-run` | **DONE** | | `disassociate-route-table` | `--association-id` | `--dry-run` | **DONE** | | `replace-route-table-association` | `--association-id`, `--route-table-id` | `--dry-run` | **DONE** | ### EC2 — Network Interfaces (ENIs) ENIs are auto-created by `run-instances --subnet-id` and auto-deleted on termination. Standalone attach/detach API is internal-only. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-network-interface` | `--subnet-id`, `--private-ip-address`, `--description`, `--tag-specifications` | `--groups`, `--dry-run` | **DONE** | | `delete-network-interface` | `--network-interface-id` | `--dry-run` | **DONE** | | `describe-network-interfaces` | `--network-interface-ids`, `--filters` (subnet-id, vpc-id, attachment.instance-id) | `--max-results`, `--dry-run` | **DONE** | | `modify-network-interface-attribute` | — | `--network-interface-id`, `--description`, `--groups` | **DONE** | | `attach-network-interface` | — | `--network-interface-id`, `--instance-id`, `--device-index` | **NOT STARTED** (internal only) | | `detach-network-interface` | — | `--attachment-id`, `--force` | **NOT STARTED** (internal only) | | `assign-private-ip-addresses` | — | `--network-interface-id`, `--private-ip-addresses`, `--secondary-private-ip-address-count` | **NOT STARTED** | | `unassign-private-ip-addresses` | — | `--network-interface-id`, `--private-ip-addresses` | **NOT STARTED** | ### EC2 — Elastic IP EIP commands are only registered when an external IPAM pool is configured. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `allocate-address` | `--public-ipv4-pool`, `--tag-specifications` | `--domain`, `--dry-run` | **DONE** | | `release-address` | `--allocation-id` | `--dry-run` | **DONE** | | `associate-address` | `--allocation-id`, `--network-interface-id`, `--instance-id`, `--private-ip-address` | `--dry-run`, `--allow-reassociation` | **DONE** | | `disassociate-address` | `--association-id` | `--dry-run` | **DONE** | | `describe-addresses` | `--allocation-ids`, `--public-ips`, `--filters` (allocation-id, public-ip, instance-id, association-id, domain, tag:*) | `--dry-run` | **DONE** | | `describe-addresses-attribute` | `--allocation-ids` | `--attribute`, `--dry-run`, `--max-results`, `--next-token` | **DONE** | ### EC2 — NAT Gateway Deleted gateways move to a separate KV bucket with 1-hour TTL for Terraform polling. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-nat-gateway` | `--subnet-id`, `--allocation-id` | `--connectivity-type`, `--tag-specifications`, `--dry-run` | **DONE** | | `delete-nat-gateway` | `--nat-gateway-id` | `--dry-run` | **DONE** | | `describe-nat-gateways` | `--nat-gateway-ids`, `--filters` (vpc-id, state) | `--max-results`, `--next-token`, `--dry-run` | **DONE** | | `assign-private-nat-gateway-address` | — | `--nat-gateway-id`, `--private-ip-addresses` | **NOT STARTED** | | `associate-nat-gateway-address` | — | `--nat-gateway-id`, `--allocation-ids` | **NOT STARTED** | ### EC2 — Placement Groups Strategies: `spread` (1 instance per node, strict) and `cluster` (all pinned to single node). `partition` rejected. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-placement-group` | `--group-name`, `--strategy` (spread/cluster) | `--partition-count`, `--spread-level`, `--tag-specifications`, `--dry-run` | **DONE** | | `delete-placement-group` | `--group-name` | `--dry-run` | **DONE** | | `describe-placement-groups` | `--group-names`, `--group-ids`, `--filters` (strategy, state, spread-level, group-name) | `--dry-run` | **DONE** | ### EC2 — VPC Peering | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-vpc-peering-connection` | — | `--vpc-id`, `--peer-vpc-id`, `--peer-owner-id`, `--peer-region`, `--tag-specifications` | **NOT STARTED** | | `accept-vpc-peering-connection` | — | `--vpc-peering-connection-id`, `--dry-run` | **NOT STARTED** | | `reject-vpc-peering-connection` | — | `--vpc-peering-connection-id`, `--dry-run` | **NOT STARTED** | | `delete-vpc-peering-connection` | — | `--vpc-peering-connection-id`, `--dry-run` | **NOT STARTED** | | `describe-vpc-peering-connections` | — | `--vpc-peering-connection-ids`, `--filters`, `--max-results` | **NOT STARTED** | | `modify-vpc-peering-connection-options` | — | `--vpc-peering-connection-id`, `--requester-peering-connection-options`, `--accepter-peering-connection-options` | **NOT STARTED** | ### EC2 — VPC Endpoints | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-vpc-endpoint` | — | `--vpc-id`, `--service-name`, `--vpc-endpoint-type`, `--route-table-ids`, `--subnet-ids`, `--tag-specifications` | **NOT STARTED** | | `delete-vpc-endpoints` | — | `--vpc-endpoint-ids`, `--dry-run` | **NOT STARTED** | | `describe-vpc-endpoints` | — | `--vpc-endpoint-ids`, `--filters`, `--max-results` | **NOT STARTED** | | `describe-vpc-endpoint-services` | — | `--service-names`, `--filters`, `--max-results` | **NOT STARTED** | | `modify-vpc-endpoint` | — | `--vpc-endpoint-id`, `--add-route-table-ids`, `--remove-route-table-ids`, `--add-subnet-ids`, `--remove-subnet-ids` | **NOT STARTED** | ### EC2 — VPN & Customer Gateway | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-customer-gateway` | — | `--type`, `--bgp-asn`, `--ip-address`, `--tag-specifications` | **NOT STARTED** | | `delete-customer-gateway` | — | `--customer-gateway-id`, `--dry-run` | **NOT STARTED** | | `describe-customer-gateways` | — | `--customer-gateway-ids`, `--filters` | **NOT STARTED** | | `create-vpn-gateway` | — | `--type`, `--amazon-side-asn`, `--tag-specifications` | **NOT STARTED** | | `delete-vpn-gateway` | — | `--vpn-gateway-id`, `--dry-run` | **NOT STARTED** | | `attach-vpn-gateway` | — | `--vpn-gateway-id`, `--vpc-id` | **NOT STARTED** | | `detach-vpn-gateway` | — | `--vpn-gateway-id`, `--vpc-id` | **NOT STARTED** | | `describe-vpn-gateways` | — | `--vpn-gateway-ids`, `--filters` | **NOT STARTED** | | `create-vpn-connection` | — | `--type`, `--customer-gateway-id`, `--vpn-gateway-id`, `--options`, `--tag-specifications` | **NOT STARTED** | | `delete-vpn-connection` | — | `--vpn-connection-id`, `--dry-run` | **NOT STARTED** | | `describe-vpn-connections` | — | `--vpn-connection-ids`, `--filters` | **NOT STARTED** | | `modify-vpn-connection` | — | `--vpn-connection-id`, `--vpn-gateway-id`, `--customer-gateway-id` | **NOT STARTED** | | `modify-vpn-connection-options` | — | `--vpn-connection-id`, `--local-ipv4-network-cidr`, `--remote-ipv4-network-cidr` | **NOT STARTED** | ### EC2 — Network ACLs | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-network-acl` | — | `--vpc-id`, `--tag-specifications` | **NOT STARTED** | | `delete-network-acl` | — | `--network-acl-id`, `--dry-run` | **NOT STARTED** | | `describe-network-acls` | — | `--network-acl-ids`, `--filters`, `--max-results` | **NOT STARTED** | | `create-network-acl-entry` | — | `--network-acl-id`, `--rule-number`, `--protocol`, `--rule-action`, `--cidr-block`, `--ingress`/`--egress`, `--port-range` | **NOT STARTED** | | `delete-network-acl-entry` | — | `--network-acl-id`, `--rule-number`, `--ingress`/`--egress` | **NOT STARTED** | | `replace-network-acl-association` | — | `--association-id`, `--network-acl-id` | **NOT STARTED** | | `replace-network-acl-entry` | — | `--network-acl-id`, `--rule-number`, `--protocol`, `--rule-action`, `--cidr-block`, `--ingress`/`--egress`, `--port-range` | **NOT STARTED** | ### EC2 — Prefix Lists | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-managed-prefix-list` | — | `--prefix-list-name`, `--address-family`, `--max-entries`, `--entries`, `--tag-specifications` | **NOT STARTED** | | `delete-managed-prefix-list` | — | `--prefix-list-id`, `--dry-run` | **NOT STARTED** | | `describe-managed-prefix-lists` | — | `--prefix-list-ids`, `--filters`, `--max-results` | **NOT STARTED** | | `modify-managed-prefix-list` | — | `--prefix-list-id`, `--current-version`, `--add-entries`, `--remove-entries`, `--prefix-list-name` | **NOT STARTED** | | `get-managed-prefix-list-entries` | — | `--prefix-list-id`, `--target-version`, `--max-results` | **NOT STARTED** | | `get-managed-prefix-list-associations` | — | `--prefix-list-id`, `--max-results` | **NOT STARTED** | ### EC2 — Launch Templates | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-launch-template` | — | `--launch-template-name`, `--launch-template-data`, `--tag-specifications` | **NOT STARTED** | | `create-launch-template-version` | — | `--launch-template-id`/`--launch-template-name`, `--launch-template-data`, `--source-version` | **NOT STARTED** | | `delete-launch-template` | — | `--launch-template-id`/`--launch-template-name`, `--dry-run` | **NOT STARTED** | | `describe-launch-templates` | — | `--launch-template-ids`, `--launch-template-names`, `--filters` | **NOT STARTED** | | `describe-launch-template-versions` | — | `--launch-template-id`/`--launch-template-name`, `--versions`, `--min-version`, `--max-version` | **NOT STARTED** | ### EC2 — Dedicated Hosts, IPv4 Pools, DHCP, Capacity Reservations | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `allocate-hosts` | — | `--availability-zone`, `--instance-type`, `--quantity`, `--auto-placement`, `--tag-specifications` | **NOT STARTED** | | `describe-hosts` | — | `--host-ids`, `--filters`, `--max-results` | **NOT STARTED** | | `release-hosts` | — | `--host-ids` | **NOT STARTED** | | `create-public-ipv4-pool` | — | `--tag-specifications`, `--dry-run` | **NOT STARTED** | | `delete-public-ipv4-pool` | — | `--pool-id`, `--dry-run` | **NOT STARTED** | | `describe-public-ipv4-pools` | — | `--pool-ids`, `--filters`, `--max-results` | **NOT STARTED** | | `create-dhcp-options` | — | `--dhcp-configurations`, `--tag-specifications` | **NOT STARTED** | | `delete-dhcp-options` | — | `--dhcp-options-id`, `--dry-run` | **NOT STARTED** | | `describe-dhcp-options` | — | `--dhcp-options-ids`, `--filters`, `--max-results` | **NOT STARTED** | | `associate-dhcp-options` | — | `--dhcp-options-id`, `--vpc-id`, `--dry-run` | **NOT STARTED** | | `create-capacity-reservation` | — | `--instance-type`, `--instance-platform`, `--availability-zone`, `--instance-count`, `--end-date`, `--end-date-type`, `--instance-match-criteria`, `--tag-specifications` | **NOT STARTED** | | `cancel-capacity-reservation` | — | `--capacity-reservation-id`, `--dry-run` | **NOT STARTED** | | `describe-capacity-reservations` | — | `--capacity-reservation-ids`, `--filters`, `--max-results` | **NOT STARTED** | | `modify-capacity-reservation` | — | `--capacity-reservation-id`, `--instance-count`, `--end-date`, `--end-date-type` | **NOT STARTED** | ### EC2 — Misc | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `delete-network-interface-permission` | — | `--network-interface-permission-id`, `--force` | **NOT STARTED** | | `enable-address-transfer` | — | `--allocation-id`, `--transfer-account-id` | **NOT STARTED** | | `disable-address-transfer` | — | `--allocation-id` | **NOT STARTED** | ### EBS Direct API | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `start-snapshot` | — | `--volume-size`, `--parent-snapshot-id`, `--description`, `--encrypted` | **NOT STARTED** | | `put-snapshot-block` | — | `--snapshot-id`, `--block-index`, `--block-data`, `--checksum` | **NOT STARTED** | | `get-snapshot-block` | — | `--snapshot-id`, `--block-index` | **NOT STARTED** | | `complete-snapshot` | — | `--snapshot-id`, `--changed-blocks-count` | **NOT STARTED** | | `list-snapshot-blocks` | — | `--snapshot-id`, `--max-results`, `--next-token` | **NOT STARTED** | | `list-changed-blocks` | — | `--second-snapshot-id`, `--first-snapshot-id`, `--max-results` | **NOT STARTED** | --- ## IAM All IAM operations are account-scoped. Root user (account `000000000000`) bypasses policy evaluation entirely. ### IAM — Users | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-user` | `--user-name`, `--path` | `--tags`, `--permissions-boundary` | **DONE** | | `get-user` | `--user-name` | — | **DONE** | | `list-users` | `--path-prefix` | `--max-items`, `--marker` | **DONE** | | `delete-user` | `--user-name` | — | **DONE** | ### IAM — Access Keys Max 2 keys per user. Secrets encrypted with AES-256-GCM using master key, returned plaintext only at creation. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-access-key` | `--user-name` | — | **DONE** | | `list-access-keys` | `--user-name` | `--max-items`, `--marker` | **DONE** | | `delete-access-key` | `--access-key-id`, `--user-name` | — | **DONE** | | `update-access-key` | `--access-key-id`, `--user-name`, `--status` (Active/Inactive) | — | **DONE** | ### IAM — Policies Policy documents require `Version: "2012-10-17"` and a valid Statement array. Wildcard action matching supported (`ec2:*`, `ec2:Describe*`, `*`). Evaluation order: explicit Deny > explicit Allow > implicit Deny. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-policy` | `--policy-name`, `--policy-document`, `--path`, `--description` | `--tags` | **DONE** | | `get-policy` | `--policy-arn` | — | **DONE** | | `get-policy-version` | `--policy-arn`, `--version-id` | — | **DONE** | | `list-policies` | — | `--scope`, `--only-attached`, `--path-prefix`, `--max-items`, `--marker` | **DONE** | | `delete-policy` | `--policy-arn` | — | **DONE** | | `attach-user-policy` | `--user-name`, `--policy-arn` | — | **DONE** | | `detach-user-policy` | `--user-name`, `--policy-arn` | — | **DONE** | | `list-attached-user-policies` | `--user-name` | `--path-prefix`, `--max-items`, `--marker` | **DONE** | ### IAM — Policy Evaluation (internal — not an AWS API) | Feature | Status | |---------|--------| | Root user bypass | **DONE** | | Default deny | **DONE** | | Explicit allow | **DONE** | | Explicit deny | **DONE** | | Wildcard matching (`*`, `ec2:*`, `ec2:Describe*`) | **DONE** | | Account-scoped evaluation | **DONE** | | EC2 action mapping | **DONE** | | IAM action mapping (16 actions) | **DONE** | ### IAM — Roles | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-role` | `--role-name`, `--assume-role-policy-document`, `--path`, `--description`, `--max-session-duration`, `--tags` | `--permissions-boundary` | **DONE** | | `get-role` | `--role-name` | — | **DONE** | | `list-roles` | `--path-prefix` | `--max-items`, `--marker` | **DONE** | | `delete-role` | `--role-name` | — | **DONE** | | `update-role` | `--role-name`, `--description`, `--max-session-duration` | — | **DONE** | | `update-assume-role-policy` | `--role-name`, `--policy-document` | — | **DONE** | | `attach-role-policy` | `--role-name`, `--policy-arn` | — | **DONE** | | `detach-role-policy` | `--role-name`, `--policy-arn` | — | **DONE** | | `list-attached-role-policies` | `--role-name`, `--path-prefix` | `--max-items`, `--marker` | **DONE** | ### IAM — Instance Profiles Containers for IAM roles that allow EC2 instances to assume a role. Required for `run-instances --iam-instance-profile`. Max 1 role per profile. | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-instance-profile` | `--instance-profile-name`, `--path`, `--tags` | — | **DONE** | | `get-instance-profile` | `--instance-profile-name` | — | **DONE** | | `list-instance-profiles` | `--path-prefix` | `--max-items`, `--marker` | **DONE** | | `list-instance-profiles-for-role` | `--role-name` | `--max-items`, `--marker` | **DONE** | | `delete-instance-profile` | `--instance-profile-name` | — | **DONE** | | `add-role-to-instance-profile` | `--instance-profile-name`, `--role-name` | — | **DONE** | | `remove-role-from-instance-profile` | `--instance-profile-name`, `--role-name` | — | **DONE** | ### IAM — Groups | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-group` | — | `--group-name`, `--path` | **NOT STARTED** | | `get-group` | — | `--group-name` | **NOT STARTED** | | `list-groups` | — | `--path-prefix`, `--max-items`, `--marker` | **NOT STARTED** | | `delete-group` | — | `--group-name` | **NOT STARTED** | | `add-user-to-group` | — | `--group-name`, `--user-name` | **NOT STARTED** | | `remove-user-from-group` | — | `--group-name`, `--user-name` | **NOT STARTED** | | `list-groups-for-user` | — | `--user-name`, `--max-items`, `--marker` | **NOT STARTED** | | `attach-group-policy` | — | `--group-name`, `--policy-arn` | **NOT STARTED** | | `detach-group-policy` | — | `--group-name`, `--policy-arn` | **NOT STARTED** | | `list-attached-group-policies` | — | `--group-name`, `--path-prefix`, `--max-items`, `--marker` | **NOT STARTED** | --- ## STS | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `get-caller-identity` | — | — | **NOT STARTED** (Spinifex-custom version exists; proper STS endpoint pending) | | `assume-role` | — | `--role-arn`, `--role-session-name`, `--duration-seconds`, `--policy`, `--external-id`, `--serial-number`, `--token-code`, `--tags`, `--transitive-tag-keys` | **NOT STARTED** | | `get-session-token` | — | `--duration-seconds`, `--serial-number`, `--token-code` | **NOT STARTED** | --- ## ELBv2 (Application & Network Load Balancer) The data plane uses a system-managed LB VM running HAProxy, launched automatically during `create-load-balancer`. HAProxy config is pushed via NATS on listener/target changes. ### ELBv2 — Load Balancers | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-load-balancer` | `--name`, `--subnets`, `--security-groups`, `--scheme` (internet-facing/internal), `--tags`, `--ip-address-type` (ipv4) | `--type` (hardcoded application), `--customer-owned-ipv4-pool`, `--dry-run` | **DONE** | | `delete-load-balancer` | `--load-balancer-arn` | `--dry-run` | **DONE** | | `describe-load-balancers` | `--load-balancer-arns`, `--names` | `--page-size`, `--marker`, `--dry-run` | **DONE** | ### ELBv2 — Target Groups | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-target-group` | `--name`, `--protocol` (HTTP), `--port`, `--vpc-id`, `--target-type` (instance), `--health-check-protocol`, `--health-check-port`, `--health-check-path`, `--health-check-interval-seconds`, `--health-check-timeout-seconds`, `--healthy-threshold-count`, `--unhealthy-threshold-count`, `--matcher`, `--tags` | `--health-check-enabled`, `--protocol-version`, `--ip-address-type`, `--dry-run` | **DONE** | | `delete-target-group` | `--target-group-arn` | `--dry-run` | **DONE** | | `describe-target-groups` | `--target-group-arns`, `--names`, `--load-balancer-arn` | `--page-size`, `--marker`, `--dry-run` | **DONE** | ### ELBv2 — Targets | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `register-targets` | `--target-group-arn`, `--targets` (Id, Port) | `--dry-run` | **DONE** | | `deregister-targets` | `--target-group-arn`, `--targets` (Id, Port) | `--dry-run` | **DONE** | | `describe-target-health` | `--target-group-arn`, `--targets` | `--include` | **DONE** | ### ELBv2 — Listeners | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-listener` | `--load-balancer-arn`, `--default-actions` (Type=forward, TargetGroupArn), `--protocol` (HTTP), `--port` | `--ssl-policy`, `--certificates`, `--alpn-policy`, `--mutual-authentication`, `--dry-run` | **DONE** | | `delete-listener` | `--listener-arn` | `--dry-run` | **DONE** | | `describe-listeners` | `--load-balancer-arn`, `--listener-arns` | `--page-size`, `--marker`, `--dry-run` | **DONE** | ### ELBv2 — Tags | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `describe-tags` | `--resource-arns` (loadbalancer, targetgroup, listener) | — | **DONE** | ### ELBv2 — Not Yet Implemented | Feature | Priority | Status | |---------|----------|--------| | Listener rules (CreateRule, DeleteRule, DescribeRules, ModifyRule) | High | **NOT STARTED** | | HTTPS/TLS termination (SSL certificates, policies, ALPN) | High | **NOT STARTED** | | Modify operations (`ModifyLoadBalancerAttributes`, `ModifyTargetGroup`, `ModifyTargetGroupAttributes`, `ModifyListener`) | Medium | **NOT STARTED** | | Connection draining (deregistration delay) | Medium | **NOT STARTED** | | Stickiness / session affinity | Medium | **NOT STARTED** | | Active health checking (API-driven, vs. HAProxy-only today) | Medium | **NOT STARTED** | | IP and Lambda target types | Low | **NOT STARTED** | | S3 access log delivery | Low | **NOT STARTED** | | WAF integration | Low | **NOT STARTED** | --- ## CloudWatch (Basic Monitoring) | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `put-metric-data` | — | `--namespace`, `--metric-data` | **NOT STARTED** | | `get-metric-statistics` | — | `--namespace`, `--metric-name`, `--start-time`, `--end-time`, `--period`, `--statistics`, `--dimensions` | **NOT STARTED** | | `list-metrics` | — | `--namespace`, `--metric-name`, `--dimensions`, `--recently-active` | **NOT STARTED** | | `describe-alarms` | — | `--alarm-names`, `--alarm-name-prefix`, `--state-value`, `--action-prefix` | **NOT STARTED** | | `put-metric-alarm` | — | `--alarm-name`, `--namespace`, `--metric-name`, `--statistic`, `--period`, `--evaluation-periods`, `--threshold`, `--comparison-operator`, `--alarm-actions`, `--dimensions` | **NOT STARTED** | | `delete-alarms` | — | `--alarm-names` | **NOT STARTED** | --- ## Auto Scaling | Command | Implemented Flags | Missing Flags | Status | |---------|-------------------|---------------|--------| | `create-auto-scaling-group` | — | `--auto-scaling-group-name`, `--launch-template`, `--min-size`, `--max-size`, `--desired-capacity`, `--vpc-zone-identifier`, `--target-group-arns`, `--health-check-type`, `--health-check-grace-period`, `--tags` | **NOT STARTED** | | `update-auto-scaling-group` | — | `--auto-scaling-group-name`, `--min-size`, `--max-size`, `--desired-capacity`, `--launch-template`, `--health-check-type`, `--health-check-grace-period` | **NOT STARTED** | | `delete-auto-scaling-group` | — | `--auto-scaling-group-name`, `--force-delete` | **NOT STARTED** | | `describe-auto-scaling-groups` | — | `--auto-scaling-group-names`, `--filters`, `--max-records` | **NOT STARTED** | | `set-desired-capacity` | — | `--auto-scaling-group-name`, `--desired-capacity`, `--honor-cooldown` | **NOT STARTED** | | `describe-auto-scaling-instances` | — | `--instance-ids`, `--max-records` | **NOT STARTED** | | `put-scaling-policy` | — | `--auto-scaling-group-name`, `--policy-name`, `--policy-type`, `--target-tracking-configuration`, `--scaling-adjustment`, `--cooldown` | **NOT STARTED** | | `delete-scaling-policy` | — | `--auto-scaling-group-name`, `--policy-name` | **NOT STARTED** |