{"record":{"id":"7b8433242a5a9139","repo":"floci-io/floci","slug":"s-is-an-unknown-reserved-tag","errorCode":null,"errorMessage":"%s is an unknown Reserved Tag.","messagePattern":"(.+?) is an unknown Reserved Tag\\.","errorType":"http","errorClass":"AwsException","httpStatus":400,"severity":"error","filePath":"src/main/java/io/github/hectorvent/floci/core/common/ReservedTags.java","lineNumber":128,"sourceCode":"        }\n        for (String key : tags.keySet()) {\n            if (isReserved(key)) {\n                throw new AwsException(\n                        VALIDATION_EXCEPTION,\n                        \"Reserved tag keys with prefix \" + RESERVED_PREFIX + \" can only be supplied during resource creation.\",\n                        400\n                );\n            }\n        }\n    }\n\n    public static void rejectUnknownReservedTags(Map<String, String> tags, String errorCode) {\n        if (tags == null) {\n            return;\n        }\n        for (String key : tags.keySet()) {\n            if (isReserved(key) && !key.equals(OVERRIDE_ID_KEY) && !key.equals(OVERRIDE_COGNITO_CLIENT_ID_KEY) && !key.equals(OVERRIDE_COGNITO_CLIENT_SECRET_KEY)) {\n                    throw new AwsException(\n                            errorCode,\n                            \"%s is an unknown Reserved Tag.\".formatted(key),\n                            400\n                    );\n                }\n        }\n    }\n\n    private static String getOverride(Map<String, String> tags, String override, TriFunction<String, String, String, String> validator, String name, String errorCode) {\n        if (tags == null) {\n            return null;\n        }\n        if (tags.containsKey(override)) {\n            String ov = tags.get(override);\n            return validator.apply(ov, name, errorCode);\n        }\n        return null;\n    }","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/floci-io/floci/blob/62ff490619e7bd3554597c28c704081b4c15add5/src/main/java/io/github/hectorvent/floci/core/common/ReservedTags.java#L110-L146","documentation":"Thrown during pipeline execution when a stage action declares owner 'AWS' but its provider is not one of the providers the emulator implements: S3, CodeBuild, CodeDeploy, Lambda, or CodePipeline. Real AWS supports many more AWS-owned providers (e.g. ECR, CodeCommit, GitHub? no—those differ, CloudFormation, ECS, etc.); Floci fails the action declaration rather than silently no-oping. It surfaces as InvalidActionDeclarationException at action start.","triggerScenarios":"A pipeline with a deploy action using provider 'CloudFormation', 'ECS', 'ECR', 'CodeCommit', 'SNS', or any AWS-owned provider outside the supported five; importing an existing production pipeline into the emulator unchanged.","commonSituations":"Porting real-world pipelines to local testing; pipelines whose source stage uses CodeCommit or ECR; newly added provider types in AWS that the emulator version predates.","solutions":["Replace unsupported AWS-owned provider actions with one of S3, CodeBuild, CodeDeploy, Lambda, or CodePipeline for emulator runs","For source actions, switch to an S3 source (S3Bucket/S3ObjectKey configuration) which the emulator fully executes","If you need a custom worker flow, change the action owner to Custom and poll with PollForJobs instead"],"exampleFix":"# before\n- Name: Deploy\n  Actions:\n    - Name: cfn-deploy\n      ActionTypeId: { Category: Deploy, Owner: AWS, Provider: CloudFormation, Version: '1' }\n\n# after\n- Name: Deploy\n  Actions:\n    - Name: lambda-deploy\n      ActionTypeId: { Category: Deploy, Owner: AWS, Provider: Lambda, Version: '1' }","handlingStrategy":"validation","validationCode":"Set<String> supported = Set.of(\"S3\", \"CodeBuild\", \"CodeDeploy\", \"Lambda\", \"CodePipeline\");\nfor (ActionDeclaration a : stage.actions()) {\n    if (\"AWS\".equals(a.actionTypeId().owner())\n            && !supported.contains(a.actionTypeId().provider())) {\n        throw new UnsupportedOperationException(\n            \"Provider not available in emulator: \" + a.actionTypeId().provider());\n}","typeGuard":null,"tryCatchPattern":"try {\n    client.createPipeline(req);\n} catch (InvalidActionDeclarationException e) {\n    // surface which provider is unsupported; adjust pipeline for emulator runs\n}","preventionTips":["Keep an emulator-compatibility lint step that scans pipeline definitions for unsupported AWS providers","Maintain a separate emulator variant of production pipelines using supported providers"],"tags":["codepipeline","provider","emulator-limitation","action-declaration"],"backgroundTag":null,"analyzedSha":"62ff490619e7bd3554597c28c704081b4c15add5","analyzedAt":"2026-08-14T14:25:23.764Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}