Repository: getmoto/moto
Pull request #7084 (2023-12-01 18:28:27)

Techdebt: Update boto3_name to 'rds-data'
This is consistent with redshift-data, cloudtrail-data, etc

Plus a few stray tweaks to testing that I made in the process of debugging.

I figured out what I was missing before; it was the matching change in backends_index.py. I guess it probably doesn't
matter since apparently nothing was broken by 'rdsdata' not matching the name used by boto3. But it didn't seem right to me.


Patch:
diff --git a/IMPLEMENTATION_COVERAGE.md b/IMPLEMENTATION_COVERAGE.md
index 7a75fb3ab..47dbbb82f 100644
--- a/IMPLEMENTATION_COVERAGE.md
+++ b/IMPLEMENTATION_COVERAGE.md
@@ -1275,7 +1275,7 @@
 
 ## comprehend
 <details>
-<summary>12% implemented</summary>
+<summary>13% implemented</summary>
 
 - [ ] batch_detect_dominant_language
 - [ ] batch_detect_entities
@@ -1318,7 +1318,6 @@
 - [X] detect_sentiment
 - [ ] detect_syntax
 - [ ] detect_targeted_sentiment
-- [ ] detect_toxic_content
 - [ ] import_model
 - [ ] list_datasets
 - [ ] list_document_classification_jobs
@@ -1898,7 +1897,7 @@
 
 ## ec2
 <details>
-<summary>33% implemented</summary>
+<summary>34% implemented</summary>
 
 - [ ] accept_address_transfer
 - [ ] accept_reserved_instances_exchange_quote
@@ -1921,7 +1920,6 @@
 - [ ] associate_enclave_certificate_iam_role
 - [X] associate_iam_instance_profile
 - [ ] associate_instance_event_window
-- [ ] associate_ipam_byoasn
 - [ ] associate_ipam_resource_discovery
 - [ ] associate_nat_gateway_address
 - [X] associate_route_table
@@ -2112,7 +2110,6 @@
 - [ ] delete_vpn_connection_route
 - [X] delete_vpn_gateway
 - [ ] deprovision_byoip_cidr
-- [ ] deprovision_ipam_byoasn
 - [ ] deprovision_ipam_pool_cidr
 - [ ] deprovision_public_ipv4_pool_cidr
 - [X] deregister_image
@@ -2170,12 +2167,10 @@
 - [ ] describe_instance_event_notification_attributes
 - [ ] describe_instance_event_windows
 - [X] describe_instance_status
-- [ ] describe_instance_topology
 - [X] describe_instance_type_offerings
 - [X] describe_instance_types
 - [X] describe_instances
 - [X] describe_internet_gateways
-- [ ] describe_ipam_byoasn
 - [ ] describe_ipam_pools
 - [ ] describe_ipam_resource_discoveries
 - [ ] describe_ipam_resource_discovery_associations
@@ -2191,7 +2186,6 @@
 - [ ] describe_local_gateway_virtual_interface_groups
 - [ ] describe_local_gateway_virtual_interfaces
 - [ ] describe_local_gateways
-- [ ] describe_locked_snapshots
 - [X] describe_managed_prefix_lists
 - [ ] describe_moving_addresses
 - [X] describe_nat_gateways
@@ -2284,7 +2278,6 @@
 - [ ] disable_image_deprecation
 - [ ] disable_ipam_organization_admin_account
 - [ ] disable_serial_console_access
-- [ ] disable_snapshot_block_public_access
 - [X] disable_transit_gateway_route_table_propagation
 - [ ] disable_vgw_route_propagation
 - [X] disable_vpc_classic_link
@@ -2294,7 +2287,6 @@
 - [ ] disassociate_enclave_certificate_iam_role
 - [X] disassociate_iam_instance_profile
 - [ ] disassociate_instance_event_window
-- [ ] disassociate_ipam_byoasn
 - [ ] disassociate_ipam_resource_discovery
 - [ ] disassociate_nat_gateway_address
 - [X] disassociate_route_table
@@ -2315,7 +2307,6 @@
 - [ ] enable_ipam_organization_admin_account
 - [ ] enable_reachability_analyzer_organization_sharing
 - [ ] enable_serial_console_access
-- [ ] enable_snapshot_block_public_access
 - [X] enable_transit_gateway_route_table_propagation
 - [ ] enable_vgw_route_propagation
 - [ ] enable_volume_io
@@ -2343,7 +2334,6 @@
 - [ ] get_instance_uefi_data
 - [ ] get_ipam_address_history
 - [ ] get_ipam_discovered_accounts
-- [ ] get_ipam_discovered_public_addresses
 - [ ] get_ipam_discovered_resource_cidrs
 - [ ] get_ipam_pool_allocations
 - [ ] get_ipam_pool_cidrs
@@ -2357,7 +2347,6 @@
 - [ ] get_reserved_instances_exchange_quote
 - [ ] get_security_groups_for_vpc
 - [ ] get_serial_console_access_status
-- [ ] get_snapshot_block_public_access_state
 - [ ] get_spot_placement_scores
 - [ ] get_subnet_cidr_reservations
 - [ ] get_transit_gateway_attachment_propagations
@@ -2380,7 +2369,6 @@
 - [ ] import_volume
 - [ ] list_images_in_recycle_bin
 - [ ] list_snapshots_in_recycle_bin
-- [ ] lock_snapshot
 - [ ] modify_address_attribute
 - [ ] modify_availability_zone_group
 - [ ] modify_capacity_reservation
@@ -2449,7 +2437,6 @@
 - [ ] move_address_to_vpc
 - [ ] move_byoip_cidr_to_ipam
 - [ ] provision_byoip_cidr
-- [ ] provision_ipam_byoasn
 - [ ] provision_ipam_pool_cidr
 - [ ] provision_public_ipv4_pool_cidr
 - [ ] purchase_capacity_block
@@ -2510,7 +2497,6 @@
 - [X] unassign_ipv6_addresses
 - [X] unassign_private_ip_addresses
 - [ ] unassign_private_nat_gateway_address
-- [ ] unlock_snapshot
 - [ ] unmonitor_instances
 - [X] update_security_group_rule_descriptions_egress
 - [X] update_security_group_rule_descriptions_ingress
@@ -2527,7 +2513,7 @@
 
 ## ecr
 <details>
-<summary>65% implemented</summary>
+<summary>68% implemented</summary>
 
 - [ ] batch_check_layer_availability
 - [X] batch_delete_image
@@ -2569,9 +2555,7 @@
 - [ ] start_lifecycle_policy_preview
 - [X] tag_resource
 - [X] untag_resource
-- [ ] update_pull_through_cache_rule
 - [ ] upload_layer_part
-- [ ] validate_pull_through_cache_rule
 </details>
 
 ## ecs
@@ -2674,18 +2658,16 @@
 
 ## eks
 <details>
-<summary>37% implemented</summary>
+<summary>42% implemented</summary>
 
 - [ ] associate_encryption_config
 - [ ] associate_identity_provider_config
 - [ ] create_addon
 - [X] create_cluster
-- [ ] create_eks_anywhere_subscription
 - [X] create_fargate_profile
 - [X] create_nodegroup
 - [ ] delete_addon
 - [X] delete_cluster
-- [ ] delete_eks_anywhere_subscription
 - [X] delete_fargate_profile
 - [X] delete_nodegroup
 - [ ] deregister_cluster
@@ -2693,7 +2675,6 @@
 - [ ] describe_addon_configuration
 - [ ] describe_addon_versions
 - [X] describe_cluster
-- [ ] describe_eks_anywhere_subscription
 - [X] describe_fargate_profile
 - [ ] describe_identity_provider_config
 - [X] describe_nodegroup
@@ -2701,7 +2682,6 @@
 - [ ] disassociate_identity_provider_config
 - [ ] list_addons
 - [X] list_clusters
-- [ ] list_eks_anywhere_subscriptions
 - [X] list_fargate_profiles
 - [ ] list_identity_provider_configs
 - [X] list_nodegroups
@@ -2713,7 +2693,6 @@
 - [ ] update_addon
 - [ ] update_cluster_config
 - [ ] update_cluster_version
-- [ ] update_eks_anywhere_subscription
 - [ ] update_nodegroup_config
 - [ ] update_nodegroup_version
 </details>
@@ -2868,7 +2847,7 @@
 
 ## elb
 <details>
-<summary>65% implemented</summary>
+<summary>72% implemented</summary>
 
 - [ ] add_tags
 - [X] apply_security_groups_to_load_balancer
@@ -2878,7 +2857,7 @@
 - [X] create_lb_cookie_stickiness_policy
 - [X] create_load_balancer
 - [X] create_load_balancer_listeners
-- [ ] create_load_balancer_policy
+- [X] create_load_balancer_policy
 - [X] delete_load_balancer
 - [X] delete_load_balancer_listeners
 - [X] delete_load_balancer_policy
@@ -2897,7 +2876,7 @@
 - [ ] register_instances_with_load_balancer
 - [ ] remove_tags
 - [X] set_load_balancer_listener_ssl_certificate
-- [ ] set_load_balancer_policies_for_backend_server
+- [X] set_load_balancer_policies_for_backend_server
 - [X] set_load_balancer_policies_of_listener
 </details>
 
@@ -3294,7 +3273,7 @@
 
 ## glue
 <details>
-<summary>31% implemented</summary>
+<summary>33% implemented</summary>
 
 - [X] batch_create_partition
 - [ ] batch_delete_connection
@@ -3308,7 +3287,6 @@
 - [ ] batch_get_dev_endpoints
 - [X] batch_get_jobs
 - [X] batch_get_partition
-- [ ] batch_get_table_optimizer
 - [X] batch_get_triggers
 - [ ] batch_get_workflows
 - [ ] batch_stop_job_run
@@ -3336,7 +3314,6 @@
 - [ ] create_security_configuration
 - [X] create_session
 - [X] create_table
-- [ ] create_table_optimizer
 - [X] create_trigger
 - [ ] create_user_defined_function
 - [ ] create_workflow
@@ -3361,7 +3338,6 @@
 - [ ] delete_security_configuration
 - [X] delete_session
 - [X] delete_table
-- [ ] delete_table_optimizer
 - [X] delete_table_version
 - [X] delete_trigger
 - [ ] delete_user_defined_function
@@ -3374,8 +3350,6 @@
 - [ ] get_classifiers
 - [ ] get_column_statistics_for_partition
 - [ ] get_column_statistics_for_table
-- [ ] get_column_statistics_task_run
-- [ ] get_column_statistics_task_runs
 - [ ] get_connection
 - [ ] get_connections
 - [X] get_crawler
@@ -3418,7 +3392,6 @@
 - [X] get_session
 - [ ] get_statement
 - [X] get_table
-- [ ] get_table_optimizer
 - [X] get_table_version
 - [X] get_table_versions
 - [X] get_tables
@@ -3436,7 +3409,6 @@
 - [ ] get_workflow_runs
 - [ ] import_catalog_to_glue
 - [ ] list_blueprints
-- [ ] list_column_statistics_task_runs
 - [X] list_crawlers
 - [ ] list_crawls
 - [ ] list_custom_entity_types
@@ -3452,7 +3424,6 @@
 - [ ] list_schemas
 - [X] list_sessions
 - [ ] list_statements
-- [ ] list_table_optimizer_runs
 - [X] list_triggers
 - [ ] list_workflows
 - [ ] put_data_catalog_encryption_settings
@@ -3467,7 +3438,6 @@
 - [ ] run_statement
 - [ ] search_tables
 - [ ] start_blueprint_run
-- [ ] start_column_statistics_task_run
 - [X] start_crawler
 - [ ] start_crawler_schedule
 - [ ] start_data_quality_rule_recommendation_run
@@ -3479,7 +3449,6 @@
 - [ ] start_ml_labeling_set_generation_task_run
 - [X] start_trigger
 - [ ] start_workflow_run
-- [ ] stop_column_statistics_task_run
 - [X] stop_crawler
 - [ ] stop_crawler_schedule
 - [X] stop_session
@@ -3505,7 +3474,6 @@
 - [X] update_schema
 - [ ] update_source_control_from_job
 - [X] update_table
-- [ ] update_table_optimizer
 - [ ] update_trigger
 - [ ] update_user_defined_function
 - [ ] update_workflow
@@ -4427,7 +4395,7 @@
 
 ## lambda
 <details>
-<summary>54% implemented</summary>
+<summary>62% implemented</summary>
 
 - [ ] add_layer_version_permission
 - [X] add_permission
@@ -4442,7 +4410,7 @@
 - [X] delete_function
 - [ ] delete_function_code_signing_config
 - [X] delete_function_concurrency
-- [ ] delete_function_event_invoke_config
+- [X] delete_function_event_invoke_config
 - [X] delete_function_url_config
 - [X] delete_layer_version
 - [ ] delete_provisioned_concurrency_config
@@ -4454,7 +4422,7 @@
 - [ ] get_function_code_signing_config
 - [X] get_function_concurrency
 - [ ] get_function_configuration
-- [ ] get_function_event_invoke_config
+- [X] get_function_event_invoke_config
 - [X] get_function_url_config
 - [X] get_layer_version
 - [ ] get_layer_version_by_arn
@@ -4468,7 +4436,7 @@
 - [X] list_aliases
 - [ ] list_code_signing_configs
 - [X] list_event_source_mappings
-- [ ] list_function_event_invoke_configs
+- [X] list_function_event_invoke_configs
 - [ ] list_function_url_configs
 - [X] list_functions
 - [ ] list_functions_by_code_signing_config
@@ -4481,7 +4449,7 @@
 - [ ] publish_version
 - [ ] put_function_code_signing_config
 - [X] put_function_concurrency
-- [ ] put_function_event_invoke_config
+- [X] put_function_event_invoke_config
 - [ ] put_provisioned_concurrency_config
 - [ ] put_runtime_management_config
 - [ ] remove_layer_version_permission
@@ -4493,26 +4461,21 @@
 - [X] update_event_source_mapping
 - [X] update_function_code
 - [X] update_function_configuration
-- [ ] update_function_event_invoke_config
+- [X] update_function_event_invoke_config
 - [X] update_function_url_config
 </details>
 
 ## logs
 <details>
-<summary>51% implemented</summary>
+<summary>68% implemented</summary>
 
 - [ ] associate_kms_key
 - [ ] cancel_export_task
-- [ ] create_delivery
 - [X] create_export_task
 - [X] create_log_group
 - [X] create_log_stream
 - [ ] delete_account_policy
 - [ ] delete_data_protection_policy
-- [ ] delete_delivery
-- [ ] delete_delivery_destination
-- [ ] delete_delivery_destination_policy
-- [ ] delete_delivery_source
 - [X] delete_destination
 - [X] delete_log_group
 - [X] delete_log_stream
@@ -4522,11 +4485,8 @@
 - [X] delete_retention_policy
 - [X] delete_subscription_filter
 - [ ] describe_account_policies
-- [ ] describe_deliveries
-- [ ] describe_delivery_destinations
-- [ ] describe_delivery_sources
 - [X] describe_destinations
-- [ ] describe_export_tasks
+- [X] describe_export_tasks
 - [X] describe_log_groups
 - [X] describe_log_streams
 - [X] describe_metric_filters
@@ -4537,10 +4497,6 @@
 - [ ] disassociate_kms_key
 - [X] filter_log_events
 - [ ] get_data_protection_policy
-- [ ] get_delivery
-- [ ] get_delivery_destination
-- [ ] get_delivery_destination_policy
-- [ ] get_delivery_source
 - [X] get_log_events
 - [ ] get_log_group_fields
 - [ ] get_log_record
@@ -4549,9 +4505,6 @@
 - [X] list_tags_log_group
 - [ ] put_account_policy
 - [ ] put_data_protection_policy
-- [ ] put_delivery_destination
-- [ ] put_delivery_destination_policy
-- [ ] put_delivery_source
 - [X] put_destination
 - [X] put_destination_policy
 - [X] put_log_events
@@ -5344,7 +5297,6 @@
 - [X] create_ingestion
 - [ ] create_namespace
 - [ ] create_refresh_schedule
-- [ ] create_role_membership
 - [ ] create_template
 - [ ] create_template_alias
 - [ ] create_theme
@@ -5366,8 +5318,6 @@
 - [ ] delete_iam_policy_assignment
 - [ ] delete_namespace
 - [ ] delete_refresh_schedule
-- [ ] delete_role_custom_permission
-- [ ] delete_role_membership
 - [ ] delete_template
 - [ ] delete_template_alias
 - [ ] delete_theme
@@ -5405,7 +5355,6 @@
 - [ ] describe_ip_restriction
 - [ ] describe_namespace
 - [ ] describe_refresh_schedule
-- [ ] describe_role_custom_permission
 - [ ] describe_template
 - [ ] describe_template_alias
 - [ ] describe_template_definition
@@ -5439,7 +5388,6 @@
 - [ ] list_ingestions
 - [ ] list_namespaces
 - [ ] list_refresh_schedules
-- [ ] list_role_memberships
 - [ ] list_tags_for_resource
 - [ ] list_template_aliases
 - [ ] list_template_versions
@@ -5484,7 +5432,6 @@
 - [ ] update_ip_restriction
 - [ ] update_public_sharing_settings
 - [ ] update_refresh_schedule
-- [ ] update_role_custom_permission
 - [ ] update_template
 - [ ] update_template_alias
 - [ ] update_template_permissions
@@ -5540,7 +5487,7 @@
 
 ## rds
 <details>
-<summary>36% implemented</summary>
+<summary>38% implemented</summary>
 
 - [ ] add_role_to_db_cluster
 - [ ] add_role_to_db_instance
@@ -5573,7 +5520,6 @@
 - [X] create_global_cluster
 - [ ] create_integration
 - [X] create_option_group
-- [ ] create_tenant_database
 - [ ] delete_blue_green_deployment
 - [ ] delete_custom_db_engine_version
 - [X] delete_db_cluster
@@ -5593,7 +5539,6 @@
 - [X] delete_global_cluster
 - [ ] delete_integration
 - [X] delete_option_group
-- [ ] delete_tenant_database
 - [ ] deregister_db_proxy_targets
 - [ ] describe_account_attributes
 - [ ] describe_blue_green_deployments
@@ -5618,7 +5563,6 @@
 - [ ] describe_db_proxy_targets
 - [ ] describe_db_security_groups
 - [ ] describe_db_snapshot_attributes
-- [ ] describe_db_snapshot_tenant_databases
 - [X] describe_db_snapshots
 - [X] describe_db_subnet_groups
 - [ ] describe_engine_default_cluster_parameters
@@ -5636,7 +5580,6 @@
 - [ ] describe_reserved_db_instances
 - [ ] describe_reserved_db_instances_offerings
 - [ ] describe_source_regions
-- [ ] describe_tenant_databases
 - [ ] describe_valid_db_instance_modifications
 - [ ] download_db_log_file_portion
 - [ ] failover_db_cluster
@@ -5661,7 +5604,6 @@
 - [ ] modify_event_subscription
 - [ ] modify_global_cluster
 - [X] modify_option_group
-- [ ] modify_tenant_database
 - [X] promote_read_replica
 - [X] promote_read_replica_db_cluster
 - [ ] purchase_reserved_db_instances_offering
@@ -5710,7 +5652,7 @@
 
 ## redshift
 <details>
-<summary>22% implemented</summary>
+<summary>23% implemented</summary>
 
 - [ ] accept_reserved_node_exchange
 - [ ] add_partner
@@ -5734,7 +5676,6 @@
 - [ ] create_event_subscription
 - [ ] create_hsm_client_certificate
 - [ ] create_hsm_configuration
-- [ ] create_redshift_idc_application
 - [ ] create_scheduled_action
 - [X] create_snapshot_copy_grant
 - [ ] create_snapshot_schedule
@@ -5753,7 +5694,6 @@
 - [ ] delete_hsm_client_certificate
 - [ ] delete_hsm_configuration
 - [ ] delete_partner
-- [ ] delete_redshift_idc_application
 - [ ] delete_resource_policy
 - [ ] delete_scheduled_action
 - [X] delete_snapshot_copy_grant
@@ -5788,7 +5728,6 @@
 - [ ] describe_node_configuration_options
 - [ ] describe_orderable_cluster_options
 - [ ] describe_partners
-- [ ] describe_redshift_idc_applications
 - [ ] describe_reserved_node_exchange_status
 - [ ] describe_reserved_node_offerings
 - [ ] describe_reserved_nodes
@@ -5824,7 +5763,6 @@
 - [ ] modify_custom_domain_association
 - [ ] modify_endpoint_access
 - [ ] modify_event_subscription
-- [ ] modify_redshift_idc_application
 - [ ] modify_scheduled_action
 - [X] modify_snapshot_copy_retention_period
 - [ ] modify_snapshot_schedule
@@ -6299,14 +6237,13 @@
 
 ## s3control
 <details>
-<summary>12% implemented</summary>
+<summary>14% implemented</summary>
 
 - [X] create_access_point
 - [ ] create_access_point_for_object_lambda
 - [ ] create_bucket
 - [ ] create_job
 - [ ] create_multi_region_access_point
-- [ ] create_storage_lens_group
 - [X] delete_access_point
 - [ ] delete_access_point_for_object_lambda
 - [X] delete_access_point_policy
@@ -6321,7 +6258,6 @@
 - [X] delete_public_access_block
 - [ ] delete_storage_lens_configuration
 - [ ] delete_storage_lens_configuration_tagging
-- [ ] delete_storage_lens_group
 - [ ] describe_job
 - [ ] describe_multi_region_access_point_operation
 - [X] get_access_point
@@ -6345,15 +6281,12 @@
 - [X] get_public_access_block
 - [ ] get_storage_lens_configuration
 - [ ] get_storage_lens_configuration_tagging
-- [ ] get_storage_lens_group
 - [ ] list_access_points
 - [ ] list_access_points_for_object_lambda
 - [ ] list_jobs
 - [ ] list_multi_region_access_points
 - [ ] list_regional_buckets
 - [ ] list_storage_lens_configurations
-- [ ] list_storage_lens_groups
-- [ ] list_tags_for_resource
 - [ ] put_access_point_configuration_for_object_lambda
 - [ ] put_access_point_policy
 - [ ] put_access_point_policy_for_object_lambda
@@ -6368,11 +6301,8 @@
 - [ ] put_storage_lens_configuration
 - [ ] put_storage_lens_configuration_tagging
 - [ ] submit_multi_region_access_point_routes
-- [ ] tag_resource
-- [ ] untag_resource
 - [ ] update_job_priority
 - [ ] update_job_status
-- [ ] update_storage_lens_group
 </details>
 
 ## sagemaker
@@ -7238,59 +7168,31 @@
 
 ## sso-admin
 <details>
-<summary>10% implemented</summary>
+<summary>21% implemented</summary>
 
 - [ ] attach_customer_managed_policy_reference_to_permission_set
 - [ ] attach_managed_policy_to_permission_set
 - [X] create_account_assignment
-- [ ] create_application
-- [ ] create_application_assignment
-- [ ] create_instance
 - [ ] create_instance_access_control_attribute_configuration
 - [X] create_permission_set
-- [ ] create_trusted_token_issuer
 - [X] delete_account_assignment
-- [ ] delete_application
-- [ ] delete_application_access_scope
-- [ ] delete_application_assignment
-- [ ] delete_application_authentication_method
-- [ ] delete_application_grant
 - [ ] delete_inline_policy_from_permission_set
-- [ ] delete_instance
 - [ ] delete_instance_access_control_attribute_configuration
 - [X] delete_permission_set
 - [ ] delete_permissions_boundary_from_permission_set
-- [ ] delete_trusted_token_issuer
 - [ ] describe_account_assignment_creation_status
 - [ ] describe_account_assignment_deletion_status
-- [ ] describe_application
-- [ ] describe_application_assignment
-- [ ] describe_application_provider
-- [ ] describe_instance
 - [ ] describe_instance_access_control_attribute_configuration
 - [X] describe_permission_set
 - [ ] describe_permission_set_provisioning_status
-- [ ] describe_trusted_token_issuer
 - [ ] detach_customer_managed_policy_reference_from_permission_set
 - [ ] detach_managed_policy_from_permission_set
-- [ ] get_application_access_scope
-- [ ] get_application_assignment_configuration
-- [ ] get_application_authentication_method
-- [ ] get_application_grant
 - [ ] get_inline_policy_for_permission_set
 - [ ] get_permissions_boundary_for_permission_set
 - [ ] list_account_assignment_creation_status
 - [ ] list_account_assignment_deletion_status
 - [X] list_account_assignments
-- [ ] list_account_assignments_for_principal
 - [ ] list_accounts_for_provisioned_permission_set
-- [ ] list_application_access_scopes
-- [ ] list_application_assignments
-- [ ] list_application_assignments_for_principal
-- [ ] list_application_authentication_methods
-- [ ] list_application_grants
-- [ ] list_application_providers
-- [ ] list_applications
 - [ ] list_customer_managed_policy_references_in_permission_set
 - [ ] list_instances
 - [ ] list_managed_policies_in_permission_set
@@ -7298,26 +7200,18 @@
 - [X] list_permission_sets
 - [ ] list_permission_sets_provisioned_to_account
 - [ ] list_tags_for_resource
-- [ ] list_trusted_token_issuers
 - [ ] provision_permission_set
-- [ ] put_application_access_scope
-- [ ] put_application_assignment_configuration
-- [ ] put_application_authentication_method
-- [ ] put_application_grant
 - [ ] put_inline_policy_to_permission_set
 - [ ] put_permissions_boundary_to_permission_set
 - [ ] tag_resource
 - [ ] untag_resource
-- [ ] update_application
-- [ ] update_instance
 - [ ] update_instance_access_control_attribute_configuration
 - [X] update_permission_set
-- [ ] update_trusted_token_issuer
 </details>
 
 ## stepfunctions
 <details>
-<summary>37% implemented</summary>
+<summary>38% implemented</summary>
 
 - [ ] create_activity
 - [X] create_state_machine
@@ -7342,7 +7236,6 @@
 - [X] list_state_machines
 - [X] list_tags_for_resource
 - [ ] publish_state_machine_version
-- [ ] redrive_execution
 - [ ] send_task_failure
 - [ ] send_task_heartbeat
 - [ ] send_task_success
@@ -7719,7 +7612,6 @@
 - kinesis-video-webrtc-storage
 - kinesisanalytics
 - kinesisanalyticsv2
-- launch-wizard
 - lex-models
 - lex-runtime
 - lexv2-models
@@ -7734,6 +7626,7 @@
 - lookoutvision
 - m2
 - machinelearning
+- macie
 - macie2
 - managedblockchain-query
 - marketplace-catalog
@@ -7821,7 +7714,6 @@
 - tnb
 - transfer
 - translate
-- trustedadvisor
 - verifiedpermissions
 - voice-id
 - vpc-lattice
diff --git a/docs/docs/services/comprehend.rst b/docs/docs/services/comprehend.rst
index a7255a75f..4b477a9c7 100644
--- a/docs/docs/services/comprehend.rst
+++ b/docs/docs/services/comprehend.rst
@@ -72,7 +72,6 @@ comprehend
 - [X] detect_sentiment
 - [ ] detect_syntax
 - [ ] detect_targeted_sentiment
-- [ ] detect_toxic_content
 - [ ] import_model
 - [ ] list_datasets
 - [ ] list_document_classification_jobs
diff --git a/docs/docs/services/ec2.rst b/docs/docs/services/ec2.rst
index 95c9d6a8b..319602d36 100644
--- a/docs/docs/services/ec2.rst
+++ b/docs/docs/services/ec2.rst
@@ -48,7 +48,6 @@ ec2
 - [ ] associate_enclave_certificate_iam_role
 - [X] associate_iam_instance_profile
 - [ ] associate_instance_event_window
-- [ ] associate_ipam_byoasn
 - [ ] associate_ipam_resource_discovery
 - [ ] associate_nat_gateway_address
 - [X] associate_route_table
@@ -243,7 +242,6 @@ ec2
 - [ ] delete_vpn_connection_route
 - [X] delete_vpn_gateway
 - [ ] deprovision_byoip_cidr
-- [ ] deprovision_ipam_byoasn
 - [ ] deprovision_ipam_pool_cidr
 - [ ] deprovision_public_ipv4_pool_cidr
 - [X] deregister_image
@@ -309,12 +307,10 @@ ec2
 - [ ] describe_instance_event_notification_attributes
 - [ ] describe_instance_event_windows
 - [X] describe_instance_status
-- [ ] describe_instance_topology
 - [X] describe_instance_type_offerings
 - [X] describe_instance_types
 - [X] describe_instances
 - [X] describe_internet_gateways
-- [ ] describe_ipam_byoasn
 - [ ] describe_ipam_pools
 - [ ] describe_ipam_resource_discoveries
 - [ ] describe_ipam_resource_discovery_associations
@@ -330,7 +326,6 @@ ec2
 - [ ] describe_local_gateway_virtual_interface_groups
 - [ ] describe_local_gateway_virtual_interfaces
 - [ ] describe_local_gateways
-- [ ] describe_locked_snapshots
 - [X] describe_managed_prefix_lists
 - [ ] describe_moving_addresses
 - [X] describe_nat_gateways
@@ -442,7 +437,6 @@ ec2
 - [ ] disable_image_deprecation
 - [ ] disable_ipam_organization_admin_account
 - [ ] disable_serial_console_access
-- [ ] disable_snapshot_block_public_access
 - [X] disable_transit_gateway_route_table_propagation
 - [ ] disable_vgw_route_propagation
 - [X] disable_vpc_classic_link
@@ -452,7 +446,6 @@ ec2
 - [ ] disassociate_enclave_certificate_iam_role
 - [X] disassociate_iam_instance_profile
 - [ ] disassociate_instance_event_window
-- [ ] disassociate_ipam_byoasn
 - [ ] disassociate_ipam_resource_discovery
 - [ ] disassociate_nat_gateway_address
 - [X] disassociate_route_table
@@ -473,7 +466,6 @@ ec2
 - [ ] enable_ipam_organization_admin_account
 - [ ] enable_reachability_analyzer_organization_sharing
 - [ ] enable_serial_console_access
-- [ ] enable_snapshot_block_public_access
 - [X] enable_transit_gateway_route_table_propagation
 - [ ] enable_vgw_route_propagation
 - [ ] enable_volume_io
@@ -501,7 +493,6 @@ ec2
 - [ ] get_instance_uefi_data
 - [ ] get_ipam_address_history
 - [ ] get_ipam_discovered_accounts
-- [ ] get_ipam_discovered_public_addresses
 - [ ] get_ipam_discovered_resource_cidrs
 - [ ] get_ipam_pool_allocations
 - [ ] get_ipam_pool_cidrs
@@ -515,7 +506,6 @@ ec2
 - [ ] get_reserved_instances_exchange_quote
 - [ ] get_security_groups_for_vpc
 - [ ] get_serial_console_access_status
-- [ ] get_snapshot_block_public_access_state
 - [ ] get_spot_placement_scores
 - [ ] get_subnet_cidr_reservations
 - [ ] get_transit_gateway_attachment_propagations
@@ -538,7 +528,6 @@ ec2
 - [ ] import_volume
 - [ ] list_images_in_recycle_bin
 - [ ] list_snapshots_in_recycle_bin
-- [ ] lock_snapshot
 - [ ] modify_address_attribute
 - [ ] modify_availability_zone_group
 - [ ] modify_capacity_reservation
@@ -611,7 +600,6 @@ ec2
 - [ ] move_address_to_vpc
 - [ ] move_byoip_cidr_to_ipam
 - [ ] provision_byoip_cidr
-- [ ] provision_ipam_byoasn
 - [ ] provision_ipam_pool_cidr
 - [ ] provision_public_ipv4_pool_cidr
 - [ ] purchase_capacity_block
@@ -689,7 +677,6 @@ ec2
 - [X] unassign_ipv6_addresses
 - [X] unassign_private_ip_addresses
 - [ ] unassign_private_nat_gateway_address
-- [ ] unlock_snapshot
 - [ ] unmonitor_instances
 - [X] update_security_group_rule_descriptions_egress
 - [X] update_security_group_rule_descriptions_ingress
diff --git a/docs/docs/services/ecr.rst b/docs/docs/services/ecr.rst
index 857f737af..64cab0146 100644
--- a/docs/docs/services/ecr.rst
+++ b/docs/docs/services/ecr.rst
@@ -77,7 +77,5 @@ ecr
 - [ ] start_lifecycle_policy_preview
 - [X] tag_resource
 - [X] untag_resource
-- [ ] update_pull_through_cache_rule
 - [ ] upload_layer_part
-- [ ] validate_pull_through_cache_rule
 
diff --git a/docs/docs/services/eks.rst b/docs/docs/services/eks.rst
index 2c5094545..47798868a 100644
--- a/docs/docs/services/eks.rst
+++ b/docs/docs/services/eks.rst
@@ -29,12 +29,10 @@ eks
 - [ ] associate_identity_provider_config
 - [ ] create_addon
 - [X] create_cluster
-- [ ] create_eks_anywhere_subscription
 - [X] create_fargate_profile
 - [X] create_nodegroup
 - [ ] delete_addon
 - [X] delete_cluster
-- [ ] delete_eks_anywhere_subscription
 - [X] delete_fargate_profile
 - [X] delete_nodegroup
 - [ ] deregister_cluster
@@ -42,7 +40,6 @@ eks
 - [ ] describe_addon_configuration
 - [ ] describe_addon_versions
 - [X] describe_cluster
-- [ ] describe_eks_anywhere_subscription
 - [X] describe_fargate_profile
 - [ ] describe_identity_provider_config
 - [X] describe_nodegroup
@@ -50,7 +47,6 @@ eks
 - [ ] disassociate_identity_provider_config
 - [ ] list_addons
 - [X] list_clusters
-- [ ] list_eks_anywhere_subscriptions
 - [X] list_fargate_profiles
 - [ ] list_identity_provider_configs
 - [X] list_nodegroups
@@ -74,7 +70,6 @@ eks
 - [ ] update_addon
 - [ ] update_cluster_config
 - [ ] update_cluster_version
-- [ ] update_eks_anywhere_subscription
 - [ ] update_nodegroup_config
 - [ ] update_nodegroup_version
 
diff --git a/docs/docs/services/elb.rst b/docs/docs/services/elb.rst
index e4cc475eb..6286d27a5 100644
--- a/docs/docs/services/elb.rst
+++ b/docs/docs/services/elb.rst
@@ -33,7 +33,7 @@ elb
 - [X] create_lb_cookie_stickiness_policy
 - [X] create_load_balancer
 - [X] create_load_balancer_listeners
-- [ ] create_load_balancer_policy
+- [X] create_load_balancer_policy
 - [X] delete_load_balancer
 - [X] delete_load_balancer_listeners
 - [X] delete_load_balancer_policy
@@ -52,6 +52,6 @@ elb
 - [ ] register_instances_with_load_balancer
 - [ ] remove_tags
 - [X] set_load_balancer_listener_ssl_certificate
-- [ ] set_load_balancer_policies_for_backend_server
+- [X] set_load_balancer_policies_for_backend_server
 - [X] set_load_balancer_policies_of_listener
 
diff --git a/docs/docs/services/glue.rst b/docs/docs/services/glue.rst
index 58fd07358..2aeac6467 100644
--- a/docs/docs/services/glue.rst
+++ b/docs/docs/services/glue.rst
@@ -37,7 +37,6 @@ glue
 - [ ] batch_get_dev_endpoints
 - [X] batch_get_jobs
 - [X] batch_get_partition
-- [ ] batch_get_table_optimizer
 - [X] batch_get_triggers
 - [ ] batch_get_workflows
 - [ ] batch_stop_job_run
@@ -69,7 +68,6 @@ glue
 - [ ] create_security_configuration
 - [X] create_session
 - [X] create_table
-- [ ] create_table_optimizer
 - [X] create_trigger
 - [ ] create_user_defined_function
 - [ ] create_workflow
@@ -94,7 +92,6 @@ glue
 - [ ] delete_security_configuration
 - [X] delete_session
 - [X] delete_table
-- [ ] delete_table_optimizer
 - [X] delete_table_version
 - [X] delete_trigger
 - [ ] delete_user_defined_function
@@ -107,8 +104,6 @@ glue
 - [ ] get_classifiers
 - [ ] get_column_statistics_for_partition
 - [ ] get_column_statistics_for_table
-- [ ] get_column_statistics_task_run
-- [ ] get_column_statistics_task_runs
 - [ ] get_connection
 - [ ] get_connections
 - [X] get_crawler
@@ -163,7 +158,6 @@ glue
 - [X] get_session
 - [ ] get_statement
 - [X] get_table
-- [ ] get_table_optimizer
 - [X] get_table_version
 - [X] get_table_versions
 - [X] get_tables
@@ -181,7 +175,6 @@ glue
 - [ ] get_workflow_runs
 - [ ] import_catalog_to_glue
 - [ ] list_blueprints
-- [ ] list_column_statistics_task_runs
 - [X] list_crawlers
 - [ ] list_crawls
 - [ ] list_custom_entity_types
@@ -197,7 +190,6 @@ glue
 - [ ] list_schemas
 - [X] list_sessions
 - [ ] list_statements
-- [ ] list_table_optimizer_runs
 - [X] list_triggers
 - [ ] list_workflows
 - [ ] put_data_catalog_encryption_settings
@@ -212,7 +204,6 @@ glue
 - [ ] run_statement
 - [ ] search_tables
 - [ ] start_blueprint_run
-- [ ] start_column_statistics_task_run
 - [X] start_crawler
 - [ ] start_crawler_schedule
 - [ ] start_data_quality_rule_recommendation_run
@@ -224,7 +215,6 @@ glue
 - [ ] start_ml_labeling_set_generation_task_run
 - [X] start_trigger
 - [ ] start_workflow_run
-- [ ] stop_column_statistics_task_run
 - [X] stop_crawler
 - [ ] stop_crawler_schedule
 - [X] stop_session
@@ -254,7 +244,6 @@ glue
 
 - [ ] update_source_control_from_job
 - [X] update_table
-- [ ] update_table_optimizer
 - [ ] update_trigger
 - [ ] update_user_defined_function
 - [ ] update_workflow
diff --git a/docs/docs/services/iot.rst b/docs/docs/services/iot.rst
index f6504e44a..b52b080f4 100644
--- a/docs/docs/services/iot.rst
+++ b/docs/docs/services/iot.rst
@@ -181,6 +181,10 @@ iot
 - [ ] get_v2_logging_options
 - [ ] list_active_violations
 - [X] list_attached_policies
+  
+        Pagination is not yet implemented
+        
+
 - [ ] list_audit_findings
 - [ ] list_audit_mitigation_actions_executions
 - [ ] list_audit_mitigation_actions_tasks
@@ -222,9 +226,21 @@ iot
 - [ ] list_package_versions
 - [ ] list_packages
 - [X] list_policies
+  
+        Pagination is not yet implemented
+        
+
 - [X] list_policy_principals
+  
+        Pagination is not yet implemented
+        
+
 - [X] list_policy_versions
 - [X] list_principal_policies
+  
+        Pagination is not yet implemented
+        
+
 - [X] list_principal_things
 - [ ] list_provisioning_template_versions
 - [ ] list_provisioning_templates
@@ -236,6 +252,10 @@ iot
 - [ ] list_streams
 - [ ] list_tags_for_resource
 - [X] list_targets_for_policy
+  
+        Pagination is not yet implemented
+        
+
 - [ ] list_targets_for_security_profile
 - [X] list_thing_groups
 - [X] list_thing_groups_for_thing
diff --git a/docs/docs/services/lambda.rst b/docs/docs/services/lambda.rst
index cfd8bb308..ecc51425b 100644
--- a/docs/docs/services/lambda.rst
+++ b/docs/docs/services/lambda.rst
@@ -49,7 +49,7 @@ lambda
 - [X] delete_function
 - [ ] delete_function_code_signing_config
 - [X] delete_function_concurrency
-- [ ] delete_function_event_invoke_config
+- [X] delete_function_event_invoke_config
 - [X] delete_function_url_config
   
         The Qualifier-parameter is not yet implemented
@@ -65,7 +65,7 @@ lambda
 - [ ] get_function_code_signing_config
 - [X] get_function_concurrency
 - [ ] get_function_configuration
-- [ ] get_function_event_invoke_config
+- [X] get_function_event_invoke_config
 - [X] get_function_url_config
   
         The Qualifier-parameter is not yet implemented
@@ -87,7 +87,7 @@ lambda
 - [X] list_aliases
 - [ ] list_code_signing_configs
 - [X] list_event_source_mappings
-- [ ] list_function_event_invoke_configs
+- [X] list_function_event_invoke_configs
 - [ ] list_function_url_configs
 - [X] list_functions
 - [ ] list_functions_by_code_signing_config
@@ -113,7 +113,7 @@ lambda
         variable prior to testing.
         
 
-- [ ] put_function_event_invoke_config
+- [X] put_function_event_invoke_config
 - [ ] put_provisioned_concurrency_config
 - [ ] put_runtime_management_config
 - [ ] remove_layer_version_permission
@@ -129,7 +129,7 @@ lambda
 - [X] update_event_source_mapping
 - [X] update_function_code
 - [X] update_function_configuration
-- [ ] update_function_event_invoke_config
+- [X] update_function_event_invoke_config
 - [X] update_function_url_config
   
         The Qualifier-parameter is not yet implemented
diff --git a/docs/docs/services/logs.rst b/docs/docs/services/logs.rst
index 09596c2b2..c9b4206e0 100644
--- a/docs/docs/services/logs.rst
+++ b/docs/docs/services/logs.rst
@@ -27,16 +27,11 @@ logs
 
 - [ ] associate_kms_key
 - [ ] cancel_export_task
-- [ ] create_delivery
 - [X] create_export_task
 - [X] create_log_group
 - [X] create_log_stream
 - [ ] delete_account_policy
 - [ ] delete_data_protection_policy
-- [ ] delete_delivery
-- [ ] delete_delivery_destination
-- [ ] delete_delivery_destination_policy
-- [ ] delete_delivery_source
 - [X] delete_destination
 - [X] delete_log_group
 - [X] delete_log_stream
@@ -50,11 +45,12 @@ logs
 - [X] delete_retention_policy
 - [X] delete_subscription_filter
 - [ ] describe_account_policies
-- [ ] describe_deliveries
-- [ ] describe_delivery_destinations
-- [ ] describe_delivery_sources
 - [X] describe_destinations
-- [ ] describe_export_tasks
+- [X] describe_export_tasks
+  
+        Pagination is not yet implemented
+        
+
 - [X] describe_log_groups
 - [X] describe_log_streams
 - [X] describe_metric_filters
@@ -82,10 +78,6 @@ logs
         
 
 - [ ] get_data_protection_policy
-- [ ] get_delivery
-- [ ] get_delivery_destination
-- [ ] get_delivery_destination_policy
-- [ ] get_delivery_source
 - [X] get_log_events
 - [ ] get_log_group_fields
 - [ ] get_log_record
@@ -98,9 +90,6 @@ logs
 - [X] list_tags_log_group
 - [ ] put_account_policy
 - [ ] put_data_protection_policy
-- [ ] put_delivery_destination
-- [ ] put_delivery_destination_policy
-- [ ] put_delivery_source
 - [X] put_destination
 - [X] put_destination_policy
 - [X] put_log_events
diff --git a/docs/docs/services/quicksight.rst b/docs/docs/services/quicksight.rst
index 51e65ce0c..1cdc89deb 100644
--- a/docs/docs/services/quicksight.rst
+++ b/docs/docs/services/quicksight.rst
@@ -42,7 +42,6 @@ quicksight
 - [X] create_ingestion
 - [ ] create_namespace
 - [ ] create_refresh_schedule
-- [ ] create_role_membership
 - [ ] create_template
 - [ ] create_template_alias
 - [ ] create_theme
@@ -64,8 +63,6 @@ quicksight
 - [ ] delete_iam_policy_assignment
 - [ ] delete_namespace
 - [ ] delete_refresh_schedule
-- [ ] delete_role_custom_permission
-- [ ] delete_role_membership
 - [ ] delete_template
 - [ ] delete_template_alias
 - [ ] delete_theme
@@ -103,7 +100,6 @@ quicksight
 - [ ] describe_ip_restriction
 - [ ] describe_namespace
 - [ ] describe_refresh_schedule
-- [ ] describe_role_custom_permission
 - [ ] describe_template
 - [ ] describe_template_alias
 - [ ] describe_template_definition
@@ -145,7 +141,6 @@ quicksight
 - [ ] list_ingestions
 - [ ] list_namespaces
 - [ ] list_refresh_schedules
-- [ ] list_role_memberships
 - [ ] list_tags_for_resource
 - [ ] list_template_aliases
 - [ ] list_template_versions
@@ -199,7 +194,6 @@ quicksight
 - [ ] update_ip_restriction
 - [ ] update_public_sharing_settings
 - [ ] update_refresh_schedule
-- [ ] update_role_custom_permission
 - [ ] update_template
 - [ ] update_template_alias
 - [ ] update_template_permissions
diff --git a/docs/docs/services/rds.rst b/docs/docs/services/rds.rst
index 1a08f09c4..d821f6f9a 100644
--- a/docs/docs/services/rds.rst
+++ b/docs/docs/services/rds.rst
@@ -56,7 +56,6 @@ rds
 - [X] create_global_cluster
 - [ ] create_integration
 - [X] create_option_group
-- [ ] create_tenant_database
 - [ ] delete_blue_green_deployment
 - [ ] delete_custom_db_engine_version
 - [X] delete_db_cluster
@@ -76,7 +75,6 @@ rds
 - [X] delete_global_cluster
 - [ ] delete_integration
 - [X] delete_option_group
-- [ ] delete_tenant_database
 - [ ] deregister_db_proxy_targets
 - [ ] describe_account_attributes
 - [ ] describe_blue_green_deployments
@@ -101,7 +99,6 @@ rds
 - [ ] describe_db_proxy_targets
 - [ ] describe_db_security_groups
 - [ ] describe_db_snapshot_attributes
-- [ ] describe_db_snapshot_tenant_databases
 - [X] describe_db_snapshots
 - [X] describe_db_subnet_groups
 - [ ] describe_engine_default_cluster_parameters
@@ -123,7 +120,6 @@ rds
 - [ ] describe_reserved_db_instances
 - [ ] describe_reserved_db_instances_offerings
 - [ ] describe_source_regions
-- [ ] describe_tenant_databases
 - [ ] describe_valid_db_instance_modifications
 - [ ] download_db_log_file_portion
 - [ ] failover_db_cluster
@@ -148,7 +144,6 @@ rds
 - [ ] modify_event_subscription
 - [ ] modify_global_cluster
 - [X] modify_option_group
-- [ ] modify_tenant_database
 - [X] promote_read_replica
 - [X] promote_read_replica_db_cluster
 - [ ] purchase_reserved_db_instances_offering
diff --git a/docs/docs/services/redshift.rst b/docs/docs/services/redshift.rst
index 6abb8ead6..31bbeeaea 100644
--- a/docs/docs/services/redshift.rst
+++ b/docs/docs/services/redshift.rst
@@ -47,7 +47,6 @@ redshift
 - [ ] create_event_subscription
 - [ ] create_hsm_client_certificate
 - [ ] create_hsm_configuration
-- [ ] create_redshift_idc_application
 - [ ] create_scheduled_action
 - [X] create_snapshot_copy_grant
 - [ ] create_snapshot_schedule
@@ -66,7 +65,6 @@ redshift
 - [ ] delete_hsm_client_certificate
 - [ ] delete_hsm_configuration
 - [ ] delete_partner
-- [ ] delete_redshift_idc_application
 - [ ] delete_resource_policy
 - [ ] delete_scheduled_action
 - [X] delete_snapshot_copy_grant
@@ -101,7 +99,6 @@ redshift
 - [ ] describe_node_configuration_options
 - [ ] describe_orderable_cluster_options
 - [ ] describe_partners
-- [ ] describe_redshift_idc_applications
 - [ ] describe_reserved_node_exchange_status
 - [ ] describe_reserved_node_offerings
 - [ ] describe_reserved_nodes
@@ -137,7 +134,6 @@ redshift
 - [ ] modify_custom_domain_association
 - [ ] modify_endpoint_access
 - [ ] modify_event_subscription
-- [ ] modify_redshift_idc_application
 - [ ] modify_scheduled_action
 - [X] modify_snapshot_copy_retention_period
 - [ ] modify_snapshot_schedule
diff --git a/docs/docs/services/s3control.rst b/docs/docs/services/s3control.rst
index 9f1ebdf2f..0370d22b8 100644
--- a/docs/docs/services/s3control.rst
+++ b/docs/docs/services/s3control.rst
@@ -30,7 +30,6 @@ s3control
 - [ ] create_bucket
 - [ ] create_job
 - [ ] create_multi_region_access_point
-- [ ] create_storage_lens_group
 - [X] delete_access_point
 - [ ] delete_access_point_for_object_lambda
 - [X] delete_access_point_policy
@@ -45,7 +44,6 @@ s3control
 - [X] delete_public_access_block
 - [ ] delete_storage_lens_configuration
 - [ ] delete_storage_lens_configuration_tagging
-- [ ] delete_storage_lens_group
 - [ ] describe_job
 - [ ] describe_multi_region_access_point_operation
 - [X] get_access_point
@@ -73,15 +71,12 @@ s3control
 - [X] get_public_access_block
 - [ ] get_storage_lens_configuration
 - [ ] get_storage_lens_configuration_tagging
-- [ ] get_storage_lens_group
 - [ ] list_access_points
 - [ ] list_access_points_for_object_lambda
 - [ ] list_jobs
 - [ ] list_multi_region_access_points
 - [ ] list_regional_buckets
 - [ ] list_storage_lens_configurations
-- [ ] list_storage_lens_groups
-- [ ] list_tags_for_resource
 - [ ] put_access_point_configuration_for_object_lambda
 - [ ] put_access_point_policy
 - [ ] put_access_point_policy_for_object_lambda
@@ -96,9 +91,6 @@ s3control
 - [ ] put_storage_lens_configuration
 - [ ] put_storage_lens_configuration_tagging
 - [ ] submit_multi_region_access_point_routes
-- [ ] tag_resource
-- [ ] untag_resource
 - [ ] update_job_priority
 - [ ] update_job_status
-- [ ] update_storage_lens_group
 
diff --git a/docs/docs/services/sso-admin.rst b/docs/docs/services/sso-admin.rst
index 6e6003a4c..07eb000e2 100644
--- a/docs/docs/services/sso-admin.rst
+++ b/docs/docs/services/sso-admin.rst
@@ -30,40 +30,20 @@ sso-admin
 - [ ] attach_customer_managed_policy_reference_to_permission_set
 - [ ] attach_managed_policy_to_permission_set
 - [X] create_account_assignment
-- [ ] create_application
-- [ ] create_application_assignment
-- [ ] create_instance
 - [ ] create_instance_access_control_attribute_configuration
 - [X] create_permission_set
-- [ ] create_trusted_token_issuer
 - [X] delete_account_assignment
-- [ ] delete_application
-- [ ] delete_application_access_scope
-- [ ] delete_application_assignment
-- [ ] delete_application_authentication_method
-- [ ] delete_application_grant
 - [ ] delete_inline_policy_from_permission_set
-- [ ] delete_instance
 - [ ] delete_instance_access_control_attribute_configuration
 - [X] delete_permission_set
 - [ ] delete_permissions_boundary_from_permission_set
-- [ ] delete_trusted_token_issuer
 - [ ] describe_account_assignment_creation_status
 - [ ] describe_account_assignment_deletion_status
-- [ ] describe_application
-- [ ] describe_application_assignment
-- [ ] describe_application_provider
-- [ ] describe_instance
 - [ ] describe_instance_access_control_attribute_configuration
 - [X] describe_permission_set
 - [ ] describe_permission_set_provisioning_status
-- [ ] describe_trusted_token_issuer
 - [ ] detach_customer_managed_policy_reference_from_permission_set
 - [ ] detach_managed_policy_from_permission_set
-- [ ] get_application_access_scope
-- [ ] get_application_assignment_configuration
-- [ ] get_application_authentication_method
-- [ ] get_application_grant
 - [ ] get_inline_policy_for_permission_set
 - [ ] get_permissions_boundary_for_permission_set
 - [ ] list_account_assignment_creation_status
@@ -73,15 +53,7 @@ sso-admin
         Pagination has not yet been implemented
         
 
-- [ ] list_account_assignments_for_principal
 - [ ] list_accounts_for_provisioned_permission_set
-- [ ] list_application_access_scopes
-- [ ] list_application_assignments
-- [ ] list_application_assignments_for_principal
-- [ ] list_application_authentication_methods
-- [ ] list_application_grants
-- [ ] list_application_providers
-- [ ] list_applications
 - [ ] list_customer_managed_policy_references_in_permission_set
 - [ ] list_instances
 - [ ] list_managed_policies_in_permission_set
@@ -89,19 +61,11 @@ sso-admin
 - [X] list_permission_sets
 - [ ] list_permission_sets_provisioned_to_account
 - [ ] list_tags_for_resource
-- [ ] list_trusted_token_issuers
 - [ ] provision_permission_set
-- [ ] put_application_access_scope
-- [ ] put_application_assignment_configuration
-- [ ] put_application_authentication_method
-- [ ] put_application_grant
 - [ ] put_inline_policy_to_permission_set
 - [ ] put_permissions_boundary_to_permission_set
 - [ ] tag_resource
 - [ ] untag_resource
-- [ ] update_application
-- [ ] update_instance
 - [ ] update_instance_access_control_attribute_configuration
 - [X] update_permission_set
-- [ ] update_trusted_token_issuer
 
diff --git a/docs/docs/services/stepfunctions.rst b/docs/docs/services/stepfunctions.rst
index 6ac74fc59..e374ca7e1 100644
--- a/docs/docs/services/stepfunctions.rst
+++ b/docs/docs/services/stepfunctions.rst
@@ -75,7 +75,6 @@ stepfunctions
 - [X] list_state_machines
 - [X] list_tags_for_resource
 - [ ] publish_state_machine_version
-- [ ] redrive_execution
 - [ ] send_task_failure
 - [ ] send_task_heartbeat
 - [ ] send_task_success
diff --git a/moto/__init__.py b/moto/__init__.py
index 0dcfc5f77..9e0b338a7 100644
--- a/moto/__init__.py
+++ b/moto/__init__.py
@@ -184,7 +184,7 @@ mock_polly = lazy_load(".polly", "mock_polly")
 mock_quicksight = lazy_load(".quicksight", "mock_quicksight")
 mock_ram = lazy_load(".ram", "mock_ram")
 mock_rds = lazy_load(".rds", "mock_rds")
-mock_rdsdata = lazy_load(".rdsdata", "mock_rdsdata")
+mock_rdsdata = lazy_load(".rdsdata", "mock_rdsdata", boto3_name="rds-data")
 mock_redshift = lazy_load(".redshift", "mock_redshift")
 mock_redshiftdata = lazy_load(
     ".redshiftdata", "mock_redshiftdata", boto3_name="redshift-data"
diff --git a/moto/awslambda/exceptions.py b/moto/awslambda/exceptions.py
index 36636fff7..85c91ecf6 100644
--- a/moto/awslambda/exceptions.py
+++ b/moto/awslambda/exceptions.py
@@ -100,6 +100,16 @@ class UnknownPolicyException(LambdaClientError):
         )
 
 
+class UnknownEventConfig(LambdaClientError):
+    code = 404
+
+    def __init__(self, arn: str) -> None:
+        super().__init__(
+            "ResourceNotFoundException",
+            f"The function {arn} doesn't have an EventInvokeConfig",
+        )
+
+
 class ValidationException(LambdaClientError):
     def __init__(self, value: str, property_name: str, specific_message: str):
         message = f"1 validation error detected: Value '{value}' at '{property_name}' failed to satisfy constraint: {specific_message}"
diff --git a/moto/awslambda/models.py b/moto/awslambda/models.py
index f5be1747b..ffac0db24 100644
--- a/moto/awslambda/models.py
+++ b/moto/awslambda/models.py
@@ -47,6 +47,7 @@ from .exceptions import (
     InvalidParameterValueException,
     InvalidRoleFormat,
     UnknownAliasException,
+    UnknownEventConfig,
     UnknownFunctionException,
     UnknownLayerException,
     UnknownLayerVersionException,
@@ -294,6 +295,72 @@ def _validate_s3_bucket_and_key(
     return key
 
 
+class EventInvokeConfig:
+    def __init__(self, arn: str, last_modified: str, config: Dict[str, Any]) -> None:
+        self.config = config
+        self.validate_max()
+        self.validate()
+        self.arn = arn
+        self.last_modified = last_modified
+
+    def validate_max(self) -> None:
+        if "MaximumRetryAttempts" in self.config:
+            mra = self.config["MaximumRetryAttempts"]
+            if mra > 2:
+                raise ValidationException(
+                    mra,
+                    "maximumRetryAttempts",
+                    "Member must have value less than or equal to 2",
+                )
+
+            # < 0 validation done by botocore
+        if "MaximumEventAgeInSeconds" in self.config:
+            mra = self.config["MaximumEventAgeInSeconds"]
+            if mra > 21600:
+                raise ValidationException(
+                    mra,
+                    "maximumEventAgeInSeconds",
+                    "Member must have value less than or equal to 21600",
+                )
+
+            # < 60 validation done by botocore
+
+    def validate(self) -> None:
+        # https://docs.aws.amazon.com/lambda/latest/dg/API_OnSuccess.html
+        regex = r"^$|arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\-])+:([a-z]{2}(-gov)?-[a-z]+-\d{1})?:(\d{12})?:(.*)"
+        pattern = re.compile(regex)
+
+        if self.config["DestinationConfig"]:
+            destination_config = self.config["DestinationConfig"]
+            if (
+                "OnSuccess" in destination_config
+                and "Destination" in destination_config["OnSuccess"]
+            ):
+                contents = destination_config["OnSuccess"]["Destination"]
+                if not pattern.match(contents):
+                    raise ValidationException(
+                        contents,
+                        "destinationConfig.onSuccess.destination",
+                        f"Member must satisfy regular expression pattern: {regex}",
+                    )
+            if (
+                "OnFailure" in destination_config
+                and "Destination" in destination_config["OnFailure"]
+            ):
+                contents = destination_config["OnFailure"]["Destination"]
+                if not pattern.match(contents):
+                    raise ValidationException(
+                        contents,
+                        "destinationConfig.onFailure.destination",
+                        f"Member must satisfy regular expression pattern: {regex}",
+                    )
+
+    def response(self) -> Dict[str, Any]:
+        response = {"FunctionArn": self.arn, "LastModified": self.last_modified}
+        response.update(self.config)
+        return response
+
+
 class ImageConfig:
     def __init__(self, config: Dict[str, Any]) -> None:
         self.cmd = config.get("Command", [])
@@ -549,6 +616,7 @@ class LambdaFunction(CloudFormationModel, DockerModel):
         self.ephemeral_storage: str
         self.code_digest: str
         self.code_bytes: bytes
+        self.event_invoke_config: List[EventInvokeConfig] = []
 
         self.description = spec.get("Description", "")
         self.memory_size = spec.get("MemorySize", 128)
@@ -2302,6 +2370,44 @@ class LambdaBackend(BaseBackend):
         fn = self.get_function(function_name)
         return fn.reserved_concurrency
 
+    def put_function_event_invoke_config(
+        self, function_name: str, config: Dict[str, Any]
+    ) -> Dict[str, Any]:
+        fn = self.get_function(function_name)
+        event_config = EventInvokeConfig(fn.function_arn, fn.last_modified, config)
+        fn.event_invoke_config.append(event_config)
+        return event_config.response()
+
+    def update_function_event_invoke_config(
+        self, function_name: str, config: Dict[str, Any]
+    ) -> Dict[str, Any]:
+        # partial functionality, the update function just does a put
+        # instead of partial update
+        return self.put_function_event_invoke_config(function_name, config)
+
+    def get_function_event_invoke_config(self, function_name: str) -> Dict[str, Any]:
+        fn = self.get_function(function_name)
+        if fn.event_invoke_config:
+            response = fn.event_invoke_config[0]
+            return response.response()
+        else:
+            raise UnknownEventConfig(fn.function_arn)
+
+    def delete_function_event_invoke_config(self, function_name: str) -> None:
+        if self.get_function_event_invoke_config(function_name):
+            fn = self.get_function(function_name)
+            fn.event_invoke_config = []
+
+    def list_function_event_invoke_configs(self, function_name: str) -> Dict[str, Any]:
+        response: Dict[str, List[Dict[str, Any]]] = {"FunctionEventInvokeConfigs": []}
+        try:
+            response["FunctionEventInvokeConfigs"] = [
+                self.get_function_event_invoke_config(function_name)
+            ]
+            return response
+        except UnknownEventConfig:
+            return response
+
 
 def do_validate_s3() -> bool:
     return os.environ.get("VALIDATE_LAMBDA_S3", "") in ["", "1", "true"]
diff --git a/moto/awslambda/responses.py b/moto/awslambda/responses.py
index 78f3ecbb8..d1cdef3b8 100644
--- a/moto/awslambda/responses.py
+++ b/moto/awslambda/responses.py
@@ -7,7 +7,10 @@ from moto.core.responses import TYPE_RESPONSE, BaseResponse
 from moto.core.utils import path_url
 from moto.utilities.aws_headers import amz_crc32, amzn_request_id
 
-from .exceptions import FunctionAlreadyExists, UnknownFunctionException
+from .exceptions import (
+    FunctionAlreadyExists,
+    UnknownFunctionException,
+)
 from .models import LambdaBackend, lambda_backends
 
 
@@ -606,3 +609,39 @@ class LambdaResponse(BaseResponse):
             routing_config=routing_config,
         )
         return 201, {}, json.dumps(alias.to_json())
+
+    def event_invoke_config_handler(
+        self, request: Any, full_url: str, headers: Any
+    ) -> TYPE_RESPONSE:
+        self.setup_class(request, full_url, headers)
+        function_name = unquote(self.path.rsplit("/", 2)[1])
+
+        if self.method == "PUT":
+            response = self.backend.put_function_event_invoke_config(
+                function_name, self.json_body
+            )
+            return 200, {}, json.dumps(response)
+        elif self.method == "GET":
+            response = self.backend.get_function_event_invoke_config(function_name)
+            return 200, {}, json.dumps(response)
+        elif self.method == "DELETE":
+            self.backend.delete_function_event_invoke_config(function_name)
+            return 204, {}, json.dumps({})
+        elif self.method == "POST":
+            response = self.backend.update_function_event_invoke_config(
+                function_name, self.json_body
+            )
+            return 200, {}, json.dumps(response)
+        else:
+            raise NotImplementedError
+
+    def event_invoke_config_list(
+        self, request: Any, full_url: str, headers: Any
+    ) -> TYPE_RESPONSE:
+        self.setup_class(request, full_url, headers)
+        function_name = unquote(self.path.rsplit("/", 3)[1])
+        return (
+            200,
+            {},
+            json.dumps(self.backend.list_function_event_invoke_configs(function_name)),
+        )
diff --git a/moto/awslambda/urls.py b/moto/awslambda/urls.py
index 284a681c3..f26995916 100644
--- a/moto/awslambda/urls.py
+++ b/moto/awslambda/urls.py
@@ -79,4 +79,10 @@ url_paths = {
     r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>.+)/versions/(?P<layer_version>[\w_-]+)$": LambdaResponse.method_dispatch(
         LambdaResponse.layers_version
     ),
+    r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/event-invoke-config/?$": LambdaResponse.method_dispatch(
+        LambdaResponse.event_invoke_config_handler
+    ),
+    r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/event-invoke-config/list$": LambdaResponse.method_dispatch(
+        LambdaResponse.event_invoke_config_list
+    ),
 }
diff --git a/moto/backend_index.py b/moto/backend_index.py
index 0fea6c0a4..f61af9acf 100644
--- a/moto/backend_index.py
+++ b/moto/backend_index.py
@@ -129,7 +129,7 @@ backend_url_patterns = [
     ("ram", re.compile("https?://ram\\.(.+)\\.amazonaws.com")),
     ("rds", re.compile("https?://rds\\.(.+)\\.amazonaws\\.com")),
     ("rds", re.compile("https?://rds\\.amazonaws\\.com")),
-    ("rdsdata", re.compile("https?://rds-data\\.(.+)\\.amazonaws\\.com")),
+    ("rds-data", re.compile("https?://rds-data\\.(.+)\\.amazonaws\\.com")),
     ("redshift", re.compile("https?://redshift\\.(.+)\\.amazonaws\\.com")),
     ("redshift-data", re.compile("https?://redshift-data\\.(.+)\\.amazonaws\\.com")),
     ("rekognition", re.compile("https?://rekognition\\.(.+)\\.amazonaws\\.com")),
diff --git a/moto/dynamodb/models/table.py b/moto/dynamodb/models/table.py
index 7de01b400..b183cbdc7 100644
--- a/moto/dynamodb/models/table.py
+++ b/moto/dynamodb/models/table.py
@@ -20,6 +20,8 @@ from moto.dynamodb.models.dynamo_type import DynamoType, Item
 from moto.dynamodb.models.utilities import dynamo_json_dump
 from moto.moto_api._internal import mock_random
 
+RESULT_SIZE_LIMIT = 1000000  # DynamoDB has a 1MB size limit
+
 
 class SecondaryIndex(BaseModel):
     def __init__(
@@ -813,7 +815,8 @@ class Table(CloudFormationModel):
         index_name: Optional[str] = None,
         projection_expression: Optional[List[List[str]]] = None,
     ) -> Tuple[List[Item], int, Optional[Dict[str, Any]]]:
-        results = []
+        results: List[Item] = []
+        result_size = 0
         scanned_count = 0
 
         if index_name:
@@ -822,16 +825,32 @@ class Table(CloudFormationModel):
         else:
             items = self.all_items()
 
+        last_evaluated_key = None
+        processing_previous_page = exclusive_start_key is not None
         for item in items:
-            scanned_count += 1
+            # Cycle through the previous page of results
+            # When we encounter our start key, we know we've reached the end of the previous page
+            if processing_previous_page:
+                if self._item_equals_dct(item, exclusive_start_key):
+                    processing_previous_page = False
+                continue
+
+            # Check wether we've reached the limit of our result set
+            # That can be either in number, or in size
+            reached_length_limit = len(results) == limit
+            reached_size_limit = (result_size + item.size()) > RESULT_SIZE_LIMIT
+            if reached_length_limit or reached_size_limit:
+                last_evaluated_key = self._get_last_evaluated_key(
+                    results[-1], index_name
+                )
+                break
+
             passes_all_conditions = True
-            for (
-                attribute_name,
-                (comparison_operator, comparison_objs),
-            ) in filters.items():
+            for attribute_name in filters:
                 attribute = item.attrs.get(attribute_name)
 
                 if attribute:
+                    (comparison_operator, comparison_objs) = filters[attribute_name]
                     # Attribute found
                     if not attribute.compare(comparison_operator, comparison_objs):
                         passes_all_conditions = False
@@ -846,17 +865,17 @@ class Table(CloudFormationModel):
                     break
 
             if passes_all_conditions:
-                results.append(item)
-
-        results = copy.deepcopy(results)
-        if index_name:
-            index = self.get_index(index_name)
-            results = [index.project(r) for r in results]
+                if index_name:
+                    index = self.get_index(index_name)
+                    results.append(index.project(copy.deepcopy(item)))
+                else:
+                    results.append(copy.deepcopy(item))
+                result_size += item.size()
 
-        results, last_evaluated_key = self._trim_results(
-            results, limit, exclusive_start_key, scanned_index=index_name
-        )
+            scanned_count += 1
 
+        # https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.FilterExpression
+        # the filter expression should be evaluated after the query.
         if filter_expression is not None:
             results = [item for item in results if filter_expression.expr(item)]
 
@@ -865,6 +884,13 @@ class Table(CloudFormationModel):
 
         return results, scanned_count, last_evaluated_key
 
+    def _item_equals_dct(self, item: Item, dct: Dict[str, Any]) -> bool:
+        hash_key = DynamoType(dct.get(self.hash_key_attr))  # type: ignore[arg-type]
+        range_key = dct.get(self.range_key_attr) if self.range_key_attr else None
+        if range_key is not None:
+            range_key = DynamoType(range_key)
+        return item.hash_key == hash_key and item.range_key == range_key
+
     def _trim_results(
         self,
         results: List[Item],
@@ -873,45 +899,40 @@ class Table(CloudFormationModel):
         scanned_index: Optional[str] = None,
     ) -> Tuple[List[Item], Optional[Dict[str, Any]]]:
         if exclusive_start_key is not None:
-            hash_key = DynamoType(exclusive_start_key.get(self.hash_key_attr))  # type: ignore[arg-type]
-            range_key = (
-                exclusive_start_key.get(self.range_key_attr)
-                if self.range_key_attr
-                else None
-            )
-            if range_key is not None:
-                range_key = DynamoType(range_key)
             for i in range(len(results)):
-                if (
-                    results[i].hash_key == hash_key
-                    and results[i].range_key == range_key
-                ):
+                if self._item_equals_dct(results[i], exclusive_start_key):
                     results = results[i + 1 :]
                     break
 
         last_evaluated_key = None
-        size_limit = 1000000  # DynamoDB has a 1MB size limit
         item_size = sum(res.size() for res in results)
-        if item_size > size_limit:
+        if item_size > RESULT_SIZE_LIMIT:
             item_size = idx = 0
-            while item_size + results[idx].size() < size_limit:
+            while item_size + results[idx].size() < RESULT_SIZE_LIMIT:
                 item_size += results[idx].size()
                 idx += 1
             limit = min(limit, idx) if limit else idx
         if limit and len(results) > limit:
             results = results[:limit]
-            last_evaluated_key = {self.hash_key_attr: results[-1].hash_key}
-            if self.range_key_attr is not None and results[-1].range_key is not None:
-                last_evaluated_key[self.range_key_attr] = results[-1].range_key
-
-            if scanned_index:
-                index = self.get_index(scanned_index)
-                idx_col_list = [i["AttributeName"] for i in index.schema]
-                for col in idx_col_list:
-                    last_evaluated_key[col] = results[-1].attrs[col]
+            last_evaluated_key = self._get_last_evaluated_key(
+                last_result=results[-1], index_name=scanned_index
+            )
 
         return results, last_evaluated_key
 
+    def _get_last_evaluated_key(
+        self, last_result: Item, index_name: Optional[str]
+    ) -> Dict[str, Any]:
+        last_evaluated_key = {self.hash_key_attr: last_result.hash_key}
+        if self.range_key_attr is not None and last_result.range_key is not None:
+            last_evaluated_key[self.range_key_attr] = last_result.range_key
+        if index_name:
+            index = self.get_index(index_name)
+            idx_col_list = [i["AttributeName"] for i in index.schema]
+            for col in idx_col_list:
+                last_evaluated_key[col] = last_result.attrs[col]
+        return last_evaluated_key
+
     def delete(self, account_id: str, region_name: str) -> None:
         from moto.dynamodb.models import dynamodb_backends
 
diff --git a/moto/logs/exceptions.py b/moto/logs/exceptions.py
index a4118febb..4aea395c5 100644
--- a/moto/logs/exceptions.py
+++ b/moto/logs/exceptions.py
@@ -11,7 +11,8 @@ class ResourceNotFoundException(LogsClientError):
     def __init__(self, msg: Optional[str] = None):
         self.code = 400
         super().__init__(
-            "ResourceNotFoundException", msg or "The specified log group does not exist"
+            "ResourceNotFoundException",
+            msg or "The specified log group does not exist.",
         )
 
 
diff --git a/moto/logs/models.py b/moto/logs/models.py
index e7ac94a36..fbff77a9f 100644
--- a/moto/logs/models.py
+++ b/moto/logs/models.py
@@ -1,5 +1,5 @@
-import json
 from datetime import datetime, timedelta
+from gzip import compress as gzip_compress
 from typing import Any, Dict, Iterable, List, Optional, Tuple
 
 from moto.core import BackendDict, BaseBackend, BaseModel, CloudFormationModel
@@ -13,7 +13,7 @@ from moto.logs.exceptions import (
 from moto.logs.logs_query import execute_query
 from moto.logs.metric_filters import MetricFilters
 from moto.moto_api._internal import mock_random
-from moto.s3.models import s3_backends
+from moto.s3.models import MissingBucket, s3_backends
 from moto.utilities.paginator import paginate
 from moto.utilities.tagging_service import TaggingService
 
@@ -1248,7 +1248,12 @@ class LogsBackend(BaseBackend):
         fromTime: int,
         to: int,
     ) -> str:
-        s3_backends[self.account_id]["global"].get_bucket(destination)
+        try:
+            s3_backends[self.account_id]["global"].get_bucket(destination)
+        except MissingBucket:
+            raise InvalidParameterException(
+                "The given bucket does not exist. Please make sure the bucket is valid."
+            )
         if logGroupName not in self.groups:
             raise ResourceNotFoundException()
         task_id = str(mock_random.uuid4())
@@ -1261,15 +1266,41 @@ class LogsBackend(BaseBackend):
             fromTime,
             to,
         )
-        if fromTime <= datetime.now().timestamp() <= to:
-            logs = self.filter_log_events(
-                logGroupName, [], fromTime, to, None, None, "", False
-            )
-            s3_backends[self.account_id]["global"].put_object(
-                destination, destinationPrefix, json.dumps(logs).encode("utf-8")
-            )
-            self.export_tasks[task_id].status["code"] = "completed"
-            self.export_tasks[task_id].status["message"] = "Task is completed"
+
+        s3_backends[self.account_id]["global"].put_object(
+            bucket_name=destination,
+            key_name="aws-logs-write-test",
+            value=b"Permission Check Successful",
+        )
+
+        if fromTime <= unix_time_millis(datetime.now()) <= to:
+            for stream_name in self.groups[logGroupName].streams.keys():
+                logs, _, _ = self.filter_log_events(
+                    log_group_name=logGroupName,
+                    log_stream_names=[stream_name],
+                    start_time=fromTime,
+                    end_time=to,
+                    limit=None,
+                    next_token=None,
+                    filter_pattern="",
+                    interleaved=False,
+                )
+                raw_logs = "\n".join(
+                    [
+                        f"{datetime.fromtimestamp(log['timestamp']/1000).strftime('%Y-%m-%dT%H:%M:%S.000Z')} {log['message']}"
+                        for log in logs
+                    ]
+                )
+                folder = str(mock_random.uuid4()) + "/" + stream_name.replace("/", "-")
+                key_name = f"{destinationPrefix}/{folder}/000000.gz"
+                s3_backends[self.account_id]["global"].put_object(
+                    bucket_name=destination,
+                    key_name=key_name,
+                    value=gzip_compress(raw_logs.encode("utf-8")),
+                )
+            self.export_tasks[task_id].status["code"] = "COMPLETED"
+            self.export_tasks[task_id].status["message"] = "Completed successfully"
+
         return task_id
 
     def describe_export_tasks(self, task_id: str) -> List[ExportTask]:
diff --git a/moto/logs/responses.py b/moto/logs/responses.py
index 9b211018f..0a38fbe62 100644
--- a/moto/logs/responses.py
+++ b/moto/logs/responses.py
@@ -438,7 +438,7 @@ class LogsResponse(BaseResponse):
             fromTime=self._get_int_param("from"),
             to=self._get_int_param("to"),
             destination=self._get_param("destination"),
-            destinationPrefix=self._get_param("destinationPrefix"),
+            destinationPrefix=self._get_param("destinationPrefix", "exportedlogs"),
             taskName=self._get_param("taskName"),
         )
         return json.dumps(dict(taskId=str(task_id)))
diff --git a/scripts/ci_moto_server.sh b/scripts/ci_moto_server.sh
index 35e38602a..3a5f86ea2 100755
--- a/scripts/ci_moto_server.sh
+++ b/scripts/ci_moto_server.sh
@@ -2,4 +2,4 @@
 
 set -e
 pip install $(ls /moto/dist/moto*.gz)[server,all]
-moto_server -H 0.0.0.0 > /moto/server_output.log 2>&1
+moto_server -H 0.0.0.0 | tee /moto/server_output.log 2>&1


Test patch:
diff --git a/tests/test_awslambda/test_lambda.py b/tests/test_awslambda/test_lambda.py
index e4b982039..0eb17edb3 100644
--- a/tests/test_awslambda/test_lambda.py
+++ b/tests/test_awslambda/test_lambda.py
@@ -24,6 +24,7 @@ from .utilities import (
 )
 
 PYTHON_VERSION = "python3.11"
+LAMBDA_FUNC_NAME = "test"
 _lambda_region = "us-west-2"
 boto3.setup_default_session(region_name=_lambda_region)
 
@@ -1845,3 +1846,334 @@ def test_put_function_concurrency_i_can_has_math():
     assert exc.value.response["Error"]["Code"] == "InvalidParameterValueException"
     response = conn.get_function_concurrency(FunctionName=function_name_2)
     assert response["ReservedConcurrentExecutions"] == 100
+
+
+@mock_lambda
+@pytest.mark.parametrize(
+    "config",
+    [
+        {
+            "OnSuccess": {
+                "Destination": f"arn:aws:lambda:us-west-2:123456789012:function:{LAMBDA_FUNC_NAME}-2"
+            },
+            "OnFailure": {},
+        },
+        {
+            "OnFailure": {
+                "Destination": f"arn:aws:lambda:us-west-2:123456789012:function:{LAMBDA_FUNC_NAME}-2"
+            },
+            "OnSuccess": {},
+        },
+        {
+            "OnFailure": {
+                "Destination": "arn:aws:lambda:us-west-2:123456789012:function:test-2"
+            },
+            "OnSuccess": {
+                "Destination": "arn:aws:lambda:us-west-2:123456789012:function:test-2"
+            },
+        },
+    ],
+)
+def test_put_event_invoke_config(config):
+    # Setup
+    client = boto3.client("lambda", _lambda_region)
+    arn_1 = setup_lambda(client, LAMBDA_FUNC_NAME)["FunctionArn"]
+
+    # the name has to match ARNs in pytest parameterize
+    arn_2 = setup_lambda(client, f"{LAMBDA_FUNC_NAME}-2")["FunctionArn"]
+
+    # Execute
+    result = client.put_function_event_invoke_config(
+        FunctionName=LAMBDA_FUNC_NAME, DestinationConfig=config
+    )
+
+    # Verify
+    assert result["FunctionArn"] == arn_1
+    assert result["DestinationConfig"] == config
+
+    # Clean up for servertests
+    client.delete_function(FunctionName=arn_1)
+    client.delete_function(FunctionName=arn_2)
+
+
+@mock_lambda
+@pytest.mark.parametrize(
+    "config",
+    [
+        {
+            "OnSuccess": {
+                "Destination": f"arn:aws:lambda:us-west-2:123456789012:function:{LAMBDA_FUNC_NAME}-2"
+            },
+            "OnFailure": {},
+        },
+        {
+            "OnFailure": {
+                "Destination": f"arn:aws:lambda:us-west-2:123456789012:function:{LAMBDA_FUNC_NAME}-2"
+            },
+            "OnSuccess": {},
+        },
+        {
+            "OnFailure": {
+                "Destination": "arn:aws:lambda:us-west-2:123456789012:function:test-2"
+            },
+            "OnSuccess": {
+                "Destination": "arn:aws:lambda:us-west-2:123456789012:function:test-2"
+            },
+        },
+    ],
+)
+def test_update_event_invoke_config(config):
+    # Setup
+    client = boto3.client("lambda", _lambda_region)
+    arn_1 = setup_lambda(client, LAMBDA_FUNC_NAME)["FunctionArn"]
+
+    # the name has to match ARNs in pytest parameterize
+    arn_2 = setup_lambda(client, f"{LAMBDA_FUNC_NAME}-2")["FunctionArn"]
+
+    # Execute
+    result = client.update_function_event_invoke_config(
+        FunctionName=LAMBDA_FUNC_NAME, DestinationConfig=config
+    )
+
+    # Verify
+    assert result["FunctionArn"] == arn_1
+    assert result["DestinationConfig"] == config
+
+    # Clean up for servertests
+    client.delete_function(FunctionName=arn_1)
+    client.delete_function(FunctionName=arn_2)
+
+
+@mock_lambda
+def test_put_event_invoke_config_errors_1():
+    # Setup
+    client = boto3.client("lambda", _lambda_region)
+    arn_1 = setup_lambda(client, LAMBDA_FUNC_NAME)["FunctionArn"]
+    config = {
+        "OnSuccess": {"Destination": "invalid"},
+        "OnFailure": {},
+    }
+
+    # Execute
+    with pytest.raises(ClientError) as exc:
+        client.put_function_event_invoke_config(
+            FunctionName=LAMBDA_FUNC_NAME, DestinationConfig=config
+        )
+
+    # Verify
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ValidationException"
+    assert (
+        err["Message"] == "1 validation error detected: "
+        "Value 'invalid' at 'destinationConfig.onSuccess.destination' failed to satisfy constraint: "
+        "Member must satisfy regular expression pattern: "
+        r"^$|arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\-])+:([a-z]{2}(-gov)?-[a-z]+-\d{1})?:(\d{12})?:(.*)"
+    )
+
+    # Clean up for servertests
+    client.delete_function(FunctionName=arn_1)
+
+
+@mock_lambda
+def test_put_event_invoke_config_errors_2():
+    # Setup
+    client = boto3.client("lambda", _lambda_region)
+    arn_1 = setup_lambda(client, LAMBDA_FUNC_NAME)["FunctionArn"]
+    arn_2 = setup_lambda(client, f"{LAMBDA_FUNC_NAME}-2")["FunctionArn"]
+    config = {
+        "OnFailure": {"Destination": "invalid"},
+        "OnSuccess": {},
+    }
+
+    # Execute
+    with pytest.raises(ClientError) as exc:
+        client.put_function_event_invoke_config(
+            FunctionName=LAMBDA_FUNC_NAME, DestinationConfig=config
+        )
+
+    # Verify
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ValidationException"
+    assert (
+        err["Message"] == "1 validation error detected: "
+        "Value 'invalid' at 'destinationConfig.onFailure.destination' failed to satisfy constraint: "
+        "Member must satisfy regular expression pattern: "
+        r"^$|arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\-])+:([a-z]{2}(-gov)?-[a-z]+-\d{1})?:(\d{12})?:(.*)"
+    )
+
+    # Clean up for servertests
+    client.delete_function(FunctionName=arn_1)
+    client.delete_function(FunctionName=arn_2)
+
+
+@mock_lambda
+def test_put_event_invoke_config_errors_3():
+    # Setup
+    client = boto3.client("lambda", _lambda_region)
+    arn_1 = setup_lambda(client, LAMBDA_FUNC_NAME)["FunctionArn"]
+    test_val = 5
+
+    # Execute
+    with pytest.raises(ClientError) as exc:
+        client.put_function_event_invoke_config(
+            FunctionName=LAMBDA_FUNC_NAME, MaximumRetryAttempts=test_val
+        )
+
+    # Verify
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ValidationException"
+    assert (
+        err["Message"] == "1 validation error detected: "
+        f"Value '{test_val}' at 'maximumRetryAttempts' failed to satisfy constraint: "
+        "Member must have value less than or equal to 2"
+    )
+
+    # Clean up for servertests
+    client.delete_function(FunctionName=arn_1)
+
+
+@mock_lambda
+def test_put_event_invoke_config_errors_4():
+    # Setup
+    client = boto3.client("lambda", _lambda_region)
+    arn_1 = setup_lambda(client, LAMBDA_FUNC_NAME)["FunctionArn"]
+    test_val = 44444
+
+    # Execute
+    with pytest.raises(ClientError) as exc:
+        client.put_function_event_invoke_config(
+            FunctionName=LAMBDA_FUNC_NAME, MaximumEventAgeInSeconds=test_val
+        )
+
+    # Verify
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ValidationException"
+    assert (
+        err["Message"] == "1 validation error detected: "
+        f"Value '{test_val}' at 'maximumEventAgeInSeconds' failed to satisfy constraint: "
+        "Member must have value less than or equal to 21600"
+    )
+
+    # Clean up for servertests
+    client.delete_function(FunctionName=arn_1)
+
+
+@mock_lambda
+def test_get_event_invoke_config():
+    # Setup
+    client = boto3.client("lambda", _lambda_region)
+    arn_1 = setup_lambda(client, LAMBDA_FUNC_NAME)["FunctionArn"]
+    arn_2 = setup_lambda(client, f"{LAMBDA_FUNC_NAME}-2")["FunctionArn"]
+    config = {
+        "OnFailure": {"Destination": arn_2},
+        "OnSuccess": {"Destination": arn_2},
+    }
+    client.put_function_event_invoke_config(
+        FunctionName=LAMBDA_FUNC_NAME, DestinationConfig=config
+    )
+
+    # Execute
+    result = client.get_function_event_invoke_config(FunctionName=LAMBDA_FUNC_NAME)
+
+    # Verify
+    assert result["DestinationConfig"] == config
+    assert result["FunctionArn"] == arn_1
+    assert "LastModified" in result
+
+    # Clean up for servertests
+    client.delete_function(FunctionName=arn_1)
+    client.delete_function(FunctionName=arn_2)
+
+
+@mock_lambda
+def test_list_event_invoke_configs():
+    # Setup
+    client = boto3.client("lambda", _lambda_region)
+    arn_1 = setup_lambda(client, LAMBDA_FUNC_NAME)["FunctionArn"]
+    arn_2 = setup_lambda(client, f"{LAMBDA_FUNC_NAME}-2")["FunctionArn"]
+    config = {
+        "OnFailure": {"Destination": arn_2},
+        "OnSuccess": {"Destination": arn_2},
+    }
+
+    # Execute
+    result = client.list_function_event_invoke_configs(FunctionName=LAMBDA_FUNC_NAME)
+
+    # Verify
+    assert "FunctionEventInvokeConfigs" in result
+    assert result["FunctionEventInvokeConfigs"] == []
+
+    # Execute
+    client.put_function_event_invoke_config(
+        FunctionName=LAMBDA_FUNC_NAME, DestinationConfig=config
+    )
+    result = client.list_function_event_invoke_configs(FunctionName=LAMBDA_FUNC_NAME)
+
+    # Verify
+    assert len(result["FunctionEventInvokeConfigs"]) == 1
+    assert result["FunctionEventInvokeConfigs"][0]["DestinationConfig"] == config
+
+    # Clean up for servertests
+    client.delete_function(FunctionName=arn_1)
+    client.delete_function(FunctionName=arn_2)
+
+
+@mock_lambda
+def test_get_event_invoke_config_empty():
+    # Setup
+    client = boto3.client("lambda", _lambda_region)
+    arn_1 = setup_lambda(client, LAMBDA_FUNC_NAME)["FunctionArn"]
+
+    # Execute
+    with pytest.raises(ClientError) as exc:
+        client.get_function_event_invoke_config(FunctionName=LAMBDA_FUNC_NAME)
+
+    err = exc.value.response
+
+    # Verify
+    assert err["Error"]["Code"] == "ResourceNotFoundException"
+    assert (
+        err["Error"]["Message"]
+        == f"The function {arn_1} doesn't have an EventInvokeConfig"
+    )
+
+    # Clean up for servertests
+    client.delete_function(FunctionName=arn_1)
+
+
+@mock_lambda
+def test_delete_event_invoke_config():
+    # Setup
+    client = boto3.client("lambda", _lambda_region)
+    arn_1 = setup_lambda(client, LAMBDA_FUNC_NAME)["FunctionArn"]
+
+    # the name has to match ARNs in pytest parameterize
+    arn_2 = setup_lambda(client, f"{LAMBDA_FUNC_NAME}-2")["FunctionArn"]
+    config = {"OnSuccess": {"Destination": arn_2}, "OnFailure": {}}
+    client.put_function_event_invoke_config(
+        FunctionName=LAMBDA_FUNC_NAME, DestinationConfig=config
+    )
+
+    # Execute
+    result = client.delete_function_event_invoke_config(FunctionName=LAMBDA_FUNC_NAME)
+    # Verify
+    assert result["ResponseMetadata"]["HTTPStatusCode"] == 204
+
+    # Clean up for servertests
+    client.delete_function(FunctionName=arn_1)
+    client.delete_function(FunctionName=arn_2)
+
+
+def setup_lambda(client, name):
+    zip_content = get_test_zip_file1()
+    return client.create_function(
+        FunctionName=name,
+        Runtime=PYTHON_VERSION,
+        Role=get_role_name(),
+        Handler="lambda_function.lambda_handler",
+        Code={"ZipFile": zip_content},
+        Description="test lambda function",
+        Timeout=3,
+        MemorySize=128,
+        Publish=True,
+    )
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 48cd2b8a1..ccfa1fddf 100644
--- a/tests/test_dynamodb/test_dynamodb_table_with_range_key.py
+++ b/tests/test_dynamodb/test_dynamodb_table_with_range_key.py
@@ -1170,24 +1170,42 @@ def test_scan_by_index():
     assert res["Count"] == 3
     assert len(res["Items"]) == 3
 
+    res = dynamodb.scan(TableName="test", Limit=1)
+    assert res["Count"] == 1
+    assert res["ScannedCount"] == 1
+
+    res = dynamodb.scan(TableName="test", ExclusiveStartKey=res["LastEvaluatedKey"])
+    assert res["Count"] == 2
+    assert res["ScannedCount"] == 2
+
     res = dynamodb.scan(TableName="test", IndexName="test_gsi")
     assert res["Count"] == 2
+    assert res["ScannedCount"] == 2
     assert len(res["Items"]) == 2
 
     res = dynamodb.scan(TableName="test", IndexName="test_gsi", Limit=1)
     assert res["Count"] == 1
+    assert res["ScannedCount"] == 1
     assert len(res["Items"]) == 1
     last_eval_key = res["LastEvaluatedKey"]
     assert last_eval_key["id"]["S"] == "1"
     assert last_eval_key["gsi_col"]["S"] == "1"
     assert last_eval_key["gsi_range_key"]["S"] == "1"
 
+    res = dynamodb.scan(
+        TableName="test", IndexName="test_gsi", ExclusiveStartKey=last_eval_key
+    )
+    assert res["Count"] == 1
+    assert res["ScannedCount"] == 1
+
     res = dynamodb.scan(TableName="test", IndexName="test_lsi")
     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
     assert len(res["Items"]) == 1
     last_eval_key = res["LastEvaluatedKey"]
     assert last_eval_key["id"]["S"] == "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 461bc83db..546caa4b2 100644
--- a/tests/test_dynamodb/test_dynamodb_table_without_range_key.py
+++ b/tests/test_dynamodb/test_dynamodb_table_without_range_key.py
@@ -523,11 +523,15 @@ def test_scan_pagination():
     page1 = table.scan(Limit=6)
     assert page1["Count"] == 6
     assert len(page1["Items"]) == 6
+    page1_results = set([r["username"] for r in page1["Items"]])
+    assert page1_results == {"user0", "user3", "user1", "user2", "user5", "user4"}
 
     page2 = table.scan(Limit=6, ExclusiveStartKey=page1["LastEvaluatedKey"])
     assert page2["Count"] == 4
     assert len(page2["Items"]) == 4
     assert "LastEvaluatedKey" not in page2
+    page2_results = set([r["username"] for r in page2["Items"]])
+    assert page2_results == {"user6", "user7", "user8", "user9"}
 
     results = page1["Items"] + page2["Items"]
     usernames = set([r["username"] for r in results])
diff --git a/tests/test_logs/test_export_tasks.py b/tests/test_logs/test_export_tasks.py
new file mode 100644
index 000000000..7f685f734
--- /dev/null
+++ b/tests/test_logs/test_export_tasks.py
@@ -0,0 +1,269 @@
+import copy
+import json
+import os
+from datetime import datetime, timedelta
+from uuid import UUID, uuid4
+
+import boto3
+import pytest
+from botocore.exceptions import ClientError
+
+from moto import mock_logs, mock_s3, mock_sts, settings
+from moto.core.utils import unix_time_millis
+
+TEST_REGION = "us-east-1" if settings.TEST_SERVER_MODE else "us-west-2"
+allow_aws_request = (
+    os.environ.get("MOTO_TEST_ALLOW_AWS_REQUEST", "false").lower() == "true"
+)
+
+
+S3_POLICY = {
+    "Version": "2012-10-17",
+    "Statement": [
+        {
+            "Action": "s3:GetBucketAcl",
+            "Effect": "Allow",
+            "Resource": "arn:aws:s3:::{BUCKET_NAME}",
+            "Principal": {"Service": "logs.us-east-1.amazonaws.com"},
+            "Condition": {
+                "StringEquals": {"aws:SourceAccount": ["AccountId1"]},
+                "ArnLike": {"aws:SourceArn": ["..."]},
+            },
+        },
+        {
+            "Action": "s3:PutObject",
+            "Effect": "Allow",
+            "Resource": "arn:aws:s3:::{BUCKET_NAME}/*",
+            "Principal": {"Service": "logs.us-east-1.amazonaws.com"},
+            "Condition": {
+                "StringEquals": {
+                    "s3:x-amz-acl": "bucket-owner-full-control",
+                    "aws:SourceAccount": ["AccountId1"],
+                },
+                "ArnLike": {"aws:SourceArn": ["..."]},
+            },
+        },
+    ],
+}
+
+
+@pytest.fixture()
+def account_id():
+    if allow_aws_request:
+        identity = boto3.client("sts", region_name="us-east-1").get_caller_identity()
+        yield identity["Account"]
+    else:
+        with mock_sts():
+            identity = boto3.client(
+                "sts", region_name="us-east-1"
+            ).get_caller_identity()
+            yield identity["Account"]
+
+
+@pytest.fixture()
+def logs():
+    if allow_aws_request:
+        yield boto3.client("logs", region_name="us-east-1")
+    else:
+        with mock_logs():
+            yield boto3.client("logs", region_name="us-east-1")
+
+
+@pytest.fixture()
+def s3():
+    if allow_aws_request:
+        yield boto3.client("s3", region_name="us-east-1")
+    else:
+        with mock_s3():
+            yield boto3.client("s3", region_name="us-east-1")
+
+
+@pytest.fixture(scope="function")
+def log_group_name(logs):  # pylint: disable=redefined-outer-name
+    name = "/moto/logs_test/" + str(uuid4())[0:5]
+    logs.create_log_group(logGroupName=name)
+    yield name
+    logs.delete_log_group(logGroupName=name)
+
+
+@pytest.fixture()
+def bucket_name(s3, account_id):  # pylint: disable=redefined-outer-name
+    name = f"moto-logs-test-{str(uuid4())[0:6]}"
+    s3.create_bucket(Bucket=name)
+    policy = copy.copy(S3_POLICY)
+    policy["Statement"][0]["Resource"] = f"arn:aws:s3:::{name}"
+    policy["Statement"][0]["Condition"]["StringEquals"]["aws:SourceAccount"] = [
+        account_id
+    ]
+    policy["Statement"][0]["Condition"]["ArnLike"]["aws:SourceArn"] = [
+        f"arn:aws:logs:us-east-1:{account_id}:log-group:*"
+    ]
+    policy["Statement"][1]["Resource"] = f"arn:aws:s3:::{name}/*"
+    policy["Statement"][1]["Condition"]["StringEquals"]["aws:SourceAccount"] = [
+        account_id
+    ]
+    policy["Statement"][1]["Condition"]["ArnLike"]["aws:SourceArn"] = [
+        f"arn:aws:logs:us-east-1:{account_id}:log-group:*"
+    ]
+
+    s3.put_bucket_policy(Bucket=name, Policy=json.dumps(policy))
+    yield name
+
+    # Delete any files left behind
+    versions = s3.list_object_versions(Bucket=name).get("Versions", [])
+    for key in versions:
+        s3.delete_object(Bucket=name, Key=key["Key"], VersionId=key.get("VersionId"))
+    delete_markers = s3.list_object_versions(Bucket=name).get("DeleteMarkers", [])
+    for key in delete_markers:
+        s3.delete_object(Bucket=name, Key=key["Key"], VersionId=key.get("VersionId"))
+
+    # Delete bucket itself
+    s3.delete_bucket(Bucket=name)
+
+
+@pytest.mark.aws_verified
+def test_create_export_task_happy_path(
+    logs, s3, log_group_name, bucket_name
+):  # pylint: disable=redefined-outer-name
+    fromTime = 1611316574
+    to = 1642852574
+    resp = logs.create_export_task(
+        logGroupName=log_group_name,
+        fromTime=fromTime,
+        to=to,
+        destination=bucket_name,
+    )
+    # taskId resembles a valid UUID (i.e. a string of 32 hexadecimal digits)
+    assert UUID(resp["taskId"])
+    assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200
+
+    # s3 bucket contains indication that permissions were successful
+    resp = s3.get_object(Bucket=bucket_name, Key="aws-logs-write-test")
+    assert resp["Body"].read() == b"Permission Check Successful"
+
+
+@pytest.mark.aws_verified
+def test_create_export_task_raises_ClientError_when_bucket_not_found(
+    logs, log_group_name  # pylint: disable=redefined-outer-name
+):
+    destination = "368a7022dea3dd621"
+    fromTime = 1611316574
+    to = 1642852574
+    with pytest.raises(ClientError) as exc:
+        logs.create_export_task(
+            logGroupName=log_group_name,
+            fromTime=fromTime,
+            to=to,
+            destination=destination,
+        )
+    err = exc.value.response["Error"]
+    assert err["Code"] == "InvalidParameterException"
+    assert (
+        err["Message"]
+        == "The given bucket does not exist. Please make sure the bucket is valid."
+    )
+
+
+@pytest.mark.aws_verified
+def test_create_export_raises_ResourceNotFoundException_log_group_not_found(
+    logs, bucket_name  # pylint: disable=redefined-outer-name
+):
+    with pytest.raises(logs.exceptions.ResourceNotFoundException) as exc:
+        logs.create_export_task(
+            logGroupName=f"/aws/nonexisting/{str(uuid4())[0:6]}",
+            fromTime=1611316574,
+            to=1642852574,
+            destination=bucket_name,
+        )
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ResourceNotFoundException"
+    assert err["Message"] == "The specified log group does not exist."
+
+
+@pytest.mark.aws_verified
+def test_create_export_executes_export_task(
+    logs, s3, log_group_name, bucket_name
+):  # pylint: disable=redefined-outer-name
+    fromTime = int(unix_time_millis(datetime.now() - timedelta(days=1)))
+    to = int(unix_time_millis(datetime.now() + timedelta(days=1)))
+
+    logs.create_log_stream(logGroupName=log_group_name, logStreamName="/some/stream")
+
+    messages = [
+        {"timestamp": int(unix_time_millis()), "message": f"hello_{i}"}
+        for i in range(10)
+    ]
+    logs.put_log_events(
+        logGroupName=log_group_name, logStreamName="/some/stream", logEvents=messages
+    )
+
+    task_id = logs.create_export_task(
+        logGroupName=log_group_name,
+        fromTime=fromTime,
+        to=to,
+        destination=bucket_name,
+    )["taskId"]
+
+    task = logs.describe_export_tasks(taskId=task_id)["exportTasks"][0]
+    assert task["status"]["code"] in ["COMPLETED", "RUNNING"]
+    assert task["logGroupName"] == log_group_name
+    assert task["destination"] == bucket_name
+    assert task["destinationPrefix"] == "exportedlogs"
+    assert task["from"] == fromTime
+    assert task["to"] == to
+
+    objects = s3.list_objects(Bucket=bucket_name)["Contents"]
+    key_names = [o["Key"] for o in objects]
+    assert "aws-logs-write-test" in key_names
+
+
+def test_describe_export_tasks_happy_path(
+    logs, s3, log_group_name
+):  # pylint: disable=redefined-outer-name
+    destination = "mybucket"
+    fromTime = 1611316574
+    to = 1642852574
+    s3.create_bucket(Bucket=destination)
+    logs.create_export_task(
+        logGroupName=log_group_name,
+        fromTime=fromTime,
+        to=to,
+        destination=destination,
+    )
+    resp = logs.describe_export_tasks()
+    assert len(resp["exportTasks"]) == 1
+    assert resp["exportTasks"][0]["logGroupName"] == log_group_name
+    assert resp["exportTasks"][0]["destination"] == destination
+    assert resp["exportTasks"][0]["from"] == fromTime
+    assert resp["exportTasks"][0]["to"] == to
+    assert resp["exportTasks"][0]["status"]["code"] == "active"
+    assert resp["exportTasks"][0]["status"]["message"] == "Task is active"
+
+
+def test_describe_export_tasks_task_id(
+    logs, log_group_name, bucket_name
+):  # pylint: disable=redefined-outer-name
+    fromTime = 1611316574
+    to = 1642852574
+    resp = logs.create_export_task(
+        logGroupName=log_group_name,
+        fromTime=fromTime,
+        to=to,
+        destination=bucket_name,
+    )
+    taskId = resp["taskId"]
+    resp = logs.describe_export_tasks(taskId=taskId)
+    assert len(resp["exportTasks"]) == 1
+    assert resp["exportTasks"][0]["logGroupName"] == log_group_name
+    assert resp["exportTasks"][0]["destination"] == bucket_name
+    assert resp["exportTasks"][0]["from"] == fromTime
+    assert resp["exportTasks"][0]["to"] == to
+    assert resp["exportTasks"][0]["status"]["code"] == "active"
+    assert resp["exportTasks"][0]["status"]["message"] == "Task is active"
+
+
+def test_describe_export_tasks_raises_ResourceNotFoundException_task_id_not_found(
+    logs,
+):  # pylint: disable=redefined-outer-name
+    with pytest.raises(logs.exceptions.ResourceNotFoundException):
+        logs.describe_export_tasks(taskId="368a7022dea3dd621")
diff --git a/tests/test_logs/test_integration.py b/tests/test_logs/test_integration.py
index dbdbea54c..f8e6d64fa 100644
--- a/tests/test_logs/test_integration.py
+++ b/tests/test_logs/test_integration.py
@@ -480,7 +480,7 @@ def test_delete_subscription_filter_errors():
     assert ex.operation_name == "DeleteSubscriptionFilter"
     assert ex.response["ResponseMetadata"]["HTTPStatusCode"] == 400
     assert ex.response["Error"]["Code"] == "ResourceNotFoundException"
-    assert ex.response["Error"]["Message"] == "The specified log group does not exist"
+    assert ex.response["Error"]["Message"] == "The specified log group does not exist."
 
     # when
     with pytest.raises(ClientError) as e:
@@ -529,7 +529,7 @@ def test_put_subscription_filter_errors():
     assert ex.operation_name == "PutSubscriptionFilter"
     assert ex.response["ResponseMetadata"]["HTTPStatusCode"] == 400
     assert ex.response["Error"]["Code"] == "ResourceNotFoundException"
-    assert ex.response["Error"]["Message"] == "The specified log group does not exist"
+    assert ex.response["Error"]["Message"] == "The specified log group does not exist."
 
     # when
     with pytest.raises(ClientError) as e:
diff --git a/tests/test_logs/test_logs.py b/tests/test_logs/test_logs.py
index 89c45c939..1e741717a 100644
--- a/tests/test_logs/test_logs.py
+++ b/tests/test_logs/test_logs.py
@@ -1,13 +1,12 @@
 import json
-from datetime import datetime, timedelta
-from uuid import UUID
+from datetime import timedelta
 
 import boto3
 import pytest
 from botocore.exceptions import ClientError
 from freezegun import freeze_time
 
-from moto import mock_logs, mock_s3, settings
+from moto import mock_logs, settings
 from moto.core.utils import unix_time_millis, utcnow
 from moto.logs.models import MAX_RESOURCE_POLICIES_PER_REGION
 
@@ -1078,7 +1077,7 @@ def test_describe_subscription_filters_errors():
     assert "ResourceNotFoundException" in exc_value.response["Error"]["Code"]
     assert (
         exc_value.response["Error"]["Message"]
-        == "The specified log group does not exist"
+        == "The specified log group does not exist."
     )
 
 
@@ -1370,152 +1369,3 @@ def test_describe_log_streams_no_prefix():
     err = ex.value.response["Error"]
     assert err["Code"] == "InvalidParameterException"
     assert err["Message"] == "Cannot order by LastEventTime with a logStreamNamePrefix."
-
-
-@mock_s3
-@mock_logs
-def test_create_export_task_happy_path():
-    log_group_name = "/aws/codebuild/blah1"
-    destination = "mybucket"
-    fromTime = 1611316574
-    to = 1642852574
-    logs = boto3.client("logs", region_name="ap-southeast-1")
-    s3 = boto3.client("s3", "us-east-1")
-    logs.create_log_group(logGroupName=log_group_name)
-    s3.create_bucket(Bucket=destination)
-    resp = logs.create_export_task(
-        logGroupName=log_group_name,
-        fromTime=fromTime,
-        to=to,
-        destination=destination,
-    )
-    # taskId resembles a valid UUID (i.e. a string of 32 hexadecimal digits)
-    assert UUID(resp["taskId"])
-    assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200
-
-
-@mock_logs
-def test_create_export_task_raises_ClientError_when_bucket_not_found():
-    log_group_name = "/aws/codebuild/blah1"
-    destination = "368a7022dea3dd621"
-    fromTime = 1611316574
-    to = 1642852574
-    logs = boto3.client("logs", region_name="ap-southeast-1")
-    logs.create_log_group(logGroupName=log_group_name)
-    with pytest.raises(ClientError):
-        logs.create_export_task(
-            logGroupName=log_group_name,
-            fromTime=fromTime,
-            to=to,
-            destination=destination,
-        )
-
-
-@mock_s3
-@mock_logs
-def test_create_export_raises_ResourceNotFoundException_log_group_not_found():
-    log_group_name = "/aws/codebuild/blah1"
-    destination = "mybucket"
-    fromTime = 1611316574
-    to = 1642852574
-    s3 = boto3.client("s3", region_name="us-east-1")
-    s3.create_bucket(Bucket=destination)
-    logs = boto3.client("logs", region_name="ap-southeast-1")
-    with pytest.raises(logs.exceptions.ResourceNotFoundException):
-        logs.create_export_task(
-            logGroupName=log_group_name,
-            fromTime=fromTime,
-            to=to,
-            destination=destination,
-        )
-
-
-@mock_s3
-@mock_logs
-def test_create_export_executes_export_task():
-    log_group_name = "/aws/codebuild/blah1"
-    destination = "mybucket"
-    fromTime = int(datetime.now().replace(hour=0, minute=0, second=0).timestamp())
-    to = int(datetime.now().replace(hour=23, minute=59, second=59).timestamp())
-    logs = boto3.client("logs", region_name="ap-southeast-1")
-    s3 = boto3.client("s3", "us-east-1")
-    logs.create_log_group(logGroupName=log_group_name)
-    s3.create_bucket(Bucket=destination)
-    resp = logs.create_export_task(
-        logGroupName=log_group_name,
-        fromTime=fromTime,
-        to=to,
-        destination=destination,
-    )
-    taskId = resp["taskId"]
-    resp = logs.describe_export_tasks(taskId=taskId)
-    assert len(resp["exportTasks"]) == 1
-    assert resp["exportTasks"][0]["logGroupName"] == log_group_name
-    assert resp["exportTasks"][0]["destination"] == destination
-    assert resp["exportTasks"][0]["from"] == fromTime
-    assert resp["exportTasks"][0]["to"] == to
-    assert resp["exportTasks"][0]["status"]["code"] == "completed"
-    assert resp["exportTasks"][0]["status"]["message"] == "Task is completed"
-
-
-@mock_s3
-@mock_logs
-def test_describe_export_tasks_happy_path():
-    log_group_name = "/aws/codebuild/blah1"
-    destination = "mybucket"
-    fromTime = 1611316574
-    to = 1642852574
-    logs = boto3.client("logs", region_name="ap-southeast-1")
-    s3 = boto3.client("s3", "us-east-1")
-    logs.create_log_group(logGroupName=log_group_name)
-    s3.create_bucket(Bucket=destination)
-    logs.create_export_task(
-        logGroupName=log_group_name,
-        fromTime=fromTime,
-        to=to,
-        destination=destination,
-    )
-    resp = logs.describe_export_tasks()
-    assert len(resp["exportTasks"]) == 1
-    assert resp["exportTasks"][0]["logGroupName"] == log_group_name
-    assert resp["exportTasks"][0]["destination"] == destination
-    assert resp["exportTasks"][0]["from"] == fromTime
-    assert resp["exportTasks"][0]["to"] == to
-    assert resp["exportTasks"][0]["status"]["code"] == "active"
-    assert resp["exportTasks"][0]["status"]["message"] == "Task is active"
-
-
-@mock_s3
-@mock_logs
-def test_describe_export_tasks_task_id():
-    log_group_name = "/aws/codebuild/blah1"
-    destination = "mybucket"
-    fromTime = 1611316574
-    to = 1642852574
-    logs = boto3.client("logs", region_name="ap-southeast-1")
-    s3 = boto3.client("s3", "us-east-1")
-    logs.create_log_group(logGroupName=log_group_name)
-    s3.create_bucket(Bucket=destination)
-    resp = logs.create_export_task(
-        logGroupName=log_group_name,
-        fromTime=fromTime,
-        to=to,
-        destination=destination,
-    )
-    taskId = resp["taskId"]
-    resp = logs.describe_export_tasks(taskId=taskId)
-    assert len(resp["exportTasks"]) == 1
-    assert resp["exportTasks"][0]["logGroupName"] == log_group_name
-    assert resp["exportTasks"][0]["destination"] == destination
-    assert resp["exportTasks"][0]["from"] == fromTime
-    assert resp["exportTasks"][0]["to"] == to
-    assert resp["exportTasks"][0]["status"]["code"] == "active"
-    assert resp["exportTasks"][0]["status"]["message"] == "Task is active"
-
-
-@mock_s3
-@mock_logs
-def test_describe_export_tasks_raises_ResourceNotFoundException_task_id_not_found():
-    logs = boto3.client("logs", region_name="ap-southeast-1")
-    with pytest.raises(logs.exceptions.ResourceNotFoundException):
-        logs.describe_export_tasks(taskId="368a7022dea3dd621")
diff --git a/tests/test_logs/test_logs_query/test_boto3.py b/tests/test_logs/test_logs_query/test_boto3.py
index 32e73cad3..2ce964ffa 100644
--- a/tests/test_logs/test_logs_query/test_boto3.py
+++ b/tests/test_logs/test_logs_query/test_boto3.py
@@ -34,12 +34,9 @@ def test_start_query__unknown_log_group():
         )
 
     # then
-    exc_value = exc.value
-    assert "ResourceNotFoundException" in exc_value.response["Error"]["Code"]
-    assert (
-        exc_value.response["Error"]["Message"]
-        == "The specified log group does not exist"
-    )
+    err = exc.value.response["Error"]
+    assert err["Code"] == "ResourceNotFoundException"
+    assert err["Message"] == "The specified log group does not exist."
 
 
 @mock_logs
diff --git a/tests/test_rdsdata/test_rdsdata.py b/tests/test_rdsdata/test_rdsdata.py
index b528de520..5d2d73b7d 100644
--- a/tests/test_rdsdata/test_rdsdata.py
+++ b/tests/test_rdsdata/test_rdsdata.py
@@ -23,7 +23,9 @@ def test_execute_statement():
 @mock_rdsdata
 def test_set_query_results():
     base_url = (
-        "localhost:5000" if settings.TEST_SERVER_MODE else "motoapi.amazonaws.com"
+        settings.test_server_mode_endpoint()
+        if settings.TEST_SERVER_MODE
+        else "http://motoapi.amazonaws.com"
     )
 
     sql_result = {
@@ -37,7 +39,7 @@ def test_set_query_results():
         "region": "us-west-1",
     }
     resp = requests.post(
-        f"http://{base_url}/moto-api/static/rds-data/statement-results",
+        f"{base_url}/moto-api/static/rds-data/statement-results",
         json=sql_result,
     )
     assert resp.status_code == 201