Repository: cloudtools/troposphere
Pull request #2147 (2023-04-17 08:34:00)

TypeError() return the expected Class as last exception argument
When the validator is used instead of the AWSProperty class (i.e. in WAFv2 for `Statement`), the TypeError() will return the expected AWSProperty SubClass as the last argument. This enables other libraries to identify the expected class and perform manipulations to import the resource property class.

For simpler class types (int, str, etc.) the validators only validate that the input is of that exact type and is simpler to catch.

Went over all the validators, these are the only two with an AWSProperty type validation, for due diligence. Although only need this today with WAFv2


Patch:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 26b8ab2b..04553c47 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -45,7 +45,7 @@ make spec
 To generate code, the current process is roughly, scan the CloudFormation history to identify changes and then run (using S3 as an example):
 
 ```
-python3 scripts/gen.py s3 CloudFormationResourceSpecification.json > troposphere/s3.py
+python3 scripts/gen.py s3 > troposphere/s3.py
 ```
 Use the auto-formatters to clean up the generated code using:
 ```
diff --git a/scripts/gen.py b/scripts/gen.py
index 50c775fa..8e62d340 100755
--- a/scripts/gen.py
+++ b/scripts/gen.py
@@ -132,6 +132,7 @@ class Service:
         self.documentation: str = None
         self.resources: Dict[str, ResourceType] = {}
         self.properties: Dict[str, PropertyType] = {}
+        self.standalone_types: Dict[str, Property] = {}
         self.class_validators = {}
         self.property_validators = defaultdict(dict)
         self.constants = []
@@ -270,6 +271,9 @@ class ResourceSpec:
                 service.properties[class_name] = PropertyType(
                     documentation, properties, property_name
                 )
+            else:
+                # No Properties, record as a standalone type
+                service.standalone_types[class_name] = property_dict
 
         for service_name, service in self.services.items():
             self._get_validators(service_name, service)
@@ -277,6 +281,7 @@ class ResourceSpec:
         # Run some automatic "fixups" across the services
         self._fix_tags()
         self._fix_duplicate_names()
+        self._fix_standalone_types()
 
         return self
 
@@ -343,6 +348,51 @@ class ResourceSpec:
                 for (class_name, key, value) in service.get_property_items():
                     update_property(dup_class_name, new_class_name, value)
 
+    def _fix_standalone_types(self):
+        for service_name, service in self.services.items():
+            for (class_name, key, value) in service.get_property_items():
+                if key == "Tags":
+                    continue
+
+                if (
+                    value.type in service.standalone_types
+                    or value.item_type in service.standalone_types
+                ):
+
+                    # Determine if matching a type or item_type
+                    if value.type in service.standalone_types:
+                        update_name = value.type
+                    else:
+                        update_name = value.item_type
+
+                    sat = service.standalone_types[update_name]
+
+                    # Determine if updating a Resource or a Property
+                    if class_name in service.properties:
+                        props = service.properties[class_name].properties
+                    else:
+                        props = service.resources[class_name].properties
+
+                    # Determine if the replacement it a Type or PrimitiveType
+                    primitive = False
+                    if "Type" in sat:
+                        replacement_type = sat["Type"]
+                    else:
+                        replacement_type = sat["PrimitiveType"]
+                        primitive = True
+
+                    if props[key].type == update_name:
+                        if primitive:
+                            props[key].primitive_type = replacement_type
+                        else:
+                            props[key].type = replacement_type
+                    else:
+                        if primitive:
+                            props[key].primitive_item_type = replacement_type
+                            props[key].item_type = ""
+                        else:
+                            props[key].item_type = replacement_type
+
     def _get_validators(self, service_name, service):
         """
         Look for a validator file with a corresponding service name to
@@ -422,6 +472,7 @@ class CodeGenerator:
         self.service = service
         self.resources: Dict[str, ResourceType] = service.resources
         self.properties: Dict[str, PropertyType] = service.properties
+        self.standalone_types: Dict[str, PropertyType] = service.standalone_types
         self.property_validators = service.property_validators
         self.statement_found = False
 
diff --git a/scripts/patches/connect.py b/scripts/patches/connect.py
new file mode 100644
index 00000000..924956a2
--- /dev/null
+++ b/scripts/patches/connect.py
@@ -0,0 +1,67 @@
+patches = [
+    # Omit Connect::EvaluationForm for now due to recursion issues
+    {
+        "op": "remove",
+        "path": "/ResourceTypes/AWS::Connect::EvaluationForm",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormBaseItem",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormSection",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormItem",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.NumericQuestionPropertyValueAutomation",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormNumericQuestionAutomation",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormNumericQuestionProperties",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormQuestionTypeProperties",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormQuestion",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionAutomationOption",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionAutomation",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionProperties",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormNumericQuestionOption",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionOption",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.ScoringStrategy",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::Connect::EvaluationForm.SingleSelectQuestionRuleCategoryAutomation",
+    },
+]
diff --git a/scripts/patches/events.py b/scripts/patches/events.py
index 0e3ec112..de37f3a8 100644
--- a/scripts/patches/events.py
+++ b/scripts/patches/events.py
@@ -4,6 +4,15 @@ patches = [
         "path": "/ResourceTypes/AWS::Events::EventBus/Properties/Tags/ItemType",
         "value": "Tags",
     },
+    {
+        "op": "add",
+        "path": "/ResourceTypes/AWS::Events::Rule/Properties/Tags",
+        "value": {
+            "Type": "List",
+            "ItemType": "Tags",
+            "Required": False,
+        },
+    },
     # Remove unused Tag and TagEntry (remapped to troposphere Tags)
     {
         "op": "remove",
diff --git a/scripts/patches/s3.py b/scripts/patches/s3.py
index 384723f0..ba1522cc 100644
--- a/scripts/patches/s3.py
+++ b/scripts/patches/s3.py
@@ -1,13 +1,4 @@
 patches = [
-    {
-        "op": "remove",
-        "path": "/PropertyTypes/AWS::S3::StorageLens.S3BucketDestination/Properties/Encryption/Type",
-    },
-    {
-        "op": "add",
-        "path": "/PropertyTypes/AWS::S3::StorageLens.S3BucketDestination/Properties/Encryption/PrimitiveType",
-        "value": "Json",
-    },
     # Rename AWS::S3::StorageLens.DataExport to AWS::S3::StorageLens.StorageLensDataExport due to conflict with AWS::S3::Bucket.DataExport
     {
         "op": "move",
diff --git a/scripts/patches/sagemaker.py b/scripts/patches/sagemaker.py
index 05435ad7..4050eb79 100644
--- a/scripts/patches/sagemaker.py
+++ b/scripts/patches/sagemaker.py
@@ -43,15 +43,6 @@ patches = [
         "path": "/PropertyTypes/AWS::SageMaker::ModelQualityJobDefinition.ModelQualityJobInput/Properties/EndpointInput/Type",
         "value": "ModelQualityEndpointInput",
     },
-    # CreatedBy, LastModifiedBy, and Tag are documented as "Not currently supported by AWS CloudFormation."
-    {
-        "op": "remove",
-        "path": "/ResourceTypes/AWS::SageMaker::ModelPackage/Properties/CreatedBy",
-    },
-    {
-        "op": "remove",
-        "path": "/ResourceTypes/AWS::SageMaker::ModelPackage/Properties/LastModifiedBy",
-    },
     {
         "op": "remove",
         "path": "/PropertyTypes/AWS::SageMaker::ModelPackage.ModelPackageContainerDefinition/Properties/Environment/Type",
diff --git a/troposphere/amazonmq.py b/troposphere/amazonmq.py
index 3a7e410b..f2afa240 100644
--- a/troposphere/amazonmq.py
+++ b/troposphere/amazonmq.py
@@ -101,6 +101,8 @@ class Broker(AWSObject):
         "AutoMinorVersionUpgrade": (boolean, True),
         "BrokerName": (str, True),
         "Configuration": (ConfigurationId, False),
+        "DataReplicationMode": (str, False),
+        "DataReplicationPrimaryBrokerArn": (str, False),
         "DeploymentMode": (str, True),
         "EncryptionOptions": (EncryptionOptions, False),
         "EngineType": (str, True),
diff --git a/troposphere/apigatewayv2.py b/troposphere/apigatewayv2.py
index 5b43d10e..ed36c44e 100644
--- a/troposphere/apigatewayv2.py
+++ b/troposphere/apigatewayv2.py
@@ -360,6 +360,16 @@ class Route(AWSObject):
     }
 
 
+class ParameterConstraints(AWSProperty):
+    """
+    `ParameterConstraints <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-routeresponse-parameterconstraints.html>`__
+    """
+
+    props: PropsDictType = {
+        "Required": (boolean, True),
+    }
+
+
 class RouteResponse(AWSObject):
     """
     `RouteResponse <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-routeresponse.html>`__
@@ -415,16 +425,6 @@ class VpcLink(AWSObject):
     }
 
 
-class ParameterConstraints(AWSProperty):
-    """
-    `ParameterConstraints <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-routeresponse-parameterconstraints.html>`__
-    """
-
-    props: PropsDictType = {
-        "Required": (boolean, True),
-    }
-
-
 class ResponseParameter(AWSProperty):
     """
     `ResponseParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-integration-responseparameter.html>`__
diff --git a/troposphere/appconfig.py b/troposphere/appconfig.py
index a3f2dfad..b2a73b15 100644
--- a/troposphere/appconfig.py
+++ b/troposphere/appconfig.py
@@ -7,7 +7,7 @@
 
 
 from . import AWSObject, AWSProperty, PropsDictType, Tags
-from .validators import double
+from .validators import boolean, double, integer
 from .validators.appconfig import (
     validate_growth_type,
     validate_replicate_to,
@@ -124,6 +124,50 @@ class Environment(AWSObject):
     }
 
 
+class Parameter(AWSProperty):
+    """
+    `Parameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-extension-parameter.html>`__
+    """
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "Required": (boolean, True),
+    }
+
+
+class Extension(AWSObject):
+    """
+    `Extension <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extension.html>`__
+    """
+
+    resource_type = "AWS::AppConfig::Extension"
+
+    props: PropsDictType = {
+        "Actions": (dict, True),
+        "Description": (str, False),
+        "LatestVersionNumber": (integer, False),
+        "Name": (str, True),
+        "Parameters": (dict, False),
+        "Tags": (Tags, False),
+    }
+
+
+class ExtensionAssociation(AWSObject):
+    """
+    `ExtensionAssociation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extensionassociation.html>`__
+    """
+
+    resource_type = "AWS::AppConfig::ExtensionAssociation"
+
+    props: PropsDictType = {
+        "ExtensionIdentifier": (str, False),
+        "ExtensionVersionNumber": (integer, False),
+        "Parameters": (dict, False),
+        "ResourceIdentifier": (str, False),
+        "Tags": (Tags, False),
+    }
+
+
 class HostedConfigurationVersion(AWSObject):
     """
     `HostedConfigurationVersion <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-hostedconfigurationversion.html>`__
diff --git a/troposphere/appflow.py b/troposphere/appflow.py
index 0c1eb2d2..f2909b94 100644
--- a/troposphere/appflow.py
+++ b/troposphere/appflow.py
@@ -247,6 +247,8 @@ class SalesforceConnectorProfileCredentials(AWSProperty):
         "AccessToken": (str, False),
         "ClientCredentialsArn": (str, False),
         "ConnectorOAuthRequest": (ConnectorOAuthRequest, False),
+        "JwtToken": (str, False),
+        "OAuth2GrantType": (str, False),
         "RefreshToken": (str, False),
     }
 
@@ -471,6 +473,7 @@ class SAPODataConnectorProfileProperties(AWSProperty):
         "ApplicationHostUrl": (str, False),
         "ApplicationServicePath": (str, False),
         "ClientNumber": (str, False),
+        "DisableSSO": (boolean, False),
         "LogonLanguage": (str, False),
         "OAuthProperties": (OAuthProperties, False),
         "PortNumber": (integer, False),
@@ -880,6 +883,17 @@ class AmplitudeSourceProperties(AWSProperty):
     }
 
 
+class DataTransferApi(AWSProperty):
+    """
+    `DataTransferApi <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-datatransferapi.html>`__
+    """
+
+    props: PropsDictType = {
+        "Name": (str, True),
+        "Type": (str, True),
+    }
+
+
 class CustomConnectorSourceProperties(AWSProperty):
     """
     `CustomConnectorSourceProperties <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectorsourceproperties.html>`__
@@ -887,6 +901,7 @@ class CustomConnectorSourceProperties(AWSProperty):
 
     props: PropsDictType = {
         "CustomProperties": (dict, False),
+        "DataTransferApi": (DataTransferApi, False),
         "EntityName": (str, True),
     }
 
@@ -1174,7 +1189,6 @@ class TriggerConfig(AWSProperty):
     """
 
     props: PropsDictType = {
-        "ActivateFlowOnCreate": (boolean, False),
         "TriggerProperties": (ScheduledTriggerProperties, False),
         "TriggerType": (str, True),
     }
@@ -1191,6 +1205,7 @@ class Flow(AWSObject):
         "Description": (str, False),
         "DestinationFlowConfigList": ([DestinationFlowConfig], True),
         "FlowName": (str, True),
+        "FlowStatus": (str, False),
         "KMSArn": (str, False),
         "MetadataCatalogConfig": (MetadataCatalogConfig, False),
         "SourceFlowConfig": (SourceFlowConfig, True),
diff --git a/troposphere/appintegrations.py b/troposphere/appintegrations.py
index a924a8c8..31075b58 100644
--- a/troposphere/appintegrations.py
+++ b/troposphere/appintegrations.py
@@ -9,14 +9,25 @@
 from . import AWSObject, AWSProperty, PropsDictType, Tags
 
 
+class FileConfiguration(AWSProperty):
+    """
+    `FileConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-fileconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "Filters": (dict, False),
+        "Folders": ([str], True),
+    }
+
+
 class ScheduleConfig(AWSProperty):
     """
     `ScheduleConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-scheduleconfig.html>`__
     """
 
     props: PropsDictType = {
-        "FirstExecutionFrom": (str, True),
-        "Object": (str, True),
+        "FirstExecutionFrom": (str, False),
+        "Object": (str, False),
         "ScheduleExpression": (str, True),
     }
 
@@ -30,8 +41,10 @@ class DataIntegration(AWSObject):
 
     props: PropsDictType = {
         "Description": (str, False),
+        "FileConfiguration": (FileConfiguration, False),
         "KmsKey": (str, True),
         "Name": (str, True),
+        "ObjectConfiguration": (dict, False),
         "ScheduleConfig": (ScheduleConfig, True),
         "SourceURI": (str, True),
         "Tags": (Tags, False),
diff --git a/troposphere/applicationautoscaling.py b/troposphere/applicationautoscaling.py
index 4a8a5ad8..983b4e9a 100644
--- a/troposphere/applicationautoscaling.py
+++ b/troposphere/applicationautoscaling.py
@@ -59,7 +59,7 @@ class ScalableTarget(AWSObject):
         "MaxCapacity": (integer, True),
         "MinCapacity": (integer, True),
         "ResourceId": (str, True),
-        "RoleARN": (str, True),
+        "RoleARN": (str, False),
         "ScalableDimension": (str, True),
         "ScheduledActions": ([ScheduledAction], False),
         "ServiceNamespace": (str, True),
diff --git a/troposphere/apprunner.py b/troposphere/apprunner.py
index 9d471c91..bbbfb48b 100644
--- a/troposphere/apprunner.py
+++ b/troposphere/apprunner.py
@@ -10,6 +10,22 @@ from . import AWSObject, AWSProperty, PropsDictType, Tags
 from .validators import boolean, integer
 
 
+class AutoScalingConfiguration(AWSObject):
+    """
+    `AutoScalingConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-autoscalingconfiguration.html>`__
+    """
+
+    resource_type = "AWS::AppRunner::AutoScalingConfiguration"
+
+    props: PropsDictType = {
+        "AutoScalingConfigurationName": (str, False),
+        "MaxConcurrency": (integer, False),
+        "MaxSize": (integer, False),
+        "MinSize": (integer, False),
+        "Tags": (Tags, False),
+    }
+
+
 class TraceConfiguration(AWSProperty):
     """
     `TraceConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-observabilityconfiguration-traceconfiguration.html>`__
diff --git a/troposphere/appstream.py b/troposphere/appstream.py
index 2c5a3380..4e613114 100644
--- a/troposphere/appstream.py
+++ b/troposphere/appstream.py
@@ -6,7 +6,7 @@
 # *** Do not modify - this file is autogenerated ***
 
 
-from . import AWSObject, AWSProperty, PropsDictType
+from . import AWSObject, AWSProperty, PropsDictType, Tags
 from .validators import boolean, integer
 from .validators.appstream import validate_tags_or_list
 
@@ -46,12 +46,58 @@ class AppBlock(AWSObject):
         "Description": (str, False),
         "DisplayName": (str, False),
         "Name": (str, True),
-        "SetupScriptDetails": (ScriptDetails, True),
+        "PackagingType": (str, False),
+        "PostSetupScriptDetails": (ScriptDetails, False),
+        "SetupScriptDetails": (ScriptDetails, False),
         "SourceS3Location": (S3Location, True),
         "Tags": (validate_tags_or_list, False),
     }
 
 
+class AccessEndpoint(AWSProperty):
+    """
+    `AccessEndpoint <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-accessendpoint.html>`__
+    """
+
+    props: PropsDictType = {
+        "EndpointType": (str, True),
+        "VpceId": (str, True),
+    }
+
+
+class VpcConfig(AWSProperty):
+    """
+    `VpcConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-vpcconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "SecurityGroupIds": ([str], False),
+        "SubnetIds": ([str], False),
+    }
+
+
+class AppBlockBuilder(AWSObject):
+    """
+    `AppBlockBuilder <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html>`__
+    """
+
+    resource_type = "AWS::AppStream::AppBlockBuilder"
+
+    props: PropsDictType = {
+        "AccessEndpoints": ([AccessEndpoint], False),
+        "AppBlockArns": ([str], False),
+        "Description": (str, False),
+        "DisplayName": (str, False),
+        "EnableDefaultInternetAccess": (boolean, False),
+        "IamRoleArn": (str, False),
+        "InstanceType": (str, True),
+        "Name": (str, True),
+        "Platform": (str, True),
+        "Tags": (Tags, False),
+        "VpcConfig": (VpcConfig, True),
+    }
+
+
 class Application(AWSObject):
     """
     `Application <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html>`__
@@ -187,17 +233,6 @@ class DomainJoinInfo(AWSProperty):
     }
 
 
-class VpcConfig(AWSProperty):
-    """
-    `VpcConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-vpcconfig.html>`__
-    """
-
-    props: PropsDictType = {
-        "SecurityGroupIds": ([str], False),
-        "SubnetIds": ([str], False),
-    }
-
-
 class Fleet(AWSObject):
     """
     `Fleet <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html>`__
@@ -230,17 +265,6 @@ class Fleet(AWSObject):
     }
 
 
-class AccessEndpoint(AWSProperty):
-    """
-    `AccessEndpoint <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-accessendpoint.html>`__
-    """
-
-    props: PropsDictType = {
-        "EndpointType": (str, True),
-        "VpceId": (str, True),
-    }
-
-
 class ImageBuilder(AWSObject):
     """
     `ImageBuilder <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html>`__
diff --git a/troposphere/appsync.py b/troposphere/appsync.py
index 6183bf34..83756d5d 100644
--- a/troposphere/appsync.py
+++ b/troposphere/appsync.py
@@ -364,13 +364,17 @@ class GraphQLApi(AWSObject):
             [AdditionalAuthenticationProvider],
             False,
         ),
+        "ApiType": (str, False),
         "AuthenticationType": (str, True),
         "LambdaAuthorizerConfig": (LambdaAuthorizerConfig, False),
         "LogConfig": (LogConfig, False),
+        "MergedApiExecutionRoleArn": (str, False),
         "Name": (str, True),
         "OpenIDConnectConfig": (OpenIDConnectConfig, False),
+        "OwnerContact": (str, False),
         "Tags": (Tags, False),
         "UserPoolConfig": (UserPoolConfig, False),
+        "Visibility": (str, False),
         "XrayEnabled": (boolean, False),
     }
 
@@ -435,3 +439,28 @@ class Resolver(AWSObject):
         "SyncConfig": (SyncConfig, False),
         "TypeName": (str, True),
     }
+
+
+class SourceApiAssociationConfig(AWSProperty):
+    """
+    `SourceApiAssociationConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-sourceapiassociation-sourceapiassociationconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "MergeType": (str, False),
+    }
+
+
+class SourceApiAssociation(AWSObject):
+    """
+    `SourceApiAssociation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-sourceapiassociation.html>`__
+    """
+
+    resource_type = "AWS::AppSync::SourceApiAssociation"
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "MergedApiIdentifier": (str, False),
+        "SourceApiAssociationConfig": (SourceApiAssociationConfig, False),
+        "SourceApiIdentifier": (str, False),
+    }
diff --git a/troposphere/athena.py b/troposphere/athena.py
index f44ea449..cbfbbf77 100644
--- a/troposphere/athena.py
+++ b/troposphere/athena.py
@@ -11,6 +11,41 @@ from .validators import boolean, integer
 from .validators.athena import validate_encryptionoption, validate_workgroup_state
 
 
+class CapacityAssignment(AWSProperty):
+    """
+    `CapacityAssignment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-capacityreservation-capacityassignment.html>`__
+    """
+
+    props: PropsDictType = {
+        "WorkgroupNames": ([str], True),
+    }
+
+
+class CapacityAssignmentConfiguration(AWSProperty):
+    """
+    `CapacityAssignmentConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-capacityreservation-capacityassignmentconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "CapacityAssignments": ([CapacityAssignment], True),
+    }
+
+
+class CapacityReservation(AWSObject):
+    """
+    `CapacityReservation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-capacityreservation.html>`__
+    """
+
+    resource_type = "AWS::Athena::CapacityReservation"
+
+    props: PropsDictType = {
+        "CapacityAssignmentConfiguration": (CapacityAssignmentConfiguration, False),
+        "Name": (str, True),
+        "Tags": (Tags, False),
+        "TargetDpus": (integer, True),
+    }
+
+
 class DataCatalog(AWSObject):
     """
     `DataCatalog <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-datacatalog.html>`__
diff --git a/troposphere/batch.py b/troposphere/batch.py
index ece782a3..106fcf36 100644
--- a/troposphere/batch.py
+++ b/troposphere/batch.py
@@ -239,6 +239,17 @@ class ResourceRequirement(AWSProperty):
     }
 
 
+class RuntimePlatform(AWSProperty):
+    """
+    `RuntimePlatform <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-runtimeplatform.html>`__
+    """
+
+    props: PropsDictType = {
+        "CpuArchitecture": (str, False),
+        "OperatingSystemFamily": (str, False),
+    }
+
+
 class Ulimit(AWSProperty):
     """
     `Ulimit <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ulimit.html>`__
@@ -320,6 +331,7 @@ class ContainerProperties(AWSProperty):
         "Privileged": (boolean, False),
         "ReadonlyRootFilesystem": (boolean, False),
         "ResourceRequirements": ([ResourceRequirement], False),
+        "RuntimePlatform": (RuntimePlatform, False),
         "Secrets": ([Secret], False),
         "Ulimits": ([Ulimit], False),
         "User": (str, False),
diff --git a/troposphere/billingconductor.py b/troposphere/billingconductor.py
index 5541c11e..9475edec 100644
--- a/troposphere/billingconductor.py
+++ b/troposphere/billingconductor.py
@@ -16,6 +16,7 @@ class AccountGrouping(AWSProperty):
     """
 
     props: PropsDictType = {
+        "AutoAssociate": (boolean, False),
         "LinkedAccountIds": ([str], True),
     }
 
diff --git a/troposphere/cassandra.py b/troposphere/cassandra.py
index 2f79e458..a372e637 100644
--- a/troposphere/cassandra.py
+++ b/troposphere/cassandra.py
@@ -14,6 +14,17 @@ from .validators.cassandra import (
 )
 
 
+class ReplicationSpecification(AWSProperty):
+    """
+    `ReplicationSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-keyspace-replicationspecification.html>`__
+    """
+
+    props: PropsDictType = {
+        "RegionList": ([str], False),
+        "ReplicationStrategy": (str, False),
+    }
+
+
 class Keyspace(AWSObject):
     """
     `Keyspace <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-keyspace.html>`__
@@ -23,6 +34,7 @@ class Keyspace(AWSObject):
 
     props: PropsDictType = {
         "KeyspaceName": (str, False),
+        "ReplicationSpecification": (ReplicationSpecification, False),
         "Tags": (Tags, False),
     }
 
diff --git a/troposphere/certificatemanager.py b/troposphere/certificatemanager.py
index 5654c466..0706a960 100644
--- a/troposphere/certificatemanager.py
+++ b/troposphere/certificatemanager.py
@@ -57,6 +57,7 @@ class Certificate(AWSObject):
         "CertificateTransparencyLoggingPreference": (str, False),
         "DomainName": (str, True),
         "DomainValidationOptions": ([DomainValidationOption], False),
+        "KeyAlgorithm": (str, False),
         "SubjectAlternativeNames": ([str], False),
         "Tags": (validate_tags_or_list, False),
         "ValidationMethod": (str, False),
diff --git a/troposphere/cloudtrail.py b/troposphere/cloudtrail.py
index 9c5e3d5e..e9130df4 100644
--- a/troposphere/cloudtrail.py
+++ b/troposphere/cloudtrail.py
@@ -38,7 +38,7 @@ class Channel(AWSObject):
 
 class AdvancedFieldSelector(AWSProperty):
     """
-    `AdvancedFieldSelector <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedfieldselector.html>`__
+    `AdvancedFieldSelector <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedfieldselector.html>`__
     """
 
     props: PropsDictType = {
@@ -54,7 +54,7 @@ class AdvancedFieldSelector(AWSProperty):
 
 class AdvancedEventSelector(AWSProperty):
     """
-    `AdvancedEventSelector <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedeventselector.html>`__
+    `AdvancedEventSelector <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedeventselector.html>`__
     """
 
     props: PropsDictType = {
@@ -72,6 +72,7 @@ class EventDataStore(AWSObject):
 
     props: PropsDictType = {
         "AdvancedEventSelectors": ([AdvancedEventSelector], False),
+        "IngestionEnabled": (boolean, False),
         "KmsKeyId": (str, False),
         "MultiRegionEnabled": (boolean, False),
         "Name": (str, False),
@@ -137,6 +138,7 @@ class Trail(AWSObject):
     resource_type = "AWS::CloudTrail::Trail"
 
     props: PropsDictType = {
+        "AdvancedEventSelectors": ([AdvancedEventSelector], False),
         "CloudWatchLogsLogGroupArn": (str, False),
         "CloudWatchLogsRoleArn": (str, False),
         "EnableLogFileValidation": (boolean, False),
diff --git a/troposphere/cloudwatch.py b/troposphere/cloudwatch.py
index 235d63b7..89f98b18 100644
--- a/troposphere/cloudwatch.py
+++ b/troposphere/cloudwatch.py
@@ -19,7 +19,7 @@ from .validators.cloudwatch import (
 
 class MetricDimension(AWSProperty):
     """
-    `MetricDimension <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-dimension.html>`__
+    `MetricDimension <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-dimension.html>`__
     """
 
     props: PropsDictType = {
@@ -225,6 +225,7 @@ class MetricStreamFilter(AWSProperty):
     """
 
     props: PropsDictType = {
+        "MetricNames": ([str], False),
         "Namespace": (str, True),
     }
 
diff --git a/troposphere/cognito.py b/troposphere/cognito.py
index 8be95ba3..9cd4119c 100644
--- a/troposphere/cognito.py
+++ b/troposphere/cognito.py
@@ -68,6 +68,21 @@ class IdentityPool(AWSObject):
     }
 
 
+class IdentityPoolPrincipalTag(AWSObject):
+    """
+    `IdentityPoolPrincipalTag <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolprincipaltag.html>`__
+    """
+
+    resource_type = "AWS::Cognito::IdentityPoolPrincipalTag"
+
+    props: PropsDictType = {
+        "IdentityPoolId": (str, True),
+        "IdentityProviderName": (str, True),
+        "PrincipalTags": (dict, False),
+        "UseDefaults": (boolean, False),
+    }
+
+
 class IdentityPoolRoleAttachment(AWSObject):
     """
     `IdentityPoolRoleAttachment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolroleattachment.html>`__
diff --git a/troposphere/config.py b/troposphere/config.py
index bf8e8d0e..a1384f05 100644
--- a/troposphere/config.py
+++ b/troposphere/config.py
@@ -30,6 +30,26 @@ class AggregationAuthorization(AWSObject):
     }
 
 
+class Compliance(AWSProperty):
+    """
+    `Compliance <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-compliance.html>`__
+    """
+
+    props: PropsDictType = {
+        "Type": (str, False),
+    }
+
+
+class EvaluationModeConfiguration(AWSProperty):
+    """
+    `EvaluationModeConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-evaluationmodeconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "Mode": (str, False),
+    }
+
+
 class Scope(AWSProperty):
     """
     `Scope <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-scope.html>`__
@@ -57,7 +77,7 @@ class CustomPolicyDetails(AWSProperty):
 
 class SourceDetails(AWSProperty):
     """
-    `SourceDetails <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-source-sourcedetails.html>`__
+    `SourceDetails <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-sourcedetail.html>`__
     """
 
     props: PropsDictType = {
@@ -91,8 +111,10 @@ class ConfigRule(AWSObject):
     resource_type = "AWS::Config::ConfigRule"
 
     props: PropsDictType = {
+        "Compliance": (Compliance, False),
         "ConfigRuleName": (str, False),
         "Description": (str, False),
+        "EvaluationModes": ([EvaluationModeConfiguration], False),
         "InputParameters": (dict, False),
         "MaximumExecutionFrequency": (str, False),
         "Scope": (Scope, False),
@@ -139,6 +161,26 @@ class ConfigurationAggregator(AWSObject):
     }
 
 
+class ExclusionByResourceTypes(AWSProperty):
+    """
+    `ExclusionByResourceTypes <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationrecorder-exclusionbyresourcetypes.html>`__
+    """
+
+    props: PropsDictType = {
+        "ResourceTypes": ([str], True),
+    }
+
+
+class RecordingStrategy(AWSProperty):
+    """
+    `RecordingStrategy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationrecorder-recordingstrategy.html>`__
+    """
+
+    props: PropsDictType = {
+        "UseOnly": (str, True),
+    }
+
+
 class RecordingGroup(AWSProperty):
     """
     `RecordingGroup <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationrecorder-recordinggroup.html>`__
@@ -146,7 +188,9 @@ class RecordingGroup(AWSProperty):
 
     props: PropsDictType = {
         "AllSupported": (boolean, False),
+        "ExclusionByResourceTypes": (ExclusionByResourceTypes, False),
         "IncludeGlobalResourceTypes": (boolean, False),
+        "RecordingStrategy": (RecordingStrategy, False),
         "ResourceTypes": ([str], False),
     }
 
diff --git a/troposphere/connect.py b/troposphere/connect.py
index 8935901b..7f78b6dc 100644
--- a/troposphere/connect.py
+++ b/troposphere/connect.py
@@ -233,6 +233,54 @@ class PhoneNumber(AWSObject):
     }
 
 
+class Prompt(AWSObject):
+    """
+    `Prompt <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-prompt.html>`__
+    """
+
+    resource_type = "AWS::Connect::Prompt"
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "InstanceArn": (str, True),
+        "Name": (str, True),
+        "S3Uri": (str, False),
+        "Tags": (Tags, False),
+    }
+
+
+class OutboundCallerConfig(AWSProperty):
+    """
+    `OutboundCallerConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-queue-outboundcallerconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "OutboundCallerIdName": (str, False),
+        "OutboundCallerIdNumberArn": (str, False),
+        "OutboundFlowArn": (str, False),
+    }
+
+
+class Queue(AWSObject):
+    """
+    `Queue <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-queue.html>`__
+    """
+
+    resource_type = "AWS::Connect::Queue"
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "HoursOfOperationArn": (str, True),
+        "InstanceArn": (str, True),
+        "MaxContacts": (integer, False),
+        "Name": (str, True),
+        "OutboundCallerConfig": (OutboundCallerConfig, False),
+        "QuickConnectArns": ([str], False),
+        "Status": (str, False),
+        "Tags": (Tags, False),
+    }
+
+
 class PhoneNumberQuickConnectConfig(AWSProperty):
     """
     `PhoneNumberQuickConnectConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-phonenumberquickconnectconfig.html>`__
@@ -294,6 +342,69 @@ class QuickConnect(AWSObject):
     }
 
 
+class CrossChannelBehavior(AWSProperty):
+    """
+    `CrossChannelBehavior <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-routingprofile-crosschannelbehavior.html>`__
+    """
+
+    props: PropsDictType = {
+        "BehaviorType": (str, True),
+    }
+
+
+class MediaConcurrency(AWSProperty):
+    """
+    `MediaConcurrency <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-routingprofile-mediaconcurrency.html>`__
+    """
+
+    props: PropsDictType = {
+        "Channel": (str, True),
+        "Concurrency": (integer, True),
+        "CrossChannelBehavior": (CrossChannelBehavior, False),
+    }
+
+
+class RoutingProfileQueueReference(AWSProperty):
+    """
+    `RoutingProfileQueueReference <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-routingprofile-routingprofilequeuereference.html>`__
+    """
+
+    props: PropsDictType = {
+        "Channel": (str, True),
+        "QueueArn": (str, True),
+    }
+
+
+class RoutingProfileQueueConfig(AWSProperty):
+    """
+    `RoutingProfileQueueConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-routingprofile-routingprofilequeueconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "Delay": (integer, True),
+        "Priority": (integer, True),
+        "QueueReference": (RoutingProfileQueueReference, True),
+    }
+
+
+class RoutingProfile(AWSObject):
+    """
+    `RoutingProfile <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-routingprofile.html>`__
+    """
+
+    resource_type = "AWS::Connect::RoutingProfile"
+
+    props: PropsDictType = {
+        "DefaultOutboundQueueArn": (str, True),
+        "Description": (str, True),
+        "InstanceArn": (str, True),
+        "MediaConcurrencies": ([MediaConcurrency], True),
+        "Name": (str, True),
+        "QueueConfigs": ([RoutingProfileQueueConfig], False),
+        "Tags": (Tags, False),
+    }
+
+
 class EventBridgeAction(AWSProperty):
     """
     `EventBridgeAction <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-eventbridgeaction.html>`__
@@ -505,6 +616,21 @@ class TaskTemplate(AWSObject):
     }
 
 
+class TrafficDistributionGroup(AWSObject):
+    """
+    `TrafficDistributionGroup <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-trafficdistributiongroup.html>`__
+    """
+
+    resource_type = "AWS::Connect::TrafficDistributionGroup"
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "InstanceArn": (str, True),
+        "Name": (str, True),
+        "Tags": (Tags, False),
+    }
+
+
 class UserIdentityInfo(AWSProperty):
     """
     `UserIdentityInfo <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html>`__
diff --git a/troposphere/customerprofiles.py b/troposphere/customerprofiles.py
index 986a38d4..7141f9e4 100644
--- a/troposphere/customerprofiles.py
+++ b/troposphere/customerprofiles.py
@@ -10,6 +10,80 @@ from . import AWSObject, AWSProperty, PropsDictType, Tags
 from .validators import boolean, double, integer
 
 
+class AttributeItem(AWSProperty):
+    """
+    `AttributeItem <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-attributeitem.html>`__
+    """
+
+    props: PropsDictType = {
+        "Name": (str, True),
+    }
+
+
+class AttributeDetails(AWSProperty):
+    """
+    `AttributeDetails <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-attributedetails.html>`__
+    """
+
+    props: PropsDictType = {
+        "Attributes": ([AttributeItem], True),
+        "Expression": (str, True),
+    }
+
+
+class Range(AWSProperty):
+    """
+    `Range <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-range.html>`__
+    """
+
+    props: PropsDictType = {
+        "Unit": (str, True),
+        "Value": (integer, True),
+    }
+
+
+class Threshold(AWSProperty):
+    """
+    `Threshold <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-threshold.html>`__
+    """
+
+    props: PropsDictType = {
+        "Operator": (str, True),
+        "Value": (str, True),
+    }
+
+
+class Conditions(AWSProperty):
+    """
+    `Conditions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-conditions.html>`__
+    """
+
+    props: PropsDictType = {
+        "ObjectCount": (integer, False),
+        "Range": (Range, False),
+        "Threshold": (Threshold, False),
+    }
+
+
+class CalculatedAttributeDefinition(AWSObject):
+    """
+    `CalculatedAttributeDefinition <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-calculatedattributedefinition.html>`__
+    """
+
+    resource_type = "AWS::CustomerProfiles::CalculatedAttributeDefinition"
+
+    props: PropsDictType = {
+        "AttributeDetails": (AttributeDetails, True),
+        "CalculatedAttributeName": (str, True),
+        "Conditions": (Conditions, False),
+        "Description": (str, False),
+        "DisplayName": (str, False),
+        "DomainName": (str, True),
+        "Statistic": (str, True),
+        "Tags": (Tags, False),
+    }
+
+
 class Domain(AWSObject):
     """
     `Domain <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-domain.html>`__
@@ -26,6 +100,21 @@ class Domain(AWSObject):
     }
 
 
+class EventStream(AWSObject):
+    """
+    `EventStream <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-eventstream.html>`__
+    """
+
+    resource_type = "AWS::CustomerProfiles::EventStream"
+
+    props: PropsDictType = {
+        "DomainName": (str, True),
+        "EventStreamName": (str, True),
+        "Tags": (Tags, False),
+        "Uri": (str, True),
+    }
+
+
 class IncrementalPullConfig(AWSProperty):
     """
     `IncrementalPullConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-incrementalpullconfig.html>`__
@@ -299,3 +388,14 @@ class ObjectType(AWSObject):
         "Tags": (Tags, False),
         "TemplateId": (str, False),
     }
+
+
+class DestinationDetails(AWSProperty):
+    """
+    `DestinationDetails <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-eventstream-destinationdetails.html>`__
+    """
+
+    props: PropsDictType = {
+        "Status": (str, True),
+        "Uri": (str, True),
+    }
diff --git a/troposphere/datasync.py b/troposphere/datasync.py
index 65d3b75c..513bc494 100644
--- a/troposphere/datasync.py
+++ b/troposphere/datasync.py
@@ -27,6 +27,35 @@ class Agent(AWSObject):
     }
 
 
+class AzureBlobSasConfiguration(AWSProperty):
+    """
+    `AzureBlobSasConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationazureblob-azureblobsasconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "AzureBlobSasToken": (str, True),
+    }
+
+
+class LocationAzureBlob(AWSObject):
+    """
+    `LocationAzureBlob <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationazureblob.html>`__
+    """
+
+    resource_type = "AWS::DataSync::LocationAzureBlob"
+
+    props: PropsDictType = {
+        "AgentArns": ([str], True),
+        "AzureAccessTier": (str, False),
+        "AzureBlobAuthenticationType": (str, True),
+        "AzureBlobContainerUrl": (str, False),
+        "AzureBlobSasConfiguration": (AzureBlobSasConfiguration, False),
+        "AzureBlobType": (str, False),
+        "Subdirectory": (str, False),
+        "Tags": (Tags, False),
+    }
+
+
 class Ec2Config(AWSProperty):
     """
     `Ec2Config <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationefs-ec2config.html>`__
@@ -323,6 +352,46 @@ class LocationSMB(AWSObject):
     }
 
 
+class ServerConfiguration(AWSProperty):
+    """
+    `ServerConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-storagesystem-serverconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "ServerHostname": (str, True),
+        "ServerPort": (integer, False),
+    }
+
+
+class ServerCredentials(AWSProperty):
+    """
+    `ServerCredentials <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-storagesystem-servercredentials.html>`__
+    """
+
+    props: PropsDictType = {
+        "Password": (str, True),
+        "Username": (str, True),
+    }
+
+
+class StorageSystem(AWSObject):
+    """
+    `StorageSystem <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-storagesystem.html>`__
+    """
+
+    resource_type = "AWS::DataSync::StorageSystem"
+
+    props: PropsDictType = {
+        "AgentArns": ([str], True),
+        "CloudWatchLogGroupArn": (str, False),
+        "Name": (str, False),
+        "ServerConfiguration": (ServerConfiguration, True),
+        "ServerCredentials": (ServerCredentials, False),
+        "SystemType": (str, True),
+        "Tags": (Tags, False),
+    }
+
+
 class FilterRule(AWSProperty):
     """
     `FilterRule <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-filterrule.html>`__
diff --git a/troposphere/detective.py b/troposphere/detective.py
index f7e446a0..84fd97b9 100644
--- a/troposphere/detective.py
+++ b/troposphere/detective.py
@@ -18,6 +18,7 @@ class Graph(AWSObject):
     resource_type = "AWS::Detective::Graph"
 
     props: PropsDictType = {
+        "AutoEnableMembers": (boolean, False),
         "Tags": (Tags, False),
     }
 
@@ -36,3 +37,15 @@ class MemberInvitation(AWSObject):
         "MemberId": (str, True),
         "Message": (str, False),
     }
+
+
+class OrganizationAdmin(AWSObject):
+    """
+    `OrganizationAdmin <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-organizationadmin.html>`__
+    """
+
+    resource_type = "AWS::Detective::OrganizationAdmin"
+
+    props: PropsDictType = {
+        "AccountId": (str, True),
+    }
diff --git a/troposphere/dms.py b/troposphere/dms.py
index 2484916f..c0326316 100644
--- a/troposphere/dms.py
+++ b/troposphere/dms.py
@@ -279,6 +279,7 @@ class PostgreSqlSettings(AWSProperty):
         "HeartbeatEnable": (boolean, False),
         "HeartbeatFrequency": (integer, False),
         "HeartbeatSchema": (str, False),
+        "MapBooleanAsBoolean": (boolean, False),
         "MaxFileSize": (integer, False),
         "PluginName": (str, False),
         "SecretsManagerAccessRoleArn": (str, False),
@@ -322,6 +323,7 @@ class RedshiftSettings(AWSProperty):
         "ExplicitIds": (boolean, False),
         "FileTransferUploadStreams": (integer, False),
         "LoadTimeout": (integer, False),
+        "MapBooleanAsBoolean": (boolean, False),
         "MaxFileSize": (integer, False),
         "RemoveQuotes": (boolean, False),
         "ReplaceChars": (str, False),
@@ -455,6 +457,46 @@ class EventSubscription(AWSObject):
     }
 
 
+class ComputeConfig(AWSProperty):
+    """
+    `ComputeConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-replicationconfig-computeconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "AvailabilityZone": (str, False),
+        "DnsNameServers": (str, False),
+        "KmsKeyId": (str, False),
+        "MaxCapacityUnits": (integer, True),
+        "MinCapacityUnits": (integer, False),
+        "MultiAZ": (boolean, False),
+        "PreferredMaintenanceWindow": (str, False),
+        "ReplicationSubnetGroupId": (str, False),
+        "VpcSecurityGroupIds": ([str], False),
+    }
+
+
+class ReplicationConfig(AWSObject):
+    """
+    `ReplicationConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationconfig.html>`__
+    """
+
+    resource_type = "AWS::DMS::ReplicationConfig"
+
+    props: PropsDictType = {
+        "ComputeConfig": (ComputeConfig, False),
+        "ReplicationConfigArn": (str, False),
+        "ReplicationConfigIdentifier": (str, False),
+        "ReplicationSettings": (dict, False),
+        "ReplicationType": (str, False),
+        "ResourceIdentifier": (str, False),
+        "SourceEndpointArn": (str, False),
+        "SupplementalSettings": (dict, False),
+        "TableMappings": (dict, False),
+        "Tags": (Tags, False),
+        "TargetEndpointArn": (str, False),
+    }
+
+
 class ReplicationInstance(AWSObject):
     """
     `ReplicationInstance <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html>`__
diff --git a/troposphere/dynamodb.py b/troposphere/dynamodb.py
index cb65f162..1b34da7e 100644
--- a/troposphere/dynamodb.py
+++ b/troposphere/dynamodb.py
@@ -227,7 +227,7 @@ class TimeToLiveSpecification(AWSProperty):
     """
 
     props: PropsDictType = {
-        "AttributeName": (str, True),
+        "AttributeName": (str, False),
         "Enabled": (boolean, True),
     }
 
diff --git a/troposphere/ec2.py b/troposphere/ec2.py
index 90a63af3..040de5b9 100644
--- a/troposphere/ec2.py
+++ b/troposphere/ec2.py
@@ -23,6 +23,8 @@ from .validators.ec2 import (
     validate_network_acl_entry,
     validate_network_port,
     validate_networkaclentry_rulenumber,
+    validate_placement_spread_level,
+    validate_placement_strategy,
     validate_route,
     validate_security_group_egress,
     validate_security_group_ingress,
@@ -435,7 +437,7 @@ class InstanceRequirementsRequest(AWSProperty):
 
 class Placement(AWSProperty):
     """
-    `Placement <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html>`__
+    `Placement <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html>`__
     """
 
     props: PropsDictType = {
@@ -704,6 +706,7 @@ class Host(AWSObject):
     resource_type = "AWS::EC2::Host"
 
     props: PropsDictType = {
+        "AssetId": (str, False),
         "AutoPlacement": (str, False),
         "AvailabilityZone": (str, True),
         "HostMaintenance": (str, False),
@@ -736,7 +739,6 @@ class IPAM(AWSObject):
         "DefaultResourceDiscoveryId": (str, False),
         "Description": (str, False),
         "OperatingRegions": ([IpamOperatingRegion], False),
-        "ResourceDiscoveryAssociationCount": (integer, False),
         "Tags": (Tags, False),
     }
 
@@ -850,7 +852,7 @@ class IPAMScope(AWSObject):
 
 class EBSBlockDevice(AWSProperty):
     """
-    `EBSBlockDevice <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html>`__
+    `EBSBlockDevice <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ebs.html>`__
     """
 
     props: PropsDictType = {
@@ -880,10 +882,11 @@ class BlockDeviceMapping(AWSProperty):
 
 class CpuOptions(AWSProperty):
     """
-    `CpuOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-cpuoptions.html>`__
+    `CpuOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-cpuoptions.html>`__
     """
 
     props: PropsDictType = {
+        "AmdSevSnp": (str, False),
         "CoreCount": (integer, False),
         "ThreadsPerCore": (integer, False),
     }
@@ -922,7 +925,7 @@ class ElasticInferenceAccelerator(AWSProperty):
 
 class EnclaveOptions(AWSProperty):
     """
-    `EnclaveOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-enclaveoptions.html>`__
+    `EnclaveOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-enclaveoptions.html>`__
     """
 
     props: PropsDictType = {
@@ -932,7 +935,7 @@ class EnclaveOptions(AWSProperty):
 
 class HibernationOptions(AWSProperty):
     """
-    `HibernationOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-hibernationoptions.html>`__
+    `HibernationOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-hibernationoptions.html>`__
     """
 
     props: PropsDictType = {
@@ -1007,7 +1010,7 @@ class NetworkInterfaceProperty(AWSProperty):
 
 class PrivateDnsNameOptions(AWSProperty):
     """
-    `PrivateDnsNameOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-privatednsnameoptions.html>`__
+    `PrivateDnsNameOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privatednsnameoptions.html>`__
     """
 
     props: PropsDictType = {
@@ -1110,6 +1113,7 @@ class KeyPair(AWSObject):
     resource_type = "AWS::EC2::KeyPair"
 
     props: PropsDictType = {
+        "KeyFormat": (str, False),
         "KeyName": (str, True),
         "KeyType": (str, False),
         "PublicKeyMaterial": (str, False),
@@ -1130,7 +1134,7 @@ class CapacityReservationTarget(AWSProperty):
 
 class CapacityReservationSpecification(AWSProperty):
     """
-    `CapacityReservationSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification.html>`__
+    `CapacityReservationSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationspecification.html>`__
     """
 
     props: PropsDictType = {
@@ -1141,7 +1145,7 @@ class CapacityReservationSpecification(AWSProperty):
 
 class IamInstanceProfile(AWSProperty):
     """
-    `IamInstanceProfile <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile.html>`__
+    `IamInstanceProfile <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-iaminstanceprofile.html>`__
     """
 
     props: PropsDictType = {
@@ -1152,7 +1156,7 @@ class IamInstanceProfile(AWSProperty):
 
 class SpotOptions(AWSProperty):
     """
-    `SpotOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html>`__
+    `SpotOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-spotoptions.html>`__
     """
 
     props: PropsDictType = {
@@ -1166,7 +1170,7 @@ class SpotOptions(AWSProperty):
 
 class InstanceMarketOptions(AWSProperty):
     """
-    `InstanceMarketOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions.html>`__
+    `InstanceMarketOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancemarketoptions.html>`__
     """
 
     props: PropsDictType = {
@@ -1276,7 +1280,7 @@ class VCpuCount(AWSProperty):
 
 class InstanceRequirements(AWSProperty):
     """
-    `InstanceRequirements <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html>`__
+    `InstanceRequirements <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html>`__
     """
 
     props: PropsDictType = {
@@ -1321,7 +1325,7 @@ class LaunchTemplateBlockDeviceMapping(AWSProperty):
 
 class LaunchTemplateCreditSpecification(AWSProperty):
     """
-    `LaunchTemplateCreditSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-creditspecification.html>`__
+    `LaunchTemplateCreditSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-creditspecification.html>`__
     """
 
     props: PropsDictType = {
@@ -1342,7 +1346,7 @@ class LaunchTemplateElasticInferenceAccelerator(AWSProperty):
 
 class MaintenanceOptions(AWSProperty):
     """
-    `MaintenanceOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-maintenanceoptions.html>`__
+    `MaintenanceOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-maintenanceoptions.html>`__
     """
 
     props: PropsDictType = {
@@ -1352,7 +1356,7 @@ class MaintenanceOptions(AWSProperty):
 
 class MetadataOptions(AWSProperty):
     """
-    `MetadataOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html>`__
+    `MetadataOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html>`__
     """
 
     props: PropsDictType = {
@@ -1376,11 +1380,11 @@ class Monitoring(AWSProperty):
 
 class Ipv4PrefixSpecification(AWSProperty):
     """
-    `Ipv4PrefixSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv4prefixspecification.html>`__
+    `Ipv4PrefixSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinterface-ipv4prefixspecification.html>`__
     """
 
     props: PropsDictType = {
-        "Ipv4Prefix": (str, False),
+        "Ipv4Prefix": (str, True),
     }
 
 
@@ -1396,11 +1400,11 @@ class Ipv6Add(AWSProperty):
 
 class Ipv6PrefixSpecification(AWSProperty):
     """
-    `Ipv6PrefixSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6prefixspecification.html>`__
+    `Ipv6PrefixSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinterface-ipv6prefixspecification.html>`__
     """
 
     props: PropsDictType = {
-        "Ipv6Prefix": (str, False),
+        "Ipv6Prefix": (str, True),
     }
 
 
@@ -1604,7 +1608,7 @@ class PortRange(AWSProperty):
 
 class NetworkAclEntry(AWSObject):
     """
-    `NetworkAclEntry <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html>`__
+    `NetworkAclEntry <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html>`__
     """
 
     resource_type = "AWS::EC2::NetworkAclEntry"
@@ -1727,6 +1731,30 @@ class NetworkInsightsAnalysis(AWSObject):
     }
 
 
+class FilterPortRange(AWSProperty):
+    """
+    `FilterPortRange <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightspath-filterportrange.html>`__
+    """
+
+    props: PropsDictType = {
+        "FromPort": (integer, False),
+        "ToPort": (integer, False),
+    }
+
+
+class PathFilter(AWSProperty):
+    """
+    `PathFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightspath-pathfilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "DestinationAddress": (str, False),
+        "DestinationPortRange": (FilterPortRange, False),
+        "SourceAddress": (str, False),
+        "SourcePortRange": (FilterPortRange, False),
+    }
+
+
 class NetworkInsightsPath(AWSObject):
     """
     `NetworkInsightsPath <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html>`__
@@ -1738,6 +1766,8 @@ class NetworkInsightsPath(AWSObject):
         "Destination": (str, False),
         "DestinationIp": (str, False),
         "DestinationPort": (integer, False),
+        "FilterAtDestination": (PathFilter, False),
+        "FilterAtSource": (PathFilter, False),
         "Protocol": (str, True),
         "Source": (str, True),
         "SourceIp": (str, False),
@@ -1756,8 +1786,12 @@ class NetworkInterface(AWSObject):
         "Description": (str, False),
         "GroupSet": ([str], False),
         "InterfaceType": (str, False),
+        "Ipv4PrefixCount": (integer, False),
+        "Ipv4Prefixes": ([Ipv4PrefixSpecification], False),
         "Ipv6AddressCount": (integer, False),
         "Ipv6Addresses": ([InstanceIpv6Address], False),
+        "Ipv6PrefixCount": (integer, False),
+        "Ipv6Prefixes": ([Ipv6PrefixSpecification], False),
         "PrivateIpAddress": (str, False),
         "PrivateIpAddresses": ([PrivateIpAddressSpecification], False),
         "SecondaryPrivateIpAddressCount": (integer, False),
@@ -1769,7 +1803,7 @@ class NetworkInterface(AWSObject):
 
 class NetworkInterfaceAttachment(AWSObject):
     """
-    `NetworkInterfaceAttachment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html>`__
+    `NetworkInterfaceAttachment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfaceattachment.html>`__
     """
 
     resource_type = "AWS::EC2::NetworkInterfaceAttachment"
@@ -1820,8 +1854,8 @@ class PlacementGroup(AWSObject):
 
     props: PropsDictType = {
         "PartitionCount": (integer, False),
-        "SpreadLevel": (str, False),
-        "Strategy": (str, False),
+        "SpreadLevel": (validate_placement_spread_level, False),
+        "Strategy": (validate_placement_strategy, False),
         "Tags": (Tags, False),
     }
 
@@ -2790,7 +2824,7 @@ class VPNGateway(AWSObject):
 
 class VPNGatewayRoutePropagation(AWSObject):
     """
-    `VPNGatewayRoutePropagation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpngatewayroutepropagation.html>`__
+    `VPNGatewayRoutePropagation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html>`__
     """
 
     resource_type = "AWS::EC2::VPNGatewayRoutePropagation"
@@ -2801,6 +2835,195 @@ class VPNGatewayRoutePropagation(AWSObject):
     }
 
 
+class LoadBalancerOptions(AWSProperty):
+    """
+    `LoadBalancerOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-loadbalanceroptions.html>`__
+    """
+
+    props: PropsDictType = {
+        "LoadBalancerArn": (str, False),
+        "Port": (integer, False),
+        "Protocol": (str, False),
+        "SubnetIds": ([str], False),
+    }
+
+
+class NetworkInterfaceOptions(AWSProperty):
+    """
+    `NetworkInterfaceOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-networkinterfaceoptions.html>`__
+    """
+
+    props: PropsDictType = {
+        "NetworkInterfaceId": (str, False),
+        "Port": (integer, False),
+        "Protocol": (str, False),
+    }
+
+
+class VerifiedAccessEndpoint(AWSObject):
+    """
+    `VerifiedAccessEndpoint <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html>`__
+    """
+
+    resource_type = "AWS::EC2::VerifiedAccessEndpoint"
+
+    props: PropsDictType = {
+        "ApplicationDomain": (str, True),
+        "AttachmentType": (str, True),
+        "Description": (str, False),
+        "DomainCertificateArn": (str, True),
+        "EndpointDomainPrefix": (str, True),
+        "EndpointType": (str, True),
+        "LoadBalancerOptions": (LoadBalancerOptions, False),
+        "NetworkInterfaceOptions": (NetworkInterfaceOptions, False),
+        "PolicyDocument": (str, False),
+        "PolicyEnabled": (boolean, False),
+        "SecurityGroupIds": ([str], False),
+        "Tags": (Tags, False),
+        "VerifiedAccessGroupId": (str, True),
+    }
+
+
+class VerifiedAccessGroup(AWSObject):
+    """
+    `VerifiedAccessGroup <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessgroup.html>`__
+    """
+
+    resource_type = "AWS::EC2::VerifiedAccessGroup"
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "PolicyDocument": (str, False),
+        "PolicyEnabled": (boolean, False),
+        "Tags": (Tags, False),
+        "VerifiedAccessInstanceId": (str, True),
+    }
+
+
+class CloudWatchLogs(AWSProperty):
+    """
+    `CloudWatchLogs <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-cloudwatchlogs.html>`__
+    """
+
+    props: PropsDictType = {
+        "Enabled": (boolean, False),
+        "LogGroup": (str, False),
+    }
+
+
+class KinesisDataFirehose(AWSProperty):
+    """
+    `KinesisDataFirehose <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-kinesisdatafirehose.html>`__
+    """
+
+    props: PropsDictType = {
+        "DeliveryStream": (str, False),
+        "Enabled": (boolean, False),
+    }
+
+
+class S3(AWSProperty):
+    """
+    `S3 <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-s3.html>`__
+    """
+
+    props: PropsDictType = {
+        "BucketName": (str, False),
+        "BucketOwner": (str, False),
+        "Enabled": (boolean, False),
+        "Prefix": (str, False),
+    }
+
+
+class VerifiedAccessLogs(AWSProperty):
+    """
+    `VerifiedAccessLogs <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesslogs.html>`__
+    """
+
+    props: PropsDictType = {
+        "CloudWatchLogs": (CloudWatchLogs, False),
+        "IncludeTrustContext": (boolean, False),
+        "KinesisDataFirehose": (KinesisDataFirehose, False),
+        "LogVersion": (str, False),
+        "S3": (S3, False),
+    }
+
+
+class VerifiedAccessTrustProviderProperty(AWSProperty):
+    """
+    `VerifiedAccessTrustProviderProperty <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesstrustprovider.html>`__
+    """
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "DeviceTrustProviderType": (str, False),
+        "TrustProviderType": (str, False),
+        "UserTrustProviderType": (str, False),
+        "VerifiedAccessTrustProviderId": (str, False),
+    }
+
+
+class VerifiedAccessInstance(AWSObject):
+    """
+    `VerifiedAccessInstance <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessinstance.html>`__
+    """
+
+    resource_type = "AWS::EC2::VerifiedAccessInstance"
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "LoggingConfigurations": (VerifiedAccessLogs, False),
+        "Tags": (Tags, False),
+        "VerifiedAccessTrustProviderIds": ([str], False),
+        "VerifiedAccessTrustProviders": ([VerifiedAccessTrustProviderProperty], False),
+    }
+
+
+class DeviceOptions(AWSProperty):
+    """
+    `DeviceOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-deviceoptions.html>`__
+    """
+
+    props: PropsDictType = {
+        "TenantId": (str, False),
+    }
+
+
+class OidcOptions(AWSProperty):
+    """
+    `OidcOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-oidcoptions.html>`__
+    """
+
+    props: PropsDictType = {
+        "AuthorizationEndpoint": (str, False),
+        "ClientId": (str, False),
+        "ClientSecret": (str, False),
+        "Issuer": (str, False),
+        "Scope": (str, False),
+        "TokenEndpoint": (str, False),
+        "UserInfoEndpoint": (str, False),
+    }
+
+
+class VerifiedAccessTrustProvider(AWSObject):
+    """
+    `VerifiedAccessTrustProvider <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccesstrustprovider.html>`__
+    """
+
+    resource_type = "AWS::EC2::VerifiedAccessTrustProvider"
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "DeviceOptions": (DeviceOptions, False),
+        "DeviceTrustProviderType": (str, False),
+        "OidcOptions": (OidcOptions, False),
+        "PolicyReferenceName": (str, True),
+        "Tags": (Tags, False),
+        "TrustProviderType": (str, True),
+        "UserTrustProviderType": (str, False),
+    }
+
+
 class Volume(AWSObject):
     """
     `Volume <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html>`__
@@ -2826,13 +3049,13 @@ class Volume(AWSObject):
 
 class VolumeAttachment(AWSObject):
     """
-    `VolumeAttachment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html>`__
+    `VolumeAttachment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volumeattachment.html>`__
     """
 
     resource_type = "AWS::EC2::VolumeAttachment"
 
     props: PropsDictType = {
-        "Device": (str, True),
+        "Device": (str, False),
         "InstanceId": (str, True),
         "VolumeId": (str, True),
     }
diff --git a/troposphere/ecs.py b/troposphere/ecs.py
index 483a0213..b6531ba2 100644
--- a/troposphere/ecs.py
+++ b/troposphere/ecs.py
@@ -251,7 +251,6 @@ class LoadBalancer(AWSProperty):
     props: PropsDictType = {
         "ContainerName": (str, False),
         "ContainerPort": (validate_network_port, False),
-        "LoadBalancerName": (str, False),
         "TargetGroupArn": (str, False),
     }
 
diff --git a/troposphere/efs.py b/troposphere/efs.py
index f2d70fea..c645b485 100644
--- a/troposphere/efs.py
+++ b/troposphere/efs.py
@@ -9,6 +9,7 @@
 from . import AWSObject, AWSProperty, PropsDictType, Tags
 from .validators import boolean
 from .validators.efs import Bursting  # noqa: F401
+from .validators.efs import Elastic  # noqa: F401
 from .validators.efs import Provisioned  # noqa: F401
 from .validators.efs import (
     provisioned_throughput_validator,
diff --git a/troposphere/elasticache.py b/troposphere/elasticache.py
index 62fe3bb9..1f2930d5 100644
--- a/troposphere/elasticache.py
+++ b/troposphere/elasticache.py
@@ -199,6 +199,7 @@ class ReplicationGroup(AWSObject):
         "CacheParameterGroupName": (str, False),
         "CacheSecurityGroupNames": ([str], False),
         "CacheSubnetGroupName": (str, False),
+        "ClusterMode": (str, False),
         "DataTieringEnabled": (boolean, False),
         "Engine": (str, False),
         "EngineVersion": (str, False),
diff --git a/troposphere/emr.py b/troposphere/emr.py
index 8464b371..0b759c7f 100644
--- a/troposphere/emr.py
+++ b/troposphere/emr.py
@@ -132,6 +132,7 @@ class VolumeSpecification(AWSProperty):
     props: PropsDictType = {
         "Iops": (integer, False),
         "SizeInGB": (integer, True),
+        "Throughput": (integer, False),
         "VolumeType": (volume_type_validator, True),
     }
 
diff --git a/troposphere/events.py b/troposphere/events.py
index 5f5045a3..1adea104 100644
--- a/troposphere/events.py
+++ b/troposphere/events.py
@@ -426,7 +426,7 @@ class RedshiftDataParameters(AWSProperty):
         "Database": (str, True),
         "DbUser": (str, False),
         "SecretManagerArn": (str, False),
-        "Sql": (str, True),
+        "Sql": (str, False),
         "StatementName": (str, False),
         "WithEvent": (boolean, False),
     }
@@ -535,5 +535,6 @@ class Rule(AWSObject):
         "RoleArn": (str, False),
         "ScheduleExpression": (str, False),
         "State": (str, False),
+        "Tags": (Tags, False),
         "Targets": ([Target], False),
     }
diff --git a/troposphere/finspace.py b/troposphere/finspace.py
index 0c08b180..cd25ab4c 100644
--- a/troposphere/finspace.py
+++ b/troposphere/finspace.py
@@ -6,7 +6,18 @@
 # *** Do not modify - this file is autogenerated ***
 
 
-from . import AWSObject, AWSProperty, PropsDictType
+from . import AWSObject, AWSProperty, PropsDictType, Tags
+
+
+class AttributeMapItems(AWSProperty):
+    """
+    `AttributeMapItems <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-attributemapitems.html>`__
+    """
+
+    props: PropsDictType = {
+        "Key": (str, False),
+        "Value": (str, False),
+    }
 
 
 class FederationParameters(AWSProperty):
@@ -16,7 +27,7 @@ class FederationParameters(AWSProperty):
 
     props: PropsDictType = {
         "ApplicationCallBackURL": (str, False),
-        "AttributeMap": (dict, False),
+        "AttributeMap": ([AttributeMapItems], False),
         "FederationProviderName": (str, False),
         "FederationURN": (str, False),
         "SamlMetadataDocument": (str, False),
@@ -44,11 +55,11 @@ class Environment(AWSObject):
     resource_type = "AWS::FinSpace::Environment"
 
     props: PropsDictType = {
-        "DataBundles": ([str], False),
         "Description": (str, False),
         "FederationMode": (str, False),
         "FederationParameters": (FederationParameters, False),
         "KmsKeyId": (str, False),
         "Name": (str, True),
         "SuperuserParameters": (SuperuserParameters, False),
+        "Tags": (Tags, False),
     }
diff --git a/troposphere/firehose.py b/troposphere/firehose.py
index 61812125..ff5cb53b 100644
--- a/troposphere/firehose.py
+++ b/troposphere/firehose.py
@@ -184,6 +184,16 @@ class AmazonopensearchserviceRetryOptions(AWSProperty):
     }
 
 
+class DocumentIdOptions(AWSProperty):
+    """
+    `DocumentIdOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-documentidoptions.html>`__
+    """
+
+    props: PropsDictType = {
+        "DefaultDocumentIdFormat": (str, True),
+    }
+
+
 class AmazonopensearchserviceDestinationConfiguration(AWSProperty):
     """
     `AmazonopensearchserviceDestinationConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html>`__
@@ -193,6 +203,7 @@ class AmazonopensearchserviceDestinationConfiguration(AWSProperty):
         "BufferingHints": (AmazonopensearchserviceBufferingHints, False),
         "CloudWatchLoggingOptions": (CloudWatchLoggingOptions, False),
         "ClusterEndpoint": (str, False),
+        "DocumentIdOptions": (DocumentIdOptions, False),
         "DomainARN": (str, False),
         "IndexName": (str, True),
         "IndexRotationPeriod": (str, False),
@@ -253,6 +264,7 @@ class ElasticsearchDestinationConfiguration(AWSProperty):
         "BufferingHints": (BufferingHints, False),
         "CloudWatchLoggingOptions": (CloudWatchLoggingOptions, False),
         "ClusterEndpoint": (str, False),
+        "DocumentIdOptions": (DocumentIdOptions, False),
         "DomainARN": (str, False),
         "IndexName": (str, True),
         "IndexRotationPeriod": (index_rotation_period_validator, False),
diff --git a/troposphere/frauddetector.py b/troposphere/frauddetector.py
index 45f4d4b9..a8074a5c 100644
--- a/troposphere/frauddetector.py
+++ b/troposphere/frauddetector.py
@@ -191,6 +191,22 @@ class Label(AWSObject):
     }
 
 
+class List(AWSObject):
+    """
+    `List <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-list.html>`__
+    """
+
+    resource_type = "AWS::FraudDetector::List"
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "Elements": ([str], False),
+        "Name": (str, True),
+        "Tags": (Tags, False),
+        "VariableType": (str, False),
+    }
+
+
 class Outcome(AWSObject):
     """
     `Outcome <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-outcome.html>`__
diff --git a/troposphere/fsx.py b/troposphere/fsx.py
index 09daa2ed..80055a24 100644
--- a/troposphere/fsx.py
+++ b/troposphere/fsx.py
@@ -308,6 +308,55 @@ class StorageVirtualMachine(AWSObject):
     }
 
 
+class AutocommitPeriod(AWSProperty):
+    """
+    `AutocommitPeriod <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration-snaplockconfiguration-autocommitperiod.html>`__
+    """
+
+    props: PropsDictType = {
+        "Type": (str, True),
+        "Value": (integer, False),
+    }
+
+
+class RetentionPeriod(AWSProperty):
+    """
+    `RetentionPeriod <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-retentionperiod.html>`__
+    """
+
+    props: PropsDictType = {
+        "Type": (str, True),
+        "Value": (integer, False),
+    }
+
+
+class SnaplockRetentionPeriod(AWSProperty):
+    """
+    `SnaplockRetentionPeriod <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-snaplockretentionperiod.html>`__
+    """
+
+    props: PropsDictType = {
+        "DefaultRetention": (RetentionPeriod, True),
+        "MaximumRetention": (RetentionPeriod, True),
+        "MinimumRetention": (RetentionPeriod, True),
+    }
+
+
+class SnaplockConfiguration(AWSProperty):
+    """
+    `SnaplockConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration-snaplockconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "AuditLogVolume": (str, False),
+        "AutocommitPeriod": (AutocommitPeriod, False),
+        "PrivilegedDelete": (str, False),
+        "RetentionPeriod": (SnaplockRetentionPeriod, False),
+        "SnaplockType": (str, True),
+        "VolumeAppendModeEnabled": (str, False),
+    }
+
+
 class TieringPolicy(AWSProperty):
     """
     `TieringPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration-tieringpolicy.html>`__
@@ -330,6 +379,7 @@ class VolumeOntapConfiguration(AWSProperty):
         "OntapVolumeType": (str, False),
         "SecurityStyle": (str, False),
         "SizeInMegabytes": (str, True),
+        "SnaplockConfiguration": (SnaplockConfiguration, False),
         "SnapshotPolicy": (str, False),
         "StorageEfficiencyEnabled": (str, False),
         "StorageVirtualMachineId": (str, True),
diff --git a/troposphere/gamelift.py b/troposphere/gamelift.py
index 44235a0c..12e5dde8 100644
--- a/troposphere/gamelift.py
+++ b/troposphere/gamelift.py
@@ -59,6 +59,7 @@ class Build(AWSObject):
     props: PropsDictType = {
         "Name": (str, False),
         "OperatingSystem": (str, False),
+        "ServerSdkVersion": (str, False),
         "StorageLocation": (StorageLocation, False),
         "Version": (str, False),
     }
@@ -245,7 +246,7 @@ class GameServerGroup(AWSObject):
         "GameServerGroupName": (str, True),
         "GameServerProtectionPolicy": (str, False),
         "InstanceDefinitions": ([InstanceDefinition], True),
-        "LaunchTemplate": (LaunchTemplate, True),
+        "LaunchTemplate": (LaunchTemplate, False),
         "MaxSize": (double, False),
         "MinSize": (double, False),
         "RoleArn": (str, True),
diff --git a/troposphere/glue.py b/troposphere/glue.py
index 9957031b..528dcdf7 100644
--- a/troposphere/glue.py
+++ b/troposphere/glue.py
@@ -25,7 +25,9 @@ class CsvClassifier(AWSProperty):
 
     props: PropsDictType = {
         "AllowSingleColumn": (boolean, False),
+        "ContainsCustomDatatype": ([str], False),
         "ContainsHeader": (str, False),
+        "CustomDatatypeConfigured": (boolean, False),
         "Delimiter": (str, False),
         "DisableValueTrimming": (boolean, False),
         "Header": ([str], False),
@@ -162,11 +164,27 @@ class CatalogTarget(AWSProperty):
     """
 
     props: PropsDictType = {
+        "ConnectionName": (str, False),
         "DatabaseName": (str, False),
+        "DlqEventQueueArn": (str, False),
+        "EventQueueArn": (str, False),
         "Tables": ([str], False),
     }
 
 
+class DeltaTarget(AWSProperty):
+    """
+    `DeltaTarget <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-deltatarget.html>`__
+    """
+
+    props: PropsDictType = {
+        "ConnectionName": (str, False),
+        "CreateNativeDeltaTable": (boolean, False),
+        "DeltaTables": ([str], False),
+        "WriteManifest": (boolean, False),
+    }
+
+
 class DynamoDBTarget(AWSProperty):
     """
     `DynamoDBTarget <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-dynamodbtarget.html>`__
@@ -177,6 +195,19 @@ class DynamoDBTarget(AWSProperty):
     }
 
 
+class IcebergTarget(AWSProperty):
+    """
+    `IcebergTarget <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-icebergtarget.html>`__
+    """
+
+    props: PropsDictType = {
+        "ConnectionName": (str, False),
+        "Exclusions": ([str], False),
+        "MaximumTraversalDepth": (integer, False),
+        "Paths": ([str], False),
+    }
+
+
 class JdbcTarget(AWSProperty):
     """
     `JdbcTarget <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-jdbctarget.html>`__
@@ -222,7 +253,9 @@ class Targets(AWSProperty):
 
     props: PropsDictType = {
         "CatalogTargets": ([CatalogTarget], False),
+        "DeltaTargets": ([DeltaTarget], False),
         "DynamoDBTargets": ([DynamoDBTarget], False),
+        "IcebergTargets": ([IcebergTarget], False),
         "JdbcTargets": ([JdbcTarget], False),
         "MongoDBTargets": ([MongoDBTarget], False),
         "S3Targets": ([S3Target], False),
@@ -299,6 +332,34 @@ class DataCatalogEncryptionSettings(AWSObject):
     }
 
 
+class DataQualityTargetTable(AWSProperty):
+    """
+    `DataQualityTargetTable <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-dataqualityruleset-dataqualitytargettable.html>`__
+    """
+
+    props: PropsDictType = {
+        "DatabaseName": (str, False),
+        "TableName": (str, False),
+    }
+
+
+class DataQualityRuleset(AWSObject):
+    """
+    `DataQualityRuleset <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-dataqualityruleset.html>`__
+    """
+
+    resource_type = "AWS::Glue::DataQualityRuleset"
+
+    props: PropsDictType = {
+        "ClientToken": (str, False),
+        "Description": (str, False),
+        "Name": (str, False),
+        "Ruleset": (str, False),
+        "Tags": (dict, False),
+        "TargetTable": (DataQualityTargetTable, False),
+    }
+
+
 class DatabaseIdentifier(AWSProperty):
     """
     `DatabaseIdentifier <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseidentifier.html>`__
@@ -307,6 +368,18 @@ class DatabaseIdentifier(AWSProperty):
     props: PropsDictType = {
         "CatalogId": (str, False),
         "DatabaseName": (str, False),
+        "Region": (str, False),
+    }
+
+
+class FederatedDatabase(AWSProperty):
+    """
+    `FederatedDatabase <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput-federateddatabase.html>`__
+    """
+
+    props: PropsDictType = {
+        "ConnectionName": (str, False),
+        "Identifier": (str, False),
     }
 
 
@@ -339,6 +412,7 @@ class DatabaseInput(AWSProperty):
     props: PropsDictType = {
         "CreateTableDefaultPermissions": ([PrincipalPrivileges], False),
         "Description": (str, False),
+        "FederatedDatabase": (FederatedDatabase, False),
         "LocationUri": (str, False),
         "Name": (str, False),
         "Parameters": (dict, False),
@@ -413,6 +487,7 @@ class JobCommand(AWSProperty):
     props: PropsDictType = {
         "Name": (str, False),
         "PythonVersion": (str, False),
+        "Runtime": (str, False),
         "ScriptLocation": (str, False),
     }
 
@@ -823,6 +898,27 @@ class SecurityConfiguration(AWSObject):
     }
 
 
+class IcebergInput(AWSProperty):
+    """
+    `IcebergInput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-iceberginput.html>`__
+    """
+
+    props: PropsDictType = {
+        "MetadataOperation": (str, False),
+        "Version": (str, False),
+    }
+
+
+class OpenTableFormatInput(AWSProperty):
+    """
+    `OpenTableFormatInput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-opentableformatinput.html>`__
+    """
+
+    props: PropsDictType = {
+        "IcebergInput": (IcebergInput, False),
+    }
+
+
 class TableIdentifier(AWSProperty):
     """
     `TableIdentifier <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableidentifier.html>`__
@@ -832,6 +928,7 @@ class TableIdentifier(AWSProperty):
         "CatalogId": (str, False),
         "DatabaseName": (str, False),
         "Name": (str, False),
+        "Region": (str, False),
     }
 
 
@@ -865,6 +962,7 @@ class Table(AWSObject):
     props: PropsDictType = {
         "CatalogId": (str, True),
         "DatabaseName": (str, True),
+        "OpenTableFormatInput": (OpenTableFormatInput, False),
         "TableInput": (TableInput, True),
     }
 
diff --git a/troposphere/grafana.py b/troposphere/grafana.py
index ec023219..96ed7673 100644
--- a/troposphere/grafana.py
+++ b/troposphere/grafana.py
@@ -10,6 +10,17 @@ from . import AWSObject, AWSProperty, PropsDictType
 from .validators import double
 
 
+class NetworkAccessControl(AWSProperty):
+    """
+    `NetworkAccessControl <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-networkaccesscontrol.html>`__
+    """
+
+    props: PropsDictType = {
+        "PrefixListIds": ([str], False),
+        "VpceIds": ([str], False),
+    }
+
+
 class AssertionAttributes(AWSProperty):
     """
     `AssertionAttributes <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-assertionattributes.html>`__
@@ -85,7 +96,9 @@ class Workspace(AWSObject):
         "ClientToken": (str, False),
         "DataSources": ([str], False),
         "Description": (str, False),
+        "GrafanaVersion": (str, False),
         "Name": (str, False),
+        "NetworkAccessControl": (NetworkAccessControl, False),
         "NotificationDestinations": ([str], False),
         "OrganizationRoleName": (str, False),
         "OrganizationalUnits": ([str], False),
diff --git a/troposphere/healthlake.py b/troposphere/healthlake.py
index b20aac74..6e949caa 100644
--- a/troposphere/healthlake.py
+++ b/troposphere/healthlake.py
@@ -7,7 +7,20 @@
 
 
 from . import AWSObject, AWSProperty, PropsDictType, Tags
-from .validators import integer
+from .validators import boolean, integer
+
+
+class IdentityProviderConfiguration(AWSProperty):
+    """
+    `IdentityProviderConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-identityproviderconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "AuthorizationStrategy": (str, True),
+        "FineGrainedAuthorizationEnabled": (boolean, False),
+        "IdpLambdaArn": (str, False),
+        "Metadata": (str, False),
+    }
 
 
 class PreloadDataConfig(AWSProperty):
@@ -51,6 +64,7 @@ class FHIRDatastore(AWSObject):
     props: PropsDictType = {
         "DatastoreName": (str, False),
         "DatastoreTypeVersion": (str, True),
+        "IdentityProviderConfiguration": (IdentityProviderConfiguration, False),
         "PreloadDataConfig": (PreloadDataConfig, False),
         "SseConfiguration": (SseConfiguration, False),
         "Tags": (Tags, False),
diff --git a/troposphere/iam.py b/troposphere/iam.py
index e2414f41..4c874f50 100644
--- a/troposphere/iam.py
+++ b/troposphere/iam.py
@@ -61,6 +61,20 @@ class Group(AWSObject):
     }
 
 
+class GroupPolicy(AWSObject):
+    """
+    `GroupPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-grouppolicy.html>`__
+    """
+
+    resource_type = "AWS::IAM::GroupPolicy"
+
+    props: PropsDictType = {
+        "GroupName": (str, True),
+        "PolicyDocument": (dict, False),
+        "PolicyName": (str, True),
+    }
+
+
 class InstanceProfile(AWSObject):
     """
     `InstanceProfile <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html>`__
@@ -144,6 +158,20 @@ class Role(AWSObject):
     }
 
 
+class RolePolicy(AWSObject):
+    """
+    `RolePolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-rolepolicy.html>`__
+    """
+
+    resource_type = "AWS::IAM::RolePolicy"
+
+    props: PropsDictType = {
+        "PolicyDocument": (dict, False),
+        "PolicyName": (str, True),
+        "RoleName": (str, True),
+    }
+
+
 class SAMLProvider(AWSObject):
     """
     `SAMLProvider <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html>`__
@@ -183,7 +211,7 @@ class ServiceLinkedRole(AWSObject):
     resource_type = "AWS::IAM::ServiceLinkedRole"
 
     props: PropsDictType = {
-        "AWSServiceName": (str, True),
+        "AWSServiceName": (str, False),
         "CustomSuffix": (str, False),
         "Description": (str, False),
     }
@@ -219,6 +247,20 @@ class User(AWSObject):
     }
 
 
+class UserPolicy(AWSObject):
+    """
+    `UserPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-userpolicy.html>`__
+    """
+
+    resource_type = "AWS::IAM::UserPolicy"
+
+    props: PropsDictType = {
+        "PolicyDocument": (dict, False),
+        "PolicyName": (str, True),
+        "UserName": (str, True),
+    }
+
+
 class UserToGroupAddition(AWSObject):
     """
     `UserToGroupAddition <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html>`__
diff --git a/troposphere/iot.py b/troposphere/iot.py
index 6006bb89..62b8fd83 100644
--- a/troposphere/iot.py
+++ b/troposphere/iot.py
@@ -117,6 +117,30 @@ class Authorizer(AWSObject):
     }
 
 
+class BillingGroupProperties(AWSProperty):
+    """
+    `BillingGroupProperties <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-billinggroup-billinggroupproperties.html>`__
+    """
+
+    props: PropsDictType = {
+        "BillingGroupDescription": (str, False),
+    }
+
+
+class BillingGroup(AWSObject):
+    """
+    `BillingGroup <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-billinggroup.html>`__
+    """
+
+    resource_type = "AWS::IoT::BillingGroup"
+
+    props: PropsDictType = {
+        "BillingGroupName": (str, False),
+        "BillingGroupProperties": (BillingGroupProperties, False),
+        "Tags": (Tags, False),
+    }
+
+
 class RegistrationConfig(AWSProperty):
     """
     `RegistrationConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-cacertificate-registrationconfig.html>`__
@@ -205,6 +229,16 @@ class AuthorizerConfig(AWSProperty):
     }
 
 
+class TlsConfig(AWSProperty):
+    """
+    `TlsConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-tlsconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "SecurityPolicy": (str, False),
+    }
+
+
 class DomainConfiguration(AWSObject):
     """
     `DomainConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html>`__
@@ -220,6 +254,7 @@ class DomainConfiguration(AWSObject):
         "ServerCertificateArns": ([str], False),
         "ServiceType": (str, False),
         "Tags": (Tags, False),
+        "TlsConfig": (TlsConfig, False),
         "ValidationCertificateArn": (str, False),
     }
 
@@ -715,7 +750,7 @@ class SecurityProfile(AWSObject):
 
 class AttributePayload(AWSProperty):
     """
-    `AttributePayload <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thing-attributepayload.html>`__
+    `AttributePayload <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thinggroup-attributepayload.html>`__
     """
 
     props: PropsDictType = {
@@ -736,6 +771,33 @@ class Thing(AWSObject):
     }
 
 
+class ThingGroupProperties(AWSProperty):
+    """
+    `ThingGroupProperties <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thinggroup-thinggroupproperties.html>`__
+    """
+
+    props: PropsDictType = {
+        "AttributePayload": (AttributePayload, False),
+        "ThingGroupDescription": (str, False),
+    }
+
+
+class ThingGroup(AWSObject):
+    """
+    `ThingGroup <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thinggroup.html>`__
+    """
+
+    resource_type = "AWS::IoT::ThingGroup"
+
+    props: PropsDictType = {
+        "ParentGroupName": (str, False),
+        "QueryString": (str, False),
+        "Tags": (Tags, False),
+        "ThingGroupName": (str, False),
+        "ThingGroupProperties": (ThingGroupProperties, False),
+    }
+
+
 class ThingPrincipalAttachment(AWSObject):
     """
     `ThingPrincipalAttachment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thingprincipalattachment.html>`__
@@ -749,6 +811,32 @@ class ThingPrincipalAttachment(AWSObject):
     }
 
 
+class ThingTypeProperties(AWSProperty):
+    """
+    `ThingTypeProperties <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thingtype-thingtypeproperties.html>`__
+    """
+
+    props: PropsDictType = {
+        "SearchableAttributes": ([str], False),
+        "ThingTypeDescription": (str, False),
+    }
+
+
+class ThingType(AWSObject):
+    """
+    `ThingType <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thingtype.html>`__
+    """
+
+    resource_type = "AWS::IoT::ThingType"
+
+    props: PropsDictType = {
+        "DeprecateThingType": (boolean, False),
+        "Tags": (Tags, False),
+        "ThingTypeName": (str, False),
+        "ThingTypeProperties": (ThingTypeProperties, False),
+    }
+
+
 class CloudwatchAlarmAction(AWSProperty):
     """
     `CloudwatchAlarmAction <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchalarmaction.html>`__
diff --git a/troposphere/iotfleetwise.py b/troposphere/iotfleetwise.py
index 55b5e9da..d3ca7ae9 100644
--- a/troposphere/iotfleetwise.py
+++ b/troposphere/iotfleetwise.py
@@ -44,6 +44,41 @@ class CollectionScheme(AWSProperty):
     }
 
 
+class S3Config(AWSProperty):
+    """
+    `S3Config <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-s3config.html>`__
+    """
+
+    props: PropsDictType = {
+        "BucketArn": (str, True),
+        "DataFormat": (str, False),
+        "Prefix": (str, False),
+        "StorageCompressionFormat": (str, False),
+    }
+
+
+class TimestreamConfig(AWSProperty):
+    """
+    `TimestreamConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-timestreamconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "ExecutionRoleArn": (str, True),
+        "TimestreamTableArn": (str, True),
+    }
+
+
+class DataDestinationConfig(AWSProperty):
+    """
+    `DataDestinationConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-datadestinationconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "S3Config": (S3Config, False),
+        "TimestreamConfig": (TimestreamConfig, False),
+    }
+
+
 class SignalInformation(AWSProperty):
     """
     `SignalInformation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-signalinformation.html>`__
@@ -67,6 +102,7 @@ class Campaign(AWSObject):
         "Action": (str, True),
         "CollectionScheme": (CollectionScheme, True),
         "Compression": (str, False),
+        "DataDestinationConfigs": ([DataDestinationConfig], False),
         "DataExtraDimensions": ([str], False),
         "Description": (str, False),
         "DiagnosticsMode": (str, False),
diff --git a/troposphere/iottwinmaker.py b/troposphere/iottwinmaker.py
index 2863c5af..69d2d7d8 100644
--- a/troposphere/iottwinmaker.py
+++ b/troposphere/iottwinmaker.py
@@ -243,6 +243,7 @@ class Scene(AWSObject):
         "ContentLocation": (str, True),
         "Description": (str, False),
         "SceneId": (str, True),
+        "SceneMetadata": (dict, False),
         "Tags": (dict, False),
         "WorkspaceId": (str, True),
     }
diff --git a/troposphere/ivs.py b/troposphere/ivs.py
index c3946125..a25a1ed4 100644
--- a/troposphere/ivs.py
+++ b/troposphere/ivs.py
@@ -19,8 +19,10 @@ class Channel(AWSObject):
 
     props: PropsDictType = {
         "Authorized": (boolean, False),
+        "InsecureIngest": (boolean, False),
         "LatencyMode": (str, False),
         "Name": (str, False),
+        "Preset": (str, False),
         "RecordingConfigurationArn": (str, False),
         "Tags": (Tags, False),
         "Type": (str, False),
@@ -57,7 +59,18 @@ class DestinationConfiguration(AWSProperty):
     """
 
     props: PropsDictType = {
-        "S3": (S3DestinationConfiguration, True),
+        "S3": (S3DestinationConfiguration, False),
+    }
+
+
+class RenditionConfiguration(AWSProperty):
+    """
+    `RenditionConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-renditionconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "RenditionSelection": (str, False),
+        "Renditions": ([str], False),
     }
 
 
@@ -67,7 +80,9 @@ class ThumbnailConfiguration(AWSProperty):
     """
 
     props: PropsDictType = {
-        "RecordingMode": (str, True),
+        "RecordingMode": (str, False),
+        "Resolution": (str, False),
+        "Storage": ([str], False),
         "TargetIntervalSeconds": (integer, False),
     }
 
@@ -83,6 +98,7 @@ class RecordingConfiguration(AWSObject):
         "DestinationConfiguration": (DestinationConfiguration, True),
         "Name": (str, False),
         "RecordingReconnectWindowSeconds": (integer, False),
+        "RenditionConfiguration": (RenditionConfiguration, False),
         "Tags": (Tags, False),
         "ThumbnailConfiguration": (ThumbnailConfiguration, False),
     }
diff --git a/troposphere/kendra.py b/troposphere/kendra.py
index 333bb613..72b4bfab 100644
--- a/troposphere/kendra.py
+++ b/troposphere/kendra.py
@@ -548,6 +548,16 @@ class SharePointConfiguration(AWSProperty):
     }
 
 
+class TemplateConfiguration(AWSProperty):
+    """
+    `TemplateConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-templateconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "Template": (str, True),
+    }
+
+
 class ProxyConfiguration(AWSProperty):
     """
     `ProxyConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-proxyconfiguration.html>`__
@@ -661,6 +671,7 @@ class DataSourceConfiguration(AWSProperty):
         "SalesforceConfiguration": (SalesforceConfiguration, False),
         "ServiceNowConfiguration": (ServiceNowConfiguration, False),
         "SharePointConfiguration": (SharePointConfiguration, False),
+        "TemplateConfiguration": (TemplateConfiguration, False),
         "WebCrawlerConfiguration": (WebCrawlerConfiguration, False),
         "WorkDocsConfiguration": (WorkDocsConfiguration, False),
     }
diff --git a/troposphere/kms.py b/troposphere/kms.py
index 6a30dbe1..e6ffc0dd 100644
--- a/troposphere/kms.py
+++ b/troposphere/kms.py
@@ -37,13 +37,15 @@ class Key(AWSObject):
     resource_type = "AWS::KMS::Key"
 
     props: PropsDictType = {
+        "BypassPolicyLockoutSafetyCheck": (boolean, False),
         "Description": (str, False),
         "EnableKeyRotation": (boolean, False),
         "Enabled": (boolean, False),
-        "KeyPolicy": (policytypes, True),
+        "KeyPolicy": (policytypes, False),
         "KeySpec": (str, False),
         "KeyUsage": (key_usage_type, False),
         "MultiRegion": (boolean, False),
+        "Origin": (str, False),
         "PendingWindowInDays": (validate_pending_window_in_days, False),
         "Tags": (validate_tags_or_list, False),
     }
diff --git a/troposphere/lakeformation.py b/troposphere/lakeformation.py
index f06a8a33..adb4654a 100644
--- a/troposphere/lakeformation.py
+++ b/troposphere/lakeformation.py
@@ -68,6 +68,12 @@ class DataLakeSettings(AWSObject):
 
     props: PropsDictType = {
         "Admins": ([DataLakePrincipal], False),
+        "AllowExternalDataFiltering": (boolean, False),
+        "AuthorizedSessionTagValueList": ([str], False),
+        "CreateDatabaseDefaultPermissions": ([], False),
+        "CreateTableDefaultPermissions": ([], False),
+        "ExternalDataFilteringAllowList": ([], False),
+        "Parameters": (dict, False),
         "TrustedResourceOwners": ([str], False),
     }
 
@@ -252,6 +258,7 @@ class Resource(AWSObject):
         "ResourceArn": (str, True),
         "RoleArn": (str, False),
         "UseServiceLinkedRole": (boolean, True),
+        "WithFederation": (boolean, False),
     }
 
 
@@ -320,6 +327,17 @@ class TagAssociation(AWSObject):
     }
 
 
+class PrincipalPermissionsProperty(AWSProperty):
+    """
+    `PrincipalPermissionsProperty <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datalakesettings-principalpermissions.html>`__
+    """
+
+    props: PropsDictType = {
+        "Permissions": ([str], True),
+        "Principal": (DataLakePrincipal, True),
+    }
+
+
 class TableWildcard(AWSProperty):
     """
     `TableWildcard <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tablewildcard.html>`__
diff --git a/troposphere/lightsail.py b/troposphere/lightsail.py
index 342e2118..d2454c07 100644
--- a/troposphere/lightsail.py
+++ b/troposphere/lightsail.py
@@ -244,6 +244,17 @@ class AddOn(AWSProperty):
     }
 
 
+class Location(AWSProperty):
+    """
+    `Location <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-location.html>`__
+    """
+
+    props: PropsDictType = {
+        "AvailabilityZone": (str, False),
+        "RegionName": (str, False),
+    }
+
+
 class Disk(AWSObject):
     """
     `Disk <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-disk.html>`__
@@ -255,6 +266,7 @@ class Disk(AWSObject):
         "AddOns": ([AddOn], False),
         "AvailabilityZone": (str, False),
         "DiskName": (str, True),
+        "Location": (Location, False),
         "SizeInGb": (integer, True),
         "Tags": (Tags, False),
     }
@@ -392,17 +404,6 @@ class Hardware(AWSProperty):
     }
 
 
-class Location(AWSProperty):
-    """
-    `Location <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-location.html>`__
-    """
-
-    props: PropsDictType = {
-        "AvailabilityZone": (str, False),
-        "RegionName": (str, False),
-    }
-
-
 class MonthlyTransfer(AWSProperty):
     """
     `MonthlyTransfer <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-monthlytransfer.html>`__
diff --git a/troposphere/logs.py b/troposphere/logs.py
index 3d0b1a3e..cd5e5f5c 100644
--- a/troposphere/logs.py
+++ b/troposphere/logs.py
@@ -15,6 +15,21 @@ from .validators.logs import (
 )
 
 
+class AccountPolicy(AWSObject):
+    """
+    `AccountPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-accountpolicy.html>`__
+    """
+
+    resource_type = "AWS::Logs::AccountPolicy"
+
+    props: PropsDictType = {
+        "PolicyDocument": (str, True),
+        "PolicyName": (str, True),
+        "PolicyType": (str, True),
+        "Scope": (str, False),
+    }
+
+
 class Destination(AWSObject):
     """
     `Destination <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-destination.html>`__
diff --git a/troposphere/m2.py b/troposphere/m2.py
index f82b84ef..54e9f956 100644
--- a/troposphere/m2.py
+++ b/troposphere/m2.py
@@ -34,6 +34,7 @@ class Application(AWSObject):
         "EngineType": (str, True),
         "KmsKeyId": (str, False),
         "Name": (str, True),
+        "RoleArn": (str, False),
         "Tags": (dict, False),
     }
 
diff --git a/troposphere/mediaconnect.py b/troposphere/mediaconnect.py
index 49a36141..0bd2bc1b 100644
--- a/troposphere/mediaconnect.py
+++ b/troposphere/mediaconnect.py
@@ -10,6 +10,85 @@ from . import AWSObject, AWSProperty, PropsDictType
 from .validators import integer
 
 
+class BridgeNetworkOutput(AWSProperty):
+    """
+    `BridgeNetworkOutput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgeoutput-bridgenetworkoutput.html>`__
+    """
+
+    props: PropsDictType = {
+        "IpAddress": (str, True),
+        "NetworkName": (str, True),
+        "Port": (integer, True),
+        "Protocol": (str, True),
+        "Ttl": (integer, True),
+    }
+
+
+class BridgeOutputProperty(AWSProperty):
+    """
+    `BridgeOutputProperty <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgeoutput.html>`__
+    """
+
+    props: PropsDictType = {
+        "NetworkOutput": (BridgeNetworkOutput, False),
+    }
+
+
+class VpcInterfaceAttachment(AWSProperty):
+    """
+    `VpcInterfaceAttachment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-vpcinterfaceattachment.html>`__
+    """
+
+    props: PropsDictType = {
+        "VpcInterfaceName": (str, False),
+    }
+
+
+class BridgeFlowSource(AWSProperty):
+    """
+    `BridgeFlowSource <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-bridgeflowsource.html>`__
+    """
+
+    props: PropsDictType = {
+        "FlowArn": (str, True),
+        "FlowVpcInterfaceAttachment": (VpcInterfaceAttachment, False),
+    }
+
+
+class BridgeNetworkSource(AWSProperty):
+    """
+    `BridgeNetworkSource <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-bridgenetworksource.html>`__
+    """
+
+    props: PropsDictType = {
+        "MulticastIp": (str, True),
+        "NetworkName": (str, True),
+        "Port": (integer, True),
+        "Protocol": (str, True),
+    }
+
+
+class BridgeSourceProperty(AWSProperty):
+    """
+    `BridgeSourceProperty <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgesource.html>`__
+    """
+
+    props: PropsDictType = {
+        "FlowSource": (BridgeFlowSource, False),
+        "NetworkSource": (BridgeNetworkSource, False),
+    }
+
+
+class EgressGatewayBridge(AWSProperty):
+    """
+    `EgressGatewayBridge <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-egressgatewaybridge.html>`__
+    """
+
+    props: PropsDictType = {
+        "MaxBitrate": (integer, True),
+    }
+
+
 class SourcePriority(AWSProperty):
     """
     `SourcePriority <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-sourcepriority.html>`__
@@ -33,13 +112,71 @@ class FailoverConfig(AWSProperty):
     }
 
 
+class IngressGatewayBridge(AWSProperty):
+    """
+    `IngressGatewayBridge <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-ingressgatewaybridge.html>`__
+    """
+
+    props: PropsDictType = {
+        "MaxBitrate": (integer, True),
+        "MaxOutputs": (integer, True),
+    }
+
+
+class Bridge(AWSObject):
+    """
+    `Bridge <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridge.html>`__
+    """
+
+    resource_type = "AWS::MediaConnect::Bridge"
+
+    props: PropsDictType = {
+        "EgressGatewayBridge": (EgressGatewayBridge, False),
+        "IngressGatewayBridge": (IngressGatewayBridge, False),
+        "Name": (str, True),
+        "Outputs": ([BridgeOutputProperty], False),
+        "PlacementArn": (str, True),
+        "SourceFailoverConfig": (FailoverConfig, False),
+        "Sources": ([BridgeSourceProperty], True),
+    }
+
+
+class BridgeOutput(AWSObject):
+    """
+    `BridgeOutput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgeoutput.html>`__
+    """
+
+    resource_type = "AWS::MediaConnect::BridgeOutput"
+
+    props: PropsDictType = {
+        "BridgeArn": (str, True),
+        "Name": (str, True),
+        "NetworkOutput": (BridgeNetworkOutput, True),
+    }
+
+
+class BridgeSource(AWSObject):
+    """
+    `BridgeSource <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgesource.html>`__
+    """
+
+    resource_type = "AWS::MediaConnect::BridgeSource"
+
+    props: PropsDictType = {
+        "BridgeArn": (str, True),
+        "FlowSource": (BridgeFlowSource, False),
+        "Name": (str, True),
+        "NetworkSource": (BridgeNetworkSource, False),
+    }
+
+
 class Encryption(AWSProperty):
     """
     `Encryption <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html>`__
     """
 
     props: PropsDictType = {
-        "Algorithm": (str, True),
+        "Algorithm": (str, False),
         "ConstantInitializationVector": (str, False),
         "DeviceId": (str, False),
         "KeyType": (str, False),
@@ -51,6 +188,17 @@ class Encryption(AWSProperty):
     }
 
 
+class GatewayBridgeSource(AWSProperty):
+    """
+    `GatewayBridgeSource <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-gatewaybridgesource.html>`__
+    """
+
+    props: PropsDictType = {
+        "BridgeArn": (str, True),
+        "VpcInterfaceAttachment": (VpcInterfaceAttachment, False),
+    }
+
+
 class Source(AWSProperty):
     """
     `Source <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html>`__
@@ -60,6 +208,7 @@ class Source(AWSProperty):
         "Decryption": (Encryption, False),
         "Description": (str, False),
         "EntitlementArn": (str, False),
+        "GatewayBridgeSource": (GatewayBridgeSource, False),
         "IngestIp": (str, False),
         "IngestPort": (integer, False),
         "MaxBitrate": (integer, False),
@@ -125,16 +274,6 @@ class FlowOutputEncryption(AWSProperty):
     }
 
 
-class VpcInterfaceAttachment(AWSProperty):
-    """
-    `VpcInterfaceAttachment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowoutput-vpcinterfaceattachment.html>`__
-    """
-
-    props: PropsDictType = {
-        "VpcInterfaceName": (str, False),
-    }
-
-
 class FlowOutput(AWSObject):
     """
     `FlowOutput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html>`__
@@ -172,11 +311,17 @@ class FlowSource(AWSObject):
         "Description": (str, True),
         "EntitlementArn": (str, False),
         "FlowArn": (str, False),
+        "GatewayBridgeSource": (GatewayBridgeSource, False),
         "IngestPort": (integer, False),
         "MaxBitrate": (integer, False),
         "MaxLatency": (integer, False),
+        "MinLatency": (integer, False),
         "Name": (str, True),
         "Protocol": (str, False),
+        "SenderControlPort": (integer, False),
+        "SenderIpAddress": (str, False),
+        "SourceListenerAddress": (str, False),
+        "SourceListenerPort": (integer, False),
         "StreamId": (str, False),
         "VpcInterfaceName": (str, False),
         "WhitelistCidr": (str, False),
@@ -197,3 +342,28 @@ class FlowVpcInterface(AWSObject):
         "SecurityGroupIds": ([str], True),
         "SubnetId": (str, True),
     }
+
+
+class GatewayNetwork(AWSProperty):
+    """
+    `GatewayNetwork <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-gateway-gatewaynetwork.html>`__
+    """
+
+    props: PropsDictType = {
+        "CidrBlock": (str, True),
+        "Name": (str, True),
+    }
+
+
+class Gateway(AWSObject):
+    """
+    `Gateway <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-gateway.html>`__
+    """
+
+    resource_type = "AWS::MediaConnect::Gateway"
+
+    props: PropsDictType = {
+        "EgressCidrBlocks": ([str], True),
+        "Name": (str, True),
+        "Networks": ([GatewayNetwork], True),
+    }
diff --git a/troposphere/medialive.py b/troposphere/medialive.py
index 377b1eb0..b358c28e 100644
--- a/troposphere/medialive.py
+++ b/troposphere/medialive.py
@@ -54,6 +54,22 @@ class Ac3Settings(AWSProperty):
     }
 
 
+class Eac3AtmosSettings(AWSProperty):
+    """
+    `Eac3AtmosSettings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3atmossettings.html>`__
+    """
+
+    props: PropsDictType = {
+        "Bitrate": (double, False),
+        "CodingMode": (str, False),
+        "Dialnorm": (integer, False),
+        "DrcLine": (str, False),
+        "DrcRf": (str, False),
+        "HeightTrim": (double, False),
+        "SurroundTrim": (double, False),
+    }
+
+
 class Eac3Settings(AWSProperty):
     """
     `Eac3Settings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html>`__
@@ -123,6 +139,7 @@ class AudioCodecSettings(AWSProperty):
     props: PropsDictType = {
         "AacSettings": (AacSettings, False),
         "Ac3Settings": (Ac3Settings, False),
+        "Eac3AtmosSettings": (Eac3AtmosSettings, False),
         "Eac3Settings": (Eac3Settings, False),
         "Mp2Settings": (Mp2Settings, False),
         "PassThroughSettings": (PassThroughSettings, False),
@@ -162,6 +179,7 @@ class NielsenNaesIiNw(AWSProperty):
     props: PropsDictType = {
         "CheckDigitString": (str, False),
         "Sid": (double, False),
+        "Timezone": (str, False),
     }
 
 
@@ -264,6 +282,21 @@ class AvailBlanking(AWSProperty):
     }
 
 
+class Esam(AWSProperty):
+    """
+    `Esam <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-esam.html>`__
+    """
+
+    props: PropsDictType = {
+        "AcquisitionPointId": (str, False),
+        "AdAvailOffset": (integer, False),
+        "PasswordParam": (str, False),
+        "PoisEndpoint": (str, False),
+        "Username": (str, False),
+        "ZoneIdentity": (str, False),
+    }
+
+
 class Scte35SpliceInsert(AWSProperty):
     """
     `Scte35SpliceInsert <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte35spliceinsert.html>`__
@@ -294,6 +327,7 @@ class AvailSettings(AWSProperty):
     """
 
     props: PropsDictType = {
+        "Esam": (Esam, False),
         "Scte35SpliceInsert": (Scte35SpliceInsert, False),
         "Scte35TimeSignalApos": (Scte35TimeSignalApos, False),
     }
@@ -509,6 +543,7 @@ class CaptionDescription(AWSProperty):
     """
 
     props: PropsDictType = {
+        "Accessibility": (str, False),
         "CaptionSelectorName": (str, False),
         "DestinationSettings": (CaptionDestinationSettings, False),
         "LanguageCode": (str, False),
@@ -677,6 +712,7 @@ class M2tsSettings(AWSProperty):
         "Scte27Pids": (str, False),
         "Scte35Control": (str, False),
         "Scte35Pid": (str, False),
+        "Scte35PrerollPullupMilliseconds": (double, False),
         "SegmentationMarkers": (str, False),
         "SegmentationStyle": (str, False),
         "SegmentationTime": (double, False),
@@ -1285,6 +1321,18 @@ class TimecodeConfig(AWSProperty):
     }
 
 
+class TimecodeBurninSettings(AWSProperty):
+    """
+    `TimecodeBurninSettings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-timecodeburninsettings.html>`__
+    """
+
+    props: PropsDictType = {
+        "FontSize": (str, False),
+        "Position": (str, False),
+        "Prefix": (str, False),
+    }
+
+
 class FrameCaptureSettings(AWSProperty):
     """
     `FrameCaptureSettings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturesettings.html>`__
@@ -1293,6 +1341,7 @@ class FrameCaptureSettings(AWSProperty):
     props: PropsDictType = {
         "CaptureInterval": (integer, False),
         "CaptureIntervalUnits": (str, False),
+        "TimecodeBurninSettings": (TimecodeBurninSettings, False),
     }
 
 
@@ -1399,10 +1448,19 @@ class H264Settings(AWSProperty):
         "SubgopLength": (str, False),
         "Syntax": (str, False),
         "TemporalAq": (str, False),
+        "TimecodeBurninSettings": (TimecodeBurninSettings, False),
         "TimecodeInsertion": (str, False),
     }
 
 
+class DolbyVision81Settings(AWSProperty):
+    """
+    `DolbyVision81Settings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dolbyvision81settings.html>`__
+    """
+
+    props: PropsDictType = {}
+
+
 class Hdr10Settings(AWSProperty):
     """
     `Hdr10Settings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hdr10settings.html>`__
@@ -1421,6 +1479,7 @@ class H265ColorSpaceSettings(AWSProperty):
 
     props: PropsDictType = {
         "ColorSpacePassthroughSettings": (ColorSpacePassthroughSettings, False),
+        "DolbyVision81Settings": (DolbyVision81Settings, False),
         "Hdr10Settings": (Hdr10Settings, False),
         "Rec601Settings": (Rec601Settings, False),
         "Rec709Settings": (Rec709Settings, False),
@@ -1471,6 +1530,7 @@ class H265Settings(AWSProperty):
         "SceneChangeDetect": (str, False),
         "Slices": (integer, False),
         "Tier": (str, False),
+        "TimecodeBurninSettings": (TimecodeBurninSettings, False),
         "TimecodeInsertion": (str, False),
     }
 
@@ -1506,6 +1566,7 @@ class Mpeg2Settings(AWSProperty):
         "GopSizeUnits": (str, False),
         "ScanType": (str, False),
         "SubgopLength": (str, False),
+        "TimecodeBurninSettings": (TimecodeBurninSettings, False),
         "TimecodeInsertion": (str, False),
     }
 
@@ -1659,6 +1720,16 @@ class AudioPidSelection(AWSProperty):
     }
 
 
+class AudioDolbyEDecode(AWSProperty):
+    """
+    `AudioDolbyEDecode <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodolbyedecode.html>`__
+    """
+
+    props: PropsDictType = {
+        "ProgramSelection": (str, False),
+    }
+
+
 class AudioTrack(AWSProperty):
     """
     `AudioTrack <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiotrack.html>`__
@@ -1675,6 +1746,7 @@ class AudioTrackSelection(AWSProperty):
     """
 
     props: PropsDictType = {
+        "DolbyEDecode": (AudioDolbyEDecode, False),
         "Tracks": ([AudioTrack], False),
     }
 
@@ -1943,6 +2015,17 @@ class InputSpecification(AWSProperty):
     }
 
 
+class MaintenanceCreateSettings(AWSProperty):
+    """
+    `MaintenanceCreateSettings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-maintenancecreatesettings.html>`__
+    """
+
+    props: PropsDictType = {
+        "MaintenanceDay": (str, False),
+        "MaintenanceStartTime": (str, False),
+    }
+
+
 class MediaPackageOutputDestinationSettings(AWSProperty):
     """
     `MediaPackageOutputDestinationSettings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mediapackageoutputdestinationsettings.html>`__
@@ -2017,6 +2100,7 @@ class Channel(AWSObject):
         "InputAttachments": ([InputAttachment], False),
         "InputSpecification": (InputSpecification, False),
         "LogLevel": (str, False),
+        "Maintenance": (MaintenanceCreateSettings, False),
         "Name": (str, False),
         "RoleArn": (str, False),
         "Tags": (dict, False),
@@ -2129,3 +2213,15 @@ class InputDeviceRequest(AWSProperty):
     props: PropsDictType = {
         "Id": (str, False),
     }
+
+
+class MaintenanceUpdateSettings(AWSProperty):
+    """
+    `MaintenanceUpdateSettings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-maintenanceupdatesettings.html>`__
+    """
+
+    props: PropsDictType = {
+        "MaintenanceDay": (str, False),
+        "MaintenanceScheduledDate": (str, False),
+        "MaintenanceStartTime": (str, False),
+    }
diff --git a/troposphere/mediapackage.py b/troposphere/mediapackage.py
index 6fa1b8ac..e699e305 100644
--- a/troposphere/mediapackage.py
+++ b/troposphere/mediapackage.py
@@ -105,7 +105,10 @@ class EncryptionContractConfiguration(AWSProperty):
     `EncryptionContractConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-encryptioncontractconfiguration.html>`__
     """
 
-    props: PropsDictType = {}
+    props: PropsDictType = {
+        "PresetSpeke20Audio": (str, True),
+        "PresetSpeke20Video": (str, True),
+    }
 
 
 class OriginEndpointSpekeKeyProvider(AWSProperty):
diff --git a/troposphere/mediatailor.py b/troposphere/mediatailor.py
index 342dd4a2..0048e611 100644
--- a/troposphere/mediatailor.py
+++ b/troposphere/mediatailor.py
@@ -7,7 +7,122 @@
 
 
 from . import AWSObject, AWSProperty, PropsDictType, Tags
-from .validators import boolean, integer
+from .validators import boolean, double, integer
+
+
+class LogConfigurationForChannel(AWSProperty):
+    """
+    `LogConfigurationForChannel <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-channel-logconfigurationforchannel.html>`__
+    """
+
+    props: PropsDictType = {
+        "LogTypes": ([str], False),
+    }
+
+
+class DashPlaylistSettings(AWSProperty):
+    """
+    `DashPlaylistSettings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-channel-dashplaylistsettings.html>`__
+    """
+
+    props: PropsDictType = {
+        "ManifestWindowSeconds": (double, False),
+        "MinBufferTimeSeconds": (double, False),
+        "MinUpdatePeriodSeconds": (double, False),
+        "SuggestedPresentationDelaySeconds": (double, False),
+    }
+
+
+class HlsPlaylistSettings(AWSProperty):
+    """
+    `HlsPlaylistSettings <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-channel-hlsplaylistsettings.html>`__
+    """
+
+    props: PropsDictType = {
+        "ManifestWindowSeconds": (double, False),
+    }
+
+
+class RequestOutputItem(AWSProperty):
+    """
+    `RequestOutputItem <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-channel-requestoutputitem.html>`__
+    """
+
+    props: PropsDictType = {
+        "DashPlaylistSettings": (DashPlaylistSettings, False),
+        "HlsPlaylistSettings": (HlsPlaylistSettings, False),
+        "ManifestName": (str, True),
+        "SourceGroup": (str, True),
+    }
+
+
+class SlateSource(AWSProperty):
+    """
+    `SlateSource <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-channel-slatesource.html>`__
+    """
+
+    props: PropsDictType = {
+        "SourceLocationName": (str, False),
+        "VodSourceName": (str, False),
+    }
+
+
+class Channel(AWSObject):
+    """
+    `Channel <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-channel.html>`__
+    """
+
+    resource_type = "AWS::MediaTailor::Channel"
+
+    props: PropsDictType = {
+        "ChannelName": (str, True),
+        "FillerSlate": (SlateSource, False),
+        "LogConfiguration": (LogConfigurationForChannel, False),
+        "Outputs": ([RequestOutputItem], True),
+        "PlaybackMode": (str, True),
+        "Tags": (Tags, False),
+        "Tier": (str, False),
+    }
+
+
+class ChannelPolicy(AWSObject):
+    """
+    `ChannelPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-channelpolicy.html>`__
+    """
+
+    resource_type = "AWS::MediaTailor::ChannelPolicy"
+
+    props: PropsDictType = {
+        "ChannelName": (str, True),
+        "Policy": (dict, True),
+    }
+
+
+class HttpPackageConfiguration(AWSProperty):
+    """
+    `HttpPackageConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-vodsource-httppackageconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "Path": (str, True),
+        "SourceGroup": (str, True),
+        "Type": (str, True),
+    }
+
+
+class LiveSource(AWSObject):
+    """
+    `LiveSource <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-livesource.html>`__
+    """
+
+    resource_type = "AWS::MediaTailor::LiveSource"
+
+    props: PropsDictType = {
+        "HttpPackageConfigurations": ([HttpPackageConfiguration], True),
+        "LiveSourceName": (str, True),
+        "SourceLocationName": (str, True),
+        "Tags": (Tags, False),
+    }
 
 
 class AvailSuppression(AWSProperty):
@@ -120,3 +235,18 @@ class PlaybackConfiguration(AWSObject):
         "TranscodeProfileName": (str, False),
         "VideoContentSourceUrl": (str, True),
     }
+
+
+class VodSource(AWSObject):
+    """
+    `VodSource <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-vodsource.html>`__
+    """
+
+    resource_type = "AWS::MediaTailor::VodSource"
+
+    props: PropsDictType = {
+        "HttpPackageConfigurations": ([HttpPackageConfiguration], True),
+        "SourceLocationName": (str, True),
+        "Tags": (Tags, False),
+        "VodSourceName": (str, True),
+    }
diff --git a/troposphere/memorydb.py b/troposphere/memorydb.py
index e8ed8b27..711884ff 100644
--- a/troposphere/memorydb.py
+++ b/troposphere/memorydb.py
@@ -121,8 +121,8 @@ class User(AWSObject):
     resource_type = "AWS::MemoryDB::User"
 
     props: PropsDictType = {
-        "AccessString": (str, True),
-        "AuthenticationMode": (AuthenticationMode, True),
+        "AccessString": (str, False),
+        "AuthenticationMode": (AuthenticationMode, False),
         "Tags": (Tags, False),
         "UserName": (str, True),
     }
diff --git a/troposphere/msk.py b/troposphere/msk.py
index e0f85e3e..da7cddea 100644
--- a/troposphere/msk.py
+++ b/troposphere/msk.py
@@ -381,6 +381,19 @@ class Cluster(AWSObject):
     }
 
 
+class ClusterPolicy(AWSObject):
+    """
+    `ClusterPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-clusterpolicy.html>`__
+    """
+
+    resource_type = "AWS::MSK::ClusterPolicy"
+
+    props: PropsDictType = {
+        "ClusterArn": (str, True),
+        "Policy": (dict, True),
+    }
+
+
 class Configuration(AWSObject):
     """
     `Configuration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-configuration.html>`__
@@ -420,3 +433,20 @@ class ServerlessCluster(AWSObject):
         "Tags": (dict, False),
         "VpcConfigs": ([VpcConfig], True),
     }
+
+
+class VpcConnection(AWSObject):
+    """
+    `VpcConnection <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-vpcconnection.html>`__
+    """
+
+    resource_type = "AWS::MSK::VpcConnection"
+
+    props: PropsDictType = {
+        "Authentication": (str, True),
+        "ClientSubnets": ([str], True),
+        "SecurityGroups": ([str], True),
+        "Tags": (dict, False),
+        "TargetClusterArn": (str, True),
+        "VpcId": (str, True),
+    }
diff --git a/troposphere/mwaa.py b/troposphere/mwaa.py
index 368d7669..ce795fe5 100644
--- a/troposphere/mwaa.py
+++ b/troposphere/mwaa.py
@@ -72,6 +72,8 @@ class Environment(AWSObject):
         "RequirementsS3Path": (str, False),
         "Schedulers": (integer, False),
         "SourceBucketArn": (str, False),
+        "StartupScriptS3ObjectVersion": (str, False),
+        "StartupScriptS3Path": (str, False),
         "Tags": (dict, False),
         "WebserverAccessMode": (str, False),
         "WeeklyMaintenanceWindowStart": (str, False),
diff --git a/troposphere/neptune.py b/troposphere/neptune.py
index 122918c2..3b2ded0f 100644
--- a/troposphere/neptune.py
+++ b/troposphere/neptune.py
@@ -7,7 +7,7 @@
 
 
 from . import AWSObject, AWSProperty, PropsDictType, Tags
-from .validators import boolean, integer
+from .validators import boolean, double, integer
 
 
 class DBClusterRole(AWSProperty):
@@ -21,6 +21,17 @@ class DBClusterRole(AWSProperty):
     }
 
 
+class ServerlessScalingConfiguration(AWSProperty):
+    """
+    `ServerlessScalingConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-neptune-dbcluster-serverlessscalingconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "MaxCapacity": (double, True),
+        "MinCapacity": (double, True),
+    }
+
+
 class DBCluster(AWSObject):
     """
     `DBCluster <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html>`__
@@ -32,8 +43,11 @@ class DBCluster(AWSObject):
         "AssociatedRoles": ([DBClusterRole], False),
         "AvailabilityZones": ([str], False),
         "BackupRetentionPeriod": (integer, False),
+        "CopyTagsToSnapshot": (boolean, False),
         "DBClusterIdentifier": (str, False),
         "DBClusterParameterGroupName": (str, False),
+        "DBInstanceParameterGroupName": (str, False),
+        "DBPort": (integer, False),
         "DBSubnetGroupName": (str, False),
         "DeletionProtection": (boolean, False),
         "EnableCloudwatchLogsExports": ([str], False),
@@ -44,6 +58,7 @@ class DBCluster(AWSObject):
         "PreferredMaintenanceWindow": (str, False),
         "RestoreToTime": (str, False),
         "RestoreType": (str, False),
+        "ServerlessScalingConfiguration": (ServerlessScalingConfiguration, False),
         "SnapshotIdentifier": (str, False),
         "SourceDBClusterIdentifier": (str, False),
         "StorageEncrypted": (boolean, False),
diff --git a/troposphere/networkfirewall.py b/troposphere/networkfirewall.py
index 8f3dbf6f..3fb58b51 100644
--- a/troposphere/networkfirewall.py
+++ b/troposphere/networkfirewall.py
@@ -83,6 +83,26 @@ class CustomAction(AWSProperty):
     }
 
 
+class IPSet(AWSProperty):
+    """
+    `IPSet <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ipset.html>`__
+    """
+
+    props: PropsDictType = {
+        "Definition": ([str], False),
+    }
+
+
+class PolicyVariables(AWSProperty):
+    """
+    `PolicyVariables <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-policyvariables.html>`__
+    """
+
+    props: PropsDictType = {
+        "RuleVariables": (dict, False),
+    }
+
+
 class StatefulEngineOptions(AWSProperty):
     """
     `StatefulEngineOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statefulengineoptions.html>`__
@@ -133,6 +153,7 @@ class FirewallPolicyProperty(AWSProperty):
     """
 
     props: PropsDictType = {
+        "PolicyVariables": (PolicyVariables, False),
         "StatefulDefaultActions": ([str], False),
         "StatefulEngineOptions": (StatefulEngineOptions, False),
         "StatefulRuleGroupReferences": ([StatefulRuleGroupReference], False),
@@ -214,16 +235,6 @@ class ReferenceSets(AWSProperty):
     }
 
 
-class IPSet(AWSProperty):
-    """
-    `IPSet <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ipset.html>`__
-    """
-
-    props: PropsDictType = {
-        "Definition": ([str], False),
-    }
-
-
 class PortSet(AWSProperty):
     """
     `PortSet <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-portset.html>`__
diff --git a/troposphere/networkmanager.py b/troposphere/networkmanager.py
index 86496796..262c74dc 100644
--- a/troposphere/networkmanager.py
+++ b/troposphere/networkmanager.py
@@ -20,6 +20,18 @@ class ConnectAttachmentOptions(AWSProperty):
     }
 
 
+class ProposedSegmentChange(AWSProperty):
+    """
+    `ProposedSegmentChange <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-vpcattachment-proposedsegmentchange.html>`__
+    """
+
+    props: PropsDictType = {
+        "AttachmentPolicyRuleNumber": (integer, False),
+        "SegmentName": (str, False),
+        "Tags": (Tags, False),
+    }
+
+
 class ConnectAttachment(AWSObject):
     """
     `ConnectAttachment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectattachment.html>`__
@@ -31,6 +43,7 @@ class ConnectAttachment(AWSObject):
         "CoreNetworkId": (str, True),
         "EdgeLocation": (str, True),
         "Options": (ConnectAttachmentOptions, True),
+        "ProposedSegmentChange": (ProposedSegmentChange, False),
         "Tags": (Tags, False),
         "TransportAttachmentId": (str, True),
     }
@@ -57,7 +70,7 @@ class ConnectPeer(AWSObject):
         "BgpOptions": (BgpOptions, False),
         "ConnectAttachmentId": (str, True),
         "CoreNetworkAddress": (str, False),
-        "InsideCidrBlocks": ([str], True),
+        "InsideCidrBlocks": ([str], False),
         "PeerAddress": (str, True),
         "Tags": (Tags, False),
     }
@@ -93,6 +106,17 @@ class CustomerGatewayAssociation(AWSObject):
     }
 
 
+class AWSLocation(AWSProperty):
+    """
+    `AWSLocation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-device-awslocation.html>`__
+    """
+
+    props: PropsDictType = {
+        "SubnetArn": (str, False),
+        "Zone": (str, False),
+    }
+
+
 class Location(AWSProperty):
     """
     `Location <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-site-location.html>`__
@@ -113,6 +137,7 @@ class Device(AWSObject):
     resource_type = "AWS::NetworkManager::Device"
 
     props: PropsDictType = {
+        "AWSLocation": (AWSLocation, False),
         "Description": (str, False),
         "GlobalNetworkId": (str, True),
         "Location": (Location, False),
@@ -205,6 +230,7 @@ class SiteToSiteVpnAttachment(AWSObject):
 
     props: PropsDictType = {
         "CoreNetworkId": (str, True),
+        "ProposedSegmentChange": (ProposedSegmentChange, False),
         "Tags": (Tags, False),
         "VpnConnectionArn": (str, True),
     }
@@ -237,18 +263,6 @@ class TransitGatewayRegistration(AWSObject):
     }
 
 
-class ProposedSegmentChange(AWSProperty):
-    """
-    `ProposedSegmentChange <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-vpcattachment-proposedsegmentchange.html>`__
-    """
-
-    props: PropsDictType = {
-        "AttachmentPolicyRuleNumber": (integer, False),
-        "SegmentName": (str, False),
-        "Tags": (Tags, False),
-    }
-
-
 class TransitGatewayRouteTableAttachment(AWSObject):
     """
     `TransitGatewayRouteTableAttachment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewayroutetableattachment.html>`__
@@ -285,6 +299,7 @@ class VpcAttachment(AWSObject):
     props: PropsDictType = {
         "CoreNetworkId": (str, True),
         "Options": (VpcOptions, False),
+        "ProposedSegmentChange": (ProposedSegmentChange, False),
         "SubnetArns": ([str], True),
         "Tags": (Tags, False),
         "VpcArn": (str, True),
diff --git a/troposphere/opensearchservice.py b/troposphere/opensearchservice.py
index 2431f02a..e34f459d 100644
--- a/troposphere/opensearchservice.py
+++ b/troposphere/opensearchservice.py
@@ -86,6 +86,7 @@ class ClusterConfig(AWSProperty):
         "DedicatedMasterType": (str, False),
         "InstanceCount": (integer, False),
         "InstanceType": (str, False),
+        "MultiAZWithStandbyEnabled": (boolean, False),
         "WarmCount": (integer, False),
         "WarmEnabled": (boolean, False),
         "WarmType": (str, False),
diff --git a/troposphere/organizations.py b/troposphere/organizations.py
index 6f368a8a..8ab65fb2 100644
--- a/troposphere/organizations.py
+++ b/troposphere/organizations.py
@@ -26,6 +26,18 @@ class Account(AWSObject):
     }
 
 
+class Organization(AWSObject):
+    """
+    `Organization <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-organization.html>`__
+    """
+
+    resource_type = "AWS::Organizations::Organization"
+
+    props: PropsDictType = {
+        "FeatureSet": (str, False),
+    }
+
+
 class OrganizationalUnit(AWSObject):
     """
     `OrganizationalUnit <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-organizationalunit.html>`__
diff --git a/troposphere/panorama.py b/troposphere/panorama.py
index 263c0e56..ad069332 100644
--- a/troposphere/panorama.py
+++ b/troposphere/panorama.py
@@ -41,12 +41,10 @@ class ApplicationInstance(AWSObject):
         "ApplicationInstanceIdToReplace": (str, False),
         "DefaultRuntimeContextDevice": (str, True),
         "Description": (str, False),
-        "DeviceId": (str, False),
         "ManifestOverridesPayload": (ManifestOverridesPayload, False),
         "ManifestPayload": (ManifestPayload, True),
         "Name": (str, False),
         "RuntimeRoleArn": (str, False),
-        "StatusFilter": (str, False),
         "Tags": (Tags, False),
     }
 
diff --git a/troposphere/quicksight.py b/troposphere/quicksight.py
index 131afd10..87eb60a3 100644
--- a/troposphere/quicksight.py
+++ b/troposphere/quicksight.py
@@ -174,28 +174,6 @@ class CalculatedField(AWSProperty):
     }
 
 
-class CustomColor(AWSProperty):
-    """
-    `CustomColor <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcolor.html>`__
-    """
-
-    props: PropsDictType = {
-        "Color": (str, True),
-        "FieldValue": (str, False),
-        "SpecialValue": (str, False),
-    }
-
-
-class ColorsConfiguration(AWSProperty):
-    """
-    `ColorsConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-colorsconfiguration.html>`__
-    """
-
-    props: PropsDictType = {
-        "CustomColors": ([CustomColor], False),
-    }
-
-
 class ColumnIdentifier(AWSProperty):
     """
     `ColumnIdentifier <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnidentifier.html>`__
@@ -376,7 +354,6 @@ class ColumnConfiguration(AWSProperty):
     """
 
     props: PropsDictType = {
-        "ColorsConfiguration": (ColorsConfiguration, False),
         "Column": (ColumnIdentifier, True),
         "FormatConfiguration": (FormatConfiguration, False),
         "Role": (str, False),
@@ -639,7 +616,7 @@ class AggregationSortConfiguration(AWSProperty):
     """
 
     props: PropsDictType = {
-        "AggregationFunction": (AggregationFunction, True),
+        "AggregationFunction": (AggregationFunction, False),
         "Column": (ColumnIdentifier, True),
         "SortDirection": (str, True),
     }
@@ -2052,6 +2029,7 @@ class DataLabelOptions(AWSProperty):
         "MeasureLabelVisibility": (str, False),
         "Overlap": (str, False),
         "Position": (str, False),
+        "TotalsVisibility": (str, False),
         "Visibility": (str, False),
     }
 
@@ -2078,7 +2056,7 @@ class ReferenceLineDynamicDataConfiguration(AWSProperty):
     props: PropsDictType = {
         "Calculation": (NumericalAggregationFunction, True),
         "Column": (ColumnIdentifier, True),
-        "MeasureAggregationFunction": (AggregationFunction, True),
+        "MeasureAggregationFunction": (AggregationFunction, False),
     }
 
 
@@ -2425,6 +2403,7 @@ class FilterOperationSelectedFieldsConfiguration(AWSProperty):
     """
 
     props: PropsDictType = {
+        "SelectedColumns": ([ColumnIdentifier], False),
         "SelectedFieldOptions": (str, False),
         "SelectedFields": ([str], False),
     }
@@ -2520,6 +2499,7 @@ class DestinationParameterValueConfiguration(AWSProperty):
     props: PropsDictType = {
         "CustomValuesConfiguration": (CustomValuesConfiguration, False),
         "SelectAllValueOptions": (str, False),
+        "SourceColumn": (ColumnIdentifier, False),
         "SourceField": (str, False),
         "SourceParameterName": (str, False),
     }
@@ -3394,6 +3374,36 @@ class ClusterMarkerConfiguration(AWSProperty):
     }
 
 
+class GeospatialHeatmapDataColor(AWSProperty):
+    """
+    `GeospatialHeatmapDataColor <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialheatmapdatacolor.html>`__
+    """
+
+    props: PropsDictType = {
+        "Color": (str, True),
+    }
+
+
+class GeospatialHeatmapColorScale(AWSProperty):
+    """
+    `GeospatialHeatmapColorScale <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialheatmapcolorscale.html>`__
+    """
+
+    props: PropsDictType = {
+        "Colors": ([GeospatialHeatmapDataColor], False),
+    }
+
+
+class GeospatialHeatmapConfiguration(AWSProperty):
+    """
+    `GeospatialHeatmapConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialheatmapconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "HeatmapColor": (GeospatialHeatmapColorScale, False),
+    }
+
+
 class GeospatialPointStyleOptions(AWSProperty):
     """
     `GeospatialPointStyleOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialpointstyleoptions.html>`__
@@ -3401,6 +3411,7 @@ class GeospatialPointStyleOptions(AWSProperty):
 
     props: PropsDictType = {
         "ClusterMarkerConfiguration": (ClusterMarkerConfiguration, False),
+        "HeatmapConfiguration": (GeospatialHeatmapConfiguration, False),
         "SelectedPointStyle": (str, False),
     }
 
@@ -4326,6 +4337,7 @@ class PivotTableCellConditionalFormatting(AWSProperty):
     props: PropsDictType = {
         "FieldId": (str, True),
         "Scope": (PivotTableConditionalFormattingScope, False),
+        "Scopes": ([PivotTableConditionalFormattingScope], False),
         "TextFormat": (TextConditionalFormat, False),
     }
 
@@ -4364,6 +4376,28 @@ class PivotTableDataPathOption(AWSProperty):
     }
 
 
+class PivotTableFieldCollapseStateTarget(AWSProperty):
+    """
+    `PivotTableFieldCollapseStateTarget <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldcollapsestatetarget.html>`__
+    """
+
+    props: PropsDictType = {
+        "FieldDataPathValues": ([DataPathValue], False),
+        "FieldId": (str, False),
+    }
+
+
+class PivotTableFieldCollapseStateOption(AWSProperty):
+    """
+    `PivotTableFieldCollapseStateOption <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldcollapsestateoption.html>`__
+    """
+
+    props: PropsDictType = {
+        "State": (str, False),
+        "Target": (PivotTableFieldCollapseStateTarget, True),
+    }
+
+
 class PivotTableFieldOption(AWSProperty):
     """
     `PivotTableFieldOption <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldoption.html>`__
@@ -4382,6 +4416,7 @@ class PivotTableFieldOptions(AWSProperty):
     """
 
     props: PropsDictType = {
+        "CollapseStateOptions": ([PivotTableFieldCollapseStateOption], False),
         "DataPathOptions": ([PivotTableDataPathOption], False),
         "SelectedFieldOptions": ([PivotTableFieldOption], False),
     }
@@ -4482,6 +4517,7 @@ class PivotTableOptions(AWSProperty):
 
     props: PropsDictType = {
         "CellStyle": (TableCellStyle, False),
+        "CollapsedRowDimensionsVisibility": (str, False),
         "ColumnHeaderStyle": (TableCellStyle, False),
         "ColumnNamesVisibility": (str, False),
         "MetricPlacement": (str, False),
@@ -4697,6 +4733,7 @@ class RadarChartConfiguration(AWSProperty):
         "AlternateBandColorsVisibility": (str, False),
         "AlternateBandEvenColor": (str, False),
         "AlternateBandOddColor": (str, False),
+        "AxesRangeScale": (str, False),
         "BaseSeriesSettings": (RadarChartSeriesSettings, False),
         "CategoryAxis": (AxisDisplayOptions, False),
         "CategoryLabelOptions": (ChartAxisLabelOptions, False),
@@ -4793,6 +4830,7 @@ class ScatterPlotCategoricallyAggregatedFieldWells(AWSProperty):
 
     props: PropsDictType = {
         "Category": ([DimensionField], False),
+        "Label": ([DimensionField], False),
         "Size": ([MeasureField], False),
         "XAxis": ([MeasureField], False),
         "YAxis": ([MeasureField], False),
@@ -4805,6 +4843,8 @@ class ScatterPlotUnaggregatedFieldWells(AWSProperty):
     """
 
     props: PropsDictType = {
+        "Category": ([DimensionField], False),
+        "Label": ([DimensionField], False),
         "Size": ([MeasureField], False),
         "XAxis": ([DimensionField], False),
         "YAxis": ([DimensionField], False),
@@ -5532,6 +5572,7 @@ class ResourcePermission(AWSProperty):
     props: PropsDictType = {
         "Actions": ([str], True),
         "Principal": (str, True),
+        "Resource": (str, False),
     }
 
 
@@ -5791,6 +5832,48 @@ class ColumnLevelPermissionRule(AWSProperty):
     }
 
 
+class LookbackWindow(AWSProperty):
+    """
+    `LookbackWindow <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-lookbackwindow.html>`__
+    """
+
+    props: PropsDictType = {
+        "ColumnName": (str, False),
+        "Size": (double, False),
+        "SizeUnit": (str, False),
+    }
+
+
+class IncrementalRefresh(AWSProperty):
+    """
+    `IncrementalRefresh <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-incrementalrefresh.html>`__
+    """
+
+    props: PropsDictType = {
+        "LookbackWindow": (LookbackWindow, False),
+    }
+
+
+class RefreshConfiguration(AWSProperty):
+    """
+    `RefreshConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-refreshconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "IncrementalRefresh": (IncrementalRefresh, False),
+    }
+
+
+class DataSetRefreshProperties(AWSProperty):
+    """
+    `DataSetRefreshProperties <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetrefreshproperties.html>`__
+    """
+
+    props: PropsDictType = {
+        "RefreshConfiguration": (RefreshConfiguration, False),
+    }
+
+
 class DataSetUsageConfiguration(AWSProperty):
     """
     `DataSetUsageConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetusageconfiguration.html>`__
@@ -5802,6 +5885,112 @@ class DataSetUsageConfiguration(AWSProperty):
     }
 
 
+class DateTimeDatasetParameterDefaultValues(AWSProperty):
+    """
+    `DateTimeDatasetParameterDefaultValues <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datetimedatasetparameterdefaultvalues.html>`__
+    """
+
+    props: PropsDictType = {
+        "StaticValues": ([str], False),
+    }
+
+
+class DateTimeDatasetParameter(AWSProperty):
+    """
+    `DateTimeDatasetParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datetimedatasetparameter.html>`__
+    """
+
+    props: PropsDictType = {
+        "DefaultValues": (DateTimeDatasetParameterDefaultValues, False),
+        "Id": (str, True),
+        "Name": (str, True),
+        "TimeGranularity": (str, False),
+        "ValueType": (str, True),
+    }
+
+
+class DecimalDatasetParameterDefaultValues(AWSProperty):
+    """
+    `DecimalDatasetParameterDefaultValues <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-decimaldatasetparameterdefaultvalues.html>`__
+    """
+
+    props: PropsDictType = {
+        "StaticValues": ([double], False),
+    }
+
+
+class DecimalDatasetParameter(AWSProperty):
+    """
+    `DecimalDatasetParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-decimaldatasetparameter.html>`__
+    """
+
+    props: PropsDictType = {
+        "DefaultValues": (DecimalDatasetParameterDefaultValues, False),
+        "Id": (str, True),
+        "Name": (str, True),
+        "ValueType": (str, True),
+    }
+
+
+class IntegerDatasetParameterDefaultValues(AWSProperty):
+    """
+    `IntegerDatasetParameterDefaultValues <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-integerdatasetparameterdefaultvalues.html>`__
+    """
+
+    props: PropsDictType = {
+        "StaticValues": ([double], False),
+    }
+
+
+class IntegerDatasetParameter(AWSProperty):
+    """
+    `IntegerDatasetParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-integerdatasetparameter.html>`__
+    """
+
+    props: PropsDictType = {
+        "DefaultValues": (IntegerDatasetParameterDefaultValues, False),
+        "Id": (str, True),
+        "Name": (str, True),
+        "ValueType": (str, True),
+    }
+
+
+class StringDatasetParameterDefaultValues(AWSProperty):
+    """
+    `StringDatasetParameterDefaultValues <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-stringdatasetparameterdefaultvalues.html>`__
+    """
+
+    props: PropsDictType = {
+        "StaticValues": ([str], False),
+    }
+
+
+class StringDatasetParameter(AWSProperty):
+    """
+    `StringDatasetParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-stringdatasetparameter.html>`__
+    """
+
+    props: PropsDictType = {
+        "DefaultValues": (StringDatasetParameterDefaultValues, False),
+        "Id": (str, True),
+        "Name": (str, True),
+        "ValueType": (str, True),
+    }
+
+
+class DatasetParameter(AWSProperty):
+    """
+    `DatasetParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetparameter.html>`__
+    """
+
+    props: PropsDictType = {
+        "DateTimeDatasetParameter": (DateTimeDatasetParameter, False),
+        "DecimalDatasetParameter": (DecimalDatasetParameter, False),
+        "IntegerDatasetParameter": (IntegerDatasetParameter, False),
+        "StringDatasetParameter": (StringDatasetParameter, False),
+    }
+
+
 class FieldFolder(AWSProperty):
     """
     `FieldFolder <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-fieldfolder.html>`__
@@ -5905,6 +6094,31 @@ class FilterOperation(AWSProperty):
     }
 
 
+class NewDefaultValues(AWSProperty):
+    """
+    `NewDefaultValues <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-newdefaultvalues.html>`__
+    """
+
+    props: PropsDictType = {
+        "DateTimeStaticValues": ([str], False),
+        "DecimalStaticValues": ([double], False),
+        "IntegerStaticValues": ([double], False),
+        "StringStaticValues": ([str], False),
+    }
+
+
+class OverrideDatasetParameterOperation(AWSProperty):
+    """
+    `OverrideDatasetParameterOperation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-overridedatasetparameteroperation.html>`__
+    """
+
+    props: PropsDictType = {
+        "NewDefaultValues": (NewDefaultValues, False),
+        "NewParameterName": (str, False),
+        "ParameterName": (str, True),
+    }
+
+
 class ProjectOperation(AWSProperty):
     """
     `ProjectOperation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-projectoperation.html>`__
@@ -5967,6 +6181,7 @@ class TransformOperation(AWSProperty):
         "CastColumnTypeOperation": (CastColumnTypeOperation, False),
         "CreateColumnsOperation": (CreateColumnsOperation, False),
         "FilterOperation": (FilterOperation, False),
+        "OverrideDatasetParameterOperation": (OverrideDatasetParameterOperation, False),
         "ProjectOperation": (ProjectOperation, False),
         "RenameColumnOperation": (RenameColumnOperation, False),
         "TagColumnOperation": (TagColumnOperation, False),
@@ -6071,6 +6286,32 @@ class RowLevelPermissionDataSet(AWSProperty):
         "FormatVersion": (str, False),
         "Namespace": (str, False),
         "PermissionPolicy": (str, True),
+        "Status": (str, False),
+    }
+
+
+class RowLevelPermissionTagRule(AWSProperty):
+    """
+    `RowLevelPermissionTagRule <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagrule.html>`__
+    """
+
+    props: PropsDictType = {
+        "ColumnName": (str, True),
+        "MatchAllValue": (str, False),
+        "TagKey": (str, True),
+        "TagMultiValueDelimiter": (str, False),
+    }
+
+
+class RowLevelPermissionTagConfiguration(AWSProperty):
+    """
+    `RowLevelPermissionTagConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "Status": (str, False),
+        "TagRuleConfigurations": (dict, False),
+        "TagRules": ([RowLevelPermissionTagRule], True),
     }
 
 
@@ -6086,7 +6327,9 @@ class DataSet(AWSObject):
         "ColumnGroups": ([ColumnGroup], False),
         "ColumnLevelPermissionRules": ([ColumnLevelPermissionRule], False),
         "DataSetId": (str, False),
+        "DataSetRefreshProperties": (DataSetRefreshProperties, False),
         "DataSetUsageConfiguration": (DataSetUsageConfiguration, False),
+        "DatasetParameters": ([DatasetParameter], False),
         "FieldFolders": (dict, False),
         "ImportMode": (str, False),
         "IngestionWaitPolicy": (IngestionWaitPolicy, False),
@@ -6095,6 +6338,10 @@ class DataSet(AWSObject):
         "Permissions": ([ResourcePermission], False),
         "PhysicalTableMap": (dict, False),
         "RowLevelPermissionDataSet": (RowLevelPermissionDataSet, False),
+        "RowLevelPermissionTagConfiguration": (
+            RowLevelPermissionTagConfiguration,
+            False,
+        ),
         "Tags": (Tags, False),
     }
 
@@ -6125,6 +6372,7 @@ class AthenaParameters(AWSProperty):
     """
 
     props: PropsDictType = {
+        "RoleArn": (str, False),
         "WorkGroup": (str, False),
     }
 
@@ -6267,6 +6515,7 @@ class S3Parameters(AWSProperty):
 
     props: PropsDictType = {
         "ManifestFileLocation": (ManifestFileLocation, True),
+        "RoleArn": (str, False),
     }
 
 
@@ -6422,6 +6671,57 @@ class DataSource(AWSObject):
     }
 
 
+class RefreshOnDay(AWSProperty):
+    """
+    `RefreshOnDay <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-refreshonday.html>`__
+    """
+
+    props: PropsDictType = {
+        "DayOfMonth": (str, False),
+        "DayOfWeek": (str, False),
+    }
+
+
+class ScheduleFrequency(AWSProperty):
+    """
+    `ScheduleFrequency <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-schedulefrequency.html>`__
+    """
+
+    props: PropsDictType = {
+        "Interval": (str, False),
+        "RefreshOnDay": (RefreshOnDay, False),
+        "TimeOfTheDay": (str, False),
+        "TimeZone": (str, False),
+    }
+
+
+class RefreshScheduleMap(AWSProperty):
+    """
+    `RefreshScheduleMap <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-refreshschedulemap.html>`__
+    """
+
+    props: PropsDictType = {
+        "RefreshType": (str, False),
+        "ScheduleFrequency": (ScheduleFrequency, False),
+        "ScheduleId": (str, False),
+        "StartAfterDateTime": (str, False),
+    }
+
+
+class RefreshSchedule(AWSObject):
+    """
+    `RefreshSchedule <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-refreshschedule.html>`__
+    """
+
+    resource_type = "AWS::QuickSight::RefreshSchedule"
+
+    props: PropsDictType = {
+        "AwsAccountId": (str, False),
+        "DataSetId": (str, False),
+        "Schedule": (RefreshScheduleMap, False),
+    }
+
+
 class TemplateSourceAnalysis(AWSProperty):
     """
     `TemplateSourceAnalysis <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templatesourceanalysis.html>`__
@@ -6685,9 +6985,9 @@ class Theme(AWSObject):
 
     props: PropsDictType = {
         "AwsAccountId": (str, True),
-        "BaseThemeId": (str, False),
-        "Configuration": (ThemeConfiguration, False),
-        "Name": (str, False),
+        "BaseThemeId": (str, True),
+        "Configuration": (ThemeConfiguration, True),
+        "Name": (str, True),
         "Permissions": ([ResourcePermission], False),
         "Tags": (Tags, False),
         "ThemeId": (str, True),
@@ -6695,6 +6995,385 @@ class Theme(AWSObject):
     }
 
 
+class DataAggregation(AWSProperty):
+    """
+    `DataAggregation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-dataaggregation.html>`__
+    """
+
+    props: PropsDictType = {
+        "DatasetRowDateGranularity": (str, False),
+        "DefaultDateColumnName": (str, False),
+    }
+
+
+class CellValueSynonym(AWSProperty):
+    """
+    `CellValueSynonym <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-cellvaluesynonym.html>`__
+    """
+
+    props: PropsDictType = {
+        "CellValue": (str, False),
+        "Synonyms": ([str], False),
+    }
+
+
+class ComparativeOrder(AWSProperty):
+    """
+    `ComparativeOrder <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-comparativeorder.html>`__
+    """
+
+    props: PropsDictType = {
+        "SpecifedOrder": ([str], False),
+        "TreatUndefinedSpecifiedValues": (str, False),
+        "UseOrdering": (str, False),
+    }
+
+
+class NegativeFormat(AWSProperty):
+    """
+    `NegativeFormat <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-negativeformat.html>`__
+    """
+
+    props: PropsDictType = {
+        "Prefix": (str, False),
+        "Suffix": (str, False),
+    }
+
+
+class DisplayFormatOptions(AWSProperty):
+    """
+    `DisplayFormatOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html>`__
+    """
+
+    props: PropsDictType = {
+        "BlankCellFormat": (str, False),
+        "CurrencySymbol": (str, False),
+        "DateFormat": (str, False),
+        "DecimalSeparator": (str, False),
+        "FractionDigits": (double, False),
+        "GroupingSeparator": (str, False),
+        "NegativeFormat": (NegativeFormat, False),
+        "Prefix": (str, False),
+        "Suffix": (str, False),
+        "UnitScaler": (str, False),
+        "UseBlankCellFormat": (boolean, False),
+        "UseGrouping": (boolean, False),
+    }
+
+
+class DefaultFormatting(AWSProperty):
+    """
+    `DefaultFormatting <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-defaultformatting.html>`__
+    """
+
+    props: PropsDictType = {
+        "DisplayFormat": (str, False),
+        "DisplayFormatOptions": (DisplayFormatOptions, False),
+    }
+
+
+class SemanticType(AWSProperty):
+    """
+    `SemanticType <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semantictype.html>`__
+    """
+
+    props: PropsDictType = {
+        "FalseyCellValue": (str, False),
+        "FalseyCellValueSynonyms": ([str], False),
+        "SubTypeName": (str, False),
+        "TruthyCellValue": (str, False),
+        "TruthyCellValueSynonyms": ([str], False),
+        "TypeName": (str, False),
+        "TypeParameters": (dict, False),
+    }
+
+
+class TopicCalculatedField(AWSProperty):
+    """
+    `TopicCalculatedField <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html>`__
+    """
+
+    props: PropsDictType = {
+        "Aggregation": (str, False),
+        "AllowedAggregations": ([str], False),
+        "CalculatedFieldDescription": (str, False),
+        "CalculatedFieldName": (str, True),
+        "CalculatedFieldSynonyms": ([str], False),
+        "CellValueSynonyms": ([CellValueSynonym], False),
+        "ColumnDataRole": (str, False),
+        "ComparativeOrder": (ComparativeOrder, False),
+        "DefaultFormatting": (DefaultFormatting, False),
+        "Expression": (str, True),
+        "IsIncludedInTopic": (boolean, False),
+        "NeverAggregateInFilter": (boolean, False),
+        "NotAllowedAggregations": ([str], False),
+        "SemanticType": (SemanticType, False),
+        "TimeGranularity": (str, False),
+    }
+
+
+class TopicColumn(AWSProperty):
+    """
+    `TopicColumn <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html>`__
+    """
+
+    props: PropsDictType = {
+        "Aggregation": (str, False),
+        "AllowedAggregations": ([str], False),
+        "CellValueSynonyms": ([CellValueSynonym], False),
+        "ColumnDataRole": (str, False),
+        "ColumnDescription": (str, False),
+        "ColumnFriendlyName": (str, False),
+        "ColumnName": (str, True),
+        "ColumnSynonyms": ([str], False),
+        "ComparativeOrder": (ComparativeOrder, False),
+        "DefaultFormatting": (DefaultFormatting, False),
+        "IsIncludedInTopic": (boolean, False),
+        "NeverAggregateInFilter": (boolean, False),
+        "NotAllowedAggregations": ([str], False),
+        "SemanticType": (SemanticType, False),
+        "TimeGranularity": (str, False),
+    }
+
+
+class CollectiveConstant(AWSProperty):
+    """
+    `CollectiveConstant <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-collectiveconstant.html>`__
+    """
+
+    props: PropsDictType = {
+        "ValueList": ([str], False),
+    }
+
+
+class TopicCategoryFilterConstant(AWSProperty):
+    """
+    `TopicCategoryFilterConstant <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilterconstant.html>`__
+    """
+
+    props: PropsDictType = {
+        "CollectiveConstant": (CollectiveConstant, False),
+        "ConstantType": (str, False),
+        "SingularConstant": (str, False),
+    }
+
+
+class TopicCategoryFilter(AWSProperty):
+    """
+    `TopicCategoryFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "CategoryFilterFunction": (str, False),
+        "CategoryFilterType": (str, False),
+        "Constant": (TopicCategoryFilterConstant, False),
+        "Inverse": (boolean, False),
+    }
+
+
+class RangeConstant(AWSProperty):
+    """
+    `RangeConstant <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-rangeconstant.html>`__
+    """
+
+    props: PropsDictType = {
+        "Maximum": (str, False),
+        "Minimum": (str, False),
+    }
+
+
+class TopicRangeFilterConstant(AWSProperty):
+    """
+    `TopicRangeFilterConstant <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicrangefilterconstant.html>`__
+    """
+
+    props: PropsDictType = {
+        "ConstantType": (str, False),
+        "RangeConstant": (RangeConstant, False),
+    }
+
+
+class TopicDateRangeFilter(AWSProperty):
+    """
+    `TopicDateRangeFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicdaterangefilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "Constant": (TopicRangeFilterConstant, False),
+        "Inclusive": (boolean, False),
+    }
+
+
+class TopicSingularFilterConstant(AWSProperty):
+    """
+    `TopicSingularFilterConstant <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicsingularfilterconstant.html>`__
+    """
+
+    props: PropsDictType = {
+        "ConstantType": (str, False),
+        "SingularConstant": (str, False),
+    }
+
+
+class TopicNumericEqualityFilter(AWSProperty):
+    """
+    `TopicNumericEqualityFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnumericequalityfilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "Aggregation": (str, False),
+        "Constant": (TopicSingularFilterConstant, False),
+    }
+
+
+class TopicNumericRangeFilter(AWSProperty):
+    """
+    `TopicNumericRangeFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnumericrangefilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "Aggregation": (str, False),
+        "Constant": (TopicRangeFilterConstant, False),
+        "Inclusive": (boolean, False),
+    }
+
+
+class TopicRelativeDateFilter(AWSProperty):
+    """
+    `TopicRelativeDateFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicrelativedatefilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "Constant": (TopicSingularFilterConstant, False),
+        "RelativeDateFilterFunction": (str, False),
+        "TimeGranularity": (str, False),
+    }
+
+
+class TopicFilter(AWSProperty):
+    """
+    `TopicFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "CategoryFilter": (TopicCategoryFilter, False),
+        "DateRangeFilter": (TopicDateRangeFilter, False),
+        "FilterClass": (str, False),
+        "FilterDescription": (str, False),
+        "FilterName": (str, True),
+        "FilterSynonyms": ([str], False),
+        "FilterType": (str, False),
+        "NumericEqualityFilter": (TopicNumericEqualityFilter, False),
+        "NumericRangeFilter": (TopicNumericRangeFilter, False),
+        "OperandFieldName": (str, True),
+        "RelativeDateFilter": (TopicRelativeDateFilter, False),
+    }
+
+
+class NamedEntityDefinitionMetric(AWSProperty):
+    """
+    `NamedEntityDefinitionMetric <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinitionmetric.html>`__
+    """
+
+    props: PropsDictType = {
+        "Aggregation": (str, False),
+        "AggregationFunctionParameters": (dict, False),
+    }
+
+
+class NamedEntityDefinition(AWSProperty):
+    """
+    `NamedEntityDefinition <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinition.html>`__
+    """
+
+    props: PropsDictType = {
+        "FieldName": (str, False),
+        "Metric": (NamedEntityDefinitionMetric, False),
+        "PropertyName": (str, False),
+        "PropertyRole": (str, False),
+        "PropertyUsage": (str, False),
+    }
+
+
+class SemanticEntityType(AWSProperty):
+    """
+    `SemanticEntityType <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semanticentitytype.html>`__
+    """
+
+    props: PropsDictType = {
+        "SubTypeName": (str, False),
+        "TypeName": (str, False),
+        "TypeParameters": (dict, False),
+    }
+
+
+class TopicNamedEntity(AWSProperty):
+    """
+    `TopicNamedEntity <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnamedentity.html>`__
+    """
+
+    props: PropsDictType = {
+        "Definition": ([NamedEntityDefinition], False),
+        "EntityDescription": (str, False),
+        "EntityName": (str, True),
+        "EntitySynonyms": ([str], False),
+        "SemanticEntityType": (SemanticEntityType, False),
+    }
+
+
+class DatasetMetadata(AWSProperty):
+    """
+    `DatasetMetadata <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-datasetmetadata.html>`__
+    """
+
+    props: PropsDictType = {
+        "CalculatedFields": ([TopicCalculatedField], False),
+        "Columns": ([TopicColumn], False),
+        "DataAggregation": (DataAggregation, False),
+        "DatasetArn": (str, True),
+        "DatasetDescription": (str, False),
+        "DatasetName": (str, False),
+        "Filters": ([TopicFilter], False),
+        "NamedEntities": ([TopicNamedEntity], False),
+    }
+
+
+class Topic(AWSObject):
+    """
+    `Topic <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-topic.html>`__
+    """
+
+    resource_type = "AWS::QuickSight::Topic"
+
+    props: PropsDictType = {
+        "AwsAccountId": (str, False),
+        "DataSets": ([DatasetMetadata], False),
+        "Description": (str, False),
+        "Name": (str, False),
+        "TopicId": (str, False),
+    }
+
+
+class VPCConnection(AWSObject):
+    """
+    `VPCConnection <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html>`__
+    """
+
+    resource_type = "AWS::QuickSight::VPCConnection"
+
+    props: PropsDictType = {
+        "AvailabilityStatus": (str, False),
+        "AwsAccountId": (str, False),
+        "DnsResolvers": ([str], False),
+        "Name": (str, False),
+        "RoleArn": (str, False),
+        "SecurityGroupIds": ([str], False),
+        "SubnetIds": ([str], False),
+        "Tags": (Tags, False),
+        "VPCConnectionId": (str, False),
+    }
+
+
 class Entity(AWSProperty):
     """
     `Entity <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-entity.html>`__
@@ -6729,6 +7408,20 @@ class DashboardError(AWSProperty):
     }
 
 
+class NetworkInterface(AWSProperty):
+    """
+    `NetworkInterface <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-vpcconnection-networkinterface.html>`__
+    """
+
+    props: PropsDictType = {
+        "AvailabilityZone": (str, False),
+        "ErrorMessage": (str, False),
+        "NetworkInterfaceId": (str, False),
+        "Status": (str, False),
+        "SubnetId": (str, False),
+    }
+
+
 class Sheet(AWSProperty):
     """
     `Sheet <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheet.html>`__
diff --git a/troposphere/ram.py b/troposphere/ram.py
index 7c946548..d1241a4c 100644
--- a/troposphere/ram.py
+++ b/troposphere/ram.py
@@ -10,6 +10,21 @@ from . import AWSObject, PropsDictType, Tags
 from .validators import boolean
 
 
+class Permission(AWSObject):
+    """
+    `Permission <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-permission.html>`__
+    """
+
+    resource_type = "AWS::RAM::Permission"
+
+    props: PropsDictType = {
+        "Name": (str, True),
+        "PolicyTemplate": (dict, True),
+        "ResourceType": (str, True),
+        "Tags": (Tags, False),
+    }
+
+
 class ResourceShare(AWSObject):
     """
     `ResourceShare <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-resourceshare.html>`__
diff --git a/troposphere/rds.py b/troposphere/rds.py
index 366d55d3..4887f8e9 100644
--- a/troposphere/rds.py
+++ b/troposphere/rds.py
@@ -26,6 +26,26 @@ from .validators.rds import (
 )
 
 
+class CustomDBEngineVersion(AWSObject):
+    """
+    `CustomDBEngineVersion <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html>`__
+    """
+
+    resource_type = "AWS::RDS::CustomDBEngineVersion"
+
+    props: PropsDictType = {
+        "DatabaseInstallationFilesS3BucketName": (str, True),
+        "DatabaseInstallationFilesS3Prefix": (str, False),
+        "Description": (str, False),
+        "Engine": (str, True),
+        "EngineVersion": (str, True),
+        "KMSKeyId": (str, False),
+        "Manifest": (str, False),
+        "Status": (str, False),
+        "Tags": (Tags, False),
+    }
+
+
 class DBClusterRole(AWSProperty):
     """
     `DBClusterRole <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-dbclusterrole.html>`__
@@ -262,6 +282,7 @@ class DBInstance(AWSObject):
         "PubliclyAccessible": (boolean, False),
         "ReplicaMode": (str, False),
         "RestoreTime": (str, False),
+        "SourceDBClusterIdentifier": (str, False),
         "SourceDBInstanceAutomatedBackupsArn": (str, False),
         "SourceDBInstanceIdentifier": (str, False),
         "SourceDbiResourceId": (str, False),
diff --git a/troposphere/refactorspaces.py b/troposphere/refactorspaces.py
index 4e2754bf..b14bb97f 100644
--- a/troposphere/refactorspaces.py
+++ b/troposphere/refactorspaces.py
@@ -70,6 +70,7 @@ class UriPathRouteInput(AWSProperty):
 
     props: PropsDictType = {
         "ActivationState": (str, True),
+        "AppendSourcePath": (boolean, False),
         "IncludeChildPaths": (boolean, False),
         "Methods": ([str], False),
         "SourcePath": (str, False),
diff --git a/troposphere/resiliencehub.py b/troposphere/resiliencehub.py
index a945952e..60ec7d7e 100644
--- a/troposphere/resiliencehub.py
+++ b/troposphere/resiliencehub.py
@@ -33,6 +33,7 @@ class ResourceMapping(AWSProperty):
     """
 
     props: PropsDictType = {
+        "EksSourceName": (str, False),
         "LogicalStackName": (str, False),
         "MappingType": (str, True),
         "PhysicalResourceId": (PhysicalResourceId, True),
diff --git a/troposphere/s3.py b/troposphere/s3.py
index d1855b54..902c7837 100644
--- a/troposphere/s3.py
+++ b/troposphere/s3.py
@@ -24,16 +24,6 @@ from .validators.s3 import (
 )
 
 
-class PolicyStatus(AWSProperty):
-    """
-    `PolicyStatus <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspointpolicy-policystatus.html>`__
-    """
-
-    props: PropsDictType = {
-        "IsPublic": (str, True),
-    }
-
-
 class PublicAccessBlockConfiguration(AWSProperty):
     """
     `PublicAccessBlockConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspoint-publicaccessblockconfiguration.html>`__
@@ -69,7 +59,6 @@ class AccessPoint(AWSObject):
         "BucketAccountId": (str, False),
         "Name": (str, False),
         "Policy": (policytypes, False),
-        "PolicyStatus": (PolicyStatus, False),
         "PublicAccessBlockConfiguration": (PublicAccessBlockConfiguration, False),
         "VpcConfiguration": (VpcConfiguration, False),
     }
@@ -938,6 +927,27 @@ class CloudWatchMetrics(AWSProperty):
     }
 
 
+class SSEKMS(AWSProperty):
+    """
+    `SSEKMS <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-ssekms.html>`__
+    """
+
+    props: PropsDictType = {
+        "KeyId": (str, True),
+    }
+
+
+class Encryption(AWSProperty):
+    """
+    `Encryption <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-encryption.html>`__
+    """
+
+    props: PropsDictType = {
+        "SSEKMS": (SSEKMS, False),
+        "SSES3": (dict, False),
+    }
+
+
 class S3BucketDestination(AWSProperty):
     """
     `S3BucketDestination <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-s3bucketdestination.html>`__
@@ -946,7 +956,7 @@ class S3BucketDestination(AWSProperty):
     props: PropsDictType = {
         "AccountId": (str, True),
         "Arn": (str, True),
-        "Encryption": (dict, False),
+        "Encryption": (Encryption, False),
         "Format": (str, True),
         "OutputSchemaVersion": (str, True),
         "Prefix": (str, False),
@@ -994,22 +1004,11 @@ class StorageLens(AWSObject):
     }
 
 
-class SSEKMS(AWSProperty):
-    """
-    `SSEKMS <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-ssekms.html>`__
-    """
-
-    props: PropsDictType = {
-        "KeyId": (str, True),
-    }
-
-
-class Encryption(AWSProperty):
+class PolicyStatus(AWSProperty):
     """
-    `Encryption <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-encryption.html>`__
+    `PolicyStatus <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspointpolicy-policystatus.html>`__
     """
 
     props: PropsDictType = {
-        "SSEKMS": (SSEKMS, False),
-        "SSES3": (dict, False),
+        "IsPublic": (str, True),
     }
diff --git a/troposphere/s3objectlambda.py b/troposphere/s3objectlambda.py
index d7209b6c..65dbf765 100644
--- a/troposphere/s3objectlambda.py
+++ b/troposphere/s3objectlambda.py
@@ -87,8 +87,8 @@ class Alias(AWSProperty):
     """
 
     props: PropsDictType = {
-        "Status": (str, False),
-        "Value": (str, False),
+        "Status": (str, True),
+        "Value": (str, True),
     }
 
 
diff --git a/troposphere/s3outposts.py b/troposphere/s3outposts.py
index 325a4b85..78e03b3d 100644
--- a/troposphere/s3outposts.py
+++ b/troposphere/s3outposts.py
@@ -132,6 +132,17 @@ class BucketPolicy(AWSObject):
     }
 
 
+class FailedReason(AWSProperty):
+    """
+    `FailedReason <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-endpoint-failedreason.html>`__
+    """
+
+    props: PropsDictType = {
+        "ErrorCode": (str, False),
+        "Message": (str, False),
+    }
+
+
 class Endpoint(AWSObject):
     """
     `Endpoint <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-endpoint.html>`__
@@ -142,6 +153,7 @@ class Endpoint(AWSObject):
     props: PropsDictType = {
         "AccessType": (str, False),
         "CustomerOwnedIpv4Pool": (str, False),
+        "FailedReason": (FailedReason, False),
         "OutpostId": (str, True),
         "SecurityGroupId": (str, True),
         "SubnetId": (str, True),
diff --git a/troposphere/sagemaker.py b/troposphere/sagemaker.py
index 4d988e82..727b9fc1 100644
--- a/troposphere/sagemaker.py
+++ b/troposphere/sagemaker.py
@@ -433,7 +433,7 @@ class DefaultSpaceSettings(AWSProperty):
     """
 
     props: PropsDictType = {
-        "ExecutionRole": (str, False),
+        "ExecutionRole": (str, True),
         "JupyterServerAppSettings": (JupyterServerAppSettings, False),
         "KernelGatewayAppSettings": (KernelGatewayAppSettings, False),
         "SecurityGroups": ([str], False),
@@ -580,6 +580,19 @@ class BlueGreenUpdatePolicy(AWSProperty):
     }
 
 
+class RollingUpdatePolicy(AWSProperty):
+    """
+    `RollingUpdatePolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-rollingupdatepolicy.html>`__
+    """
+
+    props: PropsDictType = {
+        "MaximumBatchSize": (CapacitySize, True),
+        "MaximumExecutionTimeoutInSeconds": (integer, False),
+        "RollbackMaximumBatchSize": (CapacitySize, False),
+        "WaitIntervalInSeconds": (integer, True),
+    }
+
+
 class DeploymentConfig(AWSProperty):
     """
     `DeploymentConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-deploymentconfig.html>`__
@@ -587,7 +600,8 @@ class DeploymentConfig(AWSProperty):
 
     props: PropsDictType = {
         "AutoRollbackConfiguration": (AutoRollbackConfig, False),
-        "BlueGreenUpdatePolicy": (BlueGreenUpdatePolicy, True),
+        "BlueGreenUpdatePolicy": (BlueGreenUpdatePolicy, False),
+        "RollingUpdatePolicy": (RollingUpdatePolicy, False),
     }
 
 
@@ -636,6 +650,7 @@ class AsyncInferenceNotificationConfig(AWSProperty):
 
     props: PropsDictType = {
         "ErrorTopic": (str, False),
+        "IncludeInferenceResponseIn": ([str], False),
         "SuccessTopic": (str, False),
     }
 
@@ -648,7 +663,8 @@ class AsyncInferenceOutputConfig(AWSProperty):
     props: PropsDictType = {
         "KmsKeyId": (str, False),
         "NotificationConfig": (AsyncInferenceNotificationConfig, False),
-        "S3OutputPath": (str, True),
+        "S3FailurePath": (str, False),
+        "S3OutputPath": (str, False),
     }
 
 
@@ -786,6 +802,7 @@ class ServerlessConfig(AWSProperty):
     props: PropsDictType = {
         "MaxConcurrency": (integer, True),
         "MemorySizeInMB": (integer, True),
+        "ProvisionedConcurrency": (integer, False),
     }
 
 
@@ -940,8 +957,17 @@ class ImageVersion(AWSObject):
     resource_type = "AWS::SageMaker::ImageVersion"
 
     props: PropsDictType = {
+        "Alias": (str, False),
+        "Aliases": ([str], False),
         "BaseImage": (str, True),
+        "Horovod": (boolean, False),
         "ImageName": (str, True),
+        "JobType": (str, False),
+        "MLFramework": (str, False),
+        "Processor": (str, False),
+        "ProgrammingLang": (str, False),
+        "ReleaseNotes": (str, False),
+        "VendorGuidance": (str, False),
     }
 
 
@@ -1320,6 +1346,91 @@ class ModelOverview(AWSProperty):
     }
 
 
+class ModelInput(AWSProperty):
+    """
+    `ModelInput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelinput.html>`__
+    """
+
+    props: PropsDictType = {
+        "DataInputConfig": (str, True),
+    }
+
+
+class ModelPackageContainerDefinition(AWSProperty):
+    """
+    `ModelPackageContainerDefinition <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html>`__
+    """
+
+    props: PropsDictType = {
+        "ContainerHostname": (str, False),
+        "Environment": (dict, False),
+        "Framework": (str, False),
+        "FrameworkVersion": (str, False),
+        "Image": (str, True),
+        "ImageDigest": (str, False),
+        "ModelDataUrl": (str, False),
+        "ModelInput": (ModelInput, False),
+        "NearestModelName": (str, False),
+    }
+
+
+class InferenceSpecification(AWSProperty):
+    """
+    `InferenceSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-inferencespecification.html>`__
+    """
+
+    props: PropsDictType = {
+        "Containers": ([ModelPackageContainerDefinition], True),
+        "SupportedContentTypes": ([str], True),
+        "SupportedRealtimeInferenceInstanceTypes": ([str], False),
+        "SupportedResponseMIMETypes": ([str], True),
+        "SupportedTransformInstanceTypes": ([str], False),
+    }
+
+
+class ModelPackageCreator(AWSProperty):
+    """
+    `ModelPackageCreator <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagecreator.html>`__
+    """
+
+    props: PropsDictType = {
+        "UserProfileName": (str, False),
+    }
+
+
+class SourceAlgorithm(AWSProperty):
+    """
+    `SourceAlgorithm <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-sourcealgorithm.html>`__
+    """
+
+    props: PropsDictType = {
+        "AlgorithmName": (str, True),
+        "ModelDataUrl": (str, False),
+    }
+
+
+class ModelPackageDetails(AWSProperty):
+    """
+    `ModelPackageDetails <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html>`__
+    """
+
+    props: PropsDictType = {
+        "ApprovalDescription": (str, False),
+        "CreatedBy": (ModelPackageCreator, False),
+        "Domain": (str, False),
+        "InferenceSpecification": (InferenceSpecification, False),
+        "ModelApprovalStatus": (str, False),
+        "ModelPackageArn": (str, False),
+        "ModelPackageDescription": (str, False),
+        "ModelPackageGroupName": (str, False),
+        "ModelPackageName": (str, False),
+        "ModelPackageStatus": (str, False),
+        "ModelPackageVersion": (double, False),
+        "SourceAlgorithms": ([SourceAlgorithm], False),
+        "Task": (str, False),
+    }
+
+
 class Function(AWSProperty):
     """
     `Function <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-function.html>`__
@@ -1415,6 +1526,7 @@ class Content(AWSProperty):
         "EvaluationDetails": ([EvaluationDetail], False),
         "IntendedUses": (IntendedUses, False),
         "ModelOverview": (ModelOverview, False),
+        "ModelPackageDetails": (ModelPackageDetails, False),
         "TrainingDetails": (TrainingDetails, False),
     }
 
@@ -1431,7 +1543,7 @@ class SecurityConfig(AWSProperty):
 
 class UserContext(AWSProperty):
     """
-    `UserContext <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-usercontext.html>`__
+    `UserContext <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-usercontext.html>`__
     """
 
     props: PropsDictType = {
@@ -1534,35 +1646,6 @@ class ModelExplainabilityJobDefinition(AWSObject):
     }
 
 
-class ModelInput(AWSProperty):
-    """
-    `ModelInput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelinput.html>`__
-    """
-
-    props: PropsDictType = {
-        "DataInputConfig": (str, True),
-    }
-
-
-class ModelPackageContainerDefinition(AWSProperty):
-    """
-    `ModelPackageContainerDefinition <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html>`__
-    """
-
-    props: PropsDictType = {
-        "ContainerHostname": (str, False),
-        "Environment": (dict, False),
-        "Framework": (str, False),
-        "FrameworkVersion": (str, False),
-        "Image": (str, True),
-        "ImageDigest": (str, False),
-        "ModelDataUrl": (str, False),
-        "ModelInput": (ModelInput, False),
-        "NearestModelName": (str, False),
-        "ProductId": (str, False),
-    }
-
-
 class AdditionalInferenceSpecificationDefinition(AWSProperty):
     """
     `AdditionalInferenceSpecificationDefinition <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-additionalinferencespecificationdefinition.html>`__
@@ -1661,20 +1744,6 @@ class DriftCheckBaselines(AWSProperty):
     }
 
 
-class InferenceSpecification(AWSProperty):
-    """
-    `InferenceSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-inferencespecification.html>`__
-    """
-
-    props: PropsDictType = {
-        "Containers": ([ModelPackageContainerDefinition], True),
-        "SupportedContentTypes": ([str], True),
-        "SupportedRealtimeInferenceInstanceTypes": ([str], False),
-        "SupportedResponseMIMETypes": ([str], True),
-        "SupportedTransformInstanceTypes": ([str], False),
-    }
-
-
 class MetadataProperties(AWSProperty):
     """
     `MetadataProperties <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-metadataproperties.html>`__
@@ -1763,19 +1832,7 @@ class ModelPackageStatusDetails(AWSProperty):
     """
 
     props: PropsDictType = {
-        "ImageScanStatuses": ([ModelPackageStatusItem], False),
-        "ValidationStatuses": ([ModelPackageStatusItem], True),
-    }
-
-
-class SourceAlgorithm(AWSProperty):
-    """
-    `SourceAlgorithm <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-sourcealgorithm.html>`__
-    """
-
-    props: PropsDictType = {
-        "AlgorithmName": (str, True),
-        "ModelDataUrl": (str, False),
+        "ValidationStatuses": ([ModelPackageStatusItem], False),
     }
 
 
@@ -1894,10 +1951,6 @@ class ModelPackage(AWSObject):
     resource_type = "AWS::SageMaker::ModelPackage"
 
     props: PropsDictType = {
-        "AdditionalInferenceSpecificationDefinition": (
-            AdditionalInferenceSpecificationDefinition,
-            False,
-        ),
         "AdditionalInferenceSpecifications": (
             [AdditionalInferenceSpecificationDefinition],
             False,
@@ -1912,7 +1965,6 @@ class ModelPackage(AWSObject):
         "CustomerMetadataProperties": (dict, False),
         "Domain": (str, False),
         "DriftCheckBaselines": (DriftCheckBaselines, False),
-        "Environment": (dict, False),
         "InferenceSpecification": (InferenceSpecification, False),
         "LastModifiedTime": (str, False),
         "MetadataProperties": (MetadataProperties, False),
@@ -1922,7 +1974,6 @@ class ModelPackage(AWSObject):
         "ModelPackageGroupName": (str, False),
         "ModelPackageName": (str, False),
         "ModelPackageStatusDetails": (ModelPackageStatusDetails, False),
-        "ModelPackageStatusItem": (ModelPackageStatusItem, False),
         "ModelPackageVersion": (integer, False),
         "SamplePayloadUrl": (str, False),
         "SourceAlgorithmSpecification": (SourceAlgorithmSpecification, False),
@@ -2254,6 +2305,17 @@ class Pipeline(AWSObject):
     }
 
 
+class ServiceCatalogProvisionedProductDetails(AWSProperty):
+    """
+    `ServiceCatalogProvisionedProductDetails <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-servicecatalogprovisionedproductdetails.html>`__
+    """
+
+    props: PropsDictType = {
+        "ProvisionedProductId": (str, False),
+        "ProvisionedProductStatusMessage": (str, False),
+    }
+
+
 class ProvisioningParameter(AWSProperty):
     """
     `ProvisioningParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-provisioningparameter.html>`__
@@ -2288,6 +2350,10 @@ class Project(AWSObject):
     props: PropsDictType = {
         "ProjectDescription": (str, False),
         "ProjectName": (str, True),
+        "ServiceCatalogProvisionedProductDetails": (
+            ServiceCatalogProvisionedProductDetails,
+            False,
+        ),
         "ServiceCatalogProvisioningDetails": (ServiceCatalogProvisioningDetails, True),
         "Tags": (Tags, False),
     }
@@ -2396,6 +2462,18 @@ class Workteam(AWSObject):
     }
 
 
+class Container(AWSProperty):
+    """
+    `Container <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-container.html>`__
+    """
+
+    props: PropsDictType = {
+        "Image": (str, True),
+        "ModelDataUrl": (str, False),
+        "NearestModelName": (str, False),
+    }
+
+
 class EndpointMetadata(AWSProperty):
     """
     `EndpointMetadata <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-endpointmetadata.html>`__
@@ -2417,14 +2495,3 @@ class RSessionAppSettings(AWSProperty):
         "CustomImages": ([CustomImage], False),
         "DefaultResourceSpec": (ResourceSpec, False),
     }
-
-
-class ServiceCatalogProvisionedProductDetails(AWSProperty):
-    """
-    `ServiceCatalogProvisionedProductDetails <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-servicecatalogprovisionedproductdetails.html>`__
-    """
-
-    props: PropsDictType = {
-        "ProvisionedProductId": (str, False),
-        "ProvisionedProductStatusMessage": (str, False),
-    }
diff --git a/troposphere/securityhub.py b/troposphere/securityhub.py
index bfbc4c90..a72be5eb 100644
--- a/troposphere/securityhub.py
+++ b/troposphere/securityhub.py
@@ -6,7 +6,202 @@
 # *** Do not modify - this file is autogenerated ***
 
 
-from . import AWSObject, PropsDictType
+from . import AWSObject, AWSProperty, PropsDictType
+from .validators import boolean, double, integer
+
+
+class NoteUpdate(AWSProperty):
+    """
+    `NoteUpdate <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-noteupdate.html>`__
+    """
+
+    props: PropsDictType = {
+        "Text": (str, True),
+        "UpdatedBy": (dict, True),
+    }
+
+
+class RelatedFinding(AWSProperty):
+    """
+    `RelatedFinding <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-relatedfinding.html>`__
+    """
+
+    props: PropsDictType = {
+        "Id": (dict, True),
+        "ProductArn": (str, True),
+    }
+
+
+class SeverityUpdate(AWSProperty):
+    """
+    `SeverityUpdate <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-severityupdate.html>`__
+    """
+
+    props: PropsDictType = {
+        "Label": (str, False),
+        "Normalized": (integer, False),
+        "Product": (double, False),
+    }
+
+
+class WorkflowUpdate(AWSProperty):
+    """
+    `WorkflowUpdate <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-workflowupdate.html>`__
+    """
+
+    props: PropsDictType = {
+        "Status": (str, True),
+    }
+
+
+class AutomationRulesFindingFieldsUpdate(AWSProperty):
+    """
+    `AutomationRulesFindingFieldsUpdate <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html>`__
+    """
+
+    props: PropsDictType = {
+        "Confidence": (integer, False),
+        "Criticality": (integer, False),
+        "Note": (NoteUpdate, False),
+        "RelatedFindings": ([RelatedFinding], False),
+        "Severity": (SeverityUpdate, False),
+        "Types": ([str], False),
+        "UserDefinedFields": (dict, False),
+        "VerificationState": (str, False),
+        "Workflow": (WorkflowUpdate, False),
+    }
+
+
+class AutomationRulesAction(AWSProperty):
+    """
+    `AutomationRulesAction <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesaction.html>`__
+    """
+
+    props: PropsDictType = {
+        "FindingFieldsUpdate": (AutomationRulesFindingFieldsUpdate, True),
+        "Type": (str, True),
+    }
+
+
+class DateRange(AWSProperty):
+    """
+    `DateRange <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-daterange.html>`__
+    """
+
+    props: PropsDictType = {
+        "Unit": (str, True),
+        "Value": (double, True),
+    }
+
+
+class DateFilter(AWSProperty):
+    """
+    `DateFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-datefilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "DateRange": (DateRange, False),
+        "End": (str, False),
+        "Start": (str, False),
+    }
+
+
+class MapFilter(AWSProperty):
+    """
+    `MapFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-mapfilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "Comparison": (str, True),
+        "Key": (str, True),
+        "Value": (str, True),
+    }
+
+
+class NumberFilter(AWSProperty):
+    """
+    `NumberFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-numberfilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "Eq": (double, False),
+        "Gte": (double, False),
+        "Lte": (double, False),
+    }
+
+
+class StringFilter(AWSProperty):
+    """
+    `StringFilter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-stringfilter.html>`__
+    """
+
+    props: PropsDictType = {
+        "Comparison": (str, True),
+        "Value": (str, True),
+    }
+
+
+class AutomationRulesFindingFilters(AWSProperty):
+    """
+    `AutomationRulesFindingFilters <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html>`__
+    """
+
+    props: PropsDictType = {
+        "AwsAccountId": ([StringFilter], False),
+        "CompanyName": ([StringFilter], False),
+        "ComplianceAssociatedStandardsId": ([StringFilter], False),
+        "ComplianceSecurityControlId": ([StringFilter], False),
+        "ComplianceStatus": ([StringFilter], False),
+        "Confidence": ([NumberFilter], False),
+        "CreatedAt": ([DateFilter], False),
+        "Criticality": ([NumberFilter], False),
+        "Description": ([StringFilter], False),
+        "FirstObservedAt": ([DateFilter], False),
+        "GeneratorId": ([StringFilter], False),
+        "Id": ([StringFilter], False),
+        "LastObservedAt": ([DateFilter], False),
+        "NoteText": ([StringFilter], False),
+        "NoteUpdatedAt": ([DateFilter], False),
+        "NoteUpdatedBy": ([StringFilter], False),
+        "ProductArn": ([StringFilter], False),
+        "ProductName": ([StringFilter], False),
+        "RecordState": ([StringFilter], False),
+        "RelatedFindingsId": ([StringFilter], False),
+        "RelatedFindingsProductArn": ([StringFilter], False),
+        "ResourceDetailsOther": ([MapFilter], False),
+        "ResourceId": ([StringFilter], False),
+        "ResourcePartition": ([StringFilter], False),
+        "ResourceRegion": ([StringFilter], False),
+        "ResourceTags": ([MapFilter], False),
+        "ResourceType": ([StringFilter], False),
+        "SeverityLabel": ([StringFilter], False),
+        "SourceUrl": ([StringFilter], False),
+        "Title": ([StringFilter], False),
+        "Type": ([StringFilter], False),
+        "UpdatedAt": ([DateFilter], False),
+        "UserDefinedFields": ([MapFilter], False),
+        "VerificationState": ([StringFilter], False),
+        "WorkflowStatus": ([StringFilter], False),
+    }
+
+
+class AutomationRule(AWSObject):
+    """
+    `AutomationRule <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-automationrule.html>`__
+    """
+
+    resource_type = "AWS::SecurityHub::AutomationRule"
+
+    props: PropsDictType = {
+        "Actions": ([AutomationRulesAction], False),
+        "Criteria": (AutomationRulesFindingFilters, False),
+        "Description": (str, False),
+        "IsTerminal": (boolean, False),
+        "RuleName": (str, False),
+        "RuleOrder": (integer, False),
+        "RuleStatus": (str, False),
+        "Tags": (dict, False),
+    }
 
 
 class Hub(AWSObject):
@@ -17,5 +212,32 @@ class Hub(AWSObject):
     resource_type = "AWS::SecurityHub::Hub"
 
     props: PropsDictType = {
+        "AutoEnableControls": (boolean, False),
+        "ControlFindingGenerator": (str, False),
+        "EnableDefaultStandards": (boolean, False),
         "Tags": (dict, False),
     }
+
+
+class StandardsControl(AWSProperty):
+    """
+    `StandardsControl <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-standard-standardscontrol.html>`__
+    """
+
+    props: PropsDictType = {
+        "Reason": (str, False),
+        "StandardsControlArn": (str, True),
+    }
+
+
+class Standard(AWSObject):
+    """
+    `Standard <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-standard.html>`__
+    """
+
+    resource_type = "AWS::SecurityHub::Standard"
+
+    props: PropsDictType = {
+        "DisabledStandardsControls": ([StandardsControl], False),
+        "StandardsArn": (str, True),
+    }
diff --git a/troposphere/serverless.py b/troposphere/serverless.py
index e45a3cea..6ad78a68 100644
--- a/troposphere/serverless.py
+++ b/troposphere/serverless.py
@@ -15,8 +15,11 @@ from .awslambda import (
     Environment,
     EphemeralStorage,
     FileSystemConfig,
+    FilterCriteria,
     ImageConfig,
     ProvisionedConcurrencyConfiguration,
+    RuntimeManagementConfig,
+    SourceAccessConfiguration,
     VPCConfig,
     validate_memory_size,
     validate_package_type,
@@ -26,6 +29,7 @@ from .s3 import Filter
 from .stepfunctions import LoggingConfiguration, TracingConfiguration
 from .validators import (
     boolean,
+    double,
     exactly_one,
     integer,
     integer_range,
@@ -186,6 +190,7 @@ class Function(AWSObject):
         "ReservedConcurrentExecutions": (positive_integer, False),
         "Role": (str, False),
         "Runtime": (str, False),
+        "RuntimeManagementConfig": (RuntimeManagementConfig, False),
         "Tags": (dict, False),
         "Timeout": (positive_integer, False),
         "Tracing": (str, False),
@@ -583,6 +588,16 @@ class DynamoDBEvent(AWSObject):
     }
 
 
+class ApiFunctionAuth(AWSProperty):
+    props: PropsDictType = {
+        "ApiKeyRequired": (bool, False),
+        "AuthorizationScopes": (list, False),
+        "Authorizer": (str, False),
+        "InvokeRole": (str, False),
+        "ResourcePolicy": (ResourcePolicyStatement, False),
+    }
+
+
 class RequestModel(AWSProperty):
     props: PropsDictType = {
         "Model": (str, True),
@@ -592,11 +607,28 @@ class RequestModel(AWSProperty):
     }
 
 
+def api_function_auth_validator(auth):
+    if not isinstance(auth, (Auth, ApiFunctionAuth)):
+        raise TypeError(
+            f"Value {auth} of type {type(auth)}, expected {Auth} or {ApiFunctionAuth}"
+        )
+
+    if isinstance(auth, Auth):
+        from warnings import warn
+
+        warn(
+            f"The use of {Auth} in ApiEvent is deprecated. Please use {ApiFunctionAuth} instead",
+            DeprecationWarning,
+        )
+
+    return auth
+
+
 class ApiEvent(AWSObject):
     resource_type = "Api"
 
     props: PropsDictType = {
-        "Auth": (Auth, False),
+        "Auth": (api_function_auth_validator, False),
         "Path": (str, True),
         "Method": (str, True),
         "RequestModel": (RequestModel, False),
@@ -617,6 +649,51 @@ class ScheduleEvent(AWSObject):
     }
 
 
+class DeadLetterConfig(AWSProperty):
+    props: PropsDictType = {
+        "Arn": (str, False),
+        "QueueLogicalId": (str, False),
+        "Type": (str, False),
+    }
+
+
+class FlexibleTimeWindow(AWSProperty):
+    props: PropsDictType = {
+        "MaximumWindowInMinutes": (double, False),
+        "Mode": (str, True),
+    }
+
+
+class RetryPolicy(AWSProperty):
+    props: PropsDictType = {
+        "MaximumEventAgeInSeconds": (double, False),
+        "MaximumRetryAttempts": (double, False),
+    }
+
+
+class ScheduleV2Event(AWSObject):
+    resource_type = "ScheduleV2"
+
+    props: PropsDictType = {
+        "DeadLetterConfig": (DeadLetterConfig, False),
+        "Description": (str, False),
+        "EndDate": (str, False),
+        "FlexibleTimeWindow": (FlexibleTimeWindow, False),
+        "GroupName": (str, False),
+        "Input": (str, False),
+        "KmsKeyArn": (str, False),
+        "Name": (str, False),
+        "OmitName": (bool, False),
+        "PermissionsBoundary": (str, False),
+        "RetryPolicy": (RetryPolicy, False),
+        "RoleArn": (str, False),
+        "ScheduleExpression": (str, True),
+        "ScheduleExpressionTimezone": (str, False),
+        "StartDate": (str, False),
+        "State": (str, False),
+    }
+
+
 class CloudWatchEvent(AWSObject):
     resource_type = "CloudWatchEvent"
 
@@ -651,6 +728,90 @@ class SQSEvent(AWSObject):
             raise ValueError("BatchSize must be between 1 and 10")
 
 
+class MSKEvent(AWSObject):
+    resource_type = "MSK"
+
+    props: PropsDictType = {
+        "ConsumerGroupId": (str, False),
+        "FilterCriteria": (FilterCriteria, False),
+        "MaximumBatchingWindowInSeconds": (integer, False),
+        "SourceAccessConfigurations": ([SourceAccessConfiguration], False),
+        "StartingPosition": (str, True),
+        "StartingPositionTimestamp": (double, False),
+        "Stream": (str, True),
+        "Topics": ([str], True),
+    }
+
+
+class SelfManagedKafkaEvent(AWSObject):
+    resource_type = "SelfManagedKafka"
+
+    props: PropsDictType = {
+        "BatchSize": (integer, False),
+        "ConsumerGroupId": (str, False),
+        "Enabled": (bool, False),
+        "FilterCriteria": (FilterCriteria, False),
+        "KafkaBootstrapServers": ([str], False),
+        "SourceAccessConfigurations": ([SourceAccessConfiguration], True),
+        "Topics": ([str], True),
+    }
+
+
+class MQEvent(AWSObject):
+    resource_type = "MQ"
+
+    props: PropsDictType = {
+        "BatchSize": (integer, False),
+        "Broker": (str, True),
+        "DynamicPolicyName": (bool, False),
+        "Enabled": (bool, False),
+        "FilterCriteria": (FilterCriteria, False),
+        "MaximumBatchingWindowInSeconds": (integer, False),
+        "Queues": ([str], True),
+        "SecretsManagerKmsKeyId": (str, False),
+        "SourceAccessConfigurations": ([str], True),
+    }
+
+
+class DocumentDBEvent(AWSObject):
+    resource_type = "DocumentDB"
+
+    props: PropsDictType = {
+        "BatchSize": (integer, False),
+        "Cluster": (str, True),
+        "CollectionName": (str, False),
+        "DatabaseName": (str, True),
+        "Enabled": (bool, False),
+        "FilterCriteria": (FilterCriteria, False),
+        "FullDocument": (str, False),
+        "MaximumBatchingWindowInSeconds": (integer, False),
+        "SecretsManagerKmsKeyId": (str, False),
+        "SourceAccessConfigurations": ([str], True),
+        "StartingPosition": (str, True),
+        "StartingPositionTimestamp": (double, False),
+    }
+
+
+class Target(AWSProperty):
+    props: PropsDictType = {"Id": (str, True)}
+
+
+class EventBridgeRuleEvent(AWSObject):
+    resource_type = "EventBridgeRule"
+
+    props: PropsDictType = {
+        "DeadLetterConfig": (DeadLetterConfig, False),
+        "EventBusName": (str, False),
+        "Input": (str, False),
+        "InputPath": (str, False),
+        "Name": (str, False),
+        "Pattern": (dict, True),
+        "RetryPolicy": (RetryPolicy, False),
+        "State": (str, False),
+        "Target": (Target, False),
+    }
+
+
 class ApplicationLocation(AWSProperty):
     props: PropsDictType = {
         "ApplicationId": (str, True),
diff --git a/troposphere/sns.py b/troposphere/sns.py
index 92e2991b..8bc43245 100644
--- a/troposphere/sns.py
+++ b/troposphere/sns.py
@@ -64,9 +64,22 @@ class Topic(AWSObject):
     }
 
 
+class TopicInlinePolicy(AWSObject):
+    """
+    `TopicInlinePolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topicinlinepolicy.html>`__
+    """
+
+    resource_type = "AWS::SNS::TopicInlinePolicy"
+
+    props: PropsDictType = {
+        "PolicyDocument": (dict, True),
+        "TopicArn": (str, True),
+    }
+
+
 class TopicPolicy(AWSObject):
     """
-    `TopicPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-policy.html>`__
+    `TopicPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topicpolicy.html>`__
     """
 
     resource_type = "AWS::SNS::TopicPolicy"
diff --git a/troposphere/sqs.py b/troposphere/sqs.py
index b6b6e0c6..20be020a 100644
--- a/troposphere/sqs.py
+++ b/troposphere/sqs.py
@@ -48,9 +48,22 @@ class Queue(AWSObject):
         validate_queue(self)
 
 
+class QueueInlinePolicy(AWSObject):
+    """
+    `QueueInlinePolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queueinlinepolicy.html>`__
+    """
+
+    resource_type = "AWS::SQS::QueueInlinePolicy"
+
+    props: PropsDictType = {
+        "PolicyDocument": (dict, True),
+        "Queue": (str, True),
+    }
+
+
 class QueuePolicy(AWSObject):
     """
-    `QueuePolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-policy.html>`__
+    `QueuePolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queuepolicy.html>`__
     """
 
     resource_type = "AWS::SQS::QueuePolicy"
diff --git a/troposphere/stepfunctions.py b/troposphere/stepfunctions.py
index fff9d945..43cdd538 100644
--- a/troposphere/stepfunctions.py
+++ b/troposphere/stepfunctions.py
@@ -7,7 +7,7 @@
 
 
 from . import AWSObject, AWSProperty, PropsDictType, Tags
-from .validators import boolean
+from .validators import boolean, integer
 
 
 class Activity(AWSObject):
@@ -96,3 +96,57 @@ class StateMachine(AWSObject):
         "Tags": (Tags, False),
         "TracingConfiguration": (TracingConfiguration, False),
     }
+
+
+class DeploymentPreference(AWSProperty):
+    """
+    `DeploymentPreference <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html>`__
+    """
+
+    props: PropsDictType = {
+        "Alarms": ([str], False),
+        "Interval": (integer, False),
+        "Percentage": (integer, False),
+        "StateMachineVersionArn": (str, True),
+        "Type": (str, True),
+    }
+
+
+class RoutingConfigurationVersion(AWSProperty):
+    """
+    `RoutingConfigurationVersion <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-routingconfigurationversion.html>`__
+    """
+
+    props: PropsDictType = {
+        "StateMachineVersionArn": (str, True),
+        "Weight": (integer, True),
+    }
+
+
+class StateMachineAlias(AWSObject):
+    """
+    `StateMachineAlias <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachinealias.html>`__
+    """
+
+    resource_type = "AWS::StepFunctions::StateMachineAlias"
+
+    props: PropsDictType = {
+        "DeploymentPreference": (DeploymentPreference, False),
+        "Description": (str, False),
+        "Name": (str, False),
+        "RoutingConfiguration": ([RoutingConfigurationVersion], False),
+    }
+
+
+class StateMachineVersion(AWSObject):
+    """
+    `StateMachineVersion <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachineversion.html>`__
+    """
+
+    resource_type = "AWS::StepFunctions::StateMachineVersion"
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "StateMachineArn": (str, True),
+        "StateMachineRevisionId": (str, False),
+    }
diff --git a/troposphere/synthetics.py b/troposphere/synthetics.py
index 2c5f65a6..74708204 100644
--- a/troposphere/synthetics.py
+++ b/troposphere/synthetics.py
@@ -43,6 +43,7 @@ class Code(AWSProperty):
         "S3Key": (str, False),
         "S3ObjectVersion": (str, False),
         "Script": (str, False),
+        "SourceLocationArn": (str, False),
     }
 
 
@@ -115,14 +116,13 @@ class Canary(AWSObject):
         "ArtifactConfig": (ArtifactConfig, False),
         "ArtifactS3Location": (str, True),
         "Code": (Code, True),
-        "DeleteLambdaResourcesOnCanaryDeletion": (boolean, False),
         "ExecutionRoleArn": (str, True),
         "FailureRetentionPeriod": (integer, False),
         "Name": (str, True),
         "RunConfig": (RunConfig, False),
         "RuntimeVersion": (canary_runtime_version, True),
         "Schedule": (Schedule, True),
-        "StartCanaryAfterCreation": (boolean, True),
+        "StartCanaryAfterCreation": (boolean, False),
         "SuccessRetentionPeriod": (integer, False),
         "Tags": (Tags, False),
         "VPCConfig": (VPCConfig, False),
diff --git a/troposphere/timestream.py b/troposphere/timestream.py
index 145d3976..dd7b7f00 100644
--- a/troposphere/timestream.py
+++ b/troposphere/timestream.py
@@ -204,6 +204,28 @@ class RetentionProperties(AWSProperty):
     }
 
 
+class PartitionKey(AWSProperty):
+    """
+    `PartitionKey <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-partitionkey.html>`__
+    """
+
+    props: PropsDictType = {
+        "EnforcementInRecord": (str, False),
+        "Name": (str, False),
+        "Type": (str, True),
+    }
+
+
+class Schema(AWSProperty):
+    """
+    `Schema <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-schema.html>`__
+    """
+
+    props: PropsDictType = {
+        "CompositePartitionKey": ([PartitionKey], False),
+    }
+
+
 class Table(AWSObject):
     """
     `Table <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-table.html>`__
@@ -215,6 +237,7 @@ class Table(AWSObject):
         "DatabaseName": (str, True),
         "MagneticStoreWriteProperties": (MagneticStoreWriteProperties, False),
         "RetentionProperties": (RetentionProperties, False),
+        "Schema": (Schema, False),
         "TableName": (str, False),
         "Tags": (Tags, False),
     }
diff --git a/troposphere/transfer.py b/troposphere/transfer.py
index 6f90dacc..0ddccef5 100644
--- a/troposphere/transfer.py
+++ b/troposphere/transfer.py
@@ -55,6 +55,7 @@ class As2Config(AWSProperty):
     """
 
     props: PropsDictType = {
+        "BasicAuthSecretId": (str, False),
         "Compression": (str, False),
         "EncryptionAlgorithm": (str, False),
         "LocalProfileId": (str, False),
@@ -66,6 +67,17 @@ class As2Config(AWSProperty):
     }
 
 
+class SftpConfig(AWSProperty):
+    """
+    `SftpConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-connector-sftpconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "TrustedHostKeys": ([str], False),
+        "UserSecretId": (str, False),
+    }
+
+
 class Connector(AWSObject):
     """
     `Connector <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-connector.html>`__
@@ -75,8 +87,9 @@ class Connector(AWSObject):
 
     props: PropsDictType = {
         "AccessRole": (str, True),
-        "As2Config": (As2Config, True),
+        "As2Config": (As2Config, False),
         "LoggingRole": (str, False),
+        "SftpConfig": (SftpConfig, False),
         "Tags": (Tags, False),
         "Url": (str, True),
     }
@@ -120,6 +133,7 @@ class IdentityProviderDetails(AWSProperty):
         "DirectoryId": (str, False),
         "Function": (str, False),
         "InvocationRole": (str, False),
+        "SftpAuthenticationMethods": (str, False),
         "Url": (str, False),
     }
 
@@ -179,6 +193,7 @@ class Server(AWSObject):
         "ProtocolDetails": (ProtocolDetails, False),
         "Protocols": ([str], False),
         "SecurityPolicyName": (str, False),
+        "StructuredLogDestinations": ([str], False),
         "Tags": (Tags, False),
         "WorkflowDetails": (WorkflowDetails, False),
     }
diff --git a/troposphere/validators/batch.py b/troposphere/validators/batch.py
index 887c0655..713d7d40 100644
--- a/troposphere/validators/batch.py
+++ b/troposphere/validators/batch.py
@@ -25,6 +25,7 @@ def validate_allocation_strategy(allocation_strategy):
         "BEST_FIT",
         "BEST_FIT_PROGRESSIVE",
         "SPOT_CAPACITY_OPTIMIZED",
+        "SPOT_PRICE_CAPACITY_OPTIMIZED",
     ]
 
     if allocation_strategy not in valid_strategies:
diff --git a/troposphere/validators/cloudfront.py b/troposphere/validators/cloudfront.py
index 7dc98e19..8b2f33d3 100644
--- a/troposphere/validators/cloudfront.py
+++ b/troposphere/validators/cloudfront.py
@@ -116,7 +116,7 @@ def cloudfront_origin_request_cookie_behavior(cookie_behavior):
     """
     Property: OriginRequestCookiesConfig.CookieBehavior
     """
-    valid_values = ["none", "whitelist", "all"]
+    valid_values = ["none", "whitelist", "all", "allExcept"]
     if cookie_behavior not in valid_values:
         raise ValueError(
             'CookieBehavior must be one of: "%s"' % (", ".join(valid_values))
@@ -128,7 +128,13 @@ def cloudfront_origin_request_header_behavior(header_behavior):
     """
     Property: OriginRequestHeadersConfig.HeaderBehavior
     """
-    valid_values = ["none", "whitelist", "allViewer", "allViewerAndWhitelistCloudFront"]
+    valid_values = [
+        "none",
+        "whitelist",
+        "allViewer",
+        "allViewerAndWhitelistCloudFront",
+        "allExcept",
+    ]
     if header_behavior not in valid_values:
         raise ValueError(
             'HeaderBehavior must be one of: "%s"' % (", ".join(valid_values))
@@ -140,7 +146,7 @@ def cloudfront_origin_request_query_string_behavior(query_string_behavior):
     """
     Property: OriginRequestQueryStringsConfig.QueryStringBehavior
     """
-    valid_values = ["none", "whitelist", "all"]
+    valid_values = ["none", "whitelist", "all", "allExcept"]
     if query_string_behavior not in valid_values:
         raise ValueError(
             'QueryStringBehavior must be one of: "%s"' % (", ".join(valid_values))
diff --git a/troposphere/validators/ec2.py b/troposphere/validators/ec2.py
index b840471e..cbbfa67d 100644
--- a/troposphere/validators/ec2.py
+++ b/troposphere/validators/ec2.py
@@ -3,6 +3,7 @@
 #
 # See LICENSE file for full license.
 
+import re
 
 from .. import AWSProperty
 from ..compat import validate_policytype
@@ -196,7 +197,7 @@ def vpn_pre_shared_key(key):
     """
     Property: VpnTunnelOptionsSpecification.PreSharedKey
     """
-    pre_shared_key_match_re = compile(r"^(?!0)([A-Za-z0-9]|\_|\.){8,64}$")
+    pre_shared_key_match_re = re.compile(r"^(?!0)([A-Za-z0-9]|\_|\.){8,64}$")
     if not pre_shared_key_match_re.match(key):
         raise ValueError(
             "%s is not a valid key."
@@ -220,7 +221,7 @@ def vpn_tunnel_inside_cidr(cidr):
         "169.254.5.0/30",
         "169.254.169.252/30",
     ]
-    cidr_match_re = compile(
+    cidr_match_re = re.compile(
         r"^169\.254\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)"
         r"\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\/30$"
     )
@@ -342,3 +343,38 @@ def validate_vpn_connection(self):
         "TransitGatewayId",
     ]
     exactly_one(self.__class__.__name__, self.properties, conds)
+
+
+def validate_placement_strategy(strategy):
+    """
+    Validate PlacementGroup Strategy
+    Property: PlacementGroup.Strategy
+    """
+
+    VALID_PLACEMENT_STRATEGIES = ["cluster", "partition", "spread"]
+
+    if strategy not in VALID_PLACEMENT_STRATEGIES:
+        raise ValueError(
+            "PlacementGroup Strategy must be one of: %s"
+            % ", ".join(VALID_PLACEMENT_STRATEGIES)
+        )
+    return strategy
+
+
+def validate_placement_spread_level(spread_level):
+    """
+    Validate PlacementGroup SpreadLevel
+    Property: PlacementGroup.SpreadLevel
+    """
+
+    VALID_PLACEMENT_SPREAD_LEVEL = [
+        "host",
+        "rack",
+    ]
+
+    if spread_level not in VALID_PLACEMENT_SPREAD_LEVEL:
+        raise ValueError(
+            "PlacementGroup SpreadLevel must be one of: %s"
+            % ", ".join(VALID_PLACEMENT_SPREAD_LEVEL)
+        )
+    return spread_level
diff --git a/troposphere/validators/efs.py b/troposphere/validators/efs.py
index 9c3788a4..101f13f7 100644
--- a/troposphere/validators/efs.py
+++ b/troposphere/validators/efs.py
@@ -6,6 +6,7 @@
 from . import one_of
 
 Bursting = "bursting"
+Elastic = "elastic"
 Provisioned = "provisioned"
 
 
@@ -13,7 +14,7 @@ def throughput_mode_validator(mode):
     """
     Property: FileSystem.ThroughputMode
     """
-    valid_modes = [Bursting, Provisioned]
+    valid_modes = [Bursting, Elastic, Provisioned]
     if mode not in valid_modes:
         raise ValueError(
             'ThroughputMode must be one of: "%s"' % (", ".join(valid_modes))
diff --git a/troposphere/validators/iottwinmaker.py b/troposphere/validators/iottwinmaker.py
index 381eaa9c..4de1a40a 100644
--- a/troposphere/validators/iottwinmaker.py
+++ b/troposphere/validators/iottwinmaker.py
@@ -12,11 +12,11 @@ def validate_listvalue(values):
     from ..iottwinmaker import DataValue
 
     if not isinstance(values, list):
-        raise TypeError("ListValue must be a list")
+        raise TypeError("ListValue must be a list", list)
 
     for v in values:
         if not isinstance(v, (DataValue, AWSHelperFn)):
-            raise TypeError("ListValue must contain DataValue or AWSHelperFn")
+            raise TypeError("ListValue must contain DataValue or AWSHelperFn", AWSHelperFn, DataValue)
 
 
 def validate_nestedtypel(value):
@@ -27,4 +27,4 @@ def validate_nestedtypel(value):
     from ..iottwinmaker import DataType
 
     if not isinstance(value, (DataType, AWSHelperFn)):
-        raise TypeError("NestedType must be either DataType or AWSHelperFn")
+        raise TypeError("NestedType must be either DataType or AWSHelperFn", AWSHelperFn, DataType)
diff --git a/troposphere/validators/rds.py b/troposphere/validators/rds.py
index bbebe6af..0073da0d 100644
--- a/troposphere/validators/rds.py
+++ b/troposphere/validators/rds.py
@@ -368,8 +368,10 @@ def validate_dbinstance(self) -> None:
         )
 
     nonetype = type(None)
+    allocated_storage = self.properties.get("AllocatedStorage")
     avail_zone = self.properties.get("AvailabilityZone", None)
     multi_az = self.properties.get("MultiAZ", None)
+    engine = self.properties.get("Engine")
     if not (
         isinstance(avail_zone, (AWSHelperFn, nonetype))
         and isinstance(multi_az, (AWSHelperFn, nonetype))
@@ -381,18 +383,34 @@ def validate_dbinstance(self) -> None:
             )
 
     storage_type = self.properties.get("StorageType", None)
+    if storage_type and storage_type in ["io1"] and "Iops" not in self.properties:
+        raise ValueError("Must specify Iops if using StorageType io1")
+
     if (
         storage_type
-        and storage_type in ["io1", "gp3"]
-        and "Iops" not in self.properties
+        and engine in ["mariadb", "mysql", "postgres"]
+        and storage_type in ["gp3"]
+        and int(allocated_storage) < 400
+        and "Iops" in self.properties
     ):
-        raise ValueError("Must specify Iops if using StorageType io1 or gp3")
+        raise ValueError(
+            "gp3 storage cannot have Iops specified when storage is less than 400GB for mariadb, mysql, postgres"
+        )
+
+    if (
+        storage_type
+        and "oracle" in engine
+        and storage_type in ["gp3"]
+        and int(allocated_storage) < 200
+        and "Iops" in self.properties
+    ):
+        raise ValueError(
+            "gp3 storage cannot have Iops specified when storage is less than 200GB for oracle engine types"
+        )
 
-    allocated_storage = self.properties.get("AllocatedStorage")
     iops = self.properties.get("Iops", None)
     if iops and not isinstance(iops, AWSHelperFn) and storage_type not in ["gp3"]:
         min_storage_size = 100
-        engine = self.properties.get("Engine")
         if not isinstance(engine, AWSHelperFn) and engine.startswith("sqlserver"):
             min_storage_size = 20
 
@@ -412,3 +430,44 @@ def validate_dbinstance(self) -> None:
             raise ValueError(
                 "AllocatedStorage must be no less than " "1/50th the provisioned Iops"
             )
+    if iops and not isinstance(iops, AWSHelperFn) and storage_type in ["gp3"]:
+        # https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html#gp3-storage
+        min_iops_to_allocated_storage_ratio = 0.0
+        max_iops_to_allocated_storage_ratio = 500.0
+        if engine in ["mariadb", "mysql", "postgres"]:
+            min_storage_size = 400
+        elif "oracle" in engine:
+            min_storage_size = 200
+        elif "sqlserver" in engine:
+            min_storage_size = 20
+            min_iops_to_allocated_storage_ratio = 0.5
+        else:
+            raise ValueError(
+                f"StorageType gp3 is not supported for engine " f"{engine}"
+            )
+        # Validate storage size constraints when under certain sizes
+        if (
+            not isinstance(allocated_storage, AWSHelperFn)
+            and int(allocated_storage) < min_storage_size
+        ):
+            raise ValueError(
+                f"AllocatedStorage must be at least {min_storage_size} when "
+                "Iops is set."
+            )
+
+        # Validate storage performance constraints for iops ratios
+        if not (
+            not isinstance(allocated_storage, AWSHelperFn)
+            and not isinstance(iops, AWSHelperFn)
+            and (
+                min_iops_to_allocated_storage_ratio
+                < iops / int(allocated_storage)
+                < max_iops_to_allocated_storage_ratio
+            )
+        ):
+            raise ValueError(
+                "Invalid ratio of Iops to AllocatedStorage. Minimum ratio for "
+                f"engine {engine} is {min_iops_to_allocated_storage_ratio} "
+                f"and maximum ratio is {max_iops_to_allocated_storage_ratio}"
+                f"current value is {iops / int(allocated_storage)}"
+            )
diff --git a/troposphere/validators/wafv2.py b/troposphere/validators/wafv2.py
index 75c53f55..78c1301c 100644
--- a/troposphere/validators/wafv2.py
+++ b/troposphere/validators/wafv2.py
@@ -18,7 +18,7 @@ def validate_statement(statement):
     from ..wafv2 import Statement
 
     if not isinstance(statement, (Statement, AWSHelperFn)):
-        raise TypeError(f"{statement} is not a valid Statement")
+        raise TypeError(f"{statement} is not a valid Statement", Statement)
 
     return statement
 
diff --git a/troposphere/wafv2.py b/troposphere/wafv2.py
index f63f33dd..daf26066 100644
--- a/troposphere/wafv2.py
+++ b/troposphere/wafv2.py
@@ -527,15 +527,18 @@ class FieldIdentifier(AWSProperty):
     }
 
 
-class RequestInspection(AWSProperty):
+class RequestInspectionACFP(AWSProperty):
     """
-    `RequestInspection <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-requestinspection.html>`__
+    `RequestInspectionACFP <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-requestinspectionacfp.html>`__
     """
 
     props: PropsDictType = {
-        "PasswordField": (FieldIdentifier, True),
+        "AddressFields": ([FieldIdentifier], False),
+        "EmailField": (FieldIdentifier, False),
+        "PasswordField": (FieldIdentifier, False),
         "PayloadType": (str, True),
-        "UsernameField": (FieldIdentifier, True),
+        "PhoneNumberFields": ([FieldIdentifier], False),
+        "UsernameField": (FieldIdentifier, False),
     }
 
 
@@ -598,12 +601,39 @@ class ResponseInspection(AWSProperty):
     }
 
 
+class AWSManagedRulesACFPRuleSet(AWSProperty):
+    """
+    `AWSManagedRulesACFPRuleSet <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-awsmanagedrulesacfpruleset.html>`__
+    """
+
+    props: PropsDictType = {
+        "CreationPath": (str, True),
+        "EnableRegexInPath": (boolean, False),
+        "RegistrationPagePath": (str, True),
+        "RequestInspection": (RequestInspectionACFP, True),
+        "ResponseInspection": (ResponseInspection, False),
+    }
+
+
+class RequestInspection(AWSProperty):
+    """
+    `RequestInspection <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-requestinspection.html>`__
+    """
+
+    props: PropsDictType = {
+        "PasswordField": (FieldIdentifier, True),
+        "PayloadType": (str, True),
+        "UsernameField": (FieldIdentifier, True),
+    }
+
+
 class AWSManagedRulesATPRuleSet(AWSProperty):
     """
     `AWSManagedRulesATPRuleSet <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-awsmanagedrulesatpruleset.html>`__
     """
 
     props: PropsDictType = {
+        "EnableRegexInPath": (boolean, False),
         "LoginPath": (str, True),
         "RequestInspection": (RequestInspection, False),
         "ResponseInspection": (ResponseInspection, False),
@@ -626,6 +656,7 @@ class ManagedRuleGroupConfig(AWSProperty):
     """
 
     props: PropsDictType = {
+        "AWSManagedRulesACFPRuleSet": (AWSManagedRulesACFPRuleSet, False),
         "AWSManagedRulesATPRuleSet": (AWSManagedRulesATPRuleSet, False),
         "AWSManagedRulesBotControlRuleSet": (AWSManagedRulesBotControlRuleSet, False),
         "LoginPath": (str, False),
@@ -682,6 +713,87 @@ class OrStatement(AWSProperty):
     }
 
 
+class RateLimitCookie(AWSProperty):
+    """
+    `RateLimitCookie <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratelimitcookie.html>`__
+    """
+
+    props: PropsDictType = {
+        "Name": (str, True),
+        "TextTransformations": ([TextTransformation], True),
+    }
+
+
+class RateLimitHeader(AWSProperty):
+    """
+    `RateLimitHeader <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratelimitheader.html>`__
+    """
+
+    props: PropsDictType = {
+        "Name": (str, True),
+        "TextTransformations": ([TextTransformation], True),
+    }
+
+
+class RateLimitLabelNamespace(AWSProperty):
+    """
+    `RateLimitLabelNamespace <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratelimitlabelnamespace.html>`__
+    """
+
+    props: PropsDictType = {
+        "Namespace": (str, True),
+    }
+
+
+class RateLimitQueryArgument(AWSProperty):
+    """
+    `RateLimitQueryArgument <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratelimitqueryargument.html>`__
+    """
+
+    props: PropsDictType = {
+        "Name": (str, True),
+        "TextTransformations": ([TextTransformation], True),
+    }
+
+
+class RateLimitQueryString(AWSProperty):
+    """
+    `RateLimitQueryString <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratelimitquerystring.html>`__
+    """
+
+    props: PropsDictType = {
+        "TextTransformations": ([TextTransformation], True),
+    }
+
+
+class RateLimitUriPath(AWSProperty):
+    """
+    `RateLimitUriPath <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratelimituripath.html>`__
+    """
+
+    props: PropsDictType = {
+        "TextTransformations": ([TextTransformation], True),
+    }
+
+
+class RateBasedStatementCustomKey(AWSProperty):
+    """
+    `RateBasedStatementCustomKey <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratebasedstatementcustomkey.html>`__
+    """
+
+    props: PropsDictType = {
+        "Cookie": (RateLimitCookie, False),
+        "ForwardedIP": (dict, False),
+        "HTTPMethod": (dict, False),
+        "Header": (RateLimitHeader, False),
+        "IP": (dict, False),
+        "LabelNamespace": (RateLimitLabelNamespace, False),
+        "QueryArgument": (RateLimitQueryArgument, False),
+        "QueryString": (RateLimitQueryString, False),
+        "UriPath": (RateLimitUriPath, False),
+    }
+
+
 class RateBasedStatement(AWSProperty):
     """
     `RateBasedStatement <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratebasedstatement.html>`__
@@ -689,6 +801,7 @@ class RateBasedStatement(AWSProperty):
 
     props: PropsDictType = {
         "AggregateKeyType": (str, True),
+        "CustomKeys": ([RateBasedStatementCustomKey], False),
         "ForwardedIPConfig": (ForwardedIPConfiguration, False),
         "Limit": (integer, True),
         "ScopeDownStatement": (validate_statement, False),
@@ -841,6 +954,26 @@ class RuleGroup(AWSObject):
     }
 
 
+class RequestBodyAssociatedResourceTypeConfig(AWSProperty):
+    """
+    `RequestBodyAssociatedResourceTypeConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-requestbodyassociatedresourcetypeconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "DefaultSizeInspectionLimit": (str, True),
+    }
+
+
+class AssociationConfig(AWSProperty):
+    """
+    `AssociationConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-associationconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "RequestBody": (dict, False),
+    }
+
+
 class DefaultAction(AWSProperty):
     """
     `DefaultAction <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-defaultaction.html>`__
@@ -889,6 +1022,7 @@ class WebACL(AWSObject):
     resource_type = "AWS::WAFv2::WebACL"
 
     props: PropsDictType = {
+        "AssociationConfig": (AssociationConfig, False),
         "CaptchaConfig": (CaptchaConfig, False),
         "ChallengeConfig": (ChallengeConfig, False),
         "CustomResponseBodies": (validate_custom_response_bodies, False),
diff --git a/troposphere/xray.py b/troposphere/xray.py
index 0db00bae..88054c55 100644
--- a/troposphere/xray.py
+++ b/troposphere/xray.py
@@ -6,7 +6,7 @@
 # *** Do not modify - this file is autogenerated ***
 
 
-from . import AWSObject, AWSProperty, PropsDictType
+from . import AWSObject, AWSProperty, PropsDictType, Tags
 from .validators import boolean, double, integer
 
 
@@ -21,17 +21,6 @@ class InsightsConfiguration(AWSProperty):
     }
 
 
-class TagsItems(AWSProperty):
-    """
-    `TagsItems <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-tagsitems.html>`__
-    """
-
-    props: PropsDictType = {
-        "Key": (str, True),
-        "Value": (str, True),
-    }
-
-
 class Group(AWSObject):
     """
     `Group <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-group.html>`__
@@ -41,9 +30,9 @@ class Group(AWSObject):
 
     props: PropsDictType = {
         "FilterExpression": (str, False),
-        "GroupName": (str, False),
+        "GroupName": (str, True),
         "InsightsConfiguration": (InsightsConfiguration, False),
-        "Tags": ([TagsItems], False),
+        "Tags": (Tags, False),
     }
 
 
@@ -83,39 +72,6 @@ class SamplingRuleProperty(AWSProperty):
     }
 
 
-class SamplingRuleRecord(AWSProperty):
-    """
-    `SamplingRuleRecord <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrulerecord.html>`__
-    """
-
-    props: PropsDictType = {
-        "CreatedAt": (str, False),
-        "ModifiedAt": (str, False),
-        "SamplingRule": (SamplingRuleProperty, False),
-    }
-
-
-class SamplingRuleUpdate(AWSProperty):
-    """
-    `SamplingRuleUpdate <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingruleupdate.html>`__
-    """
-
-    props: PropsDictType = {
-        "Attributes": (dict, False),
-        "FixedRate": (double, False),
-        "HTTPMethod": (str, False),
-        "Host": (str, False),
-        "Priority": (integer, False),
-        "ReservoirSize": (integer, False),
-        "ResourceARN": (str, False),
-        "RuleARN": (str, False),
-        "RuleName": (str, False),
-        "ServiceName": (str, False),
-        "ServiceType": (str, False),
-        "URLPath": (str, False),
-    }
-
-
 class SamplingRule(AWSObject):
     """
     `SamplingRule <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-samplingrule.html>`__
@@ -124,9 +80,6 @@ class SamplingRule(AWSObject):
     resource_type = "AWS::XRay::SamplingRule"
 
     props: PropsDictType = {
-        "RuleName": (str, False),
         "SamplingRule": (SamplingRuleProperty, False),
-        "SamplingRuleRecord": (SamplingRuleRecord, False),
-        "SamplingRuleUpdate": (SamplingRuleUpdate, False),
-        "Tags": ([TagsItems], False),
+        "Tags": (Tags, False),
     }


Test patch:
diff --git a/tests/test_ec2.py b/tests/test_ec2.py
index 7a0f781b..4a50104f 100644
--- a/tests/test_ec2.py
+++ b/tests/test_ec2.py
@@ -1,6 +1,7 @@
 import unittest
 
 import troposphere.ec2 as ec2
+import troposphere.validators.ec2 as vec2
 
 
 class TestEC2(unittest.TestCase):
@@ -108,3 +109,50 @@ class TestEC2(unittest.TestCase):
         )
         with self.assertRaises(ValueError):
             vpn.to_dict()
+
+    def test_vpn_conn_with_correct_props(self):
+        vpn = ec2.VPNConnection(
+            "VPNConnection",
+            StaticRoutesOnly=True,
+            TransitGatewayId="tgw-b2b86767",
+            CustomerGatewayId="cgw-0e11f167",
+            Type="ipsec.1",
+            VpnTunnelOptionsSpecifications=[
+                ec2.VpnTunnelOptionsSpecification(
+                    PreSharedKey="123_23626326236", TunnelInsideCidr="169.254.15.0/30"
+                ),
+                ec2.VpnTunnelOptionsSpecification(
+                    PreSharedKey="asdf_fds12888", TunnelInsideCidr="169.254.16.0/30"
+                ),
+            ],
+        )
+        vpn.to_dict()
+
+    def test_vpn_conn_tunnel_options_specification(self):
+        ec2.VpnTunnelOptionsSpecification(
+            PreSharedKey="12345678", TunnelInsideCidr="169.254.18.0/30"
+        )
+
+        with self.assertRaises(ValueError):
+            ec2.VpnTunnelOptionsSpecification(
+                PreSharedKey="1234567", TunnelInsideCidr="169.254.0.0/30"
+            )
+
+        with self.assertRaises(ValueError):
+            ec2.VpnTunnelOptionsSpecification(
+                PreSharedKey="0SAD_FEA_SDF", TunnelInsideCidr="192.168.16.0/30"
+            )
+
+    def test_validate_placement_strategy(self):
+        for s in ("cluster", "spread", "partition"):
+            vec2.validate_placement_strategy(s)
+
+        with self.assertRaises(ValueError):
+            vec2.validate_placement_strategy("notOk")
+
+    def test_validate_placement_spread_level(self):
+        for s in ("host", "rack"):
+            vec2.validate_placement_spread_level(s)
+
+        with self.assertRaises(ValueError):
+            vec2.validate_placement_spread_level("notHostOrRack")
diff --git a/tests/test_serverless.py b/tests/test_serverless.py
index 14262db2..68bbb88b 100644
--- a/tests/test_serverless.py
+++ b/tests/test_serverless.py
@@ -5,6 +5,8 @@ from troposphere.s3 import Filter, Rules, S3Key
 from troposphere.serverless import (
     SERVERLESS_TRANSFORM,
     Api,
+    ApiEvent,
+    ApiFunctionAuth,
     ApiGlobals,
     Auth,
     DeadLetterQueue,
@@ -474,6 +476,38 @@ class TestServerless(unittest.TestCase):
         with self.assertRaises(ValueError):
             FunctionGlobals(MemorySize=64)
 
+    def test_api_event_auth(self):
+        # Verify deprecated Auth
+        api_event = ApiEvent(
+            "SomeApiEvent",
+            Auth=Auth(),
+            Path="some path",
+            Method="some method",
+        )
+        t = Template()
+        t.add_resource(api_event)
+        t.to_json()
+
+        # Verify ApiFunctionAuth
+        api_event = ApiEvent(
+            "SomeApiEvent",
+            Auth=ApiFunctionAuth(),
+            Path="some path",
+            Method="some method",
+        )
+        t = Template()
+        t.add_resource(api_event)
+        t.to_json()
+
+        # Verify TypeError
+        with self.assertRaises(TypeError):
+            api_event = ApiEvent(
+                "SomeApiEvent",
+                Auth="some auth",
+                Path="some path",
+                Method="some method",
+            )
+
 
 if __name__ == "__main__":
     unittest.main()