A library that allows your python tests to mock out the boto
library. Meta package to install server extra (moto[server])
Provides
Requires
License
Apache-2.0
Changelog
* Fri Jan 23 2026 Markéta Machová <mmachova@suse.com>
- Update to 5.1.20
* Many new methods and services
* Python 3.14 is now officially supported
* Removed support for the RoboMaker, QLDB and ElasticTranscoder,
now that AWS has also deprecated these services
* otherwise, see upstream changelog:
https://github.com/getmoto/moto/blob/5.1.20/CHANGELOG.md
* Mon Sep 22 2025 Steve Kowalik <steven.kowalik@suse.com>
- Update to 5.1.13
* see upstream changelog:
https://github.com/getmoto/moto/blob/5.1.13/CHANGELOG.md
* Thu Jul 24 2025 Nico Krapp <nico.krapp@suse.com>
- Update to 5.1.8
* see upstream changelog:
https://github.com/getmoto/moto/blob/5.1.8/CHANGELOG.md
* Tue Feb 25 2025 Markéta Machová <mmachova@suse.com>
- Update to 5.1.0
* Dropped support for Python 3.8
* New Services in: Lex V2 Models, CloudHSM V2
* New Methods in: ElasticSearch, RDS, SecurityHub, TimeStream InfluxDB
* Wed Nov 06 2024 Bernhard Wiedemann <bwiedemann@suse.com>
- Update to 5.0.20:
fix reproducible builds (boo#1047218)
* Fri Oct 04 2024 ecsos <ecsos@opensuse.org>
- Update to 5.0.16:
[#] New Services:
* OpenSearch Ingestion Service:
* create_pipeline()
* delete_pipeline()
* get_pipeline()
* list_pipelines()
* list_tags_for_resource()
* start_pipeline()
* stop_pipeline()
* tag_resource()
* untag_resource()
* update_pipeline()
[#] New Methods:
* CloudFront:
* get_invalidation()
* Directory Service:
* create_trust()
* delete_trust()
* describe_ldaps_settings()
* describe_trusts()
* disable_ldaps()
* enable_ldaps()
* EC2:
* modify_ebs_default_kms_key_id()
[#] Miscellaneous:
* CloudFormation: AWS::ECS::TaskDefinition now correctly validates the provided memory parameters
* EC2: create_network_acl_entry() now supports the Ipv6CidrBlock-parameter
* EC2: create_tags() now takes existing tags into account before throwing a TagLimitExceeded-exception
* Firehose: put_record_batch() no longer fails when the SnowflakeDestinationConfiguration-parameter is set
* FSx: The FileSystemID now uses the same pattern as AWS (fs-xxxxxxxx)
* GuardDuty: create_detector() now supports the Features-parameter
* Polly has been updated with the latest voices
* RDS: modify_option_groups() now correctly parses OptionsToInclude
* ResourceGroupsTaggingAPI: get_resources() now supports EC2 NAT Gateways, route tables, subnets
* Scheduler: create_chedule() now validates the start_date-parameter for recurrent schedule expressions
* SNS: publish() and publish_batch now support MessageStructure=json
* WAFv2: associate_web_acl() now allows any resource to be associated
- Update to 5.0.15:
[#] New Services:
* MemoryDB:
* create_cluster()
* create_snapshot()
* create_subnet_group()
* delete_cluster()
* delete_snapshot()
* delete_subnet_group()
* describe_clusters()
* describe_snapshots()
* describe_subnet_groups()
* list_tags()
* tag_resource()
* untag_resource()
* update_cluster()
* WorkspacesWeb:
* associate_browser_settings()
* associate_network_settings()
* associate_user_access_logging_settings()
* associate_user_settings()
* create_browser_settings()
* create_network_settings()
* create_portal()
* create_user_access_logging_settings()
* create_user_settings()
* delete_browser_settings()
* delete_network_settings()
* delete_portal()
* delete_user_access_logging_settings()
* delete_user_settings()
* get_browser_settings()
* get_network_settings()
* get_portal()
* get_user_access_logging_settings()
* get_user_settings()
* list_browser_settings()
* list_network_settings()
* list_portals()
* list_user_access_logging_settings()
* list_user_settings()
[#] New Methods:
* ApiGateway:
* get_account()
* update_account()
* AppSync:
* create_api_cache()
* delete_api_cache()
* get_api_cache()
[#] Miscellaneous:
* DynamoDB: get/delete/update_item() now validates all provided keys exist
* Firehose: create_delivery_stream() now supports the SnowflakeDestinationConfiguration-parameter
* S3: put_object() now support conditional writes
- Update to 5.0.14:
[#] General:
* All JSON files in the binary distribution are shipped compressed, significantly reducing the size on disk
[#] New Services:
* Shield:
* create_subscription()
* describe_subscription()
* TimestreamQuery:
* create_scheduled_query()
* delete_scheduled_query()
* describe_endpoints()
* describe_scheduled_query()
* query()
* update_scheduled_query()
[#] New Methods:
* AppMesh:
* create_virtual_node()
* delete_virtual_node()
* describe_virtual_node()
* list_virtual_nodes()
* update_virtual_node()
* create_virtual_router()
* delete_virtual_router()
* describe_virtual_router()
* list_virtual_routers()
* update_virtual_router()
* create_route()
* delete_route()
* describe_route()
* list_routes()
* update_route()
[#] Miscellaneous:
* CloudFormation templates now support the Fn::Base64-function
* CognitoIDP: Enhanced support for MFA flows/challenges
* DynamoDB: update_item() now validates empty string sets
* EC2: describe_snapshots() now supports the kms-key-id filter
* EC2: run_instances() now supports the parameter Ipv6AddressCount
* ECS: Tasks can now be created with unknown security groups
* IAM: generate_credentials_report() now shows active certificates
* KMS: sign() now supports Alias ARNs
* Route53: list_resource_record_sets() now validates record names
* S3: create_bucket() now has additional LocationConstraint-validation
* S3: delete_objects() now respects BucketPolicy and ObjectLocks
* S3: head_object() now handles Range-parameter correctly
* SageMaker: search() now supports the CONTAINS filter
* Sagemaker Runtime: invoke_endpoint_async() now supports failure responses
* SNS: Signature of HTTP Messages are now valid
* SSM: get_maintenance_window() now returns an exception if the window does not exist
* SQS: delete_message_batch() now validates there's at least one entry
- Update to 5.0.13:
[#] General:
* Support for Python 3.13
* Moto now supports whitelisting which services can be used
[#] New Services:
* AppMesh:
* create_mesh()
* delete_mesh()
* describe_mesh()
* list_meshes()
* list_tags_for_resource()
* tag_resource()
* update_mesh()
* Transfer:
* create_server()
* create_user()
* delete_server()
* delete_ssh_public_key()
* delete_user()
* describe_server()
* describe_user()
* import_ssh_public_key()
[#] New Methods:
* Athena:
* delete_work_group()
* CodeBuild:
* batch_get_projects()
* DynamoDB:
* delete_resource_policy()
* get_resource_policy()
* put_resource_policy()
* EMR:
* get_block_public_access_configuration()
* put_block_public_access_configuration()
* QLDB:
* create_ledger()
* delete_ledger()
* describe_ledger()
* list_tags_for_resource()
* tag_resource()
* update_ledger()
* SageMaker:
* create_data_quality_job_definition()
* create_model_bias_job_definition()
* create_model_card()
* delete_data_quality_job_definition()
* delete_model_bias_job_definition()
* delete_model_card()
* describe_data_quality_job_definition()
* describe_model_bias_job_definition()
* describe_model_card()
* list_data_quality_job_definitions()
* list_model_bias_job_definitions()
* list_model_cards()
* list_model_card_versions()
[#] Miscellaneous:
* ACM-PCA: create_certificate_authority() now uses the provided Subject
* Athena: The default work group now has the correct configuration
* ApplicationAutoscaling - put_scheduled_action() now allows multiple actions per Namespace/Dimension/Id
* Autoscaling: update_group() now validates that the Group exists
* Batch: now supports parameters in Job commands
* CloudFormation: create_change_set() now validates the provided ChangeSetName
* CloudFormation: describe_stacks() now returns export names in the Outputs
* CloudFormation: AWS::Events::Rule's now also creates/deletes Targets
* CloudWatch: get_metric_data() now returns everything when querying for Metric Insights Queries
* CodeBuild: create_project() now supports the parameter description, tags, cache, timeoutInMinutes,
queuedTimeoutInMinutes, sourceVersion, logsConfig and vpcConfig
* CognitoIDP: sign_up() now returns CodeDeliveryDetails
* DynamoDB: export_table_to_point_in_time() now exports data in correct format
* DynamoDB: update_item() now validates an empty ExpressionAttributeValues and UpdateExpression
* DynamoDB: All applicable methods that accept a TableName-parameter now also accept the ARN of the table
* EC2: describe_security_group_rules() now correctly exposes rules with duplicate port/protocol values
* EC2: Terminating an instance now also terminates any NIC's
* EventBridge: create_connection() now creates a KMS Secret
* EventBridge: Messages are now formatted using the InputTemplate, if provided
* KMS: describe_key() now exposes the MultiRegionConfiguration-attribute
* Organizations: create_account() now comes preconfigured with an IAM role
* RDS: update_db_instance() now supports the CloudwatchLogsExportConfiguration-parameter
* ResourceGroupsTagging API now supports additional SageMaker resources
(CompilationJobs, Domains, ModelExplainabilityJobDefinition, ModelQualityJobDefinition, HyperParameterTuningJob)
* S3: copy_object() now respects the CopySourceIfNoneMatch-parameter
* SageMaker: search() now supports ModelPackageGroups
* StepFunctions now has improved JSONPath support
* StepFunctions now supports MaxItem/MaxItemPath/MaxConcurrencyPath
* StepFunctions now supports MaxAttempts with value 0
- Update to 5.0.12:
[#] General:
* The MotoProxy can now be run on Windows
[#] New Services:
* DirectConnect:
* create_connection()
* delete_connection()
* describe_connections()
* update_connection()
* DynamoDB:
* describe_export()
* export_table_to_point_in_time()
* list_export()
* NetworkManager:
* create_device()
* create_link()
* create_link()
* delete_device()
* delete_link()
* delete_site()
* get_devices()
* get_links()
* get_sites()
* list_tags_for_resource()
* SageMaker:
* list_endpoints()
* list_endpoint_configs()
* create_auto_ml_job_v2()
* describe_auto_ml_job_v2()
* list_auto_ml_jobs()
* stop_auto_ml_job()
* create_compilation_job()
* describe_compilation_job()
* list_compilation_jobs()
* delete_compilation_job()
* create_domain()
* describe_domain()
* list_domains()
* delete_domain()
* create_model_explainability_job_definition()
* describe_model_explainability_job_definition()
* list_model_explainability_job_definitions()
* delete_model_explainability_job_definition()
* create_hyper_parameter_tuning_job()
* describe_hyper_parameter_tuning_job()
* list_hyper_parameter_tuning_jobs()
* delete_hyper_parameter_tuning_job()
* create_model_quality_job_definition()
* describe_model_quality_job_definition()
* list_model_quality_job_definitions()
* delete_model_quality_job_definition()
* Route53:
* list_tags_for_resource()
[#] Miscellaneous:
* ACM: export_certificate() now only allows exporting private certificates
* ACM: DomainValidationOptions now have SUCCESS-status, fixing the `certificate_validated` waiter
* Athena: QueryResults are now stored in S3
* CloudFormation: update_stack() now persists the new parameters provided
* CloudFormation: update_stack() now understands UsePreviousValue=False
* CloudFormation: update_stack() now throws an exception when using UsePreviousValue=True and a new parameter value
* CloudFormation: update_stack() is now able to update resources where only the parameters have changed
* CloudFormation: AWS::S3::Bucket resources will now create/update Tags
* CloudFormation: AWS::S3::Bucket resources are no longer recreated for every update
* CognitoIDP: initiate_auth() now supports USERNAME_PASSWORD_AUTH and SMS/Software Token MFA
* CognitoIDP: initiate_auth() now returns th email in the ID-token claims
* DynamoDB: query() now sorts the results correctly when querying GSI data with identical hash keys
* EC2: describe_security_group_rules() now enumera