Repository: getmoto/moto
Pull request #9014 (2025-06-26 10:39:01)

Ssm: Ensure describe_parameters honors tag updates
Make sure add_tags_to_resource and remove_tags_from_resource are reflected when running describe_parameters with filters.

argggh: This removes the `tags` property of the `Parameter` object altogether; I'm not sure if that's the best approach? At least it removes the inconsistency between the `_resource_tags` dict and the tags associated with the object directly. (This seems to be the underlying cause of localstack/localstack#11050.)

Compliance with AWS Parameter store behavior verified with
```
$ aws ssm put-parameter --name /spam/eggs --value "eggs" --type String --tags '[{"Key":"spam","Value":"eggs"}]'

$ aws ssm put-parameter --name /spam/was-ham --value "originally ham" --type String --tags '[{"Key":"spam","Value":"ham"}]'
$ aws ssm add-tags-to-resource --resource-id /spam/was-ham --resource-type Parameter --tags '[{"Key": "spam", "Value": "eggs"}]'

$ aws ssm put-parameter --name /spam/eventually-eggs --value "eventually eggs" --type String
$ aws ssm add-tags-to-resource --resource-id /spam/eventually-eggs --resource-type Parameter --tags '[{"Key": "spam", "Value": "eggs"}]'

$ aws ssm put-parameter --name /spam/becomes-ham --value "was eggs" --type String --tags '[{"Key":"spam","Value":"eggs"}]'
$ aws ssm add-tags-to-resource --resource-id /spam/becomes-ham --resource-type Parameter --tags '[{"Key": "spam", "Value": "ham"}]'

$ aws ssm put-parameter --name /spam/remove-spam --value "was eggs" --type String --tags '[{"Key":"spam","Value":"eggs"}]'
$ aws ssm remove-tags-from-resource --resource-id /spam/remove-spam --resource-type Parameter --tag-keys '["spam"]'

$ aws ssm describe-parameters --parameter-filters '[{"Key": "tag:spam", "Values": ["eggs"]}]' | jq -r .Parameters[].Name
/spam/eggs
/spam/eventually-eggs
/spam/was-ham

$ aws ssm describe-parameters --parameter-filters '[{"Key": "tag:spam"}]' | jq -r .Parameters[].Name
/spam/becomes-ham
/spam/eggs
/spam/eventually-eggs
/spam/was-ham
```

Patch:
diff --git a/moto/core/responses.py b/moto/core/responses.py
index be15dab19..fc7298456 100644
--- a/moto/core/responses.py
+++ b/moto/core/responses.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
 import datetime
 import functools
 import json
@@ -5,6 +7,7 @@ import logging
 import os
 import re
 from collections import OrderedDict, defaultdict
+from dataclasses import dataclass
 from typing import (
     TYPE_CHECKING,
     Any,
@@ -23,14 +26,14 @@ from xml.dom.minidom import parseString as parseXML
 
 import boto3
 import requests
-import xmltodict
+from botocore.model import OperationModel, ServiceModel
 from jinja2 import DictLoader, Environment, Template
 from werkzeug.exceptions import HTTPException
 
 from moto import settings
 from moto.core.common_types import TYPE_IF_NONE, TYPE_RESPONSE
 from moto.core.exceptions import DryRunClientError, ServiceException
-from moto.core.serialize import SERIALIZERS, XFormedAttributePicker
+from moto.core.serialize import SERIALIZERS, ResponseSerializer, XFormedAttributePicker
 from moto.core.utils import (
     camelcase_to_underscores,
     get_service_model,
@@ -279,6 +282,14 @@ class ActionAuthenticatorMixin(object):
         return decorator
 
 
+@dataclass
+class ActionContext:
+    service_model: ServiceModel
+    operation_model: OperationModel
+    serializer_class: type[ResponseSerializer]
+    response_class: type[BaseResponse]
+
+
 class ActionResult:
     """Wrapper class for serializable results returned from `responses.py` methods."""
 
@@ -289,6 +300,34 @@ class ActionResult:
     def result(self) -> object:
         return self._result
 
+    def execute_result(self, context: ActionContext) -> TYPE_RESPONSE:
+        """
+        Execute the result in the context of the given service and operation model.
+        This is a placeholder for any logic that might be needed to process the result
+        based on the service and operation context.
+        """
+        serializer_cls = context.serializer_class
+        response_transformers = getattr(
+            context.response_class, "RESPONSE_KEY_PATH_TO_TRANSFORMER", None
+        )
+        value_picker = XFormedAttributePicker(
+            response_transformers=response_transformers
+        )
+        serializer = serializer_cls(
+            operation_model=context.operation_model,
+            pretty_print=settings.PRETTIFY_RESPONSES,
+            value_picker=value_picker,
+        )
+        serialized = serializer.serialize(self.result)
+        return serialized["status_code"], serialized["headers"], serialized["body"]  # type: ignore[return-value]
+
+
+class EmptyResult(ActionResult):
+    """A special ActionResult that represents an empty result."""
+
+    def __init__(self) -> None:
+        super().__init__(None)
+
 
 class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin):
     default_region = "us-east-1"
@@ -595,13 +634,10 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin):
         service_model = get_service_model(self.service_name)
         operation_model = service_model.operation_model(self._get_action())
         serializer_cls = SERIALIZERS[service_model.protocol]
-        serializer = serializer_cls(
-            operation_model=operation_model,
-            pretty_print=settings.PRETTIFY_RESPONSES,
-            value_picker=XFormedAttributePicker(),
+        context = ActionContext(
+            service_model, operation_model, serializer_cls, self.__class__
         )
-        serialized = serializer.serialize(action_result.result)
-        return serialized["status_code"], serialized["headers"], serialized["body"]  # type: ignore[return-value]
+        return action_result.execute_result(context)
 
     def call_action(self) -> TYPE_RESPONSE:
         headers = self.response_headers
@@ -1238,80 +1274,3 @@ def flatten_json_request_body(
     if prefix:
         prefix = prefix + "."
     return dict((prefix + k, v) for k, v in flat.items())
-
-
-def xml_to_json_response(
-    service_spec: Any, operation: str, xml: str, result_node: Any = None
-) -> Dict[str, Any]:
-    """Convert rendered XML response to JSON for use with boto3."""
-
-    def transform(value: Any, spec: Dict[str, Any]) -> Any:
-        """Apply transformations to make the output JSON comply with the
-        expected form. This function applies:
-
-          (1) Type cast to nodes with "type" property (e.g., 'true' to
-              True). XML field values are all in text so this step is
-              necessary to convert it to valid JSON objects.
-
-          (2) Squashes "member" nodes to lists.
-
-        """
-        if len(spec) == 1:
-            return from_str(value, spec)
-
-        od: Dict[str, Any] = OrderedDict()
-        for k, v in value.items():
-            if k.startswith("@"):
-                continue
-
-            if k not in spec:
-                # this can happen when with an older version of
-                # botocore for which the node in XML template is not
-                # defined in service spec.
-                log.warning("Field %s is not defined by the botocore version in use", k)
-                continue
-
-            if spec[k]["type"] == "list":
-                if v is None:
-                    od[k] = []
-                elif len(spec[k]["member"]) == 1:
-                    if isinstance(v["member"], list):
-                        od[k] = transform(v["member"], spec[k]["member"])
-                    else:
-                        od[k] = [transform(v["member"], spec[k]["member"])]
-                elif isinstance(v["member"], list):
-                    od[k] = [transform(o, spec[k]["member"]) for o in v["member"]]
-                elif isinstance(v["member"], (OrderedDict, dict)):
-                    od[k] = [transform(v["member"], spec[k]["member"])]
-                else:
-                    raise ValueError("Malformatted input")
-            elif spec[k]["type"] == "map":
-                if v is None:
-                    od[k] = {}
-                else:
-                    items = (
-                        [v["entry"]] if not isinstance(v["entry"], list) else v["entry"]
-                    )
-                    for item in items:
-                        key = from_str(item["key"], spec[k]["key"])
-                        val = from_str(item["value"], spec[k]["value"])
-                        if k not in od:
-                            od[k] = {}
-                        od[k][key] = val
-            else:
-                if v is None:
-                    od[k] = None
-                else:
-                    od[k] = transform(v, spec[k])
-        return od
-
-    dic = xmltodict.parse(xml)
-    output_spec = service_spec.output_spec(operation)
-    try:
-        for k in result_node or (operation + "Response", operation + "Result"):
-            dic = dic[k]
-    except KeyError:
-        return None  # type: ignore[return-value]
-    else:
-        return transform(dic, output_spec)
-    return None
diff --git a/moto/core/serialize.py b/moto/core/serialize.py
index a94c11e7e..59c9cc3f4 100644
--- a/moto/core/serialize.py
+++ b/moto/core/serialize.py
@@ -58,7 +58,16 @@ import calendar
 import json
 from dataclasses import dataclass
 from datetime import datetime
-from typing import Any, Generator, Mapping, MutableMapping, Optional, TypedDict, Union
+from typing import (
+    Any,
+    Callable,
+    Generator,
+    Mapping,
+    MutableMapping,
+    Optional,
+    TypedDict,
+    Union,
+)
 
 import xmltodict
 from botocore import xform_name
@@ -68,6 +77,7 @@ from botocore.model import (
     MapShape,
     NoShapeFoundError,
     OperationModel,
+    ServiceModel,
     Shape,
     StructureShape,
 )
@@ -255,6 +265,7 @@ class ResponseSerializer(ShapeHelpersMixin):
             value_picker = DefaultAttributePicker()
         self._value_picker = value_picker
         self._timestamp_serializer = TimestampSerializer(self.DEFAULT_TIMESTAMP_FORMAT)
+        self.path = []
 
     def _create_default_response(self) -> ResponseDict:
         response_dict: ResponseDict = {
@@ -334,7 +345,14 @@ class ResponseSerializer(ShapeHelpersMixin):
         return base64.b64encode(value).strip().decode(self.DEFAULT_ENCODING)
 
     def get_value(self, value: Any, key: str, shape: Shape) -> Any:
-        context = AttributePickerContext(obj=value, key=key, shape=shape)
+        context = AttributePickerContext(
+            obj=value,
+            key=key,
+            shape=shape,
+            operation_model=self.operation_model,
+            service_model=self.operation_model.service_model,
+            key_path=".".join(self.path),
+        )
         return self._value_picker(context)
 
     @staticmethod
@@ -377,7 +395,12 @@ class ResponseSerializer(ShapeHelpersMixin):
         method = getattr(
             self, "_serialize_type_%s" % shape.type_name, self._default_serialize
         )
+        if not key:
+            self.path.append(shape.name)
+        else:
+            self.path.append(key)
         method(serialized, value, shape, key)
+        self.path.pop()
 
     @staticmethod
     def _default_serialize(
@@ -555,9 +578,10 @@ class BaseJSONSerializer(ResponseSerializer):
             # a __current__ key on a wrapper dict to serialize each
             # list item before appending it to the serialized list.
             assert isinstance(shape.member, Shape)  # mypy hint
-            self._serialize(wrapper, list_item, shape.member, "__current__")
-            if "__current__" in wrapper:
-                list_obj.append(wrapper["__current__"])
+            item_key = shape.member.name
+            self._serialize(wrapper, list_item, shape.member, item_key)
+            if item_key in wrapper:
+                list_obj.append(wrapper[item_key])
             else:
                 list_obj.append(list_item)
 
@@ -677,9 +701,10 @@ class BaseXMLSerializer(ResponseSerializer):
             items_name = self.get_serialized_name(shape.member, "member")
             serialized[key] = {items_name: list_obj}
         for list_item in value:
+            item_key = shape.member.name
             wrapper = {}
-            self._serialize(wrapper, list_item, shape.member, "__current__")
-            list_obj.append(wrapper["__current__"])
+            self._serialize(wrapper, list_item, shape.member, item_key)
+            list_obj.append(wrapper[item_key])
         if not list_obj:
             serialized[key] = ""
 
@@ -908,6 +933,9 @@ class AttributePickerContext:
     obj: Any
     key: str
     shape: Shape
+    operation_model: OperationModel | None = None
+    service_model: ServiceModel | None = None
+    key_path: str = ""
 
 
 class DefaultAttributePicker:
@@ -915,15 +943,20 @@ class DefaultAttributePicker:
         return get_value(context.obj, context.key, None)
 
 
-class AliasedAttributePicker(DefaultAttributePicker):
+class AttributePicker(DefaultAttributePicker):
     """Uses alias providers to find the value of an attribute in a Python object"""
 
     def __init__(
-        self, alias_providers: list[type[AttributeAliasProvider]] | None = None
+        self,
+        alias_providers: list[type[AttributeAliasProvider]] | None = None,
+        response_transformers: dict[str, Callable[[Any], Any]] | None = None,
     ) -> None:
         self.alias_providers = (
             alias_providers if alias_providers is not None else DEFAULT_ALIAS_PROVIDERS
         )
+        self.response_transformers = (
+            response_transformers if response_transformers is not None else {}
+        )
 
     def __call__(self, context: AttributePickerContext) -> Any:
         obj = context.obj
@@ -933,6 +966,10 @@ class AliasedAttributePicker(DefaultAttributePicker):
                 break
         else:
             value = None
+        key_path = f"{context.key_path}.{context.key}"
+        if key_path in self.response_transformers:
+            transform = self.response_transformers[key_path]
+            value = transform(value)
         return value
 
     def get_possible_keys(self, context: AttributePickerContext) -> Generator[str]:
@@ -944,7 +981,7 @@ class AliasedAttributePicker(DefaultAttributePicker):
                 yield alias
 
 
-class XFormedAttributePicker(AliasedAttributePicker):
+class XFormedAttributePicker(AttributePicker):
     """Can be injected into a ResponseSerializer to aid in plucking AWS model
     attributes specified in `camelCase` or `PascalCase` from Python objects
     with standard `snake_case` attribute names.
@@ -1089,3 +1126,29 @@ DEFAULT_ALIAS_PROVIDERS = [
     ClassPrefixAlias,
     ModelAlias,
 ]
+
+
+# Response transformers can be used to modify the value of a key in the response.
+def never_return(_: Any) -> None:
+    """
+    A utility function that is used to ensure that certain attributes are never returned
+    in the response. This is useful for attributes that should not be exposed or are not
+    relevant in the context of the response.
+    """
+    return None
+
+
+def return_if_not_empty(value: Any) -> Any:
+    """
+    A utility function that returns the value if it is not empty (i.e., not None, "", {}, or []),
+    otherwise returns None. This is useful for attributes that should only be included in the
+    response if they have a meaningful value.
+    """
+    return value if value not in [None, "", {}, []] else None
+
+
+def url_encode(value: Any) -> Any:
+    """A utility function that url encodes a value before inclusion in a response."""
+    from urllib.parse import quote
+
+    return quote(value) if isinstance(value, str) else value
diff --git a/moto/ec2/models/elastic_network_interfaces.py b/moto/ec2/models/elastic_network_interfaces.py
index 78b8e1e8e..c5140f276 100644
--- a/moto/ec2/models/elastic_network_interfaces.py
+++ b/moto/ec2/models/elastic_network_interfaces.py
@@ -116,7 +116,8 @@ class NetworkInterface(TaggedEC2Resource, CloudFormationModel):
 
         if self.subnet:
             vpc = self.ec2_backend.get_vpc(self.subnet.vpc_id)
-            if vpc and vpc.enable_dns_hostnames:
+            # FIXME: Drop the `in` clause once the Vpc attribute is properly typed.
+            if vpc and vpc.enable_dns_hostnames in [True, "True", "true"]:
                 self.private_dns_name = generate_dns_from_ip(self.private_ip_address)
                 for address in self.private_ip_addresses:
                     if address.get("Primary", None):
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 9163da90f..3d37ca53c 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
@@ -863,10 +863,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "afs1-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "afs1-az1"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "afs1-az1"
@@ -875,10 +871,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "afs1-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "afs1-az1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "afs1-az1"
@@ -1887,10 +1879,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "afs1-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "afs1-az2"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "afs1-az2"
@@ -2831,10 +2819,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "afs1-az3"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "afs1-az3"
- },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "afs1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
index 6cb9e5c07..55431a62d 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
@@ -3051,10 +3051,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apne1-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apne1-az1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "apne1-az1"
@@ -3067,10 +3063,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "apne1-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "apne1-az1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "apne1-az1"
@@ -5983,10 +5975,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apne1-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apne1-az2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "apne1-az2"
@@ -9167,10 +9155,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apne1-az4"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apne1-az4"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "apne1-az4"
@@ -9183,10 +9167,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "apne1-az4"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "apne1-az4"
- },
  {
   "InstanceType": "vt1.24xlarge",
   "Location": "apne1-az4"
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 0b2341cb5..eb162ae86 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
@@ -1863,14 +1863,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apne2-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apne2-az1"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "apne2-az1"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "apne2-az1"
@@ -1879,10 +1871,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "apne2-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "apne2-az1"
- },
  {
   "InstanceType": "u7i-6tb.112xlarge",
   "Location": "apne2-az1"
@@ -5139,14 +5127,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apne2-az3"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apne2-az3"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "apne2-az3"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "apne2-az3"
@@ -5155,10 +5135,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "apne2-az3"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "apne2-az3"
- },
  {
   "InstanceType": "x1.16xlarge",
   "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 fff7247d9..e7b92694d 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
@@ -2215,10 +2215,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "aps1-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "aps1-az1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "aps1-az1"
@@ -4339,10 +4335,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "aps1-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "aps1-az2"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "aps1-az2"
@@ -6579,10 +6571,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "aps1-az3"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "aps1-az3"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "aps1-az3"
@@ -6591,10 +6579,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "aps1-az3"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "aps1-az3"
- },
  {
   "InstanceType": "x1.16xlarge",
   "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 691203913..abca1be8a 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
@@ -995,10 +995,6 @@
   "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 20d06ff73..78d2835d6 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
@@ -2471,10 +2471,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apse1-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apse1-az1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "apse1-az1"
@@ -2487,10 +2483,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "apse1-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "apse1-az1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "apse1-az1"
@@ -5119,10 +5111,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apse1-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apse1-az2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "apse1-az2"
@@ -5135,10 +5123,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "apse1-az2"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "apse1-az2"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "apse1-az2"
@@ -7487,10 +7471,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apse1-az3"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apse1-az3"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "apse1-az3"
@@ -7503,10 +7483,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "apse1-az3"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "apse1-az3"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "apse1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json
index 38f783825..8c4efae86 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json
@@ -1019,6 +1019,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "apse2-az1"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "apse2-az1"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "apse2-az1"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "apse2-az1"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "apse2-az1"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "apse2-az1"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "apse2-az1"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "apse2-az1"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "apse2-az1"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "apse2-az1"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "apse2-az1"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "apse2-az1"
+ },
  {
   "InstanceType": "im4gn.16xlarge",
   "Location": "apse2-az1"
@@ -2727,10 +2771,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "apse2-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apse2-az1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "apse2-az1"
@@ -3839,6 +3879,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "apse2-az2"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "apse2-az2"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "apse2-az2"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "apse2-az2"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "apse2-az2"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "apse2-az2"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "apse2-az2"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "apse2-az2"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "apse2-az2"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "apse2-az2"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "apse2-az2"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "apse2-az2"
+ },
  {
   "InstanceType": "im4gn.16xlarge",
   "Location": "apse2-az2"
@@ -5475,10 +5559,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "apse2-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apse2-az2"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "apse2-az2"
@@ -6495,6 +6575,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "apse2-az3"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "apse2-az3"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "apse2-az3"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "apse2-az3"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "apse2-az3"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "apse2-az3"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "apse2-az3"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "apse2-az3"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "apse2-az3"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "apse2-az3"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "apse2-az3"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "apse2-az3"
+ },
  {
   "InstanceType": "im4gn.16xlarge",
   "Location": "apse2-az3"
@@ -8159,10 +8283,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apse2-az3"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "apse2-az3"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "apse2-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-5.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-5.json
index e3bfa1f86..df7b38db6 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-5.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-5.json
@@ -1615,6 +1615,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "apse5-az2"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "apse5-az2"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "apse5-az2"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "apse5-az2"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "apse5-az2"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "apse5-az2"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "apse5-az2"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "apse5-az2"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "apse5-az2"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "apse5-az2"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "apse5-az2"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "apse5-az2"
+ },
  {
   "InstanceType": "m6g.12xlarge",
   "Location": "apse5-az2"
@@ -2699,6 +2743,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "apse5-az3"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "apse5-az3"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "apse5-az3"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "apse5-az3"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "apse5-az3"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "apse5-az3"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "apse5-az3"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "apse5-az3"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "apse5-az3"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "apse5-az3"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "apse5-az3"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "apse5-az3"
+ },
  {
   "InstanceType": "m6g.12xlarge",
   "Location": "apse5-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json
index cf8c4780e..2c10edc46 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json
@@ -2895,14 +2895,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "euc1-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "euc1-az1"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "euc1-az1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "euc1-az1"
@@ -2915,10 +2907,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euc1-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "euc1-az1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "euc1-az1"
@@ -5963,14 +5951,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "euc1-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "euc1-az2"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "euc1-az2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "euc1-az2"
@@ -5983,10 +5963,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euc1-az2"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "euc1-az2"
- },
  {
   "InstanceType": "u7i-6tb.112xlarge",
   "Location": "euc1-az2"
@@ -9223,10 +9199,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "euc1-az3"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "euc1-az3"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "euc1-az3"
@@ -9239,10 +9211,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euc1-az3"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "euc1-az3"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "euc1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json
index a1eeab986..99d09d804 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json
@@ -1899,10 +1899,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eun1-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eun1-az1"
- },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "eun1-az1"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-1.json
index 3dae20162..20b99e3de 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-1.json
@@ -1191,10 +1191,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eus1-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eus1-az1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eus1-az1"
@@ -2475,10 +2471,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eus1-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eus1-az2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eus1-az2"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json
index 12f7e37e7..e01b4095d 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json
@@ -3019,18 +3019,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "euw1-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "euw1-az1"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "euw1-az1"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "euw1-az1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "euw1-az1"
@@ -3043,10 +3031,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euw1-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "euw1-az1"
- },
  {
   "InstanceType": "vt1.24xlarge",
   "Location": "euw1-az1"
@@ -6251,18 +6235,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "euw1-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "euw1-az2"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "euw1-az2"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "euw1-az2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "euw1-az2"
@@ -6275,10 +6247,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euw1-az2"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "euw1-az2"
- },
  {
   "InstanceType": "vt1.24xlarge",
   "Location": "euw1-az2"
@@ -9443,10 +9411,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "euw1-az3"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "euw1-az3"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "euw1-az3"
@@ -9459,10 +9423,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euw1-az3"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "euw1-az3"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "euw1-az3"
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 5d293fae1..fce083a01 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
@@ -2019,10 +2019,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euw2-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "euw2-az1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "euw2-az1"
@@ -6399,10 +6395,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euw2-az3"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "euw2-az3"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "euw2-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json
index 6154e3317..33c5a3b5a 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json
@@ -1599,10 +1599,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euw3-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "euw3-az1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "euw3-az1"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/il-central-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/il-central-1.json
index 22e11b2c7..84d4f6c76 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/il-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/il-central-1.json
@@ -259,6 +259,42 @@
   "InstanceType": "c6in.xlarge",
   "Location": "ilc1-az1"
  },
+ {
+  "InstanceType": "c7g.12xlarge",
+  "Location": "ilc1-az1"
+ },
+ {
+  "InstanceType": "c7g.16xlarge",
+  "Location": "ilc1-az1"
+ },
+ {
+  "InstanceType": "c7g.2xlarge",
+  "Location": "ilc1-az1"
+ },
+ {
+  "InstanceType": "c7g.4xlarge",
+  "Location": "ilc1-az1"
+ },
+ {
+  "InstanceType": "c7g.8xlarge",
+  "Location": "ilc1-az1"
+ },
+ {
+  "InstanceType": "c7g.large",
+  "Location": "ilc1-az1"
+ },
+ {
+  "InstanceType": "c7g.medium",
+  "Location": "ilc1-az1"
+ },
+ {
+  "InstanceType": "c7g.metal",
+  "Location": "ilc1-az1"
+ },
+ {
+  "InstanceType": "c7g.xlarge",
+  "Location": "ilc1-az1"
+ },
  {
   "InstanceType": "d3.2xlarge",
   "Location": "ilc1-az1"
@@ -1243,6 +1279,42 @@
   "InstanceType": "c6in.xlarge",
   "Location": "ilc1-az2"
  },
+ {
+  "InstanceType": "c7g.12xlarge",
+  "Location": "ilc1-az2"
+ },
+ {
+  "InstanceType": "c7g.16xlarge",
+  "Location": "ilc1-az2"
+ },
+ {
+  "InstanceType": "c7g.2xlarge",
+  "Location": "ilc1-az2"
+ },
+ {
+  "InstanceType": "c7g.4xlarge",
+  "Location": "ilc1-az2"
+ },
+ {
+  "InstanceType": "c7g.8xlarge",
+  "Location": "ilc1-az2"
+ },
+ {
+  "InstanceType": "c7g.large",
+  "Location": "ilc1-az2"
+ },
+ {
+  "InstanceType": "c7g.medium",
+  "Location": "ilc1-az2"
+ },
+ {
+  "InstanceType": "c7g.metal",
+  "Location": "ilc1-az2"
+ },
+ {
+  "InstanceType": "c7g.xlarge",
+  "Location": "ilc1-az2"
+ },
  {
   "InstanceType": "d3.2xlarge",
   "Location": "ilc1-az2"
@@ -1951,10 +2023,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ilc1-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ilc1-az2"
- },
  {
   "InstanceType": "c5.12xlarge",
   "Location": "ilc1-az3"
@@ -2215,6 +2283,42 @@
   "InstanceType": "c6in.xlarge",
   "Location": "ilc1-az3"
  },
+ {
+  "InstanceType": "c7g.12xlarge",
+  "Location": "ilc1-az3"
+ },
+ {
+  "InstanceType": "c7g.16xlarge",
+  "Location": "ilc1-az3"
+ },
+ {
+  "InstanceType": "c7g.2xlarge",
+  "Location": "ilc1-az3"
+ },
+ {
+  "InstanceType": "c7g.4xlarge",
+  "Location": "ilc1-az3"
+ },
+ {
+  "InstanceType": "c7g.8xlarge",
+  "Location": "ilc1-az3"
+ },
+ {
+  "InstanceType": "c7g.large",
+  "Location": "ilc1-az3"
+ },
+ {
+  "InstanceType": "c7g.medium",
+  "Location": "ilc1-az3"
+ },
+ {
+  "InstanceType": "c7g.metal",
+  "Location": "ilc1-az3"
+ },
+ {
+  "InstanceType": "c7g.xlarge",
+  "Location": "ilc1-az3"
+ },
  {
   "InstanceType": "d3.2xlarge",
   "Location": "ilc1-az3"
@@ -2923,10 +3027,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ilc1-az3"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ilc1-az3"
- },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "ilc1-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 122b22025..04c236ab0 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
@@ -935,6 +935,50 @@
   "InstanceType": "c6in.xlarge",
   "Location": "mec1-az2"
  },
+ {
+  "InstanceType": "c7i.12xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "c7i.16xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "c7i.24xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "c7i.2xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "c7i.48xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "c7i.4xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "c7i.8xlarge",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "c7i.large",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "c7i.metal-24xl",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "c7i.metal-48xl",
+  "Location": "mec1-az2"
+ },
+ {
+  "InstanceType": "c7i.xlarge",
+  "Location": "mec1-az2"
+ },
  {
   "InstanceType": "g5.12xlarge",
   "Location": "mec1-az2"
@@ -1783,6 +1827,50 @@
   "InstanceType": "c6in.xlarge",
   "Location": "mec1-az3"
  },
+ {
+  "InstanceType": "c7i.12xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "c7i.16xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "c7i.24xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "c7i.2xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "c7i.48xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "c7i.4xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "c7i.8xlarge",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "c7i.large",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "c7i.metal-24xl",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "c7i.metal-48xl",
+  "Location": "mec1-az3"
+ },
+ {
+  "InstanceType": "c7i.xlarge",
+  "Location": "mec1-az3"
+ },
  {
   "InstanceType": "i3.16xlarge",
   "Location": "mec1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/sa-east-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/sa-east-1.json
index 9d6e86375..aac8c0c71 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/sa-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/sa-east-1.json
@@ -2095,14 +2095,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "sae1-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "sae1-az1"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "sae1-az1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "sae1-az1"
@@ -2115,10 +2107,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "sae1-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "sae1-az1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "sae1-az1"
@@ -3931,14 +3919,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "sae1-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "sae1-az2"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "sae1-az2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "sae1-az2"
@@ -5855,10 +5835,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "sae1-az3"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "sae1-az3"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "sae1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
index 3233e01e2..69d80fb04 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
@@ -3159,18 +3159,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "use1-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "use1-az1"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "use1-az1"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "use1-az1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "use1-az1"
@@ -3183,10 +3171,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "use1-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "use1-az1"
- },
  {
   "InstanceType": "u7i-12tb.224xlarge",
   "Location": "use1-az1"
@@ -6743,18 +6727,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "use1-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "use1-az2"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "use1-az2"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "use1-az2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "use1-az2"
@@ -6767,10 +6739,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "use1-az2"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "use1-az2"
- },
  {
   "InstanceType": "u7i-6tb.112xlarge",
   "Location": "use1-az2"
@@ -10575,18 +10543,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "use1-az4"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "use1-az4"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "use1-az4"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "use1-az4"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "use1-az4"
@@ -10599,10 +10555,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "use1-az4"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "use1-az4"
- },
  {
   "InstanceType": "u7i-12tb.224xlarge",
   "Location": "use1-az4"
@@ -17195,18 +17147,6 @@
   "InstanceType": "trn1n.32xlarge",
   "Location": "use1-az6"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "use1-az6"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "use1-az6"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "use1-az6"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "use1-az6"
@@ -17220,11 +17160,11 @@
   "Location": "use1-az6"
  },
  {
-  "InstanceType": "u-9tb1.112xlarge",
+  "InstanceType": "u7i-12tb.224xlarge",
   "Location": "use1-az6"
  },
  {
-  "InstanceType": "u7i-12tb.224xlarge",
+  "InstanceType": "u7i-6tb.112xlarge",
   "Location": "use1-az6"
  },
  {
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
index 8eb30fdbc..a58762919 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
@@ -3139,18 +3139,6 @@
   "InstanceType": "trn2.48xlarge",
   "Location": "use2-az1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "use2-az1"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "use2-az1"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "use2-az1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "use2-az1"
@@ -3163,10 +3151,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "use2-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "use2-az1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "use2-az1"
@@ -6487,10 +6471,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "use2-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "use2-az2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "use2-az2"
@@ -6503,10 +6483,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "use2-az2"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "use2-az2"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "use2-az2"
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 9e4d81c2a..a6638e6ed 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
@@ -3331,18 +3331,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "usw2-az1"
  },
- {
-  "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"
@@ -3355,10 +3343,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "usw2-az1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "usw2-az1"
- },
  {
   "InstanceType": "u7i-12tb.224xlarge",
   "Location": "usw2-az1"
@@ -6919,18 +6903,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "usw2-az2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "usw2-az2"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "usw2-az2"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "usw2-az2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "usw2-az2"
@@ -6943,10 +6915,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "usw2-az2"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "usw2-az2"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "usw2-az2"
@@ -10483,14 +10451,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "usw2-az3"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "usw2-az3"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "usw2-az3"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "usw2-az3"
@@ -10503,10 +10463,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "usw2-az3"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "usw2-az3"
- },
  {
   "InstanceType": "u7i-12tb.224xlarge",
   "Location": "usw2-az3"
@@ -13323,14 +13279,6 @@
   "InstanceType": "trn1n.32xlarge",
   "Location": "usw2-az4"
  },
- {
-  "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 2d5da0d68..0d3587234 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
@@ -863,10 +863,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "af-south-1a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "af-south-1a"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "af-south-1a"
@@ -875,10 +871,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "af-south-1a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "af-south-1a"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "af-south-1a"
@@ -1887,10 +1879,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "af-south-1b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "af-south-1b"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "af-south-1b"
@@ -2831,10 +2819,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "af-south-1c"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "af-south-1c"
- },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "af-south-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
index 72347b11a..47b50520b 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
@@ -3091,10 +3091,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-northeast-1a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-northeast-1a"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-northeast-1a"
@@ -3107,10 +3103,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-northeast-1a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-northeast-1a"
- },
  {
   "InstanceType": "vt1.24xlarge",
   "Location": "ap-northeast-1a"
@@ -6307,10 +6299,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-northeast-1c"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-northeast-1c"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-northeast-1c"
@@ -6323,10 +6311,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-northeast-1c"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-northeast-1c"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "ap-northeast-1c"
@@ -9239,10 +9223,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-northeast-1d"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-northeast-1d"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-northeast-1d"
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 0cd439701..b5ea3edf9 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
@@ -1863,14 +1863,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-northeast-2a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-northeast-2a"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "ap-northeast-2a"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "ap-northeast-2a"
@@ -1879,10 +1871,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-northeast-2a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-northeast-2a"
- },
  {
   "InstanceType": "u7i-6tb.112xlarge",
   "Location": "ap-northeast-2a"
@@ -5139,14 +5127,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-northeast-2c"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-northeast-2c"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "ap-northeast-2c"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "ap-northeast-2c"
@@ -5155,10 +5135,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-northeast-2c"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-northeast-2c"
- },
  {
   "InstanceType": "x1.16xlarge",
   "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 3620d139e..2791ce8ed 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
@@ -2215,10 +2215,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-south-1a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-south-1a"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "ap-south-1a"
@@ -4531,10 +4527,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-south-1b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-south-1b"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "ap-south-1b"
@@ -4543,10 +4535,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-south-1b"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-south-1b"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "ap-south-1b"
@@ -6667,10 +6655,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "ap-south-1c"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-south-1c"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "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 ec8dbaee1..fac21cef4 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
@@ -995,10 +995,6 @@
   "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 9179ce3cd..4b089e076 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
@@ -2471,10 +2471,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-southeast-1a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-southeast-1a"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-southeast-1a"
@@ -2487,10 +2483,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-southeast-1a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-southeast-1a"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "ap-southeast-1a"
@@ -5119,10 +5111,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-southeast-1b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-southeast-1b"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-southeast-1b"
@@ -5135,10 +5123,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-southeast-1b"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-southeast-1b"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "ap-southeast-1b"
@@ -7487,10 +7471,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-southeast-1c"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-southeast-1c"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-southeast-1c"
@@ -7503,10 +7483,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-southeast-1c"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-southeast-1c"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "ap-southeast-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json
index c25366c0d..521655f62 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json
@@ -895,6 +895,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "ap-southeast-2a"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "ap-southeast-2a"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "ap-southeast-2a"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "ap-southeast-2a"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "ap-southeast-2a"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "ap-southeast-2a"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "ap-southeast-2a"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "ap-southeast-2a"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "ap-southeast-2a"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "ap-southeast-2a"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "ap-southeast-2a"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "ap-southeast-2a"
+ },
  {
   "InstanceType": "im4gn.16xlarge",
   "Location": "ap-southeast-2a"
@@ -2559,10 +2603,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-southeast-2a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-southeast-2a"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-southeast-2a"
@@ -3675,6 +3715,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "ap-southeast-2b"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "ap-southeast-2b"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "ap-southeast-2b"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "ap-southeast-2b"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "ap-southeast-2b"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "ap-southeast-2b"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "ap-southeast-2b"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "ap-southeast-2b"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "ap-southeast-2b"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "ap-southeast-2b"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "ap-southeast-2b"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "ap-southeast-2b"
+ },
  {
   "InstanceType": "im4gn.16xlarge",
   "Location": "ap-southeast-2b"
@@ -5383,10 +5467,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "ap-southeast-2b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-southeast-2b"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-southeast-2b"
@@ -6495,6 +6575,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "ap-southeast-2c"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "ap-southeast-2c"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "ap-southeast-2c"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "ap-southeast-2c"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "ap-southeast-2c"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "ap-southeast-2c"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "ap-southeast-2c"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "ap-southeast-2c"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "ap-southeast-2c"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "ap-southeast-2c"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "ap-southeast-2c"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "ap-southeast-2c"
+ },
  {
   "InstanceType": "im4gn.16xlarge",
   "Location": "ap-southeast-2c"
@@ -8131,10 +8255,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "ap-southeast-2c"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-southeast-2c"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "ap-southeast-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-5.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-5.json
index 2f164fbb0..997bfab89 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-5.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-5.json
@@ -1615,6 +1615,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "ap-southeast-5b"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "ap-southeast-5b"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "ap-southeast-5b"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "ap-southeast-5b"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "ap-southeast-5b"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "ap-southeast-5b"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "ap-southeast-5b"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "ap-southeast-5b"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "ap-southeast-5b"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "ap-southeast-5b"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "ap-southeast-5b"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "ap-southeast-5b"
+ },
  {
   "InstanceType": "m6g.12xlarge",
   "Location": "ap-southeast-5b"
@@ -2699,6 +2743,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "ap-southeast-5c"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "ap-southeast-5c"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "ap-southeast-5c"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "ap-southeast-5c"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "ap-southeast-5c"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "ap-southeast-5c"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "ap-southeast-5c"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "ap-southeast-5c"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "ap-southeast-5c"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "ap-southeast-5c"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "ap-southeast-5c"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "ap-southeast-5c"
+ },
  {
   "InstanceType": "m6g.12xlarge",
   "Location": "ap-southeast-5c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json
index 379425134..ebbce7d6d 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json
@@ -2887,14 +2887,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-central-1a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-central-1a"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "eu-central-1a"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-central-1a"
@@ -2907,10 +2899,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-central-1a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-central-1a"
- },
  {
   "InstanceType": "u7i-6tb.112xlarge",
   "Location": "eu-central-1a"
@@ -6147,10 +6135,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-central-1b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-central-1b"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-central-1b"
@@ -6163,10 +6147,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-central-1b"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-central-1b"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-central-1b"
@@ -9219,14 +9199,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-central-1c"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-central-1c"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "eu-central-1c"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-central-1c"
@@ -9239,10 +9211,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-central-1c"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-central-1c"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-central-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json
index 989cb5ff5..2b542b75c 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json
@@ -1899,10 +1899,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-north-1a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-north-1a"
- },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "eu-north-1a"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-1.json
index 2af347a3d..00413da8b 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-1.json
@@ -1191,10 +1191,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-south-1a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-south-1a"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-south-1a"
@@ -2475,10 +2471,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-south-1b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-south-1b"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-south-1b"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json
index 8872e91b1..4cc71c3bd 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json
@@ -2983,10 +2983,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-west-1a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-west-1a"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-west-1a"
@@ -2999,10 +2995,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-1a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-west-1a"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-west-1a"
@@ -6167,18 +6159,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-west-1b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-west-1b"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "eu-west-1b"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "eu-west-1b"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-west-1b"
@@ -6191,10 +6171,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-1b"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-west-1b"
- },
  {
   "InstanceType": "vt1.24xlarge",
   "Location": "eu-west-1b"
@@ -9399,18 +9375,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-west-1c"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-west-1c"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "eu-west-1c"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "eu-west-1c"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-west-1c"
@@ -9423,10 +9387,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-1c"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-west-1c"
- },
  {
   "InstanceType": "vt1.24xlarge",
   "Location": "eu-west-1c"
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 adbf1edb3..a6494b7f7 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
@@ -4291,10 +4291,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-2b"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-west-2b"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-west-2b"
@@ -6399,10 +6395,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-2c"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-west-2c"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-west-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json
index fd459419c..0f05dfc33 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json
@@ -1599,10 +1599,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-3a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-west-3a"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-west-3a"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/il-central-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/il-central-1.json
index d1e3a005e..39a1ac224 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/il-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/il-central-1.json
@@ -259,6 +259,42 @@
   "InstanceType": "c6in.xlarge",
   "Location": "il-central-1a"
  },
+ {
+  "InstanceType": "c7g.12xlarge",
+  "Location": "il-central-1a"
+ },
+ {
+  "InstanceType": "c7g.16xlarge",
+  "Location": "il-central-1a"
+ },
+ {
+  "InstanceType": "c7g.2xlarge",
+  "Location": "il-central-1a"
+ },
+ {
+  "InstanceType": "c7g.4xlarge",
+  "Location": "il-central-1a"
+ },
+ {
+  "InstanceType": "c7g.8xlarge",
+  "Location": "il-central-1a"
+ },
+ {
+  "InstanceType": "c7g.large",
+  "Location": "il-central-1a"
+ },
+ {
+  "InstanceType": "c7g.medium",
+  "Location": "il-central-1a"
+ },
+ {
+  "InstanceType": "c7g.metal",
+  "Location": "il-central-1a"
+ },
+ {
+  "InstanceType": "c7g.xlarge",
+  "Location": "il-central-1a"
+ },
  {
   "InstanceType": "d3.2xlarge",
   "Location": "il-central-1a"
@@ -1243,6 +1279,42 @@
   "InstanceType": "c6in.xlarge",
   "Location": "il-central-1b"
  },
+ {
+  "InstanceType": "c7g.12xlarge",
+  "Location": "il-central-1b"
+ },
+ {
+  "InstanceType": "c7g.16xlarge",
+  "Location": "il-central-1b"
+ },
+ {
+  "InstanceType": "c7g.2xlarge",
+  "Location": "il-central-1b"
+ },
+ {
+  "InstanceType": "c7g.4xlarge",
+  "Location": "il-central-1b"
+ },
+ {
+  "InstanceType": "c7g.8xlarge",
+  "Location": "il-central-1b"
+ },
+ {
+  "InstanceType": "c7g.large",
+  "Location": "il-central-1b"
+ },
+ {
+  "InstanceType": "c7g.medium",
+  "Location": "il-central-1b"
+ },
+ {
+  "InstanceType": "c7g.metal",
+  "Location": "il-central-1b"
+ },
+ {
+  "InstanceType": "c7g.xlarge",
+  "Location": "il-central-1b"
+ },
  {
   "InstanceType": "d3.2xlarge",
   "Location": "il-central-1b"
@@ -1951,10 +2023,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "il-central-1b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "il-central-1b"
- },
  {
   "InstanceType": "c5.12xlarge",
   "Location": "il-central-1c"
@@ -2215,6 +2283,42 @@
   "InstanceType": "c6in.xlarge",
   "Location": "il-central-1c"
  },
+ {
+  "InstanceType": "c7g.12xlarge",
+  "Location": "il-central-1c"
+ },
+ {
+  "InstanceType": "c7g.16xlarge",
+  "Location": "il-central-1c"
+ },
+ {
+  "InstanceType": "c7g.2xlarge",
+  "Location": "il-central-1c"
+ },
+ {
+  "InstanceType": "c7g.4xlarge",
+  "Location": "il-central-1c"
+ },
+ {
+  "InstanceType": "c7g.8xlarge",
+  "Location": "il-central-1c"
+ },
+ {
+  "InstanceType": "c7g.large",
+  "Location": "il-central-1c"
+ },
+ {
+  "InstanceType": "c7g.medium",
+  "Location": "il-central-1c"
+ },
+ {
+  "InstanceType": "c7g.metal",
+  "Location": "il-central-1c"
+ },
+ {
+  "InstanceType": "c7g.xlarge",
+  "Location": "il-central-1c"
+ },
  {
   "InstanceType": "d3.2xlarge",
   "Location": "il-central-1c"
@@ -2923,10 +3027,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "il-central-1c"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "il-central-1c"
- },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "il-central-1c"
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 be7b228cd..1c7482eef 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
@@ -935,6 +935,50 @@
   "InstanceType": "c6in.xlarge",
   "Location": "me-central-1b"
  },
+ {
+  "InstanceType": "c7i.12xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "c7i.16xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "c7i.24xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "c7i.2xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "c7i.48xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "c7i.4xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "c7i.8xlarge",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "c7i.large",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "c7i.metal-24xl",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "c7i.metal-48xl",
+  "Location": "me-central-1b"
+ },
+ {
+  "InstanceType": "c7i.xlarge",
+  "Location": "me-central-1b"
+ },
  {
   "InstanceType": "g5.12xlarge",
   "Location": "me-central-1b"
@@ -1783,6 +1827,50 @@
   "InstanceType": "c6in.xlarge",
   "Location": "me-central-1c"
  },
+ {
+  "InstanceType": "c7i.12xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "c7i.16xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "c7i.24xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "c7i.2xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "c7i.48xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "c7i.4xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "c7i.8xlarge",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "c7i.large",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "c7i.metal-24xl",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "c7i.metal-48xl",
+  "Location": "me-central-1c"
+ },
+ {
+  "InstanceType": "c7i.xlarge",
+  "Location": "me-central-1c"
+ },
  {
   "InstanceType": "i3.16xlarge",
   "Location": "me-central-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/sa-east-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/sa-east-1.json
index fc80b00ca..f3fc76e03 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/sa-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/sa-east-1.json
@@ -2095,14 +2095,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "sa-east-1a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "sa-east-1a"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "sa-east-1a"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "sa-east-1a"
@@ -2115,10 +2107,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "sa-east-1a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "sa-east-1a"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "sa-east-1a"
@@ -3931,14 +3919,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "sa-east-1b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "sa-east-1b"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "sa-east-1b"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "sa-east-1b"
@@ -5855,10 +5835,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "sa-east-1c"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "sa-east-1c"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "sa-east-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
index 225f43685..4032a74b9 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
@@ -3327,18 +3327,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "us-east-1a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-east-1a"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "us-east-1a"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "us-east-1a"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-east-1a"
@@ -3351,10 +3339,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-east-1a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-east-1a"
- },
  {
   "InstanceType": "u7i-6tb.112xlarge",
   "Location": "us-east-1a"
@@ -6919,18 +6903,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "us-east-1b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-east-1b"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "us-east-1b"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "us-east-1b"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-east-1b"
@@ -6943,10 +6915,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-east-1b"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-east-1b"
- },
  {
   "InstanceType": "u7i-12tb.224xlarge",
   "Location": "us-east-1b"
@@ -10555,18 +10523,6 @@
   "InstanceType": "trn1n.32xlarge",
   "Location": "us-east-1c"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-east-1c"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "us-east-1c"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "us-east-1c"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-east-1c"
@@ -10580,11 +10536,11 @@
   "Location": "us-east-1c"
  },
  {
-  "InstanceType": "u-9tb1.112xlarge",
+  "InstanceType": "u7i-12tb.224xlarge",
   "Location": "us-east-1c"
  },
  {
-  "InstanceType": "u7i-12tb.224xlarge",
+  "InstanceType": "u7i-6tb.112xlarge",
   "Location": "us-east-1c"
  },
  {
@@ -13963,18 +13919,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "us-east-1d"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-east-1d"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "us-east-1d"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "us-east-1d"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-east-1d"
@@ -13987,10 +13931,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-east-1d"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-east-1d"
- },
  {
   "InstanceType": "u7i-12tb.224xlarge",
   "Location": "us-east-1d"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
index 7cd4bacbd..b20a7c9f9 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
@@ -3139,18 +3139,6 @@
   "InstanceType": "trn2.48xlarge",
   "Location": "us-east-2a"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-east-2a"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "us-east-2a"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "us-east-2a"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-east-2a"
@@ -3163,10 +3151,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-east-2a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-east-2a"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "us-east-2a"
@@ -6487,10 +6471,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "us-east-2b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-east-2b"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-east-2b"
@@ -6503,10 +6483,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-east-2b"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-east-2b"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "us-east-2b"
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 95b7d7e32..8add30a3c 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
@@ -3307,18 +3307,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "us-west-2a"
  },
- {
-  "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"
@@ -3331,10 +3319,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-west-2a"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-west-2a"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "us-west-2a"
@@ -6883,18 +6867,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "us-west-2b"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-west-2b"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "us-west-2b"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "us-west-2b"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-west-2b"
@@ -6907,10 +6879,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-west-2b"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-west-2b"
- },
  {
   "InstanceType": "u7i-12tb.224xlarge",
   "Location": "us-west-2b"
@@ -10483,14 +10451,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "us-west-2c"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-west-2c"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "us-west-2c"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-west-2c"
@@ -10503,10 +10463,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-west-2c"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-west-2c"
- },
  {
   "InstanceType": "u7i-12tb.224xlarge",
   "Location": "us-west-2c"
@@ -13323,14 +13279,6 @@
   "InstanceType": "trn1n.32xlarge",
   "Location": "us-west-2d"
  },
- {
-  "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 b1ae30818..36d8ecdf5 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
@@ -927,10 +927,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "af-south-1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "af-south-1"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "af-south-1"
@@ -939,10 +935,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "af-south-1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "af-south-1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "af-south-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json b/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json
index 905268428..af7eb2bae 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json
@@ -3163,10 +3163,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-northeast-1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-northeast-1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-northeast-1"
@@ -3179,10 +3175,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-northeast-1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-northeast-1"
- },
  {
   "InstanceType": "vt1.24xlarge",
   "Location": "ap-northeast-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 a1efe24c7..ab28de4d3 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
@@ -1895,14 +1895,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-northeast-2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-northeast-2"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "ap-northeast-2"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "ap-northeast-2"
@@ -1911,10 +1903,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-northeast-2"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-northeast-2"
- },
  {
   "InstanceType": "u7i-6tb.112xlarge",
   "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 15ebbdba4..a8138a5d4 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
@@ -2235,10 +2235,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "ap-south-1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-south-1"
- },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "ap-south-1"
@@ -2247,10 +2243,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-south-1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-south-1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "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 ad95cc4cd..6bf86069f 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
@@ -995,10 +995,6 @@
   "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 4cc00be8e..057d24129 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
@@ -2523,10 +2523,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-southeast-1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-southeast-1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-southeast-1"
@@ -2539,10 +2535,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "ap-southeast-1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "ap-southeast-1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "ap-southeast-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json b/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json
index 266b2dfb3..0611ffa5c 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json
@@ -1019,6 +1019,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "ap-southeast-2"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "ap-southeast-2"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "ap-southeast-2"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "ap-southeast-2"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "ap-southeast-2"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "ap-southeast-2"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "ap-southeast-2"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "ap-southeast-2"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "ap-southeast-2"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "ap-southeast-2"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "ap-southeast-2"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "ap-southeast-2"
+ },
  {
   "InstanceType": "im4gn.16xlarge",
   "Location": "ap-southeast-2"
@@ -2731,10 +2775,6 @@
   "InstanceType": "trn1.32xlarge",
   "Location": "ap-southeast-2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "ap-southeast-2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "ap-southeast-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-southeast-5.json b/moto/ec2/resources/instance_type_offerings/region/ap-southeast-5.json
index 6993e3158..01ac772af 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-southeast-5.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-southeast-5.json
@@ -491,6 +491,50 @@
   "InstanceType": "i4i.xlarge",
   "Location": "ap-southeast-5"
  },
+ {
+  "InstanceType": "i7ie.12xlarge",
+  "Location": "ap-southeast-5"
+ },
+ {
+  "InstanceType": "i7ie.18xlarge",
+  "Location": "ap-southeast-5"
+ },
+ {
+  "InstanceType": "i7ie.24xlarge",
+  "Location": "ap-southeast-5"
+ },
+ {
+  "InstanceType": "i7ie.2xlarge",
+  "Location": "ap-southeast-5"
+ },
+ {
+  "InstanceType": "i7ie.3xlarge",
+  "Location": "ap-southeast-5"
+ },
+ {
+  "InstanceType": "i7ie.48xlarge",
+  "Location": "ap-southeast-5"
+ },
+ {
+  "InstanceType": "i7ie.6xlarge",
+  "Location": "ap-southeast-5"
+ },
+ {
+  "InstanceType": "i7ie.large",
+  "Location": "ap-southeast-5"
+ },
+ {
+  "InstanceType": "i7ie.metal-24xl",
+  "Location": "ap-southeast-5"
+ },
+ {
+  "InstanceType": "i7ie.metal-48xl",
+  "Location": "ap-southeast-5"
+ },
+ {
+  "InstanceType": "i7ie.xlarge",
+  "Location": "ap-southeast-5"
+ },
  {
   "InstanceType": "m6g.12xlarge",
   "Location": "ap-southeast-5"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json b/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json
index 4e7e009d4..d5fd123f9 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json
@@ -3147,14 +3147,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-central-1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-central-1"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "eu-central-1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-central-1"
@@ -3167,10 +3159,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-central-1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-central-1"
- },
  {
   "InstanceType": "u7i-6tb.112xlarge",
   "Location": "eu-central-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json b/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json
index 7eed160ed..c9c1f360f 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json
@@ -2027,10 +2027,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-north-1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-north-1"
- },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "eu-north-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-south-1.json b/moto/ec2/resources/instance_type_offerings/region/eu-south-1.json
index 833986c02..8250ce585 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-south-1.json
@@ -1219,10 +1219,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-south-1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-south-1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-south-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json b/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json
index 460ccafa1..394e1db92 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json
@@ -3051,18 +3051,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "eu-west-1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "eu-west-1"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "eu-west-1"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "eu-west-1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "eu-west-1"
@@ -3075,10 +3063,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-west-1"
- },
  {
   "InstanceType": "vt1.24xlarge",
   "Location": "eu-west-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 964693cab..0e37120b9 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
@@ -2211,10 +2211,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-2"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-west-2"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-west-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json b/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json
index 4675585c1..1e5a5877c 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json
@@ -1731,10 +1731,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-3"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "eu-west-3"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-west-3"
diff --git a/moto/ec2/resources/instance_type_offerings/region/il-central-1.json b/moto/ec2/resources/instance_type_offerings/region/il-central-1.json
index 2cc757cf0..ca2105d6a 100644
--- a/moto/ec2/resources/instance_type_offerings/region/il-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/il-central-1.json
@@ -259,6 +259,42 @@
   "InstanceType": "c6in.xlarge",
   "Location": "il-central-1"
  },
+ {
+  "InstanceType": "c7g.12xlarge",
+  "Location": "il-central-1"
+ },
+ {
+  "InstanceType": "c7g.16xlarge",
+  "Location": "il-central-1"
+ },
+ {
+  "InstanceType": "c7g.2xlarge",
+  "Location": "il-central-1"
+ },
+ {
+  "InstanceType": "c7g.4xlarge",
+  "Location": "il-central-1"
+ },
+ {
+  "InstanceType": "c7g.8xlarge",
+  "Location": "il-central-1"
+ },
+ {
+  "InstanceType": "c7g.large",
+  "Location": "il-central-1"
+ },
+ {
+  "InstanceType": "c7g.medium",
+  "Location": "il-central-1"
+ },
+ {
+  "InstanceType": "c7g.metal",
+  "Location": "il-central-1"
+ },
+ {
+  "InstanceType": "c7g.xlarge",
+  "Location": "il-central-1"
+ },
  {
   "InstanceType": "d3.2xlarge",
   "Location": "il-central-1"
@@ -967,10 +1003,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "il-central-1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "il-central-1"
- },
  {
   "InstanceType": "x2idn.16xlarge",
   "Location": "il-central-1"
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 a990b99fa..6583d869c 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
@@ -147,6 +147,50 @@
   "InstanceType": "c6in.xlarge",
   "Location": "me-central-1"
  },
+ {
+  "InstanceType": "c7i.12xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "c7i.16xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "c7i.24xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "c7i.2xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "c7i.48xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "c7i.4xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "c7i.8xlarge",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "c7i.large",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "c7i.metal-24xl",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "c7i.metal-48xl",
+  "Location": "me-central-1"
+ },
+ {
+  "InstanceType": "c7i.xlarge",
+  "Location": "me-central-1"
+ },
  {
   "InstanceType": "g5.12xlarge",
   "Location": "me-central-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/sa-east-1.json b/moto/ec2/resources/instance_type_offerings/region/sa-east-1.json
index 7a956e787..030083b37 100644
--- a/moto/ec2/resources/instance_type_offerings/region/sa-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/sa-east-1.json
@@ -2119,14 +2119,6 @@
   "InstanceType": "t4g.xlarge",
   "Location": "sa-east-1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "sa-east-1"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "sa-east-1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "sa-east-1"
@@ -2139,10 +2131,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "sa-east-1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "sa-east-1"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "sa-east-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/us-east-1.json b/moto/ec2/resources/instance_type_offerings/region/us-east-1.json
index 763424a0f..93f7f2c3d 100644
--- a/moto/ec2/resources/instance_type_offerings/region/us-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/us-east-1.json
@@ -3375,18 +3375,6 @@
   "InstanceType": "trn1n.32xlarge",
   "Location": "us-east-1"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-east-1"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "us-east-1"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "us-east-1"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-east-1"
@@ -3399,10 +3387,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-east-1"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-east-1"
- },
  {
   "InstanceType": "u7i-12tb.224xlarge",
   "Location": "us-east-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/us-east-2.json b/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
index 119a6aea8..23f8e8265 100644
--- a/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
@@ -3195,18 +3195,6 @@
   "InstanceType": "trn2.48xlarge",
   "Location": "us-east-2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-east-2"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "us-east-2"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "us-east-2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-east-2"
@@ -3219,10 +3207,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-east-2"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-east-2"
- },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "us-east-2"
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 65ffd1441..5a6655817 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
@@ -3375,18 +3375,6 @@
   "InstanceType": "trn1n.32xlarge",
   "Location": "us-west-2"
  },
- {
-  "InstanceType": "u-12tb1.112xlarge",
-  "Location": "us-west-2"
- },
- {
-  "InstanceType": "u-18tb1.112xlarge",
-  "Location": "us-west-2"
- },
- {
-  "InstanceType": "u-24tb1.112xlarge",
-  "Location": "us-west-2"
- },
  {
   "InstanceType": "u-3tb1.56xlarge",
   "Location": "us-west-2"
@@ -3399,10 +3387,6 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-west-2"
  },
- {
-  "InstanceType": "u-9tb1.112xlarge",
-  "Location": "us-west-2"
- },
  {
   "InstanceType": "u7i-12tb.224xlarge",
   "Location": "us-west-2"
diff --git a/moto/ec2/resources/instance_types.json b/moto/ec2/resources/instance_types.json
index 751efa323..fc0dce1ec 100644
--- a/moto/ec2/resources/instance_types.json
+++ b/moto/ec2/resources/instance_types.json
@@ -101555,366 +101555,6 @@
    ]
   }
  },
- "u-12tb1.112xlarge": {
-  "AutoRecoverySupported": true,
-  "BareMetal": false,
-  "BurstablePerformanceSupported": false,
-  "CurrentGeneration": true,
-  "DedicatedHostsSupported": true,
-  "EbsInfo": {
-   "EbsOptimizedInfo": {
-    "BaselineBandwidthInMbps": 38000,
-    "BaselineIops": 160000,
-    "BaselineThroughputInMBps": 4750.0,
-    "MaximumBandwidthInMbps": 38000,
-    "MaximumIops": 160000,
-    "MaximumThroughputInMBps": 4750.0
-   },
-   "EbsOptimizedSupport": "default",
-   "EncryptionSupport": "supported",
-   "NvmeSupport": "required"
-  },
-  "FreeTierEligible": false,
-  "HibernationSupported": false,
-  "Hypervisor": "nitro",
-  "InstanceStorageSupported": false,
-  "InstanceType": "u-12tb1.112xlarge",
-  "MemoryInfo": {
-   "SizeInMiB": 12582912
-  },
-  "NetworkInfo": {
-   "DefaultNetworkCardIndex": 0,
-   "EfaSupported": false,
-   "EnaSrdSupported": false,
-   "EnaSupport": "required",
-   "EncryptionInTransitSupported": true,
-   "FlexibleEnaQueuesSupport": "unsupported",
-   "Ipv4AddressesPerInterface": 50,
-   "Ipv6AddressesPerInterface": 50,
-   "Ipv6Supported": true,
-   "MaximumNetworkCards": 1,
-   "MaximumNetworkInterfaces": 15,
-   "NetworkCards": [
-    {
-     "BaselineBandwidthInGbps": 100.0,
-     "DefaultEnaQueueCountPerInterface": 32,
-     "MaximumNetworkInterfaces": 15,
-     "NetworkCardIndex": 0,
-     "NetworkPerformance": "100 Gigabit",
-     "PeakBandwidthInGbps": 100.0
-    }
-   ],
-   "NetworkPerformance": "100 Gigabit"
-  },
-  "NitroEnclavesSupport": "unsupported",
-  "NitroTpmSupport": "unsupported",
-  "PhcSupport": "unsupported",
-  "PlacementGroupInfo": {
-   "SupportedStrategies": [
-    "cluster",
-    "partition",
-    "spread"
-   ]
-  },
-  "ProcessorInfo": {
-   "Manufacturer": "Intel",
-   "SupportedArchitectures": [
-    "x86_64"
-   ],
-   "SustainedClockSpeedInGhz": 2.1
-  },
-  "RebootMigrationSupport": "supported",
-  "SupportedBootModes": [
-   "legacy-bios"
-  ],
-  "SupportedRootDeviceTypes": [
-   "ebs"
-  ],
-  "SupportedUsageClasses": [
-   "on-demand"
-  ],
-  "SupportedVirtualizationTypes": [
-   "hvm"
-  ],
-  "VCpuInfo": {
-   "DefaultCores": 224,
-   "DefaultThreadsPerCore": 2,
-   "DefaultVCpus": 448,
-   "ValidCores": [
-    16,
-    24,
-    32,
-    40,
-    48,
-    56,
-    64,
-    72,
-    80,
-    88,
-    96,
-    104,
-    112,
-    120,
-    128,
-    136,
-    144,
-    152,
-    160,
-    168,
-    176,
-    184,
-    192,
-    200,
-    208,
-    216,
-    224
-   ],
-   "ValidThreadsPerCore": [
-    1,
-    2
-   ]
-  }
- },
- "u-18tb1.112xlarge": {
-  "AutoRecoverySupported": true,
-  "BareMetal": false,
-  "BurstablePerformanceSupported": false,
-  "CurrentGeneration": true,
-  "DedicatedHostsSupported": true,
-  "EbsInfo": {
-   "EbsOptimizedInfo": {
-    "BaselineBandwidthInMbps": 38000,
-    "BaselineIops": 160000,
-    "BaselineThroughputInMBps": 4750.0,
-    "MaximumBandwidthInMbps": 38000,
-    "MaximumIops": 160000,
-    "MaximumThroughputInMBps": 4750.0
-   },
-   "EbsOptimizedSupport": "default",
-   "EncryptionSupport": "supported",
-   "NvmeSupport": "required"
-  },
-  "FreeTierEligible": false,
-  "HibernationSupported": false,
-  "Hypervisor": "nitro",
-  "InstanceStorageSupported": false,
-  "InstanceType": "u-18tb1.112xlarge",
-  "MemoryInfo": {
-   "SizeInMiB": 18874368
-  },
-  "NetworkInfo": {
-   "DefaultNetworkCardIndex": 0,
-   "EfaSupported": false,
-   "EnaSrdSupported": false,
-   "EnaSupport": "required",
-   "EncryptionInTransitSupported": true,
-   "FlexibleEnaQueuesSupport": "unsupported",
-   "Ipv4AddressesPerInterface": 50,
-   "Ipv6AddressesPerInterface": 50,
-   "Ipv6Supported": true,
-   "MaximumNetworkCards": 1,
-   "MaximumNetworkInterfaces": 15,
-   "NetworkCards": [
-    {
-     "BaselineBandwidthInGbps": 100.0,
-     "DefaultEnaQueueCountPerInterface": 32,
-     "MaximumNetworkInterfaces": 15,
-     "NetworkCardIndex": 0,
-     "NetworkPerformance": "100 Gigabit",
-     "PeakBandwidthInGbps": 100.0
-    }
-   ],
-   "NetworkPerformance": "100 Gigabit"
-  },
-  "NitroEnclavesSupport": "unsupported",
-  "NitroTpmSupport": "unsupported",
-  "PhcSupport": "unsupported",
-  "PlacementGroupInfo": {
-   "SupportedStrategies": [
-    "cluster",
-    "partition",
-    "spread"
-   ]
-  },
-  "ProcessorInfo": {
-   "Manufacturer": "Intel",
-   "SupportedArchitectures": [
-    "x86_64"
-   ],
-   "SustainedClockSpeedInGhz": 2.7
-  },
-  "RebootMigrationSupport": "supported",
-  "SupportedBootModes": [
-   "legacy-bios"
-  ],
-  "SupportedRootDeviceTypes": [
-   "ebs"
-  ],
-  "SupportedUsageClasses": [
-   "on-demand"
-  ],
-  "SupportedVirtualizationTypes": [
-   "hvm"
-  ],
-  "VCpuInfo": {
-   "DefaultCores": 224,
-   "DefaultThreadsPerCore": 2,
-   "DefaultVCpus": 448,
-   "ValidCores": [
-    16,
-    24,
-    32,
-    40,
-    48,
-    56,
-    64,
-    72,
-    80,
-    88,
-    96,
-    104,
-    112,
-    120,
-    128,
-    136,
-    144,
-    152,
-    160,
-    168,
-    176,
-    184,
-    192,
-    200,
-    208,
-    216,
-    224
-   ],
-   "ValidThreadsPerCore": [
-    1,
-    2
-   ]
-  }
- },
- "u-24tb1.112xlarge": {
-  "AutoRecoverySupported": true,
-  "BareMetal": false,
-  "BurstablePerformanceSupported": false,
-  "CurrentGeneration": true,
-  "DedicatedHostsSupported": true,
-  "EbsInfo": {
-   "EbsOptimizedInfo": {
-    "BaselineBandwidthInMbps": 38000,
-    "BaselineIops": 160000,
-    "BaselineThroughputInMBps": 4750.0,
-    "MaximumBandwidthInMbps": 38000,
-    "MaximumIops": 160000,
-    "MaximumThroughputInMBps": 4750.0
-   },
-   "EbsOptimizedSupport": "default",
-   "EncryptionSupport": "supported",
-   "NvmeSupport": "required"
-  },
-  "FreeTierEligible": false,
-  "HibernationSupported": false,
-  "Hypervisor": "nitro",
-  "InstanceStorageSupported": false,
-  "InstanceType": "u-24tb1.112xlarge",
-  "MemoryInfo": {
-   "SizeInMiB": 25165824
-  },
-  "NetworkInfo": {
-   "DefaultNetworkCardIndex": 0,
-   "EfaSupported": false,
-   "EnaSrdSupported": false,
-   "EnaSupport": "required",
-   "EncryptionInTransitSupported": true,
-   "FlexibleEnaQueuesSupport": "unsupported",
-   "Ipv4AddressesPerInterface": 50,
-   "Ipv6AddressesPerInterface": 50,
-   "Ipv6Supported": true,
-   "MaximumNetworkCards": 1,
-   "MaximumNetworkInterfaces": 15,
-   "NetworkCards": [
-    {
-     "BaselineBandwidthInGbps": 100.0,
-     "DefaultEnaQueueCountPerInterface": 32,
-     "MaximumNetworkInterfaces": 15,
-     "NetworkCardIndex": 0,
-     "NetworkPerformance": "100 Gigabit",
-     "PeakBandwidthInGbps": 100.0
-    }
-   ],
-   "NetworkPerformance": "100 Gigabit"
-  },
-  "NitroEnclavesSupport": "unsupported",
-  "NitroTpmSupport": "unsupported",
-  "PhcSupport": "unsupported",
-  "PlacementGroupInfo": {
-   "SupportedStrategies": [
-    "cluster",
-    "partition",
-    "spread"
-   ]
-  },
-  "ProcessorInfo": {
-   "Manufacturer": "Intel",
-   "SupportedArchitectures": [
-    "x86_64"
-   ],
-   "SustainedClockSpeedInGhz": 2.7
-  },
-  "RebootMigrationSupport": "supported",
-  "SupportedBootModes": [
-   "legacy-bios"
-  ],
-  "SupportedRootDeviceTypes": [
-   "ebs"
-  ],
-  "SupportedUsageClasses": [
-   "on-demand"
-  ],
-  "SupportedVirtualizationTypes": [
-   "hvm"
-  ],
-  "VCpuInfo": {
-   "DefaultCores": 224,
-   "DefaultThreadsPerCore": 2,
-   "DefaultVCpus": 448,
-   "ValidCores": [
-    16,
-    24,
-    32,
-    40,
-    48,
-    56,
-    64,
-    72,
-    80,
-    88,
-    96,
-    104,
-    112,
-    120,
-    128,
-    136,
-    144,
-    152,
-    160,
-    168,
-    176,
-    184,
-    192,
-    200,
-    208,
-    216,
-    224
-   ],
-   "ValidThreadsPerCore": [
-    1,
-    2
-   ]
-  }
- },
  "u-3tb1.56xlarge": {
   "AutoRecoverySupported": true,
   "BareMetal": false,
@@ -102274,126 +101914,6 @@
    ]
   }
  },
- "u-9tb1.112xlarge": {
-  "AutoRecoverySupported": true,
-  "BareMetal": false,
-  "BurstablePerformanceSupported": false,
-  "CurrentGeneration": true,
-  "DedicatedHostsSupported": true,
-  "EbsInfo": {
-   "EbsOptimizedInfo": {
-    "BaselineBandwidthInMbps": 38000,
-    "BaselineIops": 160000,
-    "BaselineThroughputInMBps": 4750.0,
-    "MaximumBandwidthInMbps": 38000,
-    "MaximumIops": 160000,
-    "MaximumThroughputInMBps": 4750.0
-   },
-   "EbsOptimizedSupport": "default",
-   "EncryptionSupport": "supported",
-   "NvmeSupport": "required"
-  },
-  "FreeTierEligible": false,
-  "HibernationSupported": false,
-  "Hypervisor": "nitro",
-  "InstanceStorageSupported": false,
-  "InstanceType": "u-9tb1.112xlarge",
-  "MemoryInfo": {
-   "SizeInMiB": 9437184
-  },
-  "NetworkInfo": {
-   "DefaultNetworkCardIndex": 0,
-   "EfaSupported": false,
-   "EnaSrdSupported": false,
-   "EnaSupport": "required",
-   "EncryptionInTransitSupported": true,
-   "FlexibleEnaQueuesSupport": "unsupported",
-   "Ipv4AddressesPerInterface": 50,
-   "Ipv6AddressesPerInterface": 50,
-   "Ipv6Supported": true,
-   "MaximumNetworkCards": 1,
-   "MaximumNetworkInterfaces": 15,
-   "NetworkCards": [
-    {
-     "BaselineBandwidthInGbps": 100.0,
-     "DefaultEnaQueueCountPerInterface": 32,
-     "MaximumNetworkInterfaces": 15,
-     "NetworkCardIndex": 0,
-     "NetworkPerformance": "100 Gigabit",
-     "PeakBandwidthInGbps": 100.0
-    }
-   ],
-   "NetworkPerformance": "100 Gigabit"
-  },
-  "NitroEnclavesSupport": "unsupported",
-  "NitroTpmSupport": "unsupported",
-  "PhcSupport": "unsupported",
-  "PlacementGroupInfo": {
-   "SupportedStrategies": [
-    "cluster",
-    "partition",
-    "spread"
-   ]
-  },
-  "ProcessorInfo": {
-   "Manufacturer": "Intel",
-   "SupportedArchitectures": [
-    "x86_64"
-   ],
-   "SustainedClockSpeedInGhz": 2.1
-  },
-  "RebootMigrationSupport": "supported",
-  "SupportedBootModes": [
-   "legacy-bios"
-  ],
-  "SupportedRootDeviceTypes": [
-   "ebs"
-  ],
-  "SupportedUsageClasses": [
-   "on-demand"
-  ],
-  "SupportedVirtualizationTypes": [
-   "hvm"
-  ],
-  "VCpuInfo": {
-   "DefaultCores": 224,
-   "DefaultThreadsPerCore": 2,
-   "DefaultVCpus": 448,
-   "ValidCores": [
-    16,
-    24,
-    32,
-    40,
-    48,
-    56,
-    64,
-    72,
-    80,
-    88,
-    96,
-    104,
-    112,
-    120,
-    128,
-    136,
-    144,
-    152,
-    160,
-    168,
-    176,
-    184,
-    192,
-    200,
-    208,
-    216,
-    224
-   ],
-   "ValidThreadsPerCore": [
-    1,
-    2
-   ]
-  }
- },
  "u7i-12tb.224xlarge": {
   "AutoRecoverySupported": true,
   "BareMetal": false,
diff --git a/moto/emr/exceptions.py b/moto/emr/exceptions.py
index 9389eeb19..bbb438296 100644
--- a/moto/emr/exceptions.py
+++ b/moto/emr/exceptions.py
@@ -1,16 +1,16 @@
-from moto.core.exceptions import JsonRESTError
+from moto.core.exceptions import ServiceException
 
 
-class InvalidRequestException(JsonRESTError):
+class InvalidRequestException(ServiceException):
     def __init__(self, message: str):
         super().__init__("InvalidRequestException", message)
 
 
-class ValidationException(JsonRESTError):
+class ValidationException(ServiceException):
     def __init__(self, message: str):
         super().__init__("ValidationException", message)
 
 
-class ResourceNotFoundException(JsonRESTError):
+class ResourceNotFoundException(ServiceException):
     def __init__(self, message: str):
         super().__init__("ResourceNotFoundException", message)
diff --git a/moto/emr/models.py b/moto/emr/models.py
index 28df66ab2..948e4d88c 100644
--- a/moto/emr/models.py
+++ b/moto/emr/models.py
@@ -1,10 +1,14 @@
-from datetime import datetime, timedelta, timezone
+from __future__ import annotations
+
+from datetime import datetime, timedelta
 from typing import Any, Dict, List, Optional, Tuple
 
 from dateutil.parser import parse as dtparse
 
 from moto.core.base_backend import BackendDict, BaseBackend
 from moto.core.common_models import BaseModel, CloudFormationModel
+from moto.core.utils import utcnow
+from moto.ec2.models.instances import Instance as EC2Instance
 from moto.emr.exceptions import (
     InvalidRequestException,
     ResourceNotFoundException,
@@ -22,38 +26,96 @@ from .utils import (
 EXAMPLE_AMI_ID = "ami-12c6146b"
 
 
-class FakeApplication(BaseModel):
+class Application(BaseModel):
     def __init__(
         self, name: str, version: str, args: List[str], additional_info: Dict[str, str]
     ):
         self.additional_info = additional_info or {}
         self.args = args or []
-        self.name = name
-        self.version = version
+        self.name = name or None
+        self.version = version or None
 
 
-class FakeBootstrapAction(BaseModel):
+class BootstrapAction(BaseModel):
     def __init__(self, args: List[str], name: str, script_path: str):
         self.args = args or []
         self.name = name
         self.script_path = script_path
 
 
-class FakeInstance(BaseModel):
+class Instance(BaseModel):
     def __init__(
         self,
-        ec2_instance_id: str,
-        instance_group: "FakeInstanceGroup",
+        ec2_instance: EC2Instance,
+        instance_group: InstanceGroup,
         instance_fleet_id: Optional[str] = None,
         instance_id: Optional[str] = None,
     ):
         self.id = instance_id or random_instance_group_id()
-        self.ec2_instance_id = ec2_instance_id
+        self.ec2_instance = ec2_instance
         self.instance_group = instance_group
-        self.instance_fleet_id = instance_fleet_id
+        self.instance_fleet_id = instance_fleet_id or ""
+
+    @property
+    def ec2_instance_id(self) -> str:
+        return self.ec2_instance.id
+
+    @property
+    def public_dns_name(self) -> str | None:
+        return self.ec2_instance.public_dns
+
+    @property
+    def public_ip_address(self) -> str | None:
+        return self.ec2_instance.public_ip
+
+    @property
+    def private_ip_address(self) -> str | None:
+        return self.ec2_instance.private_ip
+
+    @property
+    def private_dns_name(self) -> str:
+        return self.ec2_instance.private_dns
 
+    @property
+    def instance_group_id(self) -> str:
+        return self.instance_group.id
+
+    @property
+    def market(self) -> str:
+        return self.instance_group.market
+
+    @property
+    def instance_type(self) -> str:
+        return self.ec2_instance.instance_type
+
+    @property
+    def ebs_volumes(self) -> list[dict[str, str]]:
+        ebs_volumes = []
+        for volume in self.ec2_instance.block_device_mapping:
+            member = {
+                "Device": volume,
+                "VolumeId": self.ec2_instance.block_device_mapping[volume].volume_id,
+            }
+            ebs_volumes.append(member)
+        return ebs_volumes
+
+    @property
+    def status(self) -> dict[str, Any]:
+        status_dict = {
+            "State": self.instance_group.state,
+            "StateChangeReason": {
+                "Message": getattr(self, "state_change_reason", None),
+            },
+            "Timeline": {
+                "CreationDateTime": self.instance_group.creation_date_time,
+                "EndDateTime": self.instance_group.end_date_time,
+                "ReadyDateTime": self.instance_group.ready_date_time,
+            },
+        }
+        return status_dict
 
-class FakeInstanceGroup(CloudFormationModel):
+
+class InstanceGroup(CloudFormationModel):
     def __init__(
         self,
         cluster_id: str,
@@ -66,7 +128,7 @@ class FakeInstanceGroup(CloudFormationModel):
         bid_price: Optional[str] = None,
         ebs_configuration: Optional[Dict[str, Any]] = None,
         auto_scaling_policy: Optional[Dict[str, Any]] = None,
-    ):
+    ) -> None:
         self.id = instance_group_id or random_instance_group_id()
         self.cluster_id = cluster_id
 
@@ -82,20 +144,77 @@ class FakeInstanceGroup(CloudFormationModel):
         self.name = name
         self.num_instances = instance_count
         self.role = instance_role
+        self.instance_group_type = self.role
         self.instance_type = instance_type
         self.ebs_configuration = ebs_configuration
         self.auto_scaling_policy = auto_scaling_policy
-        self.creation_datetime = datetime.now(timezone.utc)
-        self.start_datetime = datetime.now(timezone.utc)
-        self.ready_datetime = datetime.now(timezone.utc)
-        self.end_datetime = None
-        self.state = "RUNNING"
+        self.creation_date_time: datetime = utcnow()
+        self.start_date_time: datetime = utcnow()
+        self.ready_date_time: datetime = utcnow()
+        self.end_date_time: Optional[datetime] = None
+        self.state: str = "RUNNING"
 
     def set_instance_count(self, instance_count: int) -> None:
         self.num_instances = instance_count
 
     @property
-    def auto_scaling_policy(self) -> Any:  # type: ignore[misc]
+    def status(self) -> dict[str, Any]:
+        status_dict = {
+            "State": self.state,
+            "StateChangeReason": {
+                "Message": getattr(self, "state_change_reason", None),
+                "Code": "USER_REQUEST",
+            },
+            "Timeline": {
+                "CreationDateTime": self.creation_date_time,
+                "EndDateTime": self.end_date_time,
+                "ReadyDateTime": self.ready_date_time,
+            },
+        }
+        return status_dict
+
+    @property
+    def ebs_block_devices(self) -> list[dict[str, Any]]:
+        ebs_block_devices = []
+        if self.ebs_configuration is not None:
+            for ebs_block_device in self.ebs_configuration.get(
+                "ebs_block_device_configs", []
+            ):
+                for i in range(ebs_block_device.get("volumes_per_instance", 0)):
+                    volume_spec = ebs_block_device["volume_specification"]
+                    member = {
+                        "VolumeSpecification": {
+                            "VolumeType": volume_spec.get("volume_type"),
+                            "Iops": volume_spec.get("iops"),
+                            "SizeInGB": volume_spec.get("size_in_gb"),
+                        },
+                        "Device": f"/dev/sd{i}",
+                    }
+                    ebs_block_devices.append(member)
+        return ebs_block_devices
+
+    @property
+    def instance_request_count(self) -> int:
+        return self.num_instances
+
+    @property
+    def instance_role(self) -> str:
+        return self.role
+
+    @property
+    def instance_running_count(self) -> int:
+        return self.num_instances
+
+    @property
+    def requested_instance_count(self) -> int:
+        return self.num_instances
+
+    @property
+    def running_instance_count(self) -> int:
+        return self.num_instances
+
+    @property
+    def auto_scaling_policy(self) -> Any:
         return self._auto_scaling_policy
 
     @auto_scaling_policy.setter
@@ -131,14 +250,14 @@ class FakeInstanceGroup(CloudFormationModel):
         return "AWS::EMR::InstanceGroupConfig"
 
     @classmethod
-    def create_from_cloudformation_json(  # type: ignore[misc]
+    def create_from_cloudformation_json(
         cls,
         resource_name: str,
         cloudformation_json: Any,
         account_id: str,
         region_name: str,
         **kwargs: Any,
-    ) -> "FakeInstanceGroup":
+    ) -> InstanceGroup:
         properties = cloudformation_json["Properties"]
         job_flow_id = properties["JobFlowId"]
         ebs_config = properties.get("EbsConfiguration")
@@ -161,7 +280,7 @@ class FakeInstanceGroup(CloudFormationModel):
         )[0]
 
 
-class FakeStep(BaseModel):
+class Step(BaseModel):
     def __init__(
         self,
         state: str,
@@ -179,20 +298,81 @@ class FakeStep(BaseModel):
         self.jar = jar
         self.properties = properties or {}
 
-        self.creation_datetime = datetime.now(timezone.utc)
-        self.end_datetime = None
-        self.ready_datetime = None
-        self.start_datetime: Optional[datetime] = None
+        self.creation_date_time = utcnow()
+        self.end_date_time = None
+        self.ready_date_time = None
+        self.start_date_time: Optional[datetime] = None
         self.state = state
 
+    @property
+    def config(self) -> dict[str, Any]:
+        config = {
+            "ActionOnFailure": self.action_on_failure,
+            "HadoopJarStep": {
+                "Jar": self.jar,
+                "Args": self.args,
+                "Properties": [
+                    {"Key": k, "Value": v} for k, v in self.properties.items()
+                ],
+            },
+            "Name": self.name,
+            "Jar": self.jar,
+            "Args": self.args,
+            "Properties": self.properties,
+        }
+        return config
+
+    @property
+    def execution_status_detail(self) -> dict[str, Any]:
+        status_dict = {
+            "CreationDateTime": self.creation_date_time,
+            "StartDateTime": self.start_date_time,
+            "ReadyDateTime": self.ready_date_time,
+            "EndDateTime": self.end_date_time,
+            "LastStateChangeReason": getattr(self, "last_state_change_reason", None),
+            "State": self.state,
+        }
+        return status_dict
+
+    @property
+    def status(self) -> dict[str, Any]:
+        status_dict = {
+            "State": self.state,
+            "StateChangeReason": {
+                "Message": getattr(self, "last_state_change_reason", None)
+            },
+            "Timeline": {
+                "CreationDateTime": self.creation_date_time,
+                "EndDateTime": self.end_date_time,
+                "StartDateTime": self.start_date_time,
+            },
+        }
+        return status_dict
+
     def start(self) -> None:
-        self.start_datetime = datetime.now(timezone.utc)
+        self.start_date_time = utcnow()
+
+
+class Ec2InstanceAttributes:
+    def __init__(self, cluster: Cluster) -> None:
+        self.cluster = cluster
+        self.additional_master_security_groups = (
+            cluster.additional_master_security_groups
+        )
+        self.additional_slave_security_groups = cluster.additional_slave_security_groups
+        self.ec2_availability_zone = cluster.availability_zone
+        self.ec2_key_name = cluster.ec2_key_name
+        self.ec2_subnet_id = cluster.ec2_subnet_id
+        self.iam_instance_profile = cluster.role
+        self.emr_managed_master_security_group = cluster.master_security_group
+        self.emr_managed_slave_security_group = cluster.slave_security_group
+        self.service_access_security_group = cluster.service_access_security_group
 
 
-class FakeCluster(CloudFormationModel):
+class Cluster(CloudFormationModel):
     def __init__(
         self,
-        emr_backend: "ElasticMapReduceBackend",
+        emr_backend: ElasticMapReduceBackend,
         name: str,
         log_uri: str,
         job_flow_role: str,
@@ -202,7 +382,7 @@ class FakeCluster(CloudFormationModel):
         bootstrap_actions: Optional[List[Dict[str, Any]]] = None,
         configurations: Optional[List[Dict[str, Any]]] = None,
         cluster_id: Optional[str] = None,
-        visible_to_all_users: str = "false",
+        visible_to_all_users: bool = False,
         release_label: Optional[str] = None,
         requested_ami_version: Optional[str] = None,
         running_ami_version: Optional[str] = None,
@@ -216,27 +396,27 @@ class FakeCluster(CloudFormationModel):
         emr_backend.clusters[self.id] = self
         self.emr_backend = emr_backend
 
-        self.applications: List[FakeApplication] = []
+        self.applications: List[Application] = []
 
-        self.bootstrap_actions: List[FakeBootstrapAction] = []
+        self.bootstrap_actions: List[BootstrapAction] = []
         for bootstrap_action in bootstrap_actions or []:
             self.add_bootstrap_action(bootstrap_action)
 
         self.configurations = configurations or []
 
-        self.tags: Dict[str, str] = {}
+        self._tags: Dict[str, str] = {}
 
         self.log_uri = log_uri
         self.name = name
         self.normalized_instance_hours = 0
 
-        self.steps: List[FakeStep] = []
+        self.steps: List[Step] = []
         self.add_steps(steps)
 
         self.set_visibility(visible_to_all_users)
 
         self.instance_group_ids: List[str] = []
-        self.instances: List[FakeInstance] = []
+        self.ec2_instances: List[Instance] = []
         self.master_instance_group_id: Optional[str] = None
         self.core_instance_group_id: Optional[str] = None
         if (
@@ -304,7 +484,7 @@ class FakeCluster(CloudFormationModel):
         self.service_role = service_role
         self.step_concurrency_level = step_concurrency_level
 
-        self.creation_datetime = datetime.now(timezone.utc)
+        self.creation_datetime = utcnow()
         self.start_datetime: Optional[datetime] = None
         self.ready_datetime: Optional[datetime] = None
         self.end_datetime: Optional[datetime] = None
@@ -319,13 +499,106 @@ class FakeCluster(CloudFormationModel):
         )
         self.kerberos_attributes = kerberos_attributes
         self.auto_scaling_role = auto_scaling_role
+        self.supported_products: list[str] = []
 
     @property
     def arn(self) -> str:
         return f"arn:{get_partition(self.emr_backend.region_name)}:elasticmapreduce:{self.emr_backend.region_name}:{self.emr_backend.account_id}:cluster/{self.id}"
 
     @property
-    def instance_groups(self) -> List[FakeInstanceGroup]:
+    def ami_version(self) -> str | None:
+        return self.running_ami_version
+
+    @property
+    def auto_terminate(self) -> bool:
+        return not self.keep_job_flow_alive_when_no_steps
+
+    @property
+    def bootstrap_action_detail_list(self) -> list[dict[str, Any]]:
+        details = []
+        for bootstrap_action in self.bootstrap_actions:
+            member = {
+                "BootstrapActionConfig": {
+                    "Name": bootstrap_action.name,
+                    "ScriptBootstrapAction": {
+                        "Args": bootstrap_action.args,
+                        "Path": bootstrap_action.script_path,
+                    },
+                }
+            }
+            details.append(member)
+        return details
+
+    @property
+    def ec2_instance_attributes(self) -> Ec2InstanceAttributes:
+        return Ec2InstanceAttributes(self)
+
+    @property
+    def job_flow_instances_detail(self) -> dict[str, Any]:
+        instances_detail = {
+            "Ec2KeyName": self.ec2_key_name,
+            "Ec2SubnetId": self.ec2_subnet_id,
+            "HadoopVersion": self.hadoop_version,
+            "InstanceCount": self.instance_count,
+            "InstanceGroups": self.instance_groups,
+            "KeepJobFlowAliveWhenNoSteps": self.keep_job_flow_alive_when_no_steps,
+            "MasterInstanceId": getattr(self, "master_instance_id", None),
+            "MasterInstanceType": self.master_instance_type,
+            "MasterPublicDnsName": f"ec2-184-0-0-1.{self.emr_backend.region_name}.compute.amazonaws.com",
+            "NormalizedInstanceHours": self.normalized_instance_hours,
+            "Placement": {"AvailabilityZone": self.availability_zone},
+            "SlaveInstanceType": self.slave_instance_type,
+            "TerminationProtected": self.termination_protected,
+        }
+        return instances_detail
+
+    @property
+    def execution_status_detail(self) -> dict[str, Any]:
+        status_dict = {
+            "State": self.state,
+            "CreationDateTime": self.creation_datetime,
+            "StartDateTime": self.start_datetime,
+            "ReadyDateTime": self.ready_datetime,
+            "EndDateTime": self.end_datetime,
+            "LastStateChangeReason": getattr(self, "last_state_change_reason", None),
+        }
+        return status_dict
+
+    @property
+    def job_flow_id(self) -> str:
+        return self.id
+
+    @property
+    def job_flow_role(self) -> str:
+        return self.role
+
+    @property
+    def master_public_dns_name(self) -> str:
+        # FIXME: This was hardcoded in the original XML template.
+        return "ec2-184-0-0-1.us-west-1.compute.amazonaws.com"
+
+    @property
+    def status(self) -> dict[str, Any]:
+        status_dict = {
+            "State": self.state,
+            "StateChangeReason": {
+                "Message": getattr(self, "last_state_change_reason", None)
+            },
+            "Timeline": {
+                "CreationDateTime": self.creation_datetime,
+                "EndDateTime": self.end_datetime,
+                "ReadyDateTime": self.ready_datetime,
+            },
+        }
+        return status_dict
+
+    @property
+    def tags(self) -> list[dict[str, str]]:
+        tags = [{"Key": k, "Value": v} for k, v in self._tags.items()]
+        return tags
+
+    @property
+    def instance_groups(self) -> List[InstanceGroup]:
         return self.emr_backend.get_instance_groups(self.instance_group_ids)
 
     @property
@@ -346,11 +619,11 @@ class FakeCluster(CloudFormationModel):
 
     def start_cluster(self) -> None:
         self.state = "STARTING"
-        self.start_datetime = datetime.now(timezone.utc)
+        self.start_datetime = utcnow()
 
     def run_bootstrap_actions(self) -> None:
         self.state = "BOOTSTRAPPING"
-        self.ready_datetime = datetime.now(timezone.utc)
+        self.ready_datetime = utcnow()
         self.state = "WAITING"
         if not self.steps:
             if not self.keep_job_flow_alive_when_no_steps:
@@ -358,13 +631,13 @@ class FakeCluster(CloudFormationModel):
 
     def terminate(self) -> None:
         self.state = "TERMINATING"
-        self.end_datetime = datetime.now(timezone.utc)
+        self.end_datetime = utcnow()
         self.state = "TERMINATED"
 
     def add_applications(self, applications: List[Dict[str, Any]]) -> None:
         self.applications.extend(
             [
-                FakeApplication(
+                Application(
                     name=app.get("name", ""),
                     version=app.get("version", ""),
                     args=app.get("args", []),
@@ -375,9 +648,9 @@ class FakeCluster(CloudFormationModel):
         )
 
     def add_bootstrap_action(self, bootstrap_action: Dict[str, Any]) -> None:
-        self.bootstrap_actions.append(FakeBootstrapAction(**bootstrap_action))
+        self.bootstrap_actions.append(BootstrapAction(**bootstrap_action))
 
-    def add_instance_group(self, instance_group: FakeInstanceGroup) -> None:
+    def add_instance_group(self, instance_group: InstanceGroup) -> None:
         if instance_group.role == "MASTER":
             if self.master_instance_group_id:
                 raise Exception("Cannot add another master instance group")
@@ -397,33 +670,33 @@ class FakeCluster(CloudFormationModel):
             self.core_instance_group_id = instance_group.id
         self.instance_group_ids.append(instance_group.id)
 
-    def add_instance(self, instance: FakeInstance) -> None:
-        self.instances.append(instance)
+    def add_instance(self, instance: Instance) -> None:
+        self.ec2_instances.append(instance)
 
-    def add_steps(self, steps: List[Dict[str, Any]]) -> List[FakeStep]:
+    def add_steps(self, steps: List[Dict[str, Any]]) -> List[Step]:
         added_steps = []
         for step in steps:
             if self.steps:
                 # If we already have other steps, this one is pending
-                fake = FakeStep(state="PENDING", **step)
+                fake = Step(state="PENDING", **step)
             else:
-                fake = FakeStep(state="RUNNING", **step)
+                fake = Step(state="RUNNING", **step)
             self.steps.append(fake)
             added_steps.append(fake)
         self.state = "RUNNING"
         return added_steps
 
     def add_tags(self, tags: Dict[str, str]) -> None:
-        self.tags.update(tags)
+        self._tags.update(tags)
 
     def remove_tags(self, tag_keys: List[str]) -> None:
         for key in tag_keys:
-            self.tags.pop(key, None)
+            self._tags.pop(key, None)
 
     def set_termination_protection(self, value: bool) -> None:
         self.termination_protected = value
 
-    def set_visibility(self, visibility: str) -> None:
+    def set_visibility(self, visibility: bool) -> None:
         self.visible_to_all_users = visibility
 
     @property
@@ -446,14 +719,14 @@ class FakeCluster(CloudFormationModel):
         raise UnformattedGetAttTemplateException()
 
     @classmethod
-    def create_from_cloudformation_json(  # type: ignore[misc]
+    def create_from_cloudformation_json(
         cls,
         resource_name: str,
         cloudformation_json: Any,
         account_id: str,
         region_name: str,
         **kwargs: Any,
-    ) -> "FakeCluster":
+    ) -> Cluster:
         properties = cloudformation_json["Properties"]
 
         instance_attrs = properties.get("Instances", {})
@@ -491,7 +764,7 @@ class FakeCluster(CloudFormationModel):
         return cluster
 
     @classmethod
-    def delete_from_cloudformation_json(  # type: ignore[misc]
+    def delete_from_cloudformation_json(
         cls,
         resource_name: str,
         cloudformation_json: Dict[str, Any],
@@ -503,11 +776,11 @@ class FakeCluster(CloudFormationModel):
         emr_backend.terminate_job_flows([resource_name])
 
 
-class FakeSecurityConfiguration(CloudFormationModel):
+class SecurityConfiguration(CloudFormationModel):
     def __init__(self, name: str, security_configuration: str):
         self.name = name
         self.security_configuration = security_configuration
-        self.creation_date_time = datetime.now(timezone.utc)
+        self.creation_date_time = utcnow()
 
     @property
     def physical_resource_id(self) -> str:
@@ -518,14 +791,14 @@ class FakeSecurityConfiguration(CloudFormationModel):
         return "AWS::EMR::SecurityConfiguration"
 
     @classmethod
-    def create_from_cloudformation_json(  # type: ignore[misc]
+    def create_from_cloudformation_json(
         cls,
         resource_name: str,
         cloudformation_json: Any,
         account_id: str,
         region_name: str,
         **kwargs: Any,
-    ) -> "FakeSecurityConfiguration":
+    ) -> SecurityConfiguration:
         emr_backend: ElasticMapReduceBackend = emr_backends[account_id][region_name]
 
         properties = cloudformation_json["Properties"]
@@ -535,7 +808,7 @@ class FakeSecurityConfiguration(CloudFormationModel):
         )
 
     @classmethod
-    def delete_from_cloudformation_json(  # type: ignore[misc]
+    def delete_from_cloudformation_json(
         cls,
         resource_name: str,
         cloudformation_json: Dict[str, Any],
@@ -552,13 +825,13 @@ class FakeSecurityConfiguration(CloudFormationModel):
 class ElasticMapReduceBackend(BaseBackend):
     def __init__(self, region_name: str, account_id: str):
         super().__init__(region_name, account_id)
-        self.clusters: Dict[str, FakeCluster] = {}
-        self.instance_groups: Dict[str, FakeInstanceGroup] = {}
-        self.security_configurations: Dict[str, FakeSecurityConfiguration] = {}
+        self.clusters: Dict[str, Cluster] = {}
+        self.instance_groups: Dict[str, InstanceGroup] = {}
+        self.security_configurations: Dict[str, SecurityConfiguration] = {}
         self.block_public_access_configuration: Dict[str, Any] = {}
 
     @property
-    def ec2_backend(self) -> Any:  # type: ignore[misc]
+    def ec2_backend(self) -> Any:
         """
         :return: EC2 Backend
         :rtype: moto.ec2.models.EC2Backend
@@ -575,11 +848,11 @@ class ElasticMapReduceBackend(BaseBackend):
 
     def add_instance_groups(
         self, cluster_id: str, instance_groups: List[Dict[str, Any]]
-    ) -> List[FakeInstanceGroup]:
+    ) -> List[InstanceGroup]:
         cluster = self.clusters[cluster_id]
         result_groups = []
         for instance_group in instance_groups:
-            group = FakeInstanceGroup(cluster_id=cluster_id, **instance_group)
+            group = InstanceGroup(cluster_id=cluster_id, **instance_group)
             self.instance_groups[group.id] = group
             cluster.add_instance_group(group)
             result_groups.append(group)
@@ -589,7 +862,7 @@ class ElasticMapReduceBackend(BaseBackend):
         self,
         cluster_id: str,
         instances: Dict[str, Any],
-        instance_group: FakeInstanceGroup,
+        instance_group: InstanceGroup,
     ) -> None:
         cluster = self.clusters[cluster_id]
         instances["is_instance_type_default"] = not instances.get("instance_type")
@@ -597,14 +870,12 @@ class ElasticMapReduceBackend(BaseBackend):
             EXAMPLE_AMI_ID, instances["instance_count"], "", [], **instances
         )
         for instance in response.instances:
-            instance = FakeInstance(
-                ec2_instance_id=instance.id, instance_group=instance_group
-            )
+            instance = Instance(ec2_instance=instance, instance_group=instance_group)
             cluster.add_instance(instance)
 
     def add_job_flow_steps(
         self, job_flow_id: str, steps: List[Dict[str, Any]]
-    ) -> List[FakeStep]:
+    ) -> List[Step]:
         cluster = self.clusters[job_flow_id]
         return cluster.add_steps(steps)
 
@@ -618,10 +889,10 @@ class ElasticMapReduceBackend(BaseBackend):
         job_flow_states: Optional[List[str]] = None,
         created_after: Optional[str] = None,
         created_before: Optional[str] = None,
-    ) -> List[FakeCluster]:
+    ) -> List[Cluster]:
         clusters = list(self.clusters.values())
 
-        within_two_month = datetime.now(timezone.utc) - timedelta(days=60)
+        within_two_month = utcnow() - timedelta(days=60)
         clusters = [c for c in clusters if c.creation_datetime >= within_two_month]
 
         if job_flow_ids:
@@ -630,31 +901,33 @@ class ElasticMapReduceBackend(BaseBackend):
             clusters = [c for c in clusters if c.state in job_flow_states]
         if created_after:
             clusters = [
-                c for c in clusters if c.creation_datetime > dtparse(created_after)
+                c
+                for c in clusters
+                if c.creation_datetime > dtparse(created_after).replace(tzinfo=None)
             ]
         if created_before:
             clusters = [
-                c for c in clusters if c.creation_datetime < dtparse(created_before)
+                c
+                for c in clusters
+                if c.creation_datetime < dtparse(created_before).replace(tzinfo=None)
             ]
 
         # Amazon EMR can return a maximum of 512 job flow descriptions
         return sorted(clusters, key=lambda x: x.id)[:512]
 
-    def describe_step(self, cluster_id: str, step_id: str) -> Optional[FakeStep]:
+    def describe_step(self, cluster_id: str, step_id: str) -> Optional[Step]:
         cluster = self.clusters[cluster_id]
         for step in cluster.steps:
             if step.id == step_id:
                 return step
         return None
 
-    def describe_cluster(self, cluster_id: str) -> FakeCluster:
+    def describe_cluster(self, cluster_id: str) -> Cluster:
         if cluster_id in self.clusters:
             return self.clusters[cluster_id]
         raise ResourceNotFoundException("")
 
-    def get_instance_groups(
-        self, instance_group_ids: List[str]
-    ) -> List[FakeInstanceGroup]:
+    def get_instance_groups(self, instance_group_ids: List[str]) -> List[InstanceGroup]:
         return [
             group
             for group_id, group in self.instance_groups.items()
@@ -663,7 +936,7 @@ class ElasticMapReduceBackend(BaseBackend):
 
     def list_bootstrap_actions(
         self, cluster_id: str, marker: Optional[str] = None
-    ) -> Tuple[List[FakeBootstrapAction], Optional[str]]:
+    ) -> Tuple[List[BootstrapAction], Optional[str]]:
         max_items = 50
         actions = self.clusters[cluster_id].bootstrap_actions
         start_idx = 0 if marker is None else int(marker)
@@ -680,18 +953,22 @@ class ElasticMapReduceBackend(BaseBackend):
         created_after: Optional[str] = None,
         created_before: Optional[str] = None,
         marker: Optional[str] = None,
-    ) -> Tuple[List[FakeCluster], Optional[str]]:
+    ) -> Tuple[List[Cluster], Optional[str]]:
         max_items = 50
         clusters = list(self.clusters.values())
         if cluster_states:
             clusters = [c for c in clusters if c.state in cluster_states]
         if created_after:
             clusters = [
-                c for c in clusters if c.creation_datetime > dtparse(created_after)
+                c
+                for c in clusters
+                if c.creation_datetime > dtparse(created_after).replace(tzinfo=None)
             ]
         if created_before:
             clusters = [
-                c for c in clusters if c.creation_datetime < dtparse(created_before)
+                c
+                for c in clusters
+                if c.creation_datetime < dtparse(created_before).replace(tzinfo=None)
             ]
         clusters = sorted(clusters, key=lambda x: x.id)
         start_idx = 0 if marker is None else int(marker)
@@ -704,7 +981,7 @@ class ElasticMapReduceBackend(BaseBackend):
 
     def list_instance_groups(
         self, cluster_id: str, marker: Optional[str] = None
-    ) -> Tuple[List[FakeInstanceGroup], Optional[str]]:
+    ) -> Tuple[List[InstanceGroup], Optional[str]]:
         max_items = 50
         groups = sorted(self.clusters[cluster_id].instance_groups, key=lambda x: x.id)
         start_idx = 0 if marker is None else int(marker)
@@ -719,9 +996,9 @@ class ElasticMapReduceBackend(BaseBackend):
         marker: Optional[str] = None,
         instance_group_id: Optional[str] = None,
         instance_group_types: Optional[List[str]] = None,
-    ) -> Tuple[List[FakeInstance], Optional[str]]:
+    ) -> Tuple[List[Instance], Optional[str]]:
         max_items = 50
-        groups = sorted(self.clusters[cluster_id].instances, key=lambda x: x.id)
+        groups = sorted(self.clusters[cluster_id].ec2_instances, key=lambda x: x.id)
         start_idx = 0 if marker is None else int(marker)
         marker = (
             None if len(groups) <= start_idx + max_items else str(start_idx + max_items)
@@ -732,8 +1009,6 @@ class ElasticMapReduceBackend(BaseBackend):
             groups = [
                 g for g in groups if g.instance_group.role in instance_group_types
             ]
-        for g in groups:
-            g.details = self.ec2_backend.get_instance(g.ec2_instance_id)  # type: ignore
         return groups[start_idx : start_idx + max_items], marker
 
     def list_steps(
@@ -742,11 +1017,11 @@ class ElasticMapReduceBackend(BaseBackend):
         marker: Optional[str] = None,
         step_ids: Optional[List[str]] = None,
         step_states: Optional[List[str]] = None,
-    ) -> Tuple[List[FakeStep], Optional[str]]:
+    ) -> Tuple[List[Step], Optional[str]]:
         max_items = 50
         steps = sorted(
             self.clusters[cluster_id].steps,
-            key=lambda o: o.creation_datetime,
+            key=lambda o: o.creation_date_time,
             reverse=True,
         )
         if step_ids:
@@ -759,9 +1034,7 @@ class ElasticMapReduceBackend(BaseBackend):
         )
         return steps[start_idx : start_idx + max_items], marker
 
-    def modify_cluster(
-        self, cluster_id: str, step_concurrency_level: int
-    ) -> FakeCluster:
+    def modify_cluster(self, cluster_id: str, step_concurrency_level: int) -> Cluster:
         cluster = self.clusters[cluster_id]
         cluster.step_concurrency_level = step_concurrency_level
         return cluster
@@ -807,16 +1080,16 @@ class ElasticMapReduceBackend(BaseBackend):
         )
         return master.id, slave.id, service.id
 
-    def run_job_flow(self, **kwargs: Any) -> FakeCluster:
+    def run_job_flow(self, **kwargs: Any) -> Cluster:
         (
             kwargs["instance_attrs"]["emr_managed_master_security_group"],
             kwargs["instance_attrs"]["emr_managed_slave_security_group"],
             kwargs["instance_attrs"]["service_access_security_group"],
         ) = self._manage_security_groups(**kwargs["instance_attrs"])
-        return FakeCluster(self, **kwargs)
+        return Cluster(self, **kwargs)
 
     def set_visible_to_all_users(
-        self, job_flow_ids: List[str], visible_to_all_users: str
+        self, job_flow_ids: List[str], visible_to_all_users: bool
     ) -> None:
         for job_flow_id in job_flow_ids:
             cluster = self.clusters[job_flow_id]
@@ -827,7 +1100,7 @@ class ElasticMapReduceBackend(BaseBackend):
             cluster = self.clusters[job_flow_id]
             cluster.set_termination_protection(value)
 
-    def terminate_job_flows(self, job_flow_ids: List[str]) -> List[FakeCluster]:
+    def terminate_job_flows(self, job_flow_ids: List[str]) -> List[Cluster]:
         clusters_terminated = []
         clusters_protected = []
         for job_flow_id in job_flow_ids:
@@ -845,7 +1118,7 @@ class ElasticMapReduceBackend(BaseBackend):
 
     def put_auto_scaling_policy(
         self, instance_group_id: str, auto_scaling_policy: Optional[Dict[str, Any]]
-    ) -> Optional[FakeInstanceGroup]:
+    ) -> Optional[InstanceGroup]:
         instance_groups = self.get_instance_groups(
             instance_group_ids=[instance_group_id]
         )
@@ -860,18 +1133,18 @@ class ElasticMapReduceBackend(BaseBackend):
 
     def create_security_configuration(
         self, name: str, security_configuration: str
-    ) -> FakeSecurityConfiguration:
+    ) -> SecurityConfiguration:
         if name in self.security_configurations:
             raise InvalidRequestException(
                 message=f"SecurityConfiguration with name '{name}' already exists."
             )
-        config = FakeSecurityConfiguration(
+        config = SecurityConfiguration(
             name=name, security_configuration=security_configuration
         )
         self.security_configurations[name] = config
         return config
 
-    def get_security_configuration(self, name: str) -> FakeSecurityConfiguration:
+    def get_security_configuration(self, name: str) -> SecurityConfiguration:
         if name not in self.security_configurations:
             raise InvalidRequestException(
                 message=f"Security configuration with name '{name}' does not exist."
@@ -913,7 +1186,7 @@ class ElasticMapReduceBackend(BaseBackend):
                 ],
             },
             "block_public_access_configuration_metadata": {
-                "creation_date_time": datetime.now(),
+                "creation_date_time": utcnow(),
                 "created_by_arn": user_arn,
             },
         }
diff --git a/moto/emr/responses.py b/moto/emr/responses.py
index c1618455a..38978327a 100644
--- a/moto/emr/responses.py
+++ b/moto/emr/responses.py
@@ -1,10 +1,7 @@
-import json
 import re
-from datetime import datetime, timezone
-from functools import wraps
-from typing import Any, Callable, Dict, List, Pattern
+from typing import Any, Dict, List, Pattern
 
-from moto.core.responses import AWSServiceSpec, BaseResponse, xml_to_json_response
+from moto.core.responses import ActionResult, AWSServiceSpec, BaseResponse, EmptyResult
 from moto.core.utils import tags_from_query_string
 
 from .exceptions import ValidationException
@@ -12,42 +9,6 @@ from .models import ElasticMapReduceBackend, emr_backends
 from .utils import ReleaseLabel, Unflattener, steps_from_query_string
 
 
-def generate_boto3_response(
-    operation: str,
-) -> Callable[
-    [Callable[["ElasticMapReduceResponse"], str]],
-    Callable[["ElasticMapReduceResponse"], str],
-]:
-    """The decorator to convert an XML response to JSON, if the request is
-    determined to be from boto3. Pass the API action as a parameter.
-
-    """
-
-    def _boto3_request(
-        method: Callable[["ElasticMapReduceResponse"], str],
-    ) -> Callable[["ElasticMapReduceResponse"], str]:
-        @wraps(method)
-        def f(self: "ElasticMapReduceResponse") -> str:
-            rendered = method(self)
-            if "json" in self.headers.get("Content-Type", []):
-                self.response_headers.update(
-                    {
-                        "x-amzn-requestid": "2690d7eb-ed86-11dd-9877-6fad448a8419",
-                        "date": datetime.now(timezone.utc).strftime(
-                            "%a, %d %b %Y %H:%M:%S %Z"
-                        ),
-                        "content-type": "application/x-amz-json-1.1",
-                    }
-                )
-                resp = xml_to_json_response(self.aws_service_spec, operation, rendered)
-                return "" if resp is None else json.dumps(resp)
-            return rendered
-
-        return f
-
-    return _boto3_request
-
-
 class ElasticMapReduceResponse(BaseResponse):
     # EMR end points are inconsistent in the placement of region name
     # in the URL, so parsing it out needs to be handled differently
@@ -72,8 +33,7 @@ class ElasticMapReduceResponse(BaseResponse):
     def backend(self) -> ElasticMapReduceBackend:
         return emr_backends[self.current_account][self.region]
 
-    @generate_boto3_response("AddInstanceGroups")
-    def add_instance_groups(self) -> str:
+    def add_instance_groups(self) -> ActionResult:
         jobflow_id = self._get_param("JobFlowId")
         instance_groups = self._get_list_prefix("InstanceGroups.member")
         for item in instance_groups:
@@ -83,59 +43,48 @@ class ElasticMapReduceResponse(BaseResponse):
             # Adding support for auto_scaling_policy
             Unflattener.unflatten_complex_params(item, "auto_scaling_policy")
         fake_groups = self.backend.add_instance_groups(jobflow_id, instance_groups)
-        template = self.response_template(ADD_INSTANCE_GROUPS_TEMPLATE)
-        return template.render(instance_groups=fake_groups)
+        result = {"InstanceGroups": fake_groups}
+        return ActionResult(result)
 
-    @generate_boto3_response("AddJobFlowSteps")
-    def add_job_flow_steps(self) -> str:
+    def add_job_flow_steps(self) -> ActionResult:
         job_flow_id = self._get_param("JobFlowId")
         steps = self.backend.add_job_flow_steps(
             job_flow_id, steps_from_query_string(self._get_list_prefix("Steps.member"))
         )
-        template = self.response_template(ADD_JOB_FLOW_STEPS_TEMPLATE)
-        return template.render(steps=steps)
+        result = {"StepIds": [step.id for step in steps]}
+        return ActionResult(result)
 
-    @generate_boto3_response("AddTags")
-    def add_tags(self) -> str:
+    def add_tags(self) -> ActionResult:
         cluster_id = self._get_param("ResourceId")
         tags = tags_from_query_string(self.querystring, prefix="Tags")
         self.backend.add_tags(cluster_id, tags)
-        template = self.response_template(ADD_TAGS_TEMPLATE)
-        return template.render()
+        return EmptyResult()
 
-    @generate_boto3_response("CreateSecurityConfiguration")
-    def create_security_configuration(self) -> str:
+    def create_security_configuration(self) -> ActionResult:
         name = self._get_param("Name")
         security_configuration = self._get_param("SecurityConfiguration")
-        resp = self.backend.create_security_configuration(
+        security_configuration = self.backend.create_security_configuration(
             name=name, security_configuration=security_configuration
         )
-        template = self.response_template(CREATE_SECURITY_CONFIGURATION_TEMPLATE)
-        return template.render(name=name, creation_date_time=resp.creation_date_time)
+        return ActionResult(security_configuration)
 
-    @generate_boto3_response("DescribeSecurityConfiguration")
-    def describe_security_configuration(self) -> str:
+    def describe_security_configuration(self) -> ActionResult:
         name = self._get_param("Name")
         security_configuration = self.backend.get_security_configuration(name=name)
-        template = self.response_template(DESCRIBE_SECURITY_CONFIGURATION_TEMPLATE)
-        return template.render(security_configuration=security_configuration)
+        return ActionResult(security_configuration)
 
-    @generate_boto3_response("DeleteSecurityConfiguration")
-    def delete_security_configuration(self) -> str:
+    def delete_security_configuration(self) -> ActionResult:
         name = self._get_param("Name")
         self.backend.delete_security_configuration(name=name)
-        template = self.response_template(DELETE_SECURITY_CONFIGURATION_TEMPLATE)
-        return template.render()
+        return EmptyResult()
 
-    @generate_boto3_response("DescribeCluster")
-    def describe_cluster(self) -> str:
+    def describe_cluster(self) -> ActionResult:
         cluster_id = self._get_param("ClusterId")
         cluster = self.backend.describe_cluster(cluster_id)
-        template = self.response_template(DESCRIBE_CLUSTER_TEMPLATE)
-        return template.render(cluster=cluster)
+        result = {"Cluster": cluster}
+        return ActionResult(result)
 
-    @generate_boto3_response("DescribeJobFlows")
-    def describe_job_flows(self) -> str:
+    def describe_job_flows(self) -> ActionResult:
         created_after = self._get_param("CreatedAfter")
         created_before = self._get_param("CreatedBefore")
         job_flow_ids = self._get_multi_param("JobFlowIds.member")
@@ -143,29 +92,26 @@ class ElasticMapReduceResponse(BaseResponse):
         clusters = self.backend.describe_job_flows(
             job_flow_ids, job_flow_states, created_after, created_before
         )
-        template = self.response_template(DESCRIBE_JOB_FLOWS_TEMPLATE)
-        return template.render(clusters=clusters)
+        result = {"JobFlows": clusters}
+        return ActionResult(result)
 
-    @generate_boto3_response("DescribeStep")
-    def describe_step(self) -> str:
+    def describe_step(self) -> ActionResult:
         cluster_id = self._get_param("ClusterId")
         step_id = self._get_param("StepId")
         step = self.backend.describe_step(cluster_id, step_id)
-        template = self.response_template(DESCRIBE_STEP_TEMPLATE)
-        return template.render(step=step)
+        result = {"Step": step}
+        return ActionResult(result)
 
-    @generate_boto3_response("ListBootstrapActions")
-    def list_bootstrap_actions(self) -> str:
+    def list_bootstrap_actions(self) -> ActionResult:
         cluster_id = self._get_param("ClusterId")
         marker = self._get_param("Marker")
         bootstrap_actions, marker = self.backend.list_bootstrap_actions(
             cluster_id, marker
         )
-        template = self.response_template(LIST_BOOTSTRAP_ACTIONS_TEMPLATE)
-        return template.render(bootstrap_actions=bootstrap_actions, marker=marker)
+        result = {"BootstrapActions": bootstrap_actions, "Marker": marker}
+        return ActionResult(result)
 
-    @generate_boto3_response("ListClusters")
-    def list_clusters(self) -> str:
+    def list_clusters(self) -> ActionResult:
         cluster_states = self._get_multi_param("ClusterStates.member")
         created_after = self._get_param("CreatedAfter")
         created_before = self._get_param("CreatedBefore")
@@ -173,21 +119,19 @@ class ElasticMapReduceResponse(BaseResponse):
         clusters, marker = self.backend.list_clusters(
             cluster_states, created_after, created_before, marker
         )
-        template = self.response_template(LIST_CLUSTERS_TEMPLATE)
-        return template.render(clusters=clusters, marker=marker)
+        result = {"Clusters": clusters, "Marker": marker}
+        return ActionResult(result)
 
-    @generate_boto3_response("ListInstanceGroups")
-    def list_instance_groups(self) -> str:
+    def list_instance_groups(self) -> ActionResult:
         cluster_id = self._get_param("ClusterId")
         marker = self._get_param("Marker")
         instance_groups, marker = self.backend.list_instance_groups(
             cluster_id, marker=marker
         )
-        template = self.response_template(LIST_INSTANCE_GROUPS_TEMPLATE)
-        return template.render(instance_groups=instance_groups, marker=marker)
+        result = {"InstanceGroups": instance_groups, "Marker": marker}
+        return ActionResult(result)
 
-    @generate_boto3_response("ListInstances")
-    def list_instances(self) -> str:
+    def list_instances(self) -> ActionResult:
         cluster_id = self._get_param("ClusterId")
         marker = self._get_param("Marker")
         instance_group_id = self._get_param("InstanceGroupId")
@@ -198,11 +142,10 @@ class ElasticMapReduceResponse(BaseResponse):
             instance_group_id=instance_group_id,
             instance_group_types=instance_group_types,
         )
-        template = self.response_template(LIST_INSTANCES_TEMPLATE)
-        return template.render(instances=instances, marker=marker)
+        result = {"Instances": instances, "Marker": marker}
+        return ActionResult(result)
 
-    @generate_boto3_response("ListSteps")
-    def list_steps(self) -> str:
+    def list_steps(self) -> ActionResult:
         cluster_id = self._get_param("ClusterId")
         marker = self._get_param("Marker")
         step_ids = self._get_multi_param("StepIds.member")
@@ -210,36 +153,30 @@ class ElasticMapReduceResponse(BaseResponse):
         steps, marker = self.backend.list_steps(
             cluster_id, marker=marker, step_ids=step_ids, step_states=step_states
         )
-        template = self.response_template(LIST_STEPS_TEMPLATE)
-        return template.render(steps=steps, marker=marker)
+        result = {"Steps": steps, "Marker": marker}
+        return ActionResult(result)
 
-    @generate_boto3_response("ModifyCluster")
-    def modify_cluster(self) -> str:
+    def modify_cluster(self) -> ActionResult:
         cluster_id = self._get_param("ClusterId")
         step_concurrency_level = self._get_param("StepConcurrencyLevel")
         cluster = self.backend.modify_cluster(cluster_id, step_concurrency_level)
-        template = self.response_template(MODIFY_CLUSTER_TEMPLATE)
-        return template.render(cluster=cluster)
+        result = {"StepConcurrencyLevel": cluster.step_concurrency_level}
+        return ActionResult(result)
 
-    @generate_boto3_response("ModifyInstanceGroups")
-    def modify_instance_groups(self) -> str:
+    def modify_instance_groups(self) -> ActionResult:
         instance_groups = self._get_list_prefix("InstanceGroups.member")
         for item in instance_groups:
             item["instance_count"] = int(item["instance_count"])
         self.backend.modify_instance_groups(instance_groups)
-        template = self.response_template(MODIFY_INSTANCE_GROUPS_TEMPLATE)
-        return template.render()
+        return EmptyResult()
 
-    @generate_boto3_response("RemoveTags")
-    def remove_tags(self) -> str:
+    def remove_tags(self) -> ActionResult:
         cluster_id = self._get_param("ResourceId")
         tag_keys = self._get_multi_param("TagKeys.member")
         self.backend.remove_tags(cluster_id, tag_keys)
-        template = self.response_template(REMOVE_TAGS_TEMPLATE)
-        return template.render()
+        return EmptyResult()
 
-    @generate_boto3_response("RunJobFlow")
-    def run_job_flow(self) -> str:
+    def run_job_flow(self) -> ActionResult:
         instance_attrs = dict(
             master_instance_type=self._get_param("Instances.MasterInstanceType"),
             slave_instance_type=self._get_param("Instances.SlaveInstanceType"),
@@ -410,9 +347,11 @@ class ElasticMapReduceResponse(BaseResponse):
             self.backend.add_tags(
                 cluster.id, dict((d["key"], d["value"]) for d in tags)
             )
-
-        template = self.response_template(RUN_JOB_FLOW_TEMPLATE)
-        return template.render(cluster=cluster)
+        result = {
+            "JobFlowId": cluster.job_flow_id,
+            "ClusterArn": cluster.arn,
+        }
+        return ActionResult(result)
 
     def _has_key_prefix(self, key_prefix: str, value: Dict[str, Any]) -> bool:
         for key in value:  # iter on both keys and values
@@ -491,31 +430,24 @@ class ElasticMapReduceResponse(BaseResponse):
                 ebs_configuration[ebs_block_device_configs] = ebs_blocks
             instance_group[key_ebs_config] = ebs_configuration
 
-    @generate_boto3_response("SetTerminationProtection")
-    def set_termination_protection(self) -> str:
+    def set_termination_protection(self) -> ActionResult:
         termination_protection = self._get_bool_param("TerminationProtected")
         job_ids = self._get_multi_param("JobFlowIds.member")
         self.backend.set_termination_protection(job_ids, termination_protection)
-        template = self.response_template(SET_TERMINATION_PROTECTION_TEMPLATE)
-        return template.render()
+        return EmptyResult()
 
-    @generate_boto3_response("SetVisibleToAllUsers")
-    def set_visible_to_all_users(self) -> str:
-        visible_to_all_users = self._get_param("VisibleToAllUsers")
+    def set_visible_to_all_users(self) -> ActionResult:
+        visible_to_all_users = self._get_bool_param("VisibleToAllUsers", False)
         job_ids = self._get_multi_param("JobFlowIds.member")
         self.backend.set_visible_to_all_users(job_ids, visible_to_all_users)
-        template = self.response_template(SET_VISIBLE_TO_ALL_USERS_TEMPLATE)
-        return template.render()
+        return EmptyResult()
 
-    @generate_boto3_response("TerminateJobFlows")
-    def terminate_job_flows(self) -> str:
+    def terminate_job_flows(self) -> ActionResult:
         job_ids = self._get_multi_param("JobFlowIds.member.")
         self.backend.terminate_job_flows(job_ids)
-        template = self.response_template(TERMINATE_JOB_FLOWS_TEMPLATE)
-        return template.render()
+        return EmptyResult()
 
-    @generate_boto3_response("PutAutoScalingPolicy")
-    def put_auto_scaling_policy(self) -> str:
+    def put_auto_scaling_policy(self) -> ActionResult:
         cluster_id = self._get_param("ClusterId")
         cluster = self.backend.describe_cluster(cluster_id)
         instance_group_id = self._get_param("InstanceGroupId")
@@ -523,39 +455,31 @@ class ElasticMapReduceResponse(BaseResponse):
         instance_group = self.backend.put_auto_scaling_policy(
             instance_group_id, auto_scaling_policy
         )
-        template = self.response_template(PUT_AUTO_SCALING_POLICY)
-        return template.render(
-            cluster_id=cluster_id, cluster=cluster, instance_group=instance_group
-        )
-
-    @generate_boto3_response("RemoveAutoScalingPolicy")
-    def remove_auto_scaling_policy(self) -> str:
+        assert instance_group is not None
+        result = {
+            "ClusterId": cluster.id,
+            "InstanceGroupId": instance_group.id,
+            "AutoScalingPolicy": instance_group.auto_scaling_policy,
+            "ClusterArn": cluster.arn,
+        }
+        return ActionResult(result)
+
+    def remove_auto_scaling_policy(self) -> ActionResult:
         instance_group_id = self._get_param("InstanceGroupId")
         self.backend.remove_auto_scaling_policy(instance_group_id)
-        template = self.response_template(REMOVE_AUTO_SCALING_POLICY)
-        return template.render()
+        return EmptyResult()
 
-    @generate_boto3_response("GetBlockPublicAccessConfiguration")
-    def get_block_public_access_configuration(self) -> str:
+    def get_block_public_access_configuration(self) -> ActionResult:
         configuration = self.backend.get_block_public_access_configuration()
         config = configuration.get("block_public_access_configuration") or {}
         metadata = configuration.get("block_public_access_configuration_metadata") or {}
-        template = self.response_template(
-            GET_BLOCK_PUBLIC_ACCESS_CONFIGURATION_TEMPLATE
-        )
-        return template.render(
-            block_public_security_group_rules=config.get(
-                "block_public_security_group_rules"
-            ),
-            permitted_public_security_group_rule_ranges=config.get(
-                "permitted_public_security_group_rule_ranges"
-            ),
-            creation_date_time=metadata.get("creation_date_time"),
-            created_by_arn=metadata.get("created_by_arn"),
-        )
+        result = {
+            "BlockPublicAccessConfiguration": config,
+            "BlockPublicAccessConfigurationMetadata": metadata,
+        }
+        return ActionResult(result)
 
-    @generate_boto3_response("PutBlockPublicAccessConfiguration")
-    def put_block_public_access_configuration(self) -> str:
+    def put_block_public_access_configuration(self) -> ActionResult:
         params = self._get_params()
         block_public_access_configuration = (
             params.get("BlockPublicAccessConfiguration") or {}
@@ -569,924 +493,4 @@ class ElasticMapReduceResponse(BaseResponse):
                 "PermittedPublicSecurityGroupRuleRanges"
             ),
         )
-        template = self.response_template(
-            PUT_BLOCK_PUBLIC_ACCESS_CONFIGURATION_TEMPLATE
-        )
-        return template.render()
-
-
-ADD_INSTANCE_GROUPS_TEMPLATE = """<AddInstanceGroupsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <AddInstanceGroupsResult>
-    <InstanceGroupIds>
-      {% for instance_group in instance_groups %}
-      <member>{{ instance_group.id }}</member>
-      {% endfor %}
-    </InstanceGroupIds>
-  </AddInstanceGroupsResult>
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</AddInstanceGroupsResponse>"""
-
-ADD_JOB_FLOW_STEPS_TEMPLATE = """<AddJobFlowStepsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <AddJobFlowStepsResult>
-    <StepIds>
-      {% for step in steps %}
-      <member>{{ step.id }}</member>
-      {% endfor %}
-    </StepIds>
-  </AddJobFlowStepsResult>
-  <ResponseMetadata>
-    <RequestId>df6f4f4a-ed85-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</AddJobFlowStepsResponse>"""
-
-ADD_TAGS_TEMPLATE = """<AddTagsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</AddTagsResponse>"""
-
-DESCRIBE_CLUSTER_TEMPLATE = """<DescribeClusterResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <DescribeClusterResult>
-    <Cluster>
-      <Applications>
-        {% for application in cluster.applications %}
-        <member>
-          <Name>{{ application.name }}</Name>
-          <Version>{{ application.version }}</Version>
-        </member>
-        {% endfor %}
-      </Applications>
-      <AutoTerminate>{{ (not cluster.keep_job_flow_alive_when_no_steps)|lower }}</AutoTerminate>
-      <Configurations>
-        {% for configuration in cluster.configurations %}
-        <member>
-          <Classification>{{ configuration['classification'] }}</Classification>
-          <Properties>
-            {% for key, value in configuration['properties'].items() %}
-            <entry>
-              <key>{{ key }}</key>
-              <value>{{ value }}</value>
-            </entry>
-            {% endfor %}
-          </Properties>
-        </member>
-        {% endfor %}
-      </Configurations>
-      {% if cluster.custom_ami_id is not none %}
-      <CustomAmiId>{{ cluster.custom_ami_id }}</CustomAmiId>
-      {% endif %}
-      <Ec2InstanceAttributes>
-        <AdditionalMasterSecurityGroups>
-        {% for each in cluster.additional_master_security_groups %}
-          <member>{{ each }}</member>
-        {% endfor %}
-        </AdditionalMasterSecurityGroups>
-        <AdditionalSlaveSecurityGroups>
-        {% for each in cluster.additional_slave_security_groups %}
-          <member>{{ each }}</member>
-        {% endfor %}
-        </AdditionalSlaveSecurityGroups>
-        <Ec2AvailabilityZone>{{ cluster.availability_zone }}</Ec2AvailabilityZone>
-        <Ec2KeyName>{{ cluster.ec2_key_name }}</Ec2KeyName>
-        <Ec2SubnetId>{{ cluster.ec2_subnet_id }}</Ec2SubnetId>
-        <IamInstanceProfile>{{ cluster.role }}</IamInstanceProfile>
-        <EmrManagedMasterSecurityGroup>{{ cluster.master_security_group }}</EmrManagedMasterSecurityGroup>
-        <EmrManagedSlaveSecurityGroup>{{ cluster.slave_security_group }}</EmrManagedSlaveSecurityGroup>
-        <ServiceAccessSecurityGroup>{{ cluster.service_access_security_group }}</ServiceAccessSecurityGroup>
-      </Ec2InstanceAttributes>
-      <Id>{{ cluster.id }}</Id>
-      <KerberosAttributes>
-        {% if 'Realm' in cluster.kerberos_attributes%}
-        <Realm>{{ cluster.kerberos_attributes['Realm'] }}</Realm>
-        {% endif %}
-        {% if 'KdcAdminPassword' in cluster.kerberos_attributes%}
-        <KdcAdminPassword>{{ cluster.kerberos_attributes['KdcAdminPassword'] }}</KdcAdminPassword>
-        {% endif %}
-        {% if 'CrossRealmTrustPrincipalPassword' in cluster.kerberos_attributes%}
-        <CrossRealmTrustPrincipalPassword>{{ cluster.kerberos_attributes['CrossRealmTrustPrincipalPassword'] }}</CrossRealmTrustPrincipalPassword>
-        {% endif %}
-        {% if 'ADDomainJoinUser' in cluster.kerberos_attributes%}
-        <ADDomainJoinUser>{{ cluster.kerberos_attributes['ADDomainJoinUser'] }}</ADDomainJoinUser>
-        {% endif %}
-        {% if 'ADDomainJoinPassword' in cluster.kerberos_attributes%}
-        <ADDomainJoinPassword>{{ cluster.kerberos_attributes['ADDomainJoinPassword'] }}</ADDomainJoinPassword>
-        {% endif %}
-      </KerberosAttributes>
-      <LogUri>{{ cluster.log_uri }}</LogUri>
-      <MasterPublicDnsName>ec2-184-0-0-1.us-west-1.compute.amazonaws.com</MasterPublicDnsName>
-      <Name>{{ cluster.name }}</Name>
-      <NormalizedInstanceHours>{{ cluster.normalized_instance_hours }}</NormalizedInstanceHours>
-      {% if cluster.release_label is not none %}
-      <ReleaseLabel>{{ cluster.release_label }}</ReleaseLabel>
-      {% endif %}
-      {% if cluster.requested_ami_version is not none %}
-      <RequestedAmiVersion>{{ cluster.requested_ami_version }}</RequestedAmiVersion>
-      {% endif %}
-      {% if cluster.running_ami_version is not none %}
-      <RunningAmiVersion>{{ cluster.running_ami_version }}</RunningAmiVersion>
-      {% endif %}
-      {% if cluster.security_configuration is not none %}
-      <SecurityConfiguration>{{ cluster.security_configuration }}</SecurityConfiguration>
-      {% endif %}
-      <ServiceRole>{{ cluster.service_role }}</ServiceRole>
-      <AutoScalingRole>{{ cluster.auto_scaling_role }}</AutoScalingRole>
-      <Status>
-        <State>{{ cluster.state }}</State>
-        <StateChangeReason>
-          {% if cluster.last_state_change_reason is not none %}
-          <Message>{{ cluster.last_state_change_reason }}</Message>
-          {% endif %}
-          <Code>USER_REQUEST</Code>
-        </StateChangeReason>
-        <Timeline>
-          <CreationDateTime>{{ cluster.creation_datetime.isoformat() }}</CreationDateTime>
-          {% if cluster.end_datetime is not none %}
-          <EndDateTime>{{ cluster.end_datetime.isoformat() }}</EndDateTime>
-          {% endif %}
-          {% if cluster.ready_datetime is not none %}
-          <ReadyDateTime>{{ cluster.ready_datetime.isoformat() }}</ReadyDateTime>
-          {% endif %}
-        </Timeline>
-      </Status>
-      <Tags>
-        {% for tag_key, tag_value in cluster.tags.items() %}
-        <member>
-          <Key>{{ tag_key }}</Key>
-          <Value>{{ tag_value }}</Value>
-        </member>
-        {% endfor %}
-      </Tags>
-      <TerminationProtected>{{ cluster.termination_protected|lower }}</TerminationProtected>
-      <VisibleToAllUsers>{{ cluster.visible_to_all_users|lower }}</VisibleToAllUsers>
-      <StepConcurrencyLevel>{{ cluster.step_concurrency_level }}</StepConcurrencyLevel>
-      <ClusterArn>{{ cluster.arn }}</ClusterArn>
-    </Cluster>
-  </DescribeClusterResult>
-  <ResponseMetadata>
-    <RequestId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</RequestId>
-  </ResponseMetadata>
-</DescribeClusterResponse>"""
-
-DESCRIBE_JOB_FLOWS_TEMPLATE = """<DescribeJobFlowsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <DescribeJobFlowsResult>
-    <JobFlows>
-      {% for cluster in clusters %}
-      <member>
-        {% if cluster.running_ami_version is not none %}
-        <AmiVersion>{{ cluster.running_ami_version }}</AmiVersion>
-        {% endif %}
-        {% if cluster.bootstrap_actions %}
-        <BootstrapActions>
-          {% for bootstrap_action in cluster.bootstrap_actions %}
-          <member>
-            <BootstrapActionConfig>
-              <Name>{{ bootstrap_action.name }}</Name>
-              <ScriptBootstrapAction>
-                <Args>
-                  {% for arg in bootstrap_action.args %}
-                  <member>{{ arg | escape }}</member>
-                  {% endfor %}
-                </Args>
-                <Path>{{ bootstrap_action.script_path | escape }}</Path>
-              </ScriptBootstrapAction>
-            </BootstrapActionConfig>
-          </member>
-          {% endfor %}
-        </BootstrapActions>
-        {% endif %}
-        <ExecutionStatusDetail>
-          <CreationDateTime>{{ cluster.creation_datetime.isoformat() }}</CreationDateTime>
-          {% if cluster.end_datetime is not none %}
-          <EndDateTime>{{ cluster.end_datetime.isoformat() }}</EndDateTime>
-          {% endif %}
-          {% if cluster.last_state_change_reason is not none %}
-          <LastStateChangeReason>{{ cluster.last_state_change_reason }}</LastStateChangeReason>
-          {% endif %}
-          {% if cluster.ready_datetime is not none %}
-          <ReadyDateTime>{{ cluster.ready_datetime.isoformat() }}</ReadyDateTime>
-          {% endif %}
-          {% if cluster.start_datetime is not none %}
-          <StartDateTime>{{ cluster.start_datetime.isoformat() }}</StartDateTime>
-          {% endif %}
-          <State>{{ cluster.state }}</State>
-        </ExecutionStatusDetail>
-        <Instances>
-          {% if cluster.ec2_key_name is not none %}
-          <Ec2KeyName>{{ cluster.ec2_key_name }}</Ec2KeyName>
-          {% endif %}
-          {% if cluster.ec2_subnet_id is not none %}
-          <Ec2SubnetId>{{ cluster.ec2_subnet_id }}</Ec2SubnetId>
-          {% endif %}
-          <HadoopVersion>{{ cluster.hadoop_version }}</HadoopVersion>
-          <InstanceCount>{{ cluster.instance_count }}</InstanceCount>
-          <InstanceGroups>
-            {% for instance_group in cluster.instance_groups %}
-            <member>
-              {% if instance_group.bid_price is not none %}
-              <BidPrice>{{ instance_group.bid_price }}</BidPrice>
-              {% endif %}
-              <CreationDateTime>{{ instance_group.creation_datetime.isoformat() }}</CreationDateTime>
-              {% if instance_group.end_datetime is not none %}
-              <EndDateTime>{{ instance_group.end_datetime.isoformat() }}</EndDateTime>
-              {% endif %}
-
-              <InstanceGroupId>{{ instance_group.id }}</InstanceGroupId>
-              <InstanceRequestCount>{{ instance_group.num_instances }}</InstanceRequestCount>
-              <InstanceRole>{{ instance_group.role }}</InstanceRole>
-              <InstanceRunningCount>{{ instance_group.num_instances }}</InstanceRunningCount>
-              <InstanceType>{{ instance_group.instance_type }}</InstanceType>
-              <LastStateChangeReason/>
-              <Market>{{ instance_group.market }}</Market>
-              <Name>{{ instance_group.name }}</Name>
-              {% if instance_group.ready_datetime is not none %}
-              <ReadyDateTime>{{ instance_group.ready_datetime.isoformat() }}</ReadyDateTime>
-              {% endif %}
-              {% if instance_group.start_datetime is not none %}
-              <StartDateTime>{{ instance_group.start_datetime.isoformat() }}</StartDateTime>
-              {% endif %}
-              <State>{{ instance_group.state }}</State>
-            </member>
-            {% endfor %}
-          </InstanceGroups>
-          <KeepJobFlowAliveWhenNoSteps>{{ cluster.keep_job_flow_alive_when_no_steps|lower }}</KeepJobFlowAliveWhenNoSteps>
-          <MasterInstanceId>{{ cluster.master_instance_id }}</MasterInstanceId>
-          <MasterInstanceType>{{ cluster.master_instance_type }}</MasterInstanceType>
-          <MasterPublicDnsName>ec2-184-0-0-1.{{ cluster.region }}.compute.amazonaws.com</MasterPublicDnsName>
-          <NormalizedInstanceHours>{{ cluster.normalized_instance_hours }}</NormalizedInstanceHours>
-          <Placement>
-            <AvailabilityZone>{{ cluster.availability_zone }}</AvailabilityZone>
-          </Placement>
-          <SlaveInstanceType>{{ cluster.slave_instance_type }}</SlaveInstanceType>
-          <TerminationProtected>{{ cluster.termination_protected|lower }}</TerminationProtected>
-        </Instances>
-        <JobFlowId>{{ cluster.id }}</JobFlowId>
-        <JobFlowRole>{{ cluster.role }}</JobFlowRole>
-        <LogUri>{{ cluster.log_uri }}</LogUri>
-        <Name>{{ cluster.name }}</Name>
-        <ServiceRole>{{ cluster.service_role }}</ServiceRole>
-        <Steps>
-          {% for step in cluster.steps %}
-          <member>
-            <ExecutionStatusDetail>
-              <CreationDateTime>{{ step.creation_datetime.isoformat() }}</CreationDateTime>
-              {% if step.end_datetime is not none %}
-              <EndDateTime>{{ step.end_datetime.isoformat() }}</EndDateTime>
-              {% endif %}
-              {% if step.last_state_change_reason is not none %}
-              <LastStateChangeReason>{{ step.last_state_change_reason }}</LastStateChangeReason>
-              {% endif %}
-              {% if step.ready_datetime is not none %}
-              <ReadyDateTime>{{ step.ready_datetime.isoformat() }}</ReadyDateTime>
-              {% endif %}
-              {% if step.start_datetime is not none %}
-              <StartDateTime>{{ step.start_datetime.isoformat() }}</StartDateTime>
-              {% endif %}
-              <State>{{ step.state }}</State>
-            </ExecutionStatusDetail>
-            <StepConfig>
-              <ActionOnFailure>{{ step.action_on_failure }}</ActionOnFailure>
-              <HadoopJarStep>
-                <Jar>{{ step.jar }}</Jar>
-                <MainClass>{{ step.main_class }}</MainClass>
-                <Args>
-                  {% for arg in step.args %}
-                  <member>{{ arg | escape }}</member>
-                  {% endfor %}
-                </Args>
-                <Properties>
-                {% for key, val in step.properties.items() %}
-                  <member>
-                    <Key>{{ key }}</Key>
-                    <Value>{{ val | escape }}</Value>
-                  </member>
-                {% endfor %}
-                </Properties>
-              </HadoopJarStep>
-              <Name>{{ step.name | escape }}</Name>
-            </StepConfig>
-          </member>
-          {% endfor %}
-        </Steps>
-        <SupportedProducts/>
-        <VisibleToAllUsers>{{ cluster.visible_to_all_users|lower }}</VisibleToAllUsers>
-      </member>
-      {% endfor %}
-    </JobFlows>
-  </DescribeJobFlowsResult>
-  <ResponseMetadata>
-    <RequestId>9cea3229-ed85-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</DescribeJobFlowsResponse>"""
-
-DESCRIBE_STEP_TEMPLATE = """<DescribeStepResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <DescribeStepResult>
-    <Step>
-      <ActionOnFailure>{{ step.action_on_failure }}</ActionOnFailure>
-      <Config>
-        <Args>
-          {% for arg in step.args %}
-          <member>{{ arg | escape }}</member>
-          {% endfor %}
-        </Args>
-        <Jar>{{ step.jar }}</Jar>
-        <MainClass/>
-        <Properties>
-          {% for key, val in step.properties.items() %}
-          <entry>
-            <key>{{ key }}</key>
-            <value>{{ val | escape }}</value>
-          </entry>
-          {% endfor %}
-        </Properties>
-      </Config>
-      <Id>{{ step.id }}</Id>
-      <Name>{{ step.name | escape }}</Name>
-      <Status>
-        <FailureDetails>
-          <Reason/>
-          <Message/>
-          <LogFile/>
-        </FailureDetails>
-        <State>{{ step.state }}</State>
-        <StateChangeReason>{{ step.state_change_reason }}</StateChangeReason>
-        <Timeline>
-          <CreationDateTime>{{ step.creation_datetime.isoformat() }}</CreationDateTime>
-          {% if step.end_datetime is not none %}
-          <EndDateTime>{{ step.end_datetime.isoformat() }}</EndDateTime>
-          {% endif %}
-          {% if step.ready_datetime is not none %}
-          <StartDateTime>{{ step.start_datetime.isoformat() }}</StartDateTime>
-          {% endif %}
-        </Timeline>
-      </Status>
-    </Step>
-  </DescribeStepResult>
-  <ResponseMetadata>
-    <RequestId>df6f4f4a-ed85-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</DescribeStepResponse>"""
-
-LIST_BOOTSTRAP_ACTIONS_TEMPLATE = """<ListBootstrapActionsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ListBootstrapActionsResult>
-    <BootstrapActions>
-      {% for bootstrap_action in bootstrap_actions %}
-      <member>
-        <Args>
-          {% for arg in bootstrap_action.args %}
-          <member>{{ arg | escape }}</member>
-          {% endfor %}
-        </Args>
-        <Name>{{ bootstrap_action.name }}</Name>
-        <ScriptPath>{{ bootstrap_action.script_path }}</ScriptPath>
-      </member>
-      {% endfor %}
-    </BootstrapActions>
-    {% if marker is not none %}
-    <Marker>{{ marker }}</Marker>
-    {% endif %}
-  </ListBootstrapActionsResult>
-  <ResponseMetadata>
-    <RequestId>df6f4f4a-ed85-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</ListBootstrapActionsResponse>"""
-
-LIST_CLUSTERS_TEMPLATE = """<ListClustersResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ListClustersResult>
-    <Clusters>
-      {% for cluster in clusters %}
-      <member>
-        <Id>{{ cluster.id }}</Id>
-        <Name>{{ cluster.name }}</Name>
-        <NormalizedInstanceHours>{{ cluster.normalized_instance_hours }}</NormalizedInstanceHours>
-        <Status>
-          <State>{{ cluster.state }}</State>
-          <StateChangeReason>
-            <Code>USER_REQUEST</Code>
-            {% if cluster.last_state_change_reason is not none %}
-            <Message>{{ cluster.last_state_change_reason }}</Message>
-            {% endif %}
-          </StateChangeReason>
-          <Timeline>
-            <CreationDateTime>{{ cluster.creation_datetime.isoformat() }}</CreationDateTime>
-            {% if cluster.end_datetime is not none %}
-            <EndDateTime>{{ cluster.end_datetime.isoformat() }}</EndDateTime>
-            {% endif %}
-            {% if cluster.ready_datetime is not none %}
-            <ReadyDateTime>{{ cluster.ready_datetime.isoformat() }}</ReadyDateTime>
-            {% endif %}
-          </Timeline>
-        </Status>
-        <ClusterArn>{{ cluster.arn }}</ClusterArn>
-      </member>
-      {% endfor %}
-    </Clusters>
-    {% if marker is not none %}
-    <Marker>{{ marker }}</Marker>
-    {% endif %}
-  </ListClustersResult>
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8418</RequestId>
-  </ResponseMetadata>
-</ListClustersResponse>"""
-
-LIST_INSTANCE_GROUPS_TEMPLATE = """<ListInstanceGroupsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ListInstanceGroupsResult>
-    <InstanceGroups>
-      {% for instance_group in instance_groups %}
-      <member>
-        {% if instance_group.bid_price is not none %}
-        <BidPrice>{{ instance_group.bid_price }}</BidPrice>
-        {% endif %}
-        <Configurations/>
-        {% if instance_group.ebs_configuration is not none %}
-        <EbsBlockDevices>
-            {% for ebs_block_device in instance_group.ebs_configuration.ebs_block_device_configs %}
-              {% for i in range(ebs_block_device.volumes_per_instance) %}
-          <member>
-            <VolumeSpecification>
-              <VolumeType>{{ebs_block_device.volume_specification.volume_type}}</VolumeType>
-              <Iops>{{ebs_block_device.volume_specification.iops}}</Iops>
-              <SizeInGB>{{ebs_block_device.volume_specification.size_in_gb}}</SizeInGB>
-            </VolumeSpecification>
-            <Device>/dev/sd{{i}}</Device>
-          </member>
-              {% endfor %}
-            {% endfor %}
-        </EbsBlockDevices>
-        {% endif %}
-        {% if instance_group.auto_scaling_policy is not none %}
-        <AutoScalingPolicy>
-            {% if instance_group.auto_scaling_policy.constraints is not none %}
-            <Constraints>
-                {% if instance_group.auto_scaling_policy.constraints.min_capacity is not none %}
-                <MinCapacity>{{instance_group.auto_scaling_policy.constraints.min_capacity}}</MinCapacity>
-                {% endif %}
-                {% if instance_group.auto_scaling_policy.constraints.max_capacity is not none %}
-                <MaxCapacity>{{instance_group.auto_scaling_policy.constraints.max_capacity}}</MaxCapacity>
-                {% endif %}
-            </Constraints>
-            {% endif %}
-            {% if instance_group.auto_scaling_policy.rules is not none %}
-            <Rules>
-                {% for rule in instance_group.auto_scaling_policy.rules %}
-                <member>
-                    {% if 'name' in rule %}
-                    <Name>{{rule['name']}}</Name>
-                    {% endif %}
-                    {% if 'description' in rule %}
-                    <Description>{{rule['description']}}</Description>
-                    {% endif %}
-                    {% if 'action' in rule %}
-                    <Action>
-                        {% if 'market' in rule['action'] %}
-                        <Market>{{rule['action']['market']}}</Market>
-                        {% endif %}
-                        {% if 'simple_scaling_policy_configuration' in rule['action'] %}
-                        <SimpleScalingPolicyConfiguration>
-                            {% if 'adjustment_type' in rule['action']['simple_scaling_policy_configuration'] %}
-                            <AdjustmentType>{{rule['action']['simple_scaling_policy_configuration']['adjustment_type']}}</AdjustmentType>
-                            {% endif %}
-                            {% if 'scaling_adjustment' in rule['action']['simple_scaling_policy_configuration'] %}
-                            <ScalingAdjustment>{{rule['action']['simple_scaling_policy_configuration']['scaling_adjustment']}}</ScalingAdjustment>
-                            {% endif %}
-                            {% if 'cool_down' in rule['action']['simple_scaling_policy_configuration'] %}
-                            <CoolDown>{{rule['action']['simple_scaling_policy_configuration']['cool_down']}}</CoolDown>
-                            {% endif %}
-                        </SimpleScalingPolicyConfiguration>
-                        {% endif %}
-                    </Action>
-                    {% endif %}
-                    {% if 'trigger' in rule %}
-                    <Trigger>
-                        {% if 'cloud_watch_alarm_definition' in rule['trigger'] %}
-                        <CloudWatchAlarmDefinition>
-                            {% if 'comparison_operator' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                            <ComparisonOperator>{{rule['trigger']['cloud_watch_alarm_definition']['comparison_operator']}}</ComparisonOperator>
-                            {% endif %}
-                            {% if 'evaluation_periods' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                            <EvaluationPeriods>{{rule['trigger']['cloud_watch_alarm_definition']['evaluation_periods']}}</EvaluationPeriods>
-                            {% endif %}
-                            {% if 'metric_name' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                            <MetricName>{{rule['trigger']['cloud_watch_alarm_definition']['metric_name']}}</MetricName>
-                            {% endif %}
-                            {% if 'namespace' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                            <Namespace>{{rule['trigger']['cloud_watch_alarm_definition']['namespace']}}</Namespace>
-                            {% endif %}
-                            {% if 'period' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                            <Period>{{rule['trigger']['cloud_watch_alarm_definition']['period']}}</Period>
-                            {% endif %}
-                            {% if 'statistic' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                            <Statistic>{{rule['trigger']['cloud_watch_alarm_definition']['statistic']}}</Statistic>
-                            {% endif %}
-                            {% if 'threshold' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                            <Threshold>{{rule['trigger']['cloud_watch_alarm_definition']['threshold']}}</Threshold>
-                            {% endif %}
-                            {% if 'unit' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                            <Unit>{{rule['trigger']['cloud_watch_alarm_definition']['unit']}}</Unit>
-                            {% endif %}
-                            {% if 'dimensions' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                            <Dimensions>
-                                {% for dimension in rule['trigger']['cloud_watch_alarm_definition']['dimensions'] %}
-                                <member>
-                                    {% if 'key' in dimension %}
-                                    <Key>{{dimension['key']}}</Key>
-                                    {% endif %}
-                                    {% if 'value' in dimension %}
-                                    <Value>{{dimension['value']}}</Value>
-                                    {% endif %}
-                                </member>
-                                {% endfor %}
-                            </Dimensions>
-                            {% endif %}
-                        </CloudWatchAlarmDefinition>
-                        {% endif %}
-                    </Trigger>
-                    {% endif %}
-                </member>
-                {% endfor %}
-            </Rules>
-            {% endif %}
-            {% if instance_group.auto_scaling_policy.status is not none %}
-            <Status>
-                {% if 'state' in instance_group.auto_scaling_policy.status %}
-                <State>{{instance_group.auto_scaling_policy.status['state']}}</State>
-                {% endif %}
-            </Status>
-            {% endif %}
-        </AutoScalingPolicy>
-        {% endif %}
-        {% if instance_group.ebs_optimized is not none %}
-        <EbsOptimized>{{ instance_group.ebs_optimized }}</EbsOptimized>
-        {% endif %}
-        <Id>{{ instance_group.id }}</Id>
-        <InstanceGroupType>{{ instance_group.role }}</InstanceGroupType>
-        <InstanceType>{{ instance_group.instance_type }}</InstanceType>
-        <Market>{{ instance_group.market }}</Market>
-        <Name>{{ instance_group.name }}</Name>
-        <RequestedInstanceCount>{{ instance_group.num_instances }}</RequestedInstanceCount>
-        <RunningInstanceCount>{{ instance_group.num_instances }}</RunningInstanceCount>
-        <Status>
-          <State>{{ instance_group.state }}</State>
-          <StateChangeReason>
-            {% if instance_group.state_change_reason is not none %}
-            <Message>{{ instance_group.state_change_reason }}</Message>
-            {% endif %}
-            <Code>USER_REQUEST</Code>
-          </StateChangeReason>
-          <Timeline>
-            <CreationDateTime>{{ instance_group.creation_datetime.isoformat() }}</CreationDateTime>
-            {% if instance_group.end_datetime is not none %}
-            <EndDateTime>{{ instance_group.end_datetime.isoformat() }}</EndDateTime>
-            {% endif %}
-            {% if instance_group.ready_datetime is not none %}
-            <ReadyDateTime>{{ instance_group.ready_datetime.isoformat() }}</ReadyDateTime>
-            {% endif %}
-          </Timeline>
-        </Status>
-      </member>
-      {% endfor %}
-    </InstanceGroups>
-    {% if marker is not none %}
-    <Marker>{{ marker }}</Marker>
-    {% endif %}
-  </ListInstanceGroupsResult>
-  <ResponseMetadata>
-    <RequestId>8296d8b8-ed85-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</ListInstanceGroupsResponse>"""
-
-LIST_INSTANCES_TEMPLATE = """<ListInstancesResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ListInstancesResult>
-    <Instances>
-     {% for instance in instances %}
-      <member>
-        <Id>{{ instance.id }}</Id>
-        <Ec2InstanceId>{{ instance.ec2_instance_id }}</Ec2InstanceId>
-        <PublicDnsName>{{ instance.details.public_dns }}</PublicDnsName>
-        <PublicIpAddress>{{ instance.details.public_ip }}</PublicIpAddress>
-        <PrivateDnsName>{{ instance.details.private_dns }}</PrivateDnsName>
-        <PrivateIpAddress>{{ instance.details.private_ip }}</PrivateIpAddress>
-        <InstanceGroupId>{{ instance.instance_group.id }}</InstanceGroupId>
-        <InstanceFleetId>{{ instance.instance_fleet_id }}</InstanceFleetId>
-        <Market>{{ instance.instance_group.market }}</Market>
-        <InstanceType>{{ instance.details.instance_type }}</InstanceType>
-         <EbsVolumes>
-              {% for volume in instance.details.block_device_mapping %}
-          <member>
-              <Device>{{ volume }}</Device>
-              <VolumeId>{{ instance.details.block_device_mapping[volume].volume_id }}</VolumeId>
-          </member>
-              {% endfor %}
-        </EbsVolumes>
-       <Status>
-          <State>{{ instance.instance_group.state }}</State>
-          <StateChangeReason>
-            {% if instance.state_change_reason is not none %}
-            <Message>{{ instance.state_change_reason }}</Message>
-            {% endif %}
-          </StateChangeReason>
-          <Timeline>
-            <CreationDateTime>{{ instance.instance_group.creation_datetime.isoformat() }}</CreationDateTime>
-            {% if instance.instance_group.end_datetime is not none %}
-            <EndDateTime>{{ instance.instance_group.end_datetime.isoformat() }}</EndDateTime>
-            {% endif %}
-            {% if instance.instance_group.ready_datetime is not none %}
-            <ReadyDateTime>{{ instance.instance_group.ready_datetime.isoformat() }}</ReadyDateTime>
-            {% endif %}
-          </Timeline>
-        </Status>
-      </member>
-    {% endfor %}
-    </Instances>
- </ListInstancesResult>
- <ResponseMetadata>
-    <RequestId>4248c46c-71c0-4772-b155-0e992dc30027</RequestId>
-  </ResponseMetadata>
-</ListInstancesResponse>"""
-
-LIST_STEPS_TEMPLATE = """<ListStepsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ListStepsResult>
-    <Steps>
-      {% for step in steps %}
-      <member>
-        <ActionOnFailure>{{ step.action_on_failure }}</ActionOnFailure>
-        <Config>
-          <Args>
-            {% for arg in step.args %}
-            <member>{{ arg | escape }}</member>
-            {% endfor %}
-          </Args>
-          <Jar>{{ step.jar | escape }}</Jar>
-          <MainClass/>
-          <Properties>
-            {% for key, val in step.properties.items() %}
-            <entry>
-              <key>{{ key }}</key>
-              <value>{{ val | escape }}</value>
-            </entry>
-            {% endfor %}
-          </Properties>
-        </Config>
-        <Id>{{ step.id }}</Id>
-        <Name>{{ step.name | escape }}</Name>
-        <Status>
-<!-- does not exist for botocore 1.4.28
-          <FailureDetails>
-            <Reason/>
-            <Message/>
-            <LogFile/>
-          </FailureDetails>
--->
-          <State>{{ step.state }}</State>
-          <StateChangeReason>{{ step.state_change_reason }}</StateChangeReason>
-          <Timeline>
-            <CreationDateTime>{{ step.creation_datetime.isoformat() }}</CreationDateTime>
-            {% if step.end_datetime is not none %}
-            <EndDateTime>{{ step.end_datetime.isoformat() }}</EndDateTime>
-            {% endif %}
-            {% if step.start_datetime is not none %}
-            <StartDateTime>{{ step.start_datetime.isoformat() }}</StartDateTime>
-            {% endif %}
-          </Timeline>
-        </Status>
-      </member>
-      {% endfor %}
-    </Steps>
-    {% if marker is not none %}
-    <Marker>{{ marker }}</Marker>
-    {% endif %}
-  </ListStepsResult>
-  <ResponseMetadata>
-    <RequestId>df6f4f4a-ed85-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</ListStepsResponse>"""
-
-MODIFY_CLUSTER_TEMPLATE = """<ModifyClusterResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ModifyClusterResult>
-    <StepConcurrencyLevel>{{ cluster.step_concurrency_level }}</StepConcurrencyLevel>
-  </ModifyClusterResult>
-  <ResponseMetadata>
-    <RequestId>0751c837-e78d-4aef-95c9-9c4d29a092ff</RequestId>
-  </ResponseMetadata>
-</ModifyClusterResponse>
-"""
-
-MODIFY_INSTANCE_GROUPS_TEMPLATE = """<ModifyInstanceGroupsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</ModifyInstanceGroupsResponse>"""
-
-REMOVE_TAGS_TEMPLATE = """<RemoveTagsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</RemoveTagsResponse>"""
-
-RUN_JOB_FLOW_TEMPLATE = """<RunJobFlowResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <RunJobFlowResult>
-    <JobFlowId>{{ cluster.id }}</JobFlowId>
-    <ClusterArn>{{ cluster.arn }}</ClusterArn>
-  </RunJobFlowResult>
-  <ResponseMetadata>
-    <RequestId>8296d8b8-ed85-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</RunJobFlowResponse>"""
-
-SET_TERMINATION_PROTECTION_TEMPLATE = """<SetTerminationProtection xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</SetTerminationProtection>"""
-
-SET_VISIBLE_TO_ALL_USERS_TEMPLATE = """<SetVisibleToAllUsersResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</SetVisibleToAllUsersResponse>"""
-
-TERMINATE_JOB_FLOWS_TEMPLATE = """<TerminateJobFlowsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</TerminateJobFlowsResponse>"""
-
-PUT_AUTO_SCALING_POLICY = """<PutAutoScalingPolicyResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <PutAutoScalingPolicyResult>
-    <ClusterId>{{cluster_id}}</ClusterId>
-    <InstanceGroupId>{{instance_group.id}}</InstanceGroupId>
-    {% if instance_group.auto_scaling_policy is not none %}
-    <AutoScalingPolicy>
-        {% if instance_group.auto_scaling_policy.constraints is not none %}
-        <Constraints>
-            {% if instance_group.auto_scaling_policy.constraints.min_capacity is not none %}
-            <MinCapacity>{{instance_group.auto_scaling_policy.constraints.min_capacity}}</MinCapacity>
-            {% endif %}
-            {% if instance_group.auto_scaling_policy.constraints.max_capacity is not none %}
-            <MaxCapacity>{{instance_group.auto_scaling_policy.constraints.max_capacity}}</MaxCapacity>
-            {% endif %}
-        </Constraints>
-        {% endif %}
-        {% if instance_group.auto_scaling_policy.rules is not none %}
-        <Rules>
-            {% for rule in instance_group.auto_scaling_policy.rules %}
-            <member>
-                {% if 'name' in rule %}
-                <Name>{{rule['name']}}</Name>
-                {% endif %}
-                {% if 'description' in rule %}
-                <Description>{{rule['description']}}</Description>
-                {% endif %}
-                {% if 'action' in rule %}
-                <Action>
-                    {% if 'market' in rule['action'] %}
-                    <Market>{{rule['action']['market']}}</Market>
-                    {% endif %}
-                    {% if 'simple_scaling_policy_configuration' in rule['action'] %}
-                    <SimpleScalingPolicyConfiguration>
-                        {% if 'adjustment_type' in rule['action']['simple_scaling_policy_configuration'] %}
-                        <AdjustmentType>{{rule['action']['simple_scaling_policy_configuration']['adjustment_type']}}</AdjustmentType>
-                        {% endif %}
-                        {% if 'scaling_adjustment' in rule['action']['simple_scaling_policy_configuration'] %}
-                        <ScalingAdjustment>{{rule['action']['simple_scaling_policy_configuration']['scaling_adjustment']}}</ScalingAdjustment>
-                        {% endif %}
-                        {% if 'cool_down' in rule['action']['simple_scaling_policy_configuration'] %}
-                        <CoolDown>{{rule['action']['simple_scaling_policy_configuration']['cool_down']}}</CoolDown>
-                        {% endif %}
-                    </SimpleScalingPolicyConfiguration>
-                    {% endif %}
-                </Action>
-                {% endif %}
-                {% if 'trigger' in rule %}
-                <Trigger>
-                    {% if 'cloud_watch_alarm_definition' in rule['trigger'] %}
-                    <CloudWatchAlarmDefinition>
-                        {% if 'comparison_operator' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                        <ComparisonOperator>{{rule['trigger']['cloud_watch_alarm_definition']['comparison_operator']}}</ComparisonOperator>
-                        {% endif %}
-                        {% if 'evaluation_periods' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                        <EvaluationPeriods>{{rule['trigger']['cloud_watch_alarm_definition']['evaluation_periods']}}</EvaluationPeriods>
-                        {% endif %}
-                        {% if 'metric_name' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                        <MetricName>{{rule['trigger']['cloud_watch_alarm_definition']['metric_name']}}</MetricName>
-                        {% endif %}
-                        {% if 'namespace' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                        <Namespace>{{rule['trigger']['cloud_watch_alarm_definition']['namespace']}}</Namespace>
-                        {% endif %}
-                        {% if 'period' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                        <Period>{{rule['trigger']['cloud_watch_alarm_definition']['period']}}</Period>
-                        {% endif %}
-                        {% if 'statistic' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                        <Statistic>{{rule['trigger']['cloud_watch_alarm_definition']['statistic']}}</Statistic>
-                        {% endif %}
-                        {% if 'threshold' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                        <Threshold>{{rule['trigger']['cloud_watch_alarm_definition']['threshold']}}</Threshold>
-                        {% endif %}
-                        {% if 'unit' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                        <Unit>{{rule['trigger']['cloud_watch_alarm_definition']['unit']}}</Unit>
-                        {% endif %}
-                        {% if 'dimensions' in rule['trigger']['cloud_watch_alarm_definition'] %}
-                        <Dimensions>
-                            {% for dimension in rule['trigger']['cloud_watch_alarm_definition']['dimensions'] %}
-                            <member>
-                                {% if 'key' in dimension %}
-                                <Key>{{dimension['key']}}</Key>
-                                {% endif %}
-                                {% if 'value' in dimension %}
-                                <Value>{{dimension['value']}}</Value>
-                                {% endif %}
-                            </member>
-                            {% endfor %}
-                        </Dimensions>
-                        {% endif %}
-                    </CloudWatchAlarmDefinition>
-                    {% endif %}
-                </Trigger>
-                {% endif %}
-            </member>
-            {% endfor %}
-        </Rules>
-        {% endif %}
-        {% if instance_group.auto_scaling_policy.status is not none %}
-        <Status>
-            {% if 'state' in instance_group.auto_scaling_policy.status %}
-            <State>{{instance_group.auto_scaling_policy.status['state']}}</State>
-            {% endif %}
-        </Status>
-        {% endif %}
-    </AutoScalingPolicy>
-    {% endif %}
-    <ClusterArn>{{ cluster.arn }}</ClusterArn>
-  </PutAutoScalingPolicyResult>
-  <ResponseMetadata>
-    <RequestId>d47379d9-b505-49af-9335-a68950d82535</RequestId>
-  </ResponseMetadata>
-</PutAutoScalingPolicyResponse>"""
-
-REMOVE_AUTO_SCALING_POLICY = """<RemoveAutoScalingPolicyResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ResponseMetadata>
-    <RequestId>c04a1042-5340-4c0a-a7b5-7779725ce4f7</RequestId>
-  </ResponseMetadata>
-</RemoveAutoScalingPolicyResponse>"""
-
-CREATE_SECURITY_CONFIGURATION_TEMPLATE = """<CreateSecurityConfigurationResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <CreateSecurityConfigurationResult>
-    <Name>{{name}}</Name>
-    <CreationDateTime>{{creation_date_time}}</CreationDateTime>
-  </CreateSecurityConfigurationResult>
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</CreateSecurityConfigurationResponse>"""
-
-DESCRIBE_SECURITY_CONFIGURATION_TEMPLATE = """<DescribeSecurityConfigurationResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <DescribeSecurityConfigurationResult>
-    <Name>{{security_configuration['name']}}</Name>
-    <SecurityConfiguration>{{security_configuration['security_configuration']}}</SecurityConfiguration>
-    <CreationDateTime>{{security_configuration['creation_date_time']}}</CreationDateTime>
-  </DescribeSecurityConfigurationResult>
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</DescribeSecurityConfigurationResponse>"""
-
-DELETE_SECURITY_CONFIGURATION_TEMPLATE = """<DeleteSecurityConfigurationResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</DeleteSecurityConfigurationResponse>"""
-
-PUT_BLOCK_PUBLIC_ACCESS_CONFIGURATION_TEMPLATE = """<PutBlockPublicAccessConfigurationResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-  <ResponseMetadata>
-    <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-  </ResponseMetadata>
-</PutBlockPublicAccessConfigurationResponse>"""
-
-GET_BLOCK_PUBLIC_ACCESS_CONFIGURATION_TEMPLATE = """
-  <GetBlockPublicAccessConfigurationResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-    <GetBlockPublicAccessConfigurationResult>
-      <BlockPublicAccessConfiguration>
-        <BlockPublicSecurityGroupRules>
-          {{block_public_security_group_rules}}
-        </BlockPublicSecurityGroupRules>
-        <PermittedPublicSecurityGroupRuleRanges>
-          {% for rule_range in permitted_public_security_group_rule_ranges %}
-            <member>
-              <MinRange>{{rule_range['min_range']}}</MinRange>
-              <MaxRange>{{rule_range['max_range']}}</MaxRange>      
-            </member>
-          {% endfor %}
-        </PermittedPublicSecurityGroupRuleRanges>
-      </BlockPublicAccessConfiguration>
-      <BlockPublicAccessConfigurationMetadata>
-        <CreationDateTime>{{creation_date_time}}</CreationDateTime>
-        <CreatedByArn>{{created_by_arn}}</CreatedByArn>
-      </BlockPublicAccessConfigurationMetadata>
-    </GetBlockPublicAccessConfigurationResult>
-    <ResponseMetadata>
-      <RequestId>2690d7eb-ed86-11dd-9877-6fad448a8419</RequestId>
-    </ResponseMetadata>
-  </GetBlockPublicAccessConfigurationResponse>
-"""
+        return EmptyResult()
diff --git a/moto/iam/responses.py b/moto/iam/responses.py
index c1a96c2bb..f2f37369e 100644
--- a/moto/iam/responses.py
+++ b/moto/iam/responses.py
@@ -1,7 +1,7 @@
-from copy import copy
-from urllib.parse import quote
+from __future__ import annotations
 
 from moto.core.responses import ActionResult, BaseResponse
+from moto.core.serialize import never_return, return_if_not_empty, url_encode
 
 from .exceptions import IAMNotFoundException
 from .models import IAMBackend, User, iam_backends
@@ -9,6 +9,34 @@ from .utils import is_role_resource
 
 
 class IamResponse(BaseResponse):
+    # IAM is inconsistent in which attributes it returns for different operations,
+    # and some attributes require specialized processing, so we need to explicitly
+    # transform some individual response elements using specialized functions.
+    #
+    # IAM resource-listing operations, for example, return a subset of the available
+    # attributes for the resource.
+    # See: https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html
+    RESPONSE_KEY_PATH_TO_TRANSFORMER = {
+        "CreatePolicyResponse.Policy.Description": never_return,
+        "CreatePolicyResponse.Policy.Tags": return_if_not_empty,
+        "CreateRoleResponse.Role.AssumeRolePolicyDocument": url_encode,
+        "CreateRoleResponse.Role.PermissionsBoundary": return_if_not_empty,
+        "CreateRoleResponse.Role.Tags": return_if_not_empty,
+        "GetGroupPolicyResponse.PolicyDocument": url_encode,
+        "GetPolicyResponse.Policy.Description": return_if_not_empty,
+        "GetRolePolicyResponse.PolicyDocument": url_encode,
+        "GetRoleResponse.Role.AssumeRolePolicyDocument": url_encode,
+        "GetRoleResponse.Role.PermissionsBoundary": return_if_not_empty,
+        "GetRoleResponse.Role.Tags": return_if_not_empty,
+        "GetUserPolicyResponse.PolicyDocument": url_encode,
+        "ListPoliciesResponse.Policies.Policy.Description": never_return,
+        "ListPoliciesResponse.Policies.Policy.Tags": never_return,
+        "ListRolesResponse.Roles.Role.PermissionsBoundary": never_return,
+        "ListRolesResponse.Roles.Role.RoleLastUsed": never_return,
+        "ListRolesResponse.Roles.Role.Tags": never_return,
+        "ListUsersResponse.Users.User.Tags": never_return,
+    }
+
     def __init__(self) -> None:
         super().__init__(service_name="iam")
 
@@ -241,20 +269,12 @@ class IamResponse(BaseResponse):
             tags,
             max_session_duration,
         )
-        role = copy(role)
-        setattr(
-            role, "AssumeRolePolicyDocument", quote(role.assume_role_policy_document)
-        )
         result = {"Role": role}
         return ActionResult(result)
 
     def get_role(self) -> ActionResult:
         role_name = self._get_param("RoleName")
         role = self.backend.get_role(role_name)
-        role = copy(role)
-        setattr(
-            role, "AssumeRolePolicyDocument", quote(role.assume_role_policy_document)
-        )
         result = {"Role": role}
         return ActionResult(result)
 
@@ -291,7 +311,7 @@ class IamResponse(BaseResponse):
         result = {
             "RoleName": role_name,
             "PolicyName": policy_name,
-            "PolicyDocument": quote(policy_document),
+            "PolicyDocument": policy_document,
         }
         return ActionResult(result)
 
@@ -526,7 +546,7 @@ class IamResponse(BaseResponse):
         user_name = self._get_param("UserName")
 
         groups = self.backend.get_groups_for_user(user_name)
-        result = {"Groups": groups}
+        result = {"Groups": groups, "IsTruncated": False}
         return ActionResult(result)
 
     def put_group_policy(self) -> ActionResult:
@@ -548,7 +568,7 @@ class IamResponse(BaseResponse):
         policy_result = self.backend.get_group_policy(group_name, policy_name)
         result = {
             "PolicyName": policy_result["policy_name"],
-            "PolicyDocument": quote(policy_result["policy_document"]),
+            "PolicyDocument": policy_result["policy_document"],
             "GroupName": group_name,
         }
         return ActionResult(result)
@@ -663,7 +683,7 @@ class IamResponse(BaseResponse):
         policy = self.backend.get_user_policy(user_name, policy_name)
         result = {
             "PolicyName": policy["policy_name"],
-            "PolicyDocument": quote(policy["policy_document"]),
+            "PolicyDocument": policy["policy_document"],
             "UserName": policy["user_name"],
         }
         return ActionResult(result)
diff --git a/moto/networkfirewall/models.py b/moto/networkfirewall/models.py
index 7ae859aa6..9c31e8f73 100644
--- a/moto/networkfirewall/models.py
+++ b/moto/networkfirewall/models.py
@@ -62,7 +62,7 @@ class NetworkFirewallModel(BaseModel):
             "Status": "READY",
             "ConfigurationSyncStateSummary": "IN_SYNC",
         }
-        self.logging_configs: List[Dict[str, str]] = []
+        self.logging_configs: Dict[str, List[Dict[str, Any]]] = {}
 
     def to_dict(self) -> Dict[str, Any]:
         return {
@@ -146,7 +146,7 @@ class NetworkFirewallBackend(BaseBackend):
         self,
         firewall_arn: str,
         firewall_name: str,
-        logging_configuration: List[Dict[str, str]],
+        logging_configuration: Dict[str, List[Dict[str, Any]]],
     ) -> NetworkFirewallModel:
         firewall: NetworkFirewallModel = self._get_firewall(firewall_arn, firewall_name)
         firewall.logging_configs = logging_configuration
diff --git a/moto/ram/models.py b/moto/ram/models.py
index c8c15e642..dbf739ef1 100644
--- a/moto/ram/models.py
+++ b/moto/ram/models.py
@@ -1,12 +1,16 @@
 import re
 import string
+from datetime import datetime, timezone
 from typing import Any, Dict, List, Optional
 
 from moto.core.base_backend import BackendDict, BaseBackend
 from moto.core.common_models import BaseModel
 from moto.core.utils import unix_time, utcnow
 from moto.moto_api._internal import mock_random as random
-from moto.organizations.models import OrganizationsBackend, organizations_backends
+from moto.organizations.models import (
+    OrganizationsBackend,
+    organizations_backends,
+)
 from moto.ram.exceptions import (
     InvalidParameterException,
     MalformedArnException,
@@ -50,7 +54,7 @@ class ResourceShare(BaseModel):
         self.partition = get_partition(region)
 
         self.allow_external_principals = kwargs.get("allowExternalPrincipals", True)
-        self.arn = f"arn:{get_partition(self.region)}:ram:{self.region}:{account_id}:resource-share/{random.uuid4()}"
+        self.arn = f"arn:{self.partition}:ram:{self.region}:{account_id}:resource-share/{random.uuid4()}"
         self.creation_time = utcnow()
         self.feature_set = "STANDARD"
         self.last_updated_time = utcnow()
@@ -154,16 +158,104 @@ class ResourceShare(BaseModel):
         self.name = name
 
 
-class ResourceAccessManagerBackend(BaseBackend):
-    RESOURCE_TYPES = RAM_RESOURCE_TYPES
+class ResourceType(BaseModel):
+    def __init__(
+        self, resource_type: str, service_name: str, resource_region_scope: str
+    ):
+        self.resource_type = resource_type
+        self.service_name = service_name
+        self.resource_region_scope = resource_region_scope
 
-    PERMISSION_TYPES = ["ALL", "AWS", "LOCAL"]
+    def describe(self) -> Dict[str, Any]:
+        return {
+            "resourceType": self.resource_type,
+            "serviceName": self.service_name,
+            "resourceRegionScope": self.resource_region_scope,
+        }
+
+
+class ManagedPermission(BaseModel):
+    def __init__(
+        self,
+        account_id: str,
+        region: str,
+        name: str,
+        resource_type: str,
+        version: str = "1",
+        default_version: bool = True,
+        status: str = "ATTACHABLE",
+        creation_time: Optional[str] = None,
+        last_updated_time: Optional[str] = None,
+        is_resource_type_default: bool = False,
+        permission_type: str = "AWS_MANAGED",  # or "CUSTOMER_MANAGED",
+    ):
+        self.account_id = account_id
+        self.region = region
+        self.partition = get_partition(region)
+
+        now = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
+        arn_prefix = (
+            f"arn:{self.partition}:ram::{self.partition}:permission/"
+            if permission_type == "AWS_MANAGED"
+            else f"arn:{self.partition}:ram:{self.region}:{account_id}:permission/"
+        )
+
+        self.name = name
+        self.arn = f"{arn_prefix}{name}"
+        self.resource_type = resource_type
+        self.version = version
+        self.default_version = default_version
+        self.status = status
+        self.creation_time = creation_time or now
+        self.last_updated_time = last_updated_time or creation_time
+        self.is_resource_type_default = is_resource_type_default
+        self.permission_type = permission_type
 
-    MANAGED_PERMISSIONS = AWS_MANAGED_PERMISSIONS
+    def describe(self) -> Dict[str, Any]:
+        return {
+            "arn": self.arn,
+            "name": self.name,
+            "resourceType": self.resource_type,
+            "version": self.version,
+            "defaultVersion": self.default_version,
+            "status": self.status,
+            "creationTime": self.creation_time,
+            "lastUpdatedTime": self.last_updated_time,
+            "isResourceTypeDefault": self.is_resource_type_default,
+            "permissionType": self.permission_type,
+        }
+
+
+class ResourceAccessManagerBackend(BaseBackend):
+    PERMISSION_TYPES = ["ALL", "AWS", "LOCAL"]
 
     def __init__(self, region_name: str, account_id: str):
         super().__init__(region_name, account_id)
         self.resource_shares: List[ResourceShare] = []
+        self.managed_permissions: List[ManagedPermission] = [
+            ManagedPermission(
+                account_id=account_id,
+                region=region_name,
+                name=permission["name"],
+                resource_type=permission["resourceType"],
+                version=permission["version"],
+                default_version=permission["defaultVersion"],
+                status=permission["status"],
+                creation_time=permission["creationTime"],
+                last_updated_time=permission["lastUpdatedTime"],
+                is_resource_type_default=permission["isResourceTypeDefault"],
+                permission_type=permission["permissionType"],
+            )
+            for permission in AWS_MANAGED_PERMISSIONS
+        ]
+        self.resource_types: List[ResourceType] = [
+            ResourceType(
+                resource_type=resource_type["resourceType"],
+                service_name=resource_type["serviceName"],
+                resource_region_scope=resource_type["resourceRegionScope"],
+            )
+            for resource_type in RAM_RESOURCE_TYPES
+        ]
 
     @property
     def organizations_backend(self) -> OrganizationsBackend:
@@ -193,9 +285,9 @@ class ResourceAccessManagerBackend(BaseBackend):
                 "Value 'OTHER-ACCOUNTS' for parameter 'resourceOwner' not implemented."
             )
 
-        resouces = [resource.describe() for resource in self.resource_shares]
+        resources = [resource.describe() for resource in self.resource_shares]
 
-        return dict(resourceShares=resouces)
+        return dict(resourceShares=resources)
 
     def update_resource_share(
         self,
@@ -336,12 +428,15 @@ class ResourceAccessManagerBackend(BaseBackend):
             )
 
         if resource_region_scope == "ALL":
-            resource_types = self.RESOURCE_TYPES
+            resource_types = [
+                resource_type.describe() for resource_type in self.resource_types
+            ]
         else:
             resource_types = [
-                resource_type
-                for resource_type in self.RESOURCE_TYPES
-                if resource_type["resourceRegionScope"] == resource_region_scope
+                resource_type_dict
+                for resource_type in self.resource_types
+                if (resource_type_dict := resource_type.describe())
+                and resource_type_dict["resourceRegionScope"] == resource_region_scope
             ]
 
         return dict(resourceTypes=resource_types)
@@ -357,20 +452,25 @@ class ResourceAccessManagerBackend(BaseBackend):
         # Here, resourceType first partition (service) is case sensitive and
         # last partition (type) is case insensitive
         if resource_type and not any(
-            str(permission["resourceType"]).split(":")[0] == resource_type.split(":")[0]
-            and str(permission["resourceType"]).lower() == resource_type.lower()
-            for permission in self.MANAGED_PERMISSIONS
+            (permission_dict := permission.describe())
+            and permission_dict["resourceType"].split(":")[0]
+            == resource_type.split(":")[0]
+            and permission_dict["resourceType"].lower() == resource_type.lower()
+            for permission in self.managed_permissions
         ):
             raise InvalidParameterException(f"Invalid resource type: {resource_type}")
 
         if resource_type:
             permissions = [
-                permission
-                for permission in self.MANAGED_PERMISSIONS
-                if str(permission["resourceType"]).lower() == resource_type.lower()
+                permission_dict
+                for permission in self.managed_permissions
+                if (permission_dict := permission.describe())
+                and permission_dict["resourceType"].lower() == resource_type.lower()
             ]
         else:
-            permissions = self.MANAGED_PERMISSIONS
+            permissions = [
+                permission.describe() for permission in self.managed_permissions
+            ]
 
         if permission_type not in self.PERMISSION_TYPES:
             raise InvalidParameterException(
diff --git a/moto/ram/utils.py b/moto/ram/utils.py
index 1de1e0c05..5e78d4685 100644
--- a/moto/ram/utils.py
+++ b/moto/ram/utils.py
@@ -1,5 +1,18 @@
 from datetime import datetime, timezone
-from typing import Dict, Optional, Union
+from typing import Optional, TypedDict
+
+
+class ManagedPermissionDict(TypedDict):
+    arn: str
+    version: str
+    defaultVersion: bool
+    name: str
+    resourceType: str
+    status: str
+    creationTime: str
+    lastUpdatedTime: str
+    isResourceTypeDefault: bool
+    permissionType: str
 
 
 def format_ram_permission(
@@ -13,7 +26,7 @@ def format_ram_permission(
     is_resource_type_default: bool = True,
     permission_type: str = "AWS_MANAGED",
     default_version: bool = True,
-) -> Dict[str, Union[str, bool]]:
+) -> ManagedPermissionDict:
     """
     Format a RAM (Resource Access Manager) permission dictionary with the
     specified attributes.
@@ -38,7 +51,7 @@ def format_ram_permission(
             Defaults to True.
 
     Returns:
-        dict: A dictionary representing the formatted RAM permission.
+        ManagedPermissionDict: A dictionary representing the formatted RAM permission.
     """
     now = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
     creation_time = creation_time or now
diff --git a/moto/s3/models.py b/moto/s3/models.py
index 3ea17db67..ecfdd27d0 100644
--- a/moto/s3/models.py
+++ b/moto/s3/models.py
@@ -229,6 +229,14 @@ class FakeKey(BaseModel, ManagedState):
     def set_metadata(self, metadata: Any, replace: bool = False) -> None:
         if replace:
             self._metadata = {}  # type: ignore
+        # Remove AWS-specific Content-Encoding
+        if encoding := metadata.pop("Content-Encoding", None):
+            # Remove 'aws-chunked', but keep any other (user-provided) content encoding
+            encoding = ",".join(
+                [enc for enc in encoding.split(",") if enc != "aws-chunked"]
+            )
+            if encoding:
+                metadata["Content-Encoding"] = encoding
         self._metadata.update(metadata)
 
     def set_storage_class(self, storage: Optional[str]) -> None:
diff --git a/moto/ses/responses.py b/moto/ses/responses.py
index 976a4bfa0..4870ce8cc 100644
--- a/moto/ses/responses.py
+++ b/moto/ses/responses.py
@@ -1,5 +1,5 @@
 import base64
-from typing import Any, Dict, List
+from typing import Any, Dict, List, Optional
 
 from moto.core.responses import BaseResponse
 from moto.core.utils import utcnow
@@ -217,8 +217,21 @@ class EmailResponse(BaseResponse):
     def describe_configuration_set(self) -> str:
         configuration_set_name = self.querystring.get("ConfigurationSetName")[0]  # type: ignore
         config_set = self.backend.describe_configuration_set(configuration_set_name)
+
+        attribute_names = self._get_multi_param(
+            "ConfigurationSetAttributeNames.member."
+        )
+
+        event_destination: Optional[Dict[str, Any]] = None
+        if "eventDestinations" in attribute_names:
+            event_destination = self.backend.config_set_event_destination.get(
+                configuration_set_name
+            )
+
         template = self.response_template(DESCRIBE_CONFIGURATION_SET)
-        return template.render(name=config_set.configuration_set_name)
+        return template.render(
+            name=config_set.configuration_set_name, event_destination=event_destination
+        )
 
     def create_configuration_set_event_destination(self) -> str:
         configuration_set_name = self._get_param("ConfigurationSetName")
@@ -612,6 +625,24 @@ DESCRIBE_CONFIGURATION_SET = """<DescribeConfigurationSetResponse xmlns="http://
     <ConfigurationSet>
       <Name>{{ name }}</Name>
     </ConfigurationSet>
+    {% if event_destination %}
+    <EventDestinations>
+      <member>
+        <Name>{{ event_destination["Name"] }}</Name>
+        <Enabled>{{ event_destination["Enabled"] }}</Enabled>
+        <MatchingEventTypes>
+        {% for event_matching_type in event_destination["EventMatchingTypes"] | sort %}
+          <member>{{ event_matching_type }}</member>
+        {% endfor %}
+        </MatchingEventTypes>
+        {% if "SNSDestination" in event_destination %}
+        <SNSDestination>
+          <TopicARN>{{ event_destination["SNSDestination"] }}</TopicARN>
+        </SNSDestination>
+        {% endif %}
+      </member>
+    </EventDestinations>
+    {% endif %}
   </DescribeConfigurationSetResult>
   <ResponseMetadata>
     <RequestId>8e410745-c1bd-4450-82e0-f968cf2105f2</RequestId>
diff --git a/moto/ssm/models.py b/moto/ssm/models.py
index ce291bc55..ba9d22f54 100644
--- a/moto/ssm/models.py
+++ b/moto/ssm/models.py
@@ -210,7 +210,6 @@ class Parameter(CloudFormationModel):
         last_modified_date: float,
         version: int,
         data_type: str,
-        tags: Optional[List[Dict[str, str]]] = None,
         labels: Optional[List[str]] = None,
         source_result: Optional[str] = None,
         tier: Optional[str] = None,
@@ -225,7 +224,6 @@ class Parameter(CloudFormationModel):
         self.last_modified_date = last_modified_date
         self.version = version
         self.data_type = data_type
-        self.tags = tags or []
         self.labels = labels or []
         self.source_result = source_result
         self.tier = tier
@@ -1850,6 +1848,7 @@ class SimpleSystemManagerBackend(BaseBackend):
         self, parameter: Parameter, filters: Optional[List[Dict[str, Any]]] = None
     ) -> bool:
         """Return True if the given parameter matches all the filters"""
+        parameter_tags = self.list_tags_for_resource("Parameter", parameter.name)
         for filter_obj in filters or []:
             key = filter_obj["Key"]
             values = filter_obj.get("Values", [])
@@ -1879,7 +1878,11 @@ class SimpleSystemManagerBackend(BaseBackend):
                 else:
                     continue
             elif key.startswith("tag:"):
-                what = [tag["Value"] for tag in parameter.tags if tag["Key"] == key[4:]]
+                what = [
+                    tag_value
+                    for tag_key, tag_value in parameter_tags.items()
+                    if tag_key == key[4:]
+                ]
 
             if what is None or what == []:
                 return False
@@ -2132,7 +2135,6 @@ class SimpleSystemManagerBackend(BaseBackend):
                 else previous_parameter.allowed_pattern
             )
             keyid = keyid if keyid is not None else previous_parameter.keyid
-            tags = tags if tags is not None else previous_parameter.tags
             data_type = (
                 data_type if data_type is not None else previous_parameter.data_type
             )
@@ -2150,7 +2152,6 @@ class SimpleSystemManagerBackend(BaseBackend):
             keyid=keyid,
             last_modified_date=last_modified_date,
             version=version,
-            tags=tags or [],
             data_type=data_type,
             tier=tier,
             policies=policies,
diff --git a/moto/ssm/resources/regions.json b/moto/ssm/resources/regions.json
index bc0a69765..a77263d13 100644
--- a/moto/ssm/resources/regions.json
+++ b/moto/ssm/resources/regions.json
@@ -3663,6 +3663,15 @@
               "artifact": {
                 "Value": "artifact"
               },
+              "athena": {
+                "Value": "athena",
+                "endpoint": {
+                  "Value": "athena.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "aurora": {
                 "Value": "aurora",
                 "endpoint": {
@@ -3798,6 +3807,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ds": {
+                "Value": "ds",
+                "endpoint": {
+                  "Value": "ds.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "dynamodb": {
                 "Value": "dynamodb",
                 "endpoint": {
@@ -4977,6 +4995,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "connectcampaigns": {
+                "Value": "connectcampaigns",
+                "endpoint": {
+                  "Value": "connect-campaigns.ap-northeast-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "connectcases": {
                 "Value": "connectcases",
                 "endpoint": {
@@ -7752,6 +7779,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "connectcampaigns": {
+                "Value": "connectcampaigns",
+                "endpoint": {
+                  "Value": "connect-campaigns.ap-northeast-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "connectcases": {
                 "Value": "connectcases",
                 "endpoint": {
@@ -7905,6 +7941,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "dsql": {
+                "Value": "dsql",
+                "endpoint": {
+                  "Value": "dsql.ap-northeast-2.api.aws"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "dynamodb": {
                 "Value": "dynamodb",
                 "endpoint": {
@@ -9657,14 +9702,6 @@
                   "Value": "HTTPS"
                 }
               }
-            },
-            "wavelength-zones": {
-              "apne2-wl1-cjj-wlz1": {
-                "Value": "apne2-wl1-cjj-wlz1"
-              },
-              "apne2-wl1-sel-wlz1": {
-                "Value": "apne2-wl1-sel-wlz1"
-              }
             }
           },
           "ap-northeast-3": {
@@ -15073,6 +15110,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ses": {
+                "Value": "ses",
+                "endpoint": {
+                  "Value": "email.ap-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "shield": {
                 "Value": "shield",
                 "endpoint": {
@@ -15937,6 +15983,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "connectcampaigns": {
+                "Value": "connectcampaigns",
+                "endpoint": {
+                  "Value": "connect-campaigns.ap-southeast-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "connectcases": {
                 "Value": "connectcases",
                 "endpoint": {
@@ -24274,6 +24329,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "gamelift": {
+                "Value": "gamelift"
+              },
               "glue": {
                 "Value": "glue",
                 "endpoint": {
@@ -25373,6 +25431,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "gamelift": {
+                "Value": "gamelift"
+              },
               "glue": {
                 "Value": "glue",
                 "endpoint": {
@@ -31250,6 +31311,12 @@
                   "Value": "HTTPS"
                 }
               },
+              "bcm-data-exports": {
+                "Value": "bcm-data-exports",
+                "endpoint": {
+                  "Value": "bcm-data-exports.cn-northwest-1.api.amazonwebservices.com.cn"
+                }
+              },
               "budgets": {
                 "Value": "budgets",
                 "endpoint": {
@@ -35378,17 +35445,6 @@
                   "Value": "HTTPS"
                 }
               }
-            },
-            "wavelength-zones": {
-              "euc1-wl1-ber-wlz1": {
-                "Value": "euc1-wl1-ber-wlz1"
-              },
-              "euc1-wl1-dtm-wlz1": {
-                "Value": "euc1-wl1-dtm-wlz1"
-              },
-              "euc1-wl1-muc-wlz1": {
-                "Value": "euc1-wl1-muc-wlz1"
-              }
             }
           },
           "eu-central-2": {
@@ -36608,6 +36664,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ses": {
+                "Value": "ses",
+                "endpoint": {
+                  "Value": "email.eu-central-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "shield": {
                 "Value": "shield",
                 "endpoint": {
@@ -47780,12 +47845,6 @@
               }
             },
             "wavelength-zones": {
-              "euw2-wl1-lon-wlz1": {
-                "Value": "euw2-wl1-lon-wlz1"
-              },
-              "euw2-wl1-man-wlz1": {
-                "Value": "euw2-wl1-man-wlz1"
-              },
               "euw2-wl2-man-wlz1": {
                 "Value": "euw2-wl2-man-wlz1"
               }
@@ -52693,6 +52752,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ses": {
+                "Value": "ses",
+                "endpoint": {
+                  "Value": "email.me-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "shield": {
                 "Value": "shield",
                 "endpoint": {
@@ -65083,6 +65151,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "scheduler": {
+                "Value": "scheduler",
+                "endpoint": {
+                  "Value": "scheduler.us-gov-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "schemas": {
                 "Value": "schemas",
                 "endpoint": {
@@ -66866,6 +66943,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "scheduler": {
+                "Value": "scheduler",
+                "endpoint": {
+                  "Value": "scheduler.us-gov-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "schemas": {
                 "Value": "schemas",
                 "endpoint": {
diff --git a/moto/ssm/resources/services.json b/moto/ssm/resources/services.json
index 71a2e0e3c..05b0992e5 100644
--- a/moto/ssm/resources/services.json
+++ b/moto/ssm/resources/services.json
@@ -5908,6 +5908,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "athena.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -8484,6 +8493,12 @@
           },
           "bcm-data-exports": {
             "regions": {
+              "cn-northwest-1": {
+                "Value": "cn-northwest-1",
+                "endpoint": {
+                  "Value": "bcm-data-exports.cn-northwest-1.api.amazonwebservices.com.cn"
+                }
+              },
               "us-east-1": {
                 "Value": "us-east-1",
                 "endpoint": {
@@ -16898,6 +16913,33 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-northeast-1": {
+                "Value": "ap-northeast-1",
+                "endpoint": {
+                  "Value": "connect-campaigns.ap-northeast-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-northeast-2": {
+                "Value": "ap-northeast-2",
+                "endpoint": {
+                  "Value": "connect-campaigns.ap-northeast-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-southeast-1": {
+                "Value": "ap-southeast-1",
+                "endpoint": {
+                  "Value": "connect-campaigns.ap-southeast-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-southeast-2": {
                 "Value": "ap-southeast-2",
                 "endpoint": {
@@ -21137,6 +21179,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "ds.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -21463,6 +21514,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-northeast-2": {
+                "Value": "ap-northeast-2",
+                "endpoint": {
+                  "Value": "dsql.ap-northeast-2.api.aws"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-3": {
                 "Value": "ap-northeast-3",
                 "endpoint": {
@@ -31246,6 +31306,12 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-southeast-5": {
+                "Value": "ap-southeast-5"
+              },
+              "ap-southeast-7": {
+                "Value": "ap-southeast-7"
+              },
               "ca-central-1": {
                 "Value": "ca-central-1",
                 "endpoint": {
@@ -61348,6 +61414,24 @@
                   "Value": "HTTPS"
                 }
               },
+              "us-gov-east-1": {
+                "Value": "us-gov-east-1",
+                "endpoint": {
+                  "Value": "scheduler.us-gov-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "us-gov-west-1": {
+                "Value": "us-gov-west-1",
+                "endpoint": {
+                  "Value": "scheduler.us-gov-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "us-west-1": {
                 "Value": "us-west-1",
                 "endpoint": {
@@ -64261,6 +64345,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-south-2": {
+                "Value": "ap-south-2",
+                "endpoint": {
+                  "Value": "email.ap-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-southeast-1": {
                 "Value": "ap-southeast-1",
                 "endpoint": {
@@ -64306,6 +64399,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "eu-central-2": {
+                "Value": "eu-central-2",
+                "endpoint": {
+                  "Value": "email.eu-central-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "eu-north-1": {
                 "Value": "eu-north-1",
                 "endpoint": {
@@ -64360,6 +64462,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "me-central-1": {
+                "Value": "me-central-1",
+                "endpoint": {
+                  "Value": "email.me-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "me-south-1": {
                 "Value": "me-south-1",
                 "endpoint": {


Test patch:
diff --git a/tests/test_core/test_response_serialization.py b/tests/test_core/test_response_serialization.py
new file mode 100644
index 000000000..7d68bc9c7
--- /dev/null
+++ b/tests/test_core/test_response_serialization.py
@@ -0,0 +1,60 @@
+from botocore.model import ServiceModel
+
+from moto.core.responses import ActionContext, ActionResult, BaseResponse, EmptyResult
+from moto.core.serialize import QuerySerializer, never_return
+
+TEST_MODEL = {
+    "metadata": {"protocol": "query", "apiVersion": "2014-01-01"},
+    "documentation": "",
+    "operations": {
+        "TestOperation": {
+            "name": "TestOperation",
+            "http": {
+                "method": "POST",
+                "requestUri": "/",
+            },
+            "output": {"shape": "OutputShape"},
+        }
+    },
+    "shapes": {
+        "OutputShape": {
+            "type": "structure",
+            "members": {
+                "string": {"shape": "StringType"},
+                "TransformerTest": {"shape": "StringType"},
+            },
+        },
+        "StringType": {
+            "type": "string",
+        },
+    },
+}
+
+
+def test_response_result_execution() -> None:
+    """Exercise various response result execution paths."""
+
+    class TestResponseClass(BaseResponse):
+        RESPONSE_KEY_PATH_TO_TRANSFORMER = {"OutputShape.TransformerTest": never_return}
+
+    class TestResponseObject:
+        string = "test-string"
+        TransformerTest = "some data"
+
+    service_model = ServiceModel(TEST_MODEL)
+    operation_model = service_model.operation_model("TestOperation")
+    serializer_class = QuerySerializer
+    response_class = TestResponseClass
+
+    context = ActionContext(
+        service_model, operation_model, serializer_class, response_class
+    )
+
+    result = ActionResult(TestResponseObject())
+    _, __, body = result.execute_result(context)
+    assert "test-string" in body
+    assert "TransformerTest" not in body
+
+    result = EmptyResult()
+    _, __, body = result.execute_result(context)
+    assert "<OutputShapeResult/>" in body
diff --git a/tests/test_core/test_serialize.py b/tests/test_core/test_serialize.py
index 96fda31cb..a6e86a0f9 100644
--- a/tests/test_core/test_serialize.py
+++ b/tests/test_core/test_serialize.py
@@ -21,6 +21,9 @@ from moto.core.serialize import (
     AttributePickerContext,
     QuerySerializer,
     XFormedAttributePicker,
+    never_return,
+    return_if_not_empty,
+    url_encode,
 )
 
 
@@ -217,3 +220,25 @@ class TestXFormedAttributePicker:
         ctx = AttributePickerContext(DBInstance(), "DBInstanceClass", None)
         value = self.picker(ctx)
         assert value == "t2.medium"
+
+
+class TestResponseAttributeTransformers:
+    def test_never_return(self):
+        assert never_return(None) is None
+        assert never_return(True) is None
+        assert never_return(False) is None
+        assert never_return("Test") is None
+
+    def test_return_if_not_empty(self):
+        assert return_if_not_empty([]) is None
+        assert return_if_not_empty(None) is None
+        assert return_if_not_empty("Test") == "Test"
+        assert return_if_not_empty({}) is None
+        assert return_if_not_empty("") is None
+        assert return_if_not_empty({"key": "value"}) == {"key": "value"}
+        assert return_if_not_empty([0, 1, 2]) == [0, 1, 2]
+
+    def test_url_encode(self):
+        assert url_encode(None) is None
+        assert url_encode("Test") == "Test"
+        assert url_encode("Test String") == "Test%20String"
diff --git a/tests/test_ecs/test_ecs_boto3.py b/tests/test_ecs/test_ecs_boto3.py
index 3bb524597..84fa98f1e 100644
--- a/tests/test_ecs/test_ecs_boto3.py
+++ b/tests/test_ecs/test_ecs_boto3.py
@@ -2163,6 +2163,10 @@ def test_run_task_awsvpc_network():
 
     # ECS setup
     setup_resources = setup_ecs(client, ec2)
+    subnet = setup_resources[0]
+    ec2_client.modify_vpc_attribute(
+        VpcId=subnet.vpc.id, EnableDnsHostnames={"Value": True}
+    )
 
     # Execute
     response = client.run_task(
@@ -2211,6 +2215,10 @@ def test_run_task_awsvpc_network__unknown_sec_group():
 
     # ECS setup
     setup_resources = setup_ecs(client, ec2)
+    subnet = setup_resources[0]
+    ec2_client.modify_vpc_attribute(
+        VpcId=subnet.vpc.id, EnableDnsHostnames={"Value": True}
+    )
 
     # Execute
     task = client.run_task(
diff --git a/tests/test_emr/test_emr_boto3.py b/tests/test_emr/test_emr_boto3.py
index 6a4dbdfb5..65bc6e86d 100644
--- a/tests/test_emr/test_emr_boto3.py
+++ b/tests/test_emr/test_emr_boto3.py
@@ -272,7 +272,7 @@ def test_describe_job_flow():
     jf = client.describe_job_flows(JobFlowIds=[cluster_id])["JobFlows"][0]
 
     assert jf["AmiVersion"] == args["AmiVersion"]
-    assert "BootstrapActions" not in jf
+    assert jf["BootstrapActions"] == []
     esd = jf["ExecutionStatusDetail"]
     assert isinstance(esd["CreationDateTime"], datetime)
     # assert isinstance(esd['EndDateTime'], 'datetime.datetime')
@@ -737,7 +737,7 @@ def test_set_visible_to_all_users():
     assert resp["Cluster"]["VisibleToAllUsers"] is False
 
     for expected in (True, False):
-        resp = client.set_visible_to_all_users(
+        client.set_visible_to_all_users(
             JobFlowIds=[cluster_id], VisibleToAllUsers=expected
         )
         resp = client.describe_cluster(ClusterId=cluster_id)
diff --git a/tests/test_emr/test_server.py b/tests/test_emr/test_server.py
index e2803abbd..fcb461063 100644
--- a/tests/test_emr/test_server.py
+++ b/tests/test_emr/test_server.py
@@ -11,5 +11,4 @@ def test_describe_jobflows():
 
     res = test_client.get("/?Action=DescribeJobFlows")
 
-    assert b"<DescribeJobFlowsResult>" in res.data
-    assert b"<JobFlows>" in res.data
+    assert b"JobFlows" in res.data
diff --git a/tests/test_iam/test_iam.py b/tests/test_iam/test_iam.py
index 2391c4c08..9ec082c95 100644
--- a/tests/test_iam/test_iam.py
+++ b/tests/test_iam/test_iam.py
@@ -3240,6 +3240,8 @@ def test_role_policy_encoding():
         RoleName=role_name, AssumeRolePolicyDocument=json.dumps(assume_policy_document)
     )
     assert resp["Role"]["AssumeRolePolicyDocument"] == assume_policy_document
+    resp = conn.get_role(RoleName=role_name)
+    assert resp["Role"]["AssumeRolePolicyDocument"] == assume_policy_document
     conn.put_role_policy(
         RoleName=role_name,
         PolicyName=policy_name,
@@ -3346,9 +3348,6 @@ def test_create_role_with_permissions_boundary(region, partition):
             PermissionsBoundary=invalid_boundary_arn,
         )
 
-    # Ensure the PermissionsBoundary is included in role listing as well
-    assert conn.list_roles()["Roles"][0].get("PermissionsBoundary") == expected
-
 
 @mock_aws
 def test_create_role_with_same_name_should_fail():
diff --git a/tests/test_iam/test_iam_cloudformation.py b/tests/test_iam/test_iam_cloudformation.py
index d69c3388f..4b65dea08 100644
--- a/tests/test_iam/test_iam_cloudformation.py
+++ b/tests/test_iam/test_iam_cloudformation.py
@@ -385,6 +385,7 @@ Resources:
   ThePolicy:
     Type: AWS::IAM::ManagedPolicy
     Properties:
+      Description: "test description"
       PolicyDocument:
         Version: '2012-10-17'
         Statement:
@@ -413,7 +414,7 @@ Resources:
     policy = iam_client.get_policy(PolicyArn=policy_arn)["Policy"]
     assert policy["Arn"] == policy_arn
     assert policy["PolicyName"] == expected_name
-    assert policy["Description"] == ""
+    assert policy["Description"] == "test description"
     assert policy["Path"] == "/"
 
 
diff --git a/tests/test_iam/test_iam_response_attributes.py b/tests/test_iam/test_iam_response_attributes.py
new file mode 100644
index 000000000..fd32d6c38
--- /dev/null
+++ b/tests/test_iam/test_iam_response_attributes.py
@@ -0,0 +1,224 @@
+import json
+from typing import Any
+from uuid import uuid4
+
+import boto3
+import pytest
+from botocore.exceptions import ClientError
+
+from tests import aws_verified
+
+BOUNDARY_POLICY = {
+    "Version": "2012-10-17",
+    "Statement": [
+        {
+            "Sid": "BoundaryAllowAllNotAdminAccess",
+            "Effect": "Allow",
+            "Action": "*",
+            "Resource": "*",
+            "Condition": {
+                "ArnNotEquals": {
+                    "iam:PolicyArn": ["arn:aws:iam::aws:policy/AdministratorAccess"]
+                }
+            },
+        }
+    ],
+}
+
+DEFAULT_TAGS = [{"Key": "somekey", "Value": "somevalue"}]
+
+
+@aws_verified
+@pytest.mark.aws_verified
+@pytest.mark.parametrize(
+    "specify_optional_params",
+    [True, False],
+    ids=("SpecifyOptionalParams", "NoOptionalParams"),
+)
+def test_role_resource_returns_subset_of_available_attributes(specify_optional_params):
+    client = boto3.client("iam", region_name="us-east-1")
+    role_policy = {
+        "Version": "2012-10-17",
+        "Statement": {
+            "Effect": "Allow",
+            "Principal": {"Service": "ec2.amazonaws.com"},
+            "Action": "sts:AssumeRole",
+        },
+    }
+    test_guid = str(uuid4())
+    role_name = "TestRole" + test_guid
+    boundary_policy_name = "TestBoundaryPolicy" + test_guid
+    resp = client.create_policy(
+        PolicyName=boundary_policy_name, PolicyDocument=json.dumps(BOUNDARY_POLICY)
+    )
+    boundary_policy_arn = resp["Policy"]["Arn"]
+    try:
+        path = f"/{test_guid}/"
+        create_role_params: dict[str, Any] = dict(
+            Path=path,
+            RoleName=role_name,
+            AssumeRolePolicyDocument=json.dumps(role_policy),
+            Description="test",
+        )
+        if specify_optional_params:
+            create_role_params["PermissionsBoundary"] = boundary_policy_arn
+            create_role_params["Tags"] = DEFAULT_TAGS
+
+        def assert_resource_attributes(resource):
+            permissions_boundary_in_response = "PermissionsBoundary" in resource
+            assert permissions_boundary_in_response is bool(specify_optional_params), (
+                f"PermissionsBoundary in response: {permissions_boundary_in_response}, "
+                f"but specify_optional_params is {specify_optional_params}"
+            )
+            tags_in_response = "Tags" in resource
+            assert tags_in_response is bool(specify_optional_params), (
+                f"Tags in response: {tags_in_response}, "
+                f"but specify_optional_params is {specify_optional_params}"
+            )
+
+        # Create/GetRole calls return some attributes only when specified.
+        resp = client.create_role(**create_role_params)
+        assert_resource_attributes(resp["Role"])
+        resp = client.get_role(RoleName=role_name)
+        assert_resource_attributes(resp["Role"])
+        # ListRoles always returns a subset of all available attributes.
+        resp = client.list_roles(PathPrefix=path)
+        assert len(resp["Roles"]) == 1
+        role = resp["Roles"][0]
+        assert "PermissionsBoundary" not in role
+        assert "RoleLastUsed" not in role
+        assert "Tags" not in role
+    finally:
+        # Clean up created AWS resources
+        try:
+            client.delete_role(RoleName=role_name)
+        except ClientError as e:
+            if e.response["Error"]["Code"] != "NoSuchEntity":
+                raise
+        try:
+            client.delete_policy(PolicyArn=boundary_policy_arn)
+        except ClientError as e:
+            if e.response["Error"]["Code"] != "NoSuchEntity":
+                raise
+
+
+@aws_verified
+@pytest.mark.aws_verified
+@pytest.mark.parametrize(
+    "specify_optional_params",
+    [True, False],
+    ids=("SpecifyOptionalParams", "NoOptionalParams"),
+)
+def test_user_resource_returns_subset_of_available_attributes(specify_optional_params):
+    client = boto3.client("iam", region_name="us-east-1")
+    test_guid = str(uuid4())
+    user_name = "TestUser" + test_guid
+    boundary_policy_name = "TestBoundaryPolicy" + test_guid
+    resp = client.create_policy(
+        PolicyName=boundary_policy_name, PolicyDocument=json.dumps(BOUNDARY_POLICY)
+    )
+    boundary_policy_arn = resp["Policy"]["Arn"]
+    try:
+        path = f"/{test_guid}/"
+        create_user_params: dict[str, Any] = dict(
+            Path=path,
+            UserName=user_name,
+        )
+        if specify_optional_params:
+            create_user_params["PermissionsBoundary"] = boundary_policy_arn
+            create_user_params["Tags"] = DEFAULT_TAGS
+
+        def assert_resource_attributes(resource):
+            # TODO: Uncomment this when moto supports PermissionsBoundary for Users
+            # permissions_boundary_in_response = "PermissionsBoundary" in resource
+            # assert permissions_boundary_in_response is bool(specify_optional_params), (
+            #     f"PermissionsBoundary in response: {permissions_boundary_in_response}, "
+            #     f"but specify_optional_params is {specify_optional_params}"
+            # )
+            tags_in_response = "Tags" in resource
+            assert tags_in_response is bool(specify_optional_params), (
+                f"Tags in response: {tags_in_response}, "
+                f"but specify_optional_params is {specify_optional_params}"
+            )
+
+        # Create/GetUser calls return some attributes only when specified.
+        resp = client.create_user(**create_user_params)
+        assert_resource_attributes(resp["User"])
+        resp = client.get_user(UserName=user_name)
+        assert_resource_attributes(resp["User"])
+        # ListUsers always returns a subset of all available attributes.
+        resp = client.list_users(PathPrefix=path)
+        assert len(resp["Users"]) == 1
+        user = resp["Users"][0]
+        assert "PermissionsBoundary" not in user
+        assert "Tags" not in user
+    finally:
+        # Clean up created AWS resources
+        try:
+            client.delete_user(UserName=user_name)
+        except ClientError as e:
+            if e.response["Error"]["Code"] != "NoSuchEntity":
+                raise
+        try:
+            client.delete_policy(PolicyArn=boundary_policy_arn)
+        except ClientError as e:
+            if e.response["Error"]["Code"] != "NoSuchEntity":
+                raise
+
+
+@aws_verified
+@pytest.mark.aws_verified
+@pytest.mark.parametrize(
+    "specify_optional_params",
+    [True, False],
+    ids=("SpecifyOptionalParams", "NoOptionalParams"),
+)
+def test_policy_resource_returns_subset_of_available_attributes(
+    specify_optional_params,
+):
+    client = boto3.client("iam", region_name="us-east-1")
+    test_guid = str(uuid4())
+    policy_arn = None
+    try:
+        policy_name = "TestPolicy" + test_guid
+        path = f"/{test_guid}/"
+        create_policy_params: dict[str, Any] = dict(
+            Path=path,
+            PolicyName=policy_name,
+            PolicyDocument=json.dumps(BOUNDARY_POLICY),
+        )
+        if specify_optional_params:
+            create_policy_params["Description"] = "test description"
+            create_policy_params["Tags"] = DEFAULT_TAGS
+
+        # CreatePolicy returns some attributes only when specified.
+        resp = client.create_policy(**create_policy_params)
+        policy_arn = resp["Policy"]["Arn"]
+        assert "Description" not in resp["Policy"]
+        tags_in_response = "Tags" in resp["Policy"]
+        assert tags_in_response is bool(specify_optional_params), (
+            f"Tags in response: {tags_in_response}, "
+            f"but specify_optional_params is {specify_optional_params}"
+        )
+        # GetPolicy *does* return empty tags list...
+        resp = client.get_policy(PolicyArn=policy_arn)
+        description_in_response = "Description" in resp["Policy"]
+        assert description_in_response is bool(specify_optional_params), (
+            f"Description in response: {description_in_response}, "
+            f"but specify_optional_params is {specify_optional_params}"
+        )
+        assert "Tags" in resp["Policy"]
+        # ListPolices always returns a subset of all available attributes.
+        resp = client.list_policies(PathPrefix=path)
+        assert len(resp["Policies"]) == 1
+        policy = resp["Policies"][0]
+        assert "Description" not in policy
+        assert "Tags" not in policy
+    finally:
+        # Clean up created AWS resources
+        try:
+            if policy_arn is not None:
+                client.delete_policy(PolicyArn=policy_arn)
+        except ClientError as e:
+            if e.response["Error"]["Code"] != "NoSuchEntity":
+                raise
diff --git a/tests/test_networkfirewall/test_networkfirewall.py b/tests/test_networkfirewall/test_networkfirewall.py
index 5b6789131..b651d2dc0 100644
--- a/tests/test_networkfirewall/test_networkfirewall.py
+++ b/tests/test_networkfirewall/test_networkfirewall.py
@@ -64,6 +64,19 @@ def test_describe_logging_configuration():
     assert log_dest_configs[1]["LogType"] == "ALERT"
 
 
+@mock_aws
+def test_describe_logging_configuration_no_config_set():
+    client = boto3.client("network-firewall", region_name="eu-west-1")
+    firewall = client.create_firewall(
+        FirewallName="test-firewall",
+        FirewallPolicyArn="arn:aws:network-firewall:ap-southeast-1:123456789012:firewall-policy/test-policy",
+    )["Firewall"]
+
+    resp = client.describe_logging_configuration(FirewallArn=firewall["FirewallArn"])
+    assert resp["FirewallArn"] == firewall["FirewallArn"]
+    assert resp["LoggingConfiguration"] == {}
+
+
 @mock_aws
 def test_update_logging_configuration():
     client = boto3.client("network-firewall", region_name="ap-southeast-1")
diff --git a/tests/test_ram/test_ram.py b/tests/test_ram/test_ram.py
index d3637c644..d161b4a97 100644
--- a/tests/test_ram/test_ram.py
+++ b/tests/test_ram/test_ram.py
@@ -9,7 +9,7 @@ from botocore.exceptions import ClientError
 
 from moto import mock_aws
 from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
-from moto.ram.models import ResourceAccessManagerBackend
+from moto.ram.utils import AWS_MANAGED_PERMISSIONS, RAM_RESOURCE_TYPES
 
 
 @mock_aws
@@ -569,7 +569,7 @@ def test_list_resource_types(resource_region_scope, expect_error, error_message)
         assert ex.response["Error"]["Message"] == error_message
     else:
         response = client.list_resource_types(**resource_region_scope)
-        expected_types = ResourceAccessManagerBackend.RESOURCE_TYPES
+        expected_types = RAM_RESOURCE_TYPES
         if region_scope == "GLOBAL":
             expected_types = [
                 rt for rt in expected_types if rt["resourceRegionScope"] == "GLOBAL"
@@ -632,7 +632,7 @@ def test_list_permissions(parameters, expect_error, error_message):
         response = client.list_permissions(**parameters)
 
         # then
-        expected_permissions = ResourceAccessManagerBackend.MANAGED_PERMISSIONS
+        expected_permissions = AWS_MANAGED_PERMISSIONS
         if resource_type:
             expected_permissions = [
                 permission
diff --git a/tests/test_s3/test_s3_content_encoding.py b/tests/test_s3/test_s3_content_encoding.py
new file mode 100644
index 000000000..7ebe6decf
--- /dev/null
+++ b/tests/test_s3/test_s3_content_encoding.py
@@ -0,0 +1,30 @@
+import os
+from tempfile import TemporaryFile
+
+import boto3
+import pytest
+
+from . import s3_aws_verified
+
+
+@pytest.mark.aws_verified
+@s3_aws_verified
+@pytest.mark.parametrize("encoding", [None, "gzip", "unknown"])
+def test_content_encoding_is_returned(encoding, bucket_name=None):
+    client = boto3.client("s3", region_name="us-east-1")
+    s3_file = "some.file"
+
+    attrs = {
+        "ContentType": "application/octet-stream",
+        "ACL": "bucket-owner-full-control",
+    }
+    if encoding:
+        attrs["ContentEncoding"] = encoding
+
+    with TemporaryFile() as f:
+        f.write(os.urandom(1024))
+        f.flush()
+        client.upload_fileobj(f, bucket_name, s3_file, ExtraArgs=attrs)
+
+    res = client.get_object(Bucket=bucket_name, Key=s3_file)
+    assert res.get("ContentEncoding") == encoding
diff --git a/tests/test_ses/test_ses_boto3.py b/tests/test_ses/test_ses_boto3.py
index 0f38a75d5..602d5c0cf 100644
--- a/tests/test_ses/test_ses_boto3.py
+++ b/tests/test_ses/test_ses_boto3.py
@@ -593,6 +593,36 @@ def test_describe_configuration_set():
     )
     assert config_set["ConfigurationSet"]["Name"] == name
 
+    conn.create_configuration_set_event_destination(
+        ConfigurationSetName=name,
+        EventDestination={
+            "Name": "event_destination_1",
+            "Enabled": True,
+            "MatchingEventTypes": ["send", "reject", "bounce"],
+            "SNSDestination": {
+                "TopicARN": "arn:aws:sns:us-east-1:123456789012:myTopic"
+            },
+        },
+    )
+
+    config_set = conn.describe_configuration_set(
+        ConfigurationSetName=name,
+        ConfigurationSetAttributeNames=["eventDestinations"],
+    )
+    assert config_set["ConfigurationSet"]["Name"] == name
+    assert config_set["EventDestinations"][0]["Name"] == "event_destination_1"
+    assert config_set["EventDestinations"][0]["Enabled"] is True
+    assert (
+        config_set["EventDestinations"][0]["SNSDestination"]["TopicARN"]
+        == "arn:aws:sns:us-east-1:123456789012:myTopic"
+    )
+    for event_type in ["send", "reject", "bounce"]:
+        assert event_type in config_set["EventDestinations"][0]["MatchingEventTypes"]
+    for event_type in ["complaint", "delivery", "open", "click", "renderingFailure"]:
+        assert (
+            event_type not in config_set["EventDestinations"][0]["MatchingEventTypes"]
+        )
+
 
 @mock_aws
 def test_list_configuration_sets():
diff --git a/tests/test_ssm/test_ssm_boto3.py b/tests/test_ssm/test_ssm_boto3.py
index 40bb1f299..8be1c12ce 100644
--- a/tests/test_ssm/test_ssm_boto3.py
+++ b/tests/test_ssm/test_ssm_boto3.py
@@ -1274,17 +1274,73 @@ def test_describe_parameters_tags():
         Tags=[{"Key": "spam", "Value": "eggs"}],
     )
 
+    client.put_parameter(
+        Name="/spam/was-ham",
+        Value="originally ham",
+        Type="String",
+        Tags=[{"Key": "spam", "Value": "ham"}],
+    )
+    client.add_tags_to_resource(
+        ResourceId="/spam/was-ham",
+        ResourceType="Parameter",
+        Tags=[{"Key": "spam", "Value": "eggs"}],
+    )
+
+    client.put_parameter(
+        Name="/spam/eventually-eggs",
+        Value="eventually eggs",
+        Type="String",
+    )
+    client.add_tags_to_resource(
+        ResourceId="/spam/eventually-eggs",
+        ResourceType="Parameter",
+        Tags=[{"Key": "spam", "Value": "eggs"}],
+    )
+
+    client.put_parameter(
+        Name="/spam/becomes-ham",
+        Value="was eggs",
+        Type="String",
+        Tags=[{"Key": "spam", "Value": "eggs"}],
+    )
+    client.add_tags_to_resource(
+        ResourceId="/spam/becomes-ham",
+        ResourceType="Parameter",
+        Tags=[{"Key": "spam", "Value": "ham"}],
+    )
+
+    client.put_parameter(
+        Name="/spam/remove-spam",
+        Value="was eggs",
+        Type="String",
+        Tags=[{"Key": "spam", "Value": "eggs"}],
+    )
+    client.remove_tags_from_resource(
+        ResourceId="/spam/remove-spam",
+        ResourceType="Parameter",
+        TagKeys=["spam"],
+    )
+
     parameters = client.describe_parameters(
         ParameterFilters=[{"Key": "tag:spam", "Values": ["eggs"]}]
     )["Parameters"]
-    assert len(parameters) == 1
-    assert parameters[0]["Name"] == "/spam/eggs"
+    assert len(parameters) == 3
+    assert {p["Name"] for p in parameters} == {
+        "/spam/eggs",
+        "/spam/was-ham",
+        "/spam/eventually-eggs",
+    }
 
     # Verify we can filter by the existence of a tag
     filters = [{"Key": "tag:spam"}]
     response = client.describe_parameters(ParameterFilters=filters)
-    assert len(response["Parameters"]) == 1
-    assert {p["Name"] for p in response["Parameters"]} == set(["/spam/eggs"])
+    assert len(response["Parameters"]) == 4
+    assert {p["Name"] for p in response["Parameters"]} == {
+        "/spam/eggs",
+        "/spam/was-ham",
+        "/spam/eventually-eggs",
+        "/spam/becomes-ham",
+    }
 
 
 @mock_aws