Repository: cloudtools/troposphere
Pull request #2072 (2022-08-26 00:12:03)

Add support for FunctionUrlConfig in Serverless Function
Fix for #2071 


Patch:
diff --git a/scripts/gen.py b/scripts/gen.py
index 7073575c..0ccc5478 100755
--- a/scripts/gen.py
+++ b/scripts/gen.py
@@ -551,7 +551,7 @@ class CodeGenerator:
                     file=sys.stderr,
                 )
                 print(
-                    f"Available property keys:\n{self.properties.keys()}",
+                    f"Available property keys:\n{sorted(self.properties.keys())}",
                     file=sys.stderr,
                 )
                 raise
diff --git a/scripts/patches/ec2.py b/scripts/patches/ec2.py
index 9b3708b0..f1f61c74 100644
--- a/scripts/patches/ec2.py
+++ b/scripts/patches/ec2.py
@@ -398,5 +398,9 @@ patches = (
             "path": "/PropertyTypes/AWS::EC2::SpotFleet.SpotFleetRequestConfigData/Properties/LaunchTemplateConfigs/ItemType",
             "value": "LaunchTemplateConfigs",
         },
+        {
+            "op": "remove",
+            "path": "/PropertyTypes/AWS::EC2::NetworkInsightsAnalysis.AdditionalDetail",
+        },
     ]
 )
diff --git a/scripts/patches/greengrassv2.py b/scripts/patches/greengrassv2.py
new file mode 100644
index 00000000..76439d5f
--- /dev/null
+++ b/scripts/patches/greengrassv2.py
@@ -0,0 +1,22 @@
+patches = [
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::GreengrassV2::Deployment.IoTJobRateIncreaseCriteria",
+    },
+    {
+        "op": "add",
+        "path": "/PropertyTypes/AWS::GreengrassV2::Deployment.IoTJobRateIncreaseCriteria",
+        "value": {
+            "Properties": {
+                "NumberOfNotifiedThings": {
+                    "PrimitiveType": "Integer",
+                    "Required": False,
+                },
+                "NumberOfSucceededThings": {
+                    "PrimitiveType": "Integer",
+                    "Required": False,
+                },
+            },
+        },
+    },
+]
diff --git a/scripts/patches/msk.py b/scripts/patches/msk.py
new file mode 100644
index 00000000..15b803e1
--- /dev/null
+++ b/scripts/patches/msk.py
@@ -0,0 +1,10 @@
+patches = [
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::MSK::ServerlessCluster.ClientAuthentication",
+    },
+    {
+        "op": "remove",
+        "path": "/PropertyTypes/AWS::MSK::ServerlessCluster.Sasl",
+    },
+]
diff --git a/scripts/patches/rekognition.py b/scripts/patches/rekognition.py
new file mode 100644
index 00000000..62b3d3c0
--- /dev/null
+++ b/scripts/patches/rekognition.py
@@ -0,0 +1,7 @@
+patches = [
+    {
+        "op": "replace",
+        "path": "/ResourceTypes/AWS::Rekognition::StreamProcessor/Properties/PolygonRegionsOfInterest/ItemType",
+        "value": "List",
+    },
+]
diff --git a/scripts/patches/sagemaker.py b/scripts/patches/sagemaker.py
index 113735b7..6b5800cc 100644
--- a/scripts/patches/sagemaker.py
+++ b/scripts/patches/sagemaker.py
@@ -70,25 +70,39 @@ patches = [
         "path": "/PropertyTypes/AWS::SageMaker::ModelPackage.TransformJobDefinition/Properties/Environment/PrimitiveType",
         "value": "Json",
     },
-    # Remove Clarify* properties that aren't being used yet
     {
         "op": "remove",
-        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyInferenceConfig",
+        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyFeatureType",
     },
     {
         "op": "remove",
-        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyShapConfig",
+        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyInferenceConfig/Properties/FeatureTypes/ItemType",
+    },
+    {
+        "op": "add",
+        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyInferenceConfig/Properties/FeatureTypes/PrimitiveItemType",
+        "value": "String",
     },
     {
         "op": "remove",
-        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyExplainerConfig",
+        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyHeader",
     },
     {
         "op": "remove",
-        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyShapBaselineConfig",
+        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyInferenceConfig/Properties/LabelHeaders/ItemType",
+    },
+    {
+        "op": "add",
+        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyInferenceConfig/Properties/LabelHeaders/PrimitiveItemType",
+        "value": "String",
     },
     {
         "op": "remove",
-        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyTextConfig",
+        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyInferenceConfig/Properties/FeatureHeaders/ItemType",
+    },
+    {
+        "op": "add",
+        "path": "/PropertyTypes/AWS::SageMaker::EndpointConfig.ClarifyInferenceConfig/Properties/FeatureHeaders/PrimitiveItemType",
+        "value": "String",
     },
 ]
diff --git a/troposphere/appflow.py b/troposphere/appflow.py
index 951335e2..ff3993cb 100644
--- a/troposphere/appflow.py
+++ b/troposphere/appflow.py
@@ -663,6 +663,7 @@ class SalesforceDestinationProperties(AWSProperty):
     """
 
     props: PropsDictType = {
+        "DataTransferApi": (str, False),
         "ErrorHandlingConfig": (ErrorHandlingConfig, False),
         "IdFieldNames": ([str], False),
         "Object": (str, True),
@@ -872,6 +873,7 @@ class SalesforceSourceProperties(AWSProperty):
     """
 
     props: PropsDictType = {
+        "DataTransferApi": (str, False),
         "EnableDynamicFieldUpdate": (boolean, False),
         "IncludeDeletedRecords": (boolean, False),
         "Object": (str, True),
diff --git a/troposphere/appmesh.py b/troposphere/appmesh.py
index 815efa2b..c5b4f744 100644
--- a/troposphere/appmesh.py
+++ b/troposphere/appmesh.py
@@ -27,6 +27,7 @@ class GatewayRouteTarget(AWSProperty):
     """
 
     props: PropsDictType = {
+        "Port": (integer, False),
         "VirtualService": (GatewayRouteVirtualService, True),
     }
 
@@ -118,6 +119,7 @@ class GrpcGatewayRouteMatch(AWSProperty):
     props: PropsDictType = {
         "Hostname": (GatewayRouteHostnameMatch, False),
         "Metadata": ([GrpcGatewayRouteMetadata], False),
+        "Port": (integer, False),
         "ServiceName": (str, False),
     }
 
@@ -245,6 +247,7 @@ class HttpGatewayRouteMatch(AWSProperty):
         "Hostname": (GatewayRouteHostnameMatch, False),
         "Method": (str, False),
         "Path": (HttpPathMatch, False),
+        "Port": (integer, False),
         "Prefix": (str, False),
         "QueryParameters": ([QueryParameter], False),
     }
@@ -367,6 +370,7 @@ class WeightedTarget(AWSProperty):
     """
 
     props: PropsDictType = {
+        "Port": (integer, False),
         "VirtualNode": (str, True),
         "Weight": (integer, True),
     }
@@ -427,6 +431,7 @@ class GrpcRouteMatch(AWSProperty):
     props: PropsDictType = {
         "Metadata": ([GrpcRouteMetadata], False),
         "MethodName": (str, False),
+        "Port": (integer, False),
         "ServiceName": (str, False),
     }
 
@@ -513,6 +518,7 @@ class HttpRouteMatch(AWSProperty):
         "Headers": ([HttpRouteHeader], False),
         "Method": (str, False),
         "Path": (HttpPathMatch, False),
+        "Port": (integer, False),
         "Prefix": (str, False),
         "QueryParameters": ([QueryParameter], False),
         "Scheme": (str, False),
@@ -553,6 +559,16 @@ class TcpRouteAction(AWSProperty):
     }
 
 
+class TcpRouteMatch(AWSProperty):
+    """
+    `TcpRouteMatch <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproutematch.html>`__
+    """
+
+    props: PropsDictType = {
+        "Port": (integer, False),
+    }
+
+
 class TcpTimeout(AWSProperty):
     """
     `TcpTimeout <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tcptimeout.html>`__
@@ -570,6 +586,7 @@ class TcpRoute(AWSProperty):
 
     props: PropsDictType = {
         "Action": (TcpRouteAction, True),
+        "Match": (TcpRouteMatch, False),
         "Timeout": (TcpTimeout, False),
     }
 
@@ -882,12 +899,35 @@ class VirtualGatewayListener(AWSProperty):
     }
 
 
+class JsonFormatRef(AWSProperty):
+    """
+    `JsonFormatRef <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-jsonformatref.html>`__
+    """
+
+    props: PropsDictType = {
+        "Key": (str, True),
+        "Value": (str, True),
+    }
+
+
+class LoggingFormat(AWSProperty):
+    """
+    `LoggingFormat <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-loggingformat.html>`__
+    """
+
+    props: PropsDictType = {
+        "Json": ([JsonFormatRef], False),
+        "Text": (str, False),
+    }
+
+
 class VirtualGatewayFileAccessLog(AWSProperty):
     """
     `VirtualGatewayFileAccessLog <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayfileaccesslog.html>`__
     """
 
     props: PropsDictType = {
+        "Format": (LoggingFormat, False),
         "Path": (str, True),
     }
 
@@ -1263,6 +1303,7 @@ class FileAccessLog(AWSProperty):
     """
 
     props: PropsDictType = {
+        "Format": (LoggingFormat, False),
         "Path": (str, True),
     }
 
diff --git a/troposphere/aps.py b/troposphere/aps.py
index 5db3e285..ebcb406a 100644
--- a/troposphere/aps.py
+++ b/troposphere/aps.py
@@ -6,7 +6,7 @@
 # *** Do not modify - this file is autogenerated ***
 
 
-from . import AWSObject, PropsDictType, Tags
+from . import AWSObject, AWSProperty, PropsDictType, Tags
 
 
 class RuleGroupsNamespace(AWSObject):
@@ -24,6 +24,16 @@ class RuleGroupsNamespace(AWSObject):
     }
 
 
+class LoggingConfiguration(AWSProperty):
+    """
+    `LoggingConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-aps-workspace-loggingconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "LogGroupArn": (str, False),
+    }
+
+
 class Workspace(AWSObject):
     """
     `Workspace <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-workspace.html>`__
@@ -34,5 +44,6 @@ class Workspace(AWSObject):
     props: PropsDictType = {
         "AlertManagerDefinition": (str, False),
         "Alias": (str, False),
+        "LoggingConfiguration": (LoggingConfiguration, False),
         "Tags": (Tags, False),
     }
diff --git a/troposphere/awslambda.py b/troposphere/awslambda.py
index be06728b..34817fb1 100644
--- a/troposphere/awslambda.py
+++ b/troposphere/awslambda.py
@@ -148,6 +148,16 @@ class EventInvokeConfig(AWSObject):
     }
 
 
+class AmazonManagedKafkaEventSourceConfig(AWSProperty):
+    """
+    `AmazonManagedKafkaEventSourceConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-amazonmanagedkafkaeventsourceconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "ConsumerGroupId": (str, False),
+    }
+
+
 class Filter(AWSProperty):
     """
     `Filter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-filter.html>`__
@@ -188,6 +198,16 @@ class SelfManagedEventSource(AWSProperty):
     }
 
 
+class SelfManagedKafkaEventSourceConfig(AWSProperty):
+    """
+    `SelfManagedKafkaEventSourceConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-selfmanagedkafkaeventsourceconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "ConsumerGroupId": (str, False),
+    }
+
+
 class SourceAccessConfiguration(AWSProperty):
     """
     `SourceAccessConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-sourceaccessconfiguration.html>`__
@@ -207,6 +227,10 @@ class EventSourceMapping(AWSObject):
     resource_type = "AWS::Lambda::EventSourceMapping"
 
     props: PropsDictType = {
+        "AmazonManagedKafkaEventSourceConfig": (
+            AmazonManagedKafkaEventSourceConfig,
+            False,
+        ),
         "BatchSize": (integer, False),
         "BisectBatchOnFunctionError": (boolean, False),
         "DestinationConfig": (DestinationConfig, False),
@@ -221,6 +245,7 @@ class EventSourceMapping(AWSObject):
         "ParallelizationFactor": (integer, False),
         "Queues": ([str], False),
         "SelfManagedEventSource": (SelfManagedEventSource, False),
+        "SelfManagedKafkaEventSourceConfig": (SelfManagedKafkaEventSourceConfig, False),
         "SourceAccessConfigurations": ([SourceAccessConfiguration], False),
         "StartingPosition": (str, False),
         "StartingPositionTimestamp": (double, False),
diff --git a/troposphere/budgets.py b/troposphere/budgets.py
index dd07bc07..0b96e448 100644
--- a/troposphere/budgets.py
+++ b/troposphere/budgets.py
@@ -7,7 +7,28 @@
 
 
 from . import AWSObject, AWSProperty, PropsDictType
-from .validators import boolean, double
+from .validators import boolean, double, integer
+
+
+class HistoricalOptions(AWSProperty):
+    """
+    `HistoricalOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-historicaloptions.html>`__
+    """
+
+    props: PropsDictType = {
+        "BudgetAdjustmentPeriod": (integer, True),
+    }
+
+
+class AutoAdjustData(AWSProperty):
+    """
+    `AutoAdjustData <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-autoadjustdata.html>`__
+    """
+
+    props: PropsDictType = {
+        "AutoAdjustType": (str, True),
+        "HistoricalOptions": (HistoricalOptions, False),
+    }
 
 
 class CostTypes(AWSProperty):
@@ -58,6 +79,7 @@ class BudgetData(AWSProperty):
     """
 
     props: PropsDictType = {
+        "AutoAdjustData": (AutoAdjustData, False),
         "BudgetLimit": (Spend, False),
         "BudgetName": (str, False),
         "BudgetType": (str, True),
diff --git a/troposphere/cloudfront.py b/troposphere/cloudfront.py
index 68b46fcf..224a023c 100644
--- a/troposphere/cloudfront.py
+++ b/troposphere/cloudfront.py
@@ -342,6 +342,7 @@ class Origin(AWSProperty):
         "CustomOriginConfig": (CustomOriginConfig, False),
         "DomainName": (str, True),
         "Id": (str, True),
+        "OriginAccessControlId": (str, False),
         "OriginCustomHeaders": ([OriginCustomHeader], False),
         "OriginPath": (str, False),
         "OriginShield": (OriginShield, False),
@@ -551,6 +552,65 @@ class KeyGroup(AWSObject):
     }
 
 
+class RealtimeMetricsSubscriptionConfig(AWSProperty):
+    """
+    `RealtimeMetricsSubscriptionConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-monitoringsubscription-realtimemetricssubscriptionconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "RealtimeMetricsSubscriptionStatus": (str, True),
+    }
+
+
+class MonitoringSubscriptionProperty(AWSProperty):
+    """
+    `MonitoringSubscriptionProperty <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-monitoringsubscription-monitoringsubscription.html>`__
+    """
+
+    props: PropsDictType = {
+        "RealtimeMetricsSubscriptionConfig": (RealtimeMetricsSubscriptionConfig, False),
+    }
+
+
+class MonitoringSubscription(AWSObject):
+    """
+    `MonitoringSubscription <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-monitoringsubscription.html>`__
+    """
+
+    resource_type = "AWS::CloudFront::MonitoringSubscription"
+
+    props: PropsDictType = {
+        "DistributionId": (str, True),
+        "MonitoringSubscription": (MonitoringSubscriptionProperty, True),
+    }
+
+
+class OriginAccessControlConfig(AWSProperty):
+    """
+    `OriginAccessControlConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originaccesscontrol-originaccesscontrolconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "Description": (str, False),
+        "Name": (str, True),
+        "OriginAccessControlOriginType": (str, True),
+        "SigningBehavior": (str, True),
+        "SigningProtocol": (str, True),
+    }
+
+
+class OriginAccessControl(AWSObject):
+    """
+    `OriginAccessControl <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originaccesscontrol.html>`__
+    """
+
+    resource_type = "AWS::CloudFront::OriginAccessControl"
+
+    props: PropsDictType = {
+        "OriginAccessControlConfig": (OriginAccessControlConfig, True),
+    }
+
+
 class OriginRequestCookiesConfig(AWSProperty):
     """
     `OriginRequestCookiesConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-cookiesconfig.html>`__
@@ -834,6 +894,17 @@ class SecurityHeadersConfig(AWSProperty):
     }
 
 
+class ServerTimingHeadersConfig(AWSProperty):
+    """
+    `ServerTimingHeadersConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-servertimingheadersconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "Enabled": (boolean, True),
+        "SamplingRate": (double, False),
+    }
+
+
 class ResponseHeadersPolicyConfig(AWSProperty):
     """
     `ResponseHeadersPolicyConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html>`__
@@ -845,6 +916,7 @@ class ResponseHeadersPolicyConfig(AWSProperty):
         "CustomHeadersConfig": (CustomHeadersConfig, False),
         "Name": (str, True),
         "SecurityHeadersConfig": (SecurityHeadersConfig, False),
+        "ServerTimingHeadersConfig": (ServerTimingHeadersConfig, False),
     }
 
 
diff --git a/troposphere/cloudwatch.py b/troposphere/cloudwatch.py
index 4d576887..b57778ed 100644
--- a/troposphere/cloudwatch.py
+++ b/troposphere/cloudwatch.py
@@ -71,7 +71,7 @@ class MetricDataQuery(AWSProperty):
 
 class Alarm(AWSObject):
     """
-    `Alarm <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-alarm.html>`__
+    `Alarm <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html>`__
     """
 
     resource_type = "AWS::CloudWatch::Alarm"
diff --git a/troposphere/cognito.py b/troposphere/cognito.py
index aab6dba1..2d7dea66 100644
--- a/troposphere/cognito.py
+++ b/troposphere/cognito.py
@@ -389,6 +389,7 @@ class UserPoolClient(AWSObject):
         "AllowedOAuthFlowsUserPoolClient": (boolean, False),
         "AllowedOAuthScopes": ([str], False),
         "AnalyticsConfiguration": (AnalyticsConfiguration, False),
+        "AuthSessionValidity": (integer, False),
         "CallbackURLs": ([str], False),
         "ClientName": (str, False),
         "DefaultRedirectURI": (str, False),
diff --git a/troposphere/config.py b/troposphere/config.py
index 3b9472d3..c6121c2c 100644
--- a/troposphere/config.py
+++ b/troposphere/config.py
@@ -190,6 +190,7 @@ class ConformancePack(AWSObject):
         "DeliveryS3KeyPrefix": (str, False),
         "TemplateBody": (str, False),
         "TemplateS3Uri": (str, False),
+        "TemplateSSMDocumentDetails": (dict, False),
     }
 
 
diff --git a/troposphere/connect.py b/troposphere/connect.py
index edbddd44..020dcc2a 100644
--- a/troposphere/connect.py
+++ b/troposphere/connect.py
@@ -7,7 +7,7 @@
 
 
 from . import AWSObject, AWSProperty, PropsDictType, Tags
-from .validators import boolean, integer
+from .validators import boolean, double, integer
 
 
 class ContactFlow(AWSObject):
@@ -24,7 +24,7 @@ class ContactFlow(AWSObject):
         "Name": (str, True),
         "State": (str, False),
         "Tags": (Tags, False),
-        "Type": (str, False),
+        "Type": (str, True),
     }
 
 
@@ -85,6 +85,110 @@ class HoursOfOperation(AWSObject):
     }
 
 
+class Attributes(AWSProperty):
+    """
+    `Attributes <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instance-attributes.html>`__
+    """
+
+    props: PropsDictType = {
+        "AutoResolveBestVoices": (boolean, False),
+        "ContactLens": (boolean, False),
+        "ContactflowLogs": (boolean, False),
+        "EarlyMedia": (boolean, False),
+        "InboundCalls": (boolean, True),
+        "OutboundCalls": (boolean, True),
+        "UseCustomTTSVoices": (boolean, False),
+    }
+
+
+class Instance(AWSObject):
+    """
+    `Instance <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instance.html>`__
+    """
+
+    resource_type = "AWS::Connect::Instance"
+
+    props: PropsDictType = {
+        "Attributes": (Attributes, True),
+        "DirectoryId": (str, False),
+        "IdentityManagementType": (str, True),
+        "InstanceAlias": (str, False),
+    }
+
+
+class KinesisFirehoseConfig(AWSProperty):
+    """
+    `KinesisFirehoseConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisfirehoseconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "FirehoseArn": (str, True),
+    }
+
+
+class KinesisStreamConfig(AWSProperty):
+    """
+    `KinesisStreamConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisstreamconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "StreamArn": (str, True),
+    }
+
+
+class EncryptionConfig(AWSProperty):
+    """
+    `EncryptionConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-encryptionconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "EncryptionType": (str, True),
+        "KeyId": (str, True),
+    }
+
+
+class KinesisVideoStreamConfig(AWSProperty):
+    """
+    `KinesisVideoStreamConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisvideostreamconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "EncryptionConfig": (EncryptionConfig, False),
+        "Prefix": (str, True),
+        "RetentionPeriodHours": (double, True),
+    }
+
+
+class S3Config(AWSProperty):
+    """
+    `S3Config <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-s3config.html>`__
+    """
+
+    props: PropsDictType = {
+        "BucketName": (str, True),
+        "BucketPrefix": (str, True),
+        "EncryptionConfig": (EncryptionConfig, False),
+    }
+
+
+class InstanceStorageConfig(AWSObject):
+    """
+    `InstanceStorageConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instancestorageconfig.html>`__
+    """
+
+    resource_type = "AWS::Connect::InstanceStorageConfig"
+
+    props: PropsDictType = {
+        "InstanceArn": (str, True),
+        "KinesisFirehoseConfig": (KinesisFirehoseConfig, False),
+        "KinesisStreamConfig": (KinesisStreamConfig, False),
+        "KinesisVideoStreamConfig": (KinesisVideoStreamConfig, False),
+        "ResourceType": (str, True),
+        "S3Config": (S3Config, False),
+        "StorageType": (str, True),
+    }
+
+
 class PhoneNumber(AWSObject):
     """
     `PhoneNumber <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-phonenumber.html>`__
@@ -227,6 +331,8 @@ class UserIdentityInfo(AWSProperty):
         "Email": (str, False),
         "FirstName": (str, False),
         "LastName": (str, False),
+        "Mobile": (str, False),
+        "SecondaryEmail": (str, False),
     }
 
 
diff --git a/troposphere/constants.py b/troposphere/constants.py
index b633d94e..28d19c4a 100644
--- a/troposphere/constants.py
+++ b/troposphere/constants.py
@@ -20,6 +20,7 @@ EU_WEST_3 = "eu-west-3"
 EU_CENTRAL_1 = "eu-central-1"
 EU_NORTH_1 = "eu-north-1"
 EU_SOUTH_1 = "eu-south-1"
+ME_CENTRAL_1 = "me-central-1"
 ME_SOUTH_1 = "me-south-1"
 SA_EAST_1 = "sa-east-1"
 US_EAST_1 = "us-east-1"
@@ -107,6 +108,10 @@ EU_SOUTH_1A = "eu-south-1a"
 EU_SOUTH_1B = "eu-south-1b"
 EU_SOUTH_1C = "eu-south-1c"
 
+ME_CENTRAL_1A = "me-central-1a"
+ME_CENTRAL_1B = "me-central-1b"
+ME_CENTRAL_1C = "me-central-1c"
+
 ME_SOUTH_1A = "me-south-1a"
 ME_SOUTH_1B = "me-south-1b"
 ME_SOUTH_1C = "me-south-1c"
@@ -683,34 +688,84 @@ DB_CR1_8XLARGE = "db.cr1.8xlarge"
 # ElastiCache node types
 #
 
+CACHE_T1_MICRO = "cache.t1.micro"
+
 CACHE_T2_MICRO = "cache.t2.micro"
 CACHE_T2_SMALL = "cache.t2.small"
 CACHE_T2_MEDIUM = "cache.t2.medium"
 
+CACHE_T3_MICRO = "cache.t3.micro"
+CACHE_T3_SMALL = "cache.t3.small"
+CACHE_T3_MEDIUM = "cache.t3.medium"
+
+CACHE_T4G_MICRO = "cache.t4g.micro"
+CACHE_T4G_SMALL = "cache.t4g.small"
+CACHE_T4G_MEDIUM = "cache.t4g.medium"
+
+CACHE_M1_SMALL = "cache.m1.small"
+CACHE_M1_MEDIUM = "cache.m1.medium"
+CACHE_M1_LARGE = "cache.m1.large"
+CACHE_M1_XLARGE = "cache.m1.xlarge"
+
+CACHE_M2_XLARGE = "cache.m2.xlarge"
+CACHE_M2_2XLARGE = "cache.m2.2xlarge"
+CACHE_M2_4XLARGE = "cache.m2.4xlarge"
+
 CACHE_M3_MEDIUM = "cache.m3.medium"
 CACHE_M3_LARGE = "cache.m3.large"
 CACHE_M3_XLARGE = "cache.m3.xlarge"
 CACHE_M3_2XLARGE = "cache.m3.2xlarge"
 
+CACHE_M4_LARGE = "cache.m4.large"
+CACHE_M4_XLARGE = "cache.m4.xlarge"
+CACHE_M4_2XLARGE = "cache.m4.2xlarge"
+CACHE_M4_4XLARGE = "cache.m4.4xlarge"
+CACHE_M4_10XLARGE = "cache.m4.10xlarge"
+
+CACHE_M5_LARGE = "cache.m5.large"
+CACHE_M5_XLARGE = "cache.m5.xlarge"
+CACHE_M5_2XLARGE = "cache.m5.2xlarge"
+CACHE_M5_4XLARGE = "cache.m5.4xlarge"
+CACHE_M5_12XLARGE = "cache.m5.12xlarge"
+
+CACHE_M6G_LARGE = "cache.m6g.large"
+CACHE_M6G_XLARGE = "cache.m6g.xlarge"
+CACHE_M6G_2XLARGE = "cache.m6g.2xlarge"
+CACHE_M6G_4XLARGE = "cache.m6g.4xlarge"
+CACHE_M6G_8XLARGE = "cache.m6g.8xlarge"
+CACHE_M6G_12XLARGE = "cache.m6g.12xlarge"
+CACHE_M6G_16XLARGE = "cache.m6g.16xlarge"
+
 CACHE_R3_LARGE = "cache.r3.large"
 CACHE_R3_XLARGE = "cache.r3.xlarge"
 CACHE_R3_2XLARGE = "cache.r3.2xlarge"
 CACHE_R3_4XLARGE = "cache.r3.4xlarge"
 CACHE_R3_8XLARGE = "cache.r3.8xlarge"
 
-CACHE_M1_SMALL = "cache.m1.small"
-CACHE_M1_MEDIUM = "cache.m1.medium"
-CACHE_M1_LARGE = "cache.m1.large"
-CACHE_M1_XLARGE = "cache.m1.xlarge"
-
-CACHE_M2_XLARGE = "cache.m2.xlarge"
-CACHE_M2_2XLARGE = "cache.m2.2xlarge"
-CACHE_M2_4XLARGE = "cache.m2.4xlarge"
+CACHE_R4_LARGE = "cache.r4.large"
+CACHE_R4_XLARGE = "cache.r4.xlarge"
+CACHE_R4_2XLARGE = "cache.r4.2xlarge"
+CACHE_R4_4XLARGE = "cache.r4.4xlarge"
+CACHE_R4_8XLARGE = "cache.r4.8xlarge"
+CACHE_R4_16XLARGE = "cache.r4.16xlarge"
+
+CACHE_R5_LARGE = "cache.r5.large"
+CACHE_R5_XLARGE = "cache.r5.xlarge"
+CACHE_R5_2XLARGE = "cache.r5.2xlarge"
+CACHE_R5_4XLARGE = "cache.r5.4xlarge"
+CACHE_R5_12XLARGE = "cache.r5.12xlarge"
+CACHE_R5_24XLARGE = "cache.r5.24xlarge"
+
+CACHE_R6G_LARGE = "cache.r6g.large"
+CACHE_R6G_XLARGE = "cache.r6g.xlarge"
+CACHE_R6G_2XLARGE = "cache.r6g.2xlarge"
+CACHE_R6G_4XLARGE = "cache.r6g.4xlarge"
+CACHE_R6G_8XLARGE = "cache.r6g.8xlarge"
+CACHE_R6G_12XLARGE = "cache.r6g.12xlarge"
+CACHE_R6G_16XLARGE = "cache.r6g.16xlarge"
 
 CACHE_C1_XLARGE = "cache.c1.xlarge"
 
-CACHE_T1_MICRO = "cache.t1.micro"
-
 #
 # Elasticsearch instance types
 #
diff --git a/troposphere/datapipeline.py b/troposphere/datapipeline.py
index 76ce0ee4..2a0c12a7 100644
--- a/troposphere/datapipeline.py
+++ b/troposphere/datapipeline.py
@@ -12,7 +12,7 @@ from .validators import boolean
 
 class ParameterObjectAttribute(AWSProperty):
     """
-    `ParameterObjectAttribute <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parameterobjects-attributes.html>`__
+    `ParameterObjectAttribute <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parameterattribute.html>`__
     """
 
     props: PropsDictType = {
@@ -23,7 +23,7 @@ class ParameterObjectAttribute(AWSProperty):
 
 class ParameterObject(AWSProperty):
     """
-    `ParameterObject <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parameterobjects.html>`__
+    `ParameterObject <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parameterobject.html>`__
     """
 
     props: PropsDictType = {
@@ -34,7 +34,7 @@ class ParameterObject(AWSProperty):
 
 class ParameterValue(AWSProperty):
     """
-    `ParameterValue <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parametervalues.html>`__
+    `ParameterValue <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parametervalue.html>`__
     """
 
     props: PropsDictType = {
@@ -45,7 +45,7 @@ class ParameterValue(AWSProperty):
 
 class ObjectField(AWSProperty):
     """
-    `ObjectField <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelineobjects-fields.html>`__
+    `ObjectField <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-field.html>`__
     """
 
     props: PropsDictType = {
@@ -57,7 +57,7 @@ class ObjectField(AWSProperty):
 
 class PipelineObject(AWSProperty):
     """
-    `PipelineObject <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelineobjects.html>`__
+    `PipelineObject <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelineobject.html>`__
     """
 
     props: PropsDictType = {
@@ -69,7 +69,7 @@ class PipelineObject(AWSProperty):
 
 class PipelineTag(AWSProperty):
     """
-    `PipelineTag <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelinetags.html>`__
+    `PipelineTag <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelinetag.html>`__
     """
 
     props: PropsDictType = {
@@ -89,7 +89,7 @@ class Pipeline(AWSObject):
         "Activate": (boolean, False),
         "Description": (str, False),
         "Name": (str, True),
-        "ParameterObjects": ([ParameterObject], True),
+        "ParameterObjects": ([ParameterObject], False),
         "ParameterValues": ([ParameterValue], False),
         "PipelineObjects": ([PipelineObject], False),
         "PipelineTags": ([PipelineTag], False),
diff --git a/troposphere/devopsguru.py b/troposphere/devopsguru.py
index ffb1ea49..07660fe8 100644
--- a/troposphere/devopsguru.py
+++ b/troposphere/devopsguru.py
@@ -9,6 +9,17 @@
 from . import AWSObject, AWSProperty, PropsDictType
 
 
+class NotificationFilterConfig(AWSProperty):
+    """
+    `NotificationFilterConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-notificationchannel-notificationfilterconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "MessageTypes": ([str], False),
+        "Severities": ([str], False),
+    }
+
+
 class SnsChannelConfig(AWSProperty):
     """
     `SnsChannelConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-notificationchannel-snschannelconfig.html>`__
@@ -25,6 +36,7 @@ class NotificationChannelConfig(AWSProperty):
     """
 
     props: PropsDictType = {
+        "Filters": (NotificationFilterConfig, False),
         "Sns": (SnsChannelConfig, False),
     }
 
diff --git a/troposphere/dlm.py b/troposphere/dlm.py
index dfbab316..bd1e4929 100644
--- a/troposphere/dlm.py
+++ b/troposphere/dlm.py
@@ -96,6 +96,38 @@ class Parameters(AWSProperty):
     }
 
 
+class RetentionArchiveTier(AWSProperty):
+    """
+    `RetentionArchiveTier <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-retentionarchivetier.html>`__
+    """
+
+    props: PropsDictType = {
+        "Count": (integer, False),
+        "Interval": (integer, False),
+        "IntervalUnit": (str, False),
+    }
+
+
+class ArchiveRetainRule(AWSProperty):
+    """
+    `ArchiveRetainRule <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-archiveretainrule.html>`__
+    """
+
+    props: PropsDictType = {
+        "RetentionArchiveTier": (RetentionArchiveTier, True),
+    }
+
+
+class ArchiveRule(AWSProperty):
+    """
+    `ArchiveRule <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-archiverule.html>`__
+    """
+
+    props: PropsDictType = {
+        "RetainRule": (ArchiveRetainRule, True),
+    }
+
+
 class CreateRule(AWSProperty):
     """
     `CreateRule <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-createrule.html>`__
@@ -192,6 +224,7 @@ class Schedule(AWSProperty):
     """
 
     props: PropsDictType = {
+        "ArchiveRule": (ArchiveRule, False),
         "CopyTags": (boolean, False),
         "CreateRule": (CreateRule, False),
         "CrossRegionCopyRules": ([CrossRegionCopyRule], False),
diff --git a/troposphere/dynamodb.py b/troposphere/dynamodb.py
index 82208ff6..fd2b515e 100644
--- a/troposphere/dynamodb.py
+++ b/troposphere/dynamodb.py
@@ -20,7 +20,7 @@ from .validators.dynamodb import (
 
 class AttributeDefinition(AWSProperty):
     """
-    `AttributeDefinition <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-attributedef.html>`__
+    `AttributeDefinition <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-attributedefinition.html>`__
     """
 
     props: PropsDictType = {
@@ -31,7 +31,7 @@ class AttributeDefinition(AWSProperty):
 
 class KeySchema(AWSProperty):
     """
-    `KeySchema <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-keyschema.html>`__
+    `KeySchema <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-keyschema.html>`__
     """
 
     props: PropsDictType = {
@@ -42,7 +42,7 @@ class KeySchema(AWSProperty):
 
 class Projection(AWSProperty):
     """
-    `Projection <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-projectionobject.html>`__
+    `Projection <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-projection.html>`__
     """
 
     props: PropsDictType = {
@@ -119,7 +119,7 @@ class GlobalTableSSESpecification(AWSProperty):
 
 class LocalSecondaryIndex(AWSProperty):
     """
-    `LocalSecondaryIndex <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-lsi.html>`__
+    `LocalSecondaryIndex <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-localsecondaryindex.html>`__
     """
 
     props: PropsDictType = {
@@ -131,7 +131,7 @@ class LocalSecondaryIndex(AWSProperty):
 
 class ContributorInsightsSpecification(AWSProperty):
     """
-    `ContributorInsightsSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-contributorinsightsspecification.html>`__
+    `ContributorInsightsSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-contributorinsightsspecification.html>`__
     """
 
     props: PropsDictType = {
@@ -201,7 +201,7 @@ class ReplicaSpecification(AWSProperty):
 
 class StreamSpecification(AWSProperty):
     """
-    `StreamSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-streamspecification.html>`__
+    `StreamSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-streamspecification.html>`__
     """
 
     props: PropsDictType = {
@@ -211,7 +211,7 @@ class StreamSpecification(AWSProperty):
 
 class TimeToLiveSpecification(AWSProperty):
     """
-    `TimeToLiveSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-timetolivespecification.html>`__
+    `TimeToLiveSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-timetolivespecification.html>`__
     """
 
     props: PropsDictType = {
@@ -247,7 +247,7 @@ class GlobalTable(AWSObject):
 
 class ProvisionedThroughput(AWSProperty):
     """
-    `ProvisionedThroughput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-provisionedthroughput.html>`__
+    `ProvisionedThroughput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-provisionedthroughput.html>`__
     """
 
     props: PropsDictType = {
@@ -258,7 +258,7 @@ class ProvisionedThroughput(AWSProperty):
 
 class GlobalSecondaryIndex(AWSProperty):
     """
-    `GlobalSecondaryIndex <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-gsi.html>`__
+    `GlobalSecondaryIndex <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-globalsecondaryindex.html>`__
     """
 
     props: PropsDictType = {
@@ -270,9 +270,55 @@ class GlobalSecondaryIndex(AWSProperty):
     }
 
 
+class Csv(AWSProperty):
+    """
+    `Csv <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-csv.html>`__
+    """
+
+    props: PropsDictType = {
+        "Delimiter": (str, False),
+        "HeaderList": ([str], False),
+    }
+
+
+class InputFormatOptions(AWSProperty):
+    """
+    `InputFormatOptions <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-inputformatoptions.html>`__
+    """
+
+    props: PropsDictType = {
+        "Csv": (Csv, False),
+    }
+
+
+class S3BucketSource(AWSProperty):
+    """
+    `S3BucketSource <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-s3bucketsource.html>`__
+    """
+
+    props: PropsDictType = {
+        "S3Bucket": (str, True),
+        "S3BucketOwner": (str, False),
+        "S3KeyPrefix": (str, False),
+    }
+
+
+class ImportSourceSpecification(AWSProperty):
+    """
+    `ImportSourceSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-importsourcespecification.html>`__
+    """
+
+    props: PropsDictType = {
+        "InputCompressionType": (str, False),
+        "InputFormat": (str, True),
+        "InputFormatOptions": (InputFormatOptions, False),
+        "S3BucketSource": (S3BucketSource, True),
+    }
+
+
 class KinesisStreamSpecification(AWSProperty):
     """
-    `KinesisStreamSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-kinesisstreamspecification.html>`__
+    `KinesisStreamSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-kinesisstreamspecification.html>`__
     """
 
     props: PropsDictType = {
@@ -304,6 +350,7 @@ class Table(AWSObject):
         "BillingMode": (billing_mode_validator, False),
         "ContributorInsightsSpecification": (ContributorInsightsSpecification, False),
         "GlobalSecondaryIndexes": ([GlobalSecondaryIndex], False),
+        "ImportSourceSpecification": (ImportSourceSpecification, False),
         "KeySchema": ([KeySchema], True),
         "KinesisStreamSpecification": (KinesisStreamSpecification, False),
         "LocalSecondaryIndexes": ([LocalSecondaryIndex], False),
diff --git a/troposphere/ec2.py b/troposphere/ec2.py
index f68d75db..e80e7ff3 100644
--- a/troposphere/ec2.py
+++ b/troposphere/ec2.py
@@ -578,7 +578,7 @@ class EC2Fleet(AWSObject):
 
 class EIP(AWSObject):
     """
-    `EIP <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html>`__
+    `EIP <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eip.html>`__
     """
 
     resource_type = "AWS::EC2::EIP"
@@ -748,6 +748,7 @@ class IPAMPool(AWSObject):
         "AllocationMinNetmaskLength": (integer, False),
         "AllocationResourceTags": (Tags, False),
         "AutoImport": (boolean, False),
+        "AwsService": (str, False),
         "Description": (str, False),
         "IpamScopeId": (str, True),
         "Locale": (str, False),
@@ -1397,6 +1398,7 @@ class LaunchTemplate(AWSObject):
         "LaunchTemplateData": (LaunchTemplateData, True),
         "LaunchTemplateName": (str, False),
         "TagSpecifications": ([TagSpecifications], False),
+        "VersionDescription": (str, False),
     }
 
 
@@ -2575,7 +2577,7 @@ class VpnTunnelOptionsSpecification(AWSProperty):
 
 class VPNConnection(AWSObject):
     """
-    `VPNConnection <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html>`__
+    `VPNConnection <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnection.html>`__
     """
 
     resource_type = "AWS::EC2::VPNConnection"
diff --git a/troposphere/eks.py b/troposphere/eks.py
index da50ca2b..0c6d5523 100644
--- a/troposphere/eks.py
+++ b/troposphere/eks.py
@@ -100,6 +100,17 @@ class Logging(AWSProperty):
     }
 
 
+class OutpostConfig(AWSProperty):
+    """
+    `OutpostConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-outpostconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "ControlPlaneInstanceType": (str, True),
+        "OutpostArns": ([str], True),
+    }
+
+
 class ResourcesVpcConfig(AWSProperty):
     """
     `ResourcesVpcConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html>`__
@@ -126,6 +137,7 @@ class Cluster(AWSObject):
         "KubernetesNetworkConfig": (KubernetesNetworkConfig, False),
         "Logging": (Logging, False),
         "Name": (str, False),
+        "OutpostConfig": (OutpostConfig, False),
         "ResourcesVpcConfig": (ResourcesVpcConfig, True),
         "RoleArn": (str, True),
         "Tags": (Tags, False),
diff --git a/troposphere/elasticache.py b/troposphere/elasticache.py
index d08c5975..54643f5f 100644
--- a/troposphere/elasticache.py
+++ b/troposphere/elasticache.py
@@ -89,6 +89,7 @@ class CacheCluster(AWSObject):
         "SnapshotRetentionLimit": (integer, False),
         "SnapshotWindow": (str, False),
         "Tags": (Tags, False),
+        "TransitEncryptionEnabled": (boolean, False),
         "VpcSecurityGroupIds": ([str], False),
     }
 
@@ -258,7 +259,7 @@ class SecurityGroupIngress(AWSObject):
 
 class SubnetGroup(AWSObject):
     """
-    `SubnetGroup <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-subnetgroup.html>`__
+    `SubnetGroup <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html>`__
     """
 
     resource_type = "AWS::ElastiCache::SubnetGroup"
diff --git a/troposphere/elasticbeanstalk.py b/troposphere/elasticbeanstalk.py
index 7ebb257a..b17d6d72 100644
--- a/troposphere/elasticbeanstalk.py
+++ b/troposphere/elasticbeanstalk.py
@@ -77,7 +77,7 @@ class Application(AWSObject):
 
 class SourceBundle(AWSProperty):
     """
-    `SourceBundle <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-beanstalk-sourcebundle.html>`__
+    `SourceBundle <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-applicationversion-sourcebundle.html>`__
     """
 
     props: PropsDictType = {
@@ -88,7 +88,7 @@ class SourceBundle(AWSProperty):
 
 class ApplicationVersion(AWSObject):
     """
-    `ApplicationVersion <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-beanstalk-version.html>`__
+    `ApplicationVersion <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-applicationversion.html>`__
     """
 
     resource_type = "AWS::ElasticBeanstalk::ApplicationVersion"
diff --git a/troposphere/evidently.py b/troposphere/evidently.py
index b085aa81..cebdfd88 100644
--- a/troposphere/evidently.py
+++ b/troposphere/evidently.py
@@ -234,6 +234,17 @@ class Launch(AWSObject):
     }
 
 
+class AppConfigResourceObject(AWSProperty):
+    """
+    `AppConfigResourceObject <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-appconfigresourceobject.html>`__
+    """
+
+    props: PropsDictType = {
+        "ApplicationId": (str, True),
+        "EnvironmentId": (str, True),
+    }
+
+
 class S3Destination(AWSProperty):
     """
     `S3Destination <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-s3destination.html>`__
@@ -264,6 +275,7 @@ class Project(AWSObject):
     resource_type = "AWS::Evidently::Project"
 
     props: PropsDictType = {
+        "AppConfigResource": (AppConfigResourceObject, False),
         "DataDelivery": (DataDeliveryObject, False),
         "Description": (str, False),
         "Name": (str, True),
diff --git a/troposphere/fms.py b/troposphere/fms.py
index 37c0c9e8..bed72e55 100644
--- a/troposphere/fms.py
+++ b/troposphere/fms.py
@@ -35,6 +35,49 @@ class IEMap(AWSProperty):
     }
 
 
+class NetworkFirewallPolicy(AWSProperty):
+    """
+    `NetworkFirewallPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html>`__
+    """
+
+    props: PropsDictType = {
+        "FirewallDeploymentModel": (str, True),
+    }
+
+
+class ThirdPartyFirewallPolicy(AWSProperty):
+    """
+    `ThirdPartyFirewallPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-thirdpartyfirewallpolicy.html>`__
+    """
+
+    props: PropsDictType = {
+        "FirewallDeploymentModel": (str, True),
+    }
+
+
+class PolicyOption(AWSProperty):
+    """
+    `PolicyOption <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-policyoption.html>`__
+    """
+
+    props: PropsDictType = {
+        "NetworkFirewallPolicy": (NetworkFirewallPolicy, False),
+        "ThirdPartyFirewallPolicy": (ThirdPartyFirewallPolicy, False),
+    }
+
+
+class SecurityServicePolicyData(AWSProperty):
+    """
+    `SecurityServicePolicyData <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-securityservicepolicydata.html>`__
+    """
+
+    props: PropsDictType = {
+        "ManagedServiceData": (str, False),
+        "PolicyOption": (PolicyOption, False),
+        "Type": (str, True),
+    }
+
+
 class Policy(AWSObject):
     """
     `Policy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html>`__
diff --git a/troposphere/glue.py b/troposphere/glue.py
index 355e2230..9957031b 100644
--- a/troposphere/glue.py
+++ b/troposphere/glue.py
@@ -440,12 +440,14 @@ class Job(AWSObject):
         "Connections": (ConnectionsList, False),
         "DefaultArguments": (dict, False),
         "Description": (str, False),
+        "ExecutionClass": (str, False),
         "ExecutionProperty": (ExecutionProperty, False),
         "GlueVersion": (str, False),
         "LogUri": (str, False),
         "MaxCapacity": (double, False),
         "MaxRetries": (double, False),
         "Name": (str, False),
+        "NonOverridableArguments": (dict, False),
         "NotificationProperty": (NotificationProperty, False),
         "NumberOfWorkers": (integer, False),
         "Role": (str, True),
@@ -882,6 +884,17 @@ class Action(AWSProperty):
     }
 
 
+class EventBatchingCondition(AWSProperty):
+    """
+    `EventBatchingCondition <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-eventbatchingcondition.html>`__
+    """
+
+    props: PropsDictType = {
+        "BatchSize": (integer, True),
+        "BatchWindow": (integer, False),
+    }
+
+
 class Condition(AWSProperty):
     """
     `Condition <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-condition.html>`__
@@ -917,6 +930,7 @@ class Trigger(AWSObject):
     props: PropsDictType = {
         "Actions": ([Action], True),
         "Description": (str, False),
+        "EventBatchingCondition": (EventBatchingCondition, False),
         "Name": (str, False),
         "Predicate": (Predicate, False),
         "Schedule": (str, False),
@@ -937,6 +951,7 @@ class Workflow(AWSObject):
     props: PropsDictType = {
         "DefaultRunProperties": (dict, False),
         "Description": (str, False),
+        "MaxConcurrentRuns": (integer, False),
         "Name": (str, False),
         "Tags": (dict, False),
     }
diff --git a/troposphere/greengrassv2.py b/troposphere/greengrassv2.py
index 4648d38b..978808a2 100644
--- a/troposphere/greengrassv2.py
+++ b/troposphere/greengrassv2.py
@@ -7,7 +7,7 @@
 
 
 from . import AWSObject, AWSProperty, PropsDictType
-from .validators import boolean, integer
+from .validators import boolean, double, integer
 
 
 class ComponentDependencyRequirement(AWSProperty):
@@ -139,3 +139,177 @@ class ComponentVersion(AWSObject):
         "LambdaFunction": (LambdaFunctionRecipeSource, False),
         "Tags": (dict, False),
     }
+
+
+class ComponentConfigurationUpdate(AWSProperty):
+    """
+    `ComponentConfigurationUpdate <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentconfigurationupdate.html>`__
+    """
+
+    props: PropsDictType = {
+        "Merge": (str, False),
+        "Reset": ([str], False),
+    }
+
+
+class SystemResourceLimits(AWSProperty):
+    """
+    `SystemResourceLimits <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-systemresourcelimits.html>`__
+    """
+
+    props: PropsDictType = {
+        "Cpus": (double, False),
+        "Memory": (integer, False),
+    }
+
+
+class ComponentRunWith(AWSProperty):
+    """
+    `ComponentRunWith <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentrunwith.html>`__
+    """
+
+    props: PropsDictType = {
+        "PosixUser": (str, False),
+        "SystemResourceLimits": (SystemResourceLimits, False),
+        "WindowsUser": (str, False),
+    }
+
+
+class ComponentDeploymentSpecification(AWSProperty):
+    """
+    `ComponentDeploymentSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentdeploymentspecification.html>`__
+    """
+
+    props: PropsDictType = {
+        "ComponentVersion": (str, False),
+        "ConfigurationUpdate": (ComponentConfigurationUpdate, False),
+        "RunWith": (ComponentRunWith, False),
+    }
+
+
+class IoTJobAbortCriteria(AWSProperty):
+    """
+    `IoTJobAbortCriteria <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobabortcriteria.html>`__
+    """
+
+    props: PropsDictType = {
+        "Action": (str, True),
+        "FailureType": (str, True),
+        "MinNumberOfExecutedThings": (integer, True),
+        "ThresholdPercentage": (double, True),
+    }
+
+
+class IoTJobAbortConfig(AWSProperty):
+    """
+    `IoTJobAbortConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobabortconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "CriteriaList": ([IoTJobAbortCriteria], True),
+    }
+
+
+class IoTJobRateIncreaseCriteria(AWSProperty):
+    props: PropsDictType = {
+        "NumberOfNotifiedThings": (integer, False),
+        "NumberOfSucceededThings": (integer, False),
+    }
+
+
+class IoTJobExponentialRolloutRate(AWSProperty):
+    """
+    `IoTJobExponentialRolloutRate <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobexponentialrolloutrate.html>`__
+    """
+
+    props: PropsDictType = {
+        "BaseRatePerMinute": (integer, True),
+        "IncrementFactor": (double, True),
+        "RateIncreaseCriteria": (IoTJobRateIncreaseCriteria, True),
+    }
+
+
+class IoTJobExecutionsRolloutConfig(AWSProperty):
+    """
+    `IoTJobExecutionsRolloutConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobexecutionsrolloutconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "ExponentialRate": (IoTJobExponentialRolloutRate, False),
+        "MaximumPerMinute": (integer, False),
+    }
+
+
+class IoTJobTimeoutConfig(AWSProperty):
+    """
+    `IoTJobTimeoutConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobtimeoutconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "InProgressTimeoutInMinutes": (integer, False),
+    }
+
+
+class DeploymentIoTJobConfiguration(AWSProperty):
+    """
+    `DeploymentIoTJobConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentiotjobconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "AbortConfig": (IoTJobAbortConfig, False),
+        "JobExecutionsRolloutConfig": (IoTJobExecutionsRolloutConfig, False),
+        "TimeoutConfig": (IoTJobTimeoutConfig, False),
+    }
+
+
+class DeploymentComponentUpdatePolicy(AWSProperty):
+    """
+    `DeploymentComponentUpdatePolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentcomponentupdatepolicy.html>`__
+    """
+
+    props: PropsDictType = {
+        "Action": (str, False),
+        "TimeoutInSeconds": (integer, False),
+    }
+
+
+class DeploymentConfigurationValidationPolicy(AWSProperty):
+    """
+    `DeploymentConfigurationValidationPolicy <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentconfigurationvalidationpolicy.html>`__
+    """
+
+    props: PropsDictType = {
+        "TimeoutInSeconds": (integer, False),
+    }
+
+
+class DeploymentPolicies(AWSProperty):
+    """
+    `DeploymentPolicies <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentpolicies.html>`__
+    """
+
+    props: PropsDictType = {
+        "ComponentUpdatePolicy": (DeploymentComponentUpdatePolicy, False),
+        "ConfigurationValidationPolicy": (
+            DeploymentConfigurationValidationPolicy,
+            False,
+        ),
+        "FailureHandlingPolicy": (str, False),
+    }
+
+
+class Deployment(AWSObject):
+    """
+    `Deployment <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-deployment.html>`__
+    """
+
+    resource_type = "AWS::GreengrassV2::Deployment"
+
+    props: PropsDictType = {
+        "Components": (dict, False),
+        "DeploymentName": (str, False),
+        "DeploymentPolicies": (DeploymentPolicies, False),
+        "IotJobConfiguration": (DeploymentIoTJobConfiguration, False),
+        "Tags": (dict, False),
+        "TargetArn": (str, True),
+    }
diff --git a/troposphere/imagebuilder.py b/troposphere/imagebuilder.py
index 067ef528..aaf25e5f 100644
--- a/troposphere/imagebuilder.py
+++ b/troposphere/imagebuilder.py
@@ -37,6 +37,17 @@ class Component(AWSObject):
     }
 
 
+class ComponentParameter(AWSProperty):
+    """
+    `ComponentParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentparameter.html>`__
+    """
+
+    props: PropsDictType = {
+        "Name": (str, True),
+        "Value": ([str], True),
+    }
+
+
 class ContainerComponentConfiguration(AWSProperty):
     """
     `ContainerComponentConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-componentconfiguration.html>`__
@@ -44,6 +55,7 @@ class ContainerComponentConfiguration(AWSProperty):
 
     props: PropsDictType = {
         "ComponentArn": (str, False),
+        "Parameters": ([ComponentParameter], False),
     }
 
 
@@ -332,17 +344,6 @@ class AdditionalInstanceConfiguration(AWSProperty):
     }
 
 
-class ComponentParameter(AWSProperty):
-    """
-    `ComponentParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentparameter.html>`__
-    """
-
-    props: PropsDictType = {
-        "Name": (str, True),
-        "Value": ([str], True),
-    }
-
-
 class ComponentConfiguration(AWSProperty):
     """
     `ComponentConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentconfiguration.html>`__
diff --git a/troposphere/iot.py b/troposphere/iot.py
index 01985fcd..8aec5fad 100644
--- a/troposphere/iot.py
+++ b/troposphere/iot.py
@@ -136,6 +136,7 @@ class CACertificate(AWSObject):
         "CACertificatePem": (str, True),
         "CertificateMode": (str, False),
         "RegistrationConfig": (RegistrationConfig, False),
+        "RemoveAutoRegistration": (boolean, False),
         "Status": (str, True),
         "Tags": (Tags, False),
         "VerificationCertificatePem": (str, False),
diff --git a/troposphere/iotsitewise.py b/troposphere/iotsitewise.py
index a7c68f55..e88ddce2 100644
--- a/troposphere/iotsitewise.py
+++ b/troposphere/iotsitewise.py
@@ -116,6 +116,7 @@ class AssetProperty(AWSProperty):
         "Alias": (str, False),
         "LogicalId": (str, True),
         "NotificationState": (str, False),
+        "Unit": (str, False),
     }
 
 
diff --git a/troposphere/iotwireless.py b/troposphere/iotwireless.py
index cae9e160..205b13ed 100644
--- a/troposphere/iotwireless.py
+++ b/troposphere/iotwireless.py
@@ -35,6 +35,7 @@ class LoRaWANDeviceProfile(AWSProperty):
     props: PropsDictType = {
         "ClassBTimeout": (integer, False),
         "ClassCTimeout": (integer, False),
+        "FactoryPresetFreqsList": ([integer], False),
         "MacVersion": (str, False),
         "MaxDutyCycle": (integer, False),
         "MaxEirp": (integer, False),
@@ -43,6 +44,10 @@ class LoRaWANDeviceProfile(AWSProperty):
         "PingSlotPeriod": (integer, False),
         "RegParamsRevision": (str, False),
         "RfRegion": (str, False),
+        "RxDataRate2": (integer, False),
+        "RxDelay1": (integer, False),
+        "RxDrOffset1": (integer, False),
+        "RxFreq2": (integer, False),
         "Supports32BitFCnt": (boolean, False),
         "SupportsClassB": (boolean, False),
         "SupportsClassC": (boolean, False),
@@ -417,4 +422,5 @@ class WirelessGateway(AWSObject):
         "Name": (str, False),
         "Tags": (Tags, False),
         "ThingArn": (str, False),
+        "ThingName": (str, False),
     }
diff --git a/troposphere/lex.py b/troposphere/lex.py
index 948cb21a..e448fa74 100644
--- a/troposphere/lex.py
+++ b/troposphere/lex.py
@@ -216,6 +216,76 @@ class IntentClosingSetting(AWSProperty):
     }
 
 
+class AllowedInputTypes(AWSProperty):
+    """
+    `AllowedInputTypes <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-allowedinputtypes.html>`__
+    """
+
+    props: PropsDictType = {
+        "AllowAudioInput": (boolean, True),
+        "AllowDTMFInput": (boolean, True),
+    }
+
+
+class AudioSpecification(AWSProperty):
+    """
+    `AudioSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiospecification.html>`__
+    """
+
+    props: PropsDictType = {
+        "EndTimeoutMs": (integer, True),
+        "MaxLengthMs": (integer, True),
+    }
+
+
+class DTMFSpecification(AWSProperty):
+    """
+    `DTMFSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dtmfspecification.html>`__
+    """
+
+    props: PropsDictType = {
+        "DeletionCharacter": (str, True),
+        "EndCharacter": (str, True),
+        "EndTimeoutMs": (integer, True),
+        "MaxLength": (integer, True),
+    }
+
+
+class AudioAndDTMFInputSpecification(AWSProperty):
+    """
+    `AudioAndDTMFInputSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audioanddtmfinputspecification.html>`__
+    """
+
+    props: PropsDictType = {
+        "AudioSpecification": (AudioSpecification, False),
+        "DTMFSpecification": (DTMFSpecification, False),
+        "StartTimeoutMs": (integer, True),
+    }
+
+
+class TextInputSpecification(AWSProperty):
+    """
+    `TextInputSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-textinputspecification.html>`__
+    """
+
+    props: PropsDictType = {
+        "StartTimeoutMs": (integer, True),
+    }
+
+
+class PromptAttemptSpecification(AWSProperty):
+    """
+    `PromptAttemptSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptattemptspecification.html>`__
+    """
+
+    props: PropsDictType = {
+        "AllowInterrupt": (boolean, False),
+        "AllowedInputTypes": (AllowedInputTypes, True),
+        "AudioAndDTMFInputSpecification": (AudioAndDTMFInputSpecification, False),
+        "TextInputSpecification": (TextInputSpecification, False),
+    }
+
+
 class PromptSpecification(AWSProperty):
     """
     `PromptSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptspecification.html>`__
@@ -226,6 +296,7 @@ class PromptSpecification(AWSProperty):
         "MaxRetries": (integer, True),
         "MessageGroupsList": ([MessageGroup], True),
         "MessageSelectionStrategy": (str, False),
+        "PromptAttemptsSpecification": (dict, False),
     }
 
 
@@ -509,6 +580,7 @@ class VoiceSettings(AWSProperty):
     """
 
     props: PropsDictType = {
+        "Engine": (str, False),
         "VoiceId": (str, True),
     }
 
diff --git a/troposphere/logs.py b/troposphere/logs.py
index d6dddc36..e0893e77 100644
--- a/troposphere/logs.py
+++ b/troposphere/logs.py
@@ -24,7 +24,7 @@ class Destination(AWSObject):
 
     props: PropsDictType = {
         "DestinationName": (str, True),
-        "DestinationPolicy": (str, True),
+        "DestinationPolicy": (str, False),
         "RoleArn": (str, True),
         "TargetArn": (str, True),
     }
diff --git a/troposphere/macie.py b/troposphere/macie.py
index d9512440..c42ca97c 100644
--- a/troposphere/macie.py
+++ b/troposphere/macie.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 integer
 from .validators.macie import (
     findingsfilter_action,
@@ -15,6 +15,43 @@ from .validators.macie import (
 )
 
 
+class S3WordsList(AWSProperty):
+    """
+    `S3WordsList <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-allowlist-s3wordslist.html>`__
+    """
+
+    props: PropsDictType = {
+        "BucketName": (str, True),
+        "ObjectKey": (str, True),
+    }
+
+
+class Criteria(AWSProperty):
+    """
+    `Criteria <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-allowlist-criteria.html>`__
+    """
+
+    props: PropsDictType = {
+        "Regex": (str, False),
+        "S3WordsList": (S3WordsList, False),
+    }
+
+
+class AllowList(AWSObject):
+    """
+    `AllowList <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-allowlist.html>`__
+    """
+
+    resource_type = "AWS::Macie::AllowList"
+
+    props: PropsDictType = {
+        "Criteria": (Criteria, True),
+        "Description": (str, False),
+        "Name": (str, True),
+        "Tags": (Tags, False),
+    }
+
+
 class CustomDataIdentifier(AWSObject):
     """
     `CustomDataIdentifier <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-customdataidentifier.html>`__
diff --git a/troposphere/mediapackage.py b/troposphere/mediapackage.py
index 32bafac1..c016cf39 100644
--- a/troposphere/mediapackage.py
+++ b/troposphere/mediapackage.py
@@ -97,6 +97,7 @@ class OriginEndpointCmafEncryption(AWSProperty):
 
     props: PropsDictType = {
         "ConstantInitializationVector": (str, False),
+        "EncryptionMethod": (str, False),
         "KeyRotationIntervalSeconds": (integer, False),
         "SpekeKeyProvider": (OriginEndpointSpekeKeyProvider, True),
     }
diff --git a/troposphere/msk.py b/troposphere/msk.py
index fd9dcf82..1f59a992 100644
--- a/troposphere/msk.py
+++ b/troposphere/msk.py
@@ -92,7 +92,7 @@ class BrokerNodeGroupInfo(AWSProperty):
 
 class Iam(AWSProperty):
     """
-    `Iam <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-iam.html>`__
+    `Iam <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-iam.html>`__
     """
 
     props: PropsDictType = {
@@ -313,6 +313,7 @@ class Cluster(AWSObject):
         "LoggingInfo": (LoggingInfo, False),
         "NumberOfBrokerNodes": (integer, True),
         "OpenMonitoring": (OpenMonitoring, False),
+        "StorageMode": (str, False),
         "Tags": (dict, False),
     }
 
@@ -330,3 +331,29 @@ class Configuration(AWSObject):
         "Name": (str, True),
         "ServerProperties": (str, True),
     }
+
+
+class VpcConfig(AWSProperty):
+    """
+    `VpcConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-vpcconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "SecurityGroups": ([str], False),
+        "SubnetIds": ([str], True),
+    }
+
+
+class ServerlessCluster(AWSObject):
+    """
+    `ServerlessCluster <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-serverlesscluster.html>`__
+    """
+
+    resource_type = "AWS::MSK::ServerlessCluster"
+
+    props: PropsDictType = {
+        "ClientAuthentication": (ClientAuthentication, True),
+        "ClusterName": (str, True),
+        "Tags": (dict, False),
+        "VpcConfigs": ([VpcConfig], True),
+    }
diff --git a/troposphere/opensearchservice.py b/troposphere/opensearchservice.py
index 62e60c24..44d781e6 100644
--- a/troposphere/opensearchservice.py
+++ b/troposphere/opensearchservice.py
@@ -99,6 +99,7 @@ class EBSOptions(AWSProperty):
     props: PropsDictType = {
         "EBSEnabled": (boolean, False),
         "Iops": (integer, False),
+        "Throughput": (integer, False),
         "VolumeSize": (integer, False),
         "VolumeType": (str, False),
     }
diff --git a/troposphere/rds.py b/troposphere/rds.py
index 5d9d8d33..b2b5a3f5 100644
--- a/troposphere/rds.py
+++ b/troposphere/rds.py
@@ -7,7 +7,7 @@
 
 
 from . import AWSObject, AWSProperty, PropsDictType, Tags
-from .validators import boolean, integer
+from .validators import boolean, double, integer
 from .validators.rds import (
     validate_backtrack_window,
     validate_backup_retention_period,
@@ -48,6 +48,17 @@ class ScalingConfiguration(AWSProperty):
     }
 
 
+class ServerlessV2ScalingConfiguration(AWSProperty):
+    """
+    `ServerlessV2ScalingConfiguration <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-serverlessv2scalingconfiguration.html>`__
+    """
+
+    props: PropsDictType = {
+        "MaxCapacity": (double, False),
+        "MinCapacity": (double, False),
+    }
+
+
 class DBCluster(AWSObject):
     """
     `DBCluster <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html>`__
@@ -56,16 +67,22 @@ class DBCluster(AWSObject):
     resource_type = "AWS::RDS::DBCluster"
 
     props: PropsDictType = {
+        "AllocatedStorage": (integer, False),
         "AssociatedRoles": ([DBClusterRole], False),
+        "AutoMinorVersionUpgrade": (boolean, False),
         "AvailabilityZones": ([str], False),
         "BacktrackWindow": (validate_backtrack_window, False),
         "BackupRetentionPeriod": (validate_backup_retention_period, False),
         "CopyTagsToSnapshot": (boolean, False),
         "DBClusterIdentifier": (str, False),
+        "DBClusterInstanceClass": (str, False),
         "DBClusterParameterGroupName": (str, False),
+        "DBInstanceParameterGroupName": (str, False),
         "DBSubnetGroupName": (str, False),
         "DatabaseName": (str, False),
         "DeletionProtection": (boolean, False),
+        "Domain": (str, False),
+        "DomainIAMRoleName": (str, False),
         "EnableCloudwatchLogsExports": ([str], False),
         "EnableHttpEndpoint": (boolean, False),
         "EnableIAMDatabaseAuthentication": (boolean, False),
@@ -73,19 +90,29 @@ class DBCluster(AWSObject):
         "EngineMode": (validate_engine_mode, False),
         "EngineVersion": (str, False),
         "GlobalClusterIdentifier": (str, False),
+        "Iops": (integer, False),
         "KmsKeyId": (str, False),
         "MasterUserPassword": (str, False),
         "MasterUsername": (str, False),
+        "MonitoringInterval": (integer, False),
+        "MonitoringRoleArn": (str, False),
+        "NetworkType": (str, False),
+        "PerformanceInsightsEnabled": (boolean, False),
+        "PerformanceInsightsKmsKeyId": (str, False),
+        "PerformanceInsightsRetentionPeriod": (integer, False),
         "Port": (validate_network_port, False),
         "PreferredBackupWindow": (validate_backup_window, False),
         "PreferredMaintenanceWindow": (str, False),
+        "PubliclyAccessible": (boolean, False),
         "ReplicationSourceIdentifier": (str, False),
         "RestoreType": (str, False),
         "ScalingConfiguration": (ScalingConfiguration, False),
+        "ServerlessV2ScalingConfiguration": (ServerlessV2ScalingConfiguration, False),
         "SnapshotIdentifier": (str, False),
         "SourceDBClusterIdentifier": (str, False),
         "SourceRegion": (str, False),
         "StorageEncrypted": (boolean, False),
+        "StorageType": (str, False),
         "Tags": (validate_tags_or_list, False),
         "UseLatestRestorableTime": (boolean, False),
         "VpcSecurityGroupIds": ([str], False),
@@ -131,7 +158,7 @@ class ProcessorFeature(AWSProperty):
 
 class DBInstance(AWSObject):
     """
-    `DBInstance <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html>`__
+    `DBInstance <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html>`__
     """
 
     resource_type = "AWS::RDS::DBInstance"
@@ -146,8 +173,9 @@ class DBInstance(AWSObject):
         "CACertificateIdentifier": (str, False),
         "CharacterSetName": (str, False),
         "CopyTagsToSnapshot": (boolean, False),
+        "CustomIAMInstanceProfile": (str, False),
         "DBClusterIdentifier": (str, False),
-        "DBInstanceClass": (str, True),
+        "DBInstanceClass": (str, False),
         "DBInstanceIdentifier": (str, False),
         "DBName": (str, False),
         "DBParameterGroupName": (str, False),
@@ -172,6 +200,8 @@ class DBInstance(AWSObject):
         "MonitoringInterval": (integer, False),
         "MonitoringRoleArn": (str, False),
         "MultiAZ": (boolean, False),
+        "NcharCharacterSetName": (str, False),
+        "NetworkType": (str, False),
         "OptionGroupName": (str, False),
         "PerformanceInsightsKMSKeyId": (str, False),
         "PerformanceInsightsRetentionPeriod": (integer, False),
@@ -429,3 +459,25 @@ class OptionGroup(AWSObject):
         "OptionGroupDescription": (str, True),
         "Tags": (validate_tags_or_list, False),
     }
+
+
+class Endpoint(AWSProperty):
+    """
+    `Endpoint <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-endpoint.html>`__
+    """
+
+    props: PropsDictType = {
+        "Address": (str, False),
+        "HostedZoneId": (str, False),
+        "Port": (str, False),
+    }
+
+
+class ReadEndpoint(AWSProperty):
+    """
+    `ReadEndpoint <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-readendpoint.html>`__
+    """
+
+    props: PropsDictType = {
+        "Address": (str, False),
+    }
diff --git a/troposphere/redshift.py b/troposphere/redshift.py
index bd674290..fb5b41c7 100644
--- a/troposphere/redshift.py
+++ b/troposphere/redshift.py
@@ -81,7 +81,7 @@ class Cluster(AWSObject):
 
 class AmazonRedshiftParameter(AWSProperty):
     """
-    `AmazonRedshiftParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-property-redshift-clusterparametergroup-parameter.html>`__
+    `AmazonRedshiftParameter <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-clusterparametergroup-parameter.html>`__
     """
 
     props: PropsDictType = {
@@ -147,6 +147,17 @@ class ClusterSubnetGroup(AWSObject):
     }
 
 
+class VpcSecurityGroup(AWSProperty):
+    """
+    `VpcSecurityGroup <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-vpcsecuritygroup.html>`__
+    """
+
+    props: PropsDictType = {
+        "Status": (str, False),
+        "VpcSecurityGroupId": (str, False),
+    }
+
+
 class EndpointAccess(AWSObject):
     """
     `EndpointAccess <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointaccess.html>`__
@@ -155,11 +166,13 @@ class EndpointAccess(AWSObject):
     resource_type = "AWS::Redshift::EndpointAccess"
 
     props: PropsDictType = {
-        "ClusterIdentifier": (str, False),
+        "ClusterIdentifier": (str, True),
         "EndpointName": (str, True),
         "ResourceOwner": (str, False),
-        "SubnetGroupName": (str, False),
+        "SubnetGroupName": (str, True),
+        "VpcEndpoint": (dict, False),
         "VpcSecurityGroupIds": ([str], True),
+        "VpcSecurityGroups": ([VpcSecurityGroup], False),
     }
 
 
@@ -271,14 +284,3 @@ class Endpoint(AWSProperty):
         "Address": (str, False),
         "Port": (str, False),
     }
-
-
-class VpcSecurityGroup(AWSProperty):
-    """
-    `VpcSecurityGroup <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-vpcsecuritygroup.html>`__
-    """
-
-    props: PropsDictType = {
-        "Status": (str, False),
-        "VpcSecurityGroupId": (str, False),
-    }
diff --git a/troposphere/route53recoveryreadiness.py b/troposphere/route53recoveryreadiness.py
index 2e0ef189..4979cf58 100644
--- a/troposphere/route53recoveryreadiness.py
+++ b/troposphere/route53recoveryreadiness.py
@@ -17,7 +17,7 @@ class Cell(AWSObject):
     resource_type = "AWS::Route53RecoveryReadiness::Cell"
 
     props: PropsDictType = {
-        "CellName": (str, True),
+        "CellName": (str, False),
         "Cells": ([str], False),
         "Tags": (Tags, False),
     }
@@ -31,7 +31,7 @@ class ReadinessCheck(AWSObject):
     resource_type = "AWS::Route53RecoveryReadiness::ReadinessCheck"
 
     props: PropsDictType = {
-        "ReadinessCheckName": (str, True),
+        "ReadinessCheckName": (str, False),
         "ResourceSetName": (str, False),
         "Tags": (Tags, False),
     }
@@ -46,7 +46,7 @@ class RecoveryGroup(AWSObject):
 
     props: PropsDictType = {
         "Cells": ([str], False),
-        "RecoveryGroupName": (str, True),
+        "RecoveryGroupName": (str, False),
         "Tags": (Tags, False),
     }
 
@@ -118,7 +118,7 @@ class ResourceSet(AWSObject):
     resource_type = "AWS::Route53RecoveryReadiness::ResourceSet"
 
     props: PropsDictType = {
-        "ResourceSetName": (str, True),
+        "ResourceSetName": (str, False),
         "ResourceSetType": (str, True),
         "Resources": ([Resource], True),
         "Tags": (Tags, False),
diff --git a/troposphere/s3.py b/troposphere/s3.py
index 8dd96634..f86c81d7 100644
--- a/troposphere/s3.py
+++ b/troposphere/s3.py
@@ -763,7 +763,6 @@ class Region(AWSProperty):
     """
 
     props: PropsDictType = {
-        "AccountId": (str, False),
         "Bucket": (str, True),
     }
 
@@ -945,3 +944,24 @@ class StorageLens(AWSObject):
         "StorageLensConfiguration": (StorageLensConfiguration, True),
         "Tags": (Tags, False),
     }
+
+
+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),
+    }
diff --git a/troposphere/sagemaker.py b/troposphere/sagemaker.py
index fdfe4dec..3701841c 100644
--- a/troposphere/sagemaker.py
+++ b/troposphere/sagemaker.py
@@ -160,6 +160,52 @@ class DataQualityBaselineConfig(AWSProperty):
     }
 
 
+class Csv(AWSProperty):
+    """
+    `Csv <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-csv.html>`__
+    """
+
+    props: PropsDictType = {
+        "Header": (boolean, False),
+    }
+
+
+class Json(AWSProperty):
+    """
+    `Json <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-json.html>`__
+    """
+
+    props: PropsDictType = {
+        "Line": (boolean, False),
+    }
+
+
+class DatasetFormat(AWSProperty):
+    """
+    `DatasetFormat <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-datasetformat.html>`__
+    """
+
+    props: PropsDictType = {
+        "Csv": (Csv, False),
+        "Json": (Json, False),
+        "Parquet": (boolean, False),
+    }
+
+
+class BatchTransformInput(AWSProperty):
+    """
+    `BatchTransformInput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-batchtransforminput.html>`__
+    """
+
+    props: PropsDictType = {
+        "DataCapturedDestinationS3Uri": (str, True),
+        "DatasetFormat": (DatasetFormat, True),
+        "LocalPath": (str, True),
+        "S3DataDistributionType": (str, False),
+        "S3InputMode": (str, False),
+    }
+
+
 class EndpointInput(AWSProperty):
     """
     `EndpointInput <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-endpointinput.html>`__
@@ -179,7 +225,8 @@ class DataQualityJobInput(AWSProperty):
     """
 
     props: PropsDictType = {
-        "EndpointInput": (EndpointInput, True),
+        "BatchTransformInput": (BatchTransformInput, False),
+        "EndpointInput": (EndpointInput, False),
     }
 
 
@@ -638,6 +685,85 @@ class DataCaptureConfig(AWSProperty):
     }
 
 
+class ClarifyInferenceConfig(AWSProperty):
+    """
+    `ClarifyInferenceConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "ContentTemplate": (str, False),
+        "FeatureHeaders": ([str], False),
+        "FeatureTypes": ([str], False),
+        "FeaturesAttribute": (str, False),
+        "LabelAttribute": (str, False),
+        "LabelHeaders": ([str], False),
+        "LabelIndex": (integer, False),
+        "MaxPayloadInMB": (integer, False),
+        "MaxRecordCount": (integer, False),
+        "ProbabilityAttribute": (str, False),
+        "ProbabilityIndex": (integer, False),
+    }
+
+
+class ClarifyShapBaselineConfig(AWSProperty):
+    """
+    `ClarifyShapBaselineConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapbaselineconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "MimeType": (str, False),
+        "ShapBaseline": (str, False),
+        "ShapBaselineUri": (str, False),
+    }
+
+
+class ClarifyTextConfig(AWSProperty):
+    """
+    `ClarifyTextConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifytextconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "Granularity": (str, True),
+        "Language": (str, True),
+    }
+
+
+class ClarifyShapConfig(AWSProperty):
+    """
+    `ClarifyShapConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "NumberOfSamples": (integer, False),
+        "Seed": (integer, False),
+        "ShapBaselineConfig": (ClarifyShapBaselineConfig, True),
+        "TextConfig": (ClarifyTextConfig, False),
+        "UseLogit": (boolean, False),
+    }
+
+
+class ClarifyExplainerConfig(AWSProperty):
+    """
+    `ClarifyExplainerConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyexplainerconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "EnableExplanations": (str, False),
+        "InferenceConfig": (ClarifyInferenceConfig, False),
+        "ShapConfig": (ClarifyShapConfig, True),
+    }
+
+
+class ExplainerConfig(AWSProperty):
+    """
+    `ExplainerConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-explainerconfig.html>`__
+    """
+
+    props: PropsDictType = {
+        "ClarifyExplainerConfig": (ClarifyExplainerConfig, False),
+    }
+
+
 class ServerlessConfig(AWSProperty):
     """
     `ServerlessConfig <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant-serverlessconfig.html>`__
@@ -656,12 +782,15 @@ class ProductionVariant(AWSProperty):
 
     props: PropsDictType = {
         "AcceleratorType": (str, False),
+        "ContainerStartupHealthCheckTimeoutInSeconds": (integer, False),
         "InitialInstanceCount": (integer, False),
         "InitialVariantWeight": (double, True),
         "InstanceType": (str, False),
+        "ModelDataDownloadTimeoutInSeconds": (integer, False),
         "ModelName": (str, True),
         "ServerlessConfig": (ServerlessConfig, False),
         "VariantName": (str, True),
+        "VolumeSizeInGB": (integer, False),
     }
 
 
@@ -676,6 +805,7 @@ class EndpointConfig(AWSObject):
         "AsyncInferenceConfig": (AsyncInferenceConfig, False),
         "DataCaptureConfig": (DataCaptureConfig, False),
         "EndpointConfigName": (str, False),
+        "ExplainerConfig": (ExplainerConfig, False),
         "KmsKeyId": (str, False),
         "ProductionVariants": ([ProductionVariant], True),
         "Tags": (Tags, False),
@@ -878,7 +1008,8 @@ class ModelBiasJobInput(AWSProperty):
     """
 
     props: PropsDictType = {
-        "EndpointInput": (ModelBiasEndpointInput, True),
+        "BatchTransformInput": (BatchTransformInput, False),
+        "EndpointInput": (ModelBiasEndpointInput, False),
         "GroundTruthS3Input": (MonitoringGroundTruthS3Input, True),
     }
 
@@ -950,7 +1081,8 @@ class ModelExplainabilityJobInput(AWSProperty):
     """
 
     props: PropsDictType = {
-        "EndpointInput": (ModelExplainabilityEndpointInput, True),
+        "BatchTransformInput": (BatchTransformInput, False),
+        "EndpointInput": (ModelExplainabilityEndpointInput, False),
     }
 
 
@@ -1433,7 +1565,8 @@ class ModelQualityJobInput(AWSProperty):
     """
 
     props: PropsDictType = {
-        "EndpointInput": (ModelQualityEndpointInput, True),
+        "BatchTransformInput": (BatchTransformInput, False),
+        "EndpointInput": (ModelQualityEndpointInput, False),
         "GroundTruthS3Input": (MonitoringGroundTruthS3Input, True),
     }
 
@@ -1508,7 +1641,8 @@ class MonitoringInput(AWSProperty):
     """
 
     props: PropsDictType = {
-        "EndpointInput": (EndpointInput, True),
+        "BatchTransformInput": (BatchTransformInput, False),
+        "EndpointInput": (EndpointInput, False),
     }
 
 
@@ -1754,3 +1888,15 @@ class RSessionAppSettings(AWSProperty):
         "CustomImages": ([CustomImage], False),
         "DefaultResourceSpec": (ResourceSpec, False),
     }
+
+
+class UserContext(AWSProperty):
+    """
+    `UserContext <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-usercontext.html>`__
+    """
+
+    props: PropsDictType = {
+        "DomainId": (str, False),
+        "UserProfileArn": (str, False),
+        "UserProfileName": (str, False),
+    }
diff --git a/troposphere/serverless.py b/troposphere/serverless.py
index 452c4d49..e45a3cea 100644
--- a/troposphere/serverless.py
+++ b/troposphere/serverless.py
@@ -10,6 +10,7 @@ from . import AWSHelperFn, AWSObject, AWSProperty, PropsDictType
 from .apigateway import AccessLogSetting, CanarySetting, MethodSetting
 from .apigatewayv2 import AccessLogSettings, RouteSettings
 from .awslambda import (
+    Cors,
     DestinationConfig,
     Environment,
     EphemeralStorage,
@@ -22,6 +23,7 @@ from .awslambda import (
 )
 from .dynamodb import ProvisionedThroughput, SSESpecification
 from .s3 import Filter
+from .stepfunctions import LoggingConfiguration, TracingConfiguration
 from .validators import (
     boolean,
     exactly_one,
@@ -132,6 +134,24 @@ class EventInvokeConfiguration(AWSProperty):
     }
 
 
+def validate_authtype(authtype):
+    VALID_AUTHTYPE = [
+        "AWS_IAM",
+        "NONE",
+    ]
+
+    if authtype not in VALID_AUTHTYPE:
+        raise ValueError("AuthType must be one of: %s" % ", ".join(VALID_AUTHTYPE))
+    return authtype
+
+
+class FunctionUrlConfig(AWSProperty):
+    props: PropsDictType = {
+        "AuthType": (validate_authtype, True),
+        "Cors": (Cors, False),
+    }
+
+
 class Function(AWSObject):
     resource_type = "AWS::Serverless::Function"
 
@@ -151,6 +171,7 @@ class Function(AWSObject):
         "Events": (dict, False),
         "FileSystemConfigs": ([FileSystemConfig], False),
         "FunctionName": (str, False),
+        "FunctionUrlConfig": (FunctionUrlConfig, False),
         "Handler": (str, False),
         "ImageConfig": (ImageConfig, False),
         "ImageUri": ((AWSHelperFn, str, dict), False),
@@ -656,6 +677,37 @@ class Application(AWSObject):
         mutually_exclusive(self.__class__.__name__, self.properties, conds)
 
 
+class StateMachine(AWSObject):
+    """
+    `StateMachine <https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html>`__
+    """
+
+    resource_type = "AWS::Serverless::StateMachine"
+
+    props: PropsDictType = {
+        "Definition": (dict, False),
+        "DefinitionUri": ((S3Location, str), False),
+        "DefinitionSubstitutions": (dict, False),
+        "Events": (dict, False),
+        "Logging": (LoggingConfiguration, False),
+        "Name": (str, False),
+        "PermissionsBoundary": (str, False),
+        "Policies": (policytypes, False),
+        "Role": (str, False),
+        "Tags": (dict, False),
+        "TracingConfiguration": (TracingConfiguration, False),
+        "Type": (str, False),
+    }
+
+    def validate(self):
+        if not self.properties.get("Policies") and not self.properties.get("Role"):
+            raise ValueError("You provide either a Role or Policies.")
+
+        valid_types = ["STANDARD", "EXPRESS"]
+        if "Type" in self.properties and self.properties["Type"] not in valid_types:
+            raise ValueError("StateMachine Type must be STANDARD or EXPRESS")
+
+
 class FunctionGlobals(AWSProperty):
     props: PropsDictType = {
         "AssumeRolePolicyDocument": (policytypes, False),
diff --git a/troposphere/ses.py b/troposphere/ses.py
index 92ebc291..e111bd3b 100644
--- a/troposphere/ses.py
+++ b/troposphere/ses.py
@@ -186,6 +186,7 @@ class DedicatedIpPool(AWSObject):
 
     props: PropsDictType = {
         "PoolName": (str, False),
+        "ScalingMode": (str, False),
     }
 
 
diff --git a/troposphere/sns.py b/troposphere/sns.py
index ba63d5b5..e56b849a 100644
--- a/troposphere/sns.py
+++ b/troposphere/sns.py
@@ -33,7 +33,7 @@ class SubscriptionResource(AWSObject):
 
 class Subscription(AWSProperty):
     """
-    `Subscription <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-subscription.html>`__
+    `Subscription <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic-subscription.html>`__
     """
 
     props: PropsDictType = {
@@ -44,16 +44,18 @@ class Subscription(AWSProperty):
 
 class Topic(AWSObject):
     """
-    `Topic <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html>`__
+    `Topic <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html>`__
     """
 
     resource_type = "AWS::SNS::Topic"
 
     props: PropsDictType = {
         "ContentBasedDeduplication": (boolean, False),
+        "DataProtectionPolicy": (dict, False),
         "DisplayName": (str, False),
         "FifoTopic": (boolean, False),
         "KmsMasterKeyId": (str, False),
+        "SignatureVersion": (str, False),
         "Subscription": ([Subscription], False),
         "Tags": (Tags, False),
         "TopicName": (str, False),
diff --git a/troposphere/transfer.py b/troposphere/transfer.py
index c83498a5..6fed2310 100644
--- a/troposphere/transfer.py
+++ b/troposphere/transfer.py
@@ -11,6 +11,75 @@ from .validators import double
 from .validators.transfer import validate_homedirectory_type
 
 
+class Agreement(AWSObject):
+    """
+    `Agreement <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-agreement.html>`__
+    """
+
+    resource_type = "AWS::Transfer::Agreement"
+
+    props: PropsDictType = {
+        "AccessRole": (str, True),
+        "BaseDirectory": (str, True),
+        "Description": (str, False),
+        "LocalProfileId": (str, True),
+        "PartnerProfileId": (str, True),
+        "ServerId": (str, True),
+        "Status": (str, False),
+        "Tags": (Tags, False),
+    }
+
+
+class Certificate(AWSObject):
+    """
+    `Certificate <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-certificate.html>`__
+    """
+
+    resource_type = "AWS::Transfer::Certificate"
+
+    props: PropsDictType = {
+        "ActiveDate": (str, False),
+        "Certificate": (str, True),
+        "CertificateChain": (str, False),
+        "Description": (str, False),
+        "InactiveDate": (str, False),
+        "PrivateKey": (str, False),
+        "Tags": (Tags, False),
+        "Usage": (str, True),
+    }
+
+
+class Connector(AWSObject):
+    """
+    `Connector <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-connector.html>`__
+    """
+
+    resource_type = "AWS::Transfer::Connector"
+
+    props: PropsDictType = {
+        "AccessRole": (str, True),
+        "As2Config": (dict, True),
+        "LoggingRole": (str, False),
+        "Tags": (Tags, False),
+        "Url": (str, True),
+    }
+
+
+class Profile(AWSObject):
+    """
+    `Profile <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-profile.html>`__
+    """
+
+    resource_type = "AWS::Transfer::Profile"
+
+    props: PropsDictType = {
+        "As2Id": (str, True),
+        "CertificateIds": ([str], False),
+        "ProfileType": (str, True),
+        "Tags": (Tags, False),
+    }
+
+
 class EndpointDetails(AWSProperty):
     """
     `EndpointDetails <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-endpointdetails.html>`__
@@ -68,7 +137,8 @@ class WorkflowDetails(AWSProperty):
     """
 
     props: PropsDictType = {
-        "OnUpload": ([WorkflowDetail], True),
+        "OnPartialUpload": ([WorkflowDetail], False),
+        "OnUpload": ([WorkflowDetail], False),
     }
 
 
diff --git a/troposphere/validators/elasticsearch.py b/troposphere/validators/elasticsearch.py
index 291a8b9d..1dd924af 100644
--- a/troposphere/validators/elasticsearch.py
+++ b/troposphere/validators/elasticsearch.py
@@ -35,7 +35,7 @@ def validate_volume_type(volume_type):
     Property: EBSOptions.VolumeType
     """
 
-    VALID_VOLUME_TYPES = ("standard", "gp2", "io1")
+    VALID_VOLUME_TYPES = ("standard", "gp2", "gp3", "io1")
 
     if volume_type not in VALID_VOLUME_TYPES:
         raise ValueError(


Test patch:
diff --git a/tests/test_language_extensions.py b/tests/test_language_extensions.py
new file mode 100644
index 00000000..a5770411
--- /dev/null
+++ b/tests/test_language_extensions.py
@@ -0,0 +1,68 @@
+import unittest
+
+from troposphere import AWSHelperFn, Parameter, Template
+from troposphere.sqs import Queue
+
+
+class TestServerless(unittest.TestCase):
+    def test_transform(self):
+        t = Template()
+        t.set_version("2010-09-09")
+        t.set_transform("AWS::LanguageExtensions")
+
+        self.assertEqual(
+            t.to_dict(),
+            {
+                "AWSTemplateFormatVersion": "2010-09-09",
+                "Transform": "AWS::LanguageExtensions",
+                "Resources": {},
+            },
+        )
+
+    def test_length_function(self):
+        class Length(AWSHelperFn):
+            def __init__(self, data: object) -> None:
+                self.data = {"Fn::Length": data}
+
+        t = Template()
+        t.set_version("2010-09-09")
+        t.set_transform("AWS::LanguageExtensions")
+
+        queue_list = t.add_parameter(Parameter("QueueList", Type="CommaDelimitedList"))
+        queue_name = t.add_parameter(
+            Parameter(
+                "QueueNameParam", Description="Name for your SQS queue", Type="String"
+            )
+        )
+
+        t.add_resource(
+            Queue(
+                "Queue",
+                QueueName=queue_name.ref(),
+                DelaySeconds=Length(queue_list.ref()),
+            )
+        )
+
+        self.assertEqual(
+            t.to_dict(),
+            {
+                "AWSTemplateFormatVersion": "2010-09-09",
+                "Transform": "AWS::LanguageExtensions",
+                "Parameters": {
+                    "QueueList": {"Type": "CommaDelimitedList"},
+                    "QueueNameParam": {
+                        "Description": "Name for your SQS queue",
+                        "Type": "String",
+                    },
+                },
+                "Resources": {
+                    "Queue": {
+                        "Type": "AWS::SQS::Queue",
+                        "Properties": {
+                            "QueueName": {"Ref": "QueueNameParam"},
+                            "DelaySeconds": {"Fn::Length": {"Ref": "QueueList"}},
+                        },
+                    }
+                },
+            },
+        )
diff --git a/tests/test_serverless.py b/tests/test_serverless.py
index 1ca0bc70..14262db2 100644
--- a/tests/test_serverless.py
+++ b/tests/test_serverless.py
@@ -14,6 +14,7 @@ from troposphere.serverless import (
     Function,
     FunctionForPackaging,
     FunctionGlobals,
+    FunctionUrlConfig,
     Globals,
     HttpApi,
     HttpApiAuth,
@@ -98,6 +99,31 @@ class TestServerless(unittest.TestCase):
         t.add_resource(serverless_func)
         t.to_json()
 
+    def test_functionurlconfig_oneof(self):
+        serverless_func = Function(
+            "SomeHandler",
+            FunctionUrlConfig=FunctionUrlConfig(
+                AuthType="AWS_IAM",
+            ),
+            Handler="index.handler",
+            Runtime="nodejs",
+            CodeUri="s3://bucket/handler.zip",
+        )
+        t = Template()
+        t.add_resource(serverless_func)
+        t.to_json()
+
+        with self.assertRaises(ValueError):
+            serverless_func = Function(
+                "SomeHandler",
+                FunctionUrlConfig=FunctionUrlConfig(
+                    AuthType="foobar",
+                ),
+                Handler="index.handler",
+                Runtime="nodejs",
+                CodeUri="s3://bucket/handler.zip",
+            )
+
     def test_optional_auto_publish_alias(self):
         serverless_func = Function(
             "SomeHandler",