@cfxlabsinc/b2b-services
    Preparing search index...
    interface LambdaAppArgs {
        alarmTopicArn: Input<string>;
        architecture: Input<"x86_64" | "arm64">;
        code?: Archive;
        containerImageUri?: Input<string>;
        environment?: Input<FunctionEnvironment>;
        handler?: Input<string>;
        layers?: Input<Input<string>[]>;
        legacyResourceNames?: { function?: string; logGroup?: string };
        memorySize?: Input<number>;
        privateSubnetIds: Input<string[]>;
        provisionedConcurrency?: { provisionedConcurrentExecutions: Input<number> };
        publishTopicArns?: Input<string>[];
        runtime?: Input<string>;
        slowResponseAlarmThresholdMs?: number;
        timeout?: Input<number>;
        usesIdempotencyTable?: boolean;
        vpcId: Input<string>;
    }
    Index
    alarmTopicArn: Input<string>

    SNS topic for the init-failure alarm. Required, not optional: a lambda that silently ships without this alarm is the failure mode the alarm exists to prevent.

    architecture: Input<"x86_64" | "arm64">

    Instruction set architecture for the function. Either "x86_64" or "arm64".

    code?: Archive

    The deployment package. Widened from FileArchive to Archive so a caller can pass an AssetArchive of inline source instead of a built bundle directory — the Outpost bridge in @cfxlabsinc/events is ~40 lines with no dependencies, so an esbuild bundle would buy it nothing. FileArchive remains assignable, so every existing caller is unaffected.

    containerImageUri?: Input<string>

    URI of the OCI image used as the main service container image.

    environment?: Input<FunctionEnvironment>
    handler?: Input<string>
    layers?: Input<Input<string>[]>
    legacyResourceNames?: { function?: string; logGroup?: string }

    Prior top-level Pulumi resource names, for an app moving onto LambdaApp from hand-rolled resources.

    A resource's Pulumi identity is its URN (type + name + parent), not its physical AWS name. Adopting this component changes both the name and the parent, so without an alias Pulumi plans a create — and AWS rejects it because the physical name is still held by the resource Pulumi is about to delete (ResourceAlreadyExistsException for the log group, ResourceConflictException for the function). Aliases re-bind the existing state entries to the new URNs so they update in place instead.

    memorySize?: Input<number>

    Amount of memory in MB your Lambda Function can use at runtime. Valid value between 128 MB to 10,240 MB (10 GB), in 1 MB increments. Defaults to 128.

    privateSubnetIds: Input<string[]>

    Private subnets the function's ENIs attach to.

    provisionedConcurrency?: { provisionedConcurrentExecutions: Input<number> }
    publishTopicArns?: Input<string>[]

    SNS topics this function may publish to. Pass CUSTOMER_EVENTS_TOPIC_ARN to make it a public-bus publisher.

    The grant lands on this app's own execution role, declared here in the app's own stack — the same shape as its S3 and DynamoDB access, and the reason a new publisher cannot be forgotten in a list somewhere else and discover it at runtime as AccessDenied.

    Omitted or empty grants no publish access.

    runtime?: Input<string>
    slowResponseAlarmThresholdMs?: number

    Handler duration in ms above which a SINGLE invocation raises an alarm.

    Opt-in, and deliberately so: this is a per-service response-time budget, not a fleet-wide health check. A function whose work is legitimately slow (a batch consumer, a report generator) has no such budget and should not carry the alarm — a threshold picked to fit everything fits nothing, gets muted, and a muted alarm is worse than none.

    Set it where a partner is waiting on the response. cfx-greendot-processor-api is the case this was built for: Green Dot's gateway holds the card authorisation open while we answer, so a slow answer is a failed authorisation long before it is a timeout.

    Alarms on Maximum, not an average or a percentile — the ask is "did ANY response exceed the budget", and an average over a low-traffic API hides exactly the one request that did. See slowResponseAlert.

    timeout?: Input<number>

    Amount of time your Lambda Function has to run in seconds. Valid between 1 and 900. Defaults to DEFAULT_TIMEOUT_SECONDS.

    usesIdempotencyTable?: boolean

    Whether this function uses the shared idempotency table. Set it wherever IDEMPOTENCY_TABLE_NAME appears in environment; omitting it grants no DynamoDB access.

    vpcId: Input<string>

    Networking and alerting inputs, as SCALARS.

    This component used to take a commonInfraStackRef and call requireOutput on it internally. That made the set of outputs it depended on invisible at every call site, and coupled ~20 lambda stacks to one stack's output names: when alarmTopicArn moved to cfx-ecs on 2026-08-03, every lambda deploy failed at once, in a file none of them mention. Passing values in makes the dependency visible and lets each stack source it from wherever that value now lives.