Repository: getmoto/moto
Pull request #7450 (2024-03-09 16:28:55)

DynamoDB: raise validation error on consistent read on GSI
`ConsistentRead` is not supported on global secondary indexes for Query and Scan operations. Adding validation.

`ConsistentRead` is still supported on local secondary indexes and on the primary key, so this behaviour must not change.



Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0bffcde95..e9b5e1ebc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,54 @@
 Moto Changelog
 ==============
 
+5.0.3
+-----
+Docker Digest for 5.0.3: _sha256:032d8ead42f289d9700e9bc844c6d264575ad11b3f6c22cc76d65ff638c8c7bd_
+
+    General:
+        * New configuration options for:
+          - Passing URL's through the proxy
+          - Configuring DOcker-less services in ServerMode
+          See http://docs.getmoto.org/en/latest/docs/configuration/index.html
+
+    New Services:
+        * Route53Domains:
+            * delete_domain()
+            * list_domains()
+            * list_operations()
+            * register_domain()
+            * update_domain_nameservers()
+
+    New Methods:
+        * CostExplorer:
+            * get_cost_and_usage()
+
+        * ECR:
+            * get_registry_scanning_configuration()
+
+    Miscellaneous:
+        * ApiGateway: update_usage_plan() now supports adding apiStages
+        * Athena: get_query_execution() now returns exact OutputLocation file
+        * Autoscaling: describe_auto_scaling_groups() now supports the filters-argument
+        * CloudFront: create_distribution() now supports CustomHeaders
+        * CloudFront: update_distribution() now handles updates to DistributionConfig correctly
+        * CloudFormation - Now supports creation and deletion of AWS::EMR::Cluster
+        * CloudFormation - Now supports creation and deletion of AWS::EMR::SecurityConfiguration
+        * CloudFormation - Now supports creation and deletion of AWS::EFS::AccessPoint
+        * CloudFormation - Now supports creation and deletion of AWS::EFS::FileSystem
+        * CloudFormation - Now supports creation and deletion of AWS::EMR::InstanceGroupConfig
+        * CloudFormation - Now supports deletion of AWS::Logs::LogGroup
+        * CloudFormation: delete_stack() now handles resource dependencies better
+        * CloudWatch: put_metric_data() now supports large (compressed) requests
+        * CognitoIDP: admin_initiate_auth() and respond_to_auth_challenge() now support SMS_MFA
+        * DynamoDB: transact_write_items() now raises ValidationException when putting and deleting the same item
+        * EC2: authorize_security_group_egress/_ingress now support the TagSpecifications-argument
+        * EC2: describe_security_group_rules() now supports Tag-filters
+        * S3: EventBridge notifications are now supported for ObjectCreated:POST/COPY/MULTIPART_UPLOAD and ObjectDeleted
+        * SNS: subscribe() now adds support the `$or`, `equals-ignore-case` and `suffix` features in a FilterPolicy 
+        * SQS: send_message() should respect DelaySeconds of 0
+
+
 5.0.2
 -----
 Docker Digest for 5.0.2: _sha256:89cc6c764d714bf76e592a61f0c06fd142f672085e1dd3a53eb734aaeb4e14e2_
diff --git a/IMPLEMENTATION_COVERAGE.md b/IMPLEMENTATION_COVERAGE.md
index 7e83f4034..6d28d4849 100644
--- a/IMPLEMENTATION_COVERAGE.md
+++ b/IMPLEMENTATION_COVERAGE.md
@@ -735,7 +735,7 @@
 
 ## ce
 <details>
-<summary>21% implemented</summary>
+<summary>20% implemented</summary>
 
 - [ ] create_anomaly_monitor
 - [ ] create_anomaly_subscription
@@ -747,6 +747,7 @@
 - [ ] get_anomalies
 - [ ] get_anomaly_monitors
 - [ ] get_anomaly_subscriptions
+- [ ] get_approximate_usage_records
 - [X] get_cost_and_usage
 - [ ] get_cost_and_usage_with_resources
 - [ ] get_cost_categories
@@ -2659,7 +2660,7 @@
 
 ## ecr
 <details>
-<summary>65% implemented</summary>
+<summary>67% implemented</summary>
 
 - [ ] batch_check_layer_availability
 - [X] batch_delete_image
@@ -3339,12 +3340,11 @@
 
 ## firehose
 <details>
-<summary>85% implemented</summary>
+<summary>100% implemented</summary>
 
 - [X] create_delivery_stream
 - [X] delete_delivery_stream
 - [X] describe_delivery_stream
-- [ ] get_kinesis_stream
 - [X] list_delivery_streams
 - [X] list_tags_for_delivery_stream
 - [X] put_record
@@ -3354,7 +3354,6 @@
 - [X] tag_delivery_stream
 - [X] untag_delivery_stream
 - [X] update_destination
-- [ ] verify_resources_exist_for_tagris
 </details>
 
 ## forecast
@@ -4922,6 +4921,7 @@
 - [ ] purchase_offering
 - [ ] reboot_input_device
 - [ ] reject_input_device_transfer
+- [ ] restart_channel_pipelines
 - [X] start_channel
 - [ ] start_input_device
 - [ ] start_input_device_maintenance_window
@@ -6216,6 +6216,66 @@
 - [ ] update_stream_processor
 </details>
 
+## resiliencehub
+<details>
+<summary>18% implemented</summary>
+
+- [ ] add_draft_app_version_resource_mappings
+- [ ] batch_update_recommendation_status
+- [X] create_app
+- [ ] create_app_version_app_component
+- [ ] create_app_version_resource
+- [ ] create_recommendation_template
+- [X] create_resiliency_policy
+- [ ] delete_app
+- [ ] delete_app_assessment
+- [ ] delete_app_input_source
+- [ ] delete_app_version_app_component
+- [ ] delete_app_version_resource
+- [ ] delete_recommendation_template
+- [ ] delete_resiliency_policy
+- [X] describe_app
+- [ ] describe_app_assessment
+- [ ] describe_app_version
+- [ ] describe_app_version_app_component
+- [ ] describe_app_version_resource
+- [ ] describe_app_version_resources_resolution_status
+- [ ] describe_app_version_template
+- [ ] describe_draft_app_version_resources_import_status
+- [X] describe_resiliency_policy
+- [ ] import_resources_to_draft_app_version
+- [ ] list_alarm_recommendations
+- [ ] list_app_assessment_compliance_drifts
+- [X] list_app_assessments
+- [ ] list_app_component_compliances
+- [ ] list_app_component_recommendations
+- [ ] list_app_input_sources
+- [ ] list_app_version_app_components
+- [ ] list_app_version_resource_mappings
+- [ ] list_app_version_resources
+- [ ] list_app_versions
+- [X] list_apps
+- [ ] list_recommendation_templates
+- [X] list_resiliency_policies
+- [ ] list_sop_recommendations
+- [ ] list_suggested_resiliency_policies
+- [X] list_tags_for_resource
+- [ ] list_test_recommendations
+- [ ] list_unsupported_app_version_resources
+- [ ] publish_app_version
+- [ ] put_draft_app_version_template
+- [ ] remove_draft_app_version_resource_mappings
+- [ ] resolve_app_version_resources
+- [ ] start_app_assessment
+- [X] tag_resource
+- [X] untag_resource
+- [ ] update_app
+- [ ] update_app_version
+- [ ] update_app_version_app_component
+- [ ] update_app_version_resource
+- [ ] update_resiliency_policy
+</details>
+
 ## resource-groups
 <details>
 <summary>61% implemented</summary>
@@ -6393,6 +6453,46 @@
 - [ ] update_traffic_policy_instance
 </details>
 
+## route53domains
+<details>
+<summary>14% implemented</summary>
+
+- [ ] accept_domain_transfer_from_another_aws_account
+- [ ] associate_delegation_signer_to_domain
+- [ ] cancel_domain_transfer_to_another_aws_account
+- [ ] check_domain_availability
+- [ ] check_domain_transferability
+- [X] delete_domain
+- [ ] delete_tags_for_domain
+- [ ] disable_domain_auto_renew
+- [ ] disable_domain_transfer_lock
+- [ ] disassociate_delegation_signer_from_domain
+- [ ] enable_domain_auto_renew
+- [ ] enable_domain_transfer_lock
+- [ ] get_contact_reachability_status
+- [ ] get_domain_detail
+- [ ] get_domain_suggestions
+- [ ] get_operation_detail
+- [X] list_domains
+- [X] list_operations
+- [ ] list_prices
+- [ ] list_tags_for_domain
+- [ ] push_domain
+- [X] register_domain
+- [ ] reject_domain_transfer_from_another_aws_account
+- [ ] renew_domain
+- [ ] resend_contact_reachability_email
+- [ ] resend_operation_authorization
+- [ ] retrieve_domain_auth_code
+- [ ] transfer_domain
+- [ ] transfer_domain_to_another_aws_account
+- [ ] update_domain_contact
+- [ ] update_domain_contact_privacy
+- [X] update_domain_nameservers
+- [ ] update_tags_for_domain
+- [ ] view_billing
+</details>
+
 ## route53resolver
 <details>
 <summary>27% implemented</summary>
@@ -6469,7 +6569,7 @@
 
 ## s3
 <details>
-<summary>66% implemented</summary>
+<summary>68% implemented</summary>
 
 - [X] abort_multipart_upload
 - [X] complete_multipart_upload
@@ -6565,8 +6665,10 @@
 - [X] put_object_retention
 - [X] put_object_tagging
 - [X] put_public_access_block
-- [ ] restore_object
+- [X] restore_object
 - [X] select_object_content
+- [X] upload_file
+- [X] upload_fileobj
 - [X] upload_part
 - [X] upload_part_copy
 - [ ] write_get_object_response
@@ -7945,6 +8047,7 @@
 - bedrock-runtime
 - billingconductor
 - braket
+- chatbot
 - chime
 - chime-sdk-identity
 - chime-sdk-media-pipelines
@@ -8116,13 +8219,11 @@
 - rbin
 - redshift-serverless
 - repostspace
-- resiliencehub
 - resource-explorer-2
 - rolesanywhere
 - route53-recovery-cluster
 - route53-recovery-control-config
 - route53-recovery-readiness
-- route53domains
 - rum
 - s3outposts
 - sagemaker-a2i-runtime
diff --git a/docs/docs/services/ce.rst b/docs/docs/services/ce.rst
index bd609ebb3..ace021264 100644
--- a/docs/docs/services/ce.rst
+++ b/docs/docs/services/ce.rst
@@ -38,6 +38,7 @@ ce
 - [ ] get_anomalies
 - [ ] get_anomaly_monitors
 - [ ] get_anomaly_subscriptions
+- [ ] get_approximate_usage_records
 - [X] get_cost_and_usage
   
         There is no validation yet on any of the input parameters.
diff --git a/docs/docs/services/cf.rst b/docs/docs/services/cf.rst
index 86d7797bc..730d31db1 100644
--- a/docs/docs/services/cf.rst
+++ b/docs/docs/services/cf.rst
@@ -113,7 +113,11 @@ Please let us know if you'd like support for a resource not yet listed here.
   +---------------------------------------+--------+--------+--------+----------------------------------------+
   |AWS::ECS::TaskDefinition               |    x   |    x   |        | - [ ] TaskDefinitionArn                |
   +---------------------------------------+--------+--------+--------+----------------------------------------+
-  |AWS::EFS::FileSystem                   |    x   |    x   |    x   | - [ ] FileSystemId                     |
+  |AWS::EFS::AccessPoint                  |    x   |        |        | - [ ] AccessPointId                    |
+  +---------------------------------------+--------+--------+--------+ - [ ] Arn                              |
+  |                                       |        |        |        |                                        |
+  +---------------------------------------+--------+--------+--------+----------------------------------------+
+  |AWS::EFS::FileSystem                   |    x   |        |    x   | - [ ] FileSystemId                     |
   +---------------------------------------+--------+--------+--------+ - [ ] Arn                              |
   |                                       |        |        |        |                                        |
   +---------------------------------------+--------+--------+--------+----------------------------------------+
@@ -121,7 +125,9 @@ Please let us know if you'd like support for a resource not yet listed here.
   +---------------------------------------+--------+--------+--------+ - [ ] Id                               |
   |                                       |        |        |        |                                        |
   +---------------------------------------+--------+--------+--------+----------------------------------------+
-  |AWS::EMR::Cluster                      |    x   |        |        | - [ ] MasterPublicDNS                  |
+  |AWS::EMR::Cluster                      |    x   |        |    x   | - [ ] MasterPublicDNS                  |
+  +---------------------------------------+--------+--------+--------+----------------------------------------+
+  |AWS::EMR::SecurityConfiguration        |    x   |        |    x   |                                        |
   +---------------------------------------+--------+--------+--------+----------------------------------------+
   |AWS::Events::Archive                   |    x   |    x   |        | - [x] Arn                              |
   +---------------------------------------+--------+--------+--------+----------------------------------------+
@@ -148,7 +154,7 @@ Please let us know if you'd like support for a resource not yet listed here.
   |AWS::IAM::Policy                       |        |        |        | - [ ] Id                               |
   +---------------------------------------+--------+--------+--------+----------------------------------------+
   |AWS::IAM::Role                         |    x   |        |    x   | - [x] Arn                              |
-  +---------------------------------------+--------+--------+--------+ - [ ] RoleId                           |
+  +---------------------------------------+--------+--------+--------+ - [x] RoleId                           |
   |                                       |        |        |        |                                        |
   +---------------------------------------+--------+--------+--------+----------------------------------------+
   |AWS::IAM::User                         |    x   |    x   |    x   | - [x] Arn                              |
diff --git a/docs/docs/services/firehose.rst b/docs/docs/services/firehose.rst
index ec59a4e9c..662159780 100644
--- a/docs/docs/services/firehose.rst
+++ b/docs/docs/services/firehose.rst
@@ -33,7 +33,6 @@ firehose
         are not currently processed/implemented.
         
 
-- [ ] get_kinesis_stream
 - [X] list_delivery_streams
   Return list of delivery streams in alphabetic order of names.
 
@@ -55,5 +54,4 @@ firehose
   Removes tags from specified delivery stream.
 
 - [X] update_destination
-- [ ] verify_resources_exist_for_tagris
 
diff --git a/docs/docs/services/medialive.rst b/docs/docs/services/medialive.rst
index 5509f0486..87381a0a5 100644
--- a/docs/docs/services/medialive.rst
+++ b/docs/docs/services/medialive.rst
@@ -77,6 +77,7 @@ medialive
 - [ ] purchase_offering
 - [ ] reboot_input_device
 - [ ] reject_input_device_transfer
+- [ ] restart_channel_pipelines
 - [X] start_channel
 - [ ] start_input_device
 - [ ] start_input_device_maintenance_window
diff --git a/docs/docs/services/resiliencehub.rst b/docs/docs/services/resiliencehub.rst
new file mode 100644
index 000000000..b326081f7
--- /dev/null
+++ b/docs/docs/services/resiliencehub.rst
@@ -0,0 +1,83 @@
+.. _implementedservice_resiliencehub:
+
+.. |start-h3| raw:: html
+
+    <h3>
+
+.. |end-h3| raw:: html
+
+    </h3>
+
+=============
+resiliencehub
+=============
+
+|start-h3| Implemented features for this service |end-h3|
+
+- [ ] add_draft_app_version_resource_mappings
+- [ ] batch_update_recommendation_status
+- [X] create_app
+  
+        The ClientToken-parameter is not yet implemented
+        
+
+- [ ] create_app_version_app_component
+- [ ] create_app_version_resource
+- [ ] create_recommendation_template
+- [X] create_resiliency_policy
+  
+        The ClientToken-parameter is not yet implemented
+        
+
+- [ ] delete_app
+- [ ] delete_app_assessment
+- [ ] delete_app_input_source
+- [ ] delete_app_version_app_component
+- [ ] delete_app_version_resource
+- [ ] delete_recommendation_template
+- [ ] delete_resiliency_policy
+- [X] describe_app
+- [ ] describe_app_assessment
+- [ ] describe_app_version
+- [ ] describe_app_version_app_component
+- [ ] describe_app_version_resource
+- [ ] describe_app_version_resources_resolution_status
+- [ ] describe_app_version_template
+- [ ] describe_draft_app_version_resources_import_status
+- [X] describe_resiliency_policy
+- [ ] import_resources_to_draft_app_version
+- [ ] list_alarm_recommendations
+- [ ] list_app_assessment_compliance_drifts
+- [X] list_app_assessments
+- [ ] list_app_component_compliances
+- [ ] list_app_component_recommendations
+- [ ] list_app_input_sources
+- [ ] list_app_version_app_components
+- [ ] list_app_version_resource_mappings
+- [ ] list_app_version_resources
+- [ ] list_app_versions
+- [X] list_apps
+  
+        The FromAssessmentTime/ToAssessmentTime-parameters are not yet implemented
+        
+
+- [ ] list_recommendation_templates
+- [X] list_resiliency_policies
+- [ ] list_sop_recommendations
+- [ ] list_suggested_resiliency_policies
+- [X] list_tags_for_resource
+- [ ] list_test_recommendations
+- [ ] list_unsupported_app_version_resources
+- [ ] publish_app_version
+- [ ] put_draft_app_version_template
+- [ ] remove_draft_app_version_resource_mappings
+- [ ] resolve_app_version_resources
+- [ ] start_app_assessment
+- [X] tag_resource
+- [X] untag_resource
+- [ ] update_app
+- [ ] update_app_version
+- [ ] update_app_version_app_component
+- [ ] update_app_version_resource
+- [ ] update_resiliency_policy
+
diff --git a/docs/docs/services/route53domains.rst b/docs/docs/services/route53domains.rst
new file mode 100644
index 000000000..45e317220
--- /dev/null
+++ b/docs/docs/services/route53domains.rst
@@ -0,0 +1,55 @@
+.. _implementedservice_route53domains:
+
+.. |start-h3| raw:: html
+
+    <h3>
+
+.. |end-h3| raw:: html
+
+    </h3>
+
+==============
+route53domains
+==============
+
+.. autoclass:: moto.route53domains.models.Route53DomainsBackend
+
+|start-h3| Implemented features for this service |end-h3|
+
+- [ ] accept_domain_transfer_from_another_aws_account
+- [ ] associate_delegation_signer_to_domain
+- [ ] cancel_domain_transfer_to_another_aws_account
+- [ ] check_domain_availability
+- [ ] check_domain_transferability
+- [X] delete_domain
+- [ ] delete_tags_for_domain
+- [ ] disable_domain_auto_renew
+- [ ] disable_domain_transfer_lock
+- [ ] disassociate_delegation_signer_from_domain
+- [ ] enable_domain_auto_renew
+- [ ] enable_domain_transfer_lock
+- [ ] get_contact_reachability_status
+- [ ] get_domain_detail
+- [ ] get_domain_suggestions
+- [ ] get_operation_detail
+- [X] list_domains
+- [X] list_operations
+- [ ] list_prices
+- [ ] list_tags_for_domain
+- [ ] push_domain
+- [X] register_domain
+  Register a domain
+
+- [ ] reject_domain_transfer_from_another_aws_account
+- [ ] renew_domain
+- [ ] resend_contact_reachability_email
+- [ ] resend_operation_authorization
+- [ ] retrieve_domain_auth_code
+- [ ] transfer_domain
+- [ ] transfer_domain_to_another_aws_account
+- [ ] update_domain_contact
+- [ ] update_domain_contact_privacy
+- [X] update_domain_nameservers
+- [ ] update_tags_for_domain
+- [ ] view_billing
+
diff --git a/docs/docs/services/s3.rst b/docs/docs/services/s3.rst
index cbc4ded7c..d7973040d 100644
--- a/docs/docs/services/s3.rst
+++ b/docs/docs/services/s3.rst
@@ -109,8 +109,11 @@ s3
          - EventBridge
 
         For the following events:
+         - 's3:ObjectCreated:CompleteMultipartUpload'
          - 's3:ObjectCreated:Copy'
+         - 's3:ObjectCreated:Post'
          - 's3:ObjectCreated:Put'
+         - 's3:ObjectDeleted'
         
 
 - [X] put_bucket_ownership_controls
@@ -135,7 +138,7 @@ s3
 - [X] put_object_retention
 - [X] put_object_tagging
 - [X] put_public_access_block
-- [ ] restore_object
+- [X] restore_object
 - [X] select_object_content
   
         Highly experimental. Please raise an issue if you find any inconsistencies/bugs.
diff --git a/moto/__init__.py b/moto/__init__.py
index 816fd0f5b..0488f507e 100644
--- a/moto/__init__.py
+++ b/moto/__init__.py
@@ -1,4 +1,4 @@
 from moto.core.decorator import mock_aws as mock_aws
 
 __title__ = "moto"
-__version__ = "5.0.3.dev"
+__version__ = "5.0.4.dev"
diff --git a/moto/backend_index.py b/moto/backend_index.py
index 5e0d4455b..fd17dfc70 100644
--- a/moto/backend_index.py
+++ b/moto/backend_index.py
@@ -131,6 +131,7 @@ backend_url_patterns = [
     ("redshift", re.compile("https?://redshift\\.(.+)\\.amazonaws\\.com")),
     ("redshiftdata", re.compile("https?://redshift-data\\.(.+)\\.amazonaws\\.com")),
     ("rekognition", re.compile("https?://rekognition\\.(.+)\\.amazonaws\\.com")),
+    ("resiliencehub", re.compile("https?://resiliencehub\\.(.+)\\.amazonaws\\.com")),
     (
         "resourcegroups",
         re.compile("https?://resource-groups(-fips)?\\.(.+)\\.amazonaws.com"),
@@ -138,14 +139,11 @@ backend_url_patterns = [
     ("resourcegroupstaggingapi", re.compile("https?://tagging\\.(.+)\\.amazonaws.com")),
     ("robomaker", re.compile("https?://robomaker\\.(.+)\\.amazonaws\\.com")),
     ("route53", re.compile("https?://route53(\\..+)?\\.amazonaws.com")),
+    ("route53domains", re.compile("https?://route53domains\\.(.+)\\.amazonaws\\.com")),
     (
         "route53resolver",
         re.compile("https?://route53resolver\\.(.+)\\.amazonaws\\.com"),
     ),
-    (
-        "route53domains",
-        re.compile("https?://route53domains\\.(.+)\\.amazonaws\\.com"),
-    ),
     ("s3", re.compile("https?://s3(?!-control)(.*)\\.amazonaws.com")),
     (
         "s3",
diff --git a/moto/backends.py b/moto/backends.py
index e7d636f1e..64179c190 100644
--- a/moto/backends.py
+++ b/moto/backends.py
@@ -104,6 +104,7 @@ if TYPE_CHECKING:
     from moto.redshift.models import RedshiftBackend
     from moto.redshiftdata.models import RedshiftDataAPIServiceBackend
     from moto.rekognition.models import RekognitionBackend
+    from moto.resiliencehub.models import ResilienceHubBackend
     from moto.resourcegroups.models import ResourceGroupsBackend
     from moto.resourcegroupstaggingapi.models import ResourceGroupsTaggingAPIBackend
     from moto.robomaker.models import RoboMakerBackend
@@ -262,6 +263,7 @@ SERVICE_NAMES = Union[
     "Literal['redshift']",
     "Literal['redshift-data']",
     "Literal['rekognition']",
+    "Literal['resiliencehub']",
     "Literal['resource-groups']",
     "Literal['resourcegroupstaggingapi']",
     "Literal['robomaker']",
@@ -498,6 +500,8 @@ def get_backend(name: "Literal['redshift-data']") -> "BackendDict[RedshiftDataAP
 @overload
 def get_backend(name: "Literal['rekognition']") -> "BackendDict[RekognitionBackend]": ...
 @overload
+def get_backend(name: "Literal['resiliencehub']") -> "BackendDict[ResilienceHubBackend]": ...
+@overload
 def get_backend(name: "Literal['resource-groups']") -> "BackendDict[ResourceGroupsBackend]": ...
 @overload
 def get_backend(name: "Literal['resourcegroupstaggingapi']") -> "BackendDict[ResourceGroupsTaggingAPIBackend]": ...
diff --git a/moto/dynamodb/models/__init__.py b/moto/dynamodb/models/__init__.py
index 0627a238e..60a075471 100644
--- a/moto/dynamodb/models/__init__.py
+++ b/moto/dynamodb/models/__init__.py
@@ -318,6 +318,7 @@ class DynamoDBBackend(BaseBackend):
         scan_index_forward: bool,
         projection_expressions: Optional[List[List[str]]],
         index_name: Optional[str] = None,
+        consistent_read: bool = False,
         expr_names: Optional[Dict[str, str]] = None,
         expr_values: Optional[Dict[str, Dict[str, str]]] = None,
         filter_expression: Optional[str] = None,
@@ -341,6 +342,7 @@ class DynamoDBBackend(BaseBackend):
             scan_index_forward,
             projection_expressions,
             index_name,
+            consistent_read,
             filter_expression_op,
             **filter_kwargs,
         )
@@ -355,6 +357,7 @@ class DynamoDBBackend(BaseBackend):
         expr_names: Dict[str, Any],
         expr_values: Dict[str, Any],
         index_name: str,
+        consistent_read: bool,
         projection_expression: Optional[List[List[str]]],
     ) -> Tuple[List[Item], int, Optional[Dict[str, Any]]]:
         table = self.get_table(table_name)
@@ -374,6 +377,7 @@ class DynamoDBBackend(BaseBackend):
             exclusive_start_key,
             filter_expression_op,
             index_name,
+            consistent_read,
             projection_expression,
         )
 
diff --git a/moto/dynamodb/models/table.py b/moto/dynamodb/models/table.py
index 99a47e8eb..aa7596694 100644
--- a/moto/dynamodb/models/table.py
+++ b/moto/dynamodb/models/table.py
@@ -653,6 +653,7 @@ class Table(CloudFormationModel):
         scan_index_forward: bool,
         projection_expressions: Optional[List[List[str]]],
         index_name: Optional[str] = None,
+        consistent_read: bool = False,
         filter_expression: Any = None,
         **filter_kwargs: Any,
     ) -> Tuple[List[Item], int, Optional[Dict[str, Any]]]:
@@ -668,6 +669,12 @@ class Table(CloudFormationModel):
                 )
 
             index = indexes_by_name[index_name]
+
+            if consistent_read and index in self.global_indexes:
+                raise MockValidationException(
+                    "Consistent reads are not supported on global secondary indexes"
+                )
+
             try:
                 index_hash_key = [
                     key for key in index.schema if key["KeyType"] == "HASH"
@@ -715,9 +722,11 @@ class Table(CloudFormationModel):
                     return float(x.value) if x.type == "N" else x.value
 
                 possible_results.sort(
-                    key=lambda item: conv(item.attrs[index_range_key["AttributeName"]])  # type: ignore
-                    if item.attrs.get(index_range_key["AttributeName"])
-                    else None
+                    key=lambda item: (  # type: ignore
+                        conv(item.attrs[index_range_key["AttributeName"]])  # type: ignore
+                        if item.attrs.get(index_range_key["AttributeName"])
+                        else None
+                    )
                 )
         else:
             possible_results.sort(key=lambda item: item.range_key)  # type: ignore
@@ -834,6 +843,7 @@ class Table(CloudFormationModel):
         exclusive_start_key: Dict[str, Any],
         filter_expression: Any = None,
         index_name: Optional[str] = None,
+        consistent_read: bool = False,
         projection_expression: Optional[List[List[str]]] = None,
     ) -> Tuple[List[Item], int, Optional[Dict[str, Any]]]:
         results: List[Item] = []
@@ -841,7 +851,13 @@ class Table(CloudFormationModel):
         scanned_count = 0
 
         if index_name:
-            self.get_index(index_name, error_if_not=True)
+            index = self.get_index(index_name, error_if_not=True)
+
+            if consistent_read and index in self.global_indexes:
+                raise MockValidationException(
+                    "Consistent reads are not supported on global secondary indexes"
+                )
+
             items = self.has_idx_items(index_name)
         else:
             items = self.all_items()
diff --git a/moto/dynamodb/responses.py b/moto/dynamodb/responses.py
index 9f03efa2c..b6b02df38 100644
--- a/moto/dynamodb/responses.py
+++ b/moto/dynamodb/responses.py
@@ -731,6 +731,8 @@ class DynamoHandler(BaseResponse):
         exclusive_start_key = self.body.get("ExclusiveStartKey")
         limit = self.body.get("Limit")
         scan_index_forward = self.body.get("ScanIndexForward")
+        consistent_read = self.body.get("ConsistentRead", False)
+
         items, scanned_count, last_evaluated_key = self.dynamodb_backend.query(
             name,
             hash_key,
@@ -741,6 +743,7 @@ class DynamoHandler(BaseResponse):
             scan_index_forward,
             projection_expressions,
             index_name=index_name,
+            consistent_read=consistent_read,
             expr_names=expression_attribute_names,
             expr_values=expression_attribute_values,
             filter_expression=filter_expression,
@@ -801,6 +804,7 @@ class DynamoHandler(BaseResponse):
         exclusive_start_key = self.body.get("ExclusiveStartKey")
         limit = self.body.get("Limit")
         index_name = self.body.get("IndexName")
+        consistent_read = self.body.get("ConsistentRead", False)
 
         projection_expressions = self._adjust_projection_expression(
             projection_expression, expression_attribute_names
@@ -816,6 +820,7 @@ class DynamoHandler(BaseResponse):
                 expression_attribute_names,
                 expression_attribute_values,
                 index_name,
+                consistent_read,
                 projection_expressions,
             )
         except ValueError as err:
diff --git a/moto/ec2/models/vpcs.py b/moto/ec2/models/vpcs.py
index 299f17d4b..5ebb02457 100644
--- a/moto/ec2/models/vpcs.py
+++ b/moto/ec2/models/vpcs.py
@@ -1,5 +1,6 @@
 import ipaddress
 import json
+import threading
 import weakref
 from collections import defaultdict
 from operator import itemgetter
@@ -82,6 +83,7 @@ IMPLEMENTED_ENDPOINT_SERVICES = [
 ]
 MAX_NUMBER_OF_ENDPOINT_SERVICES_RESULTS = 1000
 DEFAULT_VPC_ENDPOINT_SERVICES: List[Dict[str, str]] = []
+ENDPOINT_SERVICE_COLLECTION_LOCK = threading.Lock()
 
 
 class VPCEndPoint(TaggedEC2Resource, CloudFormationModel):
@@ -773,35 +775,37 @@ class VPCBackend:
         account_id: str, region: str
     ) -> List[Dict[str, str]]:
         """Return list of default services using list of backends."""
-        if DEFAULT_VPC_ENDPOINT_SERVICES:
-            return DEFAULT_VPC_ENDPOINT_SERVICES
+        with ENDPOINT_SERVICE_COLLECTION_LOCK:
 
-        zones = [
-            zone.name
-            for zones in RegionsAndZonesBackend.zones.values()
-            for zone in zones
-            if zone.name.startswith(region)
-        ]
+            if DEFAULT_VPC_ENDPOINT_SERVICES:
+                return DEFAULT_VPC_ENDPOINT_SERVICES
 
-        from moto import backends  # pylint: disable=import-outside-toplevel
+            zones = [
+                zone.name
+                for zones in RegionsAndZonesBackend.zones.values()
+                for zone in zones
+                if zone.name.startswith(region)
+            ]
 
-        for implemented_service in IMPLEMENTED_ENDPOINT_SERVICES:
-            _backends = backends.get_backend(implemented_service)  # type: ignore[call-overload]
-            account_backend = _backends[account_id]
-            if region in account_backend:
-                service = account_backend[region].default_vpc_endpoint_service(
-                    region, zones
-                )
-                if service:
-                    DEFAULT_VPC_ENDPOINT_SERVICES.extend(service)
+            from moto import backends  # pylint: disable=import-outside-toplevel
 
-            if "global" in account_backend:
-                service = account_backend["global"].default_vpc_endpoint_service(
-                    region, zones
-                )
-                if service:
-                    DEFAULT_VPC_ENDPOINT_SERVICES.extend(service)
-        return DEFAULT_VPC_ENDPOINT_SERVICES
+            for implemented_service in IMPLEMENTED_ENDPOINT_SERVICES:
+                _backends = backends.get_backend(implemented_service)  # type: ignore[call-overload]
+                account_backend = _backends[account_id]
+                if region in account_backend:
+                    service = account_backend[region].default_vpc_endpoint_service(
+                        region, zones
+                    )
+                    if service:
+                        DEFAULT_VPC_ENDPOINT_SERVICES.extend(service)
+
+                if "global" in account_backend:
+                    service = account_backend["global"].default_vpc_endpoint_service(
+                        region, zones
+                    )
+                    if service:
+                        DEFAULT_VPC_ENDPOINT_SERVICES.extend(service)
+            return DEFAULT_VPC_ENDPOINT_SERVICES
 
     @staticmethod
     def _matches_service_by_tags(service: Dict[str, Any], filter_item: Dict[str, Any]) -> bool:  # type: ignore[misc]
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
index f4682f3d8..8565adb08 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
@@ -559,6 +559,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "apne1-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "apne1-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "apne1-az1"
@@ -1699,6 +1703,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "apne1-az1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "apne1-az1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "apne1-az1"
@@ -2439,6 +2447,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "apne1-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "apne1-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "apne1-az1"
@@ -3291,6 +3303,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "apne1-az2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "apne1-az2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "apne1-az2"
@@ -4287,6 +4303,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "apne1-az2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "apne1-az2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "apne1-az2"
@@ -4947,6 +4967,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "apne1-az2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "apne1-az2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "apne1-az2"
@@ -5783,6 +5807,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "apne1-az4"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "apne1-az4"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "apne1-az4"
@@ -6915,6 +6943,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "apne1-az4"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "apne1-az4"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "apne1-az4"
@@ -7695,6 +7727,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "apne1-az4"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "apne1-az4"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "apne1-az4"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
index e910111e1..699f80d67 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
@@ -4967,6 +4967,10 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apne2-az3"
  },
+ {
+  "InstanceType": "u-12tb1.112xlarge",
+  "Location": "apne2-az3"
+ },
  {
   "InstanceType": "u-24tb1.112xlarge",
   "Location": "apne2-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json
index 39bc94b30..84957962a 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-1.json
@@ -443,6 +443,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "aps1-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "aps1-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "aps1-az1"
@@ -1175,6 +1179,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "aps1-az1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "aps1-az1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "aps1-az1"
@@ -1735,6 +1743,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "aps1-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "aps1-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "aps1-az1"
@@ -2459,6 +2471,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "aps1-az2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "aps1-az2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "aps1-az2"
@@ -3103,6 +3119,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "aps1-az2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "aps1-az2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "aps1-az2"
@@ -3607,6 +3627,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "aps1-az2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "aps1-az2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "aps1-az2"
@@ -4243,6 +4267,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "aps1-az3"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "aps1-az3"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "aps1-az3"
@@ -4951,6 +4979,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "aps1-az3"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "aps1-az3"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "aps1-az3"
@@ -5507,6 +5539,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "aps1-az3"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "aps1-az3"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "aps1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-2.json
index 174d6bf0b..b7f31c8bc 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-south-2.json
@@ -147,6 +147,46 @@
   "InstanceType": "c6i.xlarge",
   "Location": "aps2-az1"
  },
+ {
+  "InstanceType": "c6in.12xlarge",
+  "Location": "aps2-az1"
+ },
+ {
+  "InstanceType": "c6in.16xlarge",
+  "Location": "aps2-az1"
+ },
+ {
+  "InstanceType": "c6in.24xlarge",
+  "Location": "aps2-az1"
+ },
+ {
+  "InstanceType": "c6in.2xlarge",
+  "Location": "aps2-az1"
+ },
+ {
+  "InstanceType": "c6in.32xlarge",
+  "Location": "aps2-az1"
+ },
+ {
+  "InstanceType": "c6in.4xlarge",
+  "Location": "aps2-az1"
+ },
+ {
+  "InstanceType": "c6in.8xlarge",
+  "Location": "aps2-az1"
+ },
+ {
+  "InstanceType": "c6in.large",
+  "Location": "aps2-az1"
+ },
+ {
+  "InstanceType": "c6in.metal",
+  "Location": "aps2-az1"
+ },
+ {
+  "InstanceType": "c6in.xlarge",
+  "Location": "aps2-az1"
+ },
  {
   "InstanceType": "c7g.12xlarge",
   "Location": "aps2-az1"
@@ -983,6 +1023,46 @@
   "InstanceType": "c6i.xlarge",
   "Location": "aps2-az2"
  },
+ {
+  "InstanceType": "c6in.12xlarge",
+  "Location": "aps2-az2"
+ },
+ {
+  "InstanceType": "c6in.16xlarge",
+  "Location": "aps2-az2"
+ },
+ {
+  "InstanceType": "c6in.24xlarge",
+  "Location": "aps2-az2"
+ },
+ {
+  "InstanceType": "c6in.2xlarge",
+  "Location": "aps2-az2"
+ },
+ {
+  "InstanceType": "c6in.32xlarge",
+  "Location": "aps2-az2"
+ },
+ {
+  "InstanceType": "c6in.4xlarge",
+  "Location": "aps2-az2"
+ },
+ {
+  "InstanceType": "c6in.8xlarge",
+  "Location": "aps2-az2"
+ },
+ {
+  "InstanceType": "c6in.large",
+  "Location": "aps2-az2"
+ },
+ {
+  "InstanceType": "c6in.metal",
+  "Location": "aps2-az2"
+ },
+ {
+  "InstanceType": "c6in.xlarge",
+  "Location": "aps2-az2"
+ },
  {
   "InstanceType": "c7g.12xlarge",
   "Location": "aps2-az2"
@@ -1815,6 +1895,46 @@
   "InstanceType": "c6i.xlarge",
   "Location": "aps2-az3"
  },
+ {
+  "InstanceType": "c6in.12xlarge",
+  "Location": "aps2-az3"
+ },
+ {
+  "InstanceType": "c6in.16xlarge",
+  "Location": "aps2-az3"
+ },
+ {
+  "InstanceType": "c6in.24xlarge",
+  "Location": "aps2-az3"
+ },
+ {
+  "InstanceType": "c6in.2xlarge",
+  "Location": "aps2-az3"
+ },
+ {
+  "InstanceType": "c6in.32xlarge",
+  "Location": "aps2-az3"
+ },
+ {
+  "InstanceType": "c6in.4xlarge",
+  "Location": "aps2-az3"
+ },
+ {
+  "InstanceType": "c6in.8xlarge",
+  "Location": "aps2-az3"
+ },
+ {
+  "InstanceType": "c6in.large",
+  "Location": "aps2-az3"
+ },
+ {
+  "InstanceType": "c6in.metal",
+  "Location": "aps2-az3"
+ },
+ {
+  "InstanceType": "c6in.xlarge",
+  "Location": "aps2-az3"
+ },
  {
   "InstanceType": "c7g.12xlarge",
   "Location": "aps2-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json
index 3d80ea509..b5b2ab37c 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-1.json
@@ -535,6 +535,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "apse1-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "apse1-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "apse1-az1"
@@ -1555,6 +1559,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "apse1-az1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "apse1-az1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "apse1-az1"
@@ -2283,6 +2291,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "apse1-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "apse1-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "apse1-az1"
@@ -3143,6 +3155,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "apse1-az2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "apse1-az2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "apse1-az2"
@@ -4159,6 +4175,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "apse1-az2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "apse1-az2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "apse1-az2"
@@ -4887,6 +4907,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "apse1-az2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "apse1-az2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "apse1-az2"
@@ -5695,6 +5719,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "apse1-az3"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "apse1-az3"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "apse1-az3"
@@ -6555,6 +6583,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "apse1-az3"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "apse1-az3"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "apse1-az3"
@@ -7187,6 +7219,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "apse1-az3"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "apse1-az3"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "apse1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json
index 053248f1b..dcc5efdbe 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-southeast-2.json
@@ -567,6 +567,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "apse2-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "apse2-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "apse2-az1"
@@ -1491,6 +1495,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "apse2-az1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "apse2-az1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "apse2-az1"
@@ -2143,6 +2151,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "apse2-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "apse2-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "apse2-az1"
@@ -2991,6 +3003,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "apse2-az2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "apse2-az2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "apse2-az2"
@@ -3855,6 +3871,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "apse2-az2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "apse2-az2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "apse2-az2"
@@ -4483,6 +4503,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "apse2-az2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "apse2-az2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "apse2-az2"
@@ -5307,6 +5331,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "apse2-az3"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "apse2-az3"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "apse2-az3"
@@ -6155,6 +6183,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "apse2-az3"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "apse2-az3"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "apse2-az3"
@@ -6783,6 +6815,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "apse2-az3"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "apse2-az3"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "apse2-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json
index fc8e17aa4..0c3b9abcb 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-central-1.json
@@ -563,6 +563,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "euc1-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "euc1-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "euc1-az1"
@@ -2199,6 +2203,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "euc1-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "euc1-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "euc1-az1"
@@ -3995,6 +4003,42 @@
   "InstanceType": "m7g.xlarge",
   "Location": "euc1-az2"
  },
+ {
+  "InstanceType": "m7gd.12xlarge",
+  "Location": "euc1-az2"
+ },
+ {
+  "InstanceType": "m7gd.16xlarge",
+  "Location": "euc1-az2"
+ },
+ {
+  "InstanceType": "m7gd.2xlarge",
+  "Location": "euc1-az2"
+ },
+ {
+  "InstanceType": "m7gd.4xlarge",
+  "Location": "euc1-az2"
+ },
+ {
+  "InstanceType": "m7gd.8xlarge",
+  "Location": "euc1-az2"
+ },
+ {
+  "InstanceType": "m7gd.large",
+  "Location": "euc1-az2"
+ },
+ {
+  "InstanceType": "m7gd.medium",
+  "Location": "euc1-az2"
+ },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "euc1-az2"
+ },
+ {
+  "InstanceType": "m7gd.xlarge",
+  "Location": "euc1-az2"
+ },
  {
   "InstanceType": "m7i-flex.2xlarge",
   "Location": "euc1-az2"
@@ -5551,6 +5595,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "euc1-az3"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "euc1-az3"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "euc1-az3"
@@ -7347,6 +7395,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "euc1-az3"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "euc1-az3"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "euc1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json
index f34cfb8d5..f89d86d21 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-north-1.json
@@ -427,6 +427,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eun1-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eun1-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eun1-az1"
@@ -963,6 +967,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eun1-az1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eun1-az1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eun1-az1"
@@ -1447,6 +1455,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eun1-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eun1-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eun1-az1"
@@ -2039,6 +2051,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eun1-az2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eun1-az2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eun1-az2"
@@ -2615,6 +2631,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eun1-az2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eun1-az2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eun1-az2"
@@ -3171,6 +3191,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eun1-az2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eun1-az2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eun1-az2"
@@ -3759,6 +3783,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eun1-az3"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eun1-az3"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eun1-az3"
@@ -4327,6 +4355,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eun1-az3"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eun1-az3"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eun1-az3"
@@ -4847,6 +4879,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eun1-az3"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eun1-az3"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eun1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-2.json
index 851a67cab..24e63aee2 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-south-2.json
@@ -259,6 +259,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eus2-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eus2-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eus2-az1"
@@ -675,6 +679,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eus2-az1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eus2-az1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eus2-az1"
@@ -963,6 +971,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eus2-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eus2-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eus2-az1"
@@ -1383,6 +1395,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eus2-az2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eus2-az2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eus2-az2"
@@ -1775,6 +1791,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eus2-az2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eus2-az2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eus2-az2"
@@ -2063,6 +2083,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eus2-az2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eus2-az2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eus2-az2"
@@ -2483,6 +2507,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eus2-az3"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eus2-az3"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eus2-az3"
@@ -2875,6 +2903,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eus2-az3"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eus2-az3"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eus2-az3"
@@ -3163,6 +3195,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eus2-az3"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eus2-az3"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eus2-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json
index 6a11c7ff2..35c15b92f 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-1.json
@@ -615,6 +615,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "euw1-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "euw1-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "euw1-az1"
@@ -1795,6 +1799,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "euw1-az1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "euw1-az1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "euw1-az1"
@@ -2563,6 +2571,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "euw1-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "euw1-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "euw1-az1"
@@ -3587,6 +3599,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "euw1-az2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "euw1-az2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "euw1-az2"
@@ -4755,6 +4771,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "euw1-az2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "euw1-az2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "euw1-az2"
@@ -5539,6 +5559,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "euw1-az2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "euw1-az2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "euw1-az2"
@@ -6539,6 +6563,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "euw1-az3"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "euw1-az3"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "euw1-az3"
@@ -7691,6 +7719,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "euw1-az3"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "euw1-az3"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "euw1-az3"
@@ -8459,6 +8491,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "euw1-az3"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "euw1-az3"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "euw1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
index e5f762c45..02faf199d 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
@@ -455,6 +455,50 @@
   "InstanceType": "c7g.xlarge",
   "Location": "euw2-az1"
  },
+ {
+  "InstanceType": "c7i.12xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "c7i.16xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "c7i.24xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "c7i.2xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "c7i.48xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "c7i.4xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "c7i.8xlarge",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "c7i.large",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "c7i.metal-24xl",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "c7i.metal-48xl",
+  "Location": "euw2-az1"
+ },
+ {
+  "InstanceType": "c7i.xlarge",
+  "Location": "euw2-az1"
+ },
  {
   "InstanceType": "d2.2xlarge",
   "Location": "euw2-az1"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json
index 2c9fabfcf..5970424e4 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-3.json
@@ -1203,6 +1203,50 @@
   "InstanceType": "r6i.xlarge",
   "Location": "euw3-az1"
  },
+ {
+  "InstanceType": "r7i.12xlarge",
+  "Location": "euw3-az1"
+ },
+ {
+  "InstanceType": "r7i.16xlarge",
+  "Location": "euw3-az1"
+ },
+ {
+  "InstanceType": "r7i.24xlarge",
+  "Location": "euw3-az1"
+ },
+ {
+  "InstanceType": "r7i.2xlarge",
+  "Location": "euw3-az1"
+ },
+ {
+  "InstanceType": "r7i.48xlarge",
+  "Location": "euw3-az1"
+ },
+ {
+  "InstanceType": "r7i.4xlarge",
+  "Location": "euw3-az1"
+ },
+ {
+  "InstanceType": "r7i.8xlarge",
+  "Location": "euw3-az1"
+ },
+ {
+  "InstanceType": "r7i.large",
+  "Location": "euw3-az1"
+ },
+ {
+  "InstanceType": "r7i.metal-24xl",
+  "Location": "euw3-az1"
+ },
+ {
+  "InstanceType": "r7i.metal-48xl",
+  "Location": "euw3-az1"
+ },
+ {
+  "InstanceType": "r7i.xlarge",
+  "Location": "euw3-az1"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "euw3-az1"
@@ -2091,6 +2135,42 @@
   "InstanceType": "m6i.xlarge",
   "Location": "euw3-az2"
  },
+ {
+  "InstanceType": "m7gd.12xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "m7gd.16xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "m7gd.2xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "m7gd.4xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "m7gd.8xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "m7gd.large",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "m7gd.medium",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "m7gd.xlarge",
+  "Location": "euw3-az2"
+ },
  {
   "InstanceType": "m7i-flex.2xlarge",
   "Location": "euw3-az2"
@@ -2499,6 +2579,50 @@
   "InstanceType": "r6i.xlarge",
   "Location": "euw3-az2"
  },
+ {
+  "InstanceType": "r7i.12xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "r7i.16xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "r7i.24xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "r7i.2xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "r7i.48xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "r7i.4xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "r7i.8xlarge",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "r7i.large",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "r7i.metal-24xl",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "r7i.metal-48xl",
+  "Location": "euw3-az2"
+ },
+ {
+  "InstanceType": "r7i.xlarge",
+  "Location": "euw3-az2"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "euw3-az2"
@@ -3471,6 +3595,42 @@
   "InstanceType": "m7g.xlarge",
   "Location": "euw3-az3"
  },
+ {
+  "InstanceType": "m7gd.12xlarge",
+  "Location": "euw3-az3"
+ },
+ {
+  "InstanceType": "m7gd.16xlarge",
+  "Location": "euw3-az3"
+ },
+ {
+  "InstanceType": "m7gd.2xlarge",
+  "Location": "euw3-az3"
+ },
+ {
+  "InstanceType": "m7gd.4xlarge",
+  "Location": "euw3-az3"
+ },
+ {
+  "InstanceType": "m7gd.8xlarge",
+  "Location": "euw3-az3"
+ },
+ {
+  "InstanceType": "m7gd.large",
+  "Location": "euw3-az3"
+ },
+ {
+  "InstanceType": "m7gd.medium",
+  "Location": "euw3-az3"
+ },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "euw3-az3"
+ },
+ {
+  "InstanceType": "m7gd.xlarge",
+  "Location": "euw3-az3"
+ },
  {
   "InstanceType": "m7i-flex.2xlarge",
   "Location": "euw3-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
index 3b5a8a574..0e3899fd9 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
@@ -3255,6 +3255,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "use1-az2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "use1-az2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "use1-az2"
@@ -5235,6 +5239,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "use1-az2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "use1-az2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "use1-az2"
@@ -6515,6 +6523,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "use1-az4"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "use1-az4"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "use1-az4"
@@ -8487,6 +8499,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "use1-az4"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "use1-az4"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "use1-az4"
@@ -9439,6 +9455,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "use1-az5"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "use1-az5"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "use1-az5"
@@ -11123,6 +11143,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "use1-az5"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "use1-az5"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "use1-az5"
@@ -12071,6 +12095,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "use1-az6"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "use1-az6"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "use1-az6"
@@ -14075,6 +14103,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "use1-az6"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "use1-az6"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "use1-az6"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
index c1d6e1ef5..2d1ac45cc 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
@@ -587,6 +587,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "use2-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "use2-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "use2-az1"
@@ -1679,6 +1683,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "use2-az1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "use2-az1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "use2-az1"
@@ -2459,6 +2467,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "use2-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "use2-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "use2-az1"
@@ -3411,6 +3423,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "use2-az2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "use2-az2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "use2-az2"
@@ -4527,6 +4543,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "use2-az2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "use2-az2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "use2-az2"
@@ -5319,6 +5339,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "use2-az2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "use2-az2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "use2-az2"
@@ -6215,6 +6239,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "use2-az3"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "use2-az3"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "use2-az3"
@@ -7307,6 +7335,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "use2-az3"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "use2-az3"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "use2-az3"
@@ -8079,6 +8111,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "use2-az3"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "use2-az3"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "use2-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-1.json
index e7cdf595d..eef46a553 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-1.json
@@ -471,6 +471,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "usw1-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "usw1-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "usw1-az1"
@@ -1239,6 +1243,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "usw1-az1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "usw1-az1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "usw1-az1"
@@ -1743,6 +1751,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "usw1-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "usw1-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "usw1-az1"
@@ -2455,6 +2467,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "usw1-az3"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "usw1-az3"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "usw1-az3"
@@ -3223,6 +3239,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "usw1-az3"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "usw1-az3"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "usw1-az3"
@@ -3727,6 +3747,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "usw1-az3"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "usw1-az3"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "usw1-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
index e2ac85c10..c933b5248 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
@@ -591,6 +591,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "usw2-az1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "usw2-az1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "usw2-az1"
@@ -1791,6 +1795,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "usw2-az1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "usw2-az1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "usw2-az1"
@@ -2587,6 +2595,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "usw2-az1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "usw2-az1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "usw2-az1"
@@ -3575,6 +3587,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "usw2-az2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "usw2-az2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "usw2-az2"
@@ -4755,6 +4771,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "usw2-az2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "usw2-az2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "usw2-az2"
@@ -5539,6 +5559,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "usw2-az2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "usw2-az2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "usw2-az2"
@@ -6479,6 +6503,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "usw2-az3"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "usw2-az3"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "usw2-az3"
@@ -7675,6 +7703,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "usw2-az3"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "usw2-az3"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "usw2-az3"
@@ -8467,6 +8499,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "usw2-az3"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "usw2-az3"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "usw2-az3"
@@ -9367,6 +9403,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "usw2-az4"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "usw2-az4"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "usw2-az4"
@@ -10103,6 +10143,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "usw2-az4"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "usw2-az4"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "usw2-az4"
@@ -10655,6 +10699,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "usw2-az4"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "usw2-az4"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "usw2-az4"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
index 9f8fd28de..d2964041c 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
@@ -583,6 +583,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-northeast-1a"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-northeast-1a"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-northeast-1a"
@@ -1715,6 +1719,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-northeast-1a"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-northeast-1a"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-northeast-1a"
@@ -2495,6 +2503,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-northeast-1a"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-northeast-1a"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-northeast-1a"
@@ -3423,6 +3435,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-northeast-1c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-northeast-1c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-northeast-1c"
@@ -4563,6 +4579,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-northeast-1c"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-northeast-1c"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-northeast-1c"
@@ -5303,6 +5323,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-northeast-1c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-northeast-1c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-northeast-1c"
@@ -6155,6 +6179,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-northeast-1d"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-northeast-1d"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-northeast-1d"
@@ -7151,6 +7179,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-northeast-1d"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-northeast-1d"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-northeast-1d"
@@ -7811,6 +7843,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-northeast-1d"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-northeast-1d"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-northeast-1d"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
index b08ed0dea..16e76f8b2 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
@@ -4967,6 +4967,10 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-northeast-2c"
  },
+ {
+  "InstanceType": "u-12tb1.112xlarge",
+  "Location": "ap-northeast-2c"
+ },
  {
   "InstanceType": "u-24tb1.112xlarge",
   "Location": "ap-northeast-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json
index fce71cfb4..a730dc8e7 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-1.json
@@ -443,6 +443,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-south-1a"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-south-1a"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-south-1a"
@@ -1175,6 +1179,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-south-1a"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-south-1a"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-south-1a"
@@ -1735,6 +1743,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-south-1a"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-south-1a"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-south-1a"
@@ -2479,6 +2491,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-south-1b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-south-1b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-south-1b"
@@ -3187,6 +3203,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-south-1b"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-south-1b"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-south-1b"
@@ -3743,6 +3763,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-south-1b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-south-1b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-south-1b"
@@ -4471,6 +4495,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-south-1c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-south-1c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-south-1c"
@@ -5115,6 +5143,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-south-1c"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-south-1c"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-south-1c"
@@ -5619,6 +5651,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-south-1c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-south-1c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-south-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-2.json
index 023abc4fe..4c49da563 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-south-2.json
@@ -147,6 +147,46 @@
   "InstanceType": "c6i.xlarge",
   "Location": "ap-south-2a"
  },
+ {
+  "InstanceType": "c6in.12xlarge",
+  "Location": "ap-south-2a"
+ },
+ {
+  "InstanceType": "c6in.16xlarge",
+  "Location": "ap-south-2a"
+ },
+ {
+  "InstanceType": "c6in.24xlarge",
+  "Location": "ap-south-2a"
+ },
+ {
+  "InstanceType": "c6in.2xlarge",
+  "Location": "ap-south-2a"
+ },
+ {
+  "InstanceType": "c6in.32xlarge",
+  "Location": "ap-south-2a"
+ },
+ {
+  "InstanceType": "c6in.4xlarge",
+  "Location": "ap-south-2a"
+ },
+ {
+  "InstanceType": "c6in.8xlarge",
+  "Location": "ap-south-2a"
+ },
+ {
+  "InstanceType": "c6in.large",
+  "Location": "ap-south-2a"
+ },
+ {
+  "InstanceType": "c6in.metal",
+  "Location": "ap-south-2a"
+ },
+ {
+  "InstanceType": "c6in.xlarge",
+  "Location": "ap-south-2a"
+ },
  {
   "InstanceType": "c7g.12xlarge",
   "Location": "ap-south-2a"
@@ -983,6 +1023,46 @@
   "InstanceType": "c6i.xlarge",
   "Location": "ap-south-2b"
  },
+ {
+  "InstanceType": "c6in.12xlarge",
+  "Location": "ap-south-2b"
+ },
+ {
+  "InstanceType": "c6in.16xlarge",
+  "Location": "ap-south-2b"
+ },
+ {
+  "InstanceType": "c6in.24xlarge",
+  "Location": "ap-south-2b"
+ },
+ {
+  "InstanceType": "c6in.2xlarge",
+  "Location": "ap-south-2b"
+ },
+ {
+  "InstanceType": "c6in.32xlarge",
+  "Location": "ap-south-2b"
+ },
+ {
+  "InstanceType": "c6in.4xlarge",
+  "Location": "ap-south-2b"
+ },
+ {
+  "InstanceType": "c6in.8xlarge",
+  "Location": "ap-south-2b"
+ },
+ {
+  "InstanceType": "c6in.large",
+  "Location": "ap-south-2b"
+ },
+ {
+  "InstanceType": "c6in.metal",
+  "Location": "ap-south-2b"
+ },
+ {
+  "InstanceType": "c6in.xlarge",
+  "Location": "ap-south-2b"
+ },
  {
   "InstanceType": "c7g.12xlarge",
   "Location": "ap-south-2b"
@@ -1815,6 +1895,46 @@
   "InstanceType": "c6i.xlarge",
   "Location": "ap-south-2c"
  },
+ {
+  "InstanceType": "c6in.12xlarge",
+  "Location": "ap-south-2c"
+ },
+ {
+  "InstanceType": "c6in.16xlarge",
+  "Location": "ap-south-2c"
+ },
+ {
+  "InstanceType": "c6in.24xlarge",
+  "Location": "ap-south-2c"
+ },
+ {
+  "InstanceType": "c6in.2xlarge",
+  "Location": "ap-south-2c"
+ },
+ {
+  "InstanceType": "c6in.32xlarge",
+  "Location": "ap-south-2c"
+ },
+ {
+  "InstanceType": "c6in.4xlarge",
+  "Location": "ap-south-2c"
+ },
+ {
+  "InstanceType": "c6in.8xlarge",
+  "Location": "ap-south-2c"
+ },
+ {
+  "InstanceType": "c6in.large",
+  "Location": "ap-south-2c"
+ },
+ {
+  "InstanceType": "c6in.metal",
+  "Location": "ap-south-2c"
+ },
+ {
+  "InstanceType": "c6in.xlarge",
+  "Location": "ap-south-2c"
+ },
  {
   "InstanceType": "c7g.12xlarge",
   "Location": "ap-south-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json
index 554a1a3ed..3fcdb786d 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-1.json
@@ -567,6 +567,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-southeast-1a"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-southeast-1a"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-southeast-1a"
@@ -1583,6 +1587,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-southeast-1a"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-southeast-1a"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-southeast-1a"
@@ -2311,6 +2319,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-southeast-1a"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-southeast-1a"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-southeast-1a"
@@ -3139,6 +3151,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-southeast-1b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-southeast-1b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-southeast-1b"
@@ -4159,6 +4175,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-southeast-1b"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-southeast-1b"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-southeast-1b"
@@ -4887,6 +4907,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-southeast-1b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-southeast-1b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-southeast-1b"
@@ -5695,6 +5719,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-southeast-1c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-southeast-1c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-southeast-1c"
@@ -6555,6 +6583,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-southeast-1c"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-southeast-1c"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-southeast-1c"
@@ -7187,6 +7219,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-southeast-1c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-southeast-1c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-southeast-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json
index 95cbad592..ee3353dc7 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-southeast-2.json
@@ -543,6 +543,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-southeast-2a"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-southeast-2a"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-southeast-2a"
@@ -1391,6 +1395,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-southeast-2a"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-southeast-2a"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-southeast-2a"
@@ -2019,6 +2027,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-southeast-2a"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-southeast-2a"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-southeast-2a"
@@ -2843,6 +2855,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-southeast-2b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-southeast-2b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-southeast-2b"
@@ -3767,6 +3783,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-southeast-2b"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-southeast-2b"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-southeast-2b"
@@ -4419,6 +4439,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-southeast-2b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-southeast-2b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-southeast-2b"
@@ -5267,6 +5291,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-southeast-2c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-southeast-2c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-southeast-2c"
@@ -6131,6 +6159,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-southeast-2c"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-southeast-2c"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-southeast-2c"
@@ -6759,6 +6791,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-southeast-2c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-southeast-2c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-southeast-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json
index 6abf1b945..d31bddb9c 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-central-1.json
@@ -1467,6 +1467,42 @@
   "InstanceType": "m7g.xlarge",
   "Location": "eu-central-1a"
  },
+ {
+  "InstanceType": "m7gd.12xlarge",
+  "Location": "eu-central-1a"
+ },
+ {
+  "InstanceType": "m7gd.16xlarge",
+  "Location": "eu-central-1a"
+ },
+ {
+  "InstanceType": "m7gd.2xlarge",
+  "Location": "eu-central-1a"
+ },
+ {
+  "InstanceType": "m7gd.4xlarge",
+  "Location": "eu-central-1a"
+ },
+ {
+  "InstanceType": "m7gd.8xlarge",
+  "Location": "eu-central-1a"
+ },
+ {
+  "InstanceType": "m7gd.large",
+  "Location": "eu-central-1a"
+ },
+ {
+  "InstanceType": "m7gd.medium",
+  "Location": "eu-central-1a"
+ },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-central-1a"
+ },
+ {
+  "InstanceType": "m7gd.xlarge",
+  "Location": "eu-central-1a"
+ },
  {
   "InstanceType": "m7i-flex.2xlarge",
   "Location": "eu-central-1a"
@@ -3023,6 +3059,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-central-1b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-central-1b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-central-1b"
@@ -4819,6 +4859,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-central-1b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-central-1b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-central-1b"
@@ -5711,6 +5755,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-central-1c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-central-1c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-central-1c"
@@ -7347,6 +7395,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-central-1c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-central-1c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-central-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json
index 0d59b3e61..d1f143a7f 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-north-1.json
@@ -427,6 +427,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-north-1a"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-north-1a"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-north-1a"
@@ -963,6 +967,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-north-1a"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-north-1a"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-north-1a"
@@ -1447,6 +1455,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-north-1a"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-north-1a"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-north-1a"
@@ -2039,6 +2051,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-north-1b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-north-1b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-north-1b"
@@ -2615,6 +2631,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-north-1b"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-north-1b"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-north-1b"
@@ -3171,6 +3191,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-north-1b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-north-1b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-north-1b"
@@ -3759,6 +3783,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-north-1c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-north-1c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-north-1c"
@@ -4327,6 +4355,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-north-1c"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-north-1c"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-north-1c"
@@ -4847,6 +4879,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-north-1c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-north-1c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-north-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-2.json
index a719dcbef..f14a3ca74 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-south-2.json
@@ -259,6 +259,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-south-2a"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-south-2a"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-south-2a"
@@ -675,6 +679,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-south-2a"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-south-2a"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-south-2a"
@@ -963,6 +971,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-south-2a"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-south-2a"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-south-2a"
@@ -1383,6 +1395,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-south-2b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-south-2b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-south-2b"
@@ -1775,6 +1791,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-south-2b"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-south-2b"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-south-2b"
@@ -2063,6 +2083,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-south-2b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-south-2b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-south-2b"
@@ -2483,6 +2507,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-south-2c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-south-2c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-south-2c"
@@ -2875,6 +2903,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-south-2c"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-south-2c"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-south-2c"
@@ -3163,6 +3195,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-south-2c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-south-2c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-south-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json
index 347903267..aaa986807 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-1.json
@@ -615,6 +615,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-west-1a"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-west-1a"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-west-1a"
@@ -1795,6 +1799,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-west-1a"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-west-1a"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-west-1a"
@@ -2563,6 +2571,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-west-1a"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-west-1a"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-west-1a"
@@ -3587,6 +3599,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-west-1b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-west-1b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-west-1b"
@@ -4755,6 +4771,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-west-1b"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-west-1b"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-west-1b"
@@ -5539,6 +5559,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-west-1b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-west-1b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-west-1b"
@@ -6539,6 +6563,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-west-1c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-west-1c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-west-1c"
@@ -7691,6 +7719,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-west-1c"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-west-1c"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-west-1c"
@@ -8459,6 +8491,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-west-1c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-west-1c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-west-1c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
index be9d1c457..b496edd93 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
@@ -4119,6 +4119,50 @@
   "InstanceType": "c7g.xlarge",
   "Location": "eu-west-2c"
  },
+ {
+  "InstanceType": "c7i.12xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "c7i.16xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "c7i.24xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "c7i.2xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "c7i.48xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "c7i.4xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "c7i.8xlarge",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "c7i.large",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "c7i.metal-24xl",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "c7i.metal-48xl",
+  "Location": "eu-west-2c"
+ },
+ {
+  "InstanceType": "c7i.xlarge",
+  "Location": "eu-west-2c"
+ },
  {
   "InstanceType": "d2.2xlarge",
   "Location": "eu-west-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json
index 27bb17c73..4b37de384 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-3.json
@@ -1203,6 +1203,50 @@
   "InstanceType": "r6i.xlarge",
   "Location": "eu-west-3a"
  },
+ {
+  "InstanceType": "r7i.12xlarge",
+  "Location": "eu-west-3a"
+ },
+ {
+  "InstanceType": "r7i.16xlarge",
+  "Location": "eu-west-3a"
+ },
+ {
+  "InstanceType": "r7i.24xlarge",
+  "Location": "eu-west-3a"
+ },
+ {
+  "InstanceType": "r7i.2xlarge",
+  "Location": "eu-west-3a"
+ },
+ {
+  "InstanceType": "r7i.48xlarge",
+  "Location": "eu-west-3a"
+ },
+ {
+  "InstanceType": "r7i.4xlarge",
+  "Location": "eu-west-3a"
+ },
+ {
+  "InstanceType": "r7i.8xlarge",
+  "Location": "eu-west-3a"
+ },
+ {
+  "InstanceType": "r7i.large",
+  "Location": "eu-west-3a"
+ },
+ {
+  "InstanceType": "r7i.metal-24xl",
+  "Location": "eu-west-3a"
+ },
+ {
+  "InstanceType": "r7i.metal-48xl",
+  "Location": "eu-west-3a"
+ },
+ {
+  "InstanceType": "r7i.xlarge",
+  "Location": "eu-west-3a"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "eu-west-3a"
@@ -2091,6 +2135,42 @@
   "InstanceType": "m6i.xlarge",
   "Location": "eu-west-3b"
  },
+ {
+  "InstanceType": "m7gd.12xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "m7gd.16xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "m7gd.2xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "m7gd.4xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "m7gd.8xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "m7gd.large",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "m7gd.medium",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "m7gd.xlarge",
+  "Location": "eu-west-3b"
+ },
  {
   "InstanceType": "m7i-flex.2xlarge",
   "Location": "eu-west-3b"
@@ -2499,6 +2579,50 @@
   "InstanceType": "r6i.xlarge",
   "Location": "eu-west-3b"
  },
+ {
+  "InstanceType": "r7i.12xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "r7i.16xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "r7i.24xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "r7i.2xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "r7i.48xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "r7i.4xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "r7i.8xlarge",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "r7i.large",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "r7i.metal-24xl",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "r7i.metal-48xl",
+  "Location": "eu-west-3b"
+ },
+ {
+  "InstanceType": "r7i.xlarge",
+  "Location": "eu-west-3b"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "eu-west-3b"
@@ -3471,6 +3595,42 @@
   "InstanceType": "m7g.xlarge",
   "Location": "eu-west-3c"
  },
+ {
+  "InstanceType": "m7gd.12xlarge",
+  "Location": "eu-west-3c"
+ },
+ {
+  "InstanceType": "m7gd.16xlarge",
+  "Location": "eu-west-3c"
+ },
+ {
+  "InstanceType": "m7gd.2xlarge",
+  "Location": "eu-west-3c"
+ },
+ {
+  "InstanceType": "m7gd.4xlarge",
+  "Location": "eu-west-3c"
+ },
+ {
+  "InstanceType": "m7gd.8xlarge",
+  "Location": "eu-west-3c"
+ },
+ {
+  "InstanceType": "m7gd.large",
+  "Location": "eu-west-3c"
+ },
+ {
+  "InstanceType": "m7gd.medium",
+  "Location": "eu-west-3c"
+ },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-west-3c"
+ },
+ {
+  "InstanceType": "m7gd.xlarge",
+  "Location": "eu-west-3c"
+ },
  {
   "InstanceType": "m7i-flex.2xlarge",
   "Location": "eu-west-3c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
index 5b72d317e..fa8c05842 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
@@ -3255,6 +3255,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-east-1b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-east-1b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-east-1b"
@@ -5235,6 +5239,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-east-1b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-east-1b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-east-1b"
@@ -6259,6 +6267,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-east-1c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-east-1c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-east-1c"
@@ -8231,6 +8243,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-east-1c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-east-1c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-east-1c"
@@ -9247,6 +9263,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-east-1d"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-east-1d"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-east-1d"
@@ -11251,6 +11271,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-east-1d"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-east-1d"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-east-1d"
@@ -12471,6 +12495,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-east-1f"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-east-1f"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-east-1f"
@@ -14155,6 +14183,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-east-1f"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-east-1f"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-east-1f"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
index 92708a3c2..0983bfe5c 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
@@ -587,6 +587,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-east-2a"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-east-2a"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-east-2a"
@@ -1679,6 +1683,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-east-2a"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-east-2a"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-east-2a"
@@ -2459,6 +2467,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-east-2a"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-east-2a"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-east-2a"
@@ -3411,6 +3423,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-east-2b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-east-2b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-east-2b"
@@ -4527,6 +4543,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-east-2b"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-east-2b"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-east-2b"
@@ -5319,6 +5339,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-east-2b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-east-2b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-east-2b"
@@ -6215,6 +6239,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-east-2c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-east-2c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-east-2c"
@@ -7307,6 +7335,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-east-2c"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-east-2c"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-east-2c"
@@ -8079,6 +8111,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-east-2c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-east-2c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-east-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-1.json
index d799e42d4..21ddbda08 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-1.json
@@ -471,6 +471,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-west-1a"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-west-1a"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-west-1a"
@@ -1239,6 +1243,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-west-1a"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-west-1a"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-west-1a"
@@ -1743,6 +1751,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-west-1a"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-west-1a"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-west-1a"
@@ -2455,6 +2467,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-west-1b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-west-1b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-west-1b"
@@ -3223,6 +3239,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-west-1b"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-west-1b"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-west-1b"
@@ -3727,6 +3747,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-west-1b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-west-1b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-west-1b"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
index ae234ee63..12efeb32d 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
@@ -591,6 +591,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-west-2a"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-west-2a"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-west-2a"
@@ -1791,6 +1795,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-west-2a"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-west-2a"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-west-2a"
@@ -2587,6 +2595,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-west-2a"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-west-2a"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-west-2a"
@@ -3575,6 +3587,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-west-2b"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-west-2b"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-west-2b"
@@ -4755,6 +4771,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-west-2b"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-west-2b"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-west-2b"
@@ -5539,6 +5559,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-west-2b"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-west-2b"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-west-2b"
@@ -6479,6 +6503,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-west-2c"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-west-2c"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-west-2c"
@@ -7675,6 +7703,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-west-2c"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-west-2c"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-west-2c"
@@ -8467,6 +8499,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-west-2c"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-west-2c"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-west-2c"
@@ -9367,6 +9403,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-west-2d"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-west-2d"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-west-2d"
@@ -10103,6 +10143,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-west-2d"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-west-2d"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-west-2d"
@@ -10655,6 +10699,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-west-2d"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-west-2d"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-west-2d"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json b/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json
index c29e167c1..afc617334 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-northeast-1.json
@@ -583,6 +583,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-northeast-1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-northeast-1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-northeast-1"
@@ -1739,6 +1743,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-northeast-1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-northeast-1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-northeast-1"
@@ -2519,6 +2527,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-northeast-1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-northeast-1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-northeast-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json b/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json
index 755d31c00..4ba3d1637 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-south-1.json
@@ -467,6 +467,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-south-1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-south-1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-south-1"
@@ -1199,6 +1203,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-south-1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-south-1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-south-1"
@@ -1759,6 +1767,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-south-1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-south-1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-south-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-south-2.json b/moto/ec2/resources/instance_type_offerings/region/ap-south-2.json
index e97eaf335..bbb0e4195 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-south-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-south-2.json
@@ -147,6 +147,46 @@
   "InstanceType": "c6i.xlarge",
   "Location": "ap-south-2"
  },
+ {
+  "InstanceType": "c6in.12xlarge",
+  "Location": "ap-south-2"
+ },
+ {
+  "InstanceType": "c6in.16xlarge",
+  "Location": "ap-south-2"
+ },
+ {
+  "InstanceType": "c6in.24xlarge",
+  "Location": "ap-south-2"
+ },
+ {
+  "InstanceType": "c6in.2xlarge",
+  "Location": "ap-south-2"
+ },
+ {
+  "InstanceType": "c6in.32xlarge",
+  "Location": "ap-south-2"
+ },
+ {
+  "InstanceType": "c6in.4xlarge",
+  "Location": "ap-south-2"
+ },
+ {
+  "InstanceType": "c6in.8xlarge",
+  "Location": "ap-south-2"
+ },
+ {
+  "InstanceType": "c6in.large",
+  "Location": "ap-south-2"
+ },
+ {
+  "InstanceType": "c6in.metal",
+  "Location": "ap-south-2"
+ },
+ {
+  "InstanceType": "c6in.xlarge",
+  "Location": "ap-south-2"
+ },
  {
   "InstanceType": "c7g.12xlarge",
   "Location": "ap-south-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json b/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json
index aa4e49d89..81e0e6e48 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-southeast-1.json
@@ -567,6 +567,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-southeast-1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-southeast-1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-southeast-1"
@@ -1603,6 +1607,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-southeast-1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-southeast-1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-southeast-1"
@@ -2331,6 +2339,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-southeast-1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-southeast-1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-southeast-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json b/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json
index 7821ea37b..68bd4f793 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-southeast-2.json
@@ -567,6 +567,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "ap-southeast-2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "ap-southeast-2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "ap-southeast-2"
@@ -1491,6 +1495,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "ap-southeast-2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "ap-southeast-2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "ap-southeast-2"
@@ -2143,6 +2151,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "ap-southeast-2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "ap-southeast-2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-southeast-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json b/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json
index bfba64232..5db8cb539 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-central-1.json
@@ -607,6 +607,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-central-1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-central-1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-central-1"
@@ -2439,6 +2443,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-central-1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-central-1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-central-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json b/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json
index b0c29603d..e73bb7322 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-north-1.json
@@ -427,6 +427,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-north-1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-north-1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-north-1"
@@ -1019,6 +1023,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-north-1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-north-1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-north-1"
@@ -1579,6 +1587,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-north-1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-north-1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-north-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-south-2.json b/moto/ec2/resources/instance_type_offerings/region/eu-south-2.json
index c13ff5e4c..c6c49d5a4 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-south-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-south-2.json
@@ -259,6 +259,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-south-2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-south-2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-south-2"
@@ -675,6 +679,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-south-2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-south-2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-south-2"
@@ -963,6 +971,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-south-2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-south-2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-south-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json b/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json
index d6af8f55f..b764423ed 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-west-1.json
@@ -615,6 +615,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "eu-west-1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "eu-west-1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "eu-west-1"
@@ -1811,6 +1815,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "eu-west-1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-west-1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "eu-west-1"
@@ -2595,6 +2603,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "eu-west-1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "eu-west-1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "eu-west-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json b/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json
index 6d94c29b4..743117d03 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-west-3.json
@@ -795,6 +795,42 @@
   "InstanceType": "m7g.xlarge",
   "Location": "eu-west-3"
  },
+ {
+  "InstanceType": "m7gd.12xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "m7gd.16xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "m7gd.2xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "m7gd.4xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "m7gd.8xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "m7gd.large",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "m7gd.medium",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "m7gd.xlarge",
+  "Location": "eu-west-3"
+ },
  {
   "InstanceType": "m7i-flex.2xlarge",
   "Location": "eu-west-3"
@@ -1203,6 +1239,50 @@
   "InstanceType": "r6i.xlarge",
   "Location": "eu-west-3"
  },
+ {
+  "InstanceType": "r7i.12xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "r7i.16xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "r7i.24xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "r7i.2xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "r7i.48xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "r7i.4xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "r7i.8xlarge",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "r7i.large",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "r7i.metal-24xl",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "r7i.metal-48xl",
+  "Location": "eu-west-3"
+ },
+ {
+  "InstanceType": "r7i.xlarge",
+  "Location": "eu-west-3"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "eu-west-3"
diff --git a/moto/ec2/resources/instance_type_offerings/region/us-east-1.json b/moto/ec2/resources/instance_type_offerings/region/us-east-1.json
index 32028bf0b..2a6e5b52c 100644
--- a/moto/ec2/resources/instance_type_offerings/region/us-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/us-east-1.json
@@ -615,6 +615,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-east-1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-east-1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-east-1"
@@ -2627,6 +2631,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-east-1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-east-1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-east-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/us-east-2.json b/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
index bcb7d751b..2469ff2c5 100644
--- a/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
@@ -587,6 +587,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-east-2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-east-2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-east-2"
@@ -1703,6 +1707,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-east-2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-east-2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-east-2"
@@ -2495,6 +2503,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-east-2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-east-2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-east-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/us-west-1.json b/moto/ec2/resources/instance_type_offerings/region/us-west-1.json
index 5cac74cf3..ea38afb5b 100644
--- a/moto/ec2/resources/instance_type_offerings/region/us-west-1.json
+++ b/moto/ec2/resources/instance_type_offerings/region/us-west-1.json
@@ -471,6 +471,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-west-1"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-west-1"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-west-1"
@@ -1239,6 +1243,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-west-1"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-west-1"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-west-1"
@@ -1743,6 +1751,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-west-1"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-west-1"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-west-1"
diff --git a/moto/ec2/resources/instance_type_offerings/region/us-west-2.json b/moto/ec2/resources/instance_type_offerings/region/us-west-2.json
index d70e09554..57e14a706 100644
--- a/moto/ec2/resources/instance_type_offerings/region/us-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/us-west-2.json
@@ -615,6 +615,10 @@
   "InstanceType": "c7gd.medium",
   "Location": "us-west-2"
  },
+ {
+  "InstanceType": "c7gd.metal",
+  "Location": "us-west-2"
+ },
  {
   "InstanceType": "c7gd.xlarge",
   "Location": "us-west-2"
@@ -1819,6 +1823,10 @@
   "InstanceType": "m7gd.medium",
   "Location": "us-west-2"
  },
+ {
+  "InstanceType": "m7gd.metal",
+  "Location": "us-west-2"
+ },
  {
   "InstanceType": "m7gd.xlarge",
   "Location": "us-west-2"
@@ -2615,6 +2623,10 @@
   "InstanceType": "r7gd.medium",
   "Location": "us-west-2"
  },
+ {
+  "InstanceType": "r7gd.metal",
+  "Location": "us-west-2"
+ },
  {
   "InstanceType": "r7gd.xlarge",
   "Location": "us-west-2"
diff --git a/moto/ec2/resources/instance_types.json b/moto/ec2/resources/instance_types.json
index 996b9e4ca..d5b51a9ba 100644
--- a/moto/ec2/resources/instance_types.json
+++ b/moto/ec2/resources/instance_types.json
@@ -16566,6 +16566,104 @@
    "DefaultVCpus": 1
   }
  },
+ "c7gd.metal": {
+  "AutoRecoverySupported": false,
+  "BareMetal": true,
+  "BurstablePerformanceSupported": false,
+  "CurrentGeneration": true,
+  "DedicatedHostsSupported": true,
+  "EbsInfo": {
+   "EbsOptimizedInfo": {
+    "BaselineBandwidthInMbps": 20000,
+    "BaselineIops": 80000,
+    "BaselineThroughputInMBps": 2500.0,
+    "MaximumBandwidthInMbps": 20000,
+    "MaximumIops": 80000,
+    "MaximumThroughputInMBps": 2500.0
+   },
+   "EbsOptimizedSupport": "default",
+   "EncryptionSupport": "supported",
+   "NvmeSupport": "required"
+  },
+  "FreeTierEligible": false,
+  "HibernationSupported": false,
+  "InstanceStorageInfo": {
+   "Disks": [
+    {
+     "Count": 2,
+     "SizeInGB": 1900,
+     "Type": "ssd"
+    }
+   ],
+   "EncryptionSupport": "required",
+   "NvmeSupport": "required",
+   "TotalSizeInGB": 3800
+  },
+  "InstanceStorageSupported": true,
+  "InstanceType": "c7gd.metal",
+  "MemoryInfo": {
+   "SizeInMiB": 131072
+  },
+  "NetworkInfo": {
+   "DefaultNetworkCardIndex": 0,
+   "EfaInfo": {
+    "MaximumEfaInterfaces": 1
+   },
+   "EfaSupported": true,
+   "EnaSrdSupported": false,
+   "EnaSupport": "required",
+   "EncryptionInTransitSupported": true,
+   "Ipv4AddressesPerInterface": 50,
+   "Ipv6AddressesPerInterface": 50,
+   "Ipv6Supported": true,
+   "MaximumNetworkCards": 1,
+   "MaximumNetworkInterfaces": 15,
+   "NetworkCards": [
+    {
+     "BaselineBandwidthInGbps": 30.0,
+     "MaximumNetworkInterfaces": 15,
+     "NetworkCardIndex": 0,
+     "NetworkPerformance": "30 Gigabit",
+     "PeakBandwidthInGbps": 30.0
+    }
+   ],
+   "NetworkPerformance": "30 Gigabit"
+  },
+  "NitroEnclavesSupport": "unsupported",
+  "NitroTpmSupport": "unsupported",
+  "PlacementGroupInfo": {
+   "SupportedStrategies": [
+    "cluster",
+    "partition",
+    "spread"
+   ]
+  },
+  "ProcessorInfo": {
+   "Manufacturer": "AWS",
+   "SupportedArchitectures": [
+    "arm64"
+   ],
+   "SustainedClockSpeedInGhz": 2.6
+  },
+  "SupportedBootModes": [
+   "uefi"
+  ],
+  "SupportedRootDeviceTypes": [
+   "ebs"
+  ],
+  "SupportedUsageClasses": [
+   "on-demand",
+   "spot"
+  ],
+  "SupportedVirtualizationTypes": [
+   "hvm"
+  ],
+  "VCpuInfo": {
+   "DefaultCores": 64,
+   "DefaultThreadsPerCore": 1,
+   "DefaultVCpus": 64
+  }
+ },
  "c7gd.xlarge": {
   "AutoRecoverySupported": false,
   "BareMetal": false,
@@ -73110,6 +73208,104 @@
    "DefaultVCpus": 1
   }
  },
+ "r7gd.metal": {
+  "AutoRecoverySupported": false,
+  "BareMetal": true,
+  "BurstablePerformanceSupported": false,
+  "CurrentGeneration": true,
+  "DedicatedHostsSupported": true,
+  "EbsInfo": {
+   "EbsOptimizedInfo": {
+    "BaselineBandwidthInMbps": 20000,
+    "BaselineIops": 80000,
+    "BaselineThroughputInMBps": 2500.0,
+    "MaximumBandwidthInMbps": 20000,
+    "MaximumIops": 80000,
+    "MaximumThroughputInMBps": 2500.0
+   },
+   "EbsOptimizedSupport": "default",
+   "EncryptionSupport": "supported",
+   "NvmeSupport": "required"
+  },
+  "FreeTierEligible": false,
+  "HibernationSupported": false,
+  "InstanceStorageInfo": {
+   "Disks": [
+    {
+     "Count": 2,
+     "SizeInGB": 1900,
+     "Type": "ssd"
+    }
+   ],
+   "EncryptionSupport": "required",
+   "NvmeSupport": "required",
+   "TotalSizeInGB": 3800
+  },
+  "InstanceStorageSupported": true,
+  "InstanceType": "r7gd.metal",
+  "MemoryInfo": {
+   "SizeInMiB": 524288
+  },
+  "NetworkInfo": {
+   "DefaultNetworkCardIndex": 0,
+   "EfaInfo": {
+    "MaximumEfaInterfaces": 1
+   },
+   "EfaSupported": true,
+   "EnaSrdSupported": false,
+   "EnaSupport": "required",
+   "EncryptionInTransitSupported": true,
+   "Ipv4AddressesPerInterface": 50,
+   "Ipv6AddressesPerInterface": 50,
+   "Ipv6Supported": true,
+   "MaximumNetworkCards": 1,
+   "MaximumNetworkInterfaces": 15,
+   "NetworkCards": [
+    {
+     "BaselineBandwidthInGbps": 30.0,
+     "MaximumNetworkInterfaces": 15,
+     "NetworkCardIndex": 0,
+     "NetworkPerformance": "30 Gigabit",
+     "PeakBandwidthInGbps": 30.0
+    }
+   ],
+   "NetworkPerformance": "30 Gigabit"
+  },
+  "NitroEnclavesSupport": "unsupported",
+  "NitroTpmSupport": "unsupported",
+  "PlacementGroupInfo": {
+   "SupportedStrategies": [
+    "cluster",
+    "partition",
+    "spread"
+   ]
+  },
+  "ProcessorInfo": {
+   "Manufacturer": "AWS",
+   "SupportedArchitectures": [
+    "arm64"
+   ],
+   "SustainedClockSpeedInGhz": 2.6
+  },
+  "SupportedBootModes": [
+   "uefi"
+  ],
+  "SupportedRootDeviceTypes": [
+   "ebs"
+  ],
+  "SupportedUsageClasses": [
+   "on-demand",
+   "spot"
+  ],
+  "SupportedVirtualizationTypes": [
+   "hvm"
+  ],
+  "VCpuInfo": {
+   "DefaultCores": 64,
+   "DefaultThreadsPerCore": 1,
+   "DefaultVCpus": 64
+  }
+ },
  "r7gd.xlarge": {
   "AutoRecoverySupported": false,
   "BareMetal": false,
diff --git a/moto/resiliencehub/__init__.py b/moto/resiliencehub/__init__.py
new file mode 100644
index 000000000..45490c614
--- /dev/null
+++ b/moto/resiliencehub/__init__.py
@@ -0,0 +1,1 @@
+from .models import resiliencehub_backends  # noqa: F401
diff --git a/moto/resiliencehub/exceptions.py b/moto/resiliencehub/exceptions.py
new file mode 100644
index 000000000..88c400049
--- /dev/null
+++ b/moto/resiliencehub/exceptions.py
@@ -0,0 +1,22 @@
+"""Exceptions raised by the resiliencehub service."""
+from moto.core.exceptions import JsonRESTError
+
+
+class ResourceNotFound(JsonRESTError):
+    def __init__(self, msg: str):
+        super().__init__("ResourceNotFoundException", msg)
+
+
+class AppNotFound(ResourceNotFound):
+    def __init__(self, arn: str):
+        super().__init__(f"App not found for appArn {arn}")
+
+
+class ResiliencyPolicyNotFound(ResourceNotFound):
+    def __init__(self, arn: str):
+        super().__init__(f"ResiliencyPolicy {arn} not found")
+
+
+class ValidationException(JsonRESTError):
+    def __init__(self, msg: str):
+        super().__init__("ValidationException", msg)
diff --git a/moto/resiliencehub/models.py b/moto/resiliencehub/models.py
new file mode 100644
index 000000000..173ed2437
--- /dev/null
+++ b/moto/resiliencehub/models.py
@@ -0,0 +1,212 @@
+from typing import Any, Dict, List
+
+from moto.core.base_backend import BackendDict, BaseBackend
+from moto.core.common_models import BaseModel
+from moto.core.utils import unix_time
+from moto.moto_api._internal import mock_random
+from moto.utilities.paginator import paginate
+from moto.utilities.tagging_service import TaggingService
+
+from .exceptions import AppNotFound, ResiliencyPolicyNotFound
+
+PAGINATION_MODEL = {
+    "list_apps": {
+        "input_token": "next_token",
+        "limit_key": "max_results",
+        "limit_default": 100,
+        "unique_attribute": "arn",
+    },
+    "list_resiliency_policies": {
+        "input_token": "next_token",
+        "limit_key": "max_results",
+        "limit_default": 100,
+        "unique_attribute": "arn",
+    },
+}
+
+
+class App(BaseModel):
+    def __init__(
+        self,
+        backend: "ResilienceHubBackend",
+        assessment_schedule: str,
+        description: str,
+        event_subscriptions: List[Dict[str, Any]],
+        name: str,
+        permission_model: Dict[str, Any],
+        policy_arn: str,
+    ):
+        self.backend = backend
+        self.arn = f"arn:aws:resiliencehub:{backend.region_name}:{backend.account_id}:app/{mock_random.uuid4()}"
+        self.assessment_schedule = assessment_schedule or "Disabled"
+        self.compliance_status = "NotAssessed"
+        self.description = description
+        self.creation_time = unix_time()
+        self.event_subscriptions = event_subscriptions
+        self.name = name
+        self.permission_model = permission_model
+        self.policy_arn = policy_arn
+        self.resilience_score = 0.0
+        self.status = "Active"
+
+    def to_json(self) -> Dict[str, Any]:
+        resp = {
+            "appArn": self.arn,
+            "assessmentSchedule": self.assessment_schedule,
+            "complianceStatus": self.compliance_status,
+            "creationTime": self.creation_time,
+            "name": self.name,
+            "resilienceScore": self.resilience_score,
+            "status": self.status,
+            "tags": self.backend.list_tags_for_resource(self.arn),
+        }
+        if self.description is not None:
+            resp["description"] = self.description
+        if self.event_subscriptions:
+            resp["eventSubscriptions"] = self.event_subscriptions
+        if self.permission_model:
+            resp["permissionModel"] = self.permission_model
+        if self.policy_arn:
+            resp["policyArn"] = self.policy_arn
+        return resp
+
+
+class Policy(BaseModel):
+    def __init__(
+        self,
+        backend: "ResilienceHubBackend",
+        policy: Dict[str, Dict[str, int]],
+        policy_name: str,
+        data_location_constraint: str,
+        policy_description: str,
+        tier: str,
+    ):
+        self.arn = f"arn:aws:resiliencehub:{backend.region_name}:{backend.account_id}:resiliency-policy/{mock_random.uuid4()}"
+        self.backend = backend
+        self.data_location_constraint = data_location_constraint
+        self.creation_time = unix_time()
+        self.policy = policy
+        self.policy_description = policy_description
+        self.policy_name = policy_name
+        self.tier = tier
+
+    def to_json(self) -> Dict[str, Any]:
+        resp = {
+            "creationTime": self.creation_time,
+            "policy": self.policy,
+            "policyArn": self.arn,
+            "policyName": self.policy_name,
+            "tags": self.backend.list_tags_for_resource(self.arn),
+            "tier": self.tier,
+        }
+        if self.data_location_constraint:
+            resp["dataLocationConstraint"] = self.data_location_constraint
+        if self.policy_description:
+            resp["policyDescription"] = self.policy_description
+        return resp
+
+
+class ResilienceHubBackend(BaseBackend):
+    def __init__(self, region_name: str, account_id: str):
+        super().__init__(region_name, account_id)
+        self.apps: Dict[str, App] = dict()
+        self.policies: Dict[str, Policy] = dict()
+        self.tagger = TaggingService()
+
+    def create_app(
+        self,
+        assessment_schedule: str,
+        description: str,
+        event_subscriptions: List[Dict[str, Any]],
+        name: str,
+        permission_model: Dict[str, Any],
+        policy_arn: str,
+        tags: Dict[str, str],
+    ) -> App:
+        """
+        The ClientToken-parameter is not yet implemented
+        """
+        app = App(
+            backend=self,
+            assessment_schedule=assessment_schedule,
+            description=description,
+            event_subscriptions=event_subscriptions,
+            name=name,
+            permission_model=permission_model,
+            policy_arn=policy_arn,
+        )
+        self.apps[app.arn] = app
+        self.tag_resource(app.arn, tags)
+        return app
+
+    def create_resiliency_policy(
+        self,
+        data_location_constraint: str,
+        policy: Dict[str, Any],
+        policy_description: str,
+        policy_name: str,
+        tags: Dict[str, str],
+        tier: str,
+    ) -> Policy:
+        """
+        The ClientToken-parameter is not yet implemented
+        """
+        pol = Policy(
+            backend=self,
+            data_location_constraint=data_location_constraint,
+            policy=policy,
+            policy_description=policy_description,
+            policy_name=policy_name,
+            tier=tier,
+        )
+        self.policies[pol.arn] = pol
+        self.tag_resource(pol.arn, tags)
+        return pol
+
+    @paginate(PAGINATION_MODEL)
+    def list_apps(self, app_arn: str, name: str, reverse_order: bool) -> List[App]:
+        """
+        The FromAssessmentTime/ToAssessmentTime-parameters are not yet implemented
+        """
+        if name:
+            app_summaries = [a for a in self.apps.values() if a.name == name]
+        elif app_arn:
+            app_summaries = [self.apps[app_arn]]
+        else:
+            app_summaries = list(self.apps.values())
+        if reverse_order:
+            app_summaries.reverse()
+        return app_summaries
+
+    def list_app_assessments(self) -> List[str]:
+        return []
+
+    def describe_app(self, app_arn: str) -> App:
+        if app_arn not in self.apps:
+            raise AppNotFound(app_arn)
+        return self.apps[app_arn]
+
+    @paginate(pagination_model=PAGINATION_MODEL)
+    def list_resiliency_policies(self, policy_name: str) -> List[Policy]:
+        if policy_name:
+            return [p for p in self.policies.values() if p.policy_name == policy_name]
+        return list(self.policies.values())
+
+    def describe_resiliency_policy(self, policy_arn: str) -> Policy:
+        if policy_arn not in self.policies:
+            raise ResiliencyPolicyNotFound(policy_arn)
+        return self.policies[policy_arn]
+
+    def tag_resource(self, resource_arn: str, tags: Dict[str, str]) -> None:
+        self.tagger.tag_resource(
+            resource_arn, TaggingService.convert_dict_to_tags_input(tags)
+        )
+
+    def untag_resource(self, resource_arn: str, tag_keys: List[str]) -> None:
+        self.tagger.untag_resource_using_names(resource_arn, tag_keys)
+
+    def list_tags_for_resource(self, resource_arn: str) -> Dict[str, str]:
+        return self.tagger.get_tag_dict_for_resource(resource_arn)
+
+
+resiliencehub_backends = BackendDict(ResilienceHubBackend, "resiliencehub")
diff --git a/moto/resiliencehub/responses.py b/moto/resiliencehub/responses.py
new file mode 100644
index 000000000..c9b530613
--- /dev/null
+++ b/moto/resiliencehub/responses.py
@@ -0,0 +1,159 @@
+import json
+from typing import Any
+from urllib.parse import unquote
+
+from moto.core.responses import BaseResponse
+
+from .exceptions import ValidationException
+from .models import ResilienceHubBackend, resiliencehub_backends
+
+
+class ResilienceHubResponse(BaseResponse):
+    def tags(self, request: Any, full_url: str, headers: Any) -> str:  # type: ignore[return]
+        self.setup_class(request, full_url, headers)
+        if request.method == "GET":
+            return self.list_tags_for_resource()
+        if request.method == "POST":
+            return self.tag_resource()
+        if request.method == "DELETE":
+            return self.untag_resource()
+
+    def __init__(self) -> None:
+        super().__init__(service_name="resiliencehub")
+
+    @property
+    def resiliencehub_backend(self) -> ResilienceHubBackend:
+        return resiliencehub_backends[self.current_account][self.region]
+
+    def create_app(self) -> str:
+        params = json.loads(self.body)
+        assessment_schedule = params.get("assessmentSchedule")
+        description = params.get("description")
+        event_subscriptions = params.get("eventSubscriptions")
+        name = params.get("name")
+        permission_model = params.get("permissionModel")
+        policy_arn = params.get("policyArn")
+        tags = params.get("tags")
+        app = self.resiliencehub_backend.create_app(
+            assessment_schedule=assessment_schedule,
+            description=description,
+            event_subscriptions=event_subscriptions,
+            name=name,
+            permission_model=permission_model,
+            policy_arn=policy_arn,
+            tags=tags,
+        )
+        return json.dumps(dict(app=app.to_json()))
+
+    def create_resiliency_policy(self) -> str:
+        params = json.loads(self.body)
+        data_location_constraint = params.get("dataLocationConstraint")
+        policy = params.get("policy")
+        policy_description = params.get("policyDescription")
+        policy_name = params.get("policyName")
+        tags = params.get("tags")
+        tier = params.get("tier")
+
+        required_policy_types = ["Software", "Hardware", "AZ"]
+        all_policy_types = required_policy_types + ["Region"]
+        if any((p_type not in all_policy_types for p_type in policy.keys())):
+            raise ValidationException(
+                "1 validation error detected: Value at 'policy' failed to satisfy constraint: Map keys must satisfy constraint: [Member must satisfy enum value set: [Software, Hardware, Region, AZ]]"
+            )
+        for required_key in required_policy_types:
+            if required_key not in policy.keys():
+                raise ValidationException(
+                    f"FailureType {required_key.upper()} does not exist"
+                )
+
+        policy = self.resiliencehub_backend.create_resiliency_policy(
+            data_location_constraint=data_location_constraint,
+            policy=policy,
+            policy_description=policy_description,
+            policy_name=policy_name,
+            tags=tags,
+            tier=tier,
+        )
+        return json.dumps(dict(policy=policy.to_json()))
+
+    def list_apps(self) -> str:
+        params = self._get_params()
+        app_arn = params.get("appArn")
+        max_results = int(params.get("maxResults", 100))
+        name = params.get("name")
+        next_token = params.get("nextToken")
+        reverse_order = params.get("reverseOrder") == "true"
+        app_summaries, next_token = self.resiliencehub_backend.list_apps(
+            app_arn=app_arn,
+            max_results=max_results,
+            name=name,
+            next_token=next_token,
+            reverse_order=reverse_order,
+        )
+        return json.dumps(
+            dict(
+                appSummaries=[a.to_json() for a in app_summaries], nextToken=next_token
+            )
+        )
+
+    def list_app_assessments(self) -> str:
+        summaries = self.resiliencehub_backend.list_app_assessments()
+        return json.dumps(dict(assessmentSummaries=summaries))
+
+    def describe_app(self) -> str:
+        params = json.loads(self.body)
+        app_arn = params.get("appArn")
+        app = self.resiliencehub_backend.describe_app(
+            app_arn=app_arn,
+        )
+        return json.dumps(dict(app=app.to_json()))
+
+    def list_resiliency_policies(self) -> str:
+        params = self._get_params()
+        max_results = int(params.get("maxResults", 100))
+        next_token = params.get("nextToken")
+        policy_name = params.get("policyName")
+        (
+            resiliency_policies,
+            next_token,
+        ) = self.resiliencehub_backend.list_resiliency_policies(
+            max_results=max_results,
+            next_token=next_token,
+            policy_name=policy_name,
+        )
+        policies = [p.to_json() for p in resiliency_policies]
+        return json.dumps(dict(nextToken=next_token, resiliencyPolicies=policies))
+
+    def describe_resiliency_policy(self) -> str:
+        params = json.loads(self.body)
+        policy_arn = params.get("policyArn")
+        policy = self.resiliencehub_backend.describe_resiliency_policy(
+            policy_arn=policy_arn,
+        )
+        return json.dumps(dict(policy=policy.to_json()))
+
+    def tag_resource(self) -> str:
+        params = json.loads(self.body)
+        resource_arn = unquote(self.parsed_url.path.split("/tags/")[-1])
+        tags = params.get("tags")
+        self.resiliencehub_backend.tag_resource(
+            resource_arn=resource_arn,
+            tags=tags,
+        )
+        return "{}"
+
+    def untag_resource(self) -> str:
+        resource_arn = unquote(self.parsed_url.path.split("/tags/")[-1])
+        tag_keys = self.querystring.get("tagKeys", [])
+        self.resiliencehub_backend.untag_resource(
+            resource_arn=resource_arn,
+            tag_keys=tag_keys,
+        )
+        return "{}"
+
+    def list_tags_for_resource(self) -> str:
+        resource_arn = unquote(self.uri.split("/tags/")[-1])
+        tags = self.resiliencehub_backend.list_tags_for_resource(
+            resource_arn=resource_arn,
+        )
+        return json.dumps(dict(tags=tags))
diff --git a/moto/resiliencehub/urls.py b/moto/resiliencehub/urls.py
new file mode 100644
index 000000000..a39663688
--- /dev/null
+++ b/moto/resiliencehub/urls.py
@@ -0,0 +1,21 @@
+"""resiliencehub base URL and path."""
+from .responses import ResilienceHubResponse
+
+url_bases = [
+    r"https?://resiliencehub\.(.+)\.amazonaws\.com",
+]
+
+url_paths = {
+    "{0}/create-app$": ResilienceHubResponse.dispatch,
+    "{0}/create-resiliency-policy$": ResilienceHubResponse.dispatch,
+    "{0}/describe-app$": ResilienceHubResponse.dispatch,
+    "{0}/describe-resiliency-policy$": ResilienceHubResponse.dispatch,
+    "{0}/list-apps$": ResilienceHubResponse.dispatch,
+    "{0}/list-app-assessments$": ResilienceHubResponse.dispatch,
+    "{0}/list-resiliency-policies$": ResilienceHubResponse.dispatch,
+    "{0}/tags/.+$": ResilienceHubResponse.dispatch,
+    "{0}/tags/(?P<arn_prefix>[^/]+)/(?P<workspace_id>[^/]+)$": ResilienceHubResponse.method_dispatch(
+        ResilienceHubResponse.tags  # type: ignore
+    ),
+    "{0}/.*$": ResilienceHubResponse.dispatch,
+}
diff --git a/moto/s3/models.py b/moto/s3/models.py
index af52a9b79..b96a1581c 100644
--- a/moto/s3/models.py
+++ b/moto/s3/models.py
@@ -42,6 +42,7 @@ from moto.s3.exceptions import (
     InvalidBucketName,
     InvalidNotificationDestination,
     InvalidNotificationEvent,
+    InvalidObjectState,
     InvalidPart,
     InvalidPublicAccessBlockConfiguration,
     InvalidRequest,
@@ -197,6 +198,25 @@ class FakeKey(BaseModel, ManagedState):
         self._value_buffer.write(new_value)
         self.contentsize = len(new_value)
 
+    @property
+    def status(self) -> Optional[str]:
+        previous = self._status
+        new_status = super().status
+        if previous != "RESTORED" and new_status == "RESTORED":
+            s3_backend = s3_backends[self.account_id]["global"]
+            bucket = s3_backend.get_bucket(self.bucket_name)  # type: ignore
+            notifications.send_event(
+                self.account_id,
+                notifications.S3NotificationEvent.OBJECT_RESTORE_COMPLETED_EVENT,
+                bucket,
+                key=self,
+            )
+        return new_status
+
+    @status.setter
+    def status(self, value: str) -> None:
+        self._status = value
+
     def set_metadata(self, metadata: Any, replace: bool = False) -> None:
         if replace:
             self._metadata = {}  # type: ignore
@@ -215,6 +235,14 @@ class FakeKey(BaseModel, ManagedState):
 
     def restore(self, days: int) -> None:
         self._expiry = utcnow() + datetime.timedelta(days)
+        s3_backend = s3_backends[self.account_id]["global"]
+        bucket = s3_backend.get_bucket(self.bucket_name)  # type: ignore
+        notifications.send_event(
+            self.account_id,
+            notifications.S3NotificationEvent.OBJECT_RESTORE_POST_EVENT,
+            bucket,
+            key=self,
+        )
 
     @property
     def etag(self) -> str:
@@ -2336,8 +2364,11 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider):
          - EventBridge
 
         For the following events:
+         - 's3:ObjectCreated:CompleteMultipartUpload'
          - 's3:ObjectCreated:Copy'
+         - 's3:ObjectCreated:Post'
          - 's3:ObjectCreated:Put'
+         - 's3:ObjectDeleted'
         """
         bucket = self.get_bucket(bucket_name)
         bucket.set_notification_configuration(notification_config)
@@ -2851,6 +2882,26 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider):
             for x in query_result
         ]
 
+    def restore_object(self, bucket_name: str, key_name: str, days: str) -> bool:
+        key = self.get_object(bucket_name, key_name)
+        if not key:
+            raise MissingKey
+        if key.storage_class not in ARCHIVE_STORAGE_CLASSES:
+            raise InvalidObjectState(storage_class=key.storage_class)
+        had_expiry_date = key.expiry_date is not None
+        key.restore(int(days))
+        return had_expiry_date
+
+    def upload_file(self) -> None:
+        # Listed for the implementation coverage
+        # Implementation part of responses.py
+        pass
+
+    def upload_fileobj(self) -> None:
+        # Listed for the implementation coverage
+        # Implementation part of responses.py
+        pass
+
 
 class S3BackendDict(BackendDict[S3Backend]):
     """
diff --git a/moto/s3/responses.py b/moto/s3/responses.py
index 629df1c4e..a737f74df 100644
--- a/moto/s3/responses.py
+++ b/moto/s3/responses.py
@@ -2274,14 +2274,11 @@ class S3Response(BaseResponse):
         elif "restore" in query:
             es = minidom.parseString(body).getElementsByTagName("Days")
             days = es[0].childNodes[0].wholeText
-            key = self.backend.get_object(bucket_name, key_name)  # type: ignore
-            if key.storage_class not in ARCHIVE_STORAGE_CLASSES:  # type: ignore
-                raise InvalidObjectState(storage_class=key.storage_class)  # type: ignore
-            r = 202
-            if key.expiry_date is not None:  # type: ignore
-                r = 200
-            key.restore(int(days))  # type: ignore
-            return r, {}, ""
+            previously_restored = self.backend.restore_object(
+                bucket_name, key_name, days
+            )
+            status_code = 200 if previously_restored else 202
+            return status_code, {}, ""
         elif "select" in query:
             request = xmltodict.parse(body)["SelectObjectContentRequest"]
             select_query = request["Expression"]
diff --git a/moto/sqs/models.py b/moto/sqs/models.py
index d3f9705a6..66860fe49 100644
--- a/moto/sqs/models.py
+++ b/moto/sqs/models.py
@@ -850,15 +850,15 @@ class SQSBackend(BaseBackend):
     ) -> Message:
         queue = self.get_queue(queue_name)
 
+        self._validate_message(
+            queue, message_body, int(delay_seconds or 0), deduplication_id, group_id
+        )
+
         if delay_seconds is not None:
             delay_seconds = int(delay_seconds)
         else:
             delay_seconds = queue.delay_seconds  # type: ignore
 
-        self._validate_message(
-            queue, message_body, delay_seconds, deduplication_id, group_id
-        )
-
         message_id = str(random.uuid4())
         message = Message(message_id, message_body, system_attributes)
 
diff --git a/moto/ssm/resources/regions.json b/moto/ssm/resources/regions.json
index 71a0651c2..310b48e7b 100644
--- a/moto/ssm/resources/regions.json
+++ b/moto/ssm/resources/regions.json
@@ -1531,15 +1531,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -3173,15 +3164,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -5796,15 +5778,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -8199,15 +8172,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -9825,15 +9789,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -12042,15 +11997,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -12814,6 +12760,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "identitystore": {
+                "Value": "identitystore",
+                "endpoint": {
+                  "Value": "identitystore.ap-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "imagebuilder": {
                 "Value": "imagebuilder",
                 "endpoint": {
@@ -13303,15 +13258,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -15811,15 +15757,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -18514,15 +18451,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -20018,15 +19946,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -21231,15 +21150,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -22255,7 +22165,7 @@
                   "Value": "iot.ca-central-1.amazonaws.com"
                 },
                 "protocols": {
-                  "Value": "HTTPS"
+                  "Value": "https"
                 }
               },
               "fsx": {
@@ -23467,15 +23377,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -24079,6 +23980,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "guardduty": {
+                "Value": "guardduty",
+                "endpoint": {
+                  "Value": "guardduty.ca-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "iam": {
                 "Value": "iam",
                 "endpoint": {
@@ -24115,6 +24025,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "lakeformation": {
+                "Value": "lakeformation",
+                "endpoint": {
+                  "Value": "lakeformation.ca-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "lambda": {
                 "Value": "lambda",
                 "endpoint": {
@@ -24409,15 +24328,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -29799,15 +29709,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -31146,15 +31047,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -33136,15 +33028,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -34742,15 +34625,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -35301,6 +35175,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "emr-containers": {
+                "Value": "emr-containers",
+                "endpoint": {
+                  "Value": "emr-containers.eu-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "emr-serverless": {
                 "Value": "emr-serverless",
                 "endpoint": {
@@ -35430,6 +35313,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "identitystore": {
+                "Value": "identitystore",
+                "endpoint": {
+                  "Value": "identitystore.eu-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "imagebuilder": {
                 "Value": "imagebuilder",
                 "endpoint": {
@@ -35940,15 +35832,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -41123,15 +41006,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -43163,15 +43037,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -44472,15 +44337,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -44884,6 +44740,24 @@
                   "Value": "HTTPS"
                 }
               },
+              "cognito-identity": {
+                "Value": "cognito-identity",
+                "endpoint": {
+                  "Value": "cognito-identity.me-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
+              "cognito-idp": {
+                "Value": "cognito-idp",
+                "endpoint": {
+                  "Value": "cognito-idp.me-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "compute-optimizer": {
                 "Value": "compute-optimizer",
                 "endpoint": {
@@ -45808,15 +45682,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -47441,15 +47306,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -49404,15 +49260,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -50829,7 +50676,7 @@
                   "Value": "iot.us-east-1.amazonaws.com"
                 },
                 "protocols": {
-                  "Value": "HTTPS"
+                  "Value": "https"
                 }
               },
               "fsx": {
@@ -53781,7 +53628,7 @@
                   "Value": "iot.us-east-2.amazonaws.com"
                 },
                 "protocols": {
-                  "Value": "HTTPS"
+                  "Value": "https"
                 }
               },
               "fsx": {
@@ -55134,15 +54981,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -56587,15 +56425,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-gov-west-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -59184,7 +59013,7 @@
                   "Value": "iot.us-west-1.amazonaws.com"
                 },
                 "protocols": {
-                  "Value": "HTTPS"
+                  "Value": "https"
                 }
               },
               "fsx": {
@@ -60267,15 +60096,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "support": {
-                "Value": "support",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "swf": {
                 "Value": "swf",
                 "endpoint": {
@@ -61605,7 +61425,7 @@
                   "Value": "iot.us-west-2.amazonaws.com"
                 },
                 "protocols": {
-                  "Value": "HTTPS"
+                  "Value": "https"
                 }
               },
               "fsx": {
diff --git a/moto/ssm/resources/services.json b/moto/ssm/resources/services.json
index c09d89519..5235d9592 100644
--- a/moto/ssm/resources/services.json
+++ b/moto/ssm/resources/services.json
@@ -13560,6 +13560,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "me-central-1": {
+                "Value": "me-central-1",
+                "endpoint": {
+                  "Value": "cognito-identity.me-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "me-south-1": {
                 "Value": "me-south-1",
                 "endpoint": {
@@ -13775,6 +13784,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "me-central-1": {
+                "Value": "me-central-1",
+                "endpoint": {
+                  "Value": "cognito-idp.me-central-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "me-south-1": {
                 "Value": "me-south-1",
                 "endpoint": {
@@ -23031,6 +23049,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "eu-south-2": {
+                "Value": "eu-south-2",
+                "endpoint": {
+                  "Value": "emr-containers.eu-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "eu-west-1": {
                 "Value": "eu-west-1",
                 "endpoint": {
@@ -26026,7 +26053,7 @@
                   "Value": "iot.ca-central-1.amazonaws.com"
                 },
                 "protocols": {
-                  "Value": "HTTPS"
+                  "Value": "https"
                 }
               },
               "cn-north-1": {
@@ -26116,7 +26143,7 @@
                   "Value": "iot.us-east-1.amazonaws.com"
                 },
                 "protocols": {
-                  "Value": "HTTPS"
+                  "Value": "https"
                 }
               },
               "us-east-2": {
@@ -26125,7 +26152,7 @@
                   "Value": "iot.us-east-2.amazonaws.com"
                 },
                 "protocols": {
-                  "Value": "HTTPS"
+                  "Value": "https"
                 }
               },
               "us-west-1": {
@@ -26134,7 +26161,7 @@
                   "Value": "iot.us-west-1.amazonaws.com"
                 },
                 "protocols": {
-                  "Value": "HTTPS"
+                  "Value": "https"
                 }
               },
               "us-west-2": {
@@ -26143,7 +26170,7 @@
                   "Value": "iot.us-west-2.amazonaws.com"
                 },
                 "protocols": {
-                  "Value": "HTTPS"
+                  "Value": "https"
                 }
               }
             }
@@ -29052,6 +29079,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ca-west-1": {
+                "Value": "ca-west-1",
+                "endpoint": {
+                  "Value": "guardduty.ca-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "cn-north-1": {
                 "Value": "cn-north-1",
                 "endpoint": {
@@ -29947,6 +29983,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ap-south-2": {
+                "Value": "ap-south-2",
+                "endpoint": {
+                  "Value": "identitystore.ap-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "ap-southeast-1": {
                 "Value": "ap-southeast-1",
                 "endpoint": {
@@ -30046,6 +30091,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "eu-south-2": {
+                "Value": "eu-south-2",
+                "endpoint": {
+                  "Value": "identitystore.eu-south-2.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "eu-west-1": {
                 "Value": "eu-west-1",
                 "endpoint": {
@@ -35676,6 +35730,15 @@
                   "Value": "HTTPS"
                 }
               },
+              "ca-west-1": {
+                "Value": "ca-west-1",
+                "endpoint": {
+                  "Value": "lakeformation.ca-west-1.amazonaws.com"
+                },
+                "protocols": {
+                  "Value": "HTTPS"
+                }
+              },
               "cn-north-1": {
                 "Value": "cn-north-1",
                 "endpoint": {
@@ -60754,123 +60817,6 @@
               "Value": "https://aws.amazon.com/premiumsupport/"
             },
             "regions": {
-              "af-south-1": {
-                "Value": "af-south-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ap-east-1": {
-                "Value": "ap-east-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ap-northeast-1": {
-                "Value": "ap-northeast-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ap-northeast-2": {
-                "Value": "ap-northeast-2",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ap-northeast-3": {
-                "Value": "ap-northeast-3",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ap-south-1": {
-                "Value": "ap-south-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ap-south-2": {
-                "Value": "ap-south-2",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ap-southeast-1": {
-                "Value": "ap-southeast-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ap-southeast-2": {
-                "Value": "ap-southeast-2",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ap-southeast-3": {
-                "Value": "ap-southeast-3",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ap-southeast-4": {
-                "Value": "ap-southeast-4",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ca-central-1": {
-                "Value": "ca-central-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "ca-west-1": {
-                "Value": "ca-west-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "cn-north-1": {
                 "Value": "cn-north-1",
                 "endpoint": {
@@ -60889,51 +60835,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "eu-central-1": {
-                "Value": "eu-central-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "eu-central-2": {
-                "Value": "eu-central-2",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "eu-north-1": {
-                "Value": "eu-north-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "eu-south-1": {
-                "Value": "eu-south-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "eu-south-2": {
-                "Value": "eu-south-2",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "eu-west-1": {
                 "Value": "eu-west-1",
                 "endpoint": {
@@ -60943,60 +60844,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "eu-west-2": {
-                "Value": "eu-west-2",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "eu-west-3": {
-                "Value": "eu-west-3",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "il-central-1": {
-                "Value": "il-central-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "me-central-1": {
-                "Value": "me-central-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "me-south-1": {
-                "Value": "me-south-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "sa-east-1": {
-                "Value": "sa-east-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "us-east-1": {
                 "Value": "us-east-1",
                 "endpoint": {
@@ -61006,24 +60853,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "us-east-2": {
-                "Value": "us-east-2",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
-              "us-gov-east-1": {
-                "Value": "us-gov-east-1",
-                "endpoint": {
-                  "Value": "support.us-gov-west-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "us-gov-west-1": {
                 "Value": "us-gov-west-1",
                 "endpoint": {
@@ -61033,15 +60862,6 @@
                   "Value": "HTTPS"
                 }
               },
-              "us-west-1": {
-                "Value": "us-west-1",
-                "endpoint": {
-                  "Value": "support.us-east-1.amazonaws.com"
-                },
-                "protocols": {
-                  "Value": "HTTPS"
-                }
-              },
               "us-west-2": {
                 "Value": "us-west-2",
                 "endpoint": {
diff --git a/scripts/implementation_coverage.py b/scripts/implementation_coverage.py
index 05adab0b8..63af558b6 100755
--- a/scripts/implementation_coverage.py
+++ b/scripts/implementation_coverage.py
@@ -47,6 +47,9 @@ def calculate_extended_implementation_coverage():
         operation_names = [
             xform_name(op) for op in real_client.meta.service_model.operation_names
         ]
+        # Not part of the spec - but very much part of S3
+        if service_name == "s3":
+            operation_names.extend(["upload_file", "upload_fileobj"])
 
         for op in operation_names:
             if moto_client and op in dir(moto_client):
@@ -76,6 +79,9 @@ def calculate_implementation_coverage():
         operation_names = [
             xform_name(op) for op in real_client.meta.service_model.operation_names
         ]
+        # Not part of the spec - but very much part of S3
+        if service_name == "s3":
+            operation_names.extend(["upload_file", "upload_fileobj"])
         for op in operation_names:
             if moto_client and op in dir(moto_client):
                 implemented.append(op)


Test patch:
diff --git a/.github/workflows/tests_real_aws.yml b/.github/workflows/tests_real_aws.yml
index 835bcd28e..350464194 100644
--- a/.github/workflows/tests_real_aws.yml
+++ b/.github/workflows/tests_real_aws.yml
@@ -42,4 +42,4 @@ jobs:
       env:
         MOTO_TEST_ALLOW_AWS_REQUEST: ${{ true }}
       run: |
-        pytest -sv tests/test_dynamodb/ tests/test_ec2/ tests/test_lakeformation/ tests/test_logs/ tests/test_ses/ tests/test_s3* tests/test_sns/ -m aws_verified
+        pytest -sv tests/test_dynamodb/ tests/test_ec2/ tests/test_iam/ tests/test_lakeformation/ tests/test_logs/ tests/test_sqs/ tests/test_ses/ tests/test_s3* tests/test_sns/ -m aws_verified
diff --git a/.github/workflows/tests_terraform_examples.yml b/.github/workflows/tests_terraform_examples.yml
index 751f98c06..8dfa291b9 100644
--- a/.github/workflows/tests_terraform_examples.yml
+++ b/.github/workflows/tests_terraform_examples.yml
@@ -39,3 +39,31 @@ jobs:
         sleep 30
         terraform plan -detailed-exitcode
         terraform apply -destroy --auto-approve
+
+  test_create_only:
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        service: ["ec2"]
+
+    steps:
+    - uses: actions/checkout@v4
+      with:
+        fetch-depth: 0
+    - name: Set up Python 3.8
+      uses: actions/setup-python@v5
+      with:
+        python-version: "3.8"
+    - name: Start MotoServer
+      run: |
+        pip install build
+        python -m build
+        docker run --rm -t --name motoserver -e TEST_SERVER_MODE=true -e AWS_SECRET_ACCESS_KEY=server_secret -e AWS_ACCESS_KEY_ID=server_key -v `pwd`:/moto -p 5000:5000 -v /var/run/docker.sock:/var/run/docker.sock python:3.10-slim /moto/scripts/ci_moto_server.sh &
+        python scripts/ci_wait_for_server.py
+    - name: Run tests
+      run: |
+        mkdir ~/.aws && touch ~/.aws/credentials && echo -e "[default]\naws_access_key_id = test\naws_secret_access_key = test" > ~/.aws/credentials
+        cd other_langs/terraform/${{ matrix.service }}
+        terraform init
+        terraform apply --auto-approve
diff --git a/tests/test_dynamodb/exceptions/test_dynamodb_exceptions.py b/tests/test_dynamodb/exceptions/test_dynamodb_exceptions.py
index 486d3dbf1..a29f15e09 100644
--- a/tests/test_dynamodb/exceptions/test_dynamodb_exceptions.py
+++ b/tests/test_dynamodb/exceptions/test_dynamodb_exceptions.py
@@ -1273,3 +1273,90 @@ def test_too_many_key_schema_attributes():
     err = exc.value.response["Error"]
     assert err["Code"] == "ValidationException"
     assert err["Message"] == expected_err
+
+
+@mock_aws
+def test_cannot_query_gsi_with_consistent_read():
+    dynamodb = boto3.client("dynamodb", region_name="us-east-1")
+    dynamodb.create_table(
+        TableName="test",
+        KeySchema=[{"AttributeName": "id", "KeyType": "HASH"}],
+        AttributeDefinitions=[
+            {"AttributeName": "id", "AttributeType": "S"},
+            {"AttributeName": "gsi_hash_key", "AttributeType": "S"},
+            {"AttributeName": "gsi_range_key", "AttributeType": "S"},
+        ],
+        ProvisionedThroughput={"ReadCapacityUnits": 1, "WriteCapacityUnits": 1},
+        GlobalSecondaryIndexes=[
+            {
+                "IndexName": "test_gsi",
+                "KeySchema": [
+                    {"AttributeName": "gsi_hash_key", "KeyType": "HASH"},
+                    {"AttributeName": "gsi_range_key", "KeyType": "RANGE"},
+                ],
+                "Projection": {"ProjectionType": "ALL"},
+                "ProvisionedThroughput": {
+                    "ReadCapacityUnits": 1,
+                    "WriteCapacityUnits": 1,
+                },
+            }
+        ],
+    )
+
+    with pytest.raises(ClientError) as exc:
+        dynamodb.query(
+            TableName="test",
+            IndexName="test_gsi",
+            KeyConditionExpression="gsi_hash_key = :gsi_hash_key and gsi_range_key = :gsi_range_key",
+            ExpressionAttributeValues={
+                ":gsi_hash_key": {"S": "key1"},
+                ":gsi_range_key": {"S": "range1"},
+            },
+            ConsistentRead=True,
+        )
+
+    assert exc.value.response["Error"] == {
+        "Code": "ValidationException",
+        "Message": "Consistent reads are not supported on global secondary indexes",
+    }
+
+
+@mock_aws
+def test_cannot_scan_gsi_with_consistent_read():
+    dynamodb = boto3.client("dynamodb", region_name="us-east-1")
+    dynamodb.create_table(
+        TableName="test",
+        KeySchema=[{"AttributeName": "id", "KeyType": "HASH"}],
+        AttributeDefinitions=[
+            {"AttributeName": "id", "AttributeType": "S"},
+            {"AttributeName": "gsi_hash_key", "AttributeType": "S"},
+            {"AttributeName": "gsi_range_key", "AttributeType": "S"},
+        ],
+        ProvisionedThroughput={"ReadCapacityUnits": 1, "WriteCapacityUnits": 1},
+        GlobalSecondaryIndexes=[
+            {
+                "IndexName": "test_gsi",
+                "KeySchema": [
+                    {"AttributeName": "gsi_hash_key", "KeyType": "HASH"},
+                    {"AttributeName": "gsi_range_key", "KeyType": "RANGE"},
+                ],
+                "Projection": {"ProjectionType": "ALL"},
+                "ProvisionedThroughput": {
+                    "ReadCapacityUnits": 1,
+                    "WriteCapacityUnits": 1,
+                },
+            }
+        ],
+    )
+
+    with pytest.raises(ClientError) as exc:
+        dynamodb.scan(
+            TableName="test",
+            IndexName="test_gsi",
+            ConsistentRead=True,
+        )
+
+    assert exc.value.response["Error"] == {
+        "Code": "ValidationException",
+        "Message": "Consistent reads are not supported on global secondary indexes",
+    }
diff --git a/tests/test_dynamodb/test_dynamodb_table_with_range_key.py b/tests/test_dynamodb/test_dynamodb_table_with_range_key.py
index aafad7f1c..16fb11bf5 100644
--- a/tests/test_dynamodb/test_dynamodb_table_with_range_key.py
+++ b/tests/test_dynamodb/test_dynamodb_table_with_range_key.py
@@ -812,7 +812,6 @@ def test_boto3_query_gsi_range_comparison():
     # And reverse order of hash + range key
     results = table.query(
         KeyConditionExpression=Key("created").gt(1) & Key("username").eq("johndoe"),
-        ConsistentRead=True,
         IndexName="TestGSI",
     )
     assert results["Count"] == 2
@@ -1096,6 +1095,76 @@ def test_query_pagination():
     assert subjects == set(range(10))
 
 
+@mock_aws
+def test_query_by_local_secondary_index():
+    dynamodb = boto3.resource("dynamodb", region_name="us-east-1")
+
+    table = dynamodb.create_table(
+        TableName="test",
+        KeySchema=[
+            {"AttributeName": "id", "KeyType": "HASH"},
+            {"AttributeName": "range_key", "KeyType": "RANGE"},
+        ],
+        AttributeDefinitions=[
+            {"AttributeName": "id", "AttributeType": "S"},
+            {"AttributeName": "range_key", "AttributeType": "S"},
+            {"AttributeName": "lsi_range_key", "AttributeType": "S"},
+        ],
+        ProvisionedThroughput={"ReadCapacityUnits": 1, "WriteCapacityUnits": 1},
+        LocalSecondaryIndexes=[
+            {
+                "IndexName": "test_lsi",
+                "KeySchema": [
+                    {"AttributeName": "id", "KeyType": "HASH"},
+                    {"AttributeName": "lsi_range_key", "KeyType": "RANGE"},
+                ],
+                "Projection": {"ProjectionType": "ALL"},
+            }
+        ],
+    )
+
+    table.put_item(
+        Item={
+            "id": "1",
+            "range_key": "1",
+            "col1": "val1",
+            "lsi_range_key": "1",
+        },
+    )
+
+    table.put_item(
+        Item={
+            "id": "1",
+            "range_key": "2",
+            "col1": "val2",
+            "lsi_range_key": "2",
+        },
+    )
+
+    table.put_item(
+        Item={"id": "3", "range_key": "1", "col1": "val3"},
+    )
+
+    res = table.query(
+        KeyConditionExpression=Key("id").eq("1") & Key("lsi_range_key").eq("1"),
+        IndexName="test_lsi",
+    )
+    assert res["Count"] == 1
+    assert res["Items"] == [
+        {"id": "1", "range_key": "1", "col1": "val1", "lsi_range_key": "1"}
+    ]
+
+    res = table.query(
+        KeyConditionExpression=Key("id").eq("1") & Key("lsi_range_key").eq("2"),
+        IndexName="test_lsi",
+        ConsistentRead=True,
+    )
+    assert res["Count"] == 1
+    assert res["Items"] == [
+        {"id": "1", "range_key": "2", "col1": "val2", "lsi_range_key": "2"}
+    ]
+
+
 @mock_aws
 def test_scan_by_index():
     dynamodb = boto3.client("dynamodb", region_name="us-east-1")
@@ -1206,6 +1275,11 @@ def test_scan_by_index():
     assert res["ScannedCount"] == 2
     assert len(res["Items"]) == 2
 
+    res = dynamodb.scan(TableName="test", IndexName="test_lsi", ConsistentRead=True)
+    assert res["Count"] == 2
+    assert res["ScannedCount"] == 2
+    assert len(res["Items"]) == 2
+
     res = dynamodb.scan(TableName="test", IndexName="test_lsi", Limit=1)
     assert res["Count"] == 1
     assert res["ScannedCount"] == 1
diff --git a/tests/test_dynamodb/test_dynamodb_table_without_range_key.py b/tests/test_dynamodb/test_dynamodb_table_without_range_key.py
index 774ba3f58..ac8afc9dc 100644
--- a/tests/test_dynamodb/test_dynamodb_table_without_range_key.py
+++ b/tests/test_dynamodb/test_dynamodb_table_without_range_key.py
@@ -579,6 +579,10 @@ def test_scan_by_index():
     assert res["Count"] == 3
     assert len(res["Items"]) == 3
 
+    res = dynamodb.scan(TableName="test", ConsistentRead=True)
+    assert res["Count"] == 3
+    assert len(res["Items"]) == 3
+
     res = dynamodb.scan(TableName="test", IndexName="test_gsi")
     assert res["Count"] == 2
     assert len(res["Items"]) == 2
diff --git a/tests/test_iam/test_iam_cloudformation.py b/tests/test_iam/test_iam_cloudformation.py
index 678939ae1..7c7e3707d 100644
--- a/tests/test_iam/test_iam_cloudformation.py
+++ b/tests/test_iam/test_iam_cloudformation.py
@@ -1645,6 +1645,7 @@ Resources:
 """
 
 
+@pytest.mark.aws_verified
 @iam_aws_verified
 def test_delete_instance_profile_with_existing_role():
     region = "us-east-1"
diff --git a/tests/test_resiliencehub/__init__.py b/tests/test_resiliencehub/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/test_resiliencehub/test_resiliencehub.py b/tests/test_resiliencehub/test_resiliencehub.py
new file mode 100644
index 000000000..5e470757c
--- /dev/null
+++ b/tests/test_resiliencehub/test_resiliencehub.py
@@ -0,0 +1,250 @@
+from uuid import uuid4
+
+import boto3
+import pytest
+from botocore.exceptions import ClientError
+
+from moto import mock_aws
+
+# See our Development Tips on writing tests for hints on how to write good tests:
+# http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html
+
+valid_resiliency_policy = {
+    "Software": {"rpoInSecs": 1, "rtoInSecs": 1},
+    "Hardware": {"rpoInSecs": 2, "rtoInSecs": 2},
+    "AZ": {"rpoInSecs": 3, "rtoInSecs": 3},
+}
+
+
+@mock_aws
+def test_create_app():
+    client = boto3.client("resiliencehub", region_name="us-east-2")
+    app = client.create_app(name="myapp")["app"]
+    assert app["assessmentSchedule"] == "Disabled"
+    assert app["complianceStatus"] == "NotAssessed"
+    assert app["creationTime"]
+    assert app["name"] == "myapp"
+    assert app["status"] == "Active"
+    assert app["tags"] == {}
+
+    app2 = client.describe_app(appArn=app["appArn"])["app"]
+    assert app == app2
+
+
+@mock_aws
+def test_create_app_advanced():
+    event_subs = [
+        {
+            "eventType": "ScheduledAssessmentFailure",
+            "name": "some event",
+            "snsTopicArn": "some sns arn",
+        }
+    ]
+    perm_model = {
+        "crossAccountRoleArns": ["arn1", "arn2"],
+        "invokerRoleName": "irn",
+        "type": "Rolebased",
+    }
+
+    client = boto3.client("resiliencehub", region_name="us-east-2")
+    app = client.create_app(
+        name="myapp",
+        assessmentSchedule="Daily",
+        description="some desc",
+        eventSubscriptions=event_subs,
+        permissionModel=perm_model,
+        policyArn="some policy arn",
+    )["app"]
+    assert app["assessmentSchedule"] == "Daily"
+    assert app["description"] == "some desc"
+    assert app["eventSubscriptions"] == event_subs
+    assert app["permissionModel"] == perm_model
+    assert app["policyArn"] == "some policy arn"
+
+
+@mock_aws
+def test_describe_unknown_app():
+    client = boto3.client("resiliencehub", region_name="us-east-1")
+    app_arn = f"arn:aws:resiliencehub:us-east-1:486285699788:app/{str(uuid4())}"
+    with pytest.raises(ClientError) as exc:
+        client.describe_app(appArn=app_arn)
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ResourceNotFoundException"
+    assert err["Message"] == f"App not found for appArn {app_arn}"
+
+
+@mock_aws
+def test_create_resilience_policy():
+    client = boto3.client("resiliencehub", region_name="us-east-1")
+
+    policy = client.create_resiliency_policy(
+        policy=valid_resiliency_policy, policyName="polname", tier="NonCritical"
+    )["policy"]
+    assert policy["creationTime"]
+    assert policy["policy"] == valid_resiliency_policy
+    assert policy["policyName"] == "polname"
+    assert policy["tags"] == {}
+    assert policy["tier"] == "NonCritical"
+
+    policy2 = client.describe_resiliency_policy(policyArn=policy["policyArn"])["policy"]
+    assert policy == policy2
+
+
+@mock_aws
+def test_create_resilience_policy_advanced():
+    client = boto3.client("resiliencehub", region_name="us-east-1")
+
+    policy = client.create_resiliency_policy(
+        dataLocationConstraint="AnyLocation",
+        policy=valid_resiliency_policy,
+        policyName="polname",
+        policyDescription="test policy",
+        tier="NonCritical",
+    )["policy"]
+    assert policy["dataLocationConstraint"] == "AnyLocation"
+    assert policy["policyDescription"] == "test policy"
+
+
+@mock_aws
+def test_create_resilience_policy_missing_types():
+    client = boto3.client("resiliencehub", region_name="us-east-1")
+
+    with pytest.raises(ClientError) as exc:
+        client.create_resiliency_policy(
+            policy={"Software": {"rpoInSecs": 1, "rtoInSecs": 1}},
+            policyName="polname",
+            tier="NonCritical",
+        )
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ValidationException"
+    assert err["Message"] == "FailureType HARDWARE does not exist"
+
+    with pytest.raises(ClientError) as exc:
+        client.create_resiliency_policy(
+            policy={
+                "Software": {"rpoInSecs": 1, "rtoInSecs": 1},
+                "Hardware": {"rpoInSecs": 2, "rtoInSecs": 2},
+            },
+            policyName="polname",
+            tier="NonCritical",
+        )
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ValidationException"
+    assert err["Message"] == "FailureType AZ does not exist"
+
+    with pytest.raises(ClientError) as exc:
+        client.create_resiliency_policy(
+            policy={"Hardware": {"rpoInSecs": 1, "rtoInSecs": 1}},
+            policyName="polname",
+            tier="NonCritical",
+        )
+    err = exc.value.response["Error"]
+    err["Message"] == "FailureType SOFTWARE does not exist"
+
+
+@mock_aws
+def test_create_resilience_policy_with_unknown_policy_type():
+    client = boto3.client("resiliencehub", region_name="us-east-1")
+    with pytest.raises(ClientError) as exc:
+        client.create_resiliency_policy(
+            policy={
+                "st": {"rpoInSecs": 1, "rtoInSecs": 1},
+            },
+            policyName="polname",
+            tier="NonCritical",
+        )
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ValidationException"
+    assert (
+        "Member must satisfy enum value set: [Software, Hardware, Region, AZ]"
+        in err["Message"]
+    )
+
+
+@mock_aws
+def test_list_apps():
+    client = boto3.client("resiliencehub", region_name="ap-southeast-1")
+    assert client.list_apps()["appSummaries"] == []
+
+    for i in range(5):
+        arn = client.create_app(name=f"app_{i}")["app"]["appArn"]
+
+    app_2 = client.list_apps(name="app_2")["appSummaries"][0]
+    assert app_2["name"] == "app_2"
+
+    app_4 = client.list_apps(appArn=arn)["appSummaries"][0]
+    assert app_4["name"] == "app_4"
+
+    all_apps = client.list_apps()["appSummaries"]
+    assert len(all_apps) == 5
+    assert [a["name"] for a in all_apps] == [
+        "app_0",
+        "app_1",
+        "app_2",
+        "app_3",
+        "app_4",
+    ]
+
+    all_apps = client.list_apps(reverseOrder=True)["appSummaries"]
+    assert len(all_apps) == 5
+    assert [a["name"] for a in all_apps] == [
+        "app_4",
+        "app_3",
+        "app_2",
+        "app_1",
+        "app_0",
+    ]
+
+    page1 = client.list_apps(maxResults=2)
+    assert len(page1["appSummaries"]) == 2
+
+    page2 = client.list_apps(maxResults=2, nextToken=page1["nextToken"])
+    assert len(page2["appSummaries"]) == 2
+
+    full_page = client.list_apps(nextToken=page1["nextToken"])
+    assert len(full_page["appSummaries"]) == 3
+
+
+@mock_aws
+def test_list_app_assessments():
+    client = boto3.client("resiliencehub", region_name="ap-southeast-1")
+    assert client.list_app_assessments()["assessmentSummaries"] == []
+
+
+@mock_aws
+def test_list_resiliency_policies():
+    client = boto3.client("resiliencehub", region_name="ap-southeast-1")
+    assert client.list_resiliency_policies()["resiliencyPolicies"] == []
+
+    for i in range(5):
+        client.create_resiliency_policy(
+            policy=valid_resiliency_policy, policyName=f"policy_{i}", tier="NonCritical"
+        )["policy"]
+
+    assert len(client.list_resiliency_policies()["resiliencyPolicies"]) == 5
+
+    policy2 = client.list_resiliency_policies(policyName="policy_2")[
+        "resiliencyPolicies"
+    ][0]
+    policy2["policyName"] == "policy_2"
+
+    page1 = client.list_resiliency_policies(maxResults=2)
+    assert len(page1["resiliencyPolicies"]) == 2
+
+    page2 = client.list_resiliency_policies(maxResults=2, nextToken=page1["nextToken"])
+    assert len(page2["resiliencyPolicies"]) == 2
+    assert page2["nextToken"]
+
+    page_full = client.list_resiliency_policies(nextToken=page1["nextToken"])
+    assert len(page_full["resiliencyPolicies"]) == 3
+    assert "nextToken" not in page_full
+
+
+@mock_aws
+def test_describe_unknown_resiliency_policy():
+    client = boto3.client("resiliencehub", region_name="eu-west-1")
+    with pytest.raises(ClientError) as exc:
+        client.describe_resiliency_policy(policyArn="unknownarn")
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ResourceNotFoundException"
+    assert err["Message"] == "ResiliencyPolicy unknownarn not found"
diff --git a/tests/test_resiliencehub/test_resiliencyhub_tagging.py b/tests/test_resiliencehub/test_resiliencyhub_tagging.py
new file mode 100644
index 000000000..fd3e1258d
--- /dev/null
+++ b/tests/test_resiliencehub/test_resiliencyhub_tagging.py
@@ -0,0 +1,56 @@
+import boto3
+
+from moto import mock_aws
+
+from .test_resiliencehub import valid_resiliency_policy
+
+# See our Development Tips on writing tests for hints on how to write good tests:
+# http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html
+
+
+@mock_aws
+def test_app_tagging():
+    client = boto3.client("resiliencehub", region_name="us-east-2")
+    app = client.create_app(name="myapp", tags={"k": "v"})["app"]
+    arn = app["appArn"]
+    assert app["tags"] == {"k": "v"}
+
+    assert app == client.describe_app(appArn=arn)["app"]
+
+    client.tag_resource(resourceArn=arn, tags={"k2": "v2"})
+
+    assert client.list_tags_for_resource(resourceArn=arn)["tags"] == {
+        "k": "v",
+        "k2": "v2",
+    }
+
+    client.untag_resource(resourceArn=arn, tagKeys=["k"])
+
+    assert client.list_tags_for_resource(resourceArn=arn)["tags"] == {"k2": "v2"}
+
+
+@mock_aws
+def test_policy_tagging():
+    client = boto3.client("resiliencehub", region_name="us-east-2")
+    policy = client.create_resiliency_policy(
+        policy=valid_resiliency_policy,
+        policyName="polname",
+        tier="NonCritical",
+        tags={"k": "v"},
+    )["policy"]
+    arn = policy["policyArn"]
+
+    assert policy["tags"] == {"k": "v"}
+
+    assert policy == client.describe_resiliency_policy(policyArn=arn)["policy"]
+
+    client.tag_resource(resourceArn=arn, tags={"k2": "v2"})
+
+    assert client.list_tags_for_resource(resourceArn=arn)["tags"] == {
+        "k": "v",
+        "k2": "v2",
+    }
+
+    client.untag_resource(resourceArn=arn, tagKeys=["k"])
+
+    assert client.list_tags_for_resource(resourceArn=arn)["tags"] == {"k2": "v2"}
diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py
index 40a9425b3..cbb5c1d16 100644
--- a/tests/test_s3/test_s3.py
+++ b/tests/test_s3/test_s3.py
@@ -544,7 +544,8 @@ def test_restore_key():
 
     key = bucket.put_object(Key="the-key", Body=b"somedata", StorageClass="GLACIER")
     assert key.restore is None
-    key.restore_object(RestoreRequest={"Days": 1})
+    resp = key.restore_object(RestoreRequest={"Days": 1})
+    assert resp["ResponseMetadata"]["HTTPStatusCode"] == 202
     if settings.TEST_SERVER_MODE:
         assert 'ongoing-request="false"' in key.restore
     elif settings.TEST_DECORATOR_MODE:
@@ -552,7 +553,8 @@ def test_restore_key():
             'ongoing-request="false", expiry-date="Mon, 02 Jan 2012 12:00:00 GMT"'
         )
 
-    key.restore_object(RestoreRequest={"Days": 2})
+    resp = key.restore_object(RestoreRequest={"Days": 2})
+    assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200
 
     if settings.TEST_SERVER_MODE:
         assert 'ongoing-request="false"' in key.restore
@@ -594,6 +596,19 @@ def test_restore_key_transition():
     state_manager.unset_transition(model_name="s3::keyrestore")
 
 
+@mock_aws
+def test_restore_unknown_key():
+    client = boto3.client("s3", region_name=DEFAULT_REGION_NAME)
+    client.create_bucket(Bucket="mybucket")
+
+    with pytest.raises(ClientError) as exc:
+        client.restore_object(
+            Bucket="mybucket", Key="unknown", RestoreRequest={"Days": 1}
+        )
+    err = exc.value.response["Error"]
+    assert err["Code"] == "NoSuchKey"
+
+
 @mock_aws
 def test_cannot_restore_standard_class_object():
     s3_resource = boto3.resource("s3", region_name=DEFAULT_REGION_NAME)
diff --git a/tests/test_s3/test_s3_eventbridge_integration.py b/tests/test_s3/test_s3_eventbridge_integration.py
index 9ccb25cbb..8bd9dc815 100644
--- a/tests/test_s3/test_s3_eventbridge_integration.py
+++ b/tests/test_s3/test_s3_eventbridge_integration.py
@@ -220,3 +220,33 @@ def test_delete_object_notification():
     assert event_message["region"] == REGION_NAME
     assert event_message["detail"]["bucket"]["name"] == bucket_name
     assert event_message["detail"]["reason"] == "ObjectRemoved"
+
+
+@mock_aws
+def test_restore_key_notifications():
+    resource_names = _seteup_bucket_notification_eventbridge()
+    bucket_name = resource_names["bucket_name"]
+
+    s3_resource = boto3.resource("s3", region_name=REGION_NAME)
+
+    bucket = s3_resource.Bucket(bucket_name)
+    key = bucket.put_object(Key="the-key", Body=b"somedata", StorageClass="GLACIER")
+    key.restore_object(RestoreRequest={"Days": 1})
+
+    events = _get_send_events()
+    event_names = [json.loads(e["message"])["detail"]["reason"] for e in events]
+    assert event_names == ["ObjectCreated", "ObjectRestore"]
+
+    # Finish the Object Restoration - restore Completes immediately by default
+    key.load()
+
+    events = _get_send_events()
+    event_names = [json.loads(e["message"])["detail"]["reason"] for e in events]
+    assert event_names == ["ObjectCreated", "ObjectRestore", "ObjectRestore"]
+
+    # Sanity check - loading the Key does not mean the Restore-event is fired every time
+    key.load()
+
+    events = _get_send_events()
+    event_names = [json.loads(e["message"])["detail"]["reason"] for e in events]
+    assert event_names == ["ObjectCreated", "ObjectRestore", "ObjectRestore"]
diff --git a/tests/test_s3/test_s3_storageclass.py b/tests/test_s3/test_s3_storageclass.py
index b680c713d..f2c202373 100644
--- a/tests/test_s3/test_s3_storageclass.py
+++ b/tests/test_s3/test_s3_storageclass.py
@@ -203,9 +203,10 @@ def test_s3_copy_object_for_glacier_storage_class_restored():
     )
 
     s3_client.create_bucket(Bucket="Bucket2")
-    s3_client.restore_object(
+    resp = s3_client.restore_object(
         Bucket="Bucket", Key="First_Object", RestoreRequest={"Days": 123}
     )
+    assert resp["ResponseMetadata"]["HTTPStatusCode"] == 202
 
     s3_client.copy_object(
         CopySource={"Bucket": "Bucket", "Key": "First_Object"},
@@ -241,9 +242,10 @@ def test_s3_copy_object_for_deep_archive_storage_class_restored():
     assert err["StorageClass"] == "DEEP_ARCHIVE"
 
     s3_client.create_bucket(Bucket="Bucket2")
-    s3_client.restore_object(
+    resp = s3_client.restore_object(
         Bucket="Bucket", Key="First_Object", RestoreRequest={"Days": 123}
     )
+    assert resp["ResponseMetadata"]["HTTPStatusCode"] == 202
     s3_client.get_object(Bucket="Bucket", Key="First_Object")
 
     s3_client.copy_object(
diff --git a/tests/test_sqs/__init__.py b/tests/test_sqs/__init__.py
index 08a1c1568..5d04e1d17 100644
--- a/tests/test_sqs/__init__.py
+++ b/tests/test_sqs/__init__.py
@@ -1,1 +1,28 @@
-# This file is intentionally left blank.
+import os
+from functools import wraps
+
+from moto import mock_aws
+
+
+def sqs_aws_verified(func):
+    """
+    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.
+    """
+
+    @wraps(func)
+    def pagination_wrapper(*args, **kwargs):
+        allow_aws_request = (
+            os.environ.get("MOTO_TEST_ALLOW_AWS_REQUEST", "false").lower() == "true"
+        )
+
+        if allow_aws_request:
+            return func(*args, **kwargs)
+        else:
+            with mock_aws():
+                return func(*args, **kwargs)
+
+    return pagination_wrapper
diff --git a/tests/test_sqs/test_sqs.py b/tests/test_sqs/test_sqs.py
index 5ae192a63..05d531f34 100644
--- a/tests/test_sqs/test_sqs.py
+++ b/tests/test_sqs/test_sqs.py
@@ -23,6 +23,8 @@ from moto.sqs.models import (
 )
 from moto.utilities.distutils_version import LooseVersion
 
+from . import sqs_aws_verified
+
 TEST_POLICY = """
 {
   "Version":"2012-10-17",
@@ -3307,18 +3309,16 @@ def test_fifo_dedupe_error_no_message_dedupe_id_batch():
     )
 
 
-@mock_aws
+@sqs_aws_verified
+@pytest.mark.aws_verified
 @pytest.mark.parametrize(
     "queue_config", [{"FifoQueue": "true"}, {"FifoQueue": "true", "DelaySeconds": "10"}]
 )
 def test_send_message_delay_seconds_validation(queue_config):
     # Setup
     client = boto3.client("sqs", region_name=REGION)
-    q = "test.fifo"
-    client.create_queue(
-        QueueName=q,
-        Attributes=queue_config,
-    )
+    q = f"moto_{str(uuid4())[0:6]}.fifo"
+    client.create_queue(QueueName=q, Attributes=queue_config)
 
     # Execute
     with pytest.raises(ClientError) as err:
@@ -3330,6 +3330,14 @@ def test_send_message_delay_seconds_validation(queue_config):
             MessageDeduplicationId=str(uuid4()),
         )
 
+    # Verify
+    ex = err.value
+    assert ex.response["Error"]["Code"] == "InvalidParameterValue"
+    assert ex.response["Error"]["Message"] == (
+        "Value 5 for parameter DelaySeconds is invalid. Reason: "
+        "The request include parameter that is not valid for this queue type."
+    )
+
     # this should succeed regardless of DelaySeconds configuration on the q
     # https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html#API_SendMessage_RequestSyntax
     client.send_message(
@@ -3340,12 +3348,11 @@ def test_send_message_delay_seconds_validation(queue_config):
         MessageDeduplicationId=str(uuid4()),
     )
 
-    # Verify
-    ex = err.value
-    assert ex.response["Error"]["Code"] == "InvalidParameterValue"
-    assert ex.response["Error"]["Message"] == (
-        "Value 5 for parameter DelaySeconds is invalid. Reason: "
-        "The request include parameter that is not valid for this queue type."
+    client.send_message(
+        QueueUrl=q,
+        MessageBody="test",
+        MessageGroupId="test",
+        MessageDeduplicationId=str(uuid4()),
     )
 
     # clean up for servertests