AWS Database Migration Service (DMS)
Protocol: AWS JSON 1.1
Signing name: dms
Floci emulates the replication subnet group, endpoint, replication instance and
replication task lifecycles, which is what aws_dms_replication_subnet_group,
aws_dms_endpoint, aws_dms_s3_endpoint, aws_dms_replication_instance and
aws_dms_replication_task need to plan, apply and destroy. Subnets are resolved against
the emulated EC2 service, so the VPC and Availability Zones a group reports are the ones
those subnets actually have. No data is migrated: the resources are control-plane state.
Supported Actions
| Action | Description |
|---|---|
CreateReplicationSubnetGroup |
Creates a replication subnet group from existing EC2 subnets. |
DescribeReplicationSubnetGroups |
Lists replication subnet groups, optionally filtered by identifier. |
DeleteReplicationSubnetGroup |
Deletes the specified replication subnet group. |
ListTagsForResource |
Lists the tags on one or more DMS resource ARNs. |
AddTagsToResource |
Merges tags into the resource, overwriting by key. |
RemoveTagsFromResource |
Removes the named tag keys from the resource. |
CreateEndpoint |
Creates a source or target endpoint; secret members are accepted and never returned. |
DescribeEndpoints |
Lists endpoints, filtered by endpoint-arn, endpoint-type, endpoint-id or engine-name. |
ModifyEndpoint |
Updates an endpoint; settings structures merge unless ExactSettings is true. |
DeleteEndpoint |
Deletes an endpoint that no replication task uses. |
CreateReplicationInstance |
Creates a replication instance, available immediately. |
DescribeReplicationInstances |
Lists replication instances, filtered by replication-instance-arn, replication-instance-id, replication-instance-class or engine-version. |
ModifyReplicationInstance |
Updates a replication instance, applied immediately. |
DeleteReplicationInstance |
Deletes a replication instance that no replication task uses. |
CreateReplicationTask |
Creates a replication task between two existing endpoints on an existing instance, ready immediately. |
DescribeReplicationTasks |
Lists replication tasks, filtered by replication-task-arn, replication-task-id, migration-type, endpoint-arn or replication-instance-arn. |
ModifyReplicationTask |
Updates a replication task that is not running. |
DeleteReplicationTask |
Deletes a replication task that is not running. |
StartReplicationTask |
Moves a task to running. |
StopReplicationTask |
Moves a running task to stopped. |
Behaviour
- The identifier is stored as a lowercase string, as AWS does, so a group created as
MyGroupis described and deleted asmygroup. ReplicationSubnetGroupIdentifiermust not bedefaultand is limited to 255 alphanumeric characters, periods, underscores, or hyphens.- A group must cover at least two Availability Zones. Fewer returns
ReplicationSubnetGroupDoesNotCoverEnoughAZs, as AWS does. - Subnets must exist and must all belong to one VPC. Otherwise
InvalidSubnet. SubnetGroupStatusis immediatelyComplete, every subnet reportsActive,SupportedNetworkTypesis["IPV4"], andIsReadOnlyis alwaysfalse: a read-only group is one DMS manages for a zero-ETL integration, which Floci does not emulate.- The
defaultgroup is synthesised from the region's default-VPC subnets, and only exists onceCreateReplicationInstancehas put an instance in it (an instance created withoutReplicationSubnetGroupIdentifier, or namingdefaultexplicitly, which is accepted whenever the region has default subnets), as AWS creates it the first time it is needed. Until then it is neither listed nor found by the filter. Unlike AWS, it disappears again once no instance in the region uses it. DescribeReplicationSubnetGroupssupports thereplication-subnet-group-idfilter. A filter naming a group that does not exist returnsResourceNotFoundFault, which is how Terraform detects a group deleted outside its state.DescribeReplicationSubnetGroupspaginates onMaxRecordsandMarker.MaxRecordsdefaults to 100 and must be between 20 and 100; a value outside that range is rejected withInvalidParameterValueExceptionrather than clamped, as AWS does. Results are ordered by identifier andMarkeris an opaque cursor that resumes after the last item of the page, so a page stays resumable across groups created or deleted between requests.Markeris returned only when a further page exists, never on the last one.ReplicationSubnetGroupDescriptionis required, must not be blank, and must contain only printable characters. A control character such as0x01returnsInvalidParameterValueException.- A member of the wrong JSON type returns
SerializationException, as AWS does, rather than being coerced. That covers aTagsentry whoseValueis an object, a filter whoseValuesis not a list, a non-string element inResourceArnList,SubnetIdsorTagKeys, and a non-string identifier. An absent member is still a parameter error, not a serialization one. - Groups are scoped per account and Region and persist through
StorageFactory.
Endpoints, replication instances and replication tasks
- Each resource gets an ARN of the form
arn:aws:dms:<region>:<account>:<type>:<id>, where<type>isendpoint,reportaskand<id>is 26 characters of the base32 alphabet, or the request'sResourceIdentifierwhen one is given. Update and delete calls address the resource by that ARN. - Identifiers must begin with a letter, contain only ASCII letters, digits and hyphens,
and not end with a hyphen or contain two consecutive hyphens (63 characters for an
instance, 255 otherwise). A replication instance identifier is stored lowercase, as AWS
documents; endpoint and task identifiers keep their case. A duplicate identifier returns
ResourceAlreadyExistsFault. - A describe whose
Filtersmatch nothing returnsResourceNotFoundFault, which the Terraform provider reads as "gone". Without filters, no resources is an empty list. Filter values compare case-insensitively. Describes paginate onMaxRecordsandMarkeras subnet groups do. - Endpoints are
activefrom creation.EndpointTypeis accepted lowercase and returned uppercase (SOURCE,TARGET), as AWS does.SslModedefaults tonone. Engine settings structures (MySQLSettings,S3Settingsand the rest) are stored as sent and returned as stored, except that every member the DMS model types as a secret (Password,SaslPassword,AuthPasswordand so on) is dropped, because DMS never returns them.ModifyEndpointmerges a settings structure into the stored one member by member, or replaces it whenExactSettingsis true. - Replication instances are
availablefrom creation and stay so through a modify. A namedReplicationSubnetGroupIdentifiermust exist (otherwiseResourceNotFoundFault) and is returned as the fullReplicationSubnetGroupstructure; without one the instance reports thedefaultgroup. Defaults:AllocatedStorage50,EngineVersion3.5.4,PubliclyAccessibletrue,MultiAZfalse,AutoMinorVersionUpgradetrue,NetworkTypeIPV4,AvailabilityZone<region>a.ModifyReplicationInstanceapplies every change at once whateverApplyImmediatelysays. - Replication tasks need existing source and target endpoints and an existing instance
(otherwise
ResourceNotFoundFault).TableMappingsandReplicationTaskSettingsmust be JSON objects and are returned exactly as sent. A task isreadyfrom creation;StartReplicationTaskmakes itrunningandStopReplicationTaskmakes itstopped. Stopping a task that is not running returnsInvalidResourceStateFaultwith "is currently not running", the message the Terraform provider treats as already stopped. Modifying or deleting a running task returnsInvalidResourceStateFault. - Deleting an endpoint or instance that a task references, or a subnet group that an
instance uses, returns
InvalidResourceStateFault. A delete returns the resource with statusdeleting, and it is gone from the next describe.
Tagging
Tags on every create are stored with the resource, and the tagging trio works against
the resource's ARN. For a subnet group that is
arn:aws:dms:<region>:<account>:subgrp:<identifier>; DMS does not return that ARN from
DescribeReplicationSubnetGroups, so Terraform builds it client side and Floci parses it
back the same way. Endpoints, instances and tasks are tagged through the ARN their create
returned.
AddTagsToResourcemerges by key, so re-tagging an existing key overwrites its value.RemoveTagsFromResourceremoves the named keys and ignores keys that are not present.ListTagsForResourceaccepts eitherResourceArnorResourceArnList. Each returned tag carries itsResourceArnonly for theResourceArnListform, which is the form AWS documents it on.- Tag keys are 1 to 128 characters, values at most 256, and neither may start with
aws:ordms:. - An ARN that is unparseable, names a different DMS resource type, names another account
or Region, or names a group that does not exist returns
ResourceNotFoundFault. Tagging is not a cross-account or cross-Region operation on AWS and is not one here either. - Deleting a resource deletes its tags with it.
Limitations
- No migration runs. A started task stays
runninguntil stopped; a full-load task never finishes on its own, andReplicationTaskStats,StopReasonandLastFailureMessageare not reported. - Values AWS fills in are not invented. An endpoint does not report
EngineDisplayName,ExternalIdor the settings structure AWS derives from top-level connection fields, and a task withoutReplicationTaskSettingsreports none rather than the AWS defaults. Instances report no private or public IP addresses. CdcStartTimeis ignored.CreateReplicationTask,ModifyReplicationTaskandStartReplicationTaskaccept it, but it is not stored or returned.CdcStartPositionandCdcStopPositionare stored by create and modify, and ignored byStartReplicationTask.- Not implemented:
TestConnection,DescribeConnections,MoveReplicationTask,DescribeEndpointTypes,DescribeOrderableReplicationInstances, replication configs (aws_dms_replication_config, serverless DMS), event subscriptions, certificates and theWithoutSettingsflag ofDescribeReplicationTasks. - No
ModifyReplicationSubnetGroup. A subnet change has to be a delete and recreate.
See the AWS DMS API Reference.
Configuration
| Variable | Default | Description |
|---|---|---|
FLOCI_SERVICES_DMS_ENABLED |
true |
Enable or disable DMS |