{
    "$schema": "http://json-schema.org/schema#",
    "type": "object",
    "properties": {
        "type": {
            "type": "string",
            "description": "The service type (should always be 's3')",
            "pattern": "^s3$",
            "errorMessage": "Must be 's3'"
        },
        "bucket_name": {
            "type": "string",
            "errorMessage": "Must be a unique string"
        },
        "bucket_acl": {
            "type": "string",
            "description": "The 'bucket_acl' parameter (should be 'AuthenticatedRead', 'AwsExecRead', 'BucketOwnerRead', 'BucketOwnerFullControl', 'LogDeliveryWrite', 'Private' or 'PublicRead')",
            "pattern": "^AuthenticatedRead|AwsExecRead|BucketOwnerRead|BucketOwnerFullControl|LogDeliveryWrite|Private|PublicRead$",
            "errorMessage": "Must be 'AuthenticatedRead', 'AwsExecRead', 'BucketOwnerRead', 'BucketOwnerFullControl', 'LogDeliveryWrite', 'Private' or 'PublicRead'"
        },
        "versioning": {
            "type": "string",
            "description": "The 'versioning' parameter must be either 'enabled' or 'disabled'",
            "pattern": "^enabled|disabled$",
            "errorMessage": "Must be either 'enabled' or 'disabled'"
        },
        "logging": {
            "type": "string",
            "description": "The 'logging' parameter must be either 'enabled' or 'disabled'",
            "pattern": "^enabled|disabled$",
            "errorMessage": "Must be either 'enabled' or 'disabled'"
        },
        "lifecycles": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "errorMessage": "Must be a string"
                    },
                    "prefix": {
                        "type": "string",
                        "errorMessage": "Must be a string"
                    },
                    "transitions": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "type": {
                                    "type": "string",
                                    "description": "Type of transition must be one of ia(Standard Infrequent Access), glacier, expiration (deletion)",
                                    "pattern": "^ia|glacier|expiration$",
                                    "errorMessage": "Must be 'ia', 'glacier', or 'expiration'"
                                },
                                "days": {
                                    "type": "integer",
                                    "errorMessage": "Must be an intiger"
                                },
                                "date": {
                                    "type": "string",
                                    "format": "date-time",
                                    "errorMessage": "Must be a date in ISO 8061 format"
                                }
                            },
                            "required": [
                                "type"
                            ],
                            "additionalProperties": false,
                            "errorMessage": {
                                "required": {
                                    "type": "The 'type' field is required'"
                                },
                                "additionalProperties": "Invalid/Unknown property specified"
                            }
                        }
                    },
                    "version_transitions": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "type": {
                                    "type": "string",
                                    "description": "Type of transition must be one of ia(Standard Infrequent Access), glacier, expiration (deletion)",
                                    "pattern": "^ia|glacier|expiration$",
                                    "errorMessage": "Must be 'ia', 'glacier', or 'expiration'"
                                },
                                "days": {
                                    "type": "integer",
                                    "errorMessage": "Must be an intiger"
                                }
                            },
                            "required": [
                                "type"
                            ],
                            "additionalProperties": false,
                            "errorMessage": {
                                "required": {
                                    "type": "The 'type' field is required"
                                },
                                "additionalProperties": "Invalid/Unknown property specified"
                            }
                        }
                    }
                },
                "required": [
                    "name"
                ],
                "additionalProperties": false,
                "errorMessage": {
                    "required": {
                        "name": "The 'name' field is required"
                    },
                    "additionalProperties": "Invalid/Unknown property specified"
                }
            }
        },
        "event_consumers": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "service_name": {
                        "type": "string",
                        "errorMessage": "The 'service_name' parameter is required in each config"
                    },
                    "bucket_events": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "errorMessage": "Must be a list of strings"
                    },
                    "filters": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "name": {
                                    "type": "string",
                                    "pattern": "^prefix|suffix$",
                                    "errorMessage": "Must be one of the following values: 'prefix', 'suffix'"
                                },
                                "value": {
                                    "type": "string",
                                    "errorMessage": "Must be a string"
                                }
                            },
                            "additionalProperties": false,
                            "required": [
                                "name",
                                "value"
                            ],
                            "errorMessage": {
                                "required": {
                                    "name": "The 'name' field is required",
                                    "value": "The 'value' field is required"
                                },
                                "additionalProperties": "Invalid/Unknown property specified"
                            }
                        }
                    }
                },
                "required": [
                    "service_name",
                    "bucket_events",
                    "filters"
                ],
                "additionalProperties": false,
                "errorMessage": {
                    "required": {
                        "service_name": "The 'service_name' parameter is required",
                        "bucket_events": "The 'bucket_events' parameter is required",
                        "filters": "The 'filters' parameter is required"
                    },
                    "additionalProperties": "Invalid/Unknown property specified"
                }
            }
        },
        "tags": {
            "type": "object",
            "description": "An arbitrary list of key/value pairs to be added as tags to the service",
            "patternProperties": {
                "^.*$": {
                    "anyOf": [
                        {
                            "type": "string"
                        },
                        {
                            "type": "number"
                        }
                    ]
                }
            },
            "errorMessage": "Must contain 1 or more simple key/value pairs where the values are strings or numbers",
            "additionalProperties": false
        }
    },
    "required": [
        "type"
    ],
    "additionalProperties": false,
    "errorMessage": {
        "required": {
            "type": "The 'type' field is required"
        },
        "additionalProperties": "Invalid/Unknown property specified"
    }
}