Repository: getmoto/moto
Pull request #6428 (2023-06-20 16:19:13)

AWS Config support for Resource Type Exclusions
- Added support for AWS Config resource type exclusions
- Updated the data model to account for the newest changes to boto for AWS Config recorders


Patch:
diff --git a/Dockerfile b/Dockerfile
index 3c159633e..cb555efa2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -7,6 +7,11 @@ WORKDIR /moto/
 RUN  pip3 --no-cache-dir install --upgrade pip setuptools && \
      pip3 --no-cache-dir install ".[server]"
 
+# Install cURL
+RUN  apt-get update && \
+     apt-get install -y curl && \
+     rm -rf /var/lib/apt/lists/*
+
 ENTRYPOINT ["/usr/local/bin/moto_server", "-H", "0.0.0.0"]
 
 EXPOSE 5000
diff --git a/IMPLEMENTATION_COVERAGE.md b/IMPLEMENTATION_COVERAGE.md
index 9c42d8337..a91e89a06 100644
--- a/IMPLEMENTATION_COVERAGE.md
+++ b/IMPLEMENTATION_COVERAGE.md
@@ -6729,7 +6729,7 @@
 - [X] create_maintenance_window
 - [ ] create_ops_item
 - [ ] create_ops_metadata
-- [ ] create_patch_baseline
+- [X] create_patch_baseline
 - [ ] create_resource_data_sync
 - [ ] delete_activation
 - [ ] delete_association
@@ -6739,7 +6739,7 @@
 - [ ] delete_ops_metadata
 - [X] delete_parameter
 - [X] delete_parameters
-- [ ] delete_patch_baseline
+- [X] delete_patch_baseline
 - [ ] delete_resource_data_sync
 - [ ] delete_resource_policy
 - [ ] deregister_managed_instance
@@ -6773,7 +6773,7 @@
 - [ ] describe_maintenance_windows_for_target
 - [ ] describe_ops_items
 - [X] describe_parameters
-- [ ] describe_patch_baselines
+- [X] describe_patch_baselines
 - [ ] describe_patch_group_state
 - [ ] describe_patch_groups
 - [ ] describe_patch_properties
diff --git a/moto/config/models.py b/moto/config/models.py
index fbda49844..fbed2ab2a 100644
--- a/moto/config/models.py
+++ b/moto/config/models.py
@@ -291,12 +291,16 @@ class RecordingGroup(ConfigEmptyDictable):
         all_supported: bool = True,
         include_global_resource_types: bool = False,
         resource_types: Optional[List[str]] = None,
+        exclusion_by_resource_types: Optional[Dict[str, List[str]]] = None,
+        recording_strategy: Optional[Dict[str, str]] = None,
     ):
         super().__init__()
 
         self.all_supported = all_supported
         self.include_global_resource_types = include_global_resource_types
         self.resource_types = resource_types
+        self.exclusion_by_resource_types = exclusion_by_resource_types
+        self.recording_strategy = recording_strategy
 
 
 class ConfigRecorder(ConfigEmptyDictable):
@@ -1189,7 +1193,13 @@ class ConfigBackend(BaseBackend):
 
         # Validate the Recording Group:
         if config_recorder.get("recordingGroup") is None:
-            recording_group = RecordingGroup()
+            recording_group = RecordingGroup(
+                all_supported=True,
+                include_global_resource_types=False,
+                resource_types=[],
+                exclusion_by_resource_types={"resourceTypes": []},
+                recording_strategy={"useOnly": "ALL_SUPPORTED_RESOURCE_TYPES"},
+            )
         else:
             rgroup = config_recorder["recordingGroup"]
 
@@ -1197,27 +1207,88 @@ class ConfigBackend(BaseBackend):
             if not rgroup:
                 raise InvalidRecordingGroupException()
 
-            # Can't have both the resource types specified and the other flags as True.
-            if rgroup.get("resourceTypes") and (
-                rgroup.get("allSupported", False)
-                or rgroup.get("includeGlobalResourceTypes", False)
-            ):
-                raise InvalidRecordingGroupException()
+            # Recording strategy must be one of the allowed enums:
+            recording_strategy = rgroup.get("recordingStrategy", {}).get(
+                "useOnly", None
+            )
+            if recording_strategy not in {
+                None,
+                "ALL_SUPPORTED_RESOURCE_TYPES",
+                "INCLUSION_BY_RESOURCE_TYPES",
+                "EXCLUSION_BY_RESOURCE_TYPES",
+            }:
+                raise ValidationException(
+                    f"1 validation error detected: Value '{recording_strategy}' at 'configurationRecorder.recordingGroup.recordingStrategy.useOnly' failed to satisfy constraint:"
+                    f" Member must satisfy enum value set: [INCLUSION_BY_RESOURCE_TYPES, ALL_SUPPORTED_RESOURCE_TYPES, EXCLUSION_BY_RESOURCE_TYPES]"
+                )
 
-            # Must supply resourceTypes if 'allSupported' is not supplied:
-            if not rgroup.get("allSupported") and not rgroup.get("resourceTypes"):
-                raise InvalidRecordingGroupException()
+            # Validate the allSupported:
+            if rgroup.get("allSupported", False):
+                if (
+                    rgroup.get("resourceTypes", [])
+                    or rgroup.get("exclusionByResourceTypes", {})
+                    or recording_strategy not in {None, "ALL_SUPPORTED_RESOURCE_TYPES"}
+                ):
+                    raise InvalidRecordingGroupException()
+
+                recording_group = RecordingGroup(
+                    all_supported=True,
+                    include_global_resource_types=rgroup.get(
+                        "includeGlobalResourceTypes", False
+                    ),
+                    resource_types=[],
+                    exclusion_by_resource_types={"resourceTypes": []},
+                    recording_strategy={"useOnly": "ALL_SUPPORTED_RESOURCE_TYPES"},
+                )
 
-            # Validate that the list provided is correct:
-            self._validate_resource_types(rgroup.get("resourceTypes", []))
+            # Validate the specifically passed in resource types:
+            elif rgroup.get("resourceTypes", []):
+                if (
+                    rgroup.get("includeGlobalResourceTypes", False)
+                    or rgroup.get("exclusionByResourceTypes", {})
+                    or recording_strategy not in {None, "INCLUSION_BY_RESOURCE_TYPES"}
+                ):
+                    raise InvalidRecordingGroupException()
+
+                # Validate that the resource list provided is correct:
+                self._validate_resource_types(rgroup["resourceTypes"])
+
+                recording_group = RecordingGroup(
+                    all_supported=False,
+                    include_global_resource_types=False,
+                    resource_types=rgroup["resourceTypes"],
+                    exclusion_by_resource_types={"resourceTypes": []},
+                    recording_strategy={"useOnly": "INCLUSION_BY_RESOURCE_TYPES"},
+                )
 
-            recording_group = RecordingGroup(
-                all_supported=rgroup.get("allSupported", True),
-                include_global_resource_types=rgroup.get(
-                    "includeGlobalResourceTypes", False
-                ),
-                resource_types=rgroup.get("resourceTypes", []),
-            )
+            # Validate the excluded resource types:
+            elif rgroup.get("exclusionByResourceTypes", {}):
+                if not rgroup["exclusionByResourceTypes"].get("resourceTypes", []):
+                    raise InvalidRecordingGroupException()
+
+                # The recording strategy must be provided for exclusions.
+                if (
+                    rgroup.get("includeGlobalResourceTypes", False)
+                    or recording_strategy != "EXCLUSION_BY_RESOURCE_TYPES"
+                ):
+                    raise InvalidRecordingGroupException()
+
+                # Validate that the resource list provided is correct:
+                self._validate_resource_types(
+                    rgroup["exclusionByResourceTypes"]["resourceTypes"]
+                )
+
+                recording_group = RecordingGroup(
+                    all_supported=False,
+                    include_global_resource_types=False,
+                    resource_types=[],
+                    exclusion_by_resource_types=rgroup["exclusionByResourceTypes"],
+                    recording_strategy={"useOnly": "EXCLUSION_BY_RESOURCE_TYPES"},
+                )
+
+            # If the resourceTypes is an empty list, this will be reached:
+            else:
+                raise InvalidRecordingGroupException()
 
         self.recorders[config_recorder["name"]] = ConfigRecorder(
             config_recorder["roleARN"],
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/af-south-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/af-south-1.json
index caf46a875..9936d9ba6 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/af-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/af-south-1.json
@@ -319,6 +319,38 @@
   "InstanceType": "i3en.xlarge",
   "Location": "afs1-az1"
  },
+ {
+  "InstanceType": "i4i.16xlarge",
+  "Location": "afs1-az1"
+ },
+ {
+  "InstanceType": "i4i.2xlarge",
+  "Location": "afs1-az1"
+ },
+ {
+  "InstanceType": "i4i.32xlarge",
+  "Location": "afs1-az1"
+ },
+ {
+  "InstanceType": "i4i.4xlarge",
+  "Location": "afs1-az1"
+ },
+ {
+  "InstanceType": "i4i.8xlarge",
+  "Location": "afs1-az1"
+ },
+ {
+  "InstanceType": "i4i.large",
+  "Location": "afs1-az1"
+ },
+ {
+  "InstanceType": "i4i.metal",
+  "Location": "afs1-az1"
+ },
+ {
+  "InstanceType": "i4i.xlarge",
+  "Location": "afs1-az1"
+ },
  {
   "InstanceType": "inf1.24xlarge",
   "Location": "afs1-az1"
@@ -1127,6 +1159,38 @@
   "InstanceType": "i3en.xlarge",
   "Location": "afs1-az2"
  },
+ {
+  "InstanceType": "i4i.16xlarge",
+  "Location": "afs1-az2"
+ },
+ {
+  "InstanceType": "i4i.2xlarge",
+  "Location": "afs1-az2"
+ },
+ {
+  "InstanceType": "i4i.32xlarge",
+  "Location": "afs1-az2"
+ },
+ {
+  "InstanceType": "i4i.4xlarge",
+  "Location": "afs1-az2"
+ },
+ {
+  "InstanceType": "i4i.8xlarge",
+  "Location": "afs1-az2"
+ },
+ {
+  "InstanceType": "i4i.large",
+  "Location": "afs1-az2"
+ },
+ {
+  "InstanceType": "i4i.metal",
+  "Location": "afs1-az2"
+ },
+ {
+  "InstanceType": "i4i.xlarge",
+  "Location": "afs1-az2"
+ },
  {
   "InstanceType": "inf1.24xlarge",
   "Location": "afs1-az2"
@@ -1971,6 +2035,38 @@
   "InstanceType": "i3en.xlarge",
   "Location": "afs1-az3"
  },
+ {
+  "InstanceType": "i4i.16xlarge",
+  "Location": "afs1-az3"
+ },
+ {
+  "InstanceType": "i4i.2xlarge",
+  "Location": "afs1-az3"
+ },
+ {
+  "InstanceType": "i4i.32xlarge",
+  "Location": "afs1-az3"
+ },
+ {
+  "InstanceType": "i4i.4xlarge",
+  "Location": "afs1-az3"
+ },
+ {
+  "InstanceType": "i4i.8xlarge",
+  "Location": "afs1-az3"
+ },
+ {
+  "InstanceType": "i4i.large",
+  "Location": "afs1-az3"
+ },
+ {
+  "InstanceType": "i4i.metal",
+  "Location": "afs1-az3"
+ },
+ {
+  "InstanceType": "i4i.xlarge",
+  "Location": "afs1-az3"
+ },
  {
   "InstanceType": "inf1.24xlarge",
   "Location": "afs1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
index 1dd1da8e6..e3d3fc13e 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
@@ -1231,6 +1231,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "apne2-az1"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "apne2-az1"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "apne2-az1"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "apne2-az1"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "apne2-az1"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "apne2-az1"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "apne2-az1"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "apne2-az1"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "apne2-az1"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "apne2-az1"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "apne2-az1"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "apne2-az1"
@@ -2311,6 +2351,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "apne2-az2"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "apne2-az2"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "apne2-az2"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "apne2-az2"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "apne2-az2"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "apne2-az2"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "apne2-az2"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "apne2-az2"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "apne2-az2"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "apne2-az2"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "apne2-az2"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "apne2-az2"
@@ -3571,6 +3651,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "apne2-az3"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "apne2-az3"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "apne2-az3"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "apne2-az3"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "apne2-az3"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "apne2-az3"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "apne2-az3"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "apne2-az3"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "apne2-az3"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "apne2-az3"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "apne2-az3"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "apne2-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json
index 61138fd77..4107549de 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json
@@ -2655,6 +2655,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "aps1-az2"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "aps1-az2"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "aps1-az2"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "aps1-az2"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "aps1-az2"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "aps1-az2"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "aps1-az2"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "aps1-az2"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "aps1-az2"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "aps1-az2"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "aps1-az2"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "aps1-az2"
@@ -4095,6 +4135,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "aps1-az3"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "aps1-az3"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "aps1-az3"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "aps1-az3"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "aps1-az3"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "aps1-az3"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "aps1-az3"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "aps1-az3"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "aps1-az3"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "aps1-az3"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "aps1-az3"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "aps1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-2.json
index 673696d52..87c5ac6d7 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-2.json
@@ -551,6 +551,10 @@
   "InstanceType": "t4g.xlarge",
   "Location": "aps2-az1"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "aps2-az1"
+ },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "aps2-az1"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json
index 1a25e15c0..b11c63ce7 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json
@@ -1683,6 +1683,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "apse1-az1"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "apse1-az1"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "apse1-az1"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "apse1-az1"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "apse1-az1"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "apse1-az1"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "apse1-az1"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "apse1-az1"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "apse1-az1"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "apse1-az1"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "apse1-az1"
+ },
  {
   "InstanceType": "r6idn.12xlarge",
   "Location": "apse1-az1"
@@ -3755,6 +3795,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "apse1-az2"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "apse1-az2"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "apse1-az2"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "apse1-az2"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "apse1-az2"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "apse1-az2"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "apse1-az2"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "apse1-az2"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "apse1-az2"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "apse1-az2"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "apse1-az2"
+ },
  {
   "InstanceType": "r6idn.12xlarge",
   "Location": "apse1-az2"
@@ -5463,6 +5543,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "apse1-az3"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "apse1-az3"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "apse1-az3"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "apse1-az3"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "apse1-az3"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "apse1-az3"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "apse1-az3"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "apse1-az3"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "apse1-az3"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "apse1-az3"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "apse1-az3"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "apse1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ca-central-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ca-central-1.json
index 38b8956ed..549bec941 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ca-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ca-central-1.json
@@ -2543,6 +2543,42 @@
   "InstanceType": "r6g.xlarge",
   "Location": "cac1-az2"
  },
+ {
+  "InstanceType": "r6gd.12xlarge",
+  "Location": "cac1-az2"
+ },
+ {
+  "InstanceType": "r6gd.16xlarge",
+  "Location": "cac1-az2"
+ },
+ {
+  "InstanceType": "r6gd.2xlarge",
+  "Location": "cac1-az2"
+ },
+ {
+  "InstanceType": "r6gd.4xlarge",
+  "Location": "cac1-az2"
+ },
+ {
+  "InstanceType": "r6gd.8xlarge",
+  "Location": "cac1-az2"
+ },
+ {
+  "InstanceType": "r6gd.large",
+  "Location": "cac1-az2"
+ },
+ {
+  "InstanceType": "r6gd.medium",
+  "Location": "cac1-az2"
+ },
+ {
+  "InstanceType": "r6gd.metal",
+  "Location": "cac1-az2"
+ },
+ {
+  "InstanceType": "r6gd.xlarge",
+  "Location": "cac1-az2"
+ },
  {
   "InstanceType": "r6i.12xlarge",
   "Location": "cac1-az2"
@@ -3319,6 +3355,38 @@
   "InstanceType": "m5.xlarge",
   "Location": "cac1-az4"
  },
+ {
+  "InstanceType": "m5a.12xlarge",
+  "Location": "cac1-az4"
+ },
+ {
+  "InstanceType": "m5a.16xlarge",
+  "Location": "cac1-az4"
+ },
+ {
+  "InstanceType": "m5a.24xlarge",
+  "Location": "cac1-az4"
+ },
+ {
+  "InstanceType": "m5a.2xlarge",
+  "Location": "cac1-az4"
+ },
+ {
+  "InstanceType": "m5a.4xlarge",
+  "Location": "cac1-az4"
+ },
+ {
+  "InstanceType": "m5a.8xlarge",
+  "Location": "cac1-az4"
+ },
+ {
+  "InstanceType": "m5a.large",
+  "Location": "cac1-az4"
+ },
+ {
+  "InstanceType": "m5a.xlarge",
+  "Location": "cac1-az4"
+ },
  {
   "InstanceType": "m5d.12xlarge",
   "Location": "cac1-az4"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
index a5ae0f0b7..aa65ae79f 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
@@ -1287,6 +1287,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "euw2-az1"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "euw2-az1"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "euw2-az1"
@@ -2831,6 +2871,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "euw2-az2"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "euw2-az2"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "euw2-az2"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "euw2-az2"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "euw2-az2"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "euw2-az2"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "euw2-az2"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "euw2-az2"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "euw2-az2"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "euw2-az2"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "euw2-az2"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "euw2-az2"
@@ -4163,6 +4243,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "euw2-az3"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "euw2-az3"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "euw2-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/me-central-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/me-central-1.json
index d76fbb6bc..2744c5e6e 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/me-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/me-central-1.json
@@ -307,6 +307,46 @@
   "InstanceType": "m6gd.xlarge",
   "Location": "mec1-az1"
  },
+ {
+  "InstanceType": "m6i.12xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "m6i.16xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "m6i.24xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "m6i.2xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "m6i.32xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "m6i.4xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "m6i.8xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "m6i.large",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "m6i.metal",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "m6i.xlarge",
+  "Location": "mec1-az1"
+ },
  {
   "InstanceType": "r5.12xlarge",
   "Location": "mec1-az1"
@@ -415,6 +455,46 @@
   "InstanceType": "r6g.xlarge",
   "Location": "mec1-az1"
  },
+ {
+  "InstanceType": "r6i.12xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "r6i.16xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "r6i.24xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "r6i.2xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "r6i.32xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "r6i.4xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "r6i.8xlarge",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "r6i.large",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "r6i.metal",
+  "Location": "mec1-az1"
+ },
+ {
+  "InstanceType": "r6i.xlarge",
+  "Location": "mec1-az1"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "mec1-az1"
@@ -779,6 +859,46 @@
   "InstanceType": "m6gd.xlarge",
   "Location": "mec1-az2"
  },
+ {
+  "InstanceType": "m6i.12xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "m6i.16xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "m6i.24xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "m6i.2xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "m6i.32xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "m6i.4xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "m6i.8xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "m6i.large",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "m6i.metal",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "m6i.xlarge",
+  "Location": "mec1-az2"
+ },
  {
   "InstanceType": "r5.12xlarge",
   "Location": "mec1-az2"
@@ -887,6 +1007,46 @@
   "InstanceType": "r6g.xlarge",
   "Location": "mec1-az2"
  },
+ {
+  "InstanceType": "r6i.12xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "r6i.16xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "r6i.24xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "r6i.2xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "r6i.32xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "r6i.4xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "r6i.8xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "r6i.large",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "r6i.metal",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "r6i.xlarge",
+  "Location": "mec1-az2"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "mec1-az2"
@@ -1251,6 +1411,46 @@
   "InstanceType": "m6gd.xlarge",
   "Location": "mec1-az3"
  },
+ {
+  "InstanceType": "m6i.12xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "m6i.16xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "m6i.24xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "m6i.2xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "m6i.32xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "m6i.4xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "m6i.8xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "m6i.large",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "m6i.metal",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "m6i.xlarge",
+  "Location": "mec1-az3"
+ },
  {
   "InstanceType": "r5.12xlarge",
   "Location": "mec1-az3"
@@ -1359,6 +1559,46 @@
   "InstanceType": "r6g.xlarge",
   "Location": "mec1-az3"
  },
+ {
+  "InstanceType": "r6i.12xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "r6i.16xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "r6i.24xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "r6i.2xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "r6i.32xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "r6i.4xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "r6i.8xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "r6i.large",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "r6i.metal",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "r6i.xlarge",
+  "Location": "mec1-az3"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "mec1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
index c6f3a11f2..0c0fd7c95 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
@@ -2303,6 +2303,14 @@
   "InstanceType": "u-12tb1.112xlarge",
   "Location": "usw2-az1"
  },
+ {
+  "InstanceType": "u-18tb1.112xlarge",
+  "Location": "usw2-az1"
+ },
+ {
+  "InstanceType": "u-24tb1.112xlarge",
+  "Location": "usw2-az1"
+ },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "usw2-az1"
@@ -8863,6 +8871,10 @@
   "InstanceType": "u-18tb1.112xlarge",
   "Location": "usw2-az4"
  },
+ {
+  "InstanceType": "u-24tb1.112xlarge",
+  "Location": "usw2-az4"
+ },
  {
   "InstanceType": "x2gd.12xlarge",
   "Location": "usw2-az4"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/af-south-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/af-south-1.json
index 9f89f523e..1ee36c6b0 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/af-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/af-south-1.json
@@ -319,6 +319,38 @@
   "InstanceType": "i3en.xlarge",
   "Location": "af-south-1a"
  },
+ {
+  "InstanceType": "i4i.16xlarge",
+  "Location": "af-south-1a"
+ },
+ {
+  "InstanceType": "i4i.2xlarge",
+  "Location": "af-south-1a"
+ },
+ {
+  "InstanceType": "i4i.32xlarge",
+  "Location": "af-south-1a"
+ },
+ {
+  "InstanceType": "i4i.4xlarge",
+  "Location": "af-south-1a"
+ },
+ {
+  "InstanceType": "i4i.8xlarge",
+  "Location": "af-south-1a"
+ },
+ {
+  "InstanceType": "i4i.large",
+  "Location": "af-south-1a"
+ },
+ {
+  "InstanceType": "i4i.metal",
+  "Location": "af-south-1a"
+ },
+ {
+  "InstanceType": "i4i.xlarge",
+  "Location": "af-south-1a"
+ },
  {
   "InstanceType": "inf1.24xlarge",
   "Location": "af-south-1a"
@@ -1127,6 +1159,38 @@
   "InstanceType": "i3en.xlarge",
   "Location": "af-south-1b"
  },
+ {
+  "InstanceType": "i4i.16xlarge",
+  "Location": "af-south-1b"
+ },
+ {
+  "InstanceType": "i4i.2xlarge",
+  "Location": "af-south-1b"
+ },
+ {
+  "InstanceType": "i4i.32xlarge",
+  "Location": "af-south-1b"
+ },
+ {
+  "InstanceType": "i4i.4xlarge",
+  "Location": "af-south-1b"
+ },
+ {
+  "InstanceType": "i4i.8xlarge",
+  "Location": "af-south-1b"
+ },
+ {
+  "InstanceType": "i4i.large",
+  "Location": "af-south-1b"
+ },
+ {
+  "InstanceType": "i4i.metal",
+  "Location": "af-south-1b"
+ },
+ {
+  "InstanceType": "i4i.xlarge",
+  "Location": "af-south-1b"
+ },
  {
   "InstanceType": "inf1.24xlarge",
   "Location": "af-south-1b"
@@ -1971,6 +2035,38 @@
   "InstanceType": "i3en.xlarge",
   "Location": "af-south-1c"
  },
+ {
+  "InstanceType": "i4i.16xlarge",
+  "Location": "af-south-1c"
+ },
+ {
+  "InstanceType": "i4i.2xlarge",
+  "Location": "af-south-1c"
+ },
+ {
+  "InstanceType": "i4i.32xlarge",
+  "Location": "af-south-1c"
+ },
+ {
+  "InstanceType": "i4i.4xlarge",
+  "Location": "af-south-1c"
+ },
+ {
+  "InstanceType": "i4i.8xlarge",
+  "Location": "af-south-1c"
+ },
+ {
+  "InstanceType": "i4i.large",
+  "Location": "af-south-1c"
+ },
+ {
+  "InstanceType": "i4i.metal",
+  "Location": "af-south-1c"
+ },
+ {
+  "InstanceType": "i4i.xlarge",
+  "Location": "af-south-1c"
+ },
  {
   "InstanceType": "inf1.24xlarge",
   "Location": "af-south-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
index 2b8923bf8..ab2fc9e18 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
@@ -1231,6 +1231,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-northeast-2a"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-northeast-2a"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-northeast-2a"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-northeast-2a"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-northeast-2a"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-northeast-2a"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-northeast-2a"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-northeast-2a"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-northeast-2a"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-northeast-2a"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-northeast-2a"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "ap-northeast-2a"
@@ -2311,6 +2351,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-northeast-2b"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-northeast-2b"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-northeast-2b"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-northeast-2b"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-northeast-2b"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-northeast-2b"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-northeast-2b"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-northeast-2b"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-northeast-2b"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-northeast-2b"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-northeast-2b"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "ap-northeast-2b"
@@ -3571,6 +3651,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-northeast-2c"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-northeast-2c"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-northeast-2c"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-northeast-2c"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-northeast-2c"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-northeast-2c"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-northeast-2c"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-northeast-2c"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-northeast-2c"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-northeast-2c"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-northeast-2c"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "ap-northeast-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json
index d9ba4108d..075b61fbf 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json
@@ -2799,6 +2799,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-south-1b"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-south-1b"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-south-1b"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-south-1b"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-south-1b"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-south-1b"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-south-1b"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-south-1b"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-south-1b"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-south-1b"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-south-1b"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "ap-south-1b"
@@ -4207,6 +4247,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-south-1c"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-south-1c"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-south-1c"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-south-1c"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-south-1c"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-south-1c"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-south-1c"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-south-1c"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-south-1c"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-south-1c"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-south-1c"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "ap-south-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-2.json
index 24d1fec24..c38d36825 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-2.json
@@ -551,6 +551,10 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-south-2a"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "ap-south-2a"
+ },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "ap-south-2a"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json
index df82c752c..1f59fd1e7 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json
@@ -1747,6 +1747,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-southeast-1a"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-southeast-1a"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-southeast-1a"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-southeast-1a"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-southeast-1a"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-southeast-1a"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-southeast-1a"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-southeast-1a"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-southeast-1a"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-southeast-1a"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-southeast-1a"
+ },
  {
   "InstanceType": "r6idn.12xlarge",
   "Location": "ap-southeast-1a"
@@ -3747,6 +3787,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-southeast-1b"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-southeast-1b"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-southeast-1b"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-southeast-1b"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-southeast-1b"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-southeast-1b"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-southeast-1b"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-southeast-1b"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-southeast-1b"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-southeast-1b"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-southeast-1b"
+ },
  {
   "InstanceType": "r6idn.12xlarge",
   "Location": "ap-southeast-1b"
@@ -5463,6 +5543,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-southeast-1c"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-southeast-1c"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-southeast-1c"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-southeast-1c"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-southeast-1c"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-southeast-1c"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-southeast-1c"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-southeast-1c"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-southeast-1c"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-southeast-1c"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-southeast-1c"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "ap-southeast-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ca-central-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ca-central-1.json
index 0841ac703..787ba9f5d 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ca-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ca-central-1.json
@@ -2543,6 +2543,42 @@
   "InstanceType": "r6g.xlarge",
   "Location": "ca-central-1b"
  },
+ {
+  "InstanceType": "r6gd.12xlarge",
+  "Location": "ca-central-1b"
+ },
+ {
+  "InstanceType": "r6gd.16xlarge",
+  "Location": "ca-central-1b"
+ },
+ {
+  "InstanceType": "r6gd.2xlarge",
+  "Location": "ca-central-1b"
+ },
+ {
+  "InstanceType": "r6gd.4xlarge",
+  "Location": "ca-central-1b"
+ },
+ {
+  "InstanceType": "r6gd.8xlarge",
+  "Location": "ca-central-1b"
+ },
+ {
+  "InstanceType": "r6gd.large",
+  "Location": "ca-central-1b"
+ },
+ {
+  "InstanceType": "r6gd.medium",
+  "Location": "ca-central-1b"
+ },
+ {
+  "InstanceType": "r6gd.metal",
+  "Location": "ca-central-1b"
+ },
+ {
+  "InstanceType": "r6gd.xlarge",
+  "Location": "ca-central-1b"
+ },
  {
   "InstanceType": "r6i.12xlarge",
   "Location": "ca-central-1b"
@@ -3319,6 +3355,38 @@
   "InstanceType": "m5.xlarge",
   "Location": "ca-central-1d"
  },
+ {
+  "InstanceType": "m5a.12xlarge",
+  "Location": "ca-central-1d"
+ },
+ {
+  "InstanceType": "m5a.16xlarge",
+  "Location": "ca-central-1d"
+ },
+ {
+  "InstanceType": "m5a.24xlarge",
+  "Location": "ca-central-1d"
+ },
+ {
+  "InstanceType": "m5a.2xlarge",
+  "Location": "ca-central-1d"
+ },
+ {
+  "InstanceType": "m5a.4xlarge",
+  "Location": "ca-central-1d"
+ },
+ {
+  "InstanceType": "m5a.8xlarge",
+  "Location": "ca-central-1d"
+ },
+ {
+  "InstanceType": "m5a.large",
+  "Location": "ca-central-1d"
+ },
+ {
+  "InstanceType": "m5a.xlarge",
+  "Location": "ca-central-1d"
+ },
  {
   "InstanceType": "m5d.12xlarge",
   "Location": "ca-central-1d"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
index 6c1102417..ca5224b02 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
@@ -1347,6 +1347,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "eu-west-2a"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "eu-west-2a"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "eu-west-2a"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "eu-west-2a"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "eu-west-2a"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "eu-west-2a"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "eu-west-2a"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "eu-west-2a"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "eu-west-2a"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "eu-west-2a"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "eu-west-2a"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "eu-west-2a"
@@ -2679,6 +2719,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "eu-west-2b"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "eu-west-2b"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "eu-west-2b"
@@ -4163,6 +4243,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "eu-west-2c"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "eu-west-2c"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "eu-west-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/me-central-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/me-central-1.json
index 6871959ef..af5601f7d 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/me-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/me-central-1.json
@@ -307,6 +307,46 @@
   "InstanceType": "m6gd.xlarge",
   "Location": "me-central-1a"
  },
+ {
+  "InstanceType": "m6i.12xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "m6i.16xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "m6i.24xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "m6i.2xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "m6i.32xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "m6i.4xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "m6i.8xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "m6i.large",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "m6i.metal",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "m6i.xlarge",
+  "Location": "me-central-1a"
+ },
  {
   "InstanceType": "r5.12xlarge",
   "Location": "me-central-1a"
@@ -415,6 +455,46 @@
   "InstanceType": "r6g.xlarge",
   "Location": "me-central-1a"
  },
+ {
+  "InstanceType": "r6i.12xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "r6i.16xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "r6i.24xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "r6i.2xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "r6i.32xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "r6i.4xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "r6i.8xlarge",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "r6i.large",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "r6i.metal",
+  "Location": "me-central-1a"
+ },
+ {
+  "InstanceType": "r6i.xlarge",
+  "Location": "me-central-1a"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "me-central-1a"
@@ -779,6 +859,46 @@
   "InstanceType": "m6gd.xlarge",
   "Location": "me-central-1b"
  },
+ {
+  "InstanceType": "m6i.12xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "m6i.16xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "m6i.24xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "m6i.2xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "m6i.32xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "m6i.4xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "m6i.8xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "m6i.large",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "m6i.metal",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "m6i.xlarge",
+  "Location": "me-central-1b"
+ },
  {
   "InstanceType": "r5.12xlarge",
   "Location": "me-central-1b"
@@ -887,6 +1007,46 @@
   "InstanceType": "r6g.xlarge",
   "Location": "me-central-1b"
  },
+ {
+  "InstanceType": "r6i.12xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "r6i.16xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "r6i.24xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "r6i.2xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "r6i.32xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "r6i.4xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "r6i.8xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "r6i.large",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "r6i.metal",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "r6i.xlarge",
+  "Location": "me-central-1b"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "me-central-1b"
@@ -1251,6 +1411,46 @@
   "InstanceType": "m6gd.xlarge",
   "Location": "me-central-1c"
  },
+ {
+  "InstanceType": "m6i.12xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "m6i.16xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "m6i.24xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "m6i.2xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "m6i.32xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "m6i.4xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "m6i.8xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "m6i.large",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "m6i.metal",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "m6i.xlarge",
+  "Location": "me-central-1c"
+ },
  {
   "InstanceType": "r5.12xlarge",
   "Location": "me-central-1c"
@@ -1359,6 +1559,46 @@
   "InstanceType": "r6g.xlarge",
   "Location": "me-central-1c"
  },
+ {
+  "InstanceType": "r6i.12xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "r6i.16xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "r6i.24xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "r6i.2xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "r6i.32xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "r6i.4xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "r6i.8xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "r6i.large",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "r6i.metal",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "r6i.xlarge",
+  "Location": "me-central-1c"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "me-central-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
index 3755b40eb..90c7c9795 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
@@ -2303,6 +2303,14 @@
   "InstanceType": "u-12tb1.112xlarge",
   "Location": "us-west-2a"
  },
+ {
+  "InstanceType": "u-18tb1.112xlarge",
+  "Location": "us-west-2a"
+ },
+ {
+  "InstanceType": "u-24tb1.112xlarge",
+  "Location": "us-west-2a"
+ },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-west-2a"
@@ -8863,6 +8871,10 @@
   "InstanceType": "u-18tb1.112xlarge",
   "Location": "us-west-2d"
  },
+ {
+  "InstanceType": "u-24tb1.112xlarge",
+  "Location": "us-west-2d"
+ },
  {
   "InstanceType": "x2gd.12xlarge",
   "Location": "us-west-2d"
diff --git a/moto/ec2/resources/instance_type_offerings/region/af-south-1.json b/moto/ec2/resources/instance_type_offerings/region/af-south-1.json
index df0db673f..57655627c 100644
--- a/moto/ec2/resources/instance_type_offerings/region/af-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/af-south-1.json
@@ -347,6 +347,38 @@
   "InstanceType": "i3en.xlarge",
   "Location": "af-south-1"
  },
+ {
+  "InstanceType": "i4i.16xlarge",
+  "Location": "af-south-1"
+ },
+ {
+  "InstanceType": "i4i.2xlarge",
+  "Location": "af-south-1"
+ },
+ {
+  "InstanceType": "i4i.32xlarge",
+  "Location": "af-south-1"
+ },
+ {
+  "InstanceType": "i4i.4xlarge",
+  "Location": "af-south-1"
+ },
+ {
+  "InstanceType": "i4i.8xlarge",
+  "Location": "af-south-1"
+ },
+ {
+  "InstanceType": "i4i.large",
+  "Location": "af-south-1"
+ },
+ {
+  "InstanceType": "i4i.metal",
+  "Location": "af-south-1"
+ },
+ {
+  "InstanceType": "i4i.xlarge",
+  "Location": "af-south-1"
+ },
  {
   "InstanceType": "inf1.24xlarge",
   "Location": "af-south-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json b/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json
index 6157f2831..596f7a012 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json
@@ -1235,6 +1235,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-northeast-2"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-northeast-2"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-northeast-2"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-northeast-2"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-northeast-2"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-northeast-2"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-northeast-2"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-northeast-2"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-northeast-2"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-northeast-2"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-northeast-2"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "ap-northeast-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json b/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json
index 9022227e1..fcf968a1f 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json
@@ -1323,6 +1323,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-south-1"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-south-1"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-south-1"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-south-1"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-south-1"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-south-1"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-south-1"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-south-1"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-south-1"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-south-1"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-south-1"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "ap-south-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-south-2.json b/moto/ec2/resources/instance_type_offerings/region/ap-south-2.json
index 69f4aaf3c..1cd39f86a 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-south-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-south-2.json
@@ -551,6 +551,10 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-south-2"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "ap-south-2"
+ },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "ap-south-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json b/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json
index 250f01f75..c9ee52bbb 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json
@@ -1751,6 +1751,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "ap-southeast-1"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "ap-southeast-1"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "ap-southeast-1"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "ap-southeast-1"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "ap-southeast-1"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "ap-southeast-1"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "ap-southeast-1"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "ap-southeast-1"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "ap-southeast-1"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "ap-southeast-1"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "ap-southeast-1"
+ },
  {
   "InstanceType": "r6idn.12xlarge",
   "Location": "ap-southeast-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json b/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json
index 748a7da73..38195f09b 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json
@@ -1347,6 +1347,46 @@
   "InstanceType": "r6i.xlarge",
   "Location": "eu-west-2"
  },
+ {
+  "InstanceType": "r6id.12xlarge",
+  "Location": "eu-west-2"
+ },
+ {
+  "InstanceType": "r6id.16xlarge",
+  "Location": "eu-west-2"
+ },
+ {
+  "InstanceType": "r6id.24xlarge",
+  "Location": "eu-west-2"
+ },
+ {
+  "InstanceType": "r6id.2xlarge",
+  "Location": "eu-west-2"
+ },
+ {
+  "InstanceType": "r6id.32xlarge",
+  "Location": "eu-west-2"
+ },
+ {
+  "InstanceType": "r6id.4xlarge",
+  "Location": "eu-west-2"
+ },
+ {
+  "InstanceType": "r6id.8xlarge",
+  "Location": "eu-west-2"
+ },
+ {
+  "InstanceType": "r6id.large",
+  "Location": "eu-west-2"
+ },
+ {
+  "InstanceType": "r6id.metal",
+  "Location": "eu-west-2"
+ },
+ {
+  "InstanceType": "r6id.xlarge",
+  "Location": "eu-west-2"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "eu-west-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/me-central-1.json b/moto/ec2/resources/instance_type_offerings/region/me-central-1.json
index 43f03cabe..cb0424b04 100644
--- a/moto/ec2/resources/instance_type_offerings/region/me-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/me-central-1.json
@@ -307,6 +307,46 @@
   "InstanceType": "m6gd.xlarge",
   "Location": "me-central-1"
  },
+ {
+  "InstanceType": "m6i.12xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "m6i.16xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "m6i.24xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "m6i.2xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "m6i.32xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "m6i.4xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "m6i.8xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "m6i.large",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "m6i.metal",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "m6i.xlarge",
+  "Location": "me-central-1"
+ },
  {
   "InstanceType": "r5.12xlarge",
   "Location": "me-central-1"
@@ -415,6 +455,46 @@
   "InstanceType": "r6g.xlarge",
   "Location": "me-central-1"
  },
+ {
+  "InstanceType": "r6i.12xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "r6i.16xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "r6i.24xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "r6i.2xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "r6i.32xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "r6i.4xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "r6i.8xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "r6i.large",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "r6i.metal",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "r6i.xlarge",
+  "Location": "me-central-1"
+ },
  {
   "InstanceType": "t3.2xlarge",
   "Location": "me-central-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/us-west-2.json b/moto/ec2/resources/instance_type_offerings/region/us-west-2.json
index f5c2bd900..0e3b8236b 100644
--- a/moto/ec2/resources/instance_type_offerings/region/us-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/us-west-2.json
@@ -2343,6 +2343,10 @@
   "InstanceType": "u-18tb1.112xlarge",
   "Location": "us-west-2"
  },
+ {
+  "InstanceType": "u-24tb1.112xlarge",
+  "Location": "us-west-2"
+ },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-west-2"
diff --git a/moto/glue/utils.py b/moto/glue/utils.py
index 11b063692..04cacbd85 100644
--- a/moto/glue/utils.py
+++ b/moto/glue/utils.py
@@ -1,7 +1,6 @@
 import abc
 import operator
 import re
-import warnings
 from datetime import date, datetime
 from itertools import repeat
 from typing import Any, Dict, List, Optional, Union
@@ -16,13 +15,19 @@ from pyparsing import (
     Suppress,
     Word,
     alphanums,
-    delimited_list,
     exceptions,
     infix_notation,
     one_of,
     pyparsing_common,
 )
 
+try:
+    # TODO import directly when depending on pyparsing>=3.1.0
+    from pyparsing import DelimitedList
+except ImportError:
+    # delimited_list is deprecated in favor of DelimitedList in pyparsing 3.1.0
+    from pyparsing import delimited_list as DelimitedList  # type: ignore[assignment]
+
 from .exceptions import (
     InvalidInputException,
     InvalidStateException,
@@ -280,7 +285,7 @@ class _PartitionFilterExpressionCache:
         string <<= QuotedString(quote_char="'", esc_quote="''") | lpar + string + rpar  # type: ignore
 
         literal = (number | string).set_name("literal")
-        literal_list = delimited_list(literal, min=1).set_name("list")
+        literal_list = DelimitedList(literal, min=1).set_name("list")
 
         bin_op = one_of("<> >= <= > < =").set_name("binary op")
 
@@ -352,7 +357,6 @@ class PartitionFilter:
         if expression is None:
             return True
 
-        warnings.warn("Expression filtering is experimental")
         versions = list(self.fake_table.versions.values())
         return expression.eval(
             part_keys=versions[-1].get("PartitionKeys", []),
diff --git a/moto/identitystore/exceptions.py b/moto/identitystore/exceptions.py
index 65060b557..87d46ff0a 100644
--- a/moto/identitystore/exceptions.py
+++ b/moto/identitystore/exceptions.py
@@ -1,1 +1,37 @@
 """Exceptions raised by the identitystore service."""
+import json
+
+from moto.core.exceptions import AWSError
+from typing import Any
+
+
+request_id = "178936da-50ad-4d58-8871-22d9979e8658example"
+
+
+class IdentityStoreError(AWSError):
+    def __init__(self, **kwargs: Any):
+        super(AWSError, self).__init__(error_type=self.TYPE, message=kwargs["message"])  # type: ignore
+        self.description: str = json.dumps(
+            {
+                "__type": self.error_type,
+                "RequestId": request_id,
+                "Message": self.message,
+                "ResourceType": kwargs.get("resource_type"),
+                "Reason": kwargs.get("reason"),
+            }
+        )
+
+
+class ResourceNotFoundException(IdentityStoreError):
+    TYPE = "ResourceNotFoundException"
+    code = 400
+
+
+class ValidationException(IdentityStoreError):
+    TYPE = "ValidationException"
+    code = 400
+
+
+class ConflictException(IdentityStoreError):
+    TYPE = "ConflictException"
+    code = 400
diff --git a/moto/identitystore/models.py b/moto/identitystore/models.py
index 397150095..f20314631 100644
--- a/moto/identitystore/models.py
+++ b/moto/identitystore/models.py
@@ -1,19 +1,98 @@
-from typing import Dict, Tuple
+from typing import Dict, Tuple, List, Any, NamedTuple, Optional
+from typing_extensions import Self
+from moto.utilities.paginator import paginate
+
+from botocore.exceptions import ParamValidationError
 
 from moto.moto_api._internal import mock_random
 from moto.core import BaseBackend, BackendDict
+from .exceptions import (
+    ResourceNotFoundException,
+    ValidationException,
+    ConflictException,
+)
+import warnings
+
+
+class Name(NamedTuple):
+    Formatted: Optional[str]
+    FamilyName: Optional[str]
+    GivenName: Optional[str]
+    MiddleName: Optional[str]
+    HonorificPrefix: Optional[str]
+    HonorificSuffix: Optional[str]
+
+    @classmethod
+    def from_dict(cls, name_dict: Dict[str, str]) -> Optional[Self]:
+        if not name_dict:
+            return None
+        return cls(
+            name_dict.get("Formatted"),
+            name_dict.get("FamilyName"),
+            name_dict.get("GivenName"),
+            name_dict.get("MiddleName"),
+            name_dict.get("HonorificPrefix"),
+            name_dict.get("HonorificSuffix"),
+        )
+
+
+class User(NamedTuple):
+    UserId: str
+    IdentityStoreId: str
+    UserName: str
+    Name: Optional[Name]
+    DisplayName: str
+    NickName: str
+    ProfileUrl: str
+    Emails: List[Dict[str, str]]
+    Addresses: List[Dict[str, str]]
+    PhoneNumbers: List[Dict[str, str]]
+    UserType: str
+    Title: str
+    PreferredLanguage: str
+    Locale: str
+    Timezone: str
+
+
+class IdentityStoreData:
+    def __init__(self) -> None:
+        self.groups: Dict[str, Dict[str, str]] = {}
+        self.users: Dict[str, User] = {}
+        self.group_memberships: Dict[str, Any] = {}
 
 
 class IdentityStoreBackend(BaseBackend):
     """Implementation of IdentityStore APIs."""
 
-    def __init__(self, region_name: str, account_id: str):
+    PAGINATION_MODEL = {
+        "list_group_memberships": {
+            "input_token": "next_token",
+            "limit_key": "max_results",
+            "limit_default": 100,
+            "unique_attribute": "MembershipId",
+        },
+    }
+
+    def __init__(self, region_name: str, account_id: str) -> None:
         super().__init__(region_name, account_id)
-        self.groups: Dict[str, Dict[str, str]] = {}
+        self.identity_stores: Dict[str, IdentityStoreData] = {}
 
     def create_group(
         self, identity_store_id: str, display_name: str, description: str
     ) -> Tuple[str, str]:
+        identity_store = self.__get_identity_store(identity_store_id)
+
+        matching = [
+            g
+            for g in identity_store.groups.values()
+            if g["DisplayName"] == display_name
+        ]
+        if len(matching) > 0:
+            raise ConflictException(
+                message="Duplicate GroupDisplayName",
+                reason="UNIQUENESS_CONSTRAINT_VIOLATION",
+            )
+
         group_id = str(mock_random.uuid4())
         group_dict = {
             "GroupId": group_id,
@@ -21,8 +100,180 @@ class IdentityStoreBackend(BaseBackend):
             "DisplayName": display_name,
             "Description": description,
         }
-        self.groups[group_id] = group_dict
+        identity_store.groups[group_id] = group_dict
         return group_id, identity_store_id
 
+    def get_group_id(
+        self, identity_store_id: str, alternate_identifier: Dict[str, Any]
+    ) -> Tuple[str, str]:
+        identity_store = self.__get_identity_store(identity_store_id)
+        if "UniqueAttribute" in alternate_identifier:
+            if (
+                "AttributeValue" in alternate_identifier["UniqueAttribute"]
+                and alternate_identifier["UniqueAttribute"]["AttributePath"].lower()
+                == "displayname"
+            ):
+                for g in identity_store.groups.values():
+                    if (
+                        g["DisplayName"]
+                        == alternate_identifier["UniqueAttribute"]["AttributeValue"]
+                    ):
+                        return g["GroupId"], identity_store_id
+        elif "ExternalId" in alternate_identifier:
+            warnings.warn("ExternalId has not been implemented.")
+
+        raise ResourceNotFoundException(
+            message="GROUP not found.", resource_type="GROUP"
+        )
+
+    def delete_group(self, identity_store_id: str, group_id: str) -> None:
+        identity_store = self.__get_identity_store(identity_store_id)
+        if group_id in identity_store.groups:
+            del identity_store.groups[group_id]
+
+    def create_user(
+        self,
+        identity_store_id: str,
+        user_name: str,
+        name: Dict[str, str],
+        display_name: str,
+        nick_name: str,
+        profile_url: str,
+        emails: List[Dict[str, Any]],
+        addresses: List[Dict[str, Any]],
+        phone_numbers: List[Dict[str, Any]],
+        user_type: str,
+        title: str,
+        preferred_language: str,
+        locale: str,
+        timezone: str,
+    ) -> Tuple[str, str]:
+        identity_store = self.__get_identity_store(identity_store_id)
+        user_id = str(mock_random.uuid4())
+
+        new_user = User(
+            user_id,
+            identity_store_id,
+            user_name,
+            Name.from_dict(name),
+            display_name,
+            nick_name,
+            profile_url,
+            emails,
+            addresses,
+            phone_numbers,
+            user_type,
+            title,
+            preferred_language,
+            locale,
+            timezone,
+        )
+        self.__validate_create_user(new_user, identity_store)
+
+        identity_store.users[user_id] = new_user
+
+        return user_id, identity_store_id
+
+    def describe_user(self, identity_store_id: str, user_id: str) -> User:
+        identity_store = self.__get_identity_store(identity_store_id)
+
+        if user_id in identity_store.users:
+            return identity_store.users[user_id]
+
+        raise ResourceNotFoundException(message="USER not found.", resource_type="USER")
+
+    def delete_user(self, identity_store_id: str, user_id: str) -> None:
+        identity_store = self.__get_identity_store(identity_store_id)
+
+        if user_id in identity_store.users:
+            del identity_store.users[user_id]
+
+    def create_group_membership(
+        self, identity_store_id: str, group_id: str, member_id: Dict[str, str]
+    ) -> Tuple[str, str]:
+        identity_store = self.__get_identity_store(identity_store_id)
+        user_id = member_id["UserId"]
+        if user_id not in identity_store.users:
+            raise ResourceNotFoundException(
+                message="Member does not exist", resource_type="USER"
+            )
+
+        if group_id not in identity_store.groups:
+            raise ResourceNotFoundException(
+                message="Group does not exist", resource_type="GROUP"
+            )
+
+        membership_id = str(mock_random.uuid4())
+        identity_store.group_memberships[membership_id] = {
+            "IdentityStoreId": identity_store_id,
+            "MembershipId": membership_id,
+            "GroupId": group_id,
+            "MemberId": {"UserId": user_id},
+        }
+
+        return membership_id, identity_store_id
+
+    @paginate(pagination_model=PAGINATION_MODEL)  # type: ignore
+    def list_group_memberships(
+        self,
+        identity_store_id: str,
+        group_id: str,
+    ) -> List[Any]:  # type: ignore
+        identity_store = self.__get_identity_store(identity_store_id)
+
+        return [
+            m
+            for m in identity_store.group_memberships.values()
+            if m["GroupId"] == group_id
+        ]
+
+    def delete_group_membership(
+        self, identity_store_id: str, membership_id: str
+    ) -> None:
+        identity_store = self.__get_identity_store(identity_store_id)
+        if membership_id in identity_store.group_memberships:
+            del identity_store.group_memberships[membership_id]
+
+    def __get_identity_store(self, store_id: str) -> IdentityStoreData:
+        if len(store_id) < 1:
+            raise ParamValidationError(
+                msg="Invalid length for parameter IdentityStoreId, value: 0, valid min length: 1"
+            )
+        if store_id not in self.identity_stores:
+            self.identity_stores[store_id] = IdentityStoreData()
+        return self.identity_stores[store_id]
+
+    def __validate_create_user(
+        self, new_user: User, identity_store: IdentityStoreData
+    ) -> None:
+        if not new_user.UserName:
+            raise ValidationException(message="userName is a required attribute")
+
+        missing = []
+
+        if not new_user.DisplayName:
+            missing.append("displayname")
+        if not new_user.Name:
+            missing.append("name")
+        else:
+            if not new_user.Name.GivenName:
+                missing.append("givenname")
+            if not new_user.Name.FamilyName:
+                missing.append("familyname")
+
+        if len(missing) > 0:
+            message = ", ".join(
+                [f"{att}: The attribute {att} is required" for att in missing]
+            )
+            raise ValidationException(message=message)
+
+        matching = [
+            u for u in identity_store.users.values() if u.UserName == new_user.UserName
+        ]
+        if len(matching) > 0:
+            raise ConflictException(
+                message="Duplicate UserName", reason="UNIQUENESS_CONSTRAINT_VIOLATION"
+            )
+
 
 identitystore_backends = BackendDict(IdentityStoreBackend, "identitystore")
diff --git a/moto/identitystore/responses.py b/moto/identitystore/responses.py
index 40d764559..4467709ad 100644
--- a/moto/identitystore/responses.py
+++ b/moto/identitystore/responses.py
@@ -1,5 +1,6 @@
 """Handles incoming identitystore requests, invokes methods, returns responses."""
 import json
+from typing import NamedTuple, Any, Dict, Optional
 
 from moto.core.responses import BaseResponse
 from .models import identitystore_backends, IdentityStoreBackend
@@ -26,3 +27,145 @@ class IdentityStoreResponse(BaseResponse):
             description=description,
         )
         return json.dumps(dict(GroupId=group_id, IdentityStoreId=identity_store_id))
+
+    def create_group_membership(self) -> str:
+        identity_store_id = self._get_param("IdentityStoreId")
+        group_id = self._get_param("GroupId")
+        member_id = self._get_param("MemberId")
+        (
+            membership_id,
+            identity_store_id,
+        ) = self.identitystore_backend.create_group_membership(
+            identity_store_id=identity_store_id,
+            group_id=group_id,
+            member_id=member_id,
+        )
+
+        return json.dumps(
+            dict(MembershipId=membership_id, IdentityStoreId=identity_store_id)
+        )
+
+    def create_user(self) -> str:
+        user_id, identity_store_id = self.identitystore_backend.create_user(
+            self._get_param("IdentityStoreId"),
+            self._get_param("UserName"),
+            self._get_param("Name"),
+            self._get_param("DisplayName"),
+            self._get_param("NickName"),
+            self._get_param("ProfileUrl"),
+            self._get_param("Emails"),
+            self._get_param("Addresses"),
+            self._get_param("PhoneNumbers"),
+            self._get_param("UserType"),
+            self._get_param("Title"),
+            self._get_param("PreferredLanguage"),
+            self._get_param("Locale"),
+            self._get_param("Timezone"),
+        )
+        return json.dumps(dict(UserId=user_id, IdentityStoreId=identity_store_id))
+
+    def get_group_id(self) -> str:
+        identity_store_id = self._get_param("IdentityStoreId")
+        alternate_identifier = self._get_param("AlternateIdentifier")
+        group_id, identity_store_id = self.identitystore_backend.get_group_id(
+            identity_store_id=identity_store_id,
+            alternate_identifier=alternate_identifier,
+        )
+        return json.dumps(dict(GroupId=group_id, IdentityStoreId=identity_store_id))
+
+    def describe_user(self) -> str:
+        identity_store_id = self._get_param("IdentityStoreId")
+        user_id = self._get_param("UserId")
+        (
+            user_id,
+            identity_store_id,
+            user_name,
+            name,
+            display_name,
+            nick_name,
+            profile_url,
+            emails,
+            addresses,
+            phone_numbers,
+            user_type,
+            title,
+            preferred_language,
+            locale,
+            timezone,
+        ) = self.identitystore_backend.describe_user(
+            identity_store_id=identity_store_id,
+            user_id=user_id,
+        )
+        return json.dumps(
+            dict(
+                UserName=user_name,
+                UserId=user_id,
+                ExternalIds=None,
+                Name=self.named_tuple_to_dict(name),
+                DisplayName=display_name,
+                NickName=nick_name,
+                ProfileUrl=profile_url,
+                Emails=emails,
+                Addresses=addresses,
+                PhoneNumbers=phone_numbers,
+                UserType=user_type,
+                Title=title,
+                PreferredLanguage=preferred_language,
+                Locale=locale,
+                Timezone=timezone,
+                IdentityStoreId=identity_store_id,
+            )
+        )
+
+    def list_group_memberships(self) -> str:
+        identity_store_id = self._get_param("IdentityStoreId")
+        group_id = self._get_param("GroupId")
+        max_results = self._get_param("MaxResults")
+        next_token = self._get_param("NextToken")
+        (
+            group_memberships,
+            next_token,
+        ) = self.identitystore_backend.list_group_memberships(
+            identity_store_id=identity_store_id,
+            group_id=group_id,
+            max_results=max_results,
+            next_token=next_token,
+        )
+
+        return json.dumps(
+            dict(GroupMemberships=group_memberships, NextToken=next_token)
+        )
+
+    def delete_group(self) -> str:
+        identity_store_id = self._get_param("IdentityStoreId")
+        group_id = self._get_param("GroupId")
+        self.identitystore_backend.delete_group(
+            identity_store_id=identity_store_id,
+            group_id=group_id,
+        )
+        return json.dumps(dict())
+
+    def delete_group_membership(self) -> str:
+        identity_store_id = self._get_param("IdentityStoreId")
+        membership_id = self._get_param("MembershipId")
+        self.identitystore_backend.delete_group_membership(
+            identity_store_id=identity_store_id,
+            membership_id=membership_id,
+        )
+        return json.dumps(dict())
+
+    def delete_user(self) -> str:
+        identity_store_id = self._get_param("IdentityStoreId")
+        user_id = self._get_param("UserId")
+        self.identitystore_backend.delete_user(
+            identity_store_id=identity_store_id,
+            user_id=user_id,
+        )
+        return json.dumps(dict())
+
+    def named_tuple_to_dict(
+        self, value: Optional[NamedTuple]
+    ) -> Optional[Dict[str, Any]]:
+        if value:
+            return value._asdict()
+        return None
diff --git a/moto/ssm/models.py b/moto/ssm/models.py
index 2902fd04c..8b21fd4d7 100644
--- a/moto/ssm/models.py
+++ b/moto/ssm/models.py
@@ -986,6 +986,58 @@ class FakeMaintenanceWindow:
         return "mw-" + "".join(str(random.choice(chars)) for _ in range(17))
 
 
+class FakePatchBaseline:
+    def __init__(
+        self,
+        name: str,
+        operating_system: str,
+        global_filters: Optional[Dict[str, Any]],
+        approval_rules: Optional[Dict[str, Any]],
+        approved_patches: Optional[List[str]],
+        approved_patches_compliance_level: Optional[str],
+        approved_patches_enable_non_security: Optional[bool],
+        rejected_patches: Optional[List[str]],
+        rejected_patches_action: Optional[str],
+        description: Optional[str],
+        sources: Optional[List[Dict[str, Any]]],
+    ):
+        self.id = FakePatchBaseline.generate_id()
+        self.operating_system = operating_system
+        self.name = name
+        self.global_filters = global_filters
+        self.approval_rules = approval_rules
+        self.approved_patches = approved_patches
+        self.approved_patches_compliance_level = approved_patches_compliance_level
+        self.approved_patches_enable_non_security = approved_patches_enable_non_security
+        self.rejected_patches = rejected_patches
+        self.rejected_patches_action = rejected_patches_action
+        self.description = description
+        self.sources = sources
+        self.default_baseline = False
+
+    def to_json(self) -> Dict[str, Any]:
+        return {
+            "BaselineId": self.id,
+            "OperatingSystem": self.operating_system,
+            "BaselineName": self.name,
+            "GlobalFilters": self.global_filters,
+            "ApprovalRules": self.approval_rules,
+            "ApprovedPatches": self.approved_patches,
+            "ApprovedPatchesComplianceLevel": self.approved_patches_compliance_level,
+            "ApprovedPatchesEnableNonSecurity": self.approved_patches_enable_non_security,
+            "RejectedPatches": self.rejected_patches,
+            "RejectedPatchesAction": self.rejected_patches_action,
+            "BaselineDescription": self.description,
+            "Sources": self.sources,
+            "DefaultBaseline": self.default_baseline,
+        }
+
+    @staticmethod
+    def generate_id() -> str:
+        chars = list(range(10)) + ["a", "b", "c", "d", "e", "f"]
+        return "pb-" + "".join(str(random.choice(chars)) for _ in range(17))
+
+
 class SimpleSystemManagerBackend(BaseBackend):
     """
     Moto supports the following default parameters out of the box:
@@ -1010,6 +1062,7 @@ class SimpleSystemManagerBackend(BaseBackend):
         self._documents: Dict[str, Documents] = {}
 
         self.windows: Dict[str, FakeMaintenanceWindow] = dict()
+        self.baselines: Dict[str, FakePatchBaseline] = dict()
 
     @staticmethod
     def default_vpc_endpoint_service(
@@ -2135,5 +2188,67 @@ class SimpleSystemManagerBackend(BaseBackend):
         """
         del self.windows[window_id]
 
+    def create_patch_baseline(
+        self,
+        name: str,
+        operating_system: str,
+        global_filters: Optional[Dict[str, Any]],
+        approval_rules: Optional[Dict[str, Any]],
+        approved_patches: Optional[List[str]],
+        approved_patches_compliance_level: Optional[str],
+        approved_patches_enable_non_security: Optional[bool],
+        rejected_patches: Optional[List[str]],
+        rejected_patches_action: Optional[str],
+        description: Optional[str],
+        sources: Optional[List[Dict[str, Any]]],
+        tags: Optional[List[Dict[str, str]]],
+    ) -> str:
+        """
+        Registers a patch baseline. No error handling or input validation has been implemented yet.
+        """
+        baseline = FakePatchBaseline(
+            name,
+            operating_system,
+            global_filters,
+            approval_rules,
+            approved_patches,
+            approved_patches_compliance_level,
+            approved_patches_enable_non_security,
+            rejected_patches,
+            rejected_patches_action,
+            description,
+            sources,
+        )
+        self.baselines[baseline.id] = baseline
+
+        if tags:
+            baseline_tags = {t["Key"]: t["Value"] for t in tags}
+            self.add_tags_to_resource("PatchBaseline", baseline.id, baseline_tags)
+
+        return baseline.id
+
+    def describe_patch_baselines(
+        self, filters: Optional[List[Dict[str, Any]]]
+    ) -> List[FakePatchBaseline]:
+        """
+        Returns all baselines. No pagination has been implemented yet.
+        """
+        baselines = [baseline for baseline in self.baselines.values()]
+        if filters:
+            for f in filters:
+                if f["Key"] == "NAME_PREFIX":
+                    baselines = [
+                        baseline
+                        for baseline in baselines
+                        if baseline.name in f["Values"]
+                    ]
+        return baselines
+
+    def delete_patch_baseline(self, baseline_id: str) -> None:
+        """
+        Assumes the provided BaselineId exists. No error handling has been implemented yet.
+        """
+        del self.baselines[baseline_id]
+
 
 ssm_backends = BackendDict(SimpleSystemManagerBackend, "ssm")
diff --git a/moto/ssm/resources/regions.json b/moto/ssm/resources/regions.json
index cacce63aa..57913cc79 100644
--- a/moto/ssm/resources/regions.json
+++ b/moto/ssm/resources/regions.json
@@ -988,6 +988,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -1453,6 +1456,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.af-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -2540,6 +2552,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -3032,6 +3047,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -4830,6 +4854,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -5556,6 +5583,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-northeast-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -7200,6 +7236,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -7830,6 +7869,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-northeast-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -8727,6 +8775,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -9168,6 +9219,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-northeast-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -10659,6 +10719,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -11319,6 +11382,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -11980,6 +12052,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -12301,6 +12376,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vpc": {
                 "Value": "vpc"
               },
@@ -12775,6 +12859,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "cloudshell": {
+                "Value": "cloudshell",
+                "endpoint": {
+                  "Value": "cloudshell.ap-southeast-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "cloudtrail": {
                 "Value": "cloudtrail",
                 "endpoint": {
@@ -13972,6 +14065,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -14707,6 +14803,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-southeast-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -16516,6 +16621,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -17281,6 +17389,15 @@
               "verified-access": {
                 "Value": "verified-access"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-southeast-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -17624,6 +17741,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "cloudshell": {
+                "Value": "cloudshell",
+                "endpoint": {
+                  "Value": "cloudshell.ap-southeast-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "cloudtrail": {
                 "Value": "cloudtrail",
                 "endpoint": {
@@ -17930,6 +18056,15 @@
                   "Value": "HTTPS, HTTP"
                 }
               },
+              "globalaccelerator": {
+                "Value": "globalaccelerator",
+                "endpoint": {
+                  "Value": "globalaccelerator.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "glue": {
                 "Value": "glue",
                 "endpoint": {
@@ -18107,6 +18242,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -18500,6 +18638,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-southeast-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vpc": {
                 "Value": "vpc"
               },
@@ -19113,6 +19260,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -19425,6 +19575,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-southeast-4.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vpc": {
                 "Value": "vpc"
               },
@@ -20890,6 +21049,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -21544,6 +21706,15 @@
               "verified-access": {
                 "Value": "verified-access"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ca-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -22943,6 +23114,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "account": {
+                "Value": "account",
+                "endpoint": {
+                  "Value": "account.cn-northwest-1.amazonaws.com.cn"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "acm": {
                 "Value": "acm",
                 "endpoint": {
@@ -25901,6 +26081,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -26669,6 +26852,15 @@
               "verified-access": {
                 "Value": "verified-access"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -27386,6 +27578,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -27707,6 +27902,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-central-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vpc": {
                 "Value": "vpc"
               },
@@ -28074,6 +28278,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "cloudshell": {
+                "Value": "cloudshell",
+                "endpoint": {
+                  "Value": "cloudshell.eu-north-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "cloudtrail": {
                 "Value": "cloudtrail",
                 "endpoint": {
@@ -29022,6 +29235,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -29580,6 +29796,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-north-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -30595,6 +30820,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -31042,6 +31270,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -31685,6 +31922,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -32006,6 +32246,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vpc": {
                 "Value": "vpc"
               },
@@ -33813,6 +34062,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -34608,6 +34860,15 @@
               "verified-access": {
                 "Value": "verified-access"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -36307,6 +36568,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -36964,6 +37228,15 @@
               "verified-access": {
                 "Value": "verified-access"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-west-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -37393,6 +37666,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "cloudshell": {
+                "Value": "cloudshell",
+                "endpoint": {
+                  "Value": "cloudshell.eu-west-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "cloudtrail": {
                 "Value": "cloudtrail",
                 "endpoint": {
@@ -38284,6 +38566,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -38536,6 +38821,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "sagemaker-metrics": {
+                "Value": "sagemaker-metrics",
+                "endpoint": {
+                  "Value": "metrics.sagemaker.eu-west-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "sagemaker-runtime": {
                 "Value": "sagemaker-runtime",
                 "endpoint": {
@@ -38854,6 +39148,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-west-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -39596,6 +39899,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -39935,6 +40241,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.me-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vpc": {
                 "Value": "vpc"
               },
@@ -41010,6 +41325,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -41478,6 +41796,15 @@
               "trustedadvisor": {
                 "Value": "trustedadvisor"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.me-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -42781,6 +43108,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -43345,6 +43675,15 @@
               "verified-access": {
                 "Value": "verified-access"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.sa-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -43495,6 +43834,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "account": {
+                "Value": "account",
+                "endpoint": {
+                  "Value": "account.us-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "acm": {
                 "Value": "acm",
                 "endpoint": {
@@ -45484,6 +45832,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -46312,6 +46663,15 @@
               "verified-access": {
                 "Value": "verified-access"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.us-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -48076,6 +48436,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -48817,6 +49180,15 @@
               "verified-access": {
                 "Value": "verified-access"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.us-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -52990,6 +53362,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -53629,6 +54004,15 @@
               "verified-access": {
                 "Value": "verified-access"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.us-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
@@ -55603,6 +55987,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "notifications": {
+                "Value": "notifications"
+              },
               "oam": {
                 "Value": "oam",
                 "endpoint": {
@@ -56428,6 +56815,15 @@
               "verified-access": {
                 "Value": "verified-access"
               },
+              "verifiedpermissions": {
+                "Value": "verifiedpermissions",
+                "endpoint": {
+                  "Value": "verifiedpermissions.us-west-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "vmwarecloudonaws": {
                 "Value": "vmwarecloudonaws"
               },
diff --git a/moto/ssm/resources/services.json b/moto/ssm/resources/services.json
index b5acacdb2..c423b8d4c 100644
--- a/moto/ssm/resources/services.json
+++ b/moto/ssm/resources/services.json
@@ -413,6 +413,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "cn-northwest-1": {
+                "Value": "cn-northwest-1",
+                "endpoint": {
+                  "Value": "account.cn-northwest-1.amazonaws.com.cn"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "eu-central-1": {
                 "Value": "eu-central-1",
                 "endpoint": {
@@ -9578,6 +9587,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-southeast-1": {
+                "Value": "ap-southeast-1",
+                "endpoint": {
+                  "Value": "cloudshell.ap-southeast-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-southeast-2": {
                 "Value": "ap-southeast-2",
                 "endpoint": {
@@ -9587,6 +9605,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-southeast-3": {
+                "Value": "ap-southeast-3",
+                "endpoint": {
+                  "Value": "cloudshell.ap-southeast-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ca-central-1": {
                 "Value": "ca-central-1",
                 "endpoint": {
@@ -9605,6 +9632,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "eu-north-1": {
+                "Value": "eu-north-1",
+                "endpoint": {
+                  "Value": "cloudshell.eu-north-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "eu-south-1": {
                 "Value": "eu-south-1",
                 "endpoint": {
@@ -9632,6 +9668,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "eu-west-3": {
+                "Value": "eu-west-3",
+                "endpoint": {
+                  "Value": "cloudshell.eu-west-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "me-central-1": {
                 "Value": "me-central-1",
                 "endpoint": {
@@ -25333,6 +25378,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-southeast-3": {
+                "Value": "ap-southeast-3",
+                "endpoint": {
+                  "Value": "globalaccelerator.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ca-central-1": {
                 "Value": "ca-central-1",
                 "endpoint": {
@@ -38866,6 +38920,98 @@
               }
             }
           },
+          "notifications": {
+            "Value": "notifications",
+            "longName": {
+              "Value": "AWS User Notifications"
+            },
+            "marketingHomeURL": {
+              "Value": "https://aws.amazon.com/notifications/"
+            },
+            "regions": {
+              "af-south-1": {
+                "Value": "af-south-1"
+              },
+              "ap-east-1": {
+                "Value": "ap-east-1"
+              },
+              "ap-northeast-1": {
+                "Value": "ap-northeast-1"
+              },
+              "ap-northeast-2": {
+                "Value": "ap-northeast-2"
+              },
+              "ap-northeast-3": {
+                "Value": "ap-northeast-3"
+              },
+              "ap-south-1": {
+                "Value": "ap-south-1"
+              },
+              "ap-south-2": {
+                "Value": "ap-south-2"
+              },
+              "ap-southeast-1": {
+                "Value": "ap-southeast-1"
+              },
+              "ap-southeast-2": {
+                "Value": "ap-southeast-2"
+              },
+              "ap-southeast-3": {
+                "Value": "ap-southeast-3"
+              },
+              "ap-southeast-4": {
+                "Value": "ap-southeast-4"
+              },
+              "ca-central-1": {
+                "Value": "ca-central-1"
+              },
+              "eu-central-1": {
+                "Value": "eu-central-1"
+              },
+              "eu-central-2": {
+                "Value": "eu-central-2"
+              },
+              "eu-north-1": {
+                "Value": "eu-north-1"
+              },
+              "eu-south-1": {
+                "Value": "eu-south-1"
+              },
+              "eu-south-2": {
+                "Value": "eu-south-2"
+              },
+              "eu-west-1": {
+                "Value": "eu-west-1"
+              },
+              "eu-west-2": {
+                "Value": "eu-west-2"
+              },
+              "eu-west-3": {
+                "Value": "eu-west-3"
+              },
+              "me-central-1": {
+                "Value": "me-central-1"
+              },
+              "me-south-1": {
+                "Value": "me-south-1"
+              },
+              "sa-east-1": {
+                "Value": "sa-east-1"
+              },
+              "us-east-1": {
+                "Value": "us-east-1"
+              },
+              "us-east-2": {
+                "Value": "us-east-2"
+              },
+              "us-west-1": {
+                "Value": "us-west-1"
+              },
+              "us-west-2": {
+                "Value": "us-west-2"
+              }
+            }
+          },
           "oam": {
             "Value": "oam",
             "longName": {
@@ -47490,6 +47636,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "eu-west-3": {
+                "Value": "eu-west-3",
+                "endpoint": {
+                  "Value": "metrics.sagemaker.eu-west-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "me-central-1": {
                 "Value": "me-central-1"
               },
@@ -56818,6 +56973,260 @@
               }
             }
           },
+          "verifiedpermissions": {
+            "Value": "verifiedpermissions",
+            "longName": {
+              "Value": "Amazon Verified Permissions"
+            },
+            "marketingHomeURL": {
+              "Value": "https://aws.amazon.com/verified-permissions/"
+            },
+            "regions": {
+              "af-south-1": {
+                "Value": "af-south-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.af-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-east-1": {
+                "Value": "ap-east-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-northeast-1": {
+                "Value": "ap-northeast-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-northeast-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-northeast-2": {
+                "Value": "ap-northeast-2",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-northeast-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-northeast-3": {
+                "Value": "ap-northeast-3",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-northeast-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-south-1": {
+                "Value": "ap-south-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-south-2": {
+                "Value": "ap-south-2",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-southeast-1": {
+                "Value": "ap-southeast-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-southeast-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-southeast-2": {
+                "Value": "ap-southeast-2",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-southeast-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-southeast-3": {
+                "Value": "ap-southeast-3",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-southeast-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-southeast-4": {
+                "Value": "ap-southeast-4",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ap-southeast-4.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ca-central-1": {
+                "Value": "ca-central-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.ca-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eu-central-1": {
+                "Value": "eu-central-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eu-central-2": {
+                "Value": "eu-central-2",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-central-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eu-north-1": {
+                "Value": "eu-north-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-north-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eu-south-1": {
+                "Value": "eu-south-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eu-south-2": {
+                "Value": "eu-south-2",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eu-west-1": {
+                "Value": "eu-west-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eu-west-2": {
+                "Value": "eu-west-2",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-west-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eu-west-3": {
+                "Value": "eu-west-3",
+                "endpoint": {
+                  "Value": "verifiedpermissions.eu-west-3.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "me-central-1": {
+                "Value": "me-central-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.me-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "me-south-1": {
+                "Value": "me-south-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.me-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "sa-east-1": {
+                "Value": "sa-east-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.sa-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "us-east-1": {
+                "Value": "us-east-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.us-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "us-east-2": {
+                "Value": "us-east-2",
+                "endpoint": {
+                  "Value": "verifiedpermissions.us-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "us-west-1": {
+                "Value": "us-west-1",
+                "endpoint": {
+                  "Value": "verifiedpermissions.us-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "us-west-2": {
+                "Value": "us-west-2",
+                "endpoint": {
+                  "Value": "verifiedpermissions.us-west-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              }
+            }
+          },
           "vmwarecloudonaws": {
             "Value": "vmwarecloudonaws",
             "longName": {
diff --git a/moto/ssm/responses.py b/moto/ssm/responses.py
index 7d7b9d3d2..b53ba3c5c 100644
--- a/moto/ssm/responses.py
+++ b/moto/ssm/responses.py
@@ -453,3 +453,37 @@ class SimpleSystemManagerResponse(BaseResponse):
         window_id = self._get_param("WindowId")
         self.ssm_backend.delete_maintenance_window(window_id)
         return "{}"
+
+    def create_patch_baseline(self) -> str:
+        baseline_id = self.ssm_backend.create_patch_baseline(
+            name=self._get_param("Name"),
+            operating_system=self._get_param("OperatingSystem"),
+            global_filters=self._get_param("GlobalFilters", {}),
+            approval_rules=self._get_param("ApprovalRules", {}),
+            approved_patches=self._get_param("ApprovedPatches", []),
+            approved_patches_compliance_level=self._get_param(
+                "ApprovedPatchesComplianceLevel"
+            ),
+            approved_patches_enable_non_security=self._get_param(
+                "ApprovedPatchesEnableNonSecurity"
+            ),
+            rejected_patches=self._get_param("RejectedPatches", []),
+            rejected_patches_action=self._get_param("RejectedPatchesAction"),
+            description=self._get_param("Description"),
+            sources=self._get_param("Sources", []),
+            tags=self._get_param("Tags", []),
+        )
+        return json.dumps({"BaselineId": baseline_id})
+
+    def describe_patch_baselines(self) -> str:
+        filters = self._get_param("Filters", None)
+        baselines = [
+            baseline.to_json()
+            for baseline in self.ssm_backend.describe_patch_baselines(filters)
+        ]
+        return json.dumps({"BaselineIdentities": baselines})
+
+    def delete_patch_baseline(self) -> str:
+        baseline_id = self._get_param("BaselineId")
+        self.ssm_backend.delete_patch_baseline(baseline_id)
+        return "{}"


Test patch:
diff --git a/tests/__init__.py b/tests/__init__.py
index e938a957f..82e3d494d 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,6 +1,5 @@
 import logging
 
-from . import helpers  # noqa
 
 # Disable extra logging for tests
 logging.getLogger("boto").setLevel(logging.CRITICAL)
diff --git a/tests/test_cloudformation/test_cloudformation_stack_crud_boto3.py b/tests/test_cloudformation/test_cloudformation_stack_crud_boto3.py
index dcf59aa0c..9fa6bef0a 100644
--- a/tests/test_cloudformation/test_cloudformation_stack_crud_boto3.py
+++ b/tests/test_cloudformation/test_cloudformation_stack_crud_boto3.py
@@ -22,6 +22,7 @@ from moto.cloudformation import cloudformation_backends
 from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 
 from tests import EXAMPLE_AMI_ID
+from tests.helpers import match_dict  # noqa # pylint: disable=unused-import
 
 dummy_template = {
     "AWSTemplateFormatVersion": "2010-09-09",
diff --git a/tests/test_cloudformation/test_cloudformation_stack_integration.py b/tests/test_cloudformation/test_cloudformation_stack_integration.py
index 35f023da7..26326b3fd 100644
--- a/tests/test_cloudformation/test_cloudformation_stack_integration.py
+++ b/tests/test_cloudformation/test_cloudformation_stack_integration.py
@@ -29,6 +29,9 @@ from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 from tests import EXAMPLE_AMI_ID, EXAMPLE_AMI_ID2
 from tests.markers import requires_docker
 from tests.test_cloudformation.fixtures import fn_join, single_instance_with_ebs_volume
+from tests.helpers import (  # noqa # pylint: disable=unused-import
+    containing_item_with_attributes,
+)
 
 
 @mock_cloudformation
diff --git a/tests/test_config/test_config.py b/tests/test_config/test_config.py
index 8baa10bb2..966881ff4 100644
--- a/tests/test_config/test_config.py
+++ b/tests/test_config/test_config.py
@@ -40,31 +40,65 @@ def test_put_configuration_recorder():
         in ce.value.response["Error"]["Message"]
     )
 
-    # With resource types and flags set to True:
+    # With a combination of bad things:
     bad_groups = [
         {
             "allSupported": True,
             "includeGlobalResourceTypes": True,
             "resourceTypes": ["item"],
         },
+        {
+            "allSupported": True,
+            "includeGlobalResourceTypes": True,
+            "resourceTypes": ["item"],
+            "exclusionByResourceTypes": {"resourceTypes": ["item"]},
+        },
+        {
+            "allSupported": True,
+            "includeGlobalResourceTypes": True,
+            "exclusionByResourceTypes": {"resourceTypes": ["item"]},
+        },
+        {
+            "allSupported": True,
+            "includeGlobalResourceTypes": True,
+            "recordingStrategy": {"useOnly": "EXCLUSION_BY_RESOURCE_TYPES"},
+        },
         {
             "allSupported": False,
             "includeGlobalResourceTypes": True,
             "resourceTypes": ["item"],
         },
+        {
+            "resourceTypes": ["item"],
+            "exclusionByResourceTypes": {"resourceTypes": ["item"]},
+        },
+        {
+            "resourceTypes": ["item"],
+            "recordingStrategy": {"useOnly": "EXCLUSION_BY_RESOURCE_TYPES"},
+        },
         {
             "allSupported": True,
             "includeGlobalResourceTypes": False,
             "resourceTypes": ["item"],
         },
+        {
+            "allSupported": True,
+            "includeGlobalResourceTypes": False,
+            "exclusionByResourceTypes": {"resourceTypes": ["item"]},
+        },
         {
             "allSupported": False,
             "includeGlobalResourceTypes": False,
             "resourceTypes": [],
         },
+        {
+            "exclusionByResourceTypes": {"resourceTypes": []},
+            "recordingStrategy": {"useOnly": "EXCLUSION_BY_RESOURCE_TYPES"},
+        },
         {"includeGlobalResourceTypes": False, "resourceTypes": []},
         {"includeGlobalResourceTypes": True},
         {"resourceTypes": []},
+        {"exclusionByResourceTypes": {"resourceTypes": ["AWS::EC2::Instance"]}},
         {},
     ]
 
@@ -108,6 +142,54 @@ def test_put_configuration_recorder():
     )
     assert "AWS::EC2::Instance" in ce.value.response["Error"]["Message"]
 
+    # ... and again with exclusions:
+    with pytest.raises(ClientError) as ce:
+        client.put_configuration_recorder(
+            ConfigurationRecorder={
+                "name": "default",
+                "roleARN": "somearn",
+                "recordingGroup": {
+                    "allSupported": False,
+                    "includeGlobalResourceTypes": False,
+                    # 2 good, and 2 bad:
+                    "exclusionByResourceTypes": {
+                        "resourceTypes": [
+                            "AWS::EC2::Volume",
+                            "LOLNO",
+                            "AWS::EC2::VPC",
+                            "LOLSTILLNO",
+                        ]
+                    },
+                    "recordingStrategy": {"useOnly": "EXCLUSION_BY_RESOURCE_TYPES"},
+                },
+            }
+        )
+    assert ce.value.response["Error"]["Code"] == "ValidationException"
+    assert "2 validation error detected: Value '['LOLNO', 'LOLSTILLNO']" in str(
+        ce.value.response["Error"]["Message"]
+    )
+    assert "AWS::EC2::Instance" in ce.value.response["Error"]["Message"]
+
+    # With an invalid recording strategy:
+    with pytest.raises(ClientError) as ce:
+        client.put_configuration_recorder(
+            ConfigurationRecorder={
+                "name": "default",
+                "roleARN": "somearn",
+                "recordingGroup": {
+                    "allSupported": True,
+                    "includeGlobalResourceTypes": False,
+                    "recordingStrategy": {"useOnly": "LOLWUT"},
+                },
+            }
+        )
+    assert ce.value.response["Error"]["Code"] == "ValidationException"
+    assert (
+        "1 validation error detected: Value 'LOLWUT' at 'configurationRecorder.recordingGroup.recordingStrategy.useOnly' failed to satisfy "
+        "constraint: Member must satisfy enum value set: [INCLUSION_BY_RESOURCE_TYPES, ALL_SUPPORTED_RESOURCE_TYPES, EXCLUSION_BY_RESOURCE_TYPES]"
+        in str(ce.value.response["Error"]["Message"])
+    )
+
     # Create a proper one:
     client.put_configuration_recorder(
         ConfigurationRecorder={
@@ -132,6 +214,9 @@ def test_put_configuration_recorder():
         "AWS::EC2::Volume" in result[0]["recordingGroup"]["resourceTypes"]
         and "AWS::EC2::VPC" in result[0]["recordingGroup"]["resourceTypes"]
     )
+    assert result[0]["recordingGroup"]["recordingStrategy"] == {
+        "useOnly": "INCLUSION_BY_RESOURCE_TYPES"
+    }
 
     # Now update the configuration recorder:
     client.put_configuration_recorder(
@@ -151,6 +236,50 @@ def test_put_configuration_recorder():
     assert result[0]["recordingGroup"]["allSupported"]
     assert result[0]["recordingGroup"]["includeGlobalResourceTypes"]
     assert len(result[0]["recordingGroup"]["resourceTypes"]) == 0
+    assert result[0]["recordingGroup"]["recordingStrategy"] == {
+        "useOnly": "ALL_SUPPORTED_RESOURCE_TYPES"
+    }
+
+    # Verify that it works with the strategy passed in:
+    client.put_configuration_recorder(
+        ConfigurationRecorder={
+            "name": "testrecorder",
+            "roleARN": "somearn",
+            "recordingGroup": {
+                "allSupported": True,
+                "includeGlobalResourceTypes": True,
+                "recordingStrategy": {"useOnly": "ALL_SUPPORTED_RESOURCE_TYPES"},
+            },
+        }
+    )
+    assert client.describe_configuration_recorders()["ConfigurationRecorders"][0][
+        "recordingGroup"
+    ]["allSupported"]
+
+    # Update again for exclusions:
+    client.put_configuration_recorder(
+        ConfigurationRecorder={
+            "name": "testrecorder",
+            "roleARN": "somearn",
+            "recordingGroup": {
+                "exclusionByResourceTypes": {"resourceTypes": ["AWS::EC2::Instance"]},
+                "recordingStrategy": {"useOnly": "EXCLUSION_BY_RESOURCE_TYPES"},
+            },
+        }
+    )
+    result = client.describe_configuration_recorders()["ConfigurationRecorders"]
+    assert len(result) == 1
+    assert result[0]["name"] == "testrecorder"
+    assert result[0]["roleARN"] == "somearn"
+    assert not result[0]["recordingGroup"]["allSupported"]
+    assert not result[0]["recordingGroup"]["includeGlobalResourceTypes"]
+    assert not result[0]["recordingGroup"]["resourceTypes"]
+    assert result[0]["recordingGroup"]["exclusionByResourceTypes"]["resourceTypes"] == [
+        "AWS::EC2::Instance"
+    ]
+    assert result[0]["recordingGroup"]["recordingStrategy"] == {
+        "useOnly": "EXCLUSION_BY_RESOURCE_TYPES"
+    }
 
     # With a default recording group (i.e. lacking one)
     client.put_configuration_recorder(
@@ -162,7 +291,11 @@ def test_put_configuration_recorder():
     assert result[0]["roleARN"] == "somearn"
     assert result[0]["recordingGroup"]["allSupported"]
     assert not result[0]["recordingGroup"]["includeGlobalResourceTypes"]
-    assert not result[0]["recordingGroup"].get("resourceTypes")
+    assert not result[0]["recordingGroup"]["resourceTypes"]
+    assert not result[0]["recordingGroup"]["exclusionByResourceTypes"]["resourceTypes"]
+    assert result[0]["recordingGroup"]["recordingStrategy"] == {
+        "useOnly": "ALL_SUPPORTED_RESOURCE_TYPES"
+    }
 
     # Can currently only have exactly 1 Config Recorder in an account/region:
     with pytest.raises(ClientError) as ce:
diff --git a/tests/test_glue/test_partition_filter.py b/tests/test_glue/test_partition_filter.py
index 4bfa6aa1b..12bf31fcd 100644
--- a/tests/test_glue/test_partition_filter.py
+++ b/tests/test_glue/test_partition_filter.py
@@ -346,12 +346,11 @@ def test_get_partition_expression_warnings_and_exceptions():
 
     kwargs = {"DatabaseName": database_name, "TableName": table_name}
 
-    with pytest.warns(match="Expression filtering is experimental"):
-        response = client.get_partitions(**kwargs, Expression="string_col = 'test'")
-        partitions = response["Partitions"]
-        partitions.should.have.length_of(1)
-        partition = partitions[0]
-        partition["Values"].should.equal(["test", "int", "3.14"])
+    response = client.get_partitions(**kwargs, Expression="string_col = 'test'")
+    partitions = response["Partitions"]
+    partitions.should.have.length_of(1)
+    partition = partitions[0]
+    partition["Values"].should.equal(["test", "int", "3.14"])
 
     with pytest.raises(ClientError) as exc:
         client.get_partitions(**kwargs, Expression="float_col = 3.14")
diff --git a/tests/test_identitystore/test_identitystore.py b/tests/test_identitystore/test_identitystore.py
index 440889e06..ad7520d37 100644
--- a/tests/test_identitystore/test_identitystore.py
+++ b/tests/test_identitystore/test_identitystore.py
@@ -1,20 +1,41 @@
 """Unit tests for identitystore-supported APIs."""
-from uuid import UUID
+import random
+import string
+from uuid import UUID, uuid4
 
 import boto3
-import sure  # noqa # pylint: disable=unused-import
+import pytest
+from botocore.exceptions import ClientError
 
 from moto import mock_identitystore
+from moto.moto_api._internal import mock_random
 
 
 # See our Development Tips on writing tests for hints on how to write good tests:
 # http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html
 
 
+def get_identity_store_id() -> str:
+    return f"d-{random.choices(string.ascii_lowercase, k=10)}"
+
+
 @mock_identitystore
 def test_create_group():
-    client = boto3.client("identitystore", region_name="ap-southeast-1")
-    identity_store_id = "d-9067028cf5"
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+    create_resp = client.create_group(
+        IdentityStoreId=identity_store_id,
+        DisplayName="test_group",
+        Description="description",
+    )
+    assert create_resp["IdentityStoreId"] == identity_store_id
+    assert UUID(create_resp["GroupId"])
+
+
+@mock_identitystore
+def test_create_group_duplicate_name():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
     create_resp = client.create_group(
         IdentityStoreId=identity_store_id,
         DisplayName="test_group",
@@ -22,3 +43,568 @@ def test_create_group():
     )
     assert create_resp["IdentityStoreId"] == identity_store_id
     assert UUID(create_resp["GroupId"])
+
+    with pytest.raises(ClientError) as exc:
+        client.create_group(
+            IdentityStoreId=identity_store_id,
+            DisplayName="test_group",
+            Description="description",
+        )
+    err = exc.value
+    assert "ConflictException" in str(type(err))
+    assert (
+        str(err)
+        == "An error occurred (ConflictException) when calling the CreateGroup operation: Duplicate GroupDisplayName"
+    )
+    assert err.operation_name == "CreateGroup"
+    assert err.response["Error"]["Code"] == "ConflictException"
+    assert err.response["Error"]["Message"] == "Duplicate GroupDisplayName"
+    assert err.response["ResponseMetadata"]["HTTPStatusCode"] == 400
+    assert err.response["Message"] == "Duplicate GroupDisplayName"
+    assert err.response["Reason"] == "UNIQUENESS_CONSTRAINT_VIOLATION"
+
+
+@mock_identitystore
+def test_group_multiple_identity_stores():
+    identity_store_id = get_identity_store_id()
+    identity_store_id2 = get_identity_store_id()
+    client = boto3.client("identitystore", region_name="us-east-2")
+    group1 = __create_test_group(client, store_id=identity_store_id)
+    group2 = __create_test_group(client, store_id=identity_store_id2)
+
+    assert __group_exists(client, group1[0], store_id=identity_store_id)
+    assert not __group_exists(client, group1[0], store_id=identity_store_id2)
+
+    assert __group_exists(client, group2[0], store_id=identity_store_id2)
+    assert not __group_exists(client, group2[0], store_id=identity_store_id)
+
+
+@mock_identitystore
+def test_create_group_membership():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+
+    group_id = client.create_group(
+        IdentityStoreId=identity_store_id,
+        DisplayName="test_group",
+        Description="description",
+    )["GroupId"]
+
+    user_id = __create_and_verify_sparse_user(client, identity_store_id)
+
+    create_response = client.create_group_membership(
+        IdentityStoreId=identity_store_id,
+        GroupId=group_id,
+        MemberId={"UserId": user_id},
+    )
+    assert UUID(create_response["MembershipId"])
+    assert create_response["IdentityStoreId"] == identity_store_id
+
+    list_response = client.list_group_memberships(
+        IdentityStoreId=identity_store_id, GroupId=group_id
+    )
+    assert len(list_response["GroupMemberships"]) == 1
+    assert (
+        list_response["GroupMemberships"][0]["MembershipId"]
+        == create_response["MembershipId"]
+    )
+    assert list_response["GroupMemberships"][0]["MemberId"]["UserId"] == user_id
+
+
+@mock_identitystore
+def test_create_duplicate_username():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+
+    # This should succeed
+    client.create_user(
+        IdentityStoreId=identity_store_id,
+        UserName="deleteme_username",
+        DisplayName="deleteme_displayname",
+        Name={"GivenName": "Givenname", "FamilyName": "Familyname"},
+    )
+
+    with pytest.raises(ClientError) as exc:
+        # This should fail
+        client.create_user(
+            IdentityStoreId=identity_store_id,
+            UserName="deleteme_username",
+            DisplayName="deleteme_displayname",
+            Name={"GivenName": "Givenname", "FamilyName": "Familyname"},
+        )
+    err = exc.value
+    assert "ConflictException" in str(type(err))
+    assert (
+        str(err)
+        == "An error occurred (ConflictException) when calling the CreateUser operation: Duplicate UserName"
+    )
+    assert err.operation_name == "CreateUser"
+    assert err.response["Error"]["Code"] == "ConflictException"
+    assert err.response["Error"]["Message"] == "Duplicate UserName"
+    assert err.response["ResponseMetadata"]["HTTPStatusCode"] == 400
+    assert err.response["Message"] == "Duplicate UserName"
+    assert err.response["Reason"] == "UNIQUENESS_CONSTRAINT_VIOLATION"
+
+
+@mock_identitystore
+def test_create_username_no_username():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+
+    with pytest.raises(ClientError) as exc:
+        client.create_user(IdentityStoreId=identity_store_id)
+    err = exc.value
+    assert "ValidationException" in str(type(err))
+    assert (
+        str(err)
+        == "An error occurred (ValidationException) when calling the CreateUser operation: userName is a required attribute"
+    )
+    assert err.operation_name == "CreateUser"
+    assert err.response["Error"]["Code"] == "ValidationException"
+    assert err.response["Error"]["Message"] == "userName is a required attribute"
+    assert err.response["ResponseMetadata"]["HTTPStatusCode"] == 400
+    assert err.response["Message"] == "userName is a required attribute"
+
+
+@mock_identitystore
+def test_create_username_missing_required_attributes():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+
+    with pytest.raises(ClientError) as exc:
+        client.create_user(
+            IdentityStoreId=identity_store_id, UserName="username", Name={}
+        )
+    err = exc.value
+    assert "ValidationException" in str(type(err))
+    assert (
+        str(err)
+        == "An error occurred (ValidationException) when calling the CreateUser operation: displayname: The attribute displayname is required, name: The attribute name is required"
+    )
+    assert err.operation_name == "CreateUser"
+    assert err.response["Error"]["Code"] == "ValidationException"
+    assert (
+        err.response["Error"]["Message"]
+        == "displayname: The attribute displayname is required, name: The attribute name is required"
+    )
+    assert err.response["ResponseMetadata"]["HTTPStatusCode"] == 400
+    assert (
+        err.response["Message"]
+        == "displayname: The attribute displayname is required, name: The attribute name is required"
+    )
+
+
+@mock_identitystore
+@pytest.mark.parametrize(
+    "field, missing", [("GivenName", "familyname"), ("FamilyName", "givenname")]
+)
+def test_create_username_missing_required_name_field(field, missing):
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+
+    with pytest.raises(ClientError) as exc:
+        client.create_user(
+            IdentityStoreId=identity_store_id,
+            UserName="username",
+            DisplayName="displayName",
+            Name={field: field},
+        )
+    err = exc.value
+    assert "ValidationException" in str(type(err))
+    assert (
+        str(err)
+        == f"An error occurred (ValidationException) when calling the CreateUser operation: {missing}: The attribute {missing} is required"
+    )
+    assert err.operation_name == "CreateUser"
+    assert err.response["Error"]["Code"] == "ValidationException"
+    assert (
+        err.response["Error"]["Message"]
+        == f"{missing}: The attribute {missing} is required"
+    )
+    assert err.response["ResponseMetadata"]["HTTPStatusCode"] == 400
+    assert err.response["Message"] == f"{missing}: The attribute {missing} is required"
+
+
+@mock_identitystore
+def test_create_describe_sparse_user():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+    response = client.create_user(
+        IdentityStoreId=identity_store_id,
+        UserName="the_username",
+        DisplayName="display_name",
+        Name={"GivenName": "given_name", "FamilyName": "family_name"},
+    )
+    assert UUID(response["UserId"])
+
+    user_resp = client.describe_user(
+        IdentityStoreId=identity_store_id, UserId=response["UserId"]
+    )
+
+    assert user_resp["UserName"] == "the_username"
+    assert user_resp["DisplayName"] == "display_name"
+    assert "Name" in user_resp
+    assert user_resp["Name"]["GivenName"] == "given_name"
+    assert user_resp["Name"]["FamilyName"] == "family_name"
+
+
+@mock_identitystore
+def test_create_describe_full_user():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+    response = client.create_user(
+        IdentityStoreId=identity_store_id,
+        UserName="the_username",
+        DisplayName="display_name",
+        Name={
+            "Formatted": "formatted_name",
+            "GivenName": "given_name",
+            "FamilyName": "family_name",
+            "MiddleName": "middle_name",
+            "HonorificPrefix": "The Honorable",
+            "HonorificSuffix": "Wisest of us all",
+        },
+        NickName="nick_name",
+        ProfileUrl="https://example.com",
+        Emails=[
+            {"Value": "email1@example.com", "Type": "Personal", "Primary": True},
+            {"Value": "email2@example.com", "Type": "Work", "Primary": False},
+        ],
+        Addresses=[
+            {
+                "StreetAddress": "123 Address St.",
+                "Locality": "locality",
+                "Region": "region",
+                "PostalCode": "123456",
+                "Country": "USA",
+                "Formatted": "123 Address St.\nlocality, region, 123456",
+                "Type": "Home",
+                "Primary": True,
+            },
+        ],
+        PhoneNumbers=[
+            {"Value": "555-456-7890", "Type": "Home", "Primary": True},
+        ],
+        UserType="user_type",
+        Title="title",
+        PreferredLanguage="preferred_language",
+        Locale="locale",
+        Timezone="timezone",
+    )
+    assert UUID(response["UserId"])
+
+    user_resp = client.describe_user(
+        IdentityStoreId=identity_store_id, UserId=response["UserId"]
+    )
+
+    assert user_resp["UserName"] == "the_username"
+    assert user_resp["DisplayName"] == "display_name"
+    assert "Name" in user_resp
+    assert user_resp["Name"]["Formatted"] == "formatted_name"
+    assert user_resp["Name"]["GivenName"] == "given_name"
+    assert user_resp["Name"]["FamilyName"] == "family_name"
+    assert user_resp["Name"]["MiddleName"] == "middle_name"
+    assert user_resp["Name"]["HonorificPrefix"] == "The Honorable"
+    assert user_resp["Name"]["HonorificSuffix"] == "Wisest of us all"
+    assert user_resp["NickName"] == "nick_name"
+    assert user_resp["ProfileUrl"] == "https://example.com"
+    assert "Emails" in user_resp
+    assert len(user_resp["Emails"]) == 2
+    email1 = user_resp["Emails"][0]
+    assert email1["Value"] == "email1@example.com"
+    assert email1["Type"] == "Personal"
+    assert email1["Primary"] is True
+    email2 = user_resp["Emails"][1]
+    assert email2["Value"] == "email2@example.com"
+    assert email2["Type"] == "Work"
+    assert email2["Primary"] is False
+    assert "Addresses" in user_resp
+    assert len(user_resp["Addresses"]) == 1
+    assert user_resp["Addresses"][0]["StreetAddress"] == "123 Address St."
+    assert user_resp["Addresses"][0]["Locality"] == "locality"
+    assert user_resp["Addresses"][0]["Region"] == "region"
+    assert user_resp["Addresses"][0]["PostalCode"] == "123456"
+    assert user_resp["Addresses"][0]["Country"] == "USA"
+    assert (
+        user_resp["Addresses"][0]["Formatted"]
+        == "123 Address St.\nlocality, region, 123456"
+    )
+    assert user_resp["Addresses"][0]["Type"] == "Home"
+    assert user_resp["Addresses"][0]["Primary"] is True
+    assert "PhoneNumbers" in user_resp
+    assert len(user_resp["PhoneNumbers"]) == 1
+    assert user_resp["PhoneNumbers"][0]["Value"] == "555-456-7890"
+    assert user_resp["PhoneNumbers"][0]["Type"] == "Home"
+    assert user_resp["PhoneNumbers"][0]["Primary"] is True
+    assert user_resp["UserType"] == "user_type"
+    assert user_resp["Title"] == "title"
+    assert user_resp["PreferredLanguage"] == "preferred_language"
+    assert user_resp["Locale"] == "locale"
+    assert user_resp["Timezone"] == "timezone"
+
+
+@mock_identitystore
+def test_describe_user_doesnt_exist():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+
+    with pytest.raises(ClientError) as exc:
+        client.describe_user(
+            IdentityStoreId=identity_store_id, UserId=str(mock_random.uuid4())
+        )
+
+    err = exc.value
+    assert err.response["Error"]["Code"] == "ResourceNotFoundException"
+    assert err.response["Error"]["Message"] == "USER not found."
+    assert err.response["ResponseMetadata"]["HTTPStatusCode"] == 400
+    assert err.response["ResourceType"] == "USER"
+    assert err.response["Message"] == "USER not found."
+    assert "RequestId" in err.response
+
+
+@mock_identitystore
+def test_get_group_id():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+    groups = {}
+
+    # Create a bunch of groups
+    for _ in range(1, 10):
+        group = __create_test_group(client, identity_store_id)
+        groups[group[0]] = group[1]
+
+    # Make sure we can get their ID
+    for name, group_id in groups.items():
+
+        response = client.get_group_id(
+            IdentityStoreId=identity_store_id,
+            AlternateIdentifier={
+                "UniqueAttribute": {
+                    "AttributePath": "displayName",
+                    "AttributeValue": name,
+                }
+            },
+        )
+
+        assert response["IdentityStoreId"] == identity_store_id
+        assert response["GroupId"] == group_id
+
+
+@mock_identitystore
+def test_get_group_id_does_not_exist():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+    with pytest.raises(ClientError) as exc:
+        client.get_group_id(
+            IdentityStoreId=identity_store_id,
+            AlternateIdentifier={
+                "UniqueAttribute": {
+                    "AttributePath": "displayName",
+                    "AttributeValue": "does-not-exist",
+                }
+            },
+        )
+    err = exc.value
+    assert err.response["Error"]["Code"] == "ResourceNotFoundException"
+    assert err.response["Error"]["Message"] == "GROUP not found."
+    assert err.response["ResponseMetadata"]["HTTPStatusCode"] == 400
+    assert err.response["ResourceType"] == "GROUP"
+    assert err.response["Message"] == "GROUP not found."
+    assert "RequestId" in err.response
+
+
+@mock_identitystore
+def test_list_group_memberships():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+
+    start = 0
+    end = 5000
+    batch_size = 321
+    next_token = None
+    membership_ids = []
+
+    group_id = client.create_group(
+        IdentityStoreId=identity_store_id,
+        DisplayName="test_group",
+        Description="description",
+    )["GroupId"]
+
+    for _ in range(end):
+        user_id = __create_and_verify_sparse_user(client, identity_store_id)
+        create_response = client.create_group_membership(
+            IdentityStoreId=identity_store_id,
+            GroupId=group_id,
+            MemberId={"UserId": user_id},
+        )
+        membership_ids.append((create_response["MembershipId"], user_id))
+
+    for iteration in range(start, end, batch_size):
+        last_iteration = end - iteration <= batch_size
+        expected_size = batch_size if not last_iteration else end - iteration
+        end_index = iteration + expected_size
+
+        if next_token is not None:
+            list_response = client.list_group_memberships(
+                IdentityStoreId=identity_store_id,
+                GroupId=group_id,
+                MaxResults=batch_size,
+                NextToken=next_token,
+            )
+        else:
+            list_response = client.list_group_memberships(
+                IdentityStoreId=identity_store_id,
+                GroupId=group_id,
+                MaxResults=batch_size,
+            )
+
+        assert len(list_response["GroupMemberships"]) == expected_size
+        __check_membership_list_values(
+            list_response["GroupMemberships"], membership_ids[iteration:end_index]
+        )
+        if last_iteration:
+            assert "NextToken" not in list_response
+        else:
+            assert "NextToken" in list_response
+            next_token = list_response["NextToken"]
+
+
+def __check_membership_list_values(members, expected):
+    assert len(members) == len(expected)
+    for i in range(len(expected)):
+        assert members[i]["MembershipId"] == expected[i][0]
+        assert members[i]["MemberId"]["UserId"] == expected[i][1]
+
+
+@mock_identitystore
+def test_delete_group():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+
+    test_group = __create_test_group(client, identity_store_id)
+    assert __group_exists(client, test_group[0], identity_store_id)
+
+    resp = client.delete_group(IdentityStoreId=identity_store_id, GroupId=test_group[1])
+    assert "ResponseMetadata" in resp
+    assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200
+
+    assert not __group_exists(client, test_group[0], identity_store_id)
+
+
+@mock_identitystore
+def test_delete_group_doesnt_exist():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+
+    bogus_id = str(uuid4())
+
+    resp = client.delete_group(IdentityStoreId=identity_store_id, GroupId=bogus_id)
+    assert "ResponseMetadata" in resp
+    assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200
+
+    assert not __group_exists(client, bogus_id, identity_store_id)
+
+
+@mock_identitystore
+def test_delete_group_membership():
+    client = boto3.client("identitystore", region_name="eu-west-1")
+    identity_store_id = get_identity_store_id()
+    user_id = __create_and_verify_sparse_user(client, identity_store_id)
+    _, group_id = __create_test_group(client, identity_store_id)
+
+    membership = client.create_group_membership(
+        IdentityStoreId=identity_store_id,
+        GroupId=group_id,
+        MemberId={"UserId": user_id},
+    )
+
+    # Verify the group membership
+    response = client.list_group_memberships(
+        IdentityStoreId=identity_store_id, GroupId=group_id
+    )
+    assert response["GroupMemberships"][0]["MemberId"]["UserId"] == user_id
+
+    client.delete_group_membership(
+        IdentityStoreId=identity_store_id, MembershipId=membership["MembershipId"]
+    )
+
+    # Verify the group membership has been removed
+    response = client.list_group_memberships(
+        IdentityStoreId=identity_store_id, GroupId=group_id
+    )
+    assert len(response["GroupMemberships"]) == 0
+
+
+@mock_identitystore
+def test_delete_user():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+    user_id = __create_and_verify_sparse_user(client, identity_store_id)
+
+    client.delete_user(IdentityStoreId=identity_store_id, UserId=user_id)
+
+    with pytest.raises(ClientError) as exc:
+        client.describe_user(IdentityStoreId=identity_store_id, UserId=user_id)
+    err = exc.value
+    assert err.response["Error"]["Code"] == "ResourceNotFoundException"
+
+
+@mock_identitystore
+def test_delete_user_doesnt_exist():
+    client = boto3.client("identitystore", region_name="us-east-2")
+    identity_store_id = get_identity_store_id()
+
+    # This test ensures that the delete_user call does not raise an error if the user ID does not exist
+    client.delete_user(
+        IdentityStoreId=identity_store_id, UserId=str(mock_random.uuid4())
+    )
+
+
+def __create_test_group(client, store_id: str):
+    rand = "".join(random.choices(string.ascii_lowercase, k=8))
+    group_name = f"test_group_{rand}"
+
+    create_resp = client.create_group(
+        IdentityStoreId=store_id,
+        DisplayName=group_name,
+        Description="description",
+    )
+
+    return group_name, create_resp["GroupId"]
+
+
+def __group_exists(client, group_name: str, store_id: str) -> bool:
+    try:
+        client.get_group_id(
+            IdentityStoreId=store_id,
+            AlternateIdentifier={
+                "UniqueAttribute": {
+                    "AttributePath": "displayName",
+                    "AttributeValue": group_name,
+                }
+            },
+        )
+        return True
+    except ClientError as e:
+        if "ResourceNotFoundException" in str(type(e)):
+            return False
+        raise e
+
+
+def __create_and_verify_sparse_user(client, store_id: str):
+    rand = random.choices(string.ascii_lowercase, k=8)
+    username = f"the_username_{rand}"
+    response = client.create_user(
+        IdentityStoreId=store_id,
+        UserName=username,
+        DisplayName=f"display_name_{rand}",
+        Name={"GivenName": f"given_name_{rand}", "FamilyName": f"family_name_{rand}"},
+    )
+    assert UUID(response["UserId"])
+
+    user_resp = client.describe_user(
+        IdentityStoreId=store_id, UserId=response["UserId"]
+    )
+
+    assert user_resp["UserName"] == username
+    return user_resp["UserId"]
diff --git a/tests/test_redshiftdata/test_server.py b/tests/test_redshiftdata/test_server.py
index 1ccf9bba9..5c01694d6 100644
--- a/tests/test_redshiftdata/test_server.py
+++ b/tests/test_redshiftdata/test_server.py
@@ -7,6 +7,7 @@ from tests.test_redshiftdata.test_redshiftdata_constants import (
     DEFAULT_ENCODING,
     HttpHeaders,
 )
+from tests.helpers import match_uuid4  # noqa # pylint: disable=unused-import
 
 CLIENT_ENDPOINT = "/"
 
diff --git a/tests/test_ssm/test_ssm_patch_baseline.py b/tests/test_ssm/test_ssm_patch_baseline.py
new file mode 100644
index 000000000..2e4971b87
--- /dev/null
+++ b/tests/test_ssm/test_ssm_patch_baseline.py
@@ -0,0 +1,100 @@
+import boto3
+import sure  # noqa # pylint: disable=unused-import
+
+from moto import mock_ssm
+
+
+@mock_ssm
+def test_create_patch_baseLine():
+    ssm = boto3.client("ssm", region_name="us-east-1")
+
+    baseline_name = "ExamplePatchBaseline"
+    baseline_description = "Example patch baseline created using Boto3"
+
+    # Define the approval rules for the patch baseline
+    approval_rules = {
+        "PatchRules": [
+            {
+                "PatchFilterGroup": {
+                    "PatchFilters": [
+                        {"Key": "PRODUCT", "Values": ["AmazonLinux2012.03"]},
+                        {"Key": "CLASSIFICATION", "Values": ["Security"]},
+                    ]
+                },
+                "ApproveAfterDays": 7,
+                "ComplianceLevel": "CRITICAL",
+            }
+        ]
+    }
+
+    # Create the patch baseline
+    response = ssm.create_patch_baseline(
+        Name=baseline_name,
+        OperatingSystem="AMAZON_LINUX",
+        Description=baseline_description,
+        ApprovalRules=approval_rules,
+    )
+
+    _id = response["BaselineId"]  # mw-01d6bbfdf6af2c39a
+
+    response = ssm.describe_patch_baselines(
+        Filters=[
+            {
+                "Key": "NAME_PREFIX",
+                "Values": [
+                    baseline_name,
+                ],
+            },
+        ],
+        MaxResults=50,
+    )
+    response.should.have.key("BaselineIdentities").have.length_of(1)
+    baseline = response["BaselineIdentities"][0]
+    baseline.should.have.key("BaselineId").equal(_id)
+    baseline.should.have.key("BaselineName").equal(baseline_name)
+    baseline.should.have.key("DefaultBaseline").equal(False)
+    baseline.should.have.key("OperatingSystem").equal("AMAZON_LINUX")
+    baseline.should.have.key("BaselineDescription").equal(baseline_description)
+
+
+@mock_ssm
+def test_delete_patch_baseline():
+    ssm = boto3.client("ssm", region_name="us-east-1")
+
+    baseline_name = "ExamplePatchBaseline"
+
+    # Create the patch baseline
+    response = ssm.create_patch_baseline(
+        Name="ExamplePatchBaseline",
+        OperatingSystem="AMAZON_LINUX",
+        Description="Example patch baseline created using Boto3",
+        ApprovalRules={
+            "PatchRules": [
+                {
+                    "PatchFilterGroup": {
+                        "PatchFilters": [
+                            {"Key": "PRODUCT", "Values": ["AmazonLinux2012.03"]},
+                            {"Key": "CLASSIFICATION", "Values": ["Security"]},
+                        ]
+                    },
+                    "ApproveAfterDays": 7,
+                    "ComplianceLevel": "CRITICAL",
+                }
+            ]
+        },
+    )
+
+    _id = response["BaselineId"]  # pw-0a49ee14c7f305f55
+    ssm.delete_patch_baseline(BaselineId=_id)
+    response = ssm.describe_patch_baselines(
+        Filters=[
+            {
+                "Key": "NAME_PREFIX",
+                "Values": [
+                    baseline_name,
+                ],
+            },
+        ],
+        MaxResults=50,
+    )
+    response.should.have.key("BaselineIdentities").have.length_of(0)