Repository: getmoto/moto
Pull request #8951 (2025-06-07 21:04:24)

EC2: Serialize Transit Gateway Route Tables
@bpandola FYI - I finally got around to playing around with your serializer! 

It took some finagling, because the existing models didn't really align with the actual data model, but I think this is an improvement overall.


Patch:
diff --git a/moto/ec2/models/core.py b/moto/ec2/models/core.py
index 581e44dd3..38212b54c 100644
--- a/moto/ec2/models/core.py
+++ b/moto/ec2/models/core.py
@@ -12,6 +12,10 @@ class TaggedEC2Resource(BaseModel):
             tags = self.ec2_backend.describe_tags(filters={"resource-id": [self.id]})  # type: ignore[attr-defined]
         return tags
 
+    @property
+    def tagSet(self) -> list[dict[str, str]]:
+        return self.get_tags()
+
     def add_tag(self, key: str, value: str) -> None:
         self.ec2_backend.create_tags([self.id], {key: value})  # type: ignore[attr-defined]
 
diff --git a/moto/ec2/models/transit_gateway_attachments.py b/moto/ec2/models/transit_gateway_attachments.py
index 399de01dd..ead5bfd45 100644
--- a/moto/ec2/models/transit_gateway_attachments.py
+++ b/moto/ec2/models/transit_gateway_attachments.py
@@ -1,6 +1,6 @@
 import weakref
 from collections import defaultdict
-from typing import Any, Dict, Iterator, List, Optional
+from typing import TYPE_CHECKING, Any, Dict, Iterator, List, Optional
 
 from moto.core.utils import iso_8601_datetime_with_milliseconds, utcnow
 from moto.utilities.utils import filter_resources, merge_multiple_dicts
@@ -10,6 +10,9 @@ from ..utils import describe_tag_filter, random_transit_gateway_attachment_id
 from .core import TaggedEC2Resource
 from .vpc_peering_connections import PeeringConnectionStatus
 
+if TYPE_CHECKING:
+    from .transit_gateway_route_tables import TransitGatewayRouteTable
+
 
 class TransitGatewayAttachment(TaggedEC2Resource):
     def __init__(
@@ -226,11 +229,13 @@ class TransitGatewayAttachmentBackend:
             route_table_id = transit_gateway_attachment.propagation.get(
                 "transitGatewayRouteTableId"
             )
-            route_table = self.transit_gateways_route_tables[route_table_id]  # type: ignore[attr-defined]
+            route_table: "TransitGatewayRouteTable" = (
+                self.transit_gateways_route_tables[route_table_id]  # type: ignore[attr-defined]
+            )
             route_table.route_table_propagation = [
                 prop
                 for prop in route_table.route_table_propagation
-                if prop["transitGatewayAttachmentId"] != transit_gateway_attachment_id
+                if prop.transitGatewayAttachmentId != transit_gateway_attachment_id
             ]
         except (AttributeError, KeyError, IndexError):
             pass
diff --git a/moto/ec2/models/transit_gateway_route_tables.py b/moto/ec2/models/transit_gateway_route_tables.py
index d20771a4f..87b800616 100644
--- a/moto/ec2/models/transit_gateway_route_tables.py
+++ b/moto/ec2/models/transit_gateway_route_tables.py
@@ -1,12 +1,32 @@
+import itertools
+from datetime import datetime
 from typing import Any, Dict, List, Optional
 
-from moto.core.utils import iso_8601_datetime_with_milliseconds, utcnow
+from moto.core.utils import utcnow
 from moto.utilities.utils import filter_resources
 
 from ..utils import random_transit_gateway_route_table_id
 from .core import TaggedEC2Resource
 
 
+class RouteTableAssociation:
+    def __init__(self) -> None:
+        self.resourceId = ""
+        self.resourceType = ""
+        self.state = ""
+        self.transitGatewayAttachmentId = ""
+
+    def clear(self) -> None:
+        self.resourceId = ""
+        self.resourceType = ""
+        self.state = ""
+        self.transitGatewayAttachmentId = ""
+
+
+class RouteTablePropagation(RouteTableAssociation):
+    pass
+
+
 class TransitGatewayRouteTable(TaggedEC2Resource):
     def __init__(
         self,
@@ -27,16 +47,20 @@ class TransitGatewayRouteTable(TaggedEC2Resource):
         self.state = "available"
         self.routes: Dict[str, Dict[str, Optional[str]]] = {}
         self.add_tags(tags or {})
-        self.route_table_association: Dict[str, str] = {}
-        self.route_table_propagation: List[Dict[str, str]] = []
+        self.route_table_association = RouteTableAssociation()
+        self.route_table_propagation: List[RouteTablePropagation] = []
 
     @property
     def physical_resource_id(self) -> str:
         return self.id
 
     @property
-    def create_time(self) -> str:
-        return iso_8601_datetime_with_milliseconds(self._created_at)
+    def create_time(self) -> datetime:
+        return self._created_at
+
+    @property
+    def creation_time(self) -> datetime:
+        return self.create_time
 
 
 class TransitGatewayRelations:
@@ -134,7 +158,7 @@ class TransitGatewayRouteTableBackend:
         )
         transit_gateways_route_table.routes[destination_cidr_block] = {
             "destinationCidrBlock": destination_cidr_block,
-            "prefixListId": "",
+            "prefixListId": None,
             "state": "blackhole" if blackhole else "active",
             "type": "static",
         }
@@ -154,19 +178,19 @@ class TransitGatewayRouteTableBackend:
 
     def delete_transit_gateway_route(
         self, transit_gateway_route_table_id: str, destination_cidr_block: str
-    ) -> TransitGatewayRouteTable:
+    ) -> dict[str, Optional[str]]:
         transit_gateways_route_table = self.transit_gateways_route_tables[
             transit_gateway_route_table_id
         ]
         transit_gateways_route_table.routes[destination_cidr_block]["state"] = "deleted"
-        return transit_gateways_route_table
+        return transit_gateways_route_table.routes.pop(destination_cidr_block)
 
     def search_transit_gateway_routes(
         self,
         transit_gateway_route_table_id: str,
         filters: Any,
         max_results: Optional[int] = None,
-    ) -> Dict[str, Dict[str, Optional[str]]]:
+    ) -> list[Dict[str, Optional[str]]]:
         """
         The following filters are currently supported: type, state, route-search.exact-match
         """
@@ -174,7 +198,7 @@ class TransitGatewayRouteTableBackend:
             transit_gateway_route_table_id
         )
         if not transit_gateway_route_table:
-            return {}
+            return []
 
         attr_pairs = (
             ("type", "type"),
@@ -192,41 +216,35 @@ class TransitGatewayRouteTableBackend:
                         break
         if max_results:
             routes = routes[: int(max_results)]  # type: ignore
-        return routes
+        return list(routes.values())
 
     def set_route_table_association(
         self, transit_gateway_attachment_id: str, transit_gateway_route_table_id: str
     ) -> None:
-        self.transit_gateways_route_tables[
-            transit_gateway_route_table_id
-        ].route_table_association = {
-            "resourceId": self.transit_gateway_attachments[  # type: ignore[attr-defined]
-                transit_gateway_attachment_id
-            ].resource_id,
-            "resourceType": self.transit_gateway_attachments[  # type: ignore[attr-defined]
-                transit_gateway_attachment_id
-            ].resource_type,
-            "state": "associated",
-            "transitGatewayAttachmentId": transit_gateway_attachment_id,
-        }
+        table = self.transit_gateways_route_tables[transit_gateway_route_table_id]
+        attachment = self.transit_gateway_attachments[transit_gateway_attachment_id]  # type: ignore[attr-defined]
+        table.route_table_association.resourceId = attachment.resource_id
+        table.route_table_association.resourceType = attachment.resource_type
+        table.route_table_association.state = "associated"
+        table.route_table_association.transitGatewayAttachmentId = (
+            transit_gateway_attachment_id
+        )
 
     def unset_route_table_association(self, tgw_rt_id: str) -> None:
         tgw_rt = self.transit_gateways_route_tables[tgw_rt_id]
-        tgw_rt.route_table_association = {}
+        tgw_rt.route_table_association.clear()
 
     def set_route_table_propagation(
         self, transit_gateway_attachment_id: str, transit_gateway_route_table_id: str
     ) -> None:
         route_table = self.transit_gateways_route_tables[transit_gateway_route_table_id]
         attchment = self.transit_gateway_attachments[transit_gateway_attachment_id]  # type: ignore[attr-defined]
-        route_table.route_table_propagation.append(
-            {
-                "resourceId": attchment.resource_id,
-                "resourceType": attchment.resource_type,
-                "state": "enabled",
-                "transitGatewayAttachmentId": transit_gateway_attachment_id,
-            }
-        )
+        propagation = RouteTablePropagation()
+        propagation.resourceId = attchment.resource_id
+        propagation.resourceType = attchment.resource_type
+        propagation.state = "enabled"
+        propagation.transitGatewayAttachmentId = transit_gateway_attachment_id
+        route_table.route_table_propagation.append(propagation)
 
     def disable_route_table_propagation(
         self, transit_gateway_attachment_id: str, transit_gateway_route_table_id: str
@@ -235,12 +253,12 @@ class TransitGatewayRouteTableBackend:
         route_table.route_table_propagation = [
             prop
             for prop in route_table.route_table_propagation
-            if prop["transitGatewayAttachmentId"] != transit_gateway_attachment_id
+            if prop.transitGatewayAttachmentId != transit_gateway_attachment_id
         ]
 
     def get_transit_gateway_route_table_associations(
         self, transit_gateway_route_table_id: List[str], filters: Any = None
-    ) -> List[TransitGatewayRouteTable]:
+    ) -> list[RouteTableAssociation]:
         transit_gateway_route_tables = list(self.transit_gateways_route_tables.values())
 
         if transit_gateway_route_tables:
@@ -251,23 +269,24 @@ class TransitGatewayRouteTableBackend:
             ]
 
         attr_pairs = (
-            ("resource-id", "route_table_association", "resourceId"),
-            ("resource-type", "route_table_association", "resourceType"),
+            ("resource-id", "resourceId"),
+            ("resource-type", "resourceType"),
             (
                 "transit-gateway-attachment-id",
-                "route_table_association",
                 "transitGatewayAttachmentId",
             ),
         )
 
-        result = transit_gateway_route_tables
+        result = [
+            table.route_table_association for table in transit_gateway_route_tables
+        ]
         if filters:
-            result = filter_resources(transit_gateway_route_tables, filters, attr_pairs)
+            result = filter_resources(result, filters, attr_pairs)
         return result
 
     def get_transit_gateway_route_table_propagations(
         self, transit_gateway_route_table_id: str, filters: Any = None
-    ) -> List[TransitGatewayRouteTable]:
+    ) -> List[RouteTablePropagation]:
         transit_gateway_route_tables = list(self.transit_gateways_route_tables.values())
 
         if transit_gateway_route_tables:
@@ -278,18 +297,21 @@ class TransitGatewayRouteTableBackend:
             ]
 
         attr_pairs = (
-            ("resource-id", "route_table_propagation", "resourceId"),
-            ("resource-type", "route_table_propagation", "resourceType"),
+            ("resource-id", "resourceId"),
+            ("resource-type", "resourceType"),
             (
                 "transit-gateway-attachment-id",
-                "route_table_propagation",
                 "transitGatewayAttachmentId",
             ),
         )
 
-        result = transit_gateway_route_tables
+        result = list(
+            itertools.chain.from_iterable(
+                table.route_table_propagation for table in transit_gateway_route_tables
+            )
+        )
         if filters:
-            result = filter_resources(transit_gateway_route_tables, filters, attr_pairs)
+            result = filter_resources(result, filters, attr_pairs)
         return result
 
     def associate_transit_gateway_route_table(
diff --git a/moto/ec2/responses/transit_gateway_route_tables.py b/moto/ec2/responses/transit_gateway_route_tables.py
index 6f11965b5..2952bbfac 100644
--- a/moto/ec2/responses/transit_gateway_route_tables.py
+++ b/moto/ec2/responses/transit_gateway_route_tables.py
@@ -1,10 +1,11 @@
+from moto.core.responses import ActionResult
 from moto.utilities.utils import str2bool
 
 from ._base_response import EC2BaseResponse
 
 
 class TransitGatewayRouteTable(EC2BaseResponse):
-    def create_transit_gateway_route_table(self) -> str:
+    def create_transit_gateway_route_table(self) -> ActionResult:
         transit_gateway_id = self._get_param("TransitGatewayId")
         tags = self._parse_tag_specification().get("transit-gateway-route-table", {})
 
@@ -13,10 +14,9 @@ class TransitGatewayRouteTable(EC2BaseResponse):
                 transit_gateway_id=transit_gateway_id, tags=tags
             )
         )
-        template = self.response_template(CREATE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE)
-        return template.render(transit_gateway_route_table=transit_gateway_route_table)
+        return ActionResult({"transitGatewayRouteTable": transit_gateway_route_table})
 
-    def describe_transit_gateway_route_tables(self) -> str:
+    def describe_transit_gateway_route_tables(self) -> ActionResult:
         filters = self._filters_from_querystring()
         transit_gateway_route_table_ids = (
             self._get_multi_param("TransitGatewayRouteTableIds") or None
@@ -26,22 +26,18 @@ class TransitGatewayRouteTable(EC2BaseResponse):
                 transit_gateway_route_table_ids, filters
             )
         )
-        template = self.response_template(DESCRIBE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE)
-        return template.render(
-            transit_gateway_route_tables=transit_gateway_route_tables
-        )
+        return ActionResult({"transitGatewayRouteTables": transit_gateway_route_tables})
 
-    def delete_transit_gateway_route_table(self) -> str:
+    def delete_transit_gateway_route_table(self) -> ActionResult:
         transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
         transit_gateway_route_table = (
             self.ec2_backend.delete_transit_gateway_route_table(
                 transit_gateway_route_table_id
             )
         )
-        template = self.response_template(DELETE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE)
-        return template.render(transit_gateway_route_table=transit_gateway_route_table)
+        return ActionResult({"transitGatewayRouteTable": transit_gateway_route_table})
 
-    def create_transit_gateway_route(self) -> str:
+    def create_transit_gateway_route(self) -> ActionResult:
         transit_gateway_attachment_id = self._get_param("TransitGatewayAttachmentId")
         destination_cidr_block = self._get_param("DestinationCidrBlock")
         transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
@@ -52,28 +48,18 @@ class TransitGatewayRouteTable(EC2BaseResponse):
             transit_gateway_attachment_id=transit_gateway_attachment_id,
             blackhole=blackhole,
         )
-        template = self.response_template(CREATE_TRANSIT_GATEWAY_ROUTE_RESPONSE)
-        return template.render(
-            transit_gateway_route_table=transit_gateways_route_table,
-            destination_cidr_block=destination_cidr_block,
-        )
+        return ActionResult({"route": transit_gateways_route_table})
 
-    def delete_transit_gateway_route(self) -> str:
+    def delete_transit_gateway_route(self) -> ActionResult:
         destination_cidr_block = self._get_param("DestinationCidrBlock")
         transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
-        transit_gateway_route_table = self.ec2_backend.delete_transit_gateway_route(
+        transit_gateway_route = self.ec2_backend.delete_transit_gateway_route(
             destination_cidr_block=destination_cidr_block,
             transit_gateway_route_table_id=transit_gateway_route_table_id,
         )
-        template = self.response_template(DELETE_TRANSIT_GATEWAY_ROUTE_RESPONSE)
-        rendered_template = template.render(
-            transit_gateway_route_table=transit_gateway_route_table,
-            destination_cidr_block=destination_cidr_block,
-        )
-        del transit_gateway_route_table.routes[destination_cidr_block]
-        return rendered_template
+        return ActionResult({"route": transit_gateway_route})
 
-    def search_transit_gateway_routes(self) -> str:
+    def search_transit_gateway_routes(self) -> ActionResult:
         transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
         filters = self._filters_from_querystring()
         max_results = self._get_param("MaxResults")
@@ -82,10 +68,11 @@ class TransitGatewayRouteTable(EC2BaseResponse):
             filters=filters,
             max_results=max_results,
         )
-        template = self.response_template(SEARCH_TRANSIT_GATEWAY_ROUTES_RESPONSE)
-        return template.render(transit_gateway_routes=transit_gateway_routes)
+        return ActionResult(
+            {"routeSet": transit_gateway_routes, "additionalRoutesAvailable": False}
+        )
 
-    def get_transit_gateway_route_table_associations(self) -> str:
+    def get_transit_gateway_route_table_associations(self) -> ActionResult:
         transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
         filters = self._filters_from_querystring()
         transit_gateway_route_table_associations = (
@@ -93,14 +80,9 @@ class TransitGatewayRouteTable(EC2BaseResponse):
                 transit_gateway_route_table_id, filters
             )
         )
-        template = self.response_template(
-            GET_TRANSIT_GATEWAY_ROUTE_TABLE_ASSOCIATIONS_RESPONSE
-        )
-        return template.render(
-            transit_gateway_route_table_associations=transit_gateway_route_table_associations
-        )
+        return ActionResult({"associations": transit_gateway_route_table_associations})
 
-    def get_transit_gateway_route_table_propagations(self) -> str:
+    def get_transit_gateway_route_table_propagations(self) -> ActionResult:
         transit_gateway_route_table_id = self._get_param("TransitGatewayRouteTableId")
         filters = self._filters_from_querystring()
         transit_gateway_route_table_propagations = (
@@ -108,156 +90,8 @@ class TransitGatewayRouteTable(EC2BaseResponse):
                 transit_gateway_route_table_id, filters
             )
         )
-        template = self.response_template(
-            GET_TRANSIT_GATEWAY_ROUTE_TABLE_PROPAGATIONS_RESPONSE
+        return ActionResult(
+            {
+                "transitGatewayRouteTablePropagations": transit_gateway_route_table_propagations
+            }
         )
-        return template.render(
-            transit_gateway_route_table_propagations=transit_gateway_route_table_propagations
-        )
-
-
-CREATE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE = """<CreateTransitGatewayRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
-    <requestId>3a495d25-08d4-466d-822e-477c9b1fc606</requestId>
-    <transitGatewayRouteTable>
-        <creationTime>{{ transit_gateway_route_table.create_time }}</creationTime>
-        <defaultAssociationRouteTable>{{ transit_gateway_route_table.default_association_route_table }}</defaultAssociationRouteTable>
-        <defaultPropagationRouteTable>{{ transit_gateway_route_table.default_propagation_route_table }}</defaultPropagationRouteTable>
-        <state>{{ transit_gateway_route_table.state }}</state>
-        <transitGatewayId>{{ transit_gateway_route_table.transit_gateway_id }}</transitGatewayId>
-        <transitGatewayRouteTableId>{{ transit_gateway_route_table.id }}</transitGatewayRouteTableId>
-        <tagSet>
-            {% for tag in transit_gateway_route_table.get_tags() %}
-                <item>
-                    <key>{{ tag.key }}</key>
-                    <value>{{ tag.value }}</value>
-                </item>
-            {% endfor %}
-        </tagSet>
-    </transitGatewayRouteTable>
-</CreateTransitGatewayRouteTableResponse>
-"""
-
-DESCRIBE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE = """<DescribeTransitGatewayRouteTablesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
-    <requestId>f9dea58a-7bb3-458b-a40d-0b7ae32eefdb</requestId>
-    <transitGatewayRouteTables>
-        {% for transit_gateway_route_table in transit_gateway_route_tables %}
-        <item>
-            <creationTime>{{ transit_gateway_route_table.create_time }}</creationTime>
-            <defaultAssociationRouteTable>{{ transit_gateway_route_table.default_association_route_table }}</defaultAssociationRouteTable>
-            <defaultPropagationRouteTable>{{ transit_gateway_route_table.default_propagation_route_table }}</defaultPropagationRouteTable>
-            <state>{{ transit_gateway_route_table.state }}</state>
-            <tagSet>
-                {% for tag in transit_gateway_route_table.get_tags() %}
-                    <item>
-                        <key>{{ tag.key }}</key>
-                        <value>{{ tag.value }}</value>
-                    </item>
-                {% endfor %}
-            </tagSet>
-            <transitGatewayId>{{ transit_gateway_route_table.transit_gateway_id }}</transitGatewayId>
-            <transitGatewayRouteTableId>{{ transit_gateway_route_table.id }}</transitGatewayRouteTableId>
-        </item>
-        {% endfor %}
-    </transitGatewayRouteTables>
-</DescribeTransitGatewayRouteTablesResponse>
-"""
-
-DELETE_TRANSIT_GATEWAY_ROUTE_TABLE_RESPONSE = """<DeleteTransitGatewayRouteTableResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
-    <requestId>a9a07226-c7b1-4305-9934-0bcfc3ef1c5e</requestId>
-    <transitGatewayRouteTable>
-        <creationTime>{{ transit_gateway_route_table.create_time }}</creationTime>
-        <defaultAssociationRouteTable>{{ transit_gateway_route_table.default_association_route_table }}</defaultAssociationRouteTable>
-        <defaultPropagationRouteTable>{{ transit_gateway_route_table.default_propagation_route_table }}</defaultPropagationRouteTable>
-        <state>{{ transit_gateway_route_table.state }}</state>
-        <transitGatewayId>{{ transit_gateway_route_table.transit_gateway_id }}</transitGatewayId>
-        <transitGatewayRouteTableId>{{ transit_gateway_route_table.id }}</transitGatewayRouteTableId>
-    </transitGatewayRouteTable>
-</DeleteTransitGatewayRouteTableResponse>
-"""
-
-
-CREATE_TRANSIT_GATEWAY_ROUTE_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
-<CreateTransitGatewayRouteResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
-    <requestId>072b02ce-df3a-4de6-a20b-6653ae4b91a4</requestId>
-    <route>
-        <destinationCidrBlock>{{ transit_gateway_route_table.destinationCidrBlock }}</destinationCidrBlock>
-        <state>{{ transit_gateway_route_table.state }}</state>
-        <type>{{ transit_gateway_route_table.type }}</type>
-        <transitGatewayAttachments>
-        {% if transit_gateway_route_table.state != 'blackhole' and transit_gateway_route_table.transitGatewayAttachments %}
-            <item>
-                <resourceId>{{ transit_gateway_route_table.transitGatewayAttachments.resourceId }}</resourceId>
-                <resourceType>{{ transit_gateway_route_table.transitGatewayAttachments.resourceType }}</resourceType>
-                <transitGatewayAttachmentId>{{ transit_gateway_route_table.transitGatewayAttachments.transitGatewayAttachmentId }}</transitGatewayAttachmentId>
-            </item>
-        {% endif %}
-        </transitGatewayAttachments>
-    </route>
-</CreateTransitGatewayRouteResponse>
-"""
-
-DELETE_TRANSIT_GATEWAY_ROUTE_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
-<DeleteTransitGatewayRouteResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
-    <requestId>2109d5bb-f874-4f35-b419-4723792a638f</requestId>
-    <route>
-        <destinationCidrBlock>{{ transit_gateway_route_table.routes[destination_cidr_block].destinationCidrBlock }}</destinationCidrBlock>
-        <state>{{ transit_gateway_route_table.routes[destination_cidr_block].state }}</state>
-        <type>{{ transit_gateway_route_table.routes[destination_cidr_block].type }}</type>
-    </route>
-</DeleteTransitGatewayRouteResponse>
-"""
-
-SEARCH_TRANSIT_GATEWAY_ROUTES_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
-<SearchTransitGatewayRoutesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
-    <requestId>04b46ad2-5a0e-46db-afe4-68679a193b48</requestId>
-    <routeSet>
-        {% for route in transit_gateway_routes %}
-        <item>
-            <destinationCidrBlock>{{ transit_gateway_routes[route].destinationCidrBlock }}</destinationCidrBlock>
-            <state>{{ transit_gateway_routes[route].state }}</state>
-            <type>{{ transit_gateway_routes[route].type }}</type>
-            {% if transit_gateway_routes[route].get('transitGatewayAttachments') %}
-            <transitGatewayAttachments>
-                <item>
-                    <resourceId>{{ transit_gateway_routes[route].transitGatewayAttachments.resourceId }}</resourceId>
-                    <resourceType>{{ transit_gateway_routes[route].transitGatewayAttachments.resourceType }}</resourceType>
-                    <transitGatewayAttachmentId>{{ transit_gateway_routes[route].transitGatewayAttachments.transitGatewayAttachmentId }}</transitGatewayAttachmentId>
-                </item>
-            </transitGatewayAttachments>
-            {% endif %}
-        </item>
-        {% endfor %}
-    </routeSet>
-    <additionalRoutesAvailable>false</additionalRoutesAvailable>
-</SearchTransitGatewayRoutesResponse>
-"""
-
-GET_TRANSIT_GATEWAY_ROUTE_TABLE_ASSOCIATIONS_RESPONSE = """<GetTransitGatewayRouteTableAssociationsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
-    <requestId>92fdc91d-c374-4217-b2b4-33f2fb0a2be7</requestId>
-    <associations>
-        {% for route_table in transit_gateway_route_table_associations %}
-        <item>
-            <resourceId>{{ route_table.route_table_association.resourceId }}</resourceId>
-            <resourceType>{{ route_table.route_table_association.resourceType }}</resourceType>
-            <state>{{ route_table.route_table_association.state }}</state>
-            <transitGatewayAttachmentId>{{ route_table.route_table_association.transitGatewayAttachmentId }}</transitGatewayAttachmentId>
-        </item>
-        {% endfor %}
-    </associations>
-</GetTransitGatewayRouteTableAssociationsResponse>"""
-
-GET_TRANSIT_GATEWAY_ROUTE_TABLE_PROPAGATIONS_RESPONSE = """<GetTransitGatewayRouteTablePropagationsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
-    <requestId>541bc42d-9ed9-4aef-a5f7-2ea32fbdec16</requestId>
-    <transitGatewayRouteTablePropagations>
-        {% for route_table in transit_gateway_route_table_propagations %}
-          {% for prop in route_table.route_table_propagation %}
-        <item>
-            <resourceId>{{ prop.resourceId }}</resourceId>
-            <resourceType>{{ prop.resourceType }}</resourceType>
-            <state>{{ prop.state }}</state>
-            <transitGatewayAttachmentId>{{ prop.transitGatewayAttachmentId }}</transitGatewayAttachmentId>
-        </item>
-          {% endfor %}
-        {% endfor %}
-    </transitGatewayRouteTablePropagations>
-</GetTransitGatewayRouteTablePropagationsResponse>"""
diff --git a/moto/sns/models.py b/moto/sns/models.py
index 7361a7c03..80653b0cc 100644
--- a/moto/sns/models.py
+++ b/moto/sns/models.py
@@ -24,7 +24,8 @@ from moto.core.utils import (
 )
 from moto.moto_api._internal import mock_random
 from moto.sqs import sqs_backends
-from moto.sqs.exceptions import MissingParameter
+from moto.sqs.exceptions import MissingParameter, QueueDoesNotExist
+from moto.sqs.models import SQSBackend
 from moto.utilities.arns import parse_arn
 from moto.utilities.utils import get_partition
 
@@ -245,8 +246,10 @@ class Subscription(BaseModel):
             queue_name = self.endpoint.split(":")[-1]
             region = self.endpoint.split(":")[3]
 
+            backend: SQSBackend = sqs_backends[self.account_id][region]
+
             if self.attributes.get("RawMessageDelivery") != "true":
-                sqs_backends[self.account_id][region].send_message(
+                backend.send_message(
                     queue_name,
                     json.dumps(
                         self.get_post_data(
@@ -261,6 +264,7 @@ class Subscription(BaseModel):
                     ),
                     deduplication_id=deduplication_id,
                     group_id=group_id,
+                    validate_group_id=False,
                 )
             else:
                 raw_message_attributes = {}
@@ -277,12 +281,13 @@ class Subscription(BaseModel):
                         attr_type: type_value,
                     }
 
-                sqs_backends[self.account_id][region].send_message(
+                backend.send_message(
                     queue_name,
                     message,
                     message_attributes=raw_message_attributes,
                     deduplication_id=deduplication_id,
                     group_id=group_id,
+                    validate_group_id=False,
                 )
         elif self.protocol in ["http", "https"]:
             post_data = self.get_post_data(message, message_id, subject)
@@ -608,6 +613,7 @@ class SNSBackend(BaseBackend):
         setattr(topic, attribute_name, attribute_value)
 
     def subscribe(self, topic_arn: str, endpoint: str, protocol: str) -> Subscription:
+        topic = self.get_topic(topic_arn)
         if protocol == "sms":
             if re.search(r"[./-]{2,}", endpoint) or re.search(
                 r"(^[./-]|[./-]$)", endpoint
@@ -619,6 +625,24 @@ class SNSBackend(BaseBackend):
             if not is_e164(reduced_endpoint):
                 raise SNSInvalidParameter(f"Invalid SMS endpoint: {endpoint}")
 
+        if protocol == "sqs":
+            try:
+                arn = parse_arn(endpoint)
+            except ValueError:
+                raise SNSInvalidParameter("Invalid parameter: SQS endpoint ARN")
+
+            backend: SQSBackend = sqs_backends[arn.account][arn.region]
+            topic = self.get_topic(topic_arn)
+            try:
+                queue = backend.get_queue(arn.resource_id)
+                if topic.fifo_topic == "false" and queue.fifo_queue:
+                    raise SNSInvalidParameter(
+                        "Invalid parameter: Invalid parameter: Endpoint Reason: FIFO SQS Queues can not be subscribed to standard SNS topics"
+                    )
+            except QueueDoesNotExist:
+                # Subscribing to an unknown queue is apparently not a problem
+                pass
+
         # AWS doesn't create duplicates
         old_subscription = self._find_subscription(topic_arn, endpoint, protocol)
         if old_subscription:
@@ -635,7 +659,6 @@ class SNSBackend(BaseBackend):
                     f"Invalid parameter: Endpoint Reason: Endpoint does not exist for endpoint arn{endpoint}"
                 )
 
-        topic = self.get_topic(topic_arn)
         subscription = Subscription(self.account_id, topic, endpoint, protocol)
         attributes = {
             "PendingConfirmation": "false",
diff --git a/moto/sqs/models.py b/moto/sqs/models.py
index 35f6f1764..547105ce4 100644
--- a/moto/sqs/models.py
+++ b/moto/sqs/models.py
@@ -804,6 +804,7 @@ class SQSBackend(BaseBackend):
         delay_seconds: int,
         deduplication_id: Optional[str] = None,
         group_id: Optional[str] = None,
+        validate_group_id: bool = True,
     ) -> None:
         if queue.fifo_queue:
             if (
@@ -834,18 +835,17 @@ class SQSBackend(BaseBackend):
             msg = f"One or more parameters are invalid. Reason: Message must be shorter than {queue.maximum_message_size} bytes."  # type: ignore
             raise InvalidParameterValue(msg)
 
-        if group_id is None:
-            if queue.fifo_queue:
-                # MessageGroupId is a mandatory parameter for all
-                # messages in a fifo queue
-                raise MissingParameter("MessageGroupId")
-        else:
-            if not queue.fifo_queue:
-                msg = (
-                    f"Value {group_id} for parameter MessageGroupId is invalid. "
-                    "Reason: The request include parameter that is not valid for this queue type."
-                )
-                raise InvalidParameterValue(msg)
+        if group_id is None and queue.fifo_queue:
+            # MessageGroupId is a mandatory parameter for all
+            # messages in a fifo queue
+            raise MissingParameter("MessageGroupId")
+        if group_id and not queue.fifo_queue and validate_group_id:
+            # If the request comes from SNS, we don't need to validate the existence of a group ID
+            msg = (
+                f"Value {group_id} for parameter MessageGroupId is invalid. "
+                "Reason: The request include parameter that is not valid for this queue type."
+            )
+            raise InvalidParameterValue(msg)
 
     def send_message(
         self,
@@ -856,11 +856,17 @@ class SQSBackend(BaseBackend):
         deduplication_id: Optional[str] = None,
         group_id: Optional[str] = None,
         system_attributes: Optional[Dict[str, Any]] = None,
+        validate_group_id: bool = True,
     ) -> Message:
         queue = self.get_queue(queue_name)
 
         self._validate_message(
-            queue, message_body, int(delay_seconds or 0), deduplication_id, group_id
+            queue,
+            message_body=message_body,
+            delay_seconds=int(delay_seconds or 0),
+            deduplication_id=deduplication_id,
+            group_id=group_id,
+            validate_group_id=validate_group_id,
         )
 
         if delay_seconds is not None:
diff --git a/moto/ssm/resources/regions.json b/moto/ssm/resources/regions.json
index e8b2a8fb6..1d9c0411c 100644
--- a/moto/ssm/resources/regions.json
+++ b/moto/ssm/resources/regions.json
@@ -166,6 +166,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "aps": {
+                "Value": "aps",
+                "endpoint": {
+                  "Value": "aps.af-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "arc-zonal-shift": {
                 "Value": "arc-zonal-shift",
                 "endpoint": {
@@ -1946,6 +1955,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "aps": {
+                "Value": "aps",
+                "endpoint": {
+                  "Value": "aps.ap-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "arc-zonal-shift": {
                 "Value": "arc-zonal-shift",
                 "endpoint": {
@@ -3562,6 +3580,706 @@
               }
             }
           },
+          "ap-east-2": {
+            "Value": "ap-east-2",
+            "availability-zones": {
+              "ape2-az1": {
+                "Value": "ape2-az1"
+              },
+              "ape2-az2": {
+                "Value": "ape2-az2"
+              },
+              "ape2-az3": {
+                "Value": "ape2-az3"
+              }
+            },
+            "domain": {
+              "Value": "amazonaws.com"
+            },
+            "geolocationCountry": {
+              "Value": "TW"
+            },
+            "geolocationRegion": {
+              "Value": "TW-TPE"
+            },
+            "longName": {
+              "Value": "Asia Pacific (Taipei)"
+            },
+            "partition": {
+              "Value": "aws"
+            },
+            "services": {
+              "accessanalyzer": {
+                "Value": "accessanalyzer",
+                "endpoint": {
+                  "Value": "access-analyzer.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "acm": {
+                "Value": "acm",
+                "endpoint": {
+                  "Value": "acm.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "acm-pca": {
+                "Value": "acm-pca",
+                "endpoint": {
+                  "Value": "acm-pca.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "https"
+                }
+              },
+              "apigateway": {
+                "Value": "apigateway",
+                "endpoint": {
+                  "Value": "apigateway.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "appconfig": {
+                "Value": "appconfig",
+                "endpoint": {
+                  "Value": "appconfig.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "appconfigdata": {
+                "Value": "appconfigdata",
+                "endpoint": {
+                  "Value": "appconfigdata.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "arc-zonal-shift": {
+                "Value": "arc-zonal-shift",
+                "endpoint": {
+                  "Value": "arc-zonal-shift.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "artifact": {
+                "Value": "artifact"
+              },
+              "aurora": {
+                "Value": "aurora",
+                "endpoint": {
+                  "Value": "rds.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "autoscaling": {
+                "Value": "autoscaling",
+                "endpoint": {
+                  "Value": "autoscaling.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
+              "awshealthdashboard": {
+                "Value": "awshealthdashboard",
+                "endpoint": {
+                  "Value": "phd.aws.amazon.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
+              "backup": {
+                "Value": "backup",
+                "endpoint": {
+                  "Value": "backup.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "batch": {
+                "Value": "batch",
+                "endpoint": {
+                  "Value": "batch.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "cloudcontrolapi": {
+                "Value": "cloudcontrolapi",
+                "endpoint": {
+                  "Value": "cloudcontrolapi.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "cloudformation": {
+                "Value": "cloudformation",
+                "endpoint": {
+                  "Value": "cloudformation.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "cloudfront": {
+                "Value": "cloudfront",
+                "endpoint": {
+                  "Value": "cloudfront.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "cloudtrail": {
+                "Value": "cloudtrail",
+                "endpoint": {
+                  "Value": "cloudtrail.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "cloudwatch": {
+                "Value": "cloudwatch",
+                "endpoint": {
+                  "Value": "monitoring.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
+              "config": {
+                "Value": "config",
+                "endpoint": {
+                  "Value": "config.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "datasync": {
+                "Value": "datasync",
+                "endpoint": {
+                  "Value": "datasync.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "directconnect": {
+                "Value": "directconnect",
+                "endpoint": {
+                  "Value": "directconnect.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "dlm": {
+                "Value": "dlm",
+                "endpoint": {
+                  "Value": "dlm.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "dms": {
+                "Value": "dms",
+                "endpoint": {
+                  "Value": "dms.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "dynamodb": {
+                "Value": "dynamodb",
+                "endpoint": {
+                  "Value": "dynamodb.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
+              "dynamodbstreams": {
+                "Value": "dynamodbstreams",
+                "endpoint": {
+                  "Value": "streams.dynamodb.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
+              "ebs": {
+                "Value": "ebs",
+                "endpoint": {
+                  "Value": "ec2.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ec2": {
+                "Value": "ec2",
+                "endpoint": {
+                  "Value": "ec2.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ecr": {
+                "Value": "ecr",
+                "endpoint": {
+                  "Value": "ecr.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ecs": {
+                "Value": "ecs",
+                "endpoint": {
+                  "Value": "ecs.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "efs": {
+                "Value": "efs",
+                "endpoint": {
+                  "Value": "elasticfilesystem.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eks": {
+                "Value": "eks",
+                "endpoint": {
+                  "Value": "eks.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eks-auth": {
+                "Value": "eks-auth",
+                "endpoint": {
+                  "Value": "eks-auth.ap-east-2.api.aws"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "elasticache": {
+                "Value": "elasticache",
+                "endpoint": {
+                  "Value": "elasticache.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "elb": {
+                "Value": "elb",
+                "endpoint": {
+                  "Value": "elasticloadbalancing.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "emr": {
+                "Value": "emr",
+                "endpoint": {
+                  "Value": "elasticmapreduce.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "es": {
+                "Value": "es",
+                "endpoint": {
+                  "Value": "es.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "eventbridge": {
+                "Value": "eventbridge",
+                "endpoint": {
+                  "Value": "events.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "events": {
+                "Value": "events",
+                "endpoint": {
+                  "Value": "events.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "fargate": {
+                "Value": "fargate"
+              },
+              "firehose": {
+                "Value": "firehose",
+                "endpoint": {
+                  "Value": "firehose.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "iam": {
+                "Value": "iam",
+                "endpoint": {
+                  "Value": "iam.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "imagebuilder": {
+                "Value": "imagebuilder",
+                "endpoint": {
+                  "Value": "imagebuilder.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "kinesis": {
+                "Value": "kinesis",
+                "endpoint": {
+                  "Value": "kinesis.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "kms": {
+                "Value": "kms",
+                "endpoint": {
+                  "Value": "kms.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "lambda": {
+                "Value": "lambda",
+                "endpoint": {
+                  "Value": "lambda.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "logs": {
+                "Value": "logs",
+                "endpoint": {
+                  "Value": "logs.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "marketplace": {
+                "Value": "marketplace"
+              },
+              "oam": {
+                "Value": "oam",
+                "endpoint": {
+                  "Value": "oam.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "organizations": {
+                "Value": "organizations",
+                "endpoint": {
+                  "Value": "organizations.us-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "pi": {
+                "Value": "pi",
+                "endpoint": {
+                  "Value": "pi.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "privatelink": {
+                "Value": "privatelink"
+              },
+              "ram": {
+                "Value": "ram",
+                "endpoint": {
+                  "Value": "ram.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "rbin": {
+                "Value": "rbin",
+                "endpoint": {
+                  "Value": "rbin.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "rds": {
+                "Value": "rds",
+                "endpoint": {
+                  "Value": "rds.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "redshift": {
+                "Value": "redshift",
+                "endpoint": {
+                  "Value": "redshift.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "resource-groups": {
+                "Value": "resource-groups",
+                "endpoint": {
+                  "Value": "resource-groups.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "resourcegroupstaggingapi": {
+                "Value": "resourcegroupstaggingapi",
+                "endpoint": {
+                  "Value": "tagging.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "rolesanywhere": {
+                "Value": "rolesanywhere",
+                "endpoint": {
+                  "Value": "rolesanywhere.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "route53": {
+                "Value": "route53",
+                "endpoint": {
+                  "Value": "route53.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "route53-application-recovery-controller": {
+                "Value": "route53-application-recovery-controller"
+              },
+              "route53-recovery-control-config": {
+                "Value": "route53-recovery-control-config",
+                "endpoint": {
+                  "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "route53resolver": {
+                "Value": "route53resolver",
+                "endpoint": {
+                  "Value": "route53resolver.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "s3": {
+                "Value": "s3",
+                "endpoint": {
+                  "Value": "s3.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
+              "secretsmanager": {
+                "Value": "secretsmanager",
+                "endpoint": {
+                  "Value": "secretsmanager.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "service-quotas": {
+                "Value": "service-quotas",
+                "endpoint": {
+                  "Value": "servicequotas.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "servicediscovery": {
+                "Value": "servicediscovery",
+                "endpoint": {
+                  "Value": "servicediscovery.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "sns": {
+                "Value": "sns",
+                "endpoint": {
+                  "Value": "sns.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
+              "sqs": {
+                "Value": "sqs",
+                "endpoint": {
+                  "Value": "sqs.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
+              "ssm": {
+                "Value": "ssm",
+                "endpoint": {
+                  "Value": "ssm.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "stepfunctions": {
+                "Value": "stepfunctions",
+                "endpoint": {
+                  "Value": "states.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "sts": {
+                "Value": "sts",
+                "endpoint": {
+                  "Value": "sts.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "support": {
+                "Value": "support",
+                "endpoint": {
+                  "Value": "support.us-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "swf": {
+                "Value": "swf",
+                "endpoint": {
+                  "Value": "swf.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "synthetics": {
+                "Value": "synthetics",
+                "endpoint": {
+                  "Value": "synthetics.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "transitgateway": {
+                "Value": "transitgateway",
+                "endpoint": {
+                  "Value": "ec2.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "trustedadvisor": {
+                "Value": "trustedadvisor"
+              },
+              "vpc": {
+                "Value": "vpc"
+              },
+              "vpn": {
+                "Value": "vpn",
+                "endpoint": {
+                  "Value": "ec2.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "xray": {
+                "Value": "xray",
+                "endpoint": {
+                  "Value": "xray.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              }
+            }
+          },
           "ap-northeast-1": {
             "Value": "ap-northeast-1",
             "availability-zones": {
@@ -16338,15 +17056,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "opsworks": {
-                "Value": "opsworks",
-                "endpoint": {
-                  "Value": "opsworks.ap-southeast-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "opsworkschefautomate": {
                 "Value": "opsworkschefautomate",
                 "endpoint": {
@@ -23121,6 +23830,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "aps": {
+                "Value": "aps",
+                "endpoint": {
+                  "Value": "aps.ap-southeast-5.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "arc-zonal-shift": {
                 "Value": "arc-zonal-shift",
                 "endpoint": {
@@ -23697,6 +24415,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "mwaa": {
+                "Value": "mwaa"
+              },
               "neptune": {
                 "Value": "neptune",
                 "endpoint": {
@@ -24226,6 +24947,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "aps": {
+                "Value": "aps",
+                "endpoint": {
+                  "Value": "aps.ap-southeast-7.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "arc-zonal-shift": {
                 "Value": "arc-zonal-shift",
                 "endpoint": {
@@ -30024,6 +30754,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "scheduler": {
+                "Value": "scheduler",
+                "endpoint": {
+                  "Value": "scheduler.cn-north-1.amazonaws.com.cn"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "schemas": {
                 "Value": "schemas",
                 "endpoint": {
@@ -31444,6 +32183,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "scheduler": {
+                "Value": "scheduler",
+                "endpoint": {
+                  "Value": "scheduler.cn-northwest-1.amazonaws.com.cn"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "schemas": {
                 "Value": "schemas",
                 "endpoint": {
@@ -33628,15 +34376,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "opsworks": {
-                "Value": "opsworks",
-                "endpoint": {
-                  "Value": "opsworks.eu-central-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "opsworkschefautomate": {
                 "Value": "opsworkschefautomate",
                 "endpoint": {
@@ -34741,6 +35480,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "aps": {
+                "Value": "aps",
+                "endpoint": {
+                  "Value": "aps.eu-central-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "arc-zonal-shift": {
                 "Value": "arc-zonal-shift",
                 "endpoint": {
@@ -38385,6 +39133,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "aps": {
+                "Value": "aps",
+                "endpoint": {
+                  "Value": "aps.eu-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "arc-zonal-shift": {
                 "Value": "arc-zonal-shift",
                 "endpoint": {
@@ -41486,6 +42243,15 @@
                   "Value": "https"
                 }
               },
+              "ahl": {
+                "Value": "ahl",
+                "endpoint": {
+                  "Value": "healthlake.eu-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "aiq": {
                 "Value": "aiq"
               },
@@ -43376,15 +44142,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "opsworks": {
-                "Value": "opsworks",
-                "endpoint": {
-                  "Value": "opsworks.eu-west-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "opsworkschefautomate": {
                 "Value": "opsworkschefautomate",
                 "endpoint": {
@@ -46143,6 +46900,12 @@
                   "Value": "HTTPS"
                 }
               },
+              "observabilityadmin": {
+                "Value": "observabilityadmin",
+                "endpoint": {
+                  "Value": "observabilityadmin.eu-west-2.amazonaws.com"
+                }
+              },
               "omics": {
                 "Value": "omics"
               },
@@ -48393,6 +49156,12 @@
                   "Value": "HTTPS"
                 }
               },
+              "observabilityadmin": {
+                "Value": "observabilityadmin",
+                "endpoint": {
+                  "Value": "observabilityadmin.eu-west-3.amazonaws.com"
+                }
+              },
               "opensearchserverless": {
                 "Value": "opensearchserverless",
                 "endpoint": {
@@ -50710,6 +51479,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "aps": {
+                "Value": "aps",
+                "endpoint": {
+                  "Value": "aps.me-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "arc-zonal-shift": {
                 "Value": "arc-zonal-shift",
                 "endpoint": {
@@ -53874,6 +54652,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "apigatewayv2": {
+                "Value": "apigatewayv2",
+                "endpoint": {
+                  "Value": "apigateway.mx-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "appconfig": {
                 "Value": "appconfig",
                 "endpoint": {
@@ -59251,15 +60038,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "opsworks": {
-                "Value": "opsworks",
-                "endpoint": {
-                  "Value": "opsworks.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "opsworkschefautomate": {
                 "Value": "opsworkschefautomate",
                 "endpoint": {
@@ -63719,6 +64497,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "health": {
+                "Value": "health",
+                "endpoint": {
+                  "Value": "health.us-gov-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "iam": {
                 "Value": "iam",
                 "endpoint": {
@@ -67759,6 +68546,12 @@
                   "Value": "HTTPS"
                 }
               },
+              "observabilityadmin": {
+                "Value": "observabilityadmin",
+                "endpoint": {
+                  "Value": "observabilityadmin.us-west-1.amazonaws.com"
+                }
+              },
               "opsworkschefautomate": {
                 "Value": "opsworkschefautomate",
                 "endpoint": {
@@ -70582,15 +71375,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "opsworks": {
-                "Value": "opsworks",
-                "endpoint": {
-                  "Value": "opsworks.us-west-2.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "opsworkschefautomate": {
                 "Value": "opsworkschefautomate",
                 "endpoint": {
diff --git a/moto/ssm/resources/services.json b/moto/ssm/resources/services.json
index fef5e7eb5..bead57d26 100644
--- a/moto/ssm/resources/services.json
+++ b/moto/ssm/resources/services.json
@@ -74,6 +74,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "access-analyzer.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -678,6 +687,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "acm.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -1013,6 +1031,15 @@
                   "Value": "https"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "acm-pca.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "https"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -1348,6 +1375,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "eu-west-1": {
+                "Value": "eu-west-1",
+                "endpoint": {
+                  "Value": "healthlake.eu-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "eu-west-2": {
                 "Value": "eu-west-2",
                 "endpoint": {
@@ -2095,6 +2131,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "apigateway.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -2729,6 +2774,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "mx-central-1": {
+                "Value": "mx-central-1",
+                "endpoint": {
+                  "Value": "apigateway.mx-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "sa-east-1": {
                 "Value": "sa-east-1",
                 "endpoint": {
@@ -2818,6 +2872,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "appconfig.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -3150,6 +3213,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "appconfigdata.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -5125,6 +5197,24 @@
               "Value": "https://aws.amazon.com/prometheus/"
             },
             "regions": {
+              "af-south-1": {
+                "Value": "af-south-1",
+                "endpoint": {
+                  "Value": "aps.af-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-east-1": {
+                "Value": "ap-east-1",
+                "endpoint": {
+                  "Value": "aps.ap-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -5170,6 +5260,24 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-southeast-5": {
+                "Value": "ap-southeast-5",
+                "endpoint": {
+                  "Value": "aps.ap-southeast-5.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "ap-southeast-7": {
+                "Value": "ap-southeast-7",
+                "endpoint": {
+                  "Value": "aps.ap-southeast-7.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ca-central-1": {
                 "Value": "ca-central-1",
                 "endpoint": {
@@ -5188,6 +5296,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "eu-central-2": {
+                "Value": "eu-central-2",
+                "endpoint": {
+                  "Value": "aps.eu-central-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "eu-north-1": {
                 "Value": "eu-north-1",
                 "endpoint": {
@@ -5197,6 +5314,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "eu-south-1": {
+                "Value": "eu-south-1",
+                "endpoint": {
+                  "Value": "aps.eu-south-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "eu-west-1": {
                 "Value": "eu-west-1",
                 "endpoint": {
@@ -5224,6 +5350,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "me-central-1": {
+                "Value": "me-central-1",
+                "endpoint": {
+                  "Value": "aps.me-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "sa-east-1": {
                 "Value": "sa-east-1",
                 "endpoint": {
@@ -5286,6 +5421,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "arc-zonal-shift.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -5609,6 +5753,9 @@
               "ap-east-1": {
                 "Value": "ap-east-1"
               },
+              "ap-east-2": {
+                "Value": "ap-east-2"
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1"
               },
@@ -6307,6 +6454,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "rds.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -6642,6 +6798,15 @@
                   "Value": "HTTPS, HTTP"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "autoscaling.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -7015,6 +7180,15 @@
                   "Value": "HTTPS, HTTP"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "phd.aws.amazon.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -7388,6 +7562,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "backup.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -7938,6 +8121,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "batch.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -10012,6 +10204,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "cloudcontrolapi.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -10608,6 +10809,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "cloudformation.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -10943,6 +11153,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "cloudfront.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -11905,6 +12124,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "cloudtrail.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -12455,6 +12683,15 @@
                   "Value": "HTTPS, HTTP"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "monitoring.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -16077,6 +16314,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "config.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -18054,6 +18300,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "datasync.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -19209,6 +19464,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "directconnect.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -19615,6 +19879,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "dlm.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -19950,6 +20223,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "dms.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -21220,6 +21502,15 @@
                   "Value": "HTTPS, HTTP"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "dynamodb.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -21552,6 +21843,15 @@
                   "Value": "HTTPS, HTTP"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "streams.dynamodb.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -21887,6 +22187,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "ec2.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -22222,6 +22531,15 @@
                   "Value": "HTTPS, HTTP"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "ec2.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -22557,6 +22875,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "ecr.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -22918,6 +23245,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "ecs.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -23253,6 +23589,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "elasticfilesystem.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -23588,6 +23933,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "eks.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -23920,6 +24274,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "eks-auth.ap-east-2.api.aws"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -24237,6 +24600,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "elasticache.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -24909,6 +25281,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "elasticloadbalancing.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -25244,6 +25625,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "elasticmapreduce.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -26254,6 +26644,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "es.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -26589,6 +26988,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "events.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -26921,6 +27329,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "events.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -27333,6 +27750,9 @@
               "ap-east-1": {
                 "Value": "ap-east-1"
               },
+              "ap-east-2": {
+                "Value": "ap-east-2"
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1"
               },
@@ -27719,6 +28139,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "firehose.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -32469,6 +32898,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "us-gov-east-1": {
+                "Value": "us-gov-east-1",
+                "endpoint": {
+                  "Value": "health.us-gov-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "us-gov-west-1": {
                 "Value": "us-gov-west-1",
                 "endpoint": {
@@ -32507,6 +32945,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "iam.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -33482,6 +33929,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "imagebuilder.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -37736,6 +38192,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "kinesis.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -38570,6 +39035,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "kms.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -39240,6 +39714,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "lambda.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -41435,6 +41918,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "logs.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -42786,6 +43278,9 @@
               "ap-east-1": {
                 "Value": "ap-east-1"
               },
+              "ap-east-2": {
+                "Value": "ap-east-2"
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1"
               },
@@ -46335,6 +46830,9 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-southeast-5": {
+                "Value": "ap-southeast-5"
+              },
               "ca-central-1": {
                 "Value": "ca-central-1",
                 "endpoint": {
@@ -48051,6 +48549,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "oam.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -48401,6 +48908,18 @@
                   "Value": "observabilityadmin.eu-west-1.amazonaws.com"
                 }
               },
+              "eu-west-2": {
+                "Value": "eu-west-2",
+                "endpoint": {
+                  "Value": "observabilityadmin.eu-west-2.amazonaws.com"
+                }
+              },
+              "eu-west-3": {
+                "Value": "eu-west-3",
+                "endpoint": {
+                  "Value": "observabilityadmin.eu-west-3.amazonaws.com"
+                }
+              },
               "us-east-1": {
                 "Value": "us-east-1",
                 "endpoint": {
@@ -48413,6 +48932,12 @@
                   "Value": "observabilityadmin.us-east-2.amazonaws.com"
                 }
               },
+              "us-west-1": {
+                "Value": "us-west-1",
+                "endpoint": {
+                  "Value": "observabilityadmin.us-west-1.amazonaws.com"
+                }
+              },
               "us-west-2": {
                 "Value": "us-west-2",
                 "endpoint": {
@@ -48668,62 +49193,6 @@
               }
             }
           },
-          "opsworks": {
-            "Value": "opsworks",
-            "longName": {
-              "Value": "AWS OpsWorks Stacks"
-            },
-            "marketingHomeURL": {
-              "Value": "https://aws.amazon.com/opsworks/stacks/"
-            },
-            "regions": {
-              "ap-southeast-1": {
-                "Value": "ap-southeast-1",
-                "endpoint": {
-                  "Value": "opsworks.ap-southeast-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "eu-central-1": {
-                "Value": "eu-central-1",
-                "endpoint": {
-                  "Value": "opsworks.eu-central-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "eu-west-1": {
-                "Value": "eu-west-1",
-                "endpoint": {
-                  "Value": "opsworks.eu-west-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "us-east-1": {
-                "Value": "us-east-1",
-                "endpoint": {
-                  "Value": "opsworks.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "us-west-2": {
-                "Value": "us-west-2",
-                "endpoint": {
-                  "Value": "opsworks.us-west-2.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              }
-            }
-          },
           "opsworkschefautomate": {
             "Value": "opsworkschefautomate",
             "longName": {
@@ -48935,6 +49404,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "organizations.us-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -50533,6 +51011,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "pi.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -51926,6 +52413,9 @@
               "ap-east-1": {
                 "Value": "ap-east-1"
               },
+              "ap-east-2": {
+                "Value": "ap-east-2"
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1"
               },
@@ -52694,6 +53184,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "ram.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -53026,6 +53525,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "rbin.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -53361,6 +53869,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "rds.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -53844,6 +54361,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "redshift.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -55493,6 +56019,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "resource-groups.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -55825,6 +56360,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "tagging.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -56240,6 +56784,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "rolesanywhere.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -56673,6 +57226,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "route53.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -56996,6 +57558,9 @@
               "ap-east-1": {
                 "Value": "ap-east-1"
               },
+              "ap-east-2": {
+                "Value": "ap-east-2"
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1"
               },
@@ -57124,6 +57689,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "route53-recovery-control-config.us-west-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -57723,6 +58297,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "route53resolver.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -58318,6 +58901,15 @@
                   "Value": "HTTPS, HTTP"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "s3.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -60613,6 +61205,24 @@
                   "Value": "HTTPS"
                 }
               },
+              "cn-north-1": {
+                "Value": "cn-north-1",
+                "endpoint": {
+                  "Value": "scheduler.cn-north-1.amazonaws.com.cn"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "cn-northwest-1": {
+                "Value": "cn-northwest-1",
+                "endpoint": {
+                  "Value": "scheduler.cn-northwest-1.amazonaws.com.cn"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "eu-central-1": {
                 "Value": "eu-central-1",
                 "endpoint": {
@@ -61138,6 +61748,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "secretsmanager.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -62342,6 +62961,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "servicequotas.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -63263,6 +63891,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "servicediscovery.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -65005,6 +65642,15 @@
                   "Value": "HTTPS, HTTP"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "sns.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -65492,6 +66138,15 @@
                   "Value": "HTTPS, HTTP"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "sqs.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS, HTTP"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -65827,6 +66482,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "ssm.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -67192,6 +67856,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "states.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -67859,6 +68532,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "sts.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -68194,6 +68876,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "support.us-east-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -68564,6 +69255,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "swf.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -68896,6 +69596,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "synthetics.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -70485,6 +71194,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "ec2.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -70972,6 +71690,9 @@
               "ap-east-1": {
                 "Value": "ap-east-1"
               },
+              "ap-east-2": {
+                "Value": "ap-east-2"
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1"
               },
@@ -71741,6 +72462,9 @@
               "ap-east-1": {
                 "Value": "ap-east-1"
               },
+              "ap-east-2": {
+                "Value": "ap-east-2"
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1"
               },
@@ -72135,6 +72859,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "ec2.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {
@@ -73876,6 +74609,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-east-2": {
+                "Value": "ap-east-2",
+                "endpoint": {
+                  "Value": "xray.ap-east-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-northeast-1": {
                 "Value": "ap-northeast-1",
                 "endpoint": {


Test patch:
diff --git a/tests/test_sns/__init__.py b/tests/test_sns/__init__.py
index 93b079b76..be9f58628 100644
--- a/tests/test_sns/__init__.py
+++ b/tests/test_sns/__init__.py
@@ -1,11 +1,14 @@
+import json
 import os
 from functools import wraps
 from unittest import SkipTest
+from uuid import uuid4
 
 import boto3
 import botocore
 
 from moto import mock_aws
+from tests import allow_aws_request
 
 
 def sns_aws_verified(func):
@@ -48,3 +51,100 @@ def sns_aws_verified(func):
         return resp
 
     return pagination_wrapper
+
+
+def sns_sqs_aws_verified(fifo_topic: bool = False, fifo_queue: bool = False):
+    """
+    Function that is verified to work against AWS.
+    Can be run against AWS at any time by setting:
+      MOTO_TEST_ALLOW_AWS_REQUEST=true
+
+    If this environment variable is not set, the function runs in a `mock_aws` context.
+
+    This decorator will:
+      - Create an SNS topic + SQS queue
+      - Run the test, passing both names as an argument
+      - Delete both resources
+    """
+
+    def inner(func):
+        @wraps(func)
+        def pagination_wrapper(**kwargs):
+            topic_name = f"test_topic_{str(uuid4())[0:6]}" + (
+                ".fifo" if fifo_topic else ""
+            )
+            kwargs["topic_name"] = topic_name
+            queue_name = f"test_queue_{str(uuid4())[0:6]}" + (
+                ".fifo" if fifo_queue else ""
+            )
+            kwargs["queue_name"] = queue_name
+
+            def create_resources_and_test():
+                client = boto3.client("sns", region_name="us-east-1")
+                sqs_client = boto3.resource("sqs", region_name="us-east-1")
+
+                topic_args = {}
+                if fifo_topic:
+                    topic_args["Attributes"] = {
+                        "FifoTopic": "true",
+                        "ContentBasedDeduplication": "true",
+                    }
+                topic_arn = client.create_topic(Name=topic_name, **topic_args)[
+                    "TopicArn"
+                ]
+                kwargs["topic_arn"] = topic_arn
+
+                queue_args = {}
+                if fifo_queue:
+                    queue_args["Attributes"] = {
+                        "FifoQueue": "true",
+                        "ContentBasedDeduplication": "true",
+                    }
+                queue = sqs_client.create_queue(QueueName=queue_name, **queue_args)
+
+                identity = boto3.client("sts", "us-east-1").get_caller_identity()
+                kwargs["queue_arn"] = (
+                    f"arn:aws:sqs:us-east-1:{identity['Account']}:{queue_name}"
+                )
+
+                # Give permissions to the queue
+                policy = {
+                    "Version": "2012-10-17",
+                    "Statement": [
+                        {
+                            "Effect": "Allow",
+                            "Principal": {"Service": "sns.amazonaws.com"},
+                            "Action": "sqs:SendMessage",
+                            "Resource": kwargs["queue_arn"],
+                            "Condition": {"ArnEquals": {"aws:SourceArn": topic_arn}},
+                        }
+                    ],
+                }
+                queue.set_attributes(Attributes={"Policy": json.dumps(policy)})
+
+                subscription_arn = None
+                try:
+                    subscription_arn = client.subscribe(
+                        TopicArn=topic_arn,
+                        Protocol="sqs",
+                        Endpoint=kwargs["queue_arn"],
+                    )["SubscriptionArn"]
+
+                    resp = func(**kwargs)
+                finally:
+                    if subscription_arn:
+                        client.unsubscribe(SubscriptionArn=subscription_arn)
+                    client.delete_topic(TopicArn=topic_arn)
+                    queue.delete()
+
+                return resp
+
+            if allow_aws_request():
+                return create_resources_and_test()
+            else:
+                with mock_aws():
+                    return create_resources_and_test()
+
+        return pagination_wrapper
+
+    return inner
diff --git a/tests/test_sns/test_publishing_boto3.py b/tests/test_sns/test_publishing_boto3.py
index 5ef1a99aa..46950758f 100644
--- a/tests/test_sns/test_publishing_boto3.py
+++ b/tests/test_sns/test_publishing_boto3.py
@@ -6,12 +6,12 @@ import boto3
 import pytest
 import requests
 from botocore.exceptions import ClientError
-from freezegun import freeze_time
 
 from moto import mock_aws, settings
 from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 from moto.core.models import responses_mock
 from moto.sns import sns_backends
+from tests.test_sns import sns_sqs_aws_verified
 
 
 def to_comparable_dicts(list_entry: list):
@@ -22,31 +22,23 @@ def to_comparable_dicts(list_entry: list):
     return set(list_entry)
 
 
-@mock_aws
-def test_publish_to_sqs():
+@pytest.mark.aws_verified
+@sns_sqs_aws_verified()
+def test_publish_to_sqs(
+    topic_name=None, topic_arn=None, queue_name=None, queue_arn=None
+):
     conn = boto3.client("sns", region_name="us-east-1")
-    conn.create_topic(Name="some-topic")
-    response = conn.list_topics()
-    topic_arn = response["Topics"][0]["TopicArn"]
 
     sqs_conn = boto3.resource("sqs", region_name="us-east-1")
-    sqs_conn.create_queue(QueueName="test-queue")
 
-    conn.subscribe(
-        TopicArn=topic_arn,
-        Protocol="sqs",
-        Endpoint=f"arn:aws:sqs:us-east-1:{ACCOUNT_ID}:test-queue",
-    )
     message = "my message"
-    with freeze_time("2015-01-01 12:00:00"):
-        published_message = conn.publish(
-            TopicArn=topic_arn, Message=message, Subject="my subject"
-        )
+    published_message = conn.publish(
+        TopicArn=topic_arn, Message=message, Subject="my subject"
+    )
     published_message_id = published_message["MessageId"]
 
-    queue = sqs_conn.get_queue_by_name(QueueName="test-queue")
-    with freeze_time("2015-01-01 12:00:01"):
-        messages = queue.receive_messages(MaxNumberOfMessages=1)
+    queue = sqs_conn.get_queue_by_name(QueueName=queue_name)
+    messages = queue.receive_messages(MaxNumberOfMessages=1)
     acquired_message = json.loads(messages[0].body)
 
     assert acquired_message["Message"] == "my message"
@@ -73,31 +65,61 @@ def test_publish_to_sqs_raw():
     )
 
     message = "my message"
-    with freeze_time("2015-01-01 12:00:00"):
-        topic.publish(Message=message)
+    topic.publish(Message=message)
 
-    with freeze_time("2015-01-01 12:00:01"):
-        messages = queue.receive_messages(MaxNumberOfMessages=1)
+    messages = queue.receive_messages(MaxNumberOfMessages=1)
     assert messages[0].body == message
 
 
-@mock_aws
-def test_publish_to_sqs_fifo():
+@pytest.mark.aws_verified
+@sns_sqs_aws_verified(fifo_topic=True, fifo_queue=True)
+def test_publish_to_sqs_fifo(
+    topic_name=None, topic_arn=None, queue_name=None, queue_arn=None
+):
     sns = boto3.resource("sns", region_name="us-east-1")
-    topic = sns.create_topic(
-        Name="topic.fifo",
-        Attributes={"FifoTopic": "true", "ContentBasedDeduplication": "true"},
-    )
+    sqs = boto3.resource("sqs", region_name="us-east-1")
+    topic = sns.Topic(topic_arn)
+
+    topic.publish(Message="message", MessageGroupId="message_group_id")
 
+    queue = sqs.get_queue_by_name(QueueName=queue_name)
+    messages = queue.receive_messages(MaxNumberOfMessages=1)
+    acquired_message = json.loads(messages[0].body)
+    assert acquired_message["Message"] == "message"
+
+
+@pytest.mark.aws_verified
+@sns_sqs_aws_verified(fifo_topic=True, fifo_queue=False)
+def test_publish_from_sns_fifo_to_standard_sqs(
+    topic_name=None, topic_arn=None, queue_name=None, queue_arn=None
+):
+    sns = boto3.resource("sns", region_name="us-east-1")
     sqs = boto3.resource("sqs", region_name="us-east-1")
-    queue = sqs.create_queue(
-        QueueName="queue.fifo",
-        Attributes={"FifoQueue": "true", "ContentBasedDeduplication": "true"},
-    )
-    topic.subscribe(Protocol="sqs", Endpoint=queue.attributes["QueueArn"])
+    topic = sns.Topic(topic_arn)
 
     topic.publish(Message="message", MessageGroupId="message_group_id")
 
+    queue = sqs.get_queue_by_name(QueueName=queue_name)
+    messages = queue.receive_messages(MaxNumberOfMessages=1)
+    acquired_message = json.loads(messages[0].body)
+    assert acquired_message["Message"] == "message"
+
+
+@pytest.mark.aws_verified
+def test_publish_from_standard_sns_to_fifo_sqs():
+    def x(topic_arn="", topic_name="", queue_arn="", queue_name=""):
+        pass
+
+    with pytest.raises(ClientError) as exc:
+        func = sns_sqs_aws_verified(fifo_topic=False, fifo_queue=True)
+        func(x)()
+    err = exc.value.response["Error"]
+    assert err["Code"] == "InvalidParameter"
+    assert (
+        err["Message"]
+        == "Invalid parameter: Invalid parameter: Endpoint Reason: FIFO SQS Queues can not be subscribed to standard SNS topics"
+    )
+
 
 @mock_aws
 def test_publish_to_sqs_fifo_with_deduplication_id():
@@ -120,18 +142,16 @@ def test_publish_to_sqs_fifo_with_deduplication_id():
     )
 
     message = '{"msg": "hello"}'
-    with freeze_time("2015-01-01 12:00:00"):
-        topic.publish(
-            Message=message,
-            MessageGroupId="message_group_id",
-            MessageDeduplicationId="message_deduplication_id",
-        )
+    topic.publish(
+        Message=message,
+        MessageGroupId="message_group_id",
+        MessageDeduplicationId="message_deduplication_id",
+    )
 
-    with freeze_time("2015-01-01 12:00:01"):
-        messages = queue.receive_messages(
-            MaxNumberOfMessages=1,
-            AttributeNames=["MessageDeduplicationId", "MessageGroupId"],
-        )
+    messages = queue.receive_messages(
+        MaxNumberOfMessages=1,
+        AttributeNames=["MessageDeduplicationId", "MessageGroupId"],
+    )
     assert messages[0].attributes["MessageGroupId"] == "message_group_id"
     assert (
         messages[0].attributes["MessageDeduplicationId"] == "message_deduplication_id"
@@ -160,18 +180,16 @@ def test_publish_to_sqs_fifo_raw_with_deduplication_id():
     )
 
     message = "my message"
-    with freeze_time("2015-01-01 12:00:00"):
-        topic.publish(
-            Message=message,
-            MessageGroupId="message_group_id",
-            MessageDeduplicationId="message_deduplication_id",
-        )
+    topic.publish(
+        Message=message,
+        MessageGroupId="message_group_id",
+        MessageDeduplicationId="message_deduplication_id",
+    )
 
-    with freeze_time("2015-01-01 12:00:01"):
-        messages = queue.receive_messages(
-            MaxNumberOfMessages=1,
-            AttributeNames=["MessageDeduplicationId", "MessageGroupId"],
-        )
+    messages = queue.receive_messages(
+        MaxNumberOfMessages=1,
+        AttributeNames=["MessageDeduplicationId", "MessageGroupId"],
+    )
     assert messages[0].attributes["MessageGroupId"] == "message_group_id"
     assert (
         messages[0].attributes["MessageDeduplicationId"] == "message_deduplication_id"
@@ -412,15 +430,13 @@ def test_publish_to_sqs_dump_json():
         },
         sort_keys=True,
     )
-    with freeze_time("2015-01-01 12:00:00"):
-        published_message = conn.publish(
-            TopicArn=topic_arn, Message=message, Subject="my subject"
-        )
+    published_message = conn.publish(
+        TopicArn=topic_arn, Message=message, Subject="my subject"
+    )
     published_message_id = published_message["MessageId"]
 
     queue = sqs_conn.get_queue_by_name(QueueName="test-queue")
-    with freeze_time("2015-01-01 12:00:01"):
-        messages = queue.receive_messages(MaxNumberOfMessages=1)
+    messages = queue.receive_messages(MaxNumberOfMessages=1)
 
     acquired_message = json.loads(messages[0].body)
     assert json.loads(acquired_message["Message"]) == json.loads(message)
@@ -447,15 +463,13 @@ def test_publish_to_sqs_in_different_region():
     )
 
     message = "my message"
-    with freeze_time("2015-01-01 12:00:00"):
-        published_message = conn.publish(
-            TopicArn=topic_arn, Message=message, Subject="my subject"
-        )
+    published_message = conn.publish(
+        TopicArn=topic_arn, Message=message, Subject="my subject"
+    )
     published_message_id = published_message["MessageId"]
 
     queue = sqs_conn.get_queue_by_name(QueueName="test-queue")
-    with freeze_time("2015-01-01 12:00:01"):
-        messages = queue.receive_messages(MaxNumberOfMessages=1)
+    messages = queue.receive_messages(MaxNumberOfMessages=1)
 
     acquired_message = json.loads(messages[0].body)
     assert acquired_message["MessageId"] == published_message_id
@@ -465,7 +479,6 @@ def test_publish_to_sqs_in_different_region():
     assert acquired_message["Subject"] == "my subject"
 
 
-@freeze_time("2013-01-01")
 @mock_aws
 def test_publish_to_http():
     if settings.TEST_SERVER_MODE:
@@ -519,18 +532,23 @@ def test_publish_subject():
     )
     message = "my message"
     subject1 = "test subject"
-    subject2 = "test subject" * 20
-    with freeze_time("2015-01-01 12:00:00"):
-        conn.publish(TopicArn=topic_arn, Message=message, Subject=subject1)
+    conn.publish(TopicArn=topic_arn, Message=message, Subject=subject1)
 
-    # Just that it doesnt error is a pass
-    try:
-        with freeze_time("2015-01-01 12:00:00"):
-            conn.publish(TopicArn=topic_arn, Message=message, Subject=subject2)
-    except ClientError as err:
-        assert err.response["Error"]["Code"] == "InvalidParameter"
-    else:
-        raise RuntimeError("Should have raised an InvalidParameter exception")
+
+@mock_aws
+def test_publish_large_subject():
+    conn = boto3.client("sns", region_name="us-east-1")
+    conn.create_topic(Name="some-topic")
+    response = conn.list_topics()
+    topic_arn = response["Topics"][0]["TopicArn"]
+
+    large_subject = "test subject" * 20
+
+    with pytest.raises(ClientError) as exc:
+        conn.publish(TopicArn=topic_arn, Message="message", Subject=large_subject)
+    err = exc.value.response["Error"]
+    assert err["Code"] == "InvalidParameter"
+    assert err["Message"] == "Subject must be less than 100 characters"
 
 
 @mock_aws
@@ -549,12 +567,10 @@ def test_publish_null_subject():
         Endpoint=f"arn:aws:sqs:us-east-1:{ACCOUNT_ID}:test-queue",
     )
     message = "my message"
-    with freeze_time("2015-01-01 12:00:00"):
-        conn.publish(TopicArn=topic_arn, Message=message)
+    conn.publish(TopicArn=topic_arn, Message=message)
 
     queue = sqs_conn.get_queue_by_name(QueueName="test-queue")
-    with freeze_time("2015-01-01 12:00:01"):
-        messages = queue.receive_messages(MaxNumberOfMessages=1)
+    messages = queue.receive_messages(MaxNumberOfMessages=1)
 
     acquired_message = json.loads(messages[0].body)
     assert acquired_message["Message"] == message
diff --git a/tests/test_sns/test_subscriptions_boto3.py b/tests/test_sns/test_subscriptions_boto3.py
index 1ed7d6b1b..c851fbdbe 100644
--- a/tests/test_sns/test_subscriptions_boto3.py
+++ b/tests/test_sns/test_subscriptions_boto3.py
@@ -10,6 +10,8 @@ from moto.sns.models import (
     DEFAULT_EFFECTIVE_DELIVERY_POLICY,
     DEFAULT_PAGE_SIZE,
 )
+from tests import aws_verified
+from tests.test_sns import sns_sqs_aws_verified
 
 
 @mock_aws
@@ -26,6 +28,60 @@ def test_subscribe_sms():
     assert "SubscriptionArn" in resp
 
 
+@pytest.mark.aws_verified
+@aws_verified
+def test_subscribe_unknown_topic():
+    identity = boto3.client("sts", "us-east-1").get_caller_identity()
+    account_id = identity["Account"]
+    client = boto3.client("sns", region_name="us-east-1")
+    arn = f"arn:aws:sns:us-east-1:{account_id}:some-topic"
+
+    with pytest.raises(ClientError) as exc:
+        client.subscribe(TopicArn=arn, Protocol="sqs", Endpoint="asdf")
+    err = exc.value.response["Error"]
+    assert err["Code"] == "NotFound"
+    assert err["Message"] == "Topic does not exist"
+
+
+@pytest.mark.aws_verified
+@sns_sqs_aws_verified()
+def test_subscribe_unknown_sqs_queue(
+    topic_name=None, topic_arn=None, queue_name=None, queue_arn=None
+):
+    client = boto3.client("sns", region_name="us-east-1")
+
+    # Subscribing to an unknown queue is not a problem
+    unknown_queue = queue_arn.replace(queue_name, "unknown")
+    subscription_arn = client.subscribe(
+        TopicArn=topic_arn, Protocol="sqs", Endpoint=unknown_queue
+    )["SubscriptionArn"]
+
+    # Clean up
+    client.unsubscribe(SubscriptionArn=subscription_arn)
+
+    # Subscribing to something that is not an ARN is a problem though
+    with pytest.raises(ClientError) as exc:
+        client.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint="unknown")
+    err = exc.value.response["Error"]
+    assert err["Code"] == "InvalidParameter"
+    assert err["Message"] == "Invalid parameter: SQS endpoint ARN"
+
+
+@pytest.mark.aws_verified
+@sns_sqs_aws_verified()
+def test_subscribe_sqs_queue_url(
+    topic_name=None, topic_arn=None, queue_name=None, queue_arn=None
+):
+    client = boto3.client("sns", region_name="us-east-1")
+
+    queue = boto3.resource("sqs", "us-east-1").Queue(queue_name)
+    with pytest.raises(ClientError) as exc:
+        client.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint=queue.url)
+    err = exc.value.response["Error"]
+    assert err["Code"] == "InvalidParameter"
+    assert err["Message"] == "Invalid parameter: SQS endpoint ARN"
+
+
 @mock_aws
 def test_double_subscription():
     client = boto3.client("sns", region_name="us-east-1")
@@ -34,10 +90,10 @@ def test_double_subscription():
     arn = resp["TopicArn"]
 
     resp1 = client.subscribe(
-        TopicArn=arn, Protocol="sqs", Endpoint="arn:aws:sqs:elasticmq:000000000000:foo"
+        TopicArn=arn, Protocol="sqs", Endpoint="arn:aws:sqs:us-east-1:000000000000:foo"
     )
     resp2 = client.subscribe(
-        TopicArn=arn, Protocol="sqs", Endpoint="arn:aws:sqs:elasticmq:000000000000:foo"
+        TopicArn=arn, Protocol="sqs", Endpoint="arn:aws:sqs:us-east-1:000000000000:foo"
     )
 
     assert resp1["SubscriptionArn"] == resp2["SubscriptionArn"]
@@ -316,17 +372,16 @@ def test_delete_subscriptions_on_delete_topic():
     sqs = boto3.client("sqs", region_name="us-east-1")
     conn = boto3.client("sns", region_name="us-east-1")
 
-    queue = sqs.create_queue(QueueName="test-queue")
+    sqs.create_queue(QueueName="test-queue")
     topic = conn.create_topic(Name="some-topic")
 
-    conn.subscribe(
-        TopicArn=topic.get("TopicArn"), Protocol="sqs", Endpoint=queue.get("QueueUrl")
-    )
+    queue_url = f"arn:aws:sqs:us-east-1:{ACCOUNT_ID}:test-queue"
+    conn.subscribe(TopicArn=topic["TopicArn"], Protocol="sqs", Endpoint=queue_url)
     subscriptions = conn.list_subscriptions()["Subscriptions"]
 
     assert len(subscriptions) == 1
 
-    conn.delete_topic(TopicArn=topic.get("TopicArn"))
+    conn.delete_topic(TopicArn=topic["TopicArn"])
 
     subscriptions = conn.list_subscriptions()["Subscriptions"]
     assert len(subscriptions) == 0