// STRYKE-AWS — ENGINEERING REPORT

Opt-in stryke connector package · cdylib libstryke_aws.{dylib,so} (crate-type = cdylib) · dlopen'd in-process on use AWS · JSON-over-FFI envelope · 17 services

Docs

>_EXECUTIVE SUMMARY

stryke-aws is one of the opt-in connector packages in the stryke ecosystem. AWS client for stryke across 17 services — S3, DynamoDB, SQS, Lambda, STS, SNS, SSM Parameter Store, Secrets Manager, SES, CloudWatch, CloudWatch Logs, EC2, KMS, IAM, Kinesis, ECR, and Step Functions. Opt-in package, kept out of the stryke core binary so the daily-driver install stays slim. The 17 SDKs combined are too much to bake into stryke core, so they ship as a Rust cdylib that stryke dlopens in-process on first use AWS.

The official aws-sdk-rust crates pull in tokio, hyper, rustls, and a fat chain of smithy / signing / endpoint-resolution support code. Ships once as an opt-in package. Credentials and region come from the standard AWS chain (env vars, ~/.aws/config|credentials, IMDS) — same as the aws CLI.

17
Services
cdylib
Crate type
opt-in
Tier
dlopen
Load model
JSON-over-FFI
Envelope

~ARCHITECTURE

In-process cdylib design: the stryke side is a thin .stk wrapper that calls FFI symbols on the dlopen'd library. No subprocess, no pipe — calls return on the same thread that made them. The v1 helper-binary fork-per-call model was replaced in v0.2.0.

LayerImplementation
stryke wrappers (lib/*.stk)17 service modules (AWS::S3, AWS::Dynamo, AWS::SQS, AWS::Lambda, AWS::STS, AWS::SNS, AWS::SSM, AWS::Secrets, AWS::SES, AWS::CloudWatch, AWS::Logs, AWS::EC2, AWS::KMS, AWS::IAM, AWS::Kinesis, AWS::ECR, AWS::StepFunctions) plus base AWS; each serializes args to JSON and parses the response
cdylib (libstryke_aws.{dylib,so})Single Rust cdylib crate; every public surface fn is an extern "C" fn aws__<verb>(*const c_char) -> *mut c_char
Process modelLibrary is dlopen'd once per stryke session on first use AWS; a shared tokio runtime + per-region aws_config::SdkConfig cache held in OnceCell; lives until the runtime exits
BuildCargo with [lib] crate-type = ["cdylib"]; publish = false; the package itself ships via s pkg install -g .
Install path~/.stryke/store/aws@<version>/ after make install; use AWS from any stryke script resolves it
Testszunit-style under t/ (test_aws.stk end-to-end, test_stryke_aws_surface.stk wrapper-completeness pin) with live-service variants gated on creds + opt-in env vars
CIGitHub Actions .github/workflows/ci.yml — cargo check + fmt + clippy + test + doc, cross-target release build, plus the docs / structure / polish / newline gate jobs

@SERVICE COVERAGE

Each row is a stryke module (use AWS::<Service>) and the operations it currently wraps. The full surface lives in the Docs API reference.

ModuleOperations
AWS::S3ls, get, put, head, rm, buckets, versions, location, tags, mb (CreateBucket), rb (DeleteBucket)
AWS::Dynamoget, put, delete, query, scan, describe, tables, transact, ttl, create, drop
AWS::SQSsend, receive, delete, list, purge, attrs, set_attrs, change_visibility, pump
AWS::Lambdainvoke, call, list, get
AWS::STScaller_identity, assume_role
AWS::SNStopics, create, publish, subscribe, unsubscribe, subscriptions, delete
AWS::SSMget, put, by_path, delete, get_many (Parameter Store)
AWS::Secretsget, create, put, list (Secrets Manager)
AWS::SESsend (email, v2)
AWS::CloudWatchput, list (metrics)
AWS::Logsgroups, create, filter, events, put (CloudWatch Logs)
AWS::EC2instances, start, stop, security_groups, vpcs, reboot
AWS::KMSkeys, describe, encrypt, decrypt, data_key
AWS::IAMusers, roles, user, role_policies, role
AWS::Kinesislist, describe, put
AWS::ECRrepositories, images
AWS::StepFunctionslist, start, describe

Flat extras on base use AWS: s3_copy_object, s3_delete_objects (≤1000), ddb_update_item, ddb_batch_get_item (≤100), ddb_batch_write_item (puts ≤25). Pure no-credential helpers (ARN / S3-URI / endpoint parsing + validation) are also on base AWS — see the Docs pure-helpers table.


!DEFERRED OPERATIONS

These wrappers exist but die with a message naming the cdylib export that needs adding. Intentionally not yet wired so the cdylib surface stays auditable against stryke.toml's [ffi] exports table.

OpStatus
AWS::S3::presigndeferred — needs aws__s3_presign
AWS::Dynamo::batch_writedeferred in the cdylib
AWS::Dynamo::scan_streamdeferred in the cdylib
AWS::Lambda invocation_type => "event"fire-and-forget deferred in the cdylib
SQS delay_seconds / dedup_id / group_idsend-option fields deferred
SQS wait / visibility on receivedeferred
AWS::SQS::list prefix filterdeferred — grep client-side instead

$WHY OPT-IN (NOT BUILTIN)

The official aws-sdk-rust crates pull in tokio, hyper, rustls, and a fat chain of smithy / signing / endpoint-resolution support code. The 17 SDKs combined are way too much to bake into stryke core. This package ships them once, opt-in.

The trade-off is intentional. The core stryke binary stays slim precisely because each connector ships separately. Daily-driver work (one-liners, awk replacement, data scripting) doesn't need AWS SDKs, MongoDB drivers, or Spark Connect bindings linked in. Core stryke is never linked against this package's deps.


&FFI ENVELOPE

JSON in / JSON out across the FFI boundary. Each AWS::* wrapper serializes its args to a JSON dict and calls the matching aws__* symbol resolved out of libstryke_aws.{dylib,so} (declared in stryke.toml's [ffi] exports); the cdylib returns a JSON CString the wrapper parses. The returned CString is freed via the cdylib-exported stryke_free_cstring, wired automatically by rust_ffi::load_cdylib.

# request shape (built by the .stk wrapper)
{"verb": "<op>", "...": ...}

# response shape
{"result": ...}            # success — per-fn shape
{"error": "<msg>"}        # failure — wrapper die()s with the message

Persistent state: a shared tokio runtime + an aws_config::SdkConfig cache per region held in OnceCell — no fork-per-call, no full IMDS/SSO/env creds chain on each call.


/SCOPE

See the README's "Why this is a package" + "API reference" sections for the authoritative scope. The package is intentionally narrower than its underlying SDKs — the goal is "useful from a shell pipeline", not "complete API coverage". DynamoDB items are plain JSON in / out (no AttributeValue wrappers); S3 put is buffered. Roadmap-later items: deferred ops above, typed-set passthrough, optimistic-locking helpers, and streaming multipart upload.


#PROJECT METADATA

ItemValue
Versionv0.19.0
LicenseMIT
AuthorMenkeTechnologies
Repositorygithub.com/MenkeTechnologies/stryke-aws
Parent languagestrykelang
Meta umbrellaMenkeTechnologiesMeta
Issuesgithub.com/MenkeTechnologies/stryke-aws/issues