floci-io/floci · error · AwsException

ValidationException

ValidationException

Error message

Reserved tag keys with prefix floci: can only be supplied during resource creation.

What it means

Thrown by PutWebhook when the webhook object in the request has no name or a blank name. The webhook name is the primary identifier: it becomes the storage key, the URL path segment, and the ARN suffix, so the emulator rejects the request before creating any of those. It maps to AWS's WebhookName validation.

Source

Thrown at src/main/java/io/github/hectorvent/floci/core/common/ReservedTags.java:113

        }
        for (String key : tags.keySet()) {
            if (isReserved(key) || DEPRECATED_API_GATEWAY_CUSTOM_ID_KEY.equals(key)) {
                throw new AwsException(
                        BAD_REQUEST_EXCEPTION,
                        "Reserved tag key " + key + " can only be supplied during resource creation.",
                        400
                );
            }
        }
    }

    public static void rejectReservedTagsOnUpdate(Map<String, String> tags) {
        if (tags == null) {
            return;
        }
        for (String key : tags.keySet()) {
            if (isReserved(key)) {
                throw new AwsException(
                        VALIDATION_EXCEPTION,
                        "Reserved tag keys with prefix " + RESERVED_PREFIX + " can only be supplied during resource creation.",
                        400
                );
            }
        }
    }

    public static void rejectUnknownReservedTags(Map<String, String> tags, String errorCode) {
        if (tags == null) {
            return;
        }
        for (String key : tags.keySet()) {
            if (isReserved(key) && !key.equals(OVERRIDE_ID_KEY) && !key.equals(OVERRIDE_COGNITO_CLIENT_ID_KEY) && !key.equals(OVERRIDE_COGNITO_CLIENT_SECRET_KEY)) {
                    throw new AwsException(
                            errorCode,
                            "%s is an unknown Reserved Tag.".formatted(key),
                            400

View on GitHub (pinned to 62ff490619)

Solutions

  1. Set webhook.name to a non-blank value matching AWS constraints (letters, numbers, and hyphens, max 100 chars typical)
  2. Validate the name is non-empty in your IaC/template before issuing PutWebhook
  3. Check the value was interpolated correctly when templating the request payload

Example fix

// before
client.putWebhook(r -> r.webhook(w -> w.definition(d -> d.name(webhookName)))); // webhookName empty

// after
if (webhookName == null || webhookName.isBlank()) throw new IllegalArgumentException("webhookName required");
client.putWebhook(r -> r.webhook(w -> w.definition(d -> d.name(webhookName))));
Defensive patterns

Strategy: validation

Validate before calling

String name = webhookName;
if (name == null || name.isBlank() || !name.matches("[A-Za-z0-9.-]+")) {
    throw new IllegalArgumentException("webhook name invalid: " + name);
}
client.putWebhook(r -> r.webhook(w -> w.definition(d -> d.name(name))));

Prevention

When it happens

Trigger: Calling PutWebhook with an empty webhook object; webhook.name set to "" or whitespace; building the request from a template where the name placeholder was never filled.

Common situations: Infrastructure code that generates webhook names from an unset variable; CI pipelines passing an empty environment variable into the webhook definition; SDK builders that permit null names client-side.

Related errors


AI-assisted analysis of floci-io/floci@62ff490619 (2026-08-14). Data as JSON: /api/errors/17aba2c749a944f9. Report an issue: GitHub.