Repository: cloudtools/troposphere
Pull request #2158 (2023-05-26 13:11:27)

Added tags to EventBridge (Events) Rule resource and fixed an error in CONTRIBUTING.md
Per https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-tagging.html, only two EventBridge resources support tags:  event buses and rules.   The Troposphere EventBus resource had a field for tags, but Rules was missing it, probably because the Cloudformation Resource Specification was missing it.  This is issue https://github.com/cloudtools/troposphere/issues/2151.

This PR adds a jsonpatch to plug Tags for the Events::Rules resource into the resource specification and adds Tags to the Rules class. Also, the example for running `scripts/gen.py` included the cloudformation spec file as an argument, which causes gen.py to treat it as a service name and build a corrupted file.  This patch removes the cloudformation spec file from the example.


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/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..5968621e 100644
--- a/troposphere/cloudwatch.py
+++ b/troposphere/cloudwatch.py
@@ -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..5b501066 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),
diff --git a/troposphere/connect.py b/troposphere/connect.py
index 8935901b..dc38cfaa 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>`__
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..4361b314 100644
--- a/troposphere/datasync.py
+++ b/troposphere/datasync.py
@@ -323,6 +323,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..2651a098 100644
--- a/troposphere/ec2.py
+++ b/troposphere/ec2.py
@@ -435,7 +435,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 +704,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 +737,6 @@ class IPAM(AWSObject):
         "DefaultResourceDiscoveryId": (str, False),
         "Description": (str, False),
         "OperatingRegions": ([IpamOperatingRegion], False),
-        "ResourceDiscoveryAssociationCount": (integer, False),
         "Tags": (Tags, False),
     }
 
@@ -850,7 +850,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 +880,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 +923,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 +933,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 +1008,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 +1111,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 +1132,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 +1143,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 +1154,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 +1168,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 +1278,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 +1323,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 +1344,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 +1354,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 = {
@@ -1604,7 +1606,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 +1729,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 +1764,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),
@@ -2790,7 +2818,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 +2829,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 +3043,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/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/events.py b/troposphere/events.py
index 5f5045a3..0ba801b0 100644
--- a/troposphere/events.py
+++ b/troposphere/events.py
@@ -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..811ace34 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),
diff --git a/troposphere/kms.py b/troposphere/kms.py
index 6a30dbe1..374f59cf 100644
--- a/troposphere/kms.py
+++ b/troposphere/kms.py
@@ -44,6 +44,7 @@ class Key(AWSObject):
         "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/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..f9a840fb 100644
--- a/troposphere/serverless.py
+++ b/troposphere/serverless.py
@@ -15,8 +15,10 @@ from .awslambda import (
     Environment,
     EphemeralStorage,
     FileSystemConfig,
+    FilterCriteria,
     ImageConfig,
     ProvisionedConcurrencyConfiguration,
+    SourceAccessConfiguration,
     VPCConfig,
     validate_memory_size,
     validate_package_type,
@@ -26,6 +28,7 @@ from .s3 import Filter
 from .stepfunctions import LoggingConfiguration, TracingConfiguration
 from .validators import (
     boolean,
+    double,
     exactly_one,
     integer,
     integer_range,
@@ -617,6 +620,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 +699,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..3bc5c83e 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,7 @@ 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 +140,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..98a081ca 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$"
     )
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/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..d459ea15 100644
--- a/tests/test_ec2.py
+++ b/tests/test_ec2.py
@@ -108,3 +108,36 @@ 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"
+            )