diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon MemoryDB SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2021-01-01@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-memorydb)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Amazonka.MemoryDb](http://hackage.haskell.org/package/amazonka-memorydb/docs/Amazonka-MemoryDb.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-memorydb` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/amazonka-memorydb.cabal b/amazonka-memorydb.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-memorydb.cabal
@@ -0,0 +1,165 @@
+cabal-version:      2.2
+name:               amazonka-memorydb
+version:            2.0
+synopsis:           Amazon MemoryDB SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2021-01-01@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.MemoryDb.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.MemoryDb" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
+
+source-repository head
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-memorydb
+
+library
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
+
+  exposed-modules:
+    Amazonka.MemoryDb
+    Amazonka.MemoryDb.BatchUpdateCluster
+    Amazonka.MemoryDb.CopySnapshot
+    Amazonka.MemoryDb.CreateACL
+    Amazonka.MemoryDb.CreateCluster
+    Amazonka.MemoryDb.CreateParameterGroup
+    Amazonka.MemoryDb.CreateSnapshot
+    Amazonka.MemoryDb.CreateSubnetGroup
+    Amazonka.MemoryDb.CreateUser
+    Amazonka.MemoryDb.DeleteACL
+    Amazonka.MemoryDb.DeleteCluster
+    Amazonka.MemoryDb.DeleteParameterGroup
+    Amazonka.MemoryDb.DeleteSnapshot
+    Amazonka.MemoryDb.DeleteSubnetGroup
+    Amazonka.MemoryDb.DeleteUser
+    Amazonka.MemoryDb.DescribeACLs
+    Amazonka.MemoryDb.DescribeClusters
+    Amazonka.MemoryDb.DescribeEngineVersions
+    Amazonka.MemoryDb.DescribeEvents
+    Amazonka.MemoryDb.DescribeParameterGroups
+    Amazonka.MemoryDb.DescribeParameters
+    Amazonka.MemoryDb.DescribeReservedNodes
+    Amazonka.MemoryDb.DescribeReservedNodesOfferings
+    Amazonka.MemoryDb.DescribeServiceUpdates
+    Amazonka.MemoryDb.DescribeSnapshots
+    Amazonka.MemoryDb.DescribeSubnetGroups
+    Amazonka.MemoryDb.DescribeUsers
+    Amazonka.MemoryDb.FailoverShard
+    Amazonka.MemoryDb.Lens
+    Amazonka.MemoryDb.ListAllowedNodeTypeUpdates
+    Amazonka.MemoryDb.ListTags
+    Amazonka.MemoryDb.PurchaseReservedNodesOffering
+    Amazonka.MemoryDb.ResetParameterGroup
+    Amazonka.MemoryDb.TagResource
+    Amazonka.MemoryDb.Types
+    Amazonka.MemoryDb.Types.ACL
+    Amazonka.MemoryDb.Types.ACLPendingChanges
+    Amazonka.MemoryDb.Types.ACLsUpdateStatus
+    Amazonka.MemoryDb.Types.Authentication
+    Amazonka.MemoryDb.Types.AuthenticationMode
+    Amazonka.MemoryDb.Types.AuthenticationType
+    Amazonka.MemoryDb.Types.AvailabilityZone
+    Amazonka.MemoryDb.Types.AZStatus
+    Amazonka.MemoryDb.Types.Cluster
+    Amazonka.MemoryDb.Types.ClusterConfiguration
+    Amazonka.MemoryDb.Types.ClusterPendingUpdates
+    Amazonka.MemoryDb.Types.DataTieringStatus
+    Amazonka.MemoryDb.Types.Endpoint
+    Amazonka.MemoryDb.Types.EngineVersionInfo
+    Amazonka.MemoryDb.Types.Event
+    Amazonka.MemoryDb.Types.Filter
+    Amazonka.MemoryDb.Types.InputAuthenticationType
+    Amazonka.MemoryDb.Types.Node
+    Amazonka.MemoryDb.Types.Parameter
+    Amazonka.MemoryDb.Types.ParameterGroup
+    Amazonka.MemoryDb.Types.ParameterNameValue
+    Amazonka.MemoryDb.Types.PendingModifiedServiceUpdate
+    Amazonka.MemoryDb.Types.RecurringCharge
+    Amazonka.MemoryDb.Types.ReplicaConfigurationRequest
+    Amazonka.MemoryDb.Types.ReservedNode
+    Amazonka.MemoryDb.Types.ReservedNodesOffering
+    Amazonka.MemoryDb.Types.ReshardingStatus
+    Amazonka.MemoryDb.Types.SecurityGroupMembership
+    Amazonka.MemoryDb.Types.ServiceUpdate
+    Amazonka.MemoryDb.Types.ServiceUpdateRequest
+    Amazonka.MemoryDb.Types.ServiceUpdateStatus
+    Amazonka.MemoryDb.Types.ServiceUpdateType
+    Amazonka.MemoryDb.Types.Shard
+    Amazonka.MemoryDb.Types.ShardConfiguration
+    Amazonka.MemoryDb.Types.ShardConfigurationRequest
+    Amazonka.MemoryDb.Types.ShardDetail
+    Amazonka.MemoryDb.Types.SlotMigration
+    Amazonka.MemoryDb.Types.Snapshot
+    Amazonka.MemoryDb.Types.SourceType
+    Amazonka.MemoryDb.Types.Subnet
+    Amazonka.MemoryDb.Types.SubnetGroup
+    Amazonka.MemoryDb.Types.Tag
+    Amazonka.MemoryDb.Types.UnprocessedCluster
+    Amazonka.MemoryDb.Types.User
+    Amazonka.MemoryDb.UntagResource
+    Amazonka.MemoryDb.UpdateACL
+    Amazonka.MemoryDb.UpdateCluster
+    Amazonka.MemoryDb.UpdateParameterGroup
+    Amazonka.MemoryDb.UpdateSubnetGroup
+    Amazonka.MemoryDb.UpdateUser
+    Amazonka.MemoryDb.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-memorydb-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.MemoryDb
+    Test.Amazonka.MemoryDb
+    Test.Amazonka.MemoryDb.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-memorydb
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/BatchUpdateCluster.yaml b/fixture/BatchUpdateCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchUpdateCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/BatchUpdateClusterResponse.proto b/fixture/BatchUpdateClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchUpdateClusterResponse.proto
diff --git a/fixture/CopySnapshot.yaml b/fixture/CopySnapshot.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CopySnapshot.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CopySnapshotResponse.proto b/fixture/CopySnapshotResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CopySnapshotResponse.proto
diff --git a/fixture/CreateACL.yaml b/fixture/CreateACL.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateACL.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateACLResponse.proto b/fixture/CreateACLResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateACLResponse.proto
diff --git a/fixture/CreateCluster.yaml b/fixture/CreateCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateClusterResponse.proto b/fixture/CreateClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateClusterResponse.proto
diff --git a/fixture/CreateParameterGroup.yaml b/fixture/CreateParameterGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateParameterGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateParameterGroupResponse.proto b/fixture/CreateParameterGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateParameterGroupResponse.proto
diff --git a/fixture/CreateSnapshot.yaml b/fixture/CreateSnapshot.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSnapshot.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateSnapshotResponse.proto b/fixture/CreateSnapshotResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSnapshotResponse.proto
diff --git a/fixture/CreateSubnetGroup.yaml b/fixture/CreateSubnetGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSubnetGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateSubnetGroupResponse.proto b/fixture/CreateSubnetGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSubnetGroupResponse.proto
diff --git a/fixture/CreateUser.yaml b/fixture/CreateUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateUserResponse.proto b/fixture/CreateUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateUserResponse.proto
diff --git a/fixture/DeleteACL.yaml b/fixture/DeleteACL.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteACL.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteACLResponse.proto b/fixture/DeleteACLResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteACLResponse.proto
diff --git a/fixture/DeleteCluster.yaml b/fixture/DeleteCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteClusterResponse.proto b/fixture/DeleteClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteClusterResponse.proto
diff --git a/fixture/DeleteParameterGroup.yaml b/fixture/DeleteParameterGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteParameterGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteParameterGroupResponse.proto b/fixture/DeleteParameterGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteParameterGroupResponse.proto
diff --git a/fixture/DeleteSnapshot.yaml b/fixture/DeleteSnapshot.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSnapshot.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteSnapshotResponse.proto b/fixture/DeleteSnapshotResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSnapshotResponse.proto
diff --git a/fixture/DeleteSubnetGroup.yaml b/fixture/DeleteSubnetGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSubnetGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteSubnetGroupResponse.proto b/fixture/DeleteSubnetGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSubnetGroupResponse.proto
diff --git a/fixture/DeleteUser.yaml b/fixture/DeleteUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteUserResponse.proto b/fixture/DeleteUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteUserResponse.proto
diff --git a/fixture/DescribeACLs.yaml b/fixture/DescribeACLs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeACLs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeACLsResponse.proto b/fixture/DescribeACLsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeACLsResponse.proto
diff --git a/fixture/DescribeClusters.yaml b/fixture/DescribeClusters.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeClusters.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeClustersResponse.proto b/fixture/DescribeClustersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeClustersResponse.proto
diff --git a/fixture/DescribeEngineVersions.yaml b/fixture/DescribeEngineVersions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEngineVersions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeEngineVersionsResponse.proto b/fixture/DescribeEngineVersionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEngineVersionsResponse.proto
diff --git a/fixture/DescribeEvents.yaml b/fixture/DescribeEvents.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEvents.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeEventsResponse.proto b/fixture/DescribeEventsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEventsResponse.proto
diff --git a/fixture/DescribeParameterGroups.yaml b/fixture/DescribeParameterGroups.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeParameterGroups.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeParameterGroupsResponse.proto b/fixture/DescribeParameterGroupsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeParameterGroupsResponse.proto
diff --git a/fixture/DescribeParameters.yaml b/fixture/DescribeParameters.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeParameters.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeParametersResponse.proto b/fixture/DescribeParametersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeParametersResponse.proto
diff --git a/fixture/DescribeReservedNodes.yaml b/fixture/DescribeReservedNodes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeReservedNodes.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeReservedNodesOfferings.yaml b/fixture/DescribeReservedNodesOfferings.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeReservedNodesOfferings.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeReservedNodesOfferingsResponse.proto b/fixture/DescribeReservedNodesOfferingsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeReservedNodesOfferingsResponse.proto
diff --git a/fixture/DescribeReservedNodesResponse.proto b/fixture/DescribeReservedNodesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeReservedNodesResponse.proto
diff --git a/fixture/DescribeServiceUpdates.yaml b/fixture/DescribeServiceUpdates.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeServiceUpdates.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeServiceUpdatesResponse.proto b/fixture/DescribeServiceUpdatesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeServiceUpdatesResponse.proto
diff --git a/fixture/DescribeSnapshots.yaml b/fixture/DescribeSnapshots.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSnapshots.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeSnapshotsResponse.proto b/fixture/DescribeSnapshotsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSnapshotsResponse.proto
diff --git a/fixture/DescribeSubnetGroups.yaml b/fixture/DescribeSubnetGroups.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSubnetGroups.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeSubnetGroupsResponse.proto b/fixture/DescribeSubnetGroupsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSubnetGroupsResponse.proto
diff --git a/fixture/DescribeUsers.yaml b/fixture/DescribeUsers.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeUsers.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeUsersResponse.proto b/fixture/DescribeUsersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeUsersResponse.proto
diff --git a/fixture/FailoverShard.yaml b/fixture/FailoverShard.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/FailoverShard.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/FailoverShardResponse.proto b/fixture/FailoverShardResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/FailoverShardResponse.proto
diff --git a/fixture/ListAllowedNodeTypeUpdates.yaml b/fixture/ListAllowedNodeTypeUpdates.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAllowedNodeTypeUpdates.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAllowedNodeTypeUpdatesResponse.proto b/fixture/ListAllowedNodeTypeUpdatesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAllowedNodeTypeUpdatesResponse.proto
diff --git a/fixture/ListTags.yaml b/fixture/ListTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTags.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsResponse.proto b/fixture/ListTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsResponse.proto
diff --git a/fixture/PurchaseReservedNodesOffering.yaml b/fixture/PurchaseReservedNodesOffering.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PurchaseReservedNodesOffering.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PurchaseReservedNodesOfferingResponse.proto b/fixture/PurchaseReservedNodesOfferingResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PurchaseReservedNodesOfferingResponse.proto
diff --git a/fixture/ResetParameterGroup.yaml b/fixture/ResetParameterGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ResetParameterGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ResetParameterGroupResponse.proto b/fixture/ResetParameterGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ResetParameterGroupResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateACL.yaml b/fixture/UpdateACL.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateACL.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateACLResponse.proto b/fixture/UpdateACLResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateACLResponse.proto
diff --git a/fixture/UpdateCluster.yaml b/fixture/UpdateCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateClusterResponse.proto b/fixture/UpdateClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateClusterResponse.proto
diff --git a/fixture/UpdateParameterGroup.yaml b/fixture/UpdateParameterGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateParameterGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateParameterGroupResponse.proto b/fixture/UpdateParameterGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateParameterGroupResponse.proto
diff --git a/fixture/UpdateSubnetGroup.yaml b/fixture/UpdateSubnetGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSubnetGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateSubnetGroupResponse.proto b/fixture/UpdateSubnetGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSubnetGroupResponse.proto
diff --git a/fixture/UpdateUser.yaml b/fixture/UpdateUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/memory-db/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  memory-db.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateUserResponse.proto b/fixture/UpdateUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateUserResponse.proto
diff --git a/gen/Amazonka/MemoryDb.hs b/gen/Amazonka/MemoryDb.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb.hs
@@ -0,0 +1,661 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.MemoryDb
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2021-01-01@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- MemoryDB for Redis is a fully managed, Redis-compatible, in-memory
+-- database that delivers ultra-fast performance and Multi-AZ durability
+-- for modern applications built using microservices architectures.
+-- MemoryDB stores the entire database in-memory, enabling low latency and
+-- high throughput data access. It is compatible with Redis, a popular open
+-- source data store, enabling you to leverage Redis’ flexible and friendly
+-- data structures, APIs, and commands.
+module Amazonka.MemoryDb
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** ACLAlreadyExistsFault
+    _ACLAlreadyExistsFault,
+
+    -- ** ACLNotFoundFault
+    _ACLNotFoundFault,
+
+    -- ** ACLQuotaExceededFault
+    _ACLQuotaExceededFault,
+
+    -- ** APICallRateForCustomerExceededFault
+    _APICallRateForCustomerExceededFault,
+
+    -- ** ClusterAlreadyExistsFault
+    _ClusterAlreadyExistsFault,
+
+    -- ** ClusterNotFoundFault
+    _ClusterNotFoundFault,
+
+    -- ** ClusterQuotaForCustomerExceededFault
+    _ClusterQuotaForCustomerExceededFault,
+
+    -- ** DefaultUserRequired
+    _DefaultUserRequired,
+
+    -- ** DuplicateUserNameFault
+    _DuplicateUserNameFault,
+
+    -- ** InsufficientClusterCapacityFault
+    _InsufficientClusterCapacityFault,
+
+    -- ** InvalidACLStateFault
+    _InvalidACLStateFault,
+
+    -- ** InvalidARNFault
+    _InvalidARNFault,
+
+    -- ** InvalidClusterStateFault
+    _InvalidClusterStateFault,
+
+    -- ** InvalidCredentialsException
+    _InvalidCredentialsException,
+
+    -- ** InvalidKMSKeyFault
+    _InvalidKMSKeyFault,
+
+    -- ** InvalidNodeStateFault
+    _InvalidNodeStateFault,
+
+    -- ** InvalidParameterCombinationException
+    _InvalidParameterCombinationException,
+
+    -- ** InvalidParameterGroupStateFault
+    _InvalidParameterGroupStateFault,
+
+    -- ** InvalidParameterValueException
+    _InvalidParameterValueException,
+
+    -- ** InvalidSnapshotStateFault
+    _InvalidSnapshotStateFault,
+
+    -- ** InvalidSubnet
+    _InvalidSubnet,
+
+    -- ** InvalidUserStateFault
+    _InvalidUserStateFault,
+
+    -- ** InvalidVPCNetworkStateFault
+    _InvalidVPCNetworkStateFault,
+
+    -- ** NoOperationFault
+    _NoOperationFault,
+
+    -- ** NodeQuotaForClusterExceededFault
+    _NodeQuotaForClusterExceededFault,
+
+    -- ** NodeQuotaForCustomerExceededFault
+    _NodeQuotaForCustomerExceededFault,
+
+    -- ** ParameterGroupAlreadyExistsFault
+    _ParameterGroupAlreadyExistsFault,
+
+    -- ** ParameterGroupNotFoundFault
+    _ParameterGroupNotFoundFault,
+
+    -- ** ParameterGroupQuotaExceededFault
+    _ParameterGroupQuotaExceededFault,
+
+    -- ** ReservedNodeAlreadyExistsFault
+    _ReservedNodeAlreadyExistsFault,
+
+    -- ** ReservedNodeNotFoundFault
+    _ReservedNodeNotFoundFault,
+
+    -- ** ReservedNodeQuotaExceededFault
+    _ReservedNodeQuotaExceededFault,
+
+    -- ** ReservedNodesOfferingNotFoundFault
+    _ReservedNodesOfferingNotFoundFault,
+
+    -- ** ServiceLinkedRoleNotFoundFault
+    _ServiceLinkedRoleNotFoundFault,
+
+    -- ** ServiceUpdateNotFoundFault
+    _ServiceUpdateNotFoundFault,
+
+    -- ** ShardNotFoundFault
+    _ShardNotFoundFault,
+
+    -- ** ShardsPerClusterQuotaExceededFault
+    _ShardsPerClusterQuotaExceededFault,
+
+    -- ** SnapshotAlreadyExistsFault
+    _SnapshotAlreadyExistsFault,
+
+    -- ** SnapshotNotFoundFault
+    _SnapshotNotFoundFault,
+
+    -- ** SnapshotQuotaExceededFault
+    _SnapshotQuotaExceededFault,
+
+    -- ** SubnetGroupAlreadyExistsFault
+    _SubnetGroupAlreadyExistsFault,
+
+    -- ** SubnetGroupInUseFault
+    _SubnetGroupInUseFault,
+
+    -- ** SubnetGroupNotFoundFault
+    _SubnetGroupNotFoundFault,
+
+    -- ** SubnetGroupQuotaExceededFault
+    _SubnetGroupQuotaExceededFault,
+
+    -- ** SubnetInUse
+    _SubnetInUse,
+
+    -- ** SubnetNotAllowedFault
+    _SubnetNotAllowedFault,
+
+    -- ** SubnetQuotaExceededFault
+    _SubnetQuotaExceededFault,
+
+    -- ** TagNotFoundFault
+    _TagNotFoundFault,
+
+    -- ** TagQuotaPerResourceExceeded
+    _TagQuotaPerResourceExceeded,
+
+    -- ** TestFailoverNotAvailableFault
+    _TestFailoverNotAvailableFault,
+
+    -- ** UserAlreadyExistsFault
+    _UserAlreadyExistsFault,
+
+    -- ** UserNotFoundFault
+    _UserNotFoundFault,
+
+    -- ** UserQuotaExceededFault
+    _UserQuotaExceededFault,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** BatchUpdateCluster
+    BatchUpdateCluster (BatchUpdateCluster'),
+    newBatchUpdateCluster,
+    BatchUpdateClusterResponse (BatchUpdateClusterResponse'),
+    newBatchUpdateClusterResponse,
+
+    -- ** CopySnapshot
+    CopySnapshot (CopySnapshot'),
+    newCopySnapshot,
+    CopySnapshotResponse (CopySnapshotResponse'),
+    newCopySnapshotResponse,
+
+    -- ** CreateACL
+    CreateACL (CreateACL'),
+    newCreateACL,
+    CreateACLResponse (CreateACLResponse'),
+    newCreateACLResponse,
+
+    -- ** CreateCluster
+    CreateCluster (CreateCluster'),
+    newCreateCluster,
+    CreateClusterResponse (CreateClusterResponse'),
+    newCreateClusterResponse,
+
+    -- ** CreateParameterGroup
+    CreateParameterGroup (CreateParameterGroup'),
+    newCreateParameterGroup,
+    CreateParameterGroupResponse (CreateParameterGroupResponse'),
+    newCreateParameterGroupResponse,
+
+    -- ** CreateSnapshot
+    CreateSnapshot (CreateSnapshot'),
+    newCreateSnapshot,
+    CreateSnapshotResponse (CreateSnapshotResponse'),
+    newCreateSnapshotResponse,
+
+    -- ** CreateSubnetGroup
+    CreateSubnetGroup (CreateSubnetGroup'),
+    newCreateSubnetGroup,
+    CreateSubnetGroupResponse (CreateSubnetGroupResponse'),
+    newCreateSubnetGroupResponse,
+
+    -- ** CreateUser
+    CreateUser (CreateUser'),
+    newCreateUser,
+    CreateUserResponse (CreateUserResponse'),
+    newCreateUserResponse,
+
+    -- ** DeleteACL
+    DeleteACL (DeleteACL'),
+    newDeleteACL,
+    DeleteACLResponse (DeleteACLResponse'),
+    newDeleteACLResponse,
+
+    -- ** DeleteCluster
+    DeleteCluster (DeleteCluster'),
+    newDeleteCluster,
+    DeleteClusterResponse (DeleteClusterResponse'),
+    newDeleteClusterResponse,
+
+    -- ** DeleteParameterGroup
+    DeleteParameterGroup (DeleteParameterGroup'),
+    newDeleteParameterGroup,
+    DeleteParameterGroupResponse (DeleteParameterGroupResponse'),
+    newDeleteParameterGroupResponse,
+
+    -- ** DeleteSnapshot
+    DeleteSnapshot (DeleteSnapshot'),
+    newDeleteSnapshot,
+    DeleteSnapshotResponse (DeleteSnapshotResponse'),
+    newDeleteSnapshotResponse,
+
+    -- ** DeleteSubnetGroup
+    DeleteSubnetGroup (DeleteSubnetGroup'),
+    newDeleteSubnetGroup,
+    DeleteSubnetGroupResponse (DeleteSubnetGroupResponse'),
+    newDeleteSubnetGroupResponse,
+
+    -- ** DeleteUser
+    DeleteUser (DeleteUser'),
+    newDeleteUser,
+    DeleteUserResponse (DeleteUserResponse'),
+    newDeleteUserResponse,
+
+    -- ** DescribeACLs (Paginated)
+    DescribeACLs (DescribeACLs'),
+    newDescribeACLs,
+    DescribeACLsResponse (DescribeACLsResponse'),
+    newDescribeACLsResponse,
+
+    -- ** DescribeClusters (Paginated)
+    DescribeClusters (DescribeClusters'),
+    newDescribeClusters,
+    DescribeClustersResponse (DescribeClustersResponse'),
+    newDescribeClustersResponse,
+
+    -- ** DescribeEngineVersions (Paginated)
+    DescribeEngineVersions (DescribeEngineVersions'),
+    newDescribeEngineVersions,
+    DescribeEngineVersionsResponse (DescribeEngineVersionsResponse'),
+    newDescribeEngineVersionsResponse,
+
+    -- ** DescribeEvents (Paginated)
+    DescribeEvents (DescribeEvents'),
+    newDescribeEvents,
+    DescribeEventsResponse (DescribeEventsResponse'),
+    newDescribeEventsResponse,
+
+    -- ** DescribeParameterGroups (Paginated)
+    DescribeParameterGroups (DescribeParameterGroups'),
+    newDescribeParameterGroups,
+    DescribeParameterGroupsResponse (DescribeParameterGroupsResponse'),
+    newDescribeParameterGroupsResponse,
+
+    -- ** DescribeParameters (Paginated)
+    DescribeParameters (DescribeParameters'),
+    newDescribeParameters,
+    DescribeParametersResponse (DescribeParametersResponse'),
+    newDescribeParametersResponse,
+
+    -- ** DescribeReservedNodes (Paginated)
+    DescribeReservedNodes (DescribeReservedNodes'),
+    newDescribeReservedNodes,
+    DescribeReservedNodesResponse (DescribeReservedNodesResponse'),
+    newDescribeReservedNodesResponse,
+
+    -- ** DescribeReservedNodesOfferings (Paginated)
+    DescribeReservedNodesOfferings (DescribeReservedNodesOfferings'),
+    newDescribeReservedNodesOfferings,
+    DescribeReservedNodesOfferingsResponse (DescribeReservedNodesOfferingsResponse'),
+    newDescribeReservedNodesOfferingsResponse,
+
+    -- ** DescribeServiceUpdates (Paginated)
+    DescribeServiceUpdates (DescribeServiceUpdates'),
+    newDescribeServiceUpdates,
+    DescribeServiceUpdatesResponse (DescribeServiceUpdatesResponse'),
+    newDescribeServiceUpdatesResponse,
+
+    -- ** DescribeSnapshots (Paginated)
+    DescribeSnapshots (DescribeSnapshots'),
+    newDescribeSnapshots,
+    DescribeSnapshotsResponse (DescribeSnapshotsResponse'),
+    newDescribeSnapshotsResponse,
+
+    -- ** DescribeSubnetGroups (Paginated)
+    DescribeSubnetGroups (DescribeSubnetGroups'),
+    newDescribeSubnetGroups,
+    DescribeSubnetGroupsResponse (DescribeSubnetGroupsResponse'),
+    newDescribeSubnetGroupsResponse,
+
+    -- ** DescribeUsers (Paginated)
+    DescribeUsers (DescribeUsers'),
+    newDescribeUsers,
+    DescribeUsersResponse (DescribeUsersResponse'),
+    newDescribeUsersResponse,
+
+    -- ** FailoverShard
+    FailoverShard (FailoverShard'),
+    newFailoverShard,
+    FailoverShardResponse (FailoverShardResponse'),
+    newFailoverShardResponse,
+
+    -- ** ListAllowedNodeTypeUpdates
+    ListAllowedNodeTypeUpdates (ListAllowedNodeTypeUpdates'),
+    newListAllowedNodeTypeUpdates,
+    ListAllowedNodeTypeUpdatesResponse (ListAllowedNodeTypeUpdatesResponse'),
+    newListAllowedNodeTypeUpdatesResponse,
+
+    -- ** ListTags
+    ListTags (ListTags'),
+    newListTags,
+    ListTagsResponse (ListTagsResponse'),
+    newListTagsResponse,
+
+    -- ** PurchaseReservedNodesOffering
+    PurchaseReservedNodesOffering (PurchaseReservedNodesOffering'),
+    newPurchaseReservedNodesOffering,
+    PurchaseReservedNodesOfferingResponse (PurchaseReservedNodesOfferingResponse'),
+    newPurchaseReservedNodesOfferingResponse,
+
+    -- ** ResetParameterGroup
+    ResetParameterGroup (ResetParameterGroup'),
+    newResetParameterGroup,
+    ResetParameterGroupResponse (ResetParameterGroupResponse'),
+    newResetParameterGroupResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateACL
+    UpdateACL (UpdateACL'),
+    newUpdateACL,
+    UpdateACLResponse (UpdateACLResponse'),
+    newUpdateACLResponse,
+
+    -- ** UpdateCluster
+    UpdateCluster (UpdateCluster'),
+    newUpdateCluster,
+    UpdateClusterResponse (UpdateClusterResponse'),
+    newUpdateClusterResponse,
+
+    -- ** UpdateParameterGroup
+    UpdateParameterGroup (UpdateParameterGroup'),
+    newUpdateParameterGroup,
+    UpdateParameterGroupResponse (UpdateParameterGroupResponse'),
+    newUpdateParameterGroupResponse,
+
+    -- ** UpdateSubnetGroup
+    UpdateSubnetGroup (UpdateSubnetGroup'),
+    newUpdateSubnetGroup,
+    UpdateSubnetGroupResponse (UpdateSubnetGroupResponse'),
+    newUpdateSubnetGroupResponse,
+
+    -- ** UpdateUser
+    UpdateUser (UpdateUser'),
+    newUpdateUser,
+    UpdateUserResponse (UpdateUserResponse'),
+    newUpdateUserResponse,
+
+    -- * Types
+
+    -- ** AZStatus
+    AZStatus (..),
+
+    -- ** AuthenticationType
+    AuthenticationType (..),
+
+    -- ** DataTieringStatus
+    DataTieringStatus (..),
+
+    -- ** InputAuthenticationType
+    InputAuthenticationType (..),
+
+    -- ** ServiceUpdateStatus
+    ServiceUpdateStatus (..),
+
+    -- ** ServiceUpdateType
+    ServiceUpdateType (..),
+
+    -- ** SourceType
+    SourceType (..),
+
+    -- ** ACL
+    ACL (ACL'),
+    newACL,
+
+    -- ** ACLPendingChanges
+    ACLPendingChanges (ACLPendingChanges'),
+    newACLPendingChanges,
+
+    -- ** ACLsUpdateStatus
+    ACLsUpdateStatus (ACLsUpdateStatus'),
+    newACLsUpdateStatus,
+
+    -- ** Authentication
+    Authentication (Authentication'),
+    newAuthentication,
+
+    -- ** AuthenticationMode
+    AuthenticationMode (AuthenticationMode'),
+    newAuthenticationMode,
+
+    -- ** AvailabilityZone
+    AvailabilityZone (AvailabilityZone'),
+    newAvailabilityZone,
+
+    -- ** Cluster
+    Cluster (Cluster'),
+    newCluster,
+
+    -- ** ClusterConfiguration
+    ClusterConfiguration (ClusterConfiguration'),
+    newClusterConfiguration,
+
+    -- ** ClusterPendingUpdates
+    ClusterPendingUpdates (ClusterPendingUpdates'),
+    newClusterPendingUpdates,
+
+    -- ** Endpoint
+    Endpoint (Endpoint'),
+    newEndpoint,
+
+    -- ** EngineVersionInfo
+    EngineVersionInfo (EngineVersionInfo'),
+    newEngineVersionInfo,
+
+    -- ** Event
+    Event (Event'),
+    newEvent,
+
+    -- ** Filter
+    Filter (Filter'),
+    newFilter,
+
+    -- ** Node
+    Node (Node'),
+    newNode,
+
+    -- ** Parameter
+    Parameter (Parameter'),
+    newParameter,
+
+    -- ** ParameterGroup
+    ParameterGroup (ParameterGroup'),
+    newParameterGroup,
+
+    -- ** ParameterNameValue
+    ParameterNameValue (ParameterNameValue'),
+    newParameterNameValue,
+
+    -- ** PendingModifiedServiceUpdate
+    PendingModifiedServiceUpdate (PendingModifiedServiceUpdate'),
+    newPendingModifiedServiceUpdate,
+
+    -- ** RecurringCharge
+    RecurringCharge (RecurringCharge'),
+    newRecurringCharge,
+
+    -- ** ReplicaConfigurationRequest
+    ReplicaConfigurationRequest (ReplicaConfigurationRequest'),
+    newReplicaConfigurationRequest,
+
+    -- ** ReservedNode
+    ReservedNode (ReservedNode'),
+    newReservedNode,
+
+    -- ** ReservedNodesOffering
+    ReservedNodesOffering (ReservedNodesOffering'),
+    newReservedNodesOffering,
+
+    -- ** ReshardingStatus
+    ReshardingStatus (ReshardingStatus'),
+    newReshardingStatus,
+
+    -- ** SecurityGroupMembership
+    SecurityGroupMembership (SecurityGroupMembership'),
+    newSecurityGroupMembership,
+
+    -- ** ServiceUpdate
+    ServiceUpdate (ServiceUpdate'),
+    newServiceUpdate,
+
+    -- ** ServiceUpdateRequest
+    ServiceUpdateRequest (ServiceUpdateRequest'),
+    newServiceUpdateRequest,
+
+    -- ** Shard
+    Shard (Shard'),
+    newShard,
+
+    -- ** ShardConfiguration
+    ShardConfiguration (ShardConfiguration'),
+    newShardConfiguration,
+
+    -- ** ShardConfigurationRequest
+    ShardConfigurationRequest (ShardConfigurationRequest'),
+    newShardConfigurationRequest,
+
+    -- ** ShardDetail
+    ShardDetail (ShardDetail'),
+    newShardDetail,
+
+    -- ** SlotMigration
+    SlotMigration (SlotMigration'),
+    newSlotMigration,
+
+    -- ** Snapshot
+    Snapshot (Snapshot'),
+    newSnapshot,
+
+    -- ** Subnet
+    Subnet (Subnet'),
+    newSubnet,
+
+    -- ** SubnetGroup
+    SubnetGroup (SubnetGroup'),
+    newSubnetGroup,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+
+    -- ** UnprocessedCluster
+    UnprocessedCluster (UnprocessedCluster'),
+    newUnprocessedCluster,
+
+    -- ** User
+    User (User'),
+    newUser,
+  )
+where
+
+import Amazonka.MemoryDb.BatchUpdateCluster
+import Amazonka.MemoryDb.CopySnapshot
+import Amazonka.MemoryDb.CreateACL
+import Amazonka.MemoryDb.CreateCluster
+import Amazonka.MemoryDb.CreateParameterGroup
+import Amazonka.MemoryDb.CreateSnapshot
+import Amazonka.MemoryDb.CreateSubnetGroup
+import Amazonka.MemoryDb.CreateUser
+import Amazonka.MemoryDb.DeleteACL
+import Amazonka.MemoryDb.DeleteCluster
+import Amazonka.MemoryDb.DeleteParameterGroup
+import Amazonka.MemoryDb.DeleteSnapshot
+import Amazonka.MemoryDb.DeleteSubnetGroup
+import Amazonka.MemoryDb.DeleteUser
+import Amazonka.MemoryDb.DescribeACLs
+import Amazonka.MemoryDb.DescribeClusters
+import Amazonka.MemoryDb.DescribeEngineVersions
+import Amazonka.MemoryDb.DescribeEvents
+import Amazonka.MemoryDb.DescribeParameterGroups
+import Amazonka.MemoryDb.DescribeParameters
+import Amazonka.MemoryDb.DescribeReservedNodes
+import Amazonka.MemoryDb.DescribeReservedNodesOfferings
+import Amazonka.MemoryDb.DescribeServiceUpdates
+import Amazonka.MemoryDb.DescribeSnapshots
+import Amazonka.MemoryDb.DescribeSubnetGroups
+import Amazonka.MemoryDb.DescribeUsers
+import Amazonka.MemoryDb.FailoverShard
+import Amazonka.MemoryDb.Lens
+import Amazonka.MemoryDb.ListAllowedNodeTypeUpdates
+import Amazonka.MemoryDb.ListTags
+import Amazonka.MemoryDb.PurchaseReservedNodesOffering
+import Amazonka.MemoryDb.ResetParameterGroup
+import Amazonka.MemoryDb.TagResource
+import Amazonka.MemoryDb.Types
+import Amazonka.MemoryDb.UntagResource
+import Amazonka.MemoryDb.UpdateACL
+import Amazonka.MemoryDb.UpdateCluster
+import Amazonka.MemoryDb.UpdateParameterGroup
+import Amazonka.MemoryDb.UpdateSubnetGroup
+import Amazonka.MemoryDb.UpdateUser
+import Amazonka.MemoryDb.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'MemoryDb'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/MemoryDb/BatchUpdateCluster.hs b/gen/Amazonka/MemoryDb/BatchUpdateCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/BatchUpdateCluster.hs
@@ -0,0 +1,205 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.BatchUpdateCluster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Apply the service update to a list of clusters supplied. For more
+-- information on service updates and applying them, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/managing-updates.html#applying-updates Applying the service updates>.
+module Amazonka.MemoryDb.BatchUpdateCluster
+  ( -- * Creating a Request
+    BatchUpdateCluster (..),
+    newBatchUpdateCluster,
+
+    -- * Request Lenses
+    batchUpdateCluster_serviceUpdate,
+    batchUpdateCluster_clusterNames,
+
+    -- * Destructuring the Response
+    BatchUpdateClusterResponse (..),
+    newBatchUpdateClusterResponse,
+
+    -- * Response Lenses
+    batchUpdateClusterResponse_processedClusters,
+    batchUpdateClusterResponse_unprocessedClusters,
+    batchUpdateClusterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchUpdateCluster' smart constructor.
+data BatchUpdateCluster = BatchUpdateCluster'
+  { -- | The unique ID of the service update
+    serviceUpdate :: Prelude.Maybe ServiceUpdateRequest,
+    -- | The cluster names to apply the updates.
+    clusterNames :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchUpdateCluster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'serviceUpdate', 'batchUpdateCluster_serviceUpdate' - The unique ID of the service update
+--
+-- 'clusterNames', 'batchUpdateCluster_clusterNames' - The cluster names to apply the updates.
+newBatchUpdateCluster ::
+  BatchUpdateCluster
+newBatchUpdateCluster =
+  BatchUpdateCluster'
+    { serviceUpdate =
+        Prelude.Nothing,
+      clusterNames = Prelude.mempty
+    }
+
+-- | The unique ID of the service update
+batchUpdateCluster_serviceUpdate :: Lens.Lens' BatchUpdateCluster (Prelude.Maybe ServiceUpdateRequest)
+batchUpdateCluster_serviceUpdate = Lens.lens (\BatchUpdateCluster' {serviceUpdate} -> serviceUpdate) (\s@BatchUpdateCluster' {} a -> s {serviceUpdate = a} :: BatchUpdateCluster)
+
+-- | The cluster names to apply the updates.
+batchUpdateCluster_clusterNames :: Lens.Lens' BatchUpdateCluster [Prelude.Text]
+batchUpdateCluster_clusterNames = Lens.lens (\BatchUpdateCluster' {clusterNames} -> clusterNames) (\s@BatchUpdateCluster' {} a -> s {clusterNames = a} :: BatchUpdateCluster) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchUpdateCluster where
+  type
+    AWSResponse BatchUpdateCluster =
+      BatchUpdateClusterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchUpdateClusterResponse'
+            Prelude.<$> ( x
+                            Data..?> "ProcessedClusters"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..?> "UnprocessedClusters"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchUpdateCluster where
+  hashWithSalt _salt BatchUpdateCluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` serviceUpdate
+      `Prelude.hashWithSalt` clusterNames
+
+instance Prelude.NFData BatchUpdateCluster where
+  rnf BatchUpdateCluster' {..} =
+    Prelude.rnf serviceUpdate
+      `Prelude.seq` Prelude.rnf clusterNames
+
+instance Data.ToHeaders BatchUpdateCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.BatchUpdateCluster" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchUpdateCluster where
+  toJSON BatchUpdateCluster' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ServiceUpdate" Data..=) Prelude.<$> serviceUpdate,
+            Prelude.Just ("ClusterNames" Data..= clusterNames)
+          ]
+      )
+
+instance Data.ToPath BatchUpdateCluster where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery BatchUpdateCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchUpdateClusterResponse' smart constructor.
+data BatchUpdateClusterResponse = BatchUpdateClusterResponse'
+  { -- | The list of clusters that have been updated.
+    processedClusters :: Prelude.Maybe [Cluster],
+    -- | The list of clusters where updates have not been applied.
+    unprocessedClusters :: Prelude.Maybe [UnprocessedCluster],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchUpdateClusterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'processedClusters', 'batchUpdateClusterResponse_processedClusters' - The list of clusters that have been updated.
+--
+-- 'unprocessedClusters', 'batchUpdateClusterResponse_unprocessedClusters' - The list of clusters where updates have not been applied.
+--
+-- 'httpStatus', 'batchUpdateClusterResponse_httpStatus' - The response's http status code.
+newBatchUpdateClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchUpdateClusterResponse
+newBatchUpdateClusterResponse pHttpStatus_ =
+  BatchUpdateClusterResponse'
+    { processedClusters =
+        Prelude.Nothing,
+      unprocessedClusters = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of clusters that have been updated.
+batchUpdateClusterResponse_processedClusters :: Lens.Lens' BatchUpdateClusterResponse (Prelude.Maybe [Cluster])
+batchUpdateClusterResponse_processedClusters = Lens.lens (\BatchUpdateClusterResponse' {processedClusters} -> processedClusters) (\s@BatchUpdateClusterResponse' {} a -> s {processedClusters = a} :: BatchUpdateClusterResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The list of clusters where updates have not been applied.
+batchUpdateClusterResponse_unprocessedClusters :: Lens.Lens' BatchUpdateClusterResponse (Prelude.Maybe [UnprocessedCluster])
+batchUpdateClusterResponse_unprocessedClusters = Lens.lens (\BatchUpdateClusterResponse' {unprocessedClusters} -> unprocessedClusters) (\s@BatchUpdateClusterResponse' {} a -> s {unprocessedClusters = a} :: BatchUpdateClusterResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchUpdateClusterResponse_httpStatus :: Lens.Lens' BatchUpdateClusterResponse Prelude.Int
+batchUpdateClusterResponse_httpStatus = Lens.lens (\BatchUpdateClusterResponse' {httpStatus} -> httpStatus) (\s@BatchUpdateClusterResponse' {} a -> s {httpStatus = a} :: BatchUpdateClusterResponse)
+
+instance Prelude.NFData BatchUpdateClusterResponse where
+  rnf BatchUpdateClusterResponse' {..} =
+    Prelude.rnf processedClusters
+      `Prelude.seq` Prelude.rnf unprocessedClusters
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/CopySnapshot.hs b/gen/Amazonka/MemoryDb/CopySnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/CopySnapshot.hs
@@ -0,0 +1,252 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.CopySnapshot
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Makes a copy of an existing snapshot.
+module Amazonka.MemoryDb.CopySnapshot
+  ( -- * Creating a Request
+    CopySnapshot (..),
+    newCopySnapshot,
+
+    -- * Request Lenses
+    copySnapshot_kmsKeyId,
+    copySnapshot_tags,
+    copySnapshot_targetBucket,
+    copySnapshot_sourceSnapshotName,
+    copySnapshot_targetSnapshotName,
+
+    -- * Destructuring the Response
+    CopySnapshotResponse (..),
+    newCopySnapshotResponse,
+
+    -- * Response Lenses
+    copySnapshotResponse_snapshot,
+    copySnapshotResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCopySnapshot' smart constructor.
+data CopySnapshot = CopySnapshot'
+  { -- | The ID of the KMS key used to encrypt the target snapshot.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | A list of tags to be added to this resource. A tag is a key-value pair.
+    -- A tag key must be accompanied by a tag value, although null is accepted.
+    tags :: Prelude.Maybe [Tag],
+    -- | The Amazon S3 bucket to which the snapshot is exported. This parameter
+    -- is used only when exporting a snapshot for external access. When using
+    -- this parameter to export a snapshot, be sure MemoryDB has the needed
+    -- permissions to this S3 bucket. For more information, see
+    -- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/snapshots-exporting.html Step 2: Grant MemoryDB Access to Your Amazon S3 Bucket>.
+    targetBucket :: Prelude.Maybe Prelude.Text,
+    -- | The name of an existing snapshot from which to make a copy.
+    sourceSnapshotName :: Prelude.Text,
+    -- | A name for the snapshot copy. MemoryDB does not permit overwriting a
+    -- snapshot, therefore this name must be unique within its context -
+    -- MemoryDB or an Amazon S3 bucket if exporting.
+    targetSnapshotName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CopySnapshot' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kmsKeyId', 'copySnapshot_kmsKeyId' - The ID of the KMS key used to encrypt the target snapshot.
+--
+-- 'tags', 'copySnapshot_tags' - A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+--
+-- 'targetBucket', 'copySnapshot_targetBucket' - The Amazon S3 bucket to which the snapshot is exported. This parameter
+-- is used only when exporting a snapshot for external access. When using
+-- this parameter to export a snapshot, be sure MemoryDB has the needed
+-- permissions to this S3 bucket. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/snapshots-exporting.html Step 2: Grant MemoryDB Access to Your Amazon S3 Bucket>.
+--
+-- 'sourceSnapshotName', 'copySnapshot_sourceSnapshotName' - The name of an existing snapshot from which to make a copy.
+--
+-- 'targetSnapshotName', 'copySnapshot_targetSnapshotName' - A name for the snapshot copy. MemoryDB does not permit overwriting a
+-- snapshot, therefore this name must be unique within its context -
+-- MemoryDB or an Amazon S3 bucket if exporting.
+newCopySnapshot ::
+  -- | 'sourceSnapshotName'
+  Prelude.Text ->
+  -- | 'targetSnapshotName'
+  Prelude.Text ->
+  CopySnapshot
+newCopySnapshot
+  pSourceSnapshotName_
+  pTargetSnapshotName_ =
+    CopySnapshot'
+      { kmsKeyId = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        targetBucket = Prelude.Nothing,
+        sourceSnapshotName = pSourceSnapshotName_,
+        targetSnapshotName = pTargetSnapshotName_
+      }
+
+-- | The ID of the KMS key used to encrypt the target snapshot.
+copySnapshot_kmsKeyId :: Lens.Lens' CopySnapshot (Prelude.Maybe Prelude.Text)
+copySnapshot_kmsKeyId = Lens.lens (\CopySnapshot' {kmsKeyId} -> kmsKeyId) (\s@CopySnapshot' {} a -> s {kmsKeyId = a} :: CopySnapshot)
+
+-- | A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+copySnapshot_tags :: Lens.Lens' CopySnapshot (Prelude.Maybe [Tag])
+copySnapshot_tags = Lens.lens (\CopySnapshot' {tags} -> tags) (\s@CopySnapshot' {} a -> s {tags = a} :: CopySnapshot) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon S3 bucket to which the snapshot is exported. This parameter
+-- is used only when exporting a snapshot for external access. When using
+-- this parameter to export a snapshot, be sure MemoryDB has the needed
+-- permissions to this S3 bucket. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/snapshots-exporting.html Step 2: Grant MemoryDB Access to Your Amazon S3 Bucket>.
+copySnapshot_targetBucket :: Lens.Lens' CopySnapshot (Prelude.Maybe Prelude.Text)
+copySnapshot_targetBucket = Lens.lens (\CopySnapshot' {targetBucket} -> targetBucket) (\s@CopySnapshot' {} a -> s {targetBucket = a} :: CopySnapshot)
+
+-- | The name of an existing snapshot from which to make a copy.
+copySnapshot_sourceSnapshotName :: Lens.Lens' CopySnapshot Prelude.Text
+copySnapshot_sourceSnapshotName = Lens.lens (\CopySnapshot' {sourceSnapshotName} -> sourceSnapshotName) (\s@CopySnapshot' {} a -> s {sourceSnapshotName = a} :: CopySnapshot)
+
+-- | A name for the snapshot copy. MemoryDB does not permit overwriting a
+-- snapshot, therefore this name must be unique within its context -
+-- MemoryDB or an Amazon S3 bucket if exporting.
+copySnapshot_targetSnapshotName :: Lens.Lens' CopySnapshot Prelude.Text
+copySnapshot_targetSnapshotName = Lens.lens (\CopySnapshot' {targetSnapshotName} -> targetSnapshotName) (\s@CopySnapshot' {} a -> s {targetSnapshotName = a} :: CopySnapshot)
+
+instance Core.AWSRequest CopySnapshot where
+  type AWSResponse CopySnapshot = CopySnapshotResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CopySnapshotResponse'
+            Prelude.<$> (x Data..?> "Snapshot")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CopySnapshot where
+  hashWithSalt _salt CopySnapshot' {..} =
+    _salt
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` targetBucket
+      `Prelude.hashWithSalt` sourceSnapshotName
+      `Prelude.hashWithSalt` targetSnapshotName
+
+instance Prelude.NFData CopySnapshot where
+  rnf CopySnapshot' {..} =
+    Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf targetBucket
+      `Prelude.seq` Prelude.rnf sourceSnapshotName
+      `Prelude.seq` Prelude.rnf targetSnapshotName
+
+instance Data.ToHeaders CopySnapshot where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.CopySnapshot" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CopySnapshot where
+  toJSON CopySnapshot' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("KmsKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("Tags" Data..=) Prelude.<$> tags,
+            ("TargetBucket" Data..=) Prelude.<$> targetBucket,
+            Prelude.Just
+              ("SourceSnapshotName" Data..= sourceSnapshotName),
+            Prelude.Just
+              ("TargetSnapshotName" Data..= targetSnapshotName)
+          ]
+      )
+
+instance Data.ToPath CopySnapshot where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CopySnapshot where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCopySnapshotResponse' smart constructor.
+data CopySnapshotResponse = CopySnapshotResponse'
+  { -- | Represents a copy of an entire cluster as of the time when the snapshot
+    -- was taken.
+    snapshot :: Prelude.Maybe Snapshot,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CopySnapshotResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'snapshot', 'copySnapshotResponse_snapshot' - Represents a copy of an entire cluster as of the time when the snapshot
+-- was taken.
+--
+-- 'httpStatus', 'copySnapshotResponse_httpStatus' - The response's http status code.
+newCopySnapshotResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CopySnapshotResponse
+newCopySnapshotResponse pHttpStatus_ =
+  CopySnapshotResponse'
+    { snapshot = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Represents a copy of an entire cluster as of the time when the snapshot
+-- was taken.
+copySnapshotResponse_snapshot :: Lens.Lens' CopySnapshotResponse (Prelude.Maybe Snapshot)
+copySnapshotResponse_snapshot = Lens.lens (\CopySnapshotResponse' {snapshot} -> snapshot) (\s@CopySnapshotResponse' {} a -> s {snapshot = a} :: CopySnapshotResponse)
+
+-- | The response's http status code.
+copySnapshotResponse_httpStatus :: Lens.Lens' CopySnapshotResponse Prelude.Int
+copySnapshotResponse_httpStatus = Lens.lens (\CopySnapshotResponse' {httpStatus} -> httpStatus) (\s@CopySnapshotResponse' {} a -> s {httpStatus = a} :: CopySnapshotResponse)
+
+instance Prelude.NFData CopySnapshotResponse where
+  rnf CopySnapshotResponse' {..} =
+    Prelude.rnf snapshot
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/CreateACL.hs b/gen/Amazonka/MemoryDb/CreateACL.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/CreateACL.hs
@@ -0,0 +1,198 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.CreateACL
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an Access Control List. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/clusters.acls.html Authenticating users with Access Contol Lists (ACLs)>.
+module Amazonka.MemoryDb.CreateACL
+  ( -- * Creating a Request
+    CreateACL (..),
+    newCreateACL,
+
+    -- * Request Lenses
+    createACL_tags,
+    createACL_userNames,
+    createACL_aCLName,
+
+    -- * Destructuring the Response
+    CreateACLResponse (..),
+    newCreateACLResponse,
+
+    -- * Response Lenses
+    createACLResponse_acl,
+    createACLResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateACL' smart constructor.
+data CreateACL = CreateACL'
+  { -- | A list of tags to be added to this resource. A tag is a key-value pair.
+    -- A tag key must be accompanied by a tag value, although null is accepted.
+    tags :: Prelude.Maybe [Tag],
+    -- | The list of users that belong to the Access Control List.
+    userNames :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The name of the Access Control List.
+    aCLName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateACL' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'createACL_tags' - A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+--
+-- 'userNames', 'createACL_userNames' - The list of users that belong to the Access Control List.
+--
+-- 'aCLName', 'createACL_aCLName' - The name of the Access Control List.
+newCreateACL ::
+  -- | 'aCLName'
+  Prelude.Text ->
+  CreateACL
+newCreateACL pACLName_ =
+  CreateACL'
+    { tags = Prelude.Nothing,
+      userNames = Prelude.Nothing,
+      aCLName = pACLName_
+    }
+
+-- | A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+createACL_tags :: Lens.Lens' CreateACL (Prelude.Maybe [Tag])
+createACL_tags = Lens.lens (\CreateACL' {tags} -> tags) (\s@CreateACL' {} a -> s {tags = a} :: CreateACL) Prelude.. Lens.mapping Lens.coerced
+
+-- | The list of users that belong to the Access Control List.
+createACL_userNames :: Lens.Lens' CreateACL (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+createACL_userNames = Lens.lens (\CreateACL' {userNames} -> userNames) (\s@CreateACL' {} a -> s {userNames = a} :: CreateACL) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the Access Control List.
+createACL_aCLName :: Lens.Lens' CreateACL Prelude.Text
+createACL_aCLName = Lens.lens (\CreateACL' {aCLName} -> aCLName) (\s@CreateACL' {} a -> s {aCLName = a} :: CreateACL)
+
+instance Core.AWSRequest CreateACL where
+  type AWSResponse CreateACL = CreateACLResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateACLResponse'
+            Prelude.<$> (x Data..?> "ACL")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateACL where
+  hashWithSalt _salt CreateACL' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` userNames
+      `Prelude.hashWithSalt` aCLName
+
+instance Prelude.NFData CreateACL where
+  rnf CreateACL' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf userNames
+      `Prelude.seq` Prelude.rnf aCLName
+
+instance Data.ToHeaders CreateACL where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("AmazonMemoryDB.CreateACL" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateACL where
+  toJSON CreateACL' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Tags" Data..=) Prelude.<$> tags,
+            ("UserNames" Data..=) Prelude.<$> userNames,
+            Prelude.Just ("ACLName" Data..= aCLName)
+          ]
+      )
+
+instance Data.ToPath CreateACL where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateACL where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateACLResponse' smart constructor.
+data CreateACLResponse = CreateACLResponse'
+  { -- | The newly-created Access Control List.
+    acl :: Prelude.Maybe ACL,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateACLResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'acl', 'createACLResponse_acl' - The newly-created Access Control List.
+--
+-- 'httpStatus', 'createACLResponse_httpStatus' - The response's http status code.
+newCreateACLResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateACLResponse
+newCreateACLResponse pHttpStatus_ =
+  CreateACLResponse'
+    { acl = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The newly-created Access Control List.
+createACLResponse_acl :: Lens.Lens' CreateACLResponse (Prelude.Maybe ACL)
+createACLResponse_acl = Lens.lens (\CreateACLResponse' {acl} -> acl) (\s@CreateACLResponse' {} a -> s {acl = a} :: CreateACLResponse)
+
+-- | The response's http status code.
+createACLResponse_httpStatus :: Lens.Lens' CreateACLResponse Prelude.Int
+createACLResponse_httpStatus = Lens.lens (\CreateACLResponse' {httpStatus} -> httpStatus) (\s@CreateACLResponse' {} a -> s {httpStatus = a} :: CreateACLResponse)
+
+instance Prelude.NFData CreateACLResponse where
+  rnf CreateACLResponse' {..} =
+    Prelude.rnf acl
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/CreateCluster.hs b/gen/Amazonka/MemoryDb/CreateCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/CreateCluster.hs
@@ -0,0 +1,594 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.CreateCluster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a cluster. All nodes in the cluster run the same
+-- protocol-compliant engine software.
+module Amazonka.MemoryDb.CreateCluster
+  ( -- * Creating a Request
+    CreateCluster (..),
+    newCreateCluster,
+
+    -- * Request Lenses
+    createCluster_autoMinorVersionUpgrade,
+    createCluster_dataTiering,
+    createCluster_description,
+    createCluster_engineVersion,
+    createCluster_kmsKeyId,
+    createCluster_maintenanceWindow,
+    createCluster_numReplicasPerShard,
+    createCluster_numShards,
+    createCluster_parameterGroupName,
+    createCluster_port,
+    createCluster_securityGroupIds,
+    createCluster_snapshotArns,
+    createCluster_snapshotName,
+    createCluster_snapshotRetentionLimit,
+    createCluster_snapshotWindow,
+    createCluster_snsTopicArn,
+    createCluster_subnetGroupName,
+    createCluster_tLSEnabled,
+    createCluster_tags,
+    createCluster_clusterName,
+    createCluster_nodeType,
+    createCluster_aCLName,
+
+    -- * Destructuring the Response
+    CreateClusterResponse (..),
+    newCreateClusterResponse,
+
+    -- * Response Lenses
+    createClusterResponse_cluster,
+    createClusterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateCluster' smart constructor.
+data CreateCluster = CreateCluster'
+  { -- | When set to true, the cluster will automatically receive minor engine
+    -- version upgrades after launch.
+    autoMinorVersionUpgrade :: Prelude.Maybe Prelude.Bool,
+    -- | Enables data tiering. Data tiering is only supported for clusters using
+    -- the r6gd node type. This parameter must be set when using r6gd nodes.
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/memorydb/latest/devguide/data-tiering.html Data tiering>.
+    dataTiering :: Prelude.Maybe Prelude.Bool,
+    -- | An optional description of the cluster.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The version number of the Redis engine to be used for the cluster.
+    engineVersion :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the KMS key used to encrypt the cluster.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | Specifies the weekly time range during which maintenance on the cluster
+    -- is performed. It is specified as a range in the format
+    -- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+    -- is a 60 minute period.
+    --
+    -- Valid values for @ddd@ are:
+    --
+    -- -   @sun@
+    --
+    -- -   @mon@
+    --
+    -- -   @tue@
+    --
+    -- -   @wed@
+    --
+    -- -   @thu@
+    --
+    -- -   @fri@
+    --
+    -- -   @sat@
+    --
+    -- Example: @sun:23:00-mon:01:30@
+    maintenanceWindow :: Prelude.Maybe Prelude.Text,
+    -- | The number of replicas to apply to each shard. The default value is 1.
+    -- The maximum is 5.
+    numReplicasPerShard :: Prelude.Maybe Prelude.Int,
+    -- | The number of shards the cluster will contain. The default value is 1.
+    numShards :: Prelude.Maybe Prelude.Int,
+    -- | The name of the parameter group associated with the cluster.
+    parameterGroupName :: Prelude.Maybe Prelude.Text,
+    -- | The port number on which each of the nodes accepts connections.
+    port :: Prelude.Maybe Prelude.Int,
+    -- | A list of security group names to associate with this cluster.
+    securityGroupIds :: Prelude.Maybe [Prelude.Text],
+    -- | A list of Amazon Resource Names (ARN) that uniquely identify the RDB
+    -- snapshot files stored in Amazon S3. The snapshot files are used to
+    -- populate the new cluster. The Amazon S3 object name in the ARN cannot
+    -- contain any commas.
+    snapshotArns :: Prelude.Maybe [Prelude.Text],
+    -- | The name of a snapshot from which to restore data into the new cluster.
+    -- The snapshot status changes to restoring while the new cluster is being
+    -- created.
+    snapshotName :: Prelude.Maybe Prelude.Text,
+    -- | The number of days for which MemoryDB retains automatic snapshots before
+    -- deleting them. For example, if you set SnapshotRetentionLimit to 5, a
+    -- snapshot that was taken today is retained for 5 days before being
+    -- deleted.
+    snapshotRetentionLimit :: Prelude.Maybe Prelude.Int,
+    -- | The daily time range (in UTC) during which MemoryDB begins taking a
+    -- daily snapshot of your shard.
+    --
+    -- Example: 05:00-09:00
+    --
+    -- If you do not specify this parameter, MemoryDB automatically chooses an
+    -- appropriate time range.
+    snapshotWindow :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the Amazon Simple Notification Service
+    -- (SNS) topic to which notifications are sent.
+    snsTopicArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the subnet group to be used for the cluster.
+    subnetGroupName :: Prelude.Maybe Prelude.Text,
+    -- | A flag to enable in-transit encryption on the cluster.
+    tLSEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | A list of tags to be added to this resource. Tags are comma-separated
+    -- key,value pairs (e.g. Key=myKey, Value=myKeyValue. You can include
+    -- multiple tags as shown following: Key=myKey, Value=myKeyValue
+    -- Key=mySecondKey, Value=mySecondKeyValue.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the cluster. This value must be unique as it also serves as
+    -- the cluster identifier.
+    clusterName :: Prelude.Text,
+    -- | The compute and memory capacity of the nodes in the cluster.
+    nodeType :: Prelude.Text,
+    -- | The name of the Access Control List to associate with the cluster.
+    aCLName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateCluster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'autoMinorVersionUpgrade', 'createCluster_autoMinorVersionUpgrade' - When set to true, the cluster will automatically receive minor engine
+-- version upgrades after launch.
+--
+-- 'dataTiering', 'createCluster_dataTiering' - Enables data tiering. Data tiering is only supported for clusters using
+-- the r6gd node type. This parameter must be set when using r6gd nodes.
+-- For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/data-tiering.html Data tiering>.
+--
+-- 'description', 'createCluster_description' - An optional description of the cluster.
+--
+-- 'engineVersion', 'createCluster_engineVersion' - The version number of the Redis engine to be used for the cluster.
+--
+-- 'kmsKeyId', 'createCluster_kmsKeyId' - The ID of the KMS key used to encrypt the cluster.
+--
+-- 'maintenanceWindow', 'createCluster_maintenanceWindow' - Specifies the weekly time range during which maintenance on the cluster
+-- is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period.
+--
+-- Valid values for @ddd@ are:
+--
+-- -   @sun@
+--
+-- -   @mon@
+--
+-- -   @tue@
+--
+-- -   @wed@
+--
+-- -   @thu@
+--
+-- -   @fri@
+--
+-- -   @sat@
+--
+-- Example: @sun:23:00-mon:01:30@
+--
+-- 'numReplicasPerShard', 'createCluster_numReplicasPerShard' - The number of replicas to apply to each shard. The default value is 1.
+-- The maximum is 5.
+--
+-- 'numShards', 'createCluster_numShards' - The number of shards the cluster will contain. The default value is 1.
+--
+-- 'parameterGroupName', 'createCluster_parameterGroupName' - The name of the parameter group associated with the cluster.
+--
+-- 'port', 'createCluster_port' - The port number on which each of the nodes accepts connections.
+--
+-- 'securityGroupIds', 'createCluster_securityGroupIds' - A list of security group names to associate with this cluster.
+--
+-- 'snapshotArns', 'createCluster_snapshotArns' - A list of Amazon Resource Names (ARN) that uniquely identify the RDB
+-- snapshot files stored in Amazon S3. The snapshot files are used to
+-- populate the new cluster. The Amazon S3 object name in the ARN cannot
+-- contain any commas.
+--
+-- 'snapshotName', 'createCluster_snapshotName' - The name of a snapshot from which to restore data into the new cluster.
+-- The snapshot status changes to restoring while the new cluster is being
+-- created.
+--
+-- 'snapshotRetentionLimit', 'createCluster_snapshotRetentionLimit' - The number of days for which MemoryDB retains automatic snapshots before
+-- deleting them. For example, if you set SnapshotRetentionLimit to 5, a
+-- snapshot that was taken today is retained for 5 days before being
+-- deleted.
+--
+-- 'snapshotWindow', 'createCluster_snapshotWindow' - The daily time range (in UTC) during which MemoryDB begins taking a
+-- daily snapshot of your shard.
+--
+-- Example: 05:00-09:00
+--
+-- If you do not specify this parameter, MemoryDB automatically chooses an
+-- appropriate time range.
+--
+-- 'snsTopicArn', 'createCluster_snsTopicArn' - The Amazon Resource Name (ARN) of the Amazon Simple Notification Service
+-- (SNS) topic to which notifications are sent.
+--
+-- 'subnetGroupName', 'createCluster_subnetGroupName' - The name of the subnet group to be used for the cluster.
+--
+-- 'tLSEnabled', 'createCluster_tLSEnabled' - A flag to enable in-transit encryption on the cluster.
+--
+-- 'tags', 'createCluster_tags' - A list of tags to be added to this resource. Tags are comma-separated
+-- key,value pairs (e.g. Key=myKey, Value=myKeyValue. You can include
+-- multiple tags as shown following: Key=myKey, Value=myKeyValue
+-- Key=mySecondKey, Value=mySecondKeyValue.
+--
+-- 'clusterName', 'createCluster_clusterName' - The name of the cluster. This value must be unique as it also serves as
+-- the cluster identifier.
+--
+-- 'nodeType', 'createCluster_nodeType' - The compute and memory capacity of the nodes in the cluster.
+--
+-- 'aCLName', 'createCluster_aCLName' - The name of the Access Control List to associate with the cluster.
+newCreateCluster ::
+  -- | 'clusterName'
+  Prelude.Text ->
+  -- | 'nodeType'
+  Prelude.Text ->
+  -- | 'aCLName'
+  Prelude.Text ->
+  CreateCluster
+newCreateCluster pClusterName_ pNodeType_ pACLName_ =
+  CreateCluster'
+    { autoMinorVersionUpgrade =
+        Prelude.Nothing,
+      dataTiering = Prelude.Nothing,
+      description = Prelude.Nothing,
+      engineVersion = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      maintenanceWindow = Prelude.Nothing,
+      numReplicasPerShard = Prelude.Nothing,
+      numShards = Prelude.Nothing,
+      parameterGroupName = Prelude.Nothing,
+      port = Prelude.Nothing,
+      securityGroupIds = Prelude.Nothing,
+      snapshotArns = Prelude.Nothing,
+      snapshotName = Prelude.Nothing,
+      snapshotRetentionLimit = Prelude.Nothing,
+      snapshotWindow = Prelude.Nothing,
+      snsTopicArn = Prelude.Nothing,
+      subnetGroupName = Prelude.Nothing,
+      tLSEnabled = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      clusterName = pClusterName_,
+      nodeType = pNodeType_,
+      aCLName = pACLName_
+    }
+
+-- | When set to true, the cluster will automatically receive minor engine
+-- version upgrades after launch.
+createCluster_autoMinorVersionUpgrade :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Bool)
+createCluster_autoMinorVersionUpgrade = Lens.lens (\CreateCluster' {autoMinorVersionUpgrade} -> autoMinorVersionUpgrade) (\s@CreateCluster' {} a -> s {autoMinorVersionUpgrade = a} :: CreateCluster)
+
+-- | Enables data tiering. Data tiering is only supported for clusters using
+-- the r6gd node type. This parameter must be set when using r6gd nodes.
+-- For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/data-tiering.html Data tiering>.
+createCluster_dataTiering :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Bool)
+createCluster_dataTiering = Lens.lens (\CreateCluster' {dataTiering} -> dataTiering) (\s@CreateCluster' {} a -> s {dataTiering = a} :: CreateCluster)
+
+-- | An optional description of the cluster.
+createCluster_description :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Text)
+createCluster_description = Lens.lens (\CreateCluster' {description} -> description) (\s@CreateCluster' {} a -> s {description = a} :: CreateCluster)
+
+-- | The version number of the Redis engine to be used for the cluster.
+createCluster_engineVersion :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Text)
+createCluster_engineVersion = Lens.lens (\CreateCluster' {engineVersion} -> engineVersion) (\s@CreateCluster' {} a -> s {engineVersion = a} :: CreateCluster)
+
+-- | The ID of the KMS key used to encrypt the cluster.
+createCluster_kmsKeyId :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Text)
+createCluster_kmsKeyId = Lens.lens (\CreateCluster' {kmsKeyId} -> kmsKeyId) (\s@CreateCluster' {} a -> s {kmsKeyId = a} :: CreateCluster)
+
+-- | Specifies the weekly time range during which maintenance on the cluster
+-- is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period.
+--
+-- Valid values for @ddd@ are:
+--
+-- -   @sun@
+--
+-- -   @mon@
+--
+-- -   @tue@
+--
+-- -   @wed@
+--
+-- -   @thu@
+--
+-- -   @fri@
+--
+-- -   @sat@
+--
+-- Example: @sun:23:00-mon:01:30@
+createCluster_maintenanceWindow :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Text)
+createCluster_maintenanceWindow = Lens.lens (\CreateCluster' {maintenanceWindow} -> maintenanceWindow) (\s@CreateCluster' {} a -> s {maintenanceWindow = a} :: CreateCluster)
+
+-- | The number of replicas to apply to each shard. The default value is 1.
+-- The maximum is 5.
+createCluster_numReplicasPerShard :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Int)
+createCluster_numReplicasPerShard = Lens.lens (\CreateCluster' {numReplicasPerShard} -> numReplicasPerShard) (\s@CreateCluster' {} a -> s {numReplicasPerShard = a} :: CreateCluster)
+
+-- | The number of shards the cluster will contain. The default value is 1.
+createCluster_numShards :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Int)
+createCluster_numShards = Lens.lens (\CreateCluster' {numShards} -> numShards) (\s@CreateCluster' {} a -> s {numShards = a} :: CreateCluster)
+
+-- | The name of the parameter group associated with the cluster.
+createCluster_parameterGroupName :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Text)
+createCluster_parameterGroupName = Lens.lens (\CreateCluster' {parameterGroupName} -> parameterGroupName) (\s@CreateCluster' {} a -> s {parameterGroupName = a} :: CreateCluster)
+
+-- | The port number on which each of the nodes accepts connections.
+createCluster_port :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Int)
+createCluster_port = Lens.lens (\CreateCluster' {port} -> port) (\s@CreateCluster' {} a -> s {port = a} :: CreateCluster)
+
+-- | A list of security group names to associate with this cluster.
+createCluster_securityGroupIds :: Lens.Lens' CreateCluster (Prelude.Maybe [Prelude.Text])
+createCluster_securityGroupIds = Lens.lens (\CreateCluster' {securityGroupIds} -> securityGroupIds) (\s@CreateCluster' {} a -> s {securityGroupIds = a} :: CreateCluster) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of Amazon Resource Names (ARN) that uniquely identify the RDB
+-- snapshot files stored in Amazon S3. The snapshot files are used to
+-- populate the new cluster. The Amazon S3 object name in the ARN cannot
+-- contain any commas.
+createCluster_snapshotArns :: Lens.Lens' CreateCluster (Prelude.Maybe [Prelude.Text])
+createCluster_snapshotArns = Lens.lens (\CreateCluster' {snapshotArns} -> snapshotArns) (\s@CreateCluster' {} a -> s {snapshotArns = a} :: CreateCluster) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of a snapshot from which to restore data into the new cluster.
+-- The snapshot status changes to restoring while the new cluster is being
+-- created.
+createCluster_snapshotName :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Text)
+createCluster_snapshotName = Lens.lens (\CreateCluster' {snapshotName} -> snapshotName) (\s@CreateCluster' {} a -> s {snapshotName = a} :: CreateCluster)
+
+-- | The number of days for which MemoryDB retains automatic snapshots before
+-- deleting them. For example, if you set SnapshotRetentionLimit to 5, a
+-- snapshot that was taken today is retained for 5 days before being
+-- deleted.
+createCluster_snapshotRetentionLimit :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Int)
+createCluster_snapshotRetentionLimit = Lens.lens (\CreateCluster' {snapshotRetentionLimit} -> snapshotRetentionLimit) (\s@CreateCluster' {} a -> s {snapshotRetentionLimit = a} :: CreateCluster)
+
+-- | The daily time range (in UTC) during which MemoryDB begins taking a
+-- daily snapshot of your shard.
+--
+-- Example: 05:00-09:00
+--
+-- If you do not specify this parameter, MemoryDB automatically chooses an
+-- appropriate time range.
+createCluster_snapshotWindow :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Text)
+createCluster_snapshotWindow = Lens.lens (\CreateCluster' {snapshotWindow} -> snapshotWindow) (\s@CreateCluster' {} a -> s {snapshotWindow = a} :: CreateCluster)
+
+-- | The Amazon Resource Name (ARN) of the Amazon Simple Notification Service
+-- (SNS) topic to which notifications are sent.
+createCluster_snsTopicArn :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Text)
+createCluster_snsTopicArn = Lens.lens (\CreateCluster' {snsTopicArn} -> snsTopicArn) (\s@CreateCluster' {} a -> s {snsTopicArn = a} :: CreateCluster)
+
+-- | The name of the subnet group to be used for the cluster.
+createCluster_subnetGroupName :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Text)
+createCluster_subnetGroupName = Lens.lens (\CreateCluster' {subnetGroupName} -> subnetGroupName) (\s@CreateCluster' {} a -> s {subnetGroupName = a} :: CreateCluster)
+
+-- | A flag to enable in-transit encryption on the cluster.
+createCluster_tLSEnabled :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Bool)
+createCluster_tLSEnabled = Lens.lens (\CreateCluster' {tLSEnabled} -> tLSEnabled) (\s@CreateCluster' {} a -> s {tLSEnabled = a} :: CreateCluster)
+
+-- | A list of tags to be added to this resource. Tags are comma-separated
+-- key,value pairs (e.g. Key=myKey, Value=myKeyValue. You can include
+-- multiple tags as shown following: Key=myKey, Value=myKeyValue
+-- Key=mySecondKey, Value=mySecondKeyValue.
+createCluster_tags :: Lens.Lens' CreateCluster (Prelude.Maybe [Tag])
+createCluster_tags = Lens.lens (\CreateCluster' {tags} -> tags) (\s@CreateCluster' {} a -> s {tags = a} :: CreateCluster) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the cluster. This value must be unique as it also serves as
+-- the cluster identifier.
+createCluster_clusterName :: Lens.Lens' CreateCluster Prelude.Text
+createCluster_clusterName = Lens.lens (\CreateCluster' {clusterName} -> clusterName) (\s@CreateCluster' {} a -> s {clusterName = a} :: CreateCluster)
+
+-- | The compute and memory capacity of the nodes in the cluster.
+createCluster_nodeType :: Lens.Lens' CreateCluster Prelude.Text
+createCluster_nodeType = Lens.lens (\CreateCluster' {nodeType} -> nodeType) (\s@CreateCluster' {} a -> s {nodeType = a} :: CreateCluster)
+
+-- | The name of the Access Control List to associate with the cluster.
+createCluster_aCLName :: Lens.Lens' CreateCluster Prelude.Text
+createCluster_aCLName = Lens.lens (\CreateCluster' {aCLName} -> aCLName) (\s@CreateCluster' {} a -> s {aCLName = a} :: CreateCluster)
+
+instance Core.AWSRequest CreateCluster where
+  type
+    AWSResponse CreateCluster =
+      CreateClusterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateClusterResponse'
+            Prelude.<$> (x Data..?> "Cluster")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateCluster where
+  hashWithSalt _salt CreateCluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` autoMinorVersionUpgrade
+      `Prelude.hashWithSalt` dataTiering
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` engineVersion
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` maintenanceWindow
+      `Prelude.hashWithSalt` numReplicasPerShard
+      `Prelude.hashWithSalt` numShards
+      `Prelude.hashWithSalt` parameterGroupName
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` securityGroupIds
+      `Prelude.hashWithSalt` snapshotArns
+      `Prelude.hashWithSalt` snapshotName
+      `Prelude.hashWithSalt` snapshotRetentionLimit
+      `Prelude.hashWithSalt` snapshotWindow
+      `Prelude.hashWithSalt` snsTopicArn
+      `Prelude.hashWithSalt` subnetGroupName
+      `Prelude.hashWithSalt` tLSEnabled
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` clusterName
+      `Prelude.hashWithSalt` nodeType
+      `Prelude.hashWithSalt` aCLName
+
+instance Prelude.NFData CreateCluster where
+  rnf CreateCluster' {..} =
+    Prelude.rnf autoMinorVersionUpgrade
+      `Prelude.seq` Prelude.rnf dataTiering
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf engineVersion
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf maintenanceWindow
+      `Prelude.seq` Prelude.rnf numReplicasPerShard
+      `Prelude.seq` Prelude.rnf numShards
+      `Prelude.seq` Prelude.rnf parameterGroupName
+      `Prelude.seq` Prelude.rnf port
+      `Prelude.seq` Prelude.rnf securityGroupIds
+      `Prelude.seq` Prelude.rnf snapshotArns
+      `Prelude.seq` Prelude.rnf snapshotName
+      `Prelude.seq` Prelude.rnf snapshotRetentionLimit
+      `Prelude.seq` Prelude.rnf snapshotWindow
+      `Prelude.seq` Prelude.rnf snsTopicArn
+      `Prelude.seq` Prelude.rnf subnetGroupName
+      `Prelude.seq` Prelude.rnf tLSEnabled
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf nodeType
+      `Prelude.seq` Prelude.rnf aCLName
+
+instance Data.ToHeaders CreateCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.CreateCluster" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateCluster where
+  toJSON CreateCluster' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AutoMinorVersionUpgrade" Data..=)
+              Prelude.<$> autoMinorVersionUpgrade,
+            ("DataTiering" Data..=) Prelude.<$> dataTiering,
+            ("Description" Data..=) Prelude.<$> description,
+            ("EngineVersion" Data..=) Prelude.<$> engineVersion,
+            ("KmsKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("MaintenanceWindow" Data..=)
+              Prelude.<$> maintenanceWindow,
+            ("NumReplicasPerShard" Data..=)
+              Prelude.<$> numReplicasPerShard,
+            ("NumShards" Data..=) Prelude.<$> numShards,
+            ("ParameterGroupName" Data..=)
+              Prelude.<$> parameterGroupName,
+            ("Port" Data..=) Prelude.<$> port,
+            ("SecurityGroupIds" Data..=)
+              Prelude.<$> securityGroupIds,
+            ("SnapshotArns" Data..=) Prelude.<$> snapshotArns,
+            ("SnapshotName" Data..=) Prelude.<$> snapshotName,
+            ("SnapshotRetentionLimit" Data..=)
+              Prelude.<$> snapshotRetentionLimit,
+            ("SnapshotWindow" Data..=)
+              Prelude.<$> snapshotWindow,
+            ("SnsTopicArn" Data..=) Prelude.<$> snsTopicArn,
+            ("SubnetGroupName" Data..=)
+              Prelude.<$> subnetGroupName,
+            ("TLSEnabled" Data..=) Prelude.<$> tLSEnabled,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("ClusterName" Data..= clusterName),
+            Prelude.Just ("NodeType" Data..= nodeType),
+            Prelude.Just ("ACLName" Data..= aCLName)
+          ]
+      )
+
+instance Data.ToPath CreateCluster where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateClusterResponse' smart constructor.
+data CreateClusterResponse = CreateClusterResponse'
+  { -- | The newly-created cluster.
+    cluster :: Prelude.Maybe Cluster,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateClusterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cluster', 'createClusterResponse_cluster' - The newly-created cluster.
+--
+-- 'httpStatus', 'createClusterResponse_httpStatus' - The response's http status code.
+newCreateClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateClusterResponse
+newCreateClusterResponse pHttpStatus_ =
+  CreateClusterResponse'
+    { cluster = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The newly-created cluster.
+createClusterResponse_cluster :: Lens.Lens' CreateClusterResponse (Prelude.Maybe Cluster)
+createClusterResponse_cluster = Lens.lens (\CreateClusterResponse' {cluster} -> cluster) (\s@CreateClusterResponse' {} a -> s {cluster = a} :: CreateClusterResponse)
+
+-- | The response's http status code.
+createClusterResponse_httpStatus :: Lens.Lens' CreateClusterResponse Prelude.Int
+createClusterResponse_httpStatus = Lens.lens (\CreateClusterResponse' {httpStatus} -> httpStatus) (\s@CreateClusterResponse' {} a -> s {httpStatus = a} :: CreateClusterResponse)
+
+instance Prelude.NFData CreateClusterResponse where
+  rnf CreateClusterResponse' {..} =
+    Prelude.rnf cluster
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/CreateParameterGroup.hs b/gen/Amazonka/MemoryDb/CreateParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/CreateParameterGroup.hs
@@ -0,0 +1,225 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.CreateParameterGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new MemoryDB parameter group. A parameter group is a
+-- collection of parameters and their values that are applied to all of the
+-- nodes in any cluster. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/parametergroups.html Configuring engine parameters using parameter groups>.
+module Amazonka.MemoryDb.CreateParameterGroup
+  ( -- * Creating a Request
+    CreateParameterGroup (..),
+    newCreateParameterGroup,
+
+    -- * Request Lenses
+    createParameterGroup_description,
+    createParameterGroup_tags,
+    createParameterGroup_parameterGroupName,
+    createParameterGroup_family,
+
+    -- * Destructuring the Response
+    CreateParameterGroupResponse (..),
+    newCreateParameterGroupResponse,
+
+    -- * Response Lenses
+    createParameterGroupResponse_parameterGroup,
+    createParameterGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateParameterGroup' smart constructor.
+data CreateParameterGroup = CreateParameterGroup'
+  { -- | An optional description of the parameter group.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | A list of tags to be added to this resource. A tag is a key-value pair.
+    -- A tag key must be accompanied by a tag value, although null is accepted.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the parameter group.
+    parameterGroupName :: Prelude.Text,
+    -- | The name of the parameter group family that the parameter group can be
+    -- used with.
+    family :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateParameterGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'createParameterGroup_description' - An optional description of the parameter group.
+--
+-- 'tags', 'createParameterGroup_tags' - A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+--
+-- 'parameterGroupName', 'createParameterGroup_parameterGroupName' - The name of the parameter group.
+--
+-- 'family', 'createParameterGroup_family' - The name of the parameter group family that the parameter group can be
+-- used with.
+newCreateParameterGroup ::
+  -- | 'parameterGroupName'
+  Prelude.Text ->
+  -- | 'family'
+  Prelude.Text ->
+  CreateParameterGroup
+newCreateParameterGroup pParameterGroupName_ pFamily_ =
+  CreateParameterGroup'
+    { description =
+        Prelude.Nothing,
+      tags = Prelude.Nothing,
+      parameterGroupName = pParameterGroupName_,
+      family = pFamily_
+    }
+
+-- | An optional description of the parameter group.
+createParameterGroup_description :: Lens.Lens' CreateParameterGroup (Prelude.Maybe Prelude.Text)
+createParameterGroup_description = Lens.lens (\CreateParameterGroup' {description} -> description) (\s@CreateParameterGroup' {} a -> s {description = a} :: CreateParameterGroup)
+
+-- | A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+createParameterGroup_tags :: Lens.Lens' CreateParameterGroup (Prelude.Maybe [Tag])
+createParameterGroup_tags = Lens.lens (\CreateParameterGroup' {tags} -> tags) (\s@CreateParameterGroup' {} a -> s {tags = a} :: CreateParameterGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the parameter group.
+createParameterGroup_parameterGroupName :: Lens.Lens' CreateParameterGroup Prelude.Text
+createParameterGroup_parameterGroupName = Lens.lens (\CreateParameterGroup' {parameterGroupName} -> parameterGroupName) (\s@CreateParameterGroup' {} a -> s {parameterGroupName = a} :: CreateParameterGroup)
+
+-- | The name of the parameter group family that the parameter group can be
+-- used with.
+createParameterGroup_family :: Lens.Lens' CreateParameterGroup Prelude.Text
+createParameterGroup_family = Lens.lens (\CreateParameterGroup' {family} -> family) (\s@CreateParameterGroup' {} a -> s {family = a} :: CreateParameterGroup)
+
+instance Core.AWSRequest CreateParameterGroup where
+  type
+    AWSResponse CreateParameterGroup =
+      CreateParameterGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateParameterGroupResponse'
+            Prelude.<$> (x Data..?> "ParameterGroup")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateParameterGroup where
+  hashWithSalt _salt CreateParameterGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` parameterGroupName
+      `Prelude.hashWithSalt` family
+
+instance Prelude.NFData CreateParameterGroup where
+  rnf CreateParameterGroup' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf parameterGroupName
+      `Prelude.seq` Prelude.rnf family
+
+instance Data.ToHeaders CreateParameterGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.CreateParameterGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateParameterGroup where
+  toJSON CreateParameterGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Description" Data..=) Prelude.<$> description,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("ParameterGroupName" Data..= parameterGroupName),
+            Prelude.Just ("Family" Data..= family)
+          ]
+      )
+
+instance Data.ToPath CreateParameterGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateParameterGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateParameterGroupResponse' smart constructor.
+data CreateParameterGroupResponse = CreateParameterGroupResponse'
+  { -- | The newly-created parameter group.
+    parameterGroup :: Prelude.Maybe ParameterGroup,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateParameterGroupResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'parameterGroup', 'createParameterGroupResponse_parameterGroup' - The newly-created parameter group.
+--
+-- 'httpStatus', 'createParameterGroupResponse_httpStatus' - The response's http status code.
+newCreateParameterGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateParameterGroupResponse
+newCreateParameterGroupResponse pHttpStatus_ =
+  CreateParameterGroupResponse'
+    { parameterGroup =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The newly-created parameter group.
+createParameterGroupResponse_parameterGroup :: Lens.Lens' CreateParameterGroupResponse (Prelude.Maybe ParameterGroup)
+createParameterGroupResponse_parameterGroup = Lens.lens (\CreateParameterGroupResponse' {parameterGroup} -> parameterGroup) (\s@CreateParameterGroupResponse' {} a -> s {parameterGroup = a} :: CreateParameterGroupResponse)
+
+-- | The response's http status code.
+createParameterGroupResponse_httpStatus :: Lens.Lens' CreateParameterGroupResponse Prelude.Int
+createParameterGroupResponse_httpStatus = Lens.lens (\CreateParameterGroupResponse' {httpStatus} -> httpStatus) (\s@CreateParameterGroupResponse' {} a -> s {httpStatus = a} :: CreateParameterGroupResponse)
+
+instance Prelude.NFData CreateParameterGroupResponse where
+  rnf CreateParameterGroupResponse' {..} =
+    Prelude.rnf parameterGroup
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/CreateSnapshot.hs b/gen/Amazonka/MemoryDb/CreateSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/CreateSnapshot.hs
@@ -0,0 +1,216 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.CreateSnapshot
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a copy of an entire cluster at a specific moment in time.
+module Amazonka.MemoryDb.CreateSnapshot
+  ( -- * Creating a Request
+    CreateSnapshot (..),
+    newCreateSnapshot,
+
+    -- * Request Lenses
+    createSnapshot_kmsKeyId,
+    createSnapshot_tags,
+    createSnapshot_clusterName,
+    createSnapshot_snapshotName,
+
+    -- * Destructuring the Response
+    CreateSnapshotResponse (..),
+    newCreateSnapshotResponse,
+
+    -- * Response Lenses
+    createSnapshotResponse_snapshot,
+    createSnapshotResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateSnapshot' smart constructor.
+data CreateSnapshot = CreateSnapshot'
+  { -- | The ID of the KMS key used to encrypt the snapshot.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | A list of tags to be added to this resource. A tag is a key-value pair.
+    -- A tag key must be accompanied by a tag value, although null is accepted.
+    tags :: Prelude.Maybe [Tag],
+    -- | The snapshot is created from this cluster.
+    clusterName :: Prelude.Text,
+    -- | A name for the snapshot being created.
+    snapshotName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSnapshot' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kmsKeyId', 'createSnapshot_kmsKeyId' - The ID of the KMS key used to encrypt the snapshot.
+--
+-- 'tags', 'createSnapshot_tags' - A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+--
+-- 'clusterName', 'createSnapshot_clusterName' - The snapshot is created from this cluster.
+--
+-- 'snapshotName', 'createSnapshot_snapshotName' - A name for the snapshot being created.
+newCreateSnapshot ::
+  -- | 'clusterName'
+  Prelude.Text ->
+  -- | 'snapshotName'
+  Prelude.Text ->
+  CreateSnapshot
+newCreateSnapshot pClusterName_ pSnapshotName_ =
+  CreateSnapshot'
+    { kmsKeyId = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      clusterName = pClusterName_,
+      snapshotName = pSnapshotName_
+    }
+
+-- | The ID of the KMS key used to encrypt the snapshot.
+createSnapshot_kmsKeyId :: Lens.Lens' CreateSnapshot (Prelude.Maybe Prelude.Text)
+createSnapshot_kmsKeyId = Lens.lens (\CreateSnapshot' {kmsKeyId} -> kmsKeyId) (\s@CreateSnapshot' {} a -> s {kmsKeyId = a} :: CreateSnapshot)
+
+-- | A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+createSnapshot_tags :: Lens.Lens' CreateSnapshot (Prelude.Maybe [Tag])
+createSnapshot_tags = Lens.lens (\CreateSnapshot' {tags} -> tags) (\s@CreateSnapshot' {} a -> s {tags = a} :: CreateSnapshot) Prelude.. Lens.mapping Lens.coerced
+
+-- | The snapshot is created from this cluster.
+createSnapshot_clusterName :: Lens.Lens' CreateSnapshot Prelude.Text
+createSnapshot_clusterName = Lens.lens (\CreateSnapshot' {clusterName} -> clusterName) (\s@CreateSnapshot' {} a -> s {clusterName = a} :: CreateSnapshot)
+
+-- | A name for the snapshot being created.
+createSnapshot_snapshotName :: Lens.Lens' CreateSnapshot Prelude.Text
+createSnapshot_snapshotName = Lens.lens (\CreateSnapshot' {snapshotName} -> snapshotName) (\s@CreateSnapshot' {} a -> s {snapshotName = a} :: CreateSnapshot)
+
+instance Core.AWSRequest CreateSnapshot where
+  type
+    AWSResponse CreateSnapshot =
+      CreateSnapshotResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateSnapshotResponse'
+            Prelude.<$> (x Data..?> "Snapshot")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateSnapshot where
+  hashWithSalt _salt CreateSnapshot' {..} =
+    _salt
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` clusterName
+      `Prelude.hashWithSalt` snapshotName
+
+instance Prelude.NFData CreateSnapshot where
+  rnf CreateSnapshot' {..} =
+    Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf snapshotName
+
+instance Data.ToHeaders CreateSnapshot where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.CreateSnapshot" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateSnapshot where
+  toJSON CreateSnapshot' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("KmsKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("ClusterName" Data..= clusterName),
+            Prelude.Just ("SnapshotName" Data..= snapshotName)
+          ]
+      )
+
+instance Data.ToPath CreateSnapshot where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateSnapshot where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateSnapshotResponse' smart constructor.
+data CreateSnapshotResponse = CreateSnapshotResponse'
+  { -- | The newly-created snapshot.
+    snapshot :: Prelude.Maybe Snapshot,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSnapshotResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'snapshot', 'createSnapshotResponse_snapshot' - The newly-created snapshot.
+--
+-- 'httpStatus', 'createSnapshotResponse_httpStatus' - The response's http status code.
+newCreateSnapshotResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateSnapshotResponse
+newCreateSnapshotResponse pHttpStatus_ =
+  CreateSnapshotResponse'
+    { snapshot = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The newly-created snapshot.
+createSnapshotResponse_snapshot :: Lens.Lens' CreateSnapshotResponse (Prelude.Maybe Snapshot)
+createSnapshotResponse_snapshot = Lens.lens (\CreateSnapshotResponse' {snapshot} -> snapshot) (\s@CreateSnapshotResponse' {} a -> s {snapshot = a} :: CreateSnapshotResponse)
+
+-- | The response's http status code.
+createSnapshotResponse_httpStatus :: Lens.Lens' CreateSnapshotResponse Prelude.Int
+createSnapshotResponse_httpStatus = Lens.lens (\CreateSnapshotResponse' {httpStatus} -> httpStatus) (\s@CreateSnapshotResponse' {} a -> s {httpStatus = a} :: CreateSnapshotResponse)
+
+instance Prelude.NFData CreateSnapshotResponse where
+  rnf CreateSnapshotResponse' {..} =
+    Prelude.rnf snapshot
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/CreateSubnetGroup.hs b/gen/Amazonka/MemoryDb/CreateSubnetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/CreateSubnetGroup.hs
@@ -0,0 +1,222 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.CreateSubnetGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a subnet group. A subnet group is a collection of subnets
+-- (typically private) that you can designate for your clusters running in
+-- an Amazon Virtual Private Cloud (VPC) environment. When you create a
+-- cluster in an Amazon VPC, you must specify a subnet group. MemoryDB uses
+-- that subnet group to choose a subnet and IP addresses within that subnet
+-- to associate with your nodes. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/subnetgroups.html Subnets and subnet groups>.
+module Amazonka.MemoryDb.CreateSubnetGroup
+  ( -- * Creating a Request
+    CreateSubnetGroup (..),
+    newCreateSubnetGroup,
+
+    -- * Request Lenses
+    createSubnetGroup_description,
+    createSubnetGroup_tags,
+    createSubnetGroup_subnetGroupName,
+    createSubnetGroup_subnetIds,
+
+    -- * Destructuring the Response
+    CreateSubnetGroupResponse (..),
+    newCreateSubnetGroupResponse,
+
+    -- * Response Lenses
+    createSubnetGroupResponse_subnetGroup,
+    createSubnetGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateSubnetGroup' smart constructor.
+data CreateSubnetGroup = CreateSubnetGroup'
+  { -- | A description for the subnet group.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | A list of tags to be added to this resource. A tag is a key-value pair.
+    -- A tag key must be accompanied by a tag value, although null is accepted.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the subnet group.
+    subnetGroupName :: Prelude.Text,
+    -- | A list of VPC subnet IDs for the subnet group.
+    subnetIds :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSubnetGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'createSubnetGroup_description' - A description for the subnet group.
+--
+-- 'tags', 'createSubnetGroup_tags' - A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+--
+-- 'subnetGroupName', 'createSubnetGroup_subnetGroupName' - The name of the subnet group.
+--
+-- 'subnetIds', 'createSubnetGroup_subnetIds' - A list of VPC subnet IDs for the subnet group.
+newCreateSubnetGroup ::
+  -- | 'subnetGroupName'
+  Prelude.Text ->
+  CreateSubnetGroup
+newCreateSubnetGroup pSubnetGroupName_ =
+  CreateSubnetGroup'
+    { description = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      subnetGroupName = pSubnetGroupName_,
+      subnetIds = Prelude.mempty
+    }
+
+-- | A description for the subnet group.
+createSubnetGroup_description :: Lens.Lens' CreateSubnetGroup (Prelude.Maybe Prelude.Text)
+createSubnetGroup_description = Lens.lens (\CreateSubnetGroup' {description} -> description) (\s@CreateSubnetGroup' {} a -> s {description = a} :: CreateSubnetGroup)
+
+-- | A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+createSubnetGroup_tags :: Lens.Lens' CreateSubnetGroup (Prelude.Maybe [Tag])
+createSubnetGroup_tags = Lens.lens (\CreateSubnetGroup' {tags} -> tags) (\s@CreateSubnetGroup' {} a -> s {tags = a} :: CreateSubnetGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the subnet group.
+createSubnetGroup_subnetGroupName :: Lens.Lens' CreateSubnetGroup Prelude.Text
+createSubnetGroup_subnetGroupName = Lens.lens (\CreateSubnetGroup' {subnetGroupName} -> subnetGroupName) (\s@CreateSubnetGroup' {} a -> s {subnetGroupName = a} :: CreateSubnetGroup)
+
+-- | A list of VPC subnet IDs for the subnet group.
+createSubnetGroup_subnetIds :: Lens.Lens' CreateSubnetGroup [Prelude.Text]
+createSubnetGroup_subnetIds = Lens.lens (\CreateSubnetGroup' {subnetIds} -> subnetIds) (\s@CreateSubnetGroup' {} a -> s {subnetIds = a} :: CreateSubnetGroup) Prelude.. Lens.coerced
+
+instance Core.AWSRequest CreateSubnetGroup where
+  type
+    AWSResponse CreateSubnetGroup =
+      CreateSubnetGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateSubnetGroupResponse'
+            Prelude.<$> (x Data..?> "SubnetGroup")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateSubnetGroup where
+  hashWithSalt _salt CreateSubnetGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` subnetGroupName
+      `Prelude.hashWithSalt` subnetIds
+
+instance Prelude.NFData CreateSubnetGroup where
+  rnf CreateSubnetGroup' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf subnetGroupName
+      `Prelude.seq` Prelude.rnf subnetIds
+
+instance Data.ToHeaders CreateSubnetGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.CreateSubnetGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateSubnetGroup where
+  toJSON CreateSubnetGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Description" Data..=) Prelude.<$> description,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("SubnetGroupName" Data..= subnetGroupName),
+            Prelude.Just ("SubnetIds" Data..= subnetIds)
+          ]
+      )
+
+instance Data.ToPath CreateSubnetGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateSubnetGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateSubnetGroupResponse' smart constructor.
+data CreateSubnetGroupResponse = CreateSubnetGroupResponse'
+  { -- | The newly-created subnet group
+    subnetGroup :: Prelude.Maybe SubnetGroup,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSubnetGroupResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'subnetGroup', 'createSubnetGroupResponse_subnetGroup' - The newly-created subnet group
+--
+-- 'httpStatus', 'createSubnetGroupResponse_httpStatus' - The response's http status code.
+newCreateSubnetGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateSubnetGroupResponse
+newCreateSubnetGroupResponse pHttpStatus_ =
+  CreateSubnetGroupResponse'
+    { subnetGroup =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The newly-created subnet group
+createSubnetGroupResponse_subnetGroup :: Lens.Lens' CreateSubnetGroupResponse (Prelude.Maybe SubnetGroup)
+createSubnetGroupResponse_subnetGroup = Lens.lens (\CreateSubnetGroupResponse' {subnetGroup} -> subnetGroup) (\s@CreateSubnetGroupResponse' {} a -> s {subnetGroup = a} :: CreateSubnetGroupResponse)
+
+-- | The response's http status code.
+createSubnetGroupResponse_httpStatus :: Lens.Lens' CreateSubnetGroupResponse Prelude.Int
+createSubnetGroupResponse_httpStatus = Lens.lens (\CreateSubnetGroupResponse' {httpStatus} -> httpStatus) (\s@CreateSubnetGroupResponse' {} a -> s {httpStatus = a} :: CreateSubnetGroupResponse)
+
+instance Prelude.NFData CreateSubnetGroupResponse where
+  rnf CreateSubnetGroupResponse' {..} =
+    Prelude.rnf subnetGroup
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/CreateUser.hs b/gen/Amazonka/MemoryDb/CreateUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/CreateUser.hs
@@ -0,0 +1,225 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.CreateUser
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a MemoryDB user. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/clusters.acls.html Authenticating users with Access Contol Lists (ACLs)>.
+module Amazonka.MemoryDb.CreateUser
+  ( -- * Creating a Request
+    CreateUser (..),
+    newCreateUser,
+
+    -- * Request Lenses
+    createUser_tags,
+    createUser_userName,
+    createUser_authenticationMode,
+    createUser_accessString,
+
+    -- * Destructuring the Response
+    CreateUserResponse (..),
+    newCreateUserResponse,
+
+    -- * Response Lenses
+    createUserResponse_user,
+    createUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateUser' smart constructor.
+data CreateUser = CreateUser'
+  { -- | A list of tags to be added to this resource. A tag is a key-value pair.
+    -- A tag key must be accompanied by a tag value, although null is accepted.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the user. This value must be unique as it also serves as the
+    -- user identifier.
+    userName :: Prelude.Text,
+    -- | Denotes the user\'s authentication properties, such as whether it
+    -- requires a password to authenticate.
+    authenticationMode :: AuthenticationMode,
+    -- | Access permissions string used for this user.
+    accessString :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateUser' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'createUser_tags' - A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+--
+-- 'userName', 'createUser_userName' - The name of the user. This value must be unique as it also serves as the
+-- user identifier.
+--
+-- 'authenticationMode', 'createUser_authenticationMode' - Denotes the user\'s authentication properties, such as whether it
+-- requires a password to authenticate.
+--
+-- 'accessString', 'createUser_accessString' - Access permissions string used for this user.
+newCreateUser ::
+  -- | 'userName'
+  Prelude.Text ->
+  -- | 'authenticationMode'
+  AuthenticationMode ->
+  -- | 'accessString'
+  Prelude.Text ->
+  CreateUser
+newCreateUser
+  pUserName_
+  pAuthenticationMode_
+  pAccessString_ =
+    CreateUser'
+      { tags = Prelude.Nothing,
+        userName = pUserName_,
+        authenticationMode = pAuthenticationMode_,
+        accessString = pAccessString_
+      }
+
+-- | A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+createUser_tags :: Lens.Lens' CreateUser (Prelude.Maybe [Tag])
+createUser_tags = Lens.lens (\CreateUser' {tags} -> tags) (\s@CreateUser' {} a -> s {tags = a} :: CreateUser) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the user. This value must be unique as it also serves as the
+-- user identifier.
+createUser_userName :: Lens.Lens' CreateUser Prelude.Text
+createUser_userName = Lens.lens (\CreateUser' {userName} -> userName) (\s@CreateUser' {} a -> s {userName = a} :: CreateUser)
+
+-- | Denotes the user\'s authentication properties, such as whether it
+-- requires a password to authenticate.
+createUser_authenticationMode :: Lens.Lens' CreateUser AuthenticationMode
+createUser_authenticationMode = Lens.lens (\CreateUser' {authenticationMode} -> authenticationMode) (\s@CreateUser' {} a -> s {authenticationMode = a} :: CreateUser)
+
+-- | Access permissions string used for this user.
+createUser_accessString :: Lens.Lens' CreateUser Prelude.Text
+createUser_accessString = Lens.lens (\CreateUser' {accessString} -> accessString) (\s@CreateUser' {} a -> s {accessString = a} :: CreateUser)
+
+instance Core.AWSRequest CreateUser where
+  type AWSResponse CreateUser = CreateUserResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateUserResponse'
+            Prelude.<$> (x Data..?> "User")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateUser where
+  hashWithSalt _salt CreateUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` userName
+      `Prelude.hashWithSalt` authenticationMode
+      `Prelude.hashWithSalt` accessString
+
+instance Prelude.NFData CreateUser where
+  rnf CreateUser' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf userName
+      `Prelude.seq` Prelude.rnf authenticationMode
+      `Prelude.seq` Prelude.rnf accessString
+
+instance Data.ToHeaders CreateUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("AmazonMemoryDB.CreateUser" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateUser where
+  toJSON CreateUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("UserName" Data..= userName),
+            Prelude.Just
+              ("AuthenticationMode" Data..= authenticationMode),
+            Prelude.Just ("AccessString" Data..= accessString)
+          ]
+      )
+
+instance Data.ToPath CreateUser where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateUserResponse' smart constructor.
+data CreateUserResponse = CreateUserResponse'
+  { -- | The newly-created user.
+    user :: Prelude.Maybe User,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateUserResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'user', 'createUserResponse_user' - The newly-created user.
+--
+-- 'httpStatus', 'createUserResponse_httpStatus' - The response's http status code.
+newCreateUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateUserResponse
+newCreateUserResponse pHttpStatus_ =
+  CreateUserResponse'
+    { user = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The newly-created user.
+createUserResponse_user :: Lens.Lens' CreateUserResponse (Prelude.Maybe User)
+createUserResponse_user = Lens.lens (\CreateUserResponse' {user} -> user) (\s@CreateUserResponse' {} a -> s {user = a} :: CreateUserResponse)
+
+-- | The response's http status code.
+createUserResponse_httpStatus :: Lens.Lens' CreateUserResponse Prelude.Int
+createUserResponse_httpStatus = Lens.lens (\CreateUserResponse' {httpStatus} -> httpStatus) (\s@CreateUserResponse' {} a -> s {httpStatus = a} :: CreateUserResponse)
+
+instance Prelude.NFData CreateUserResponse where
+  rnf CreateUserResponse' {..} =
+    Prelude.rnf user
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DeleteACL.hs b/gen/Amazonka/MemoryDb/DeleteACL.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DeleteACL.hs
@@ -0,0 +1,165 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DeleteACL
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an Access Control List. The ACL must first be disassociated from
+-- the cluster before it can be deleted. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/clusters.acls.html Authenticating users with Access Contol Lists (ACLs)>.
+module Amazonka.MemoryDb.DeleteACL
+  ( -- * Creating a Request
+    DeleteACL (..),
+    newDeleteACL,
+
+    -- * Request Lenses
+    deleteACL_aCLName,
+
+    -- * Destructuring the Response
+    DeleteACLResponse (..),
+    newDeleteACLResponse,
+
+    -- * Response Lenses
+    deleteACLResponse_acl,
+    deleteACLResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteACL' smart constructor.
+data DeleteACL = DeleteACL'
+  { -- | The name of the Access Control List to delete
+    aCLName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteACL' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aCLName', 'deleteACL_aCLName' - The name of the Access Control List to delete
+newDeleteACL ::
+  -- | 'aCLName'
+  Prelude.Text ->
+  DeleteACL
+newDeleteACL pACLName_ =
+  DeleteACL' {aCLName = pACLName_}
+
+-- | The name of the Access Control List to delete
+deleteACL_aCLName :: Lens.Lens' DeleteACL Prelude.Text
+deleteACL_aCLName = Lens.lens (\DeleteACL' {aCLName} -> aCLName) (\s@DeleteACL' {} a -> s {aCLName = a} :: DeleteACL)
+
+instance Core.AWSRequest DeleteACL where
+  type AWSResponse DeleteACL = DeleteACLResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteACLResponse'
+            Prelude.<$> (x Data..?> "ACL")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteACL where
+  hashWithSalt _salt DeleteACL' {..} =
+    _salt `Prelude.hashWithSalt` aCLName
+
+instance Prelude.NFData DeleteACL where
+  rnf DeleteACL' {..} = Prelude.rnf aCLName
+
+instance Data.ToHeaders DeleteACL where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("AmazonMemoryDB.DeleteACL" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteACL where
+  toJSON DeleteACL' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ACLName" Data..= aCLName)]
+      )
+
+instance Data.ToPath DeleteACL where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteACL where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteACLResponse' smart constructor.
+data DeleteACLResponse = DeleteACLResponse'
+  { -- | The Access Control List object that has been deleted.
+    acl :: Prelude.Maybe ACL,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteACLResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'acl', 'deleteACLResponse_acl' - The Access Control List object that has been deleted.
+--
+-- 'httpStatus', 'deleteACLResponse_httpStatus' - The response's http status code.
+newDeleteACLResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteACLResponse
+newDeleteACLResponse pHttpStatus_ =
+  DeleteACLResponse'
+    { acl = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Access Control List object that has been deleted.
+deleteACLResponse_acl :: Lens.Lens' DeleteACLResponse (Prelude.Maybe ACL)
+deleteACLResponse_acl = Lens.lens (\DeleteACLResponse' {acl} -> acl) (\s@DeleteACLResponse' {} a -> s {acl = a} :: DeleteACLResponse)
+
+-- | The response's http status code.
+deleteACLResponse_httpStatus :: Lens.Lens' DeleteACLResponse Prelude.Int
+deleteACLResponse_httpStatus = Lens.lens (\DeleteACLResponse' {httpStatus} -> httpStatus) (\s@DeleteACLResponse' {} a -> s {httpStatus = a} :: DeleteACLResponse)
+
+instance Prelude.NFData DeleteACLResponse where
+  rnf DeleteACLResponse' {..} =
+    Prelude.rnf acl
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DeleteCluster.hs b/gen/Amazonka/MemoryDb/DeleteCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DeleteCluster.hs
@@ -0,0 +1,193 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DeleteCluster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a cluster. It also deletes all associated nodes and node
+-- endpoints
+module Amazonka.MemoryDb.DeleteCluster
+  ( -- * Creating a Request
+    DeleteCluster (..),
+    newDeleteCluster,
+
+    -- * Request Lenses
+    deleteCluster_finalSnapshotName,
+    deleteCluster_clusterName,
+
+    -- * Destructuring the Response
+    DeleteClusterResponse (..),
+    newDeleteClusterResponse,
+
+    -- * Response Lenses
+    deleteClusterResponse_cluster,
+    deleteClusterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteCluster' smart constructor.
+data DeleteCluster = DeleteCluster'
+  { -- | The user-supplied name of a final cluster snapshot. This is the unique
+    -- name that identifies the snapshot. MemoryDB creates the snapshot, and
+    -- then deletes the cluster immediately afterward.
+    finalSnapshotName :: Prelude.Maybe Prelude.Text,
+    -- | The name of the cluster to be deleted
+    clusterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCluster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'finalSnapshotName', 'deleteCluster_finalSnapshotName' - The user-supplied name of a final cluster snapshot. This is the unique
+-- name that identifies the snapshot. MemoryDB creates the snapshot, and
+-- then deletes the cluster immediately afterward.
+--
+-- 'clusterName', 'deleteCluster_clusterName' - The name of the cluster to be deleted
+newDeleteCluster ::
+  -- | 'clusterName'
+  Prelude.Text ->
+  DeleteCluster
+newDeleteCluster pClusterName_ =
+  DeleteCluster'
+    { finalSnapshotName = Prelude.Nothing,
+      clusterName = pClusterName_
+    }
+
+-- | The user-supplied name of a final cluster snapshot. This is the unique
+-- name that identifies the snapshot. MemoryDB creates the snapshot, and
+-- then deletes the cluster immediately afterward.
+deleteCluster_finalSnapshotName :: Lens.Lens' DeleteCluster (Prelude.Maybe Prelude.Text)
+deleteCluster_finalSnapshotName = Lens.lens (\DeleteCluster' {finalSnapshotName} -> finalSnapshotName) (\s@DeleteCluster' {} a -> s {finalSnapshotName = a} :: DeleteCluster)
+
+-- | The name of the cluster to be deleted
+deleteCluster_clusterName :: Lens.Lens' DeleteCluster Prelude.Text
+deleteCluster_clusterName = Lens.lens (\DeleteCluster' {clusterName} -> clusterName) (\s@DeleteCluster' {} a -> s {clusterName = a} :: DeleteCluster)
+
+instance Core.AWSRequest DeleteCluster where
+  type
+    AWSResponse DeleteCluster =
+      DeleteClusterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteClusterResponse'
+            Prelude.<$> (x Data..?> "Cluster")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteCluster where
+  hashWithSalt _salt DeleteCluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` finalSnapshotName
+      `Prelude.hashWithSalt` clusterName
+
+instance Prelude.NFData DeleteCluster where
+  rnf DeleteCluster' {..} =
+    Prelude.rnf finalSnapshotName
+      `Prelude.seq` Prelude.rnf clusterName
+
+instance Data.ToHeaders DeleteCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DeleteCluster" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteCluster where
+  toJSON DeleteCluster' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("FinalSnapshotName" Data..=)
+              Prelude.<$> finalSnapshotName,
+            Prelude.Just ("ClusterName" Data..= clusterName)
+          ]
+      )
+
+instance Data.ToPath DeleteCluster where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteClusterResponse' smart constructor.
+data DeleteClusterResponse = DeleteClusterResponse'
+  { -- | The cluster object that has been deleted
+    cluster :: Prelude.Maybe Cluster,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteClusterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cluster', 'deleteClusterResponse_cluster' - The cluster object that has been deleted
+--
+-- 'httpStatus', 'deleteClusterResponse_httpStatus' - The response's http status code.
+newDeleteClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteClusterResponse
+newDeleteClusterResponse pHttpStatus_ =
+  DeleteClusterResponse'
+    { cluster = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The cluster object that has been deleted
+deleteClusterResponse_cluster :: Lens.Lens' DeleteClusterResponse (Prelude.Maybe Cluster)
+deleteClusterResponse_cluster = Lens.lens (\DeleteClusterResponse' {cluster} -> cluster) (\s@DeleteClusterResponse' {} a -> s {cluster = a} :: DeleteClusterResponse)
+
+-- | The response's http status code.
+deleteClusterResponse_httpStatus :: Lens.Lens' DeleteClusterResponse Prelude.Int
+deleteClusterResponse_httpStatus = Lens.lens (\DeleteClusterResponse' {httpStatus} -> httpStatus) (\s@DeleteClusterResponse' {} a -> s {httpStatus = a} :: DeleteClusterResponse)
+
+instance Prelude.NFData DeleteClusterResponse where
+  rnf DeleteClusterResponse' {..} =
+    Prelude.rnf cluster
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DeleteParameterGroup.hs b/gen/Amazonka/MemoryDb/DeleteParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DeleteParameterGroup.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DeleteParameterGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the specified parameter group. You cannot delete a parameter
+-- group if it is associated with any clusters. You cannot delete the
+-- default parameter groups in your account.
+module Amazonka.MemoryDb.DeleteParameterGroup
+  ( -- * Creating a Request
+    DeleteParameterGroup (..),
+    newDeleteParameterGroup,
+
+    -- * Request Lenses
+    deleteParameterGroup_parameterGroupName,
+
+    -- * Destructuring the Response
+    DeleteParameterGroupResponse (..),
+    newDeleteParameterGroupResponse,
+
+    -- * Response Lenses
+    deleteParameterGroupResponse_parameterGroup,
+    deleteParameterGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteParameterGroup' smart constructor.
+data DeleteParameterGroup = DeleteParameterGroup'
+  { -- | The name of the parameter group to delete.
+    parameterGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteParameterGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'parameterGroupName', 'deleteParameterGroup_parameterGroupName' - The name of the parameter group to delete.
+newDeleteParameterGroup ::
+  -- | 'parameterGroupName'
+  Prelude.Text ->
+  DeleteParameterGroup
+newDeleteParameterGroup pParameterGroupName_ =
+  DeleteParameterGroup'
+    { parameterGroupName =
+        pParameterGroupName_
+    }
+
+-- | The name of the parameter group to delete.
+deleteParameterGroup_parameterGroupName :: Lens.Lens' DeleteParameterGroup Prelude.Text
+deleteParameterGroup_parameterGroupName = Lens.lens (\DeleteParameterGroup' {parameterGroupName} -> parameterGroupName) (\s@DeleteParameterGroup' {} a -> s {parameterGroupName = a} :: DeleteParameterGroup)
+
+instance Core.AWSRequest DeleteParameterGroup where
+  type
+    AWSResponse DeleteParameterGroup =
+      DeleteParameterGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteParameterGroupResponse'
+            Prelude.<$> (x Data..?> "ParameterGroup")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteParameterGroup where
+  hashWithSalt _salt DeleteParameterGroup' {..} =
+    _salt `Prelude.hashWithSalt` parameterGroupName
+
+instance Prelude.NFData DeleteParameterGroup where
+  rnf DeleteParameterGroup' {..} =
+    Prelude.rnf parameterGroupName
+
+instance Data.ToHeaders DeleteParameterGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DeleteParameterGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteParameterGroup where
+  toJSON DeleteParameterGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("ParameterGroupName" Data..= parameterGroupName)
+          ]
+      )
+
+instance Data.ToPath DeleteParameterGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteParameterGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteParameterGroupResponse' smart constructor.
+data DeleteParameterGroupResponse = DeleteParameterGroupResponse'
+  { -- | The parameter group that has been deleted.
+    parameterGroup :: Prelude.Maybe ParameterGroup,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteParameterGroupResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'parameterGroup', 'deleteParameterGroupResponse_parameterGroup' - The parameter group that has been deleted.
+--
+-- 'httpStatus', 'deleteParameterGroupResponse_httpStatus' - The response's http status code.
+newDeleteParameterGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteParameterGroupResponse
+newDeleteParameterGroupResponse pHttpStatus_ =
+  DeleteParameterGroupResponse'
+    { parameterGroup =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The parameter group that has been deleted.
+deleteParameterGroupResponse_parameterGroup :: Lens.Lens' DeleteParameterGroupResponse (Prelude.Maybe ParameterGroup)
+deleteParameterGroupResponse_parameterGroup = Lens.lens (\DeleteParameterGroupResponse' {parameterGroup} -> parameterGroup) (\s@DeleteParameterGroupResponse' {} a -> s {parameterGroup = a} :: DeleteParameterGroupResponse)
+
+-- | The response's http status code.
+deleteParameterGroupResponse_httpStatus :: Lens.Lens' DeleteParameterGroupResponse Prelude.Int
+deleteParameterGroupResponse_httpStatus = Lens.lens (\DeleteParameterGroupResponse' {httpStatus} -> httpStatus) (\s@DeleteParameterGroupResponse' {} a -> s {httpStatus = a} :: DeleteParameterGroupResponse)
+
+instance Prelude.NFData DeleteParameterGroupResponse where
+  rnf DeleteParameterGroupResponse' {..} =
+    Prelude.rnf parameterGroup
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DeleteSnapshot.hs b/gen/Amazonka/MemoryDb/DeleteSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DeleteSnapshot.hs
@@ -0,0 +1,169 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DeleteSnapshot
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing snapshot. When you receive a successful response
+-- from this operation, MemoryDB immediately begins deleting the snapshot;
+-- you cannot cancel or revert this operation.
+module Amazonka.MemoryDb.DeleteSnapshot
+  ( -- * Creating a Request
+    DeleteSnapshot (..),
+    newDeleteSnapshot,
+
+    -- * Request Lenses
+    deleteSnapshot_snapshotName,
+
+    -- * Destructuring the Response
+    DeleteSnapshotResponse (..),
+    newDeleteSnapshotResponse,
+
+    -- * Response Lenses
+    deleteSnapshotResponse_snapshot,
+    deleteSnapshotResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteSnapshot' smart constructor.
+data DeleteSnapshot = DeleteSnapshot'
+  { -- | The name of the snapshot to delete
+    snapshotName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSnapshot' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'snapshotName', 'deleteSnapshot_snapshotName' - The name of the snapshot to delete
+newDeleteSnapshot ::
+  -- | 'snapshotName'
+  Prelude.Text ->
+  DeleteSnapshot
+newDeleteSnapshot pSnapshotName_ =
+  DeleteSnapshot' {snapshotName = pSnapshotName_}
+
+-- | The name of the snapshot to delete
+deleteSnapshot_snapshotName :: Lens.Lens' DeleteSnapshot Prelude.Text
+deleteSnapshot_snapshotName = Lens.lens (\DeleteSnapshot' {snapshotName} -> snapshotName) (\s@DeleteSnapshot' {} a -> s {snapshotName = a} :: DeleteSnapshot)
+
+instance Core.AWSRequest DeleteSnapshot where
+  type
+    AWSResponse DeleteSnapshot =
+      DeleteSnapshotResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteSnapshotResponse'
+            Prelude.<$> (x Data..?> "Snapshot")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteSnapshot where
+  hashWithSalt _salt DeleteSnapshot' {..} =
+    _salt `Prelude.hashWithSalt` snapshotName
+
+instance Prelude.NFData DeleteSnapshot where
+  rnf DeleteSnapshot' {..} = Prelude.rnf snapshotName
+
+instance Data.ToHeaders DeleteSnapshot where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DeleteSnapshot" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteSnapshot where
+  toJSON DeleteSnapshot' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("SnapshotName" Data..= snapshotName)]
+      )
+
+instance Data.ToPath DeleteSnapshot where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteSnapshot where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteSnapshotResponse' smart constructor.
+data DeleteSnapshotResponse = DeleteSnapshotResponse'
+  { -- | The snapshot object that has been deleted.
+    snapshot :: Prelude.Maybe Snapshot,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSnapshotResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'snapshot', 'deleteSnapshotResponse_snapshot' - The snapshot object that has been deleted.
+--
+-- 'httpStatus', 'deleteSnapshotResponse_httpStatus' - The response's http status code.
+newDeleteSnapshotResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteSnapshotResponse
+newDeleteSnapshotResponse pHttpStatus_ =
+  DeleteSnapshotResponse'
+    { snapshot = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The snapshot object that has been deleted.
+deleteSnapshotResponse_snapshot :: Lens.Lens' DeleteSnapshotResponse (Prelude.Maybe Snapshot)
+deleteSnapshotResponse_snapshot = Lens.lens (\DeleteSnapshotResponse' {snapshot} -> snapshot) (\s@DeleteSnapshotResponse' {} a -> s {snapshot = a} :: DeleteSnapshotResponse)
+
+-- | The response's http status code.
+deleteSnapshotResponse_httpStatus :: Lens.Lens' DeleteSnapshotResponse Prelude.Int
+deleteSnapshotResponse_httpStatus = Lens.lens (\DeleteSnapshotResponse' {httpStatus} -> httpStatus) (\s@DeleteSnapshotResponse' {} a -> s {httpStatus = a} :: DeleteSnapshotResponse)
+
+instance Prelude.NFData DeleteSnapshotResponse where
+  rnf DeleteSnapshotResponse' {..} =
+    Prelude.rnf snapshot
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DeleteSubnetGroup.hs b/gen/Amazonka/MemoryDb/DeleteSubnetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DeleteSubnetGroup.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DeleteSubnetGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a subnet group. You cannot delete a default subnet group or one
+-- that is associated with any clusters.
+module Amazonka.MemoryDb.DeleteSubnetGroup
+  ( -- * Creating a Request
+    DeleteSubnetGroup (..),
+    newDeleteSubnetGroup,
+
+    -- * Request Lenses
+    deleteSubnetGroup_subnetGroupName,
+
+    -- * Destructuring the Response
+    DeleteSubnetGroupResponse (..),
+    newDeleteSubnetGroupResponse,
+
+    -- * Response Lenses
+    deleteSubnetGroupResponse_subnetGroup,
+    deleteSubnetGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteSubnetGroup' smart constructor.
+data DeleteSubnetGroup = DeleteSubnetGroup'
+  { -- | The name of the subnet group to delete
+    subnetGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSubnetGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'subnetGroupName', 'deleteSubnetGroup_subnetGroupName' - The name of the subnet group to delete
+newDeleteSubnetGroup ::
+  -- | 'subnetGroupName'
+  Prelude.Text ->
+  DeleteSubnetGroup
+newDeleteSubnetGroup pSubnetGroupName_ =
+  DeleteSubnetGroup'
+    { subnetGroupName =
+        pSubnetGroupName_
+    }
+
+-- | The name of the subnet group to delete
+deleteSubnetGroup_subnetGroupName :: Lens.Lens' DeleteSubnetGroup Prelude.Text
+deleteSubnetGroup_subnetGroupName = Lens.lens (\DeleteSubnetGroup' {subnetGroupName} -> subnetGroupName) (\s@DeleteSubnetGroup' {} a -> s {subnetGroupName = a} :: DeleteSubnetGroup)
+
+instance Core.AWSRequest DeleteSubnetGroup where
+  type
+    AWSResponse DeleteSubnetGroup =
+      DeleteSubnetGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteSubnetGroupResponse'
+            Prelude.<$> (x Data..?> "SubnetGroup")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteSubnetGroup where
+  hashWithSalt _salt DeleteSubnetGroup' {..} =
+    _salt `Prelude.hashWithSalt` subnetGroupName
+
+instance Prelude.NFData DeleteSubnetGroup where
+  rnf DeleteSubnetGroup' {..} =
+    Prelude.rnf subnetGroupName
+
+instance Data.ToHeaders DeleteSubnetGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DeleteSubnetGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteSubnetGroup where
+  toJSON DeleteSubnetGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("SubnetGroupName" Data..= subnetGroupName)
+          ]
+      )
+
+instance Data.ToPath DeleteSubnetGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteSubnetGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteSubnetGroupResponse' smart constructor.
+data DeleteSubnetGroupResponse = DeleteSubnetGroupResponse'
+  { -- | The subnet group object that has been deleted.
+    subnetGroup :: Prelude.Maybe SubnetGroup,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSubnetGroupResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'subnetGroup', 'deleteSubnetGroupResponse_subnetGroup' - The subnet group object that has been deleted.
+--
+-- 'httpStatus', 'deleteSubnetGroupResponse_httpStatus' - The response's http status code.
+newDeleteSubnetGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteSubnetGroupResponse
+newDeleteSubnetGroupResponse pHttpStatus_ =
+  DeleteSubnetGroupResponse'
+    { subnetGroup =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The subnet group object that has been deleted.
+deleteSubnetGroupResponse_subnetGroup :: Lens.Lens' DeleteSubnetGroupResponse (Prelude.Maybe SubnetGroup)
+deleteSubnetGroupResponse_subnetGroup = Lens.lens (\DeleteSubnetGroupResponse' {subnetGroup} -> subnetGroup) (\s@DeleteSubnetGroupResponse' {} a -> s {subnetGroup = a} :: DeleteSubnetGroupResponse)
+
+-- | The response's http status code.
+deleteSubnetGroupResponse_httpStatus :: Lens.Lens' DeleteSubnetGroupResponse Prelude.Int
+deleteSubnetGroupResponse_httpStatus = Lens.lens (\DeleteSubnetGroupResponse' {httpStatus} -> httpStatus) (\s@DeleteSubnetGroupResponse' {} a -> s {httpStatus = a} :: DeleteSubnetGroupResponse)
+
+instance Prelude.NFData DeleteSubnetGroupResponse where
+  rnf DeleteSubnetGroupResponse' {..} =
+    Prelude.rnf subnetGroup
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DeleteUser.hs b/gen/Amazonka/MemoryDb/DeleteUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DeleteUser.hs
@@ -0,0 +1,164 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DeleteUser
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a user. The user will be removed from all ACLs and in turn
+-- removed from all clusters.
+module Amazonka.MemoryDb.DeleteUser
+  ( -- * Creating a Request
+    DeleteUser (..),
+    newDeleteUser,
+
+    -- * Request Lenses
+    deleteUser_userName,
+
+    -- * Destructuring the Response
+    DeleteUserResponse (..),
+    newDeleteUserResponse,
+
+    -- * Response Lenses
+    deleteUserResponse_user,
+    deleteUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteUser' smart constructor.
+data DeleteUser = DeleteUser'
+  { -- | The name of the user to delete
+    userName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteUser' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'userName', 'deleteUser_userName' - The name of the user to delete
+newDeleteUser ::
+  -- | 'userName'
+  Prelude.Text ->
+  DeleteUser
+newDeleteUser pUserName_ =
+  DeleteUser' {userName = pUserName_}
+
+-- | The name of the user to delete
+deleteUser_userName :: Lens.Lens' DeleteUser Prelude.Text
+deleteUser_userName = Lens.lens (\DeleteUser' {userName} -> userName) (\s@DeleteUser' {} a -> s {userName = a} :: DeleteUser)
+
+instance Core.AWSRequest DeleteUser where
+  type AWSResponse DeleteUser = DeleteUserResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteUserResponse'
+            Prelude.<$> (x Data..?> "User")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteUser where
+  hashWithSalt _salt DeleteUser' {..} =
+    _salt `Prelude.hashWithSalt` userName
+
+instance Prelude.NFData DeleteUser where
+  rnf DeleteUser' {..} = Prelude.rnf userName
+
+instance Data.ToHeaders DeleteUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("AmazonMemoryDB.DeleteUser" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteUser where
+  toJSON DeleteUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("UserName" Data..= userName)]
+      )
+
+instance Data.ToPath DeleteUser where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteUserResponse' smart constructor.
+data DeleteUserResponse = DeleteUserResponse'
+  { -- | The user object that has been deleted.
+    user :: Prelude.Maybe User,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteUserResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'user', 'deleteUserResponse_user' - The user object that has been deleted.
+--
+-- 'httpStatus', 'deleteUserResponse_httpStatus' - The response's http status code.
+newDeleteUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteUserResponse
+newDeleteUserResponse pHttpStatus_ =
+  DeleteUserResponse'
+    { user = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The user object that has been deleted.
+deleteUserResponse_user :: Lens.Lens' DeleteUserResponse (Prelude.Maybe User)
+deleteUserResponse_user = Lens.lens (\DeleteUserResponse' {user} -> user) (\s@DeleteUserResponse' {} a -> s {user = a} :: DeleteUserResponse)
+
+-- | The response's http status code.
+deleteUserResponse_httpStatus :: Lens.Lens' DeleteUserResponse Prelude.Int
+deleteUserResponse_httpStatus = Lens.lens (\DeleteUserResponse' {httpStatus} -> httpStatus) (\s@DeleteUserResponse' {} a -> s {httpStatus = a} :: DeleteUserResponse)
+
+instance Prelude.NFData DeleteUserResponse where
+  rnf DeleteUserResponse' {..} =
+    Prelude.rnf user
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeACLs.hs b/gen/Amazonka/MemoryDb/DescribeACLs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeACLs.hs
@@ -0,0 +1,257 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeACLs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of ACLs
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeACLs
+  ( -- * Creating a Request
+    DescribeACLs (..),
+    newDescribeACLs,
+
+    -- * Request Lenses
+    describeACLs_aCLName,
+    describeACLs_maxResults,
+    describeACLs_nextToken,
+
+    -- * Destructuring the Response
+    DescribeACLsResponse (..),
+    newDescribeACLsResponse,
+
+    -- * Response Lenses
+    describeACLsResponse_aCLs,
+    describeACLsResponse_nextToken,
+    describeACLsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeACLs' smart constructor.
+data DescribeACLs = DescribeACLs'
+  { -- | The name of the ACL
+    aCLName :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxResults value, a token is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeACLs' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aCLName', 'describeACLs_aCLName' - The name of the ACL
+--
+-- 'maxResults', 'describeACLs_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeACLs_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+newDescribeACLs ::
+  DescribeACLs
+newDescribeACLs =
+  DescribeACLs'
+    { aCLName = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The name of the ACL
+describeACLs_aCLName :: Lens.Lens' DescribeACLs (Prelude.Maybe Prelude.Text)
+describeACLs_aCLName = Lens.lens (\DescribeACLs' {aCLName} -> aCLName) (\s@DescribeACLs' {} a -> s {aCLName = a} :: DescribeACLs)
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+describeACLs_maxResults :: Lens.Lens' DescribeACLs (Prelude.Maybe Prelude.Int)
+describeACLs_maxResults = Lens.lens (\DescribeACLs' {maxResults} -> maxResults) (\s@DescribeACLs' {} a -> s {maxResults = a} :: DescribeACLs)
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeACLs_nextToken :: Lens.Lens' DescribeACLs (Prelude.Maybe Prelude.Text)
+describeACLs_nextToken = Lens.lens (\DescribeACLs' {nextToken} -> nextToken) (\s@DescribeACLs' {} a -> s {nextToken = a} :: DescribeACLs)
+
+instance Core.AWSPager DescribeACLs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeACLsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeACLsResponse_aCLs
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeACLs_nextToken
+          Lens..~ rs
+          Lens.^? describeACLsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeACLs where
+  type AWSResponse DescribeACLs = DescribeACLsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeACLsResponse'
+            Prelude.<$> (x Data..?> "ACLs" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeACLs where
+  hashWithSalt _salt DescribeACLs' {..} =
+    _salt
+      `Prelude.hashWithSalt` aCLName
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData DescribeACLs where
+  rnf DescribeACLs' {..} =
+    Prelude.rnf aCLName
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders DescribeACLs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeACLs" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeACLs where
+  toJSON DescribeACLs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ACLName" Data..=) Prelude.<$> aCLName,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath DescribeACLs where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeACLs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeACLsResponse' smart constructor.
+data DescribeACLsResponse = DescribeACLsResponse'
+  { -- | The list of ACLs
+    aCLs :: Prelude.Maybe [ACL],
+    -- | If nextToken is returned, there are more results available. The value of
+    -- nextToken is a unique pagination token for each page. Make the call
+    -- again using the returned token to retrieve the next page. Keep all other
+    -- arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeACLsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aCLs', 'describeACLsResponse_aCLs' - The list of ACLs
+--
+-- 'nextToken', 'describeACLsResponse_nextToken' - If nextToken is returned, there are more results available. The value of
+-- nextToken is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged.
+--
+-- 'httpStatus', 'describeACLsResponse_httpStatus' - The response's http status code.
+newDescribeACLsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeACLsResponse
+newDescribeACLsResponse pHttpStatus_ =
+  DescribeACLsResponse'
+    { aCLs = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of ACLs
+describeACLsResponse_aCLs :: Lens.Lens' DescribeACLsResponse (Prelude.Maybe [ACL])
+describeACLsResponse_aCLs = Lens.lens (\DescribeACLsResponse' {aCLs} -> aCLs) (\s@DescribeACLsResponse' {} a -> s {aCLs = a} :: DescribeACLsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If nextToken is returned, there are more results available. The value of
+-- nextToken is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged.
+describeACLsResponse_nextToken :: Lens.Lens' DescribeACLsResponse (Prelude.Maybe Prelude.Text)
+describeACLsResponse_nextToken = Lens.lens (\DescribeACLsResponse' {nextToken} -> nextToken) (\s@DescribeACLsResponse' {} a -> s {nextToken = a} :: DescribeACLsResponse)
+
+-- | The response's http status code.
+describeACLsResponse_httpStatus :: Lens.Lens' DescribeACLsResponse Prelude.Int
+describeACLsResponse_httpStatus = Lens.lens (\DescribeACLsResponse' {httpStatus} -> httpStatus) (\s@DescribeACLsResponse' {} a -> s {httpStatus = a} :: DescribeACLsResponse)
+
+instance Prelude.NFData DescribeACLsResponse where
+  rnf DescribeACLsResponse' {..} =
+    Prelude.rnf aCLs
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeClusters.hs b/gen/Amazonka/MemoryDb/DescribeClusters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeClusters.hs
@@ -0,0 +1,282 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeClusters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about all provisioned clusters if no cluster
+-- identifier is specified, or about a specific cluster if a cluster name
+-- is supplied.
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeClusters
+  ( -- * Creating a Request
+    DescribeClusters (..),
+    newDescribeClusters,
+
+    -- * Request Lenses
+    describeClusters_clusterName,
+    describeClusters_maxResults,
+    describeClusters_nextToken,
+    describeClusters_showShardDetails,
+
+    -- * Destructuring the Response
+    DescribeClustersResponse (..),
+    newDescribeClustersResponse,
+
+    -- * Response Lenses
+    describeClustersResponse_clusters,
+    describeClustersResponse_nextToken,
+    describeClustersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeClusters' smart constructor.
+data DescribeClusters = DescribeClusters'
+  { -- | The name of the cluster
+    clusterName :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxResults value, a token is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An optional flag that can be included in the request to retrieve
+    -- information about the individual shard(s).
+    showShardDetails :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeClusters' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterName', 'describeClusters_clusterName' - The name of the cluster
+--
+-- 'maxResults', 'describeClusters_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeClusters_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'showShardDetails', 'describeClusters_showShardDetails' - An optional flag that can be included in the request to retrieve
+-- information about the individual shard(s).
+newDescribeClusters ::
+  DescribeClusters
+newDescribeClusters =
+  DescribeClusters'
+    { clusterName = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      showShardDetails = Prelude.Nothing
+    }
+
+-- | The name of the cluster
+describeClusters_clusterName :: Lens.Lens' DescribeClusters (Prelude.Maybe Prelude.Text)
+describeClusters_clusterName = Lens.lens (\DescribeClusters' {clusterName} -> clusterName) (\s@DescribeClusters' {} a -> s {clusterName = a} :: DescribeClusters)
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+describeClusters_maxResults :: Lens.Lens' DescribeClusters (Prelude.Maybe Prelude.Int)
+describeClusters_maxResults = Lens.lens (\DescribeClusters' {maxResults} -> maxResults) (\s@DescribeClusters' {} a -> s {maxResults = a} :: DescribeClusters)
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeClusters_nextToken :: Lens.Lens' DescribeClusters (Prelude.Maybe Prelude.Text)
+describeClusters_nextToken = Lens.lens (\DescribeClusters' {nextToken} -> nextToken) (\s@DescribeClusters' {} a -> s {nextToken = a} :: DescribeClusters)
+
+-- | An optional flag that can be included in the request to retrieve
+-- information about the individual shard(s).
+describeClusters_showShardDetails :: Lens.Lens' DescribeClusters (Prelude.Maybe Prelude.Bool)
+describeClusters_showShardDetails = Lens.lens (\DescribeClusters' {showShardDetails} -> showShardDetails) (\s@DescribeClusters' {} a -> s {showShardDetails = a} :: DescribeClusters)
+
+instance Core.AWSPager DescribeClusters where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeClustersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeClustersResponse_clusters
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeClusters_nextToken
+          Lens..~ rs
+          Lens.^? describeClustersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeClusters where
+  type
+    AWSResponse DescribeClusters =
+      DescribeClustersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeClustersResponse'
+            Prelude.<$> (x Data..?> "Clusters" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeClusters where
+  hashWithSalt _salt DescribeClusters' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterName
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` showShardDetails
+
+instance Prelude.NFData DescribeClusters where
+  rnf DescribeClusters' {..} =
+    Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf showShardDetails
+
+instance Data.ToHeaders DescribeClusters where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeClusters" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeClusters where
+  toJSON DescribeClusters' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClusterName" Data..=) Prelude.<$> clusterName,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("ShowShardDetails" Data..=)
+              Prelude.<$> showShardDetails
+          ]
+      )
+
+instance Data.ToPath DescribeClusters where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeClusters where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeClustersResponse' smart constructor.
+data DescribeClustersResponse = DescribeClustersResponse'
+  { -- | A list of clusters
+    clusters :: Prelude.Maybe [Cluster],
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeClustersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusters', 'describeClustersResponse_clusters' - A list of clusters
+--
+-- 'nextToken', 'describeClustersResponse_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'httpStatus', 'describeClustersResponse_httpStatus' - The response's http status code.
+newDescribeClustersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeClustersResponse
+newDescribeClustersResponse pHttpStatus_ =
+  DescribeClustersResponse'
+    { clusters =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of clusters
+describeClustersResponse_clusters :: Lens.Lens' DescribeClustersResponse (Prelude.Maybe [Cluster])
+describeClustersResponse_clusters = Lens.lens (\DescribeClustersResponse' {clusters} -> clusters) (\s@DescribeClustersResponse' {} a -> s {clusters = a} :: DescribeClustersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeClustersResponse_nextToken :: Lens.Lens' DescribeClustersResponse (Prelude.Maybe Prelude.Text)
+describeClustersResponse_nextToken = Lens.lens (\DescribeClustersResponse' {nextToken} -> nextToken) (\s@DescribeClustersResponse' {} a -> s {nextToken = a} :: DescribeClustersResponse)
+
+-- | The response's http status code.
+describeClustersResponse_httpStatus :: Lens.Lens' DescribeClustersResponse Prelude.Int
+describeClustersResponse_httpStatus = Lens.lens (\DescribeClustersResponse' {httpStatus} -> httpStatus) (\s@DescribeClustersResponse' {} a -> s {httpStatus = a} :: DescribeClustersResponse)
+
+instance Prelude.NFData DescribeClustersResponse where
+  rnf DescribeClustersResponse' {..} =
+    Prelude.rnf clusters
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeEngineVersions.hs b/gen/Amazonka/MemoryDb/DescribeEngineVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeEngineVersions.hs
@@ -0,0 +1,300 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeEngineVersions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of the available Redis engine versions.
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeEngineVersions
+  ( -- * Creating a Request
+    DescribeEngineVersions (..),
+    newDescribeEngineVersions,
+
+    -- * Request Lenses
+    describeEngineVersions_defaultOnly,
+    describeEngineVersions_engineVersion,
+    describeEngineVersions_maxResults,
+    describeEngineVersions_nextToken,
+    describeEngineVersions_parameterGroupFamily,
+
+    -- * Destructuring the Response
+    DescribeEngineVersionsResponse (..),
+    newDescribeEngineVersionsResponse,
+
+    -- * Response Lenses
+    describeEngineVersionsResponse_engineVersions,
+    describeEngineVersionsResponse_nextToken,
+    describeEngineVersionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeEngineVersions' smart constructor.
+data DescribeEngineVersions = DescribeEngineVersions'
+  { -- | If true, specifies that only the default version of the specified engine
+    -- or engine and major version combination is to be returned.
+    defaultOnly :: Prelude.Maybe Prelude.Bool,
+    -- | The Redis engine version
+    engineVersion :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxResults value, a token is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of a specific parameter group family to return details for.
+    parameterGroupFamily :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEngineVersions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'defaultOnly', 'describeEngineVersions_defaultOnly' - If true, specifies that only the default version of the specified engine
+-- or engine and major version combination is to be returned.
+--
+-- 'engineVersion', 'describeEngineVersions_engineVersion' - The Redis engine version
+--
+-- 'maxResults', 'describeEngineVersions_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeEngineVersions_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'parameterGroupFamily', 'describeEngineVersions_parameterGroupFamily' - The name of a specific parameter group family to return details for.
+newDescribeEngineVersions ::
+  DescribeEngineVersions
+newDescribeEngineVersions =
+  DescribeEngineVersions'
+    { defaultOnly =
+        Prelude.Nothing,
+      engineVersion = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      parameterGroupFamily = Prelude.Nothing
+    }
+
+-- | If true, specifies that only the default version of the specified engine
+-- or engine and major version combination is to be returned.
+describeEngineVersions_defaultOnly :: Lens.Lens' DescribeEngineVersions (Prelude.Maybe Prelude.Bool)
+describeEngineVersions_defaultOnly = Lens.lens (\DescribeEngineVersions' {defaultOnly} -> defaultOnly) (\s@DescribeEngineVersions' {} a -> s {defaultOnly = a} :: DescribeEngineVersions)
+
+-- | The Redis engine version
+describeEngineVersions_engineVersion :: Lens.Lens' DescribeEngineVersions (Prelude.Maybe Prelude.Text)
+describeEngineVersions_engineVersion = Lens.lens (\DescribeEngineVersions' {engineVersion} -> engineVersion) (\s@DescribeEngineVersions' {} a -> s {engineVersion = a} :: DescribeEngineVersions)
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+describeEngineVersions_maxResults :: Lens.Lens' DescribeEngineVersions (Prelude.Maybe Prelude.Int)
+describeEngineVersions_maxResults = Lens.lens (\DescribeEngineVersions' {maxResults} -> maxResults) (\s@DescribeEngineVersions' {} a -> s {maxResults = a} :: DescribeEngineVersions)
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeEngineVersions_nextToken :: Lens.Lens' DescribeEngineVersions (Prelude.Maybe Prelude.Text)
+describeEngineVersions_nextToken = Lens.lens (\DescribeEngineVersions' {nextToken} -> nextToken) (\s@DescribeEngineVersions' {} a -> s {nextToken = a} :: DescribeEngineVersions)
+
+-- | The name of a specific parameter group family to return details for.
+describeEngineVersions_parameterGroupFamily :: Lens.Lens' DescribeEngineVersions (Prelude.Maybe Prelude.Text)
+describeEngineVersions_parameterGroupFamily = Lens.lens (\DescribeEngineVersions' {parameterGroupFamily} -> parameterGroupFamily) (\s@DescribeEngineVersions' {} a -> s {parameterGroupFamily = a} :: DescribeEngineVersions)
+
+instance Core.AWSPager DescribeEngineVersions where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeEngineVersionsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeEngineVersionsResponse_engineVersions
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeEngineVersions_nextToken
+          Lens..~ rs
+          Lens.^? describeEngineVersionsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeEngineVersions where
+  type
+    AWSResponse DescribeEngineVersions =
+      DescribeEngineVersionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeEngineVersionsResponse'
+            Prelude.<$> (x Data..?> "EngineVersions" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeEngineVersions where
+  hashWithSalt _salt DescribeEngineVersions' {..} =
+    _salt
+      `Prelude.hashWithSalt` defaultOnly
+      `Prelude.hashWithSalt` engineVersion
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` parameterGroupFamily
+
+instance Prelude.NFData DescribeEngineVersions where
+  rnf DescribeEngineVersions' {..} =
+    Prelude.rnf defaultOnly
+      `Prelude.seq` Prelude.rnf engineVersion
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf parameterGroupFamily
+
+instance Data.ToHeaders DescribeEngineVersions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeEngineVersions" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeEngineVersions where
+  toJSON DescribeEngineVersions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DefaultOnly" Data..=) Prelude.<$> defaultOnly,
+            ("EngineVersion" Data..=) Prelude.<$> engineVersion,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("ParameterGroupFamily" Data..=)
+              Prelude.<$> parameterGroupFamily
+          ]
+      )
+
+instance Data.ToPath DescribeEngineVersions where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeEngineVersions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeEngineVersionsResponse' smart constructor.
+data DescribeEngineVersionsResponse = DescribeEngineVersionsResponse'
+  { -- | A list of engine version details. Each element in the list contains
+    -- detailed information about one engine version.
+    engineVersions :: Prelude.Maybe [EngineVersionInfo],
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEngineVersionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'engineVersions', 'describeEngineVersionsResponse_engineVersions' - A list of engine version details. Each element in the list contains
+-- detailed information about one engine version.
+--
+-- 'nextToken', 'describeEngineVersionsResponse_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'httpStatus', 'describeEngineVersionsResponse_httpStatus' - The response's http status code.
+newDescribeEngineVersionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeEngineVersionsResponse
+newDescribeEngineVersionsResponse pHttpStatus_ =
+  DescribeEngineVersionsResponse'
+    { engineVersions =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of engine version details. Each element in the list contains
+-- detailed information about one engine version.
+describeEngineVersionsResponse_engineVersions :: Lens.Lens' DescribeEngineVersionsResponse (Prelude.Maybe [EngineVersionInfo])
+describeEngineVersionsResponse_engineVersions = Lens.lens (\DescribeEngineVersionsResponse' {engineVersions} -> engineVersions) (\s@DescribeEngineVersionsResponse' {} a -> s {engineVersions = a} :: DescribeEngineVersionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeEngineVersionsResponse_nextToken :: Lens.Lens' DescribeEngineVersionsResponse (Prelude.Maybe Prelude.Text)
+describeEngineVersionsResponse_nextToken = Lens.lens (\DescribeEngineVersionsResponse' {nextToken} -> nextToken) (\s@DescribeEngineVersionsResponse' {} a -> s {nextToken = a} :: DescribeEngineVersionsResponse)
+
+-- | The response's http status code.
+describeEngineVersionsResponse_httpStatus :: Lens.Lens' DescribeEngineVersionsResponse Prelude.Int
+describeEngineVersionsResponse_httpStatus = Lens.lens (\DescribeEngineVersionsResponse' {httpStatus} -> httpStatus) (\s@DescribeEngineVersionsResponse' {} a -> s {httpStatus = a} :: DescribeEngineVersionsResponse)
+
+instance
+  Prelude.NFData
+    DescribeEngineVersionsResponse
+  where
+  rnf DescribeEngineVersionsResponse' {..} =
+    Prelude.rnf engineVersions
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeEvents.hs b/gen/Amazonka/MemoryDb/DescribeEvents.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeEvents.hs
@@ -0,0 +1,333 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeEvents
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns events related to clusters, security groups, and parameter
+-- groups. You can obtain events specific to a particular cluster, security
+-- group, or parameter group by providing the name as a parameter. By
+-- default, only the events occurring within the last hour are returned;
+-- however, you can retrieve up to 14 days\' worth of events if necessary.
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeEvents
+  ( -- * Creating a Request
+    DescribeEvents (..),
+    newDescribeEvents,
+
+    -- * Request Lenses
+    describeEvents_duration,
+    describeEvents_endTime,
+    describeEvents_maxResults,
+    describeEvents_nextToken,
+    describeEvents_sourceName,
+    describeEvents_sourceType,
+    describeEvents_startTime,
+
+    -- * Destructuring the Response
+    DescribeEventsResponse (..),
+    newDescribeEventsResponse,
+
+    -- * Response Lenses
+    describeEventsResponse_events,
+    describeEventsResponse_nextToken,
+    describeEventsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeEvents' smart constructor.
+data DescribeEvents = DescribeEvents'
+  { -- | The number of minutes worth of events to retrieve.
+    duration :: Prelude.Maybe Prelude.Int,
+    -- | The end of the time interval for which to retrieve events, specified in
+    -- ISO 8601 format. Example: 2017-03-30T07:03:49.555Z
+    endTime :: Prelude.Maybe Data.POSIX,
+    -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxResults value, a token is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The identifier of the event source for which events are returned. If not
+    -- specified, all sources are included in the response.
+    sourceName :: Prelude.Maybe Prelude.Text,
+    -- | The event source to retrieve events for. If no value is specified, all
+    -- events are returned.
+    sourceType :: Prelude.Maybe SourceType,
+    -- | The beginning of the time interval to retrieve events for, specified in
+    -- ISO 8601 format. Example: 2017-03-30T07:03:49.555Z
+    startTime :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEvents' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'duration', 'describeEvents_duration' - The number of minutes worth of events to retrieve.
+--
+-- 'endTime', 'describeEvents_endTime' - The end of the time interval for which to retrieve events, specified in
+-- ISO 8601 format. Example: 2017-03-30T07:03:49.555Z
+--
+-- 'maxResults', 'describeEvents_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeEvents_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'sourceName', 'describeEvents_sourceName' - The identifier of the event source for which events are returned. If not
+-- specified, all sources are included in the response.
+--
+-- 'sourceType', 'describeEvents_sourceType' - The event source to retrieve events for. If no value is specified, all
+-- events are returned.
+--
+-- 'startTime', 'describeEvents_startTime' - The beginning of the time interval to retrieve events for, specified in
+-- ISO 8601 format. Example: 2017-03-30T07:03:49.555Z
+newDescribeEvents ::
+  DescribeEvents
+newDescribeEvents =
+  DescribeEvents'
+    { duration = Prelude.Nothing,
+      endTime = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      sourceName = Prelude.Nothing,
+      sourceType = Prelude.Nothing,
+      startTime = Prelude.Nothing
+    }
+
+-- | The number of minutes worth of events to retrieve.
+describeEvents_duration :: Lens.Lens' DescribeEvents (Prelude.Maybe Prelude.Int)
+describeEvents_duration = Lens.lens (\DescribeEvents' {duration} -> duration) (\s@DescribeEvents' {} a -> s {duration = a} :: DescribeEvents)
+
+-- | The end of the time interval for which to retrieve events, specified in
+-- ISO 8601 format. Example: 2017-03-30T07:03:49.555Z
+describeEvents_endTime :: Lens.Lens' DescribeEvents (Prelude.Maybe Prelude.UTCTime)
+describeEvents_endTime = Lens.lens (\DescribeEvents' {endTime} -> endTime) (\s@DescribeEvents' {} a -> s {endTime = a} :: DescribeEvents) Prelude.. Lens.mapping Data._Time
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+describeEvents_maxResults :: Lens.Lens' DescribeEvents (Prelude.Maybe Prelude.Int)
+describeEvents_maxResults = Lens.lens (\DescribeEvents' {maxResults} -> maxResults) (\s@DescribeEvents' {} a -> s {maxResults = a} :: DescribeEvents)
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeEvents_nextToken :: Lens.Lens' DescribeEvents (Prelude.Maybe Prelude.Text)
+describeEvents_nextToken = Lens.lens (\DescribeEvents' {nextToken} -> nextToken) (\s@DescribeEvents' {} a -> s {nextToken = a} :: DescribeEvents)
+
+-- | The identifier of the event source for which events are returned. If not
+-- specified, all sources are included in the response.
+describeEvents_sourceName :: Lens.Lens' DescribeEvents (Prelude.Maybe Prelude.Text)
+describeEvents_sourceName = Lens.lens (\DescribeEvents' {sourceName} -> sourceName) (\s@DescribeEvents' {} a -> s {sourceName = a} :: DescribeEvents)
+
+-- | The event source to retrieve events for. If no value is specified, all
+-- events are returned.
+describeEvents_sourceType :: Lens.Lens' DescribeEvents (Prelude.Maybe SourceType)
+describeEvents_sourceType = Lens.lens (\DescribeEvents' {sourceType} -> sourceType) (\s@DescribeEvents' {} a -> s {sourceType = a} :: DescribeEvents)
+
+-- | The beginning of the time interval to retrieve events for, specified in
+-- ISO 8601 format. Example: 2017-03-30T07:03:49.555Z
+describeEvents_startTime :: Lens.Lens' DescribeEvents (Prelude.Maybe Prelude.UTCTime)
+describeEvents_startTime = Lens.lens (\DescribeEvents' {startTime} -> startTime) (\s@DescribeEvents' {} a -> s {startTime = a} :: DescribeEvents) Prelude.. Lens.mapping Data._Time
+
+instance Core.AWSPager DescribeEvents where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeEventsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeEventsResponse_events
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeEvents_nextToken
+          Lens..~ rs
+          Lens.^? describeEventsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeEvents where
+  type
+    AWSResponse DescribeEvents =
+      DescribeEventsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeEventsResponse'
+            Prelude.<$> (x Data..?> "Events" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeEvents where
+  hashWithSalt _salt DescribeEvents' {..} =
+    _salt
+      `Prelude.hashWithSalt` duration
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` sourceName
+      `Prelude.hashWithSalt` sourceType
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData DescribeEvents where
+  rnf DescribeEvents' {..} =
+    Prelude.rnf duration
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf sourceName
+      `Prelude.seq` Prelude.rnf sourceType
+      `Prelude.seq` Prelude.rnf startTime
+
+instance Data.ToHeaders DescribeEvents where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeEvents" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeEvents where
+  toJSON DescribeEvents' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Duration" Data..=) Prelude.<$> duration,
+            ("EndTime" Data..=) Prelude.<$> endTime,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("SourceName" Data..=) Prelude.<$> sourceName,
+            ("SourceType" Data..=) Prelude.<$> sourceType,
+            ("StartTime" Data..=) Prelude.<$> startTime
+          ]
+      )
+
+instance Data.ToPath DescribeEvents where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeEvents where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeEventsResponse' smart constructor.
+data DescribeEventsResponse = DescribeEventsResponse'
+  { -- | A list of events. Each element in the list contains detailed information
+    -- about one event.
+    events :: Prelude.Maybe [Event],
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEventsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'events', 'describeEventsResponse_events' - A list of events. Each element in the list contains detailed information
+-- about one event.
+--
+-- 'nextToken', 'describeEventsResponse_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'httpStatus', 'describeEventsResponse_httpStatus' - The response's http status code.
+newDescribeEventsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeEventsResponse
+newDescribeEventsResponse pHttpStatus_ =
+  DescribeEventsResponse'
+    { events = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of events. Each element in the list contains detailed information
+-- about one event.
+describeEventsResponse_events :: Lens.Lens' DescribeEventsResponse (Prelude.Maybe [Event])
+describeEventsResponse_events = Lens.lens (\DescribeEventsResponse' {events} -> events) (\s@DescribeEventsResponse' {} a -> s {events = a} :: DescribeEventsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeEventsResponse_nextToken :: Lens.Lens' DescribeEventsResponse (Prelude.Maybe Prelude.Text)
+describeEventsResponse_nextToken = Lens.lens (\DescribeEventsResponse' {nextToken} -> nextToken) (\s@DescribeEventsResponse' {} a -> s {nextToken = a} :: DescribeEventsResponse)
+
+-- | The response's http status code.
+describeEventsResponse_httpStatus :: Lens.Lens' DescribeEventsResponse Prelude.Int
+describeEventsResponse_httpStatus = Lens.lens (\DescribeEventsResponse' {httpStatus} -> httpStatus) (\s@DescribeEventsResponse' {} a -> s {httpStatus = a} :: DescribeEventsResponse)
+
+instance Prelude.NFData DescribeEventsResponse where
+  rnf DescribeEventsResponse' {..} =
+    Prelude.rnf events
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeParameterGroups.hs b/gen/Amazonka/MemoryDb/DescribeParameterGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeParameterGroups.hs
@@ -0,0 +1,276 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeParameterGroups
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of parameter group descriptions. If a parameter group
+-- name is specified, the list contains only the descriptions for that
+-- group.
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeParameterGroups
+  ( -- * Creating a Request
+    DescribeParameterGroups (..),
+    newDescribeParameterGroups,
+
+    -- * Request Lenses
+    describeParameterGroups_maxResults,
+    describeParameterGroups_nextToken,
+    describeParameterGroups_parameterGroupName,
+
+    -- * Destructuring the Response
+    DescribeParameterGroupsResponse (..),
+    newDescribeParameterGroupsResponse,
+
+    -- * Response Lenses
+    describeParameterGroupsResponse_nextToken,
+    describeParameterGroupsResponse_parameterGroups,
+    describeParameterGroupsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeParameterGroups' smart constructor.
+data DescribeParameterGroups = DescribeParameterGroups'
+  { -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxResults value, a token is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of a specific parameter group to return details for.
+    parameterGroupName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeParameterGroups' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeParameterGroups_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeParameterGroups_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'parameterGroupName', 'describeParameterGroups_parameterGroupName' - The name of a specific parameter group to return details for.
+newDescribeParameterGroups ::
+  DescribeParameterGroups
+newDescribeParameterGroups =
+  DescribeParameterGroups'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      parameterGroupName = Prelude.Nothing
+    }
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+describeParameterGroups_maxResults :: Lens.Lens' DescribeParameterGroups (Prelude.Maybe Prelude.Int)
+describeParameterGroups_maxResults = Lens.lens (\DescribeParameterGroups' {maxResults} -> maxResults) (\s@DescribeParameterGroups' {} a -> s {maxResults = a} :: DescribeParameterGroups)
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeParameterGroups_nextToken :: Lens.Lens' DescribeParameterGroups (Prelude.Maybe Prelude.Text)
+describeParameterGroups_nextToken = Lens.lens (\DescribeParameterGroups' {nextToken} -> nextToken) (\s@DescribeParameterGroups' {} a -> s {nextToken = a} :: DescribeParameterGroups)
+
+-- | The name of a specific parameter group to return details for.
+describeParameterGroups_parameterGroupName :: Lens.Lens' DescribeParameterGroups (Prelude.Maybe Prelude.Text)
+describeParameterGroups_parameterGroupName = Lens.lens (\DescribeParameterGroups' {parameterGroupName} -> parameterGroupName) (\s@DescribeParameterGroups' {} a -> s {parameterGroupName = a} :: DescribeParameterGroups)
+
+instance Core.AWSPager DescribeParameterGroups where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeParameterGroupsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeParameterGroupsResponse_parameterGroups
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeParameterGroups_nextToken
+          Lens..~ rs
+          Lens.^? describeParameterGroupsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeParameterGroups where
+  type
+    AWSResponse DescribeParameterGroups =
+      DescribeParameterGroupsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeParameterGroupsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "ParameterGroups"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeParameterGroups where
+  hashWithSalt _salt DescribeParameterGroups' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` parameterGroupName
+
+instance Prelude.NFData DescribeParameterGroups where
+  rnf DescribeParameterGroups' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf parameterGroupName
+
+instance Data.ToHeaders DescribeParameterGroups where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeParameterGroups" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeParameterGroups where
+  toJSON DescribeParameterGroups' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("ParameterGroupName" Data..=)
+              Prelude.<$> parameterGroupName
+          ]
+      )
+
+instance Data.ToPath DescribeParameterGroups where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeParameterGroups where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeParameterGroupsResponse' smart constructor.
+data DescribeParameterGroupsResponse = DescribeParameterGroupsResponse'
+  { -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of parameter groups. Each element in the list contains detailed
+    -- information about one parameter group.
+    parameterGroups :: Prelude.Maybe [ParameterGroup],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeParameterGroupsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeParameterGroupsResponse_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'parameterGroups', 'describeParameterGroupsResponse_parameterGroups' - A list of parameter groups. Each element in the list contains detailed
+-- information about one parameter group.
+--
+-- 'httpStatus', 'describeParameterGroupsResponse_httpStatus' - The response's http status code.
+newDescribeParameterGroupsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeParameterGroupsResponse
+newDescribeParameterGroupsResponse pHttpStatus_ =
+  DescribeParameterGroupsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      parameterGroups = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeParameterGroupsResponse_nextToken :: Lens.Lens' DescribeParameterGroupsResponse (Prelude.Maybe Prelude.Text)
+describeParameterGroupsResponse_nextToken = Lens.lens (\DescribeParameterGroupsResponse' {nextToken} -> nextToken) (\s@DescribeParameterGroupsResponse' {} a -> s {nextToken = a} :: DescribeParameterGroupsResponse)
+
+-- | A list of parameter groups. Each element in the list contains detailed
+-- information about one parameter group.
+describeParameterGroupsResponse_parameterGroups :: Lens.Lens' DescribeParameterGroupsResponse (Prelude.Maybe [ParameterGroup])
+describeParameterGroupsResponse_parameterGroups = Lens.lens (\DescribeParameterGroupsResponse' {parameterGroups} -> parameterGroups) (\s@DescribeParameterGroupsResponse' {} a -> s {parameterGroups = a} :: DescribeParameterGroupsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeParameterGroupsResponse_httpStatus :: Lens.Lens' DescribeParameterGroupsResponse Prelude.Int
+describeParameterGroupsResponse_httpStatus = Lens.lens (\DescribeParameterGroupsResponse' {httpStatus} -> httpStatus) (\s@DescribeParameterGroupsResponse' {} a -> s {httpStatus = a} :: DescribeParameterGroupsResponse)
+
+instance
+  Prelude.NFData
+    DescribeParameterGroupsResponse
+  where
+  rnf DescribeParameterGroupsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf parameterGroups
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeParameters.hs b/gen/Amazonka/MemoryDb/DescribeParameters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeParameters.hs
@@ -0,0 +1,269 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeParameters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the detailed parameter list for a particular parameter group.
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeParameters
+  ( -- * Creating a Request
+    DescribeParameters (..),
+    newDescribeParameters,
+
+    -- * Request Lenses
+    describeParameters_maxResults,
+    describeParameters_nextToken,
+    describeParameters_parameterGroupName,
+
+    -- * Destructuring the Response
+    DescribeParametersResponse (..),
+    newDescribeParametersResponse,
+
+    -- * Response Lenses
+    describeParametersResponse_nextToken,
+    describeParametersResponse_parameters,
+    describeParametersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeParameters' smart constructor.
+data DescribeParameters = DescribeParameters'
+  { -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxResults value, a token is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | he name of a specific parameter group to return details for.
+    parameterGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeParameters' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeParameters_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeParameters_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'parameterGroupName', 'describeParameters_parameterGroupName' - he name of a specific parameter group to return details for.
+newDescribeParameters ::
+  -- | 'parameterGroupName'
+  Prelude.Text ->
+  DescribeParameters
+newDescribeParameters pParameterGroupName_ =
+  DescribeParameters'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      parameterGroupName = pParameterGroupName_
+    }
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+describeParameters_maxResults :: Lens.Lens' DescribeParameters (Prelude.Maybe Prelude.Int)
+describeParameters_maxResults = Lens.lens (\DescribeParameters' {maxResults} -> maxResults) (\s@DescribeParameters' {} a -> s {maxResults = a} :: DescribeParameters)
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeParameters_nextToken :: Lens.Lens' DescribeParameters (Prelude.Maybe Prelude.Text)
+describeParameters_nextToken = Lens.lens (\DescribeParameters' {nextToken} -> nextToken) (\s@DescribeParameters' {} a -> s {nextToken = a} :: DescribeParameters)
+
+-- | he name of a specific parameter group to return details for.
+describeParameters_parameterGroupName :: Lens.Lens' DescribeParameters Prelude.Text
+describeParameters_parameterGroupName = Lens.lens (\DescribeParameters' {parameterGroupName} -> parameterGroupName) (\s@DescribeParameters' {} a -> s {parameterGroupName = a} :: DescribeParameters)
+
+instance Core.AWSPager DescribeParameters where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeParametersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeParametersResponse_parameters
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeParameters_nextToken
+          Lens..~ rs
+          Lens.^? describeParametersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeParameters where
+  type
+    AWSResponse DescribeParameters =
+      DescribeParametersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeParametersResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Parameters" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeParameters where
+  hashWithSalt _salt DescribeParameters' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` parameterGroupName
+
+instance Prelude.NFData DescribeParameters where
+  rnf DescribeParameters' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf parameterGroupName
+
+instance Data.ToHeaders DescribeParameters where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeParameters" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeParameters where
+  toJSON DescribeParameters' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just
+              ("ParameterGroupName" Data..= parameterGroupName)
+          ]
+      )
+
+instance Data.ToPath DescribeParameters where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeParameters where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeParametersResponse' smart constructor.
+data DescribeParametersResponse = DescribeParametersResponse'
+  { -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of parameters specific to a particular parameter group. Each
+    -- element in the list contains detailed information about one parameter.
+    parameters :: Prelude.Maybe [Parameter],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeParametersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeParametersResponse_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'parameters', 'describeParametersResponse_parameters' - A list of parameters specific to a particular parameter group. Each
+-- element in the list contains detailed information about one parameter.
+--
+-- 'httpStatus', 'describeParametersResponse_httpStatus' - The response's http status code.
+newDescribeParametersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeParametersResponse
+newDescribeParametersResponse pHttpStatus_ =
+  DescribeParametersResponse'
+    { nextToken =
+        Prelude.Nothing,
+      parameters = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeParametersResponse_nextToken :: Lens.Lens' DescribeParametersResponse (Prelude.Maybe Prelude.Text)
+describeParametersResponse_nextToken = Lens.lens (\DescribeParametersResponse' {nextToken} -> nextToken) (\s@DescribeParametersResponse' {} a -> s {nextToken = a} :: DescribeParametersResponse)
+
+-- | A list of parameters specific to a particular parameter group. Each
+-- element in the list contains detailed information about one parameter.
+describeParametersResponse_parameters :: Lens.Lens' DescribeParametersResponse (Prelude.Maybe [Parameter])
+describeParametersResponse_parameters = Lens.lens (\DescribeParametersResponse' {parameters} -> parameters) (\s@DescribeParametersResponse' {} a -> s {parameters = a} :: DescribeParametersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeParametersResponse_httpStatus :: Lens.Lens' DescribeParametersResponse Prelude.Int
+describeParametersResponse_httpStatus = Lens.lens (\DescribeParametersResponse' {httpStatus} -> httpStatus) (\s@DescribeParametersResponse' {} a -> s {httpStatus = a} :: DescribeParametersResponse)
+
+instance Prelude.NFData DescribeParametersResponse where
+  rnf DescribeParametersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeReservedNodes.hs b/gen/Amazonka/MemoryDb/DescribeReservedNodes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeReservedNodes.hs
@@ -0,0 +1,335 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeReservedNodes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about reserved nodes for this account, or about a
+-- specified reserved node.
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeReservedNodes
+  ( -- * Creating a Request
+    DescribeReservedNodes (..),
+    newDescribeReservedNodes,
+
+    -- * Request Lenses
+    describeReservedNodes_duration,
+    describeReservedNodes_maxResults,
+    describeReservedNodes_nextToken,
+    describeReservedNodes_nodeType,
+    describeReservedNodes_offeringType,
+    describeReservedNodes_reservationId,
+    describeReservedNodes_reservedNodesOfferingId,
+
+    -- * Destructuring the Response
+    DescribeReservedNodesResponse (..),
+    newDescribeReservedNodesResponse,
+
+    -- * Response Lenses
+    describeReservedNodesResponse_nextToken,
+    describeReservedNodesResponse_reservedNodes,
+    describeReservedNodesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeReservedNodes' smart constructor.
+data DescribeReservedNodes = DescribeReservedNodes'
+  { -- | The duration filter value, specified in years or seconds. Use this
+    -- parameter to show only reservations for this duration.
+    duration :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxRecords value, a marker is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional marker returned from a prior request. Use this marker for
+    -- pagination of results from this operation. If this parameter is
+    -- specified, the response includes only records beyond the marker, up to
+    -- the value specified by MaxRecords.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The node type filter value. Use this parameter to show only those
+    -- reservations matching the specified node type. For more information, see
+    -- <https://docs.aws.amazon.com/memorydb/latest/devguide/nodes.reserved.html#reserved-nodes-supported Supported node types>.
+    nodeType :: Prelude.Maybe Prelude.Text,
+    -- | The offering type filter value. Use this parameter to show only the
+    -- available offerings matching the specified offering type. Valid values:
+    -- \"All Upfront\"|\"Partial Upfront\"| \"No Upfront\"
+    offeringType :: Prelude.Maybe Prelude.Text,
+    -- | The reserved node identifier filter value. Use this parameter to show
+    -- only the reservation that matches the specified reservation ID.
+    reservationId :: Prelude.Maybe Prelude.Text,
+    -- | The offering identifier filter value. Use this parameter to show only
+    -- purchased reservations matching the specified offering identifier.
+    reservedNodesOfferingId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeReservedNodes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'duration', 'describeReservedNodes_duration' - The duration filter value, specified in years or seconds. Use this
+-- parameter to show only reservations for this duration.
+--
+-- 'maxResults', 'describeReservedNodes_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxRecords value, a marker is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeReservedNodes_nextToken' - An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this operation. If this parameter is
+-- specified, the response includes only records beyond the marker, up to
+-- the value specified by MaxRecords.
+--
+-- 'nodeType', 'describeReservedNodes_nodeType' - The node type filter value. Use this parameter to show only those
+-- reservations matching the specified node type. For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/nodes.reserved.html#reserved-nodes-supported Supported node types>.
+--
+-- 'offeringType', 'describeReservedNodes_offeringType' - The offering type filter value. Use this parameter to show only the
+-- available offerings matching the specified offering type. Valid values:
+-- \"All Upfront\"|\"Partial Upfront\"| \"No Upfront\"
+--
+-- 'reservationId', 'describeReservedNodes_reservationId' - The reserved node identifier filter value. Use this parameter to show
+-- only the reservation that matches the specified reservation ID.
+--
+-- 'reservedNodesOfferingId', 'describeReservedNodes_reservedNodesOfferingId' - The offering identifier filter value. Use this parameter to show only
+-- purchased reservations matching the specified offering identifier.
+newDescribeReservedNodes ::
+  DescribeReservedNodes
+newDescribeReservedNodes =
+  DescribeReservedNodes'
+    { duration = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      nodeType = Prelude.Nothing,
+      offeringType = Prelude.Nothing,
+      reservationId = Prelude.Nothing,
+      reservedNodesOfferingId = Prelude.Nothing
+    }
+
+-- | The duration filter value, specified in years or seconds. Use this
+-- parameter to show only reservations for this duration.
+describeReservedNodes_duration :: Lens.Lens' DescribeReservedNodes (Prelude.Maybe Prelude.Text)
+describeReservedNodes_duration = Lens.lens (\DescribeReservedNodes' {duration} -> duration) (\s@DescribeReservedNodes' {} a -> s {duration = a} :: DescribeReservedNodes)
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxRecords value, a marker is included
+-- in the response so that the remaining results can be retrieved.
+describeReservedNodes_maxResults :: Lens.Lens' DescribeReservedNodes (Prelude.Maybe Prelude.Int)
+describeReservedNodes_maxResults = Lens.lens (\DescribeReservedNodes' {maxResults} -> maxResults) (\s@DescribeReservedNodes' {} a -> s {maxResults = a} :: DescribeReservedNodes)
+
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this operation. If this parameter is
+-- specified, the response includes only records beyond the marker, up to
+-- the value specified by MaxRecords.
+describeReservedNodes_nextToken :: Lens.Lens' DescribeReservedNodes (Prelude.Maybe Prelude.Text)
+describeReservedNodes_nextToken = Lens.lens (\DescribeReservedNodes' {nextToken} -> nextToken) (\s@DescribeReservedNodes' {} a -> s {nextToken = a} :: DescribeReservedNodes)
+
+-- | The node type filter value. Use this parameter to show only those
+-- reservations matching the specified node type. For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/nodes.reserved.html#reserved-nodes-supported Supported node types>.
+describeReservedNodes_nodeType :: Lens.Lens' DescribeReservedNodes (Prelude.Maybe Prelude.Text)
+describeReservedNodes_nodeType = Lens.lens (\DescribeReservedNodes' {nodeType} -> nodeType) (\s@DescribeReservedNodes' {} a -> s {nodeType = a} :: DescribeReservedNodes)
+
+-- | The offering type filter value. Use this parameter to show only the
+-- available offerings matching the specified offering type. Valid values:
+-- \"All Upfront\"|\"Partial Upfront\"| \"No Upfront\"
+describeReservedNodes_offeringType :: Lens.Lens' DescribeReservedNodes (Prelude.Maybe Prelude.Text)
+describeReservedNodes_offeringType = Lens.lens (\DescribeReservedNodes' {offeringType} -> offeringType) (\s@DescribeReservedNodes' {} a -> s {offeringType = a} :: DescribeReservedNodes)
+
+-- | The reserved node identifier filter value. Use this parameter to show
+-- only the reservation that matches the specified reservation ID.
+describeReservedNodes_reservationId :: Lens.Lens' DescribeReservedNodes (Prelude.Maybe Prelude.Text)
+describeReservedNodes_reservationId = Lens.lens (\DescribeReservedNodes' {reservationId} -> reservationId) (\s@DescribeReservedNodes' {} a -> s {reservationId = a} :: DescribeReservedNodes)
+
+-- | The offering identifier filter value. Use this parameter to show only
+-- purchased reservations matching the specified offering identifier.
+describeReservedNodes_reservedNodesOfferingId :: Lens.Lens' DescribeReservedNodes (Prelude.Maybe Prelude.Text)
+describeReservedNodes_reservedNodesOfferingId = Lens.lens (\DescribeReservedNodes' {reservedNodesOfferingId} -> reservedNodesOfferingId) (\s@DescribeReservedNodes' {} a -> s {reservedNodesOfferingId = a} :: DescribeReservedNodes)
+
+instance Core.AWSPager DescribeReservedNodes where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeReservedNodesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeReservedNodesResponse_reservedNodes
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeReservedNodes_nextToken
+          Lens..~ rs
+          Lens.^? describeReservedNodesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeReservedNodes where
+  type
+    AWSResponse DescribeReservedNodes =
+      DescribeReservedNodesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeReservedNodesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "ReservedNodes" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeReservedNodes where
+  hashWithSalt _salt DescribeReservedNodes' {..} =
+    _salt
+      `Prelude.hashWithSalt` duration
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` nodeType
+      `Prelude.hashWithSalt` offeringType
+      `Prelude.hashWithSalt` reservationId
+      `Prelude.hashWithSalt` reservedNodesOfferingId
+
+instance Prelude.NFData DescribeReservedNodes where
+  rnf DescribeReservedNodes' {..} =
+    Prelude.rnf duration
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf nodeType
+      `Prelude.seq` Prelude.rnf offeringType
+      `Prelude.seq` Prelude.rnf reservationId
+      `Prelude.seq` Prelude.rnf reservedNodesOfferingId
+
+instance Data.ToHeaders DescribeReservedNodes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeReservedNodes" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeReservedNodes where
+  toJSON DescribeReservedNodes' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Duration" Data..=) Prelude.<$> duration,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("NodeType" Data..=) Prelude.<$> nodeType,
+            ("OfferingType" Data..=) Prelude.<$> offeringType,
+            ("ReservationId" Data..=) Prelude.<$> reservationId,
+            ("ReservedNodesOfferingId" Data..=)
+              Prelude.<$> reservedNodesOfferingId
+          ]
+      )
+
+instance Data.ToPath DescribeReservedNodes where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeReservedNodes where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeReservedNodesResponse' smart constructor.
+data DescribeReservedNodesResponse = DescribeReservedNodesResponse'
+  { -- | An optional marker returned from a prior request. Use this marker for
+    -- pagination of results from this operation. If this parameter is
+    -- specified, the response includes only records beyond the marker, up to
+    -- the value specified by MaxRecords.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Returns information about reserved nodes for this account, or about a
+    -- specified reserved node.
+    reservedNodes :: Prelude.Maybe [ReservedNode],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeReservedNodesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeReservedNodesResponse_nextToken' - An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this operation. If this parameter is
+-- specified, the response includes only records beyond the marker, up to
+-- the value specified by MaxRecords.
+--
+-- 'reservedNodes', 'describeReservedNodesResponse_reservedNodes' - Returns information about reserved nodes for this account, or about a
+-- specified reserved node.
+--
+-- 'httpStatus', 'describeReservedNodesResponse_httpStatus' - The response's http status code.
+newDescribeReservedNodesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeReservedNodesResponse
+newDescribeReservedNodesResponse pHttpStatus_ =
+  DescribeReservedNodesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      reservedNodes = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this operation. If this parameter is
+-- specified, the response includes only records beyond the marker, up to
+-- the value specified by MaxRecords.
+describeReservedNodesResponse_nextToken :: Lens.Lens' DescribeReservedNodesResponse (Prelude.Maybe Prelude.Text)
+describeReservedNodesResponse_nextToken = Lens.lens (\DescribeReservedNodesResponse' {nextToken} -> nextToken) (\s@DescribeReservedNodesResponse' {} a -> s {nextToken = a} :: DescribeReservedNodesResponse)
+
+-- | Returns information about reserved nodes for this account, or about a
+-- specified reserved node.
+describeReservedNodesResponse_reservedNodes :: Lens.Lens' DescribeReservedNodesResponse (Prelude.Maybe [ReservedNode])
+describeReservedNodesResponse_reservedNodes = Lens.lens (\DescribeReservedNodesResponse' {reservedNodes} -> reservedNodes) (\s@DescribeReservedNodesResponse' {} a -> s {reservedNodes = a} :: DescribeReservedNodesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeReservedNodesResponse_httpStatus :: Lens.Lens' DescribeReservedNodesResponse Prelude.Int
+describeReservedNodesResponse_httpStatus = Lens.lens (\DescribeReservedNodesResponse' {httpStatus} -> httpStatus) (\s@DescribeReservedNodesResponse' {} a -> s {httpStatus = a} :: DescribeReservedNodesResponse)
+
+instance Prelude.NFData DescribeReservedNodesResponse where
+  rnf DescribeReservedNodesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf reservedNodes
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeReservedNodesOfferings.hs b/gen/Amazonka/MemoryDb/DescribeReservedNodesOfferings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeReservedNodesOfferings.hs
@@ -0,0 +1,338 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeReservedNodesOfferings
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists available reserved node offerings.
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeReservedNodesOfferings
+  ( -- * Creating a Request
+    DescribeReservedNodesOfferings (..),
+    newDescribeReservedNodesOfferings,
+
+    -- * Request Lenses
+    describeReservedNodesOfferings_duration,
+    describeReservedNodesOfferings_maxResults,
+    describeReservedNodesOfferings_nextToken,
+    describeReservedNodesOfferings_nodeType,
+    describeReservedNodesOfferings_offeringType,
+    describeReservedNodesOfferings_reservedNodesOfferingId,
+
+    -- * Destructuring the Response
+    DescribeReservedNodesOfferingsResponse (..),
+    newDescribeReservedNodesOfferingsResponse,
+
+    -- * Response Lenses
+    describeReservedNodesOfferingsResponse_nextToken,
+    describeReservedNodesOfferingsResponse_reservedNodesOfferings,
+    describeReservedNodesOfferingsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeReservedNodesOfferings' smart constructor.
+data DescribeReservedNodesOfferings = DescribeReservedNodesOfferings'
+  { -- | Duration filter value, specified in years or seconds. Use this parameter
+    -- to show only reservations for a given duration.
+    duration :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxRecords value, a marker is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional marker returned from a prior request. Use this marker for
+    -- pagination of results from this operation. If this parameter is
+    -- specified, the response includes only records beyond the marker, up to
+    -- the value specified by MaxRecords.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The node type for the reserved nodes. For more information, see
+    -- <https://docs.aws.amazon.com/memorydb/latest/devguide/nodes.reserved.html#reserved-nodes-supported Supported node types>.
+    nodeType :: Prelude.Maybe Prelude.Text,
+    -- | The offering type filter value. Use this parameter to show only the
+    -- available offerings matching the specified offering type. Valid values:
+    -- \"All Upfront\"|\"Partial Upfront\"| \"No Upfront\"
+    offeringType :: Prelude.Maybe Prelude.Text,
+    -- | The offering identifier filter value. Use this parameter to show only
+    -- the available offering that matches the specified reservation
+    -- identifier.
+    reservedNodesOfferingId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeReservedNodesOfferings' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'duration', 'describeReservedNodesOfferings_duration' - Duration filter value, specified in years or seconds. Use this parameter
+-- to show only reservations for a given duration.
+--
+-- 'maxResults', 'describeReservedNodesOfferings_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxRecords value, a marker is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeReservedNodesOfferings_nextToken' - An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this operation. If this parameter is
+-- specified, the response includes only records beyond the marker, up to
+-- the value specified by MaxRecords.
+--
+-- 'nodeType', 'describeReservedNodesOfferings_nodeType' - The node type for the reserved nodes. For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/nodes.reserved.html#reserved-nodes-supported Supported node types>.
+--
+-- 'offeringType', 'describeReservedNodesOfferings_offeringType' - The offering type filter value. Use this parameter to show only the
+-- available offerings matching the specified offering type. Valid values:
+-- \"All Upfront\"|\"Partial Upfront\"| \"No Upfront\"
+--
+-- 'reservedNodesOfferingId', 'describeReservedNodesOfferings_reservedNodesOfferingId' - The offering identifier filter value. Use this parameter to show only
+-- the available offering that matches the specified reservation
+-- identifier.
+newDescribeReservedNodesOfferings ::
+  DescribeReservedNodesOfferings
+newDescribeReservedNodesOfferings =
+  DescribeReservedNodesOfferings'
+    { duration =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      nodeType = Prelude.Nothing,
+      offeringType = Prelude.Nothing,
+      reservedNodesOfferingId = Prelude.Nothing
+    }
+
+-- | Duration filter value, specified in years or seconds. Use this parameter
+-- to show only reservations for a given duration.
+describeReservedNodesOfferings_duration :: Lens.Lens' DescribeReservedNodesOfferings (Prelude.Maybe Prelude.Text)
+describeReservedNodesOfferings_duration = Lens.lens (\DescribeReservedNodesOfferings' {duration} -> duration) (\s@DescribeReservedNodesOfferings' {} a -> s {duration = a} :: DescribeReservedNodesOfferings)
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxRecords value, a marker is included
+-- in the response so that the remaining results can be retrieved.
+describeReservedNodesOfferings_maxResults :: Lens.Lens' DescribeReservedNodesOfferings (Prelude.Maybe Prelude.Int)
+describeReservedNodesOfferings_maxResults = Lens.lens (\DescribeReservedNodesOfferings' {maxResults} -> maxResults) (\s@DescribeReservedNodesOfferings' {} a -> s {maxResults = a} :: DescribeReservedNodesOfferings)
+
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this operation. If this parameter is
+-- specified, the response includes only records beyond the marker, up to
+-- the value specified by MaxRecords.
+describeReservedNodesOfferings_nextToken :: Lens.Lens' DescribeReservedNodesOfferings (Prelude.Maybe Prelude.Text)
+describeReservedNodesOfferings_nextToken = Lens.lens (\DescribeReservedNodesOfferings' {nextToken} -> nextToken) (\s@DescribeReservedNodesOfferings' {} a -> s {nextToken = a} :: DescribeReservedNodesOfferings)
+
+-- | The node type for the reserved nodes. For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/nodes.reserved.html#reserved-nodes-supported Supported node types>.
+describeReservedNodesOfferings_nodeType :: Lens.Lens' DescribeReservedNodesOfferings (Prelude.Maybe Prelude.Text)
+describeReservedNodesOfferings_nodeType = Lens.lens (\DescribeReservedNodesOfferings' {nodeType} -> nodeType) (\s@DescribeReservedNodesOfferings' {} a -> s {nodeType = a} :: DescribeReservedNodesOfferings)
+
+-- | The offering type filter value. Use this parameter to show only the
+-- available offerings matching the specified offering type. Valid values:
+-- \"All Upfront\"|\"Partial Upfront\"| \"No Upfront\"
+describeReservedNodesOfferings_offeringType :: Lens.Lens' DescribeReservedNodesOfferings (Prelude.Maybe Prelude.Text)
+describeReservedNodesOfferings_offeringType = Lens.lens (\DescribeReservedNodesOfferings' {offeringType} -> offeringType) (\s@DescribeReservedNodesOfferings' {} a -> s {offeringType = a} :: DescribeReservedNodesOfferings)
+
+-- | The offering identifier filter value. Use this parameter to show only
+-- the available offering that matches the specified reservation
+-- identifier.
+describeReservedNodesOfferings_reservedNodesOfferingId :: Lens.Lens' DescribeReservedNodesOfferings (Prelude.Maybe Prelude.Text)
+describeReservedNodesOfferings_reservedNodesOfferingId = Lens.lens (\DescribeReservedNodesOfferings' {reservedNodesOfferingId} -> reservedNodesOfferingId) (\s@DescribeReservedNodesOfferings' {} a -> s {reservedNodesOfferingId = a} :: DescribeReservedNodesOfferings)
+
+instance Core.AWSPager DescribeReservedNodesOfferings where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeReservedNodesOfferingsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeReservedNodesOfferingsResponse_reservedNodesOfferings
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeReservedNodesOfferings_nextToken
+          Lens..~ rs
+          Lens.^? describeReservedNodesOfferingsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance
+  Core.AWSRequest
+    DescribeReservedNodesOfferings
+  where
+  type
+    AWSResponse DescribeReservedNodesOfferings =
+      DescribeReservedNodesOfferingsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeReservedNodesOfferingsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "ReservedNodesOfferings"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DescribeReservedNodesOfferings
+  where
+  hashWithSalt
+    _salt
+    DescribeReservedNodesOfferings' {..} =
+      _salt
+        `Prelude.hashWithSalt` duration
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` nodeType
+        `Prelude.hashWithSalt` offeringType
+        `Prelude.hashWithSalt` reservedNodesOfferingId
+
+instance
+  Prelude.NFData
+    DescribeReservedNodesOfferings
+  where
+  rnf DescribeReservedNodesOfferings' {..} =
+    Prelude.rnf duration
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf nodeType
+      `Prelude.seq` Prelude.rnf offeringType
+      `Prelude.seq` Prelude.rnf reservedNodesOfferingId
+
+instance
+  Data.ToHeaders
+    DescribeReservedNodesOfferings
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeReservedNodesOfferings" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeReservedNodesOfferings where
+  toJSON DescribeReservedNodesOfferings' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Duration" Data..=) Prelude.<$> duration,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("NodeType" Data..=) Prelude.<$> nodeType,
+            ("OfferingType" Data..=) Prelude.<$> offeringType,
+            ("ReservedNodesOfferingId" Data..=)
+              Prelude.<$> reservedNodesOfferingId
+          ]
+      )
+
+instance Data.ToPath DescribeReservedNodesOfferings where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeReservedNodesOfferings where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeReservedNodesOfferingsResponse' smart constructor.
+data DescribeReservedNodesOfferingsResponse = DescribeReservedNodesOfferingsResponse'
+  { -- | An optional marker returned from a prior request. Use this marker for
+    -- pagination of results from this operation. If this parameter is
+    -- specified, the response includes only records beyond the marker, up to
+    -- the value specified by MaxRecords.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Lists available reserved node offerings.
+    reservedNodesOfferings :: Prelude.Maybe [ReservedNodesOffering],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeReservedNodesOfferingsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeReservedNodesOfferingsResponse_nextToken' - An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this operation. If this parameter is
+-- specified, the response includes only records beyond the marker, up to
+-- the value specified by MaxRecords.
+--
+-- 'reservedNodesOfferings', 'describeReservedNodesOfferingsResponse_reservedNodesOfferings' - Lists available reserved node offerings.
+--
+-- 'httpStatus', 'describeReservedNodesOfferingsResponse_httpStatus' - The response's http status code.
+newDescribeReservedNodesOfferingsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeReservedNodesOfferingsResponse
+newDescribeReservedNodesOfferingsResponse
+  pHttpStatus_ =
+    DescribeReservedNodesOfferingsResponse'
+      { nextToken =
+          Prelude.Nothing,
+        reservedNodesOfferings =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this operation. If this parameter is
+-- specified, the response includes only records beyond the marker, up to
+-- the value specified by MaxRecords.
+describeReservedNodesOfferingsResponse_nextToken :: Lens.Lens' DescribeReservedNodesOfferingsResponse (Prelude.Maybe Prelude.Text)
+describeReservedNodesOfferingsResponse_nextToken = Lens.lens (\DescribeReservedNodesOfferingsResponse' {nextToken} -> nextToken) (\s@DescribeReservedNodesOfferingsResponse' {} a -> s {nextToken = a} :: DescribeReservedNodesOfferingsResponse)
+
+-- | Lists available reserved node offerings.
+describeReservedNodesOfferingsResponse_reservedNodesOfferings :: Lens.Lens' DescribeReservedNodesOfferingsResponse (Prelude.Maybe [ReservedNodesOffering])
+describeReservedNodesOfferingsResponse_reservedNodesOfferings = Lens.lens (\DescribeReservedNodesOfferingsResponse' {reservedNodesOfferings} -> reservedNodesOfferings) (\s@DescribeReservedNodesOfferingsResponse' {} a -> s {reservedNodesOfferings = a} :: DescribeReservedNodesOfferingsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeReservedNodesOfferingsResponse_httpStatus :: Lens.Lens' DescribeReservedNodesOfferingsResponse Prelude.Int
+describeReservedNodesOfferingsResponse_httpStatus = Lens.lens (\DescribeReservedNodesOfferingsResponse' {httpStatus} -> httpStatus) (\s@DescribeReservedNodesOfferingsResponse' {} a -> s {httpStatus = a} :: DescribeReservedNodesOfferingsResponse)
+
+instance
+  Prelude.NFData
+    DescribeReservedNodesOfferingsResponse
+  where
+  rnf DescribeReservedNodesOfferingsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf reservedNodesOfferings
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeServiceUpdates.hs b/gen/Amazonka/MemoryDb/DescribeServiceUpdates.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeServiceUpdates.hs
@@ -0,0 +1,294 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeServiceUpdates
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns details of the service updates
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeServiceUpdates
+  ( -- * Creating a Request
+    DescribeServiceUpdates (..),
+    newDescribeServiceUpdates,
+
+    -- * Request Lenses
+    describeServiceUpdates_clusterNames,
+    describeServiceUpdates_maxResults,
+    describeServiceUpdates_nextToken,
+    describeServiceUpdates_serviceUpdateName,
+    describeServiceUpdates_status,
+
+    -- * Destructuring the Response
+    DescribeServiceUpdatesResponse (..),
+    newDescribeServiceUpdatesResponse,
+
+    -- * Response Lenses
+    describeServiceUpdatesResponse_nextToken,
+    describeServiceUpdatesResponse_serviceUpdates,
+    describeServiceUpdatesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeServiceUpdates' smart constructor.
+data DescribeServiceUpdates = DescribeServiceUpdates'
+  { -- | The list of cluster names to identify service updates to apply
+    clusterNames :: Prelude.Maybe [Prelude.Text],
+    -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxResults value, a token is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique ID of the service update to describe.
+    serviceUpdateName :: Prelude.Maybe Prelude.Text,
+    -- | The status(es) of the service updates to filter on
+    status :: Prelude.Maybe [ServiceUpdateStatus]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeServiceUpdates' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterNames', 'describeServiceUpdates_clusterNames' - The list of cluster names to identify service updates to apply
+--
+-- 'maxResults', 'describeServiceUpdates_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeServiceUpdates_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'serviceUpdateName', 'describeServiceUpdates_serviceUpdateName' - The unique ID of the service update to describe.
+--
+-- 'status', 'describeServiceUpdates_status' - The status(es) of the service updates to filter on
+newDescribeServiceUpdates ::
+  DescribeServiceUpdates
+newDescribeServiceUpdates =
+  DescribeServiceUpdates'
+    { clusterNames =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      serviceUpdateName = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The list of cluster names to identify service updates to apply
+describeServiceUpdates_clusterNames :: Lens.Lens' DescribeServiceUpdates (Prelude.Maybe [Prelude.Text])
+describeServiceUpdates_clusterNames = Lens.lens (\DescribeServiceUpdates' {clusterNames} -> clusterNames) (\s@DescribeServiceUpdates' {} a -> s {clusterNames = a} :: DescribeServiceUpdates) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+describeServiceUpdates_maxResults :: Lens.Lens' DescribeServiceUpdates (Prelude.Maybe Prelude.Int)
+describeServiceUpdates_maxResults = Lens.lens (\DescribeServiceUpdates' {maxResults} -> maxResults) (\s@DescribeServiceUpdates' {} a -> s {maxResults = a} :: DescribeServiceUpdates)
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeServiceUpdates_nextToken :: Lens.Lens' DescribeServiceUpdates (Prelude.Maybe Prelude.Text)
+describeServiceUpdates_nextToken = Lens.lens (\DescribeServiceUpdates' {nextToken} -> nextToken) (\s@DescribeServiceUpdates' {} a -> s {nextToken = a} :: DescribeServiceUpdates)
+
+-- | The unique ID of the service update to describe.
+describeServiceUpdates_serviceUpdateName :: Lens.Lens' DescribeServiceUpdates (Prelude.Maybe Prelude.Text)
+describeServiceUpdates_serviceUpdateName = Lens.lens (\DescribeServiceUpdates' {serviceUpdateName} -> serviceUpdateName) (\s@DescribeServiceUpdates' {} a -> s {serviceUpdateName = a} :: DescribeServiceUpdates)
+
+-- | The status(es) of the service updates to filter on
+describeServiceUpdates_status :: Lens.Lens' DescribeServiceUpdates (Prelude.Maybe [ServiceUpdateStatus])
+describeServiceUpdates_status = Lens.lens (\DescribeServiceUpdates' {status} -> status) (\s@DescribeServiceUpdates' {} a -> s {status = a} :: DescribeServiceUpdates) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSPager DescribeServiceUpdates where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeServiceUpdatesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeServiceUpdatesResponse_serviceUpdates
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeServiceUpdates_nextToken
+          Lens..~ rs
+          Lens.^? describeServiceUpdatesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeServiceUpdates where
+  type
+    AWSResponse DescribeServiceUpdates =
+      DescribeServiceUpdatesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeServiceUpdatesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "ServiceUpdates" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeServiceUpdates where
+  hashWithSalt _salt DescribeServiceUpdates' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterNames
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` serviceUpdateName
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DescribeServiceUpdates where
+  rnf DescribeServiceUpdates' {..} =
+    Prelude.rnf clusterNames
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf serviceUpdateName
+      `Prelude.seq` Prelude.rnf status
+
+instance Data.ToHeaders DescribeServiceUpdates where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeServiceUpdates" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeServiceUpdates where
+  toJSON DescribeServiceUpdates' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClusterNames" Data..=) Prelude.<$> clusterNames,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("ServiceUpdateName" Data..=)
+              Prelude.<$> serviceUpdateName,
+            ("Status" Data..=) Prelude.<$> status
+          ]
+      )
+
+instance Data.ToPath DescribeServiceUpdates where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeServiceUpdates where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeServiceUpdatesResponse' smart constructor.
+data DescribeServiceUpdatesResponse = DescribeServiceUpdatesResponse'
+  { -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of service updates
+    serviceUpdates :: Prelude.Maybe [ServiceUpdate],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeServiceUpdatesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeServiceUpdatesResponse_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'serviceUpdates', 'describeServiceUpdatesResponse_serviceUpdates' - A list of service updates
+--
+-- 'httpStatus', 'describeServiceUpdatesResponse_httpStatus' - The response's http status code.
+newDescribeServiceUpdatesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeServiceUpdatesResponse
+newDescribeServiceUpdatesResponse pHttpStatus_ =
+  DescribeServiceUpdatesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      serviceUpdates = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeServiceUpdatesResponse_nextToken :: Lens.Lens' DescribeServiceUpdatesResponse (Prelude.Maybe Prelude.Text)
+describeServiceUpdatesResponse_nextToken = Lens.lens (\DescribeServiceUpdatesResponse' {nextToken} -> nextToken) (\s@DescribeServiceUpdatesResponse' {} a -> s {nextToken = a} :: DescribeServiceUpdatesResponse)
+
+-- | A list of service updates
+describeServiceUpdatesResponse_serviceUpdates :: Lens.Lens' DescribeServiceUpdatesResponse (Prelude.Maybe [ServiceUpdate])
+describeServiceUpdatesResponse_serviceUpdates = Lens.lens (\DescribeServiceUpdatesResponse' {serviceUpdates} -> serviceUpdates) (\s@DescribeServiceUpdatesResponse' {} a -> s {serviceUpdates = a} :: DescribeServiceUpdatesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeServiceUpdatesResponse_httpStatus :: Lens.Lens' DescribeServiceUpdatesResponse Prelude.Int
+describeServiceUpdatesResponse_httpStatus = Lens.lens (\DescribeServiceUpdatesResponse' {httpStatus} -> httpStatus) (\s@DescribeServiceUpdatesResponse' {} a -> s {httpStatus = a} :: DescribeServiceUpdatesResponse)
+
+instance
+  Prelude.NFData
+    DescribeServiceUpdatesResponse
+  where
+  rnf DescribeServiceUpdatesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf serviceUpdates
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeSnapshots.hs b/gen/Amazonka/MemoryDb/DescribeSnapshots.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeSnapshots.hs
@@ -0,0 +1,326 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeSnapshots
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about cluster snapshots. By default,
+-- DescribeSnapshots lists all of your snapshots; it can optionally
+-- describe a single snapshot, or just the snapshots associated with a
+-- particular cluster.
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeSnapshots
+  ( -- * Creating a Request
+    DescribeSnapshots (..),
+    newDescribeSnapshots,
+
+    -- * Request Lenses
+    describeSnapshots_clusterName,
+    describeSnapshots_maxResults,
+    describeSnapshots_nextToken,
+    describeSnapshots_showDetail,
+    describeSnapshots_snapshotName,
+    describeSnapshots_source,
+
+    -- * Destructuring the Response
+    DescribeSnapshotsResponse (..),
+    newDescribeSnapshotsResponse,
+
+    -- * Response Lenses
+    describeSnapshotsResponse_nextToken,
+    describeSnapshotsResponse_snapshots,
+    describeSnapshotsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeSnapshots' smart constructor.
+data DescribeSnapshots = DescribeSnapshots'
+  { -- | A user-supplied cluster identifier. If this parameter is specified, only
+    -- snapshots associated with that specific cluster are described.
+    clusterName :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxResults value, a token is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A Boolean value which if true, the shard configuration is included in
+    -- the snapshot description.
+    showDetail :: Prelude.Maybe Prelude.Bool,
+    -- | A user-supplied name of the snapshot. If this parameter is specified,
+    -- only this named snapshot is described.
+    snapshotName :: Prelude.Maybe Prelude.Text,
+    -- | If set to system, the output shows snapshots that were automatically
+    -- created by MemoryDB. If set to user the output shows snapshots that were
+    -- manually created. If omitted, the output shows both automatically and
+    -- manually created snapshots.
+    source :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSnapshots' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterName', 'describeSnapshots_clusterName' - A user-supplied cluster identifier. If this parameter is specified, only
+-- snapshots associated with that specific cluster are described.
+--
+-- 'maxResults', 'describeSnapshots_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeSnapshots_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'showDetail', 'describeSnapshots_showDetail' - A Boolean value which if true, the shard configuration is included in
+-- the snapshot description.
+--
+-- 'snapshotName', 'describeSnapshots_snapshotName' - A user-supplied name of the snapshot. If this parameter is specified,
+-- only this named snapshot is described.
+--
+-- 'source', 'describeSnapshots_source' - If set to system, the output shows snapshots that were automatically
+-- created by MemoryDB. If set to user the output shows snapshots that were
+-- manually created. If omitted, the output shows both automatically and
+-- manually created snapshots.
+newDescribeSnapshots ::
+  DescribeSnapshots
+newDescribeSnapshots =
+  DescribeSnapshots'
+    { clusterName = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      showDetail = Prelude.Nothing,
+      snapshotName = Prelude.Nothing,
+      source = Prelude.Nothing
+    }
+
+-- | A user-supplied cluster identifier. If this parameter is specified, only
+-- snapshots associated with that specific cluster are described.
+describeSnapshots_clusterName :: Lens.Lens' DescribeSnapshots (Prelude.Maybe Prelude.Text)
+describeSnapshots_clusterName = Lens.lens (\DescribeSnapshots' {clusterName} -> clusterName) (\s@DescribeSnapshots' {} a -> s {clusterName = a} :: DescribeSnapshots)
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+describeSnapshots_maxResults :: Lens.Lens' DescribeSnapshots (Prelude.Maybe Prelude.Int)
+describeSnapshots_maxResults = Lens.lens (\DescribeSnapshots' {maxResults} -> maxResults) (\s@DescribeSnapshots' {} a -> s {maxResults = a} :: DescribeSnapshots)
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeSnapshots_nextToken :: Lens.Lens' DescribeSnapshots (Prelude.Maybe Prelude.Text)
+describeSnapshots_nextToken = Lens.lens (\DescribeSnapshots' {nextToken} -> nextToken) (\s@DescribeSnapshots' {} a -> s {nextToken = a} :: DescribeSnapshots)
+
+-- | A Boolean value which if true, the shard configuration is included in
+-- the snapshot description.
+describeSnapshots_showDetail :: Lens.Lens' DescribeSnapshots (Prelude.Maybe Prelude.Bool)
+describeSnapshots_showDetail = Lens.lens (\DescribeSnapshots' {showDetail} -> showDetail) (\s@DescribeSnapshots' {} a -> s {showDetail = a} :: DescribeSnapshots)
+
+-- | A user-supplied name of the snapshot. If this parameter is specified,
+-- only this named snapshot is described.
+describeSnapshots_snapshotName :: Lens.Lens' DescribeSnapshots (Prelude.Maybe Prelude.Text)
+describeSnapshots_snapshotName = Lens.lens (\DescribeSnapshots' {snapshotName} -> snapshotName) (\s@DescribeSnapshots' {} a -> s {snapshotName = a} :: DescribeSnapshots)
+
+-- | If set to system, the output shows snapshots that were automatically
+-- created by MemoryDB. If set to user the output shows snapshots that were
+-- manually created. If omitted, the output shows both automatically and
+-- manually created snapshots.
+describeSnapshots_source :: Lens.Lens' DescribeSnapshots (Prelude.Maybe Prelude.Text)
+describeSnapshots_source = Lens.lens (\DescribeSnapshots' {source} -> source) (\s@DescribeSnapshots' {} a -> s {source = a} :: DescribeSnapshots)
+
+instance Core.AWSPager DescribeSnapshots where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeSnapshotsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeSnapshotsResponse_snapshots
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeSnapshots_nextToken
+          Lens..~ rs
+          Lens.^? describeSnapshotsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeSnapshots where
+  type
+    AWSResponse DescribeSnapshots =
+      DescribeSnapshotsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeSnapshotsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Snapshots" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeSnapshots where
+  hashWithSalt _salt DescribeSnapshots' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterName
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` showDetail
+      `Prelude.hashWithSalt` snapshotName
+      `Prelude.hashWithSalt` source
+
+instance Prelude.NFData DescribeSnapshots where
+  rnf DescribeSnapshots' {..} =
+    Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf showDetail
+      `Prelude.seq` Prelude.rnf snapshotName
+      `Prelude.seq` Prelude.rnf source
+
+instance Data.ToHeaders DescribeSnapshots where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeSnapshots" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeSnapshots where
+  toJSON DescribeSnapshots' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClusterName" Data..=) Prelude.<$> clusterName,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("ShowDetail" Data..=) Prelude.<$> showDetail,
+            ("SnapshotName" Data..=) Prelude.<$> snapshotName,
+            ("Source" Data..=) Prelude.<$> source
+          ]
+      )
+
+instance Data.ToPath DescribeSnapshots where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeSnapshots where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeSnapshotsResponse' smart constructor.
+data DescribeSnapshotsResponse = DescribeSnapshotsResponse'
+  { -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of snapshots. Each item in the list contains detailed information
+    -- about one snapshot.
+    snapshots :: Prelude.Maybe [Snapshot],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSnapshotsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeSnapshotsResponse_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'snapshots', 'describeSnapshotsResponse_snapshots' - A list of snapshots. Each item in the list contains detailed information
+-- about one snapshot.
+--
+-- 'httpStatus', 'describeSnapshotsResponse_httpStatus' - The response's http status code.
+newDescribeSnapshotsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeSnapshotsResponse
+newDescribeSnapshotsResponse pHttpStatus_ =
+  DescribeSnapshotsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      snapshots = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeSnapshotsResponse_nextToken :: Lens.Lens' DescribeSnapshotsResponse (Prelude.Maybe Prelude.Text)
+describeSnapshotsResponse_nextToken = Lens.lens (\DescribeSnapshotsResponse' {nextToken} -> nextToken) (\s@DescribeSnapshotsResponse' {} a -> s {nextToken = a} :: DescribeSnapshotsResponse)
+
+-- | A list of snapshots. Each item in the list contains detailed information
+-- about one snapshot.
+describeSnapshotsResponse_snapshots :: Lens.Lens' DescribeSnapshotsResponse (Prelude.Maybe [Snapshot])
+describeSnapshotsResponse_snapshots = Lens.lens (\DescribeSnapshotsResponse' {snapshots} -> snapshots) (\s@DescribeSnapshotsResponse' {} a -> s {snapshots = a} :: DescribeSnapshotsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeSnapshotsResponse_httpStatus :: Lens.Lens' DescribeSnapshotsResponse Prelude.Int
+describeSnapshotsResponse_httpStatus = Lens.lens (\DescribeSnapshotsResponse' {httpStatus} -> httpStatus) (\s@DescribeSnapshotsResponse' {} a -> s {httpStatus = a} :: DescribeSnapshotsResponse)
+
+instance Prelude.NFData DescribeSnapshotsResponse where
+  rnf DescribeSnapshotsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf snapshots
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeSubnetGroups.hs b/gen/Amazonka/MemoryDb/DescribeSubnetGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeSubnetGroups.hs
@@ -0,0 +1,268 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeSubnetGroups
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of subnet group descriptions. If a subnet group name is
+-- specified, the list contains only the description of that group.
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeSubnetGroups
+  ( -- * Creating a Request
+    DescribeSubnetGroups (..),
+    newDescribeSubnetGroups,
+
+    -- * Request Lenses
+    describeSubnetGroups_maxResults,
+    describeSubnetGroups_nextToken,
+    describeSubnetGroups_subnetGroupName,
+
+    -- * Destructuring the Response
+    DescribeSubnetGroupsResponse (..),
+    newDescribeSubnetGroupsResponse,
+
+    -- * Response Lenses
+    describeSubnetGroupsResponse_nextToken,
+    describeSubnetGroupsResponse_subnetGroups,
+    describeSubnetGroupsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeSubnetGroups' smart constructor.
+data DescribeSubnetGroups = DescribeSubnetGroups'
+  { -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxResults value, a token is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the subnet group to return details for.
+    subnetGroupName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSubnetGroups' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeSubnetGroups_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeSubnetGroups_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'subnetGroupName', 'describeSubnetGroups_subnetGroupName' - The name of the subnet group to return details for.
+newDescribeSubnetGroups ::
+  DescribeSubnetGroups
+newDescribeSubnetGroups =
+  DescribeSubnetGroups'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      subnetGroupName = Prelude.Nothing
+    }
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+describeSubnetGroups_maxResults :: Lens.Lens' DescribeSubnetGroups (Prelude.Maybe Prelude.Int)
+describeSubnetGroups_maxResults = Lens.lens (\DescribeSubnetGroups' {maxResults} -> maxResults) (\s@DescribeSubnetGroups' {} a -> s {maxResults = a} :: DescribeSubnetGroups)
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeSubnetGroups_nextToken :: Lens.Lens' DescribeSubnetGroups (Prelude.Maybe Prelude.Text)
+describeSubnetGroups_nextToken = Lens.lens (\DescribeSubnetGroups' {nextToken} -> nextToken) (\s@DescribeSubnetGroups' {} a -> s {nextToken = a} :: DescribeSubnetGroups)
+
+-- | The name of the subnet group to return details for.
+describeSubnetGroups_subnetGroupName :: Lens.Lens' DescribeSubnetGroups (Prelude.Maybe Prelude.Text)
+describeSubnetGroups_subnetGroupName = Lens.lens (\DescribeSubnetGroups' {subnetGroupName} -> subnetGroupName) (\s@DescribeSubnetGroups' {} a -> s {subnetGroupName = a} :: DescribeSubnetGroups)
+
+instance Core.AWSPager DescribeSubnetGroups where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeSubnetGroupsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeSubnetGroupsResponse_subnetGroups
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeSubnetGroups_nextToken
+          Lens..~ rs
+          Lens.^? describeSubnetGroupsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeSubnetGroups where
+  type
+    AWSResponse DescribeSubnetGroups =
+      DescribeSubnetGroupsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeSubnetGroupsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "SubnetGroups" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeSubnetGroups where
+  hashWithSalt _salt DescribeSubnetGroups' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` subnetGroupName
+
+instance Prelude.NFData DescribeSubnetGroups where
+  rnf DescribeSubnetGroups' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf subnetGroupName
+
+instance Data.ToHeaders DescribeSubnetGroups where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeSubnetGroups" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeSubnetGroups where
+  toJSON DescribeSubnetGroups' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("SubnetGroupName" Data..=)
+              Prelude.<$> subnetGroupName
+          ]
+      )
+
+instance Data.ToPath DescribeSubnetGroups where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeSubnetGroups where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeSubnetGroupsResponse' smart constructor.
+data DescribeSubnetGroupsResponse = DescribeSubnetGroupsResponse'
+  { -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of subnet groups. Each element in the list contains detailed
+    -- information about one group.
+    subnetGroups :: Prelude.Maybe [SubnetGroup],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSubnetGroupsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeSubnetGroupsResponse_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'subnetGroups', 'describeSubnetGroupsResponse_subnetGroups' - A list of subnet groups. Each element in the list contains detailed
+-- information about one group.
+--
+-- 'httpStatus', 'describeSubnetGroupsResponse_httpStatus' - The response's http status code.
+newDescribeSubnetGroupsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeSubnetGroupsResponse
+newDescribeSubnetGroupsResponse pHttpStatus_ =
+  DescribeSubnetGroupsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      subnetGroups = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeSubnetGroupsResponse_nextToken :: Lens.Lens' DescribeSubnetGroupsResponse (Prelude.Maybe Prelude.Text)
+describeSubnetGroupsResponse_nextToken = Lens.lens (\DescribeSubnetGroupsResponse' {nextToken} -> nextToken) (\s@DescribeSubnetGroupsResponse' {} a -> s {nextToken = a} :: DescribeSubnetGroupsResponse)
+
+-- | A list of subnet groups. Each element in the list contains detailed
+-- information about one group.
+describeSubnetGroupsResponse_subnetGroups :: Lens.Lens' DescribeSubnetGroupsResponse (Prelude.Maybe [SubnetGroup])
+describeSubnetGroupsResponse_subnetGroups = Lens.lens (\DescribeSubnetGroupsResponse' {subnetGroups} -> subnetGroups) (\s@DescribeSubnetGroupsResponse' {} a -> s {subnetGroups = a} :: DescribeSubnetGroupsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeSubnetGroupsResponse_httpStatus :: Lens.Lens' DescribeSubnetGroupsResponse Prelude.Int
+describeSubnetGroupsResponse_httpStatus = Lens.lens (\DescribeSubnetGroupsResponse' {httpStatus} -> httpStatus) (\s@DescribeSubnetGroupsResponse' {} a -> s {httpStatus = a} :: DescribeSubnetGroupsResponse)
+
+instance Prelude.NFData DescribeSubnetGroupsResponse where
+  rnf DescribeSubnetGroupsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf subnetGroups
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/DescribeUsers.hs b/gen/Amazonka/MemoryDb/DescribeUsers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/DescribeUsers.hs
@@ -0,0 +1,275 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.DescribeUsers
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of users.
+--
+-- This operation returns paginated results.
+module Amazonka.MemoryDb.DescribeUsers
+  ( -- * Creating a Request
+    DescribeUsers (..),
+    newDescribeUsers,
+
+    -- * Request Lenses
+    describeUsers_filters,
+    describeUsers_maxResults,
+    describeUsers_nextToken,
+    describeUsers_userName,
+
+    -- * Destructuring the Response
+    DescribeUsersResponse (..),
+    newDescribeUsersResponse,
+
+    -- * Response Lenses
+    describeUsersResponse_nextToken,
+    describeUsersResponse_users,
+    describeUsersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeUsers' smart constructor.
+data DescribeUsers = DescribeUsers'
+  { -- | Filter to determine the list of users to return.
+    filters :: Prelude.Maybe [Filter],
+    -- | The maximum number of records to include in the response. If more
+    -- records exist than the specified MaxResults value, a token is included
+    -- in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the user
+    userName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeUsers' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'describeUsers_filters' - Filter to determine the list of users to return.
+--
+-- 'maxResults', 'describeUsers_maxResults' - The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeUsers_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'userName', 'describeUsers_userName' - The name of the user
+newDescribeUsers ::
+  DescribeUsers
+newDescribeUsers =
+  DescribeUsers'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      userName = Prelude.Nothing
+    }
+
+-- | Filter to determine the list of users to return.
+describeUsers_filters :: Lens.Lens' DescribeUsers (Prelude.Maybe [Filter])
+describeUsers_filters = Lens.lens (\DescribeUsers' {filters} -> filters) (\s@DescribeUsers' {} a -> s {filters = a} :: DescribeUsers) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified MaxResults value, a token is included
+-- in the response so that the remaining results can be retrieved.
+describeUsers_maxResults :: Lens.Lens' DescribeUsers (Prelude.Maybe Prelude.Int)
+describeUsers_maxResults = Lens.lens (\DescribeUsers' {maxResults} -> maxResults) (\s@DescribeUsers' {} a -> s {maxResults = a} :: DescribeUsers)
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeUsers_nextToken :: Lens.Lens' DescribeUsers (Prelude.Maybe Prelude.Text)
+describeUsers_nextToken = Lens.lens (\DescribeUsers' {nextToken} -> nextToken) (\s@DescribeUsers' {} a -> s {nextToken = a} :: DescribeUsers)
+
+-- | The name of the user
+describeUsers_userName :: Lens.Lens' DescribeUsers (Prelude.Maybe Prelude.Text)
+describeUsers_userName = Lens.lens (\DescribeUsers' {userName} -> userName) (\s@DescribeUsers' {} a -> s {userName = a} :: DescribeUsers)
+
+instance Core.AWSPager DescribeUsers where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeUsersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeUsersResponse_users
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeUsers_nextToken
+          Lens..~ rs
+          Lens.^? describeUsersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeUsers where
+  type
+    AWSResponse DescribeUsers =
+      DescribeUsersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeUsersResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Users" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeUsers where
+  hashWithSalt _salt DescribeUsers' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` userName
+
+instance Prelude.NFData DescribeUsers where
+  rnf DescribeUsers' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf userName
+
+instance Data.ToHeaders DescribeUsers where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.DescribeUsers" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeUsers where
+  toJSON DescribeUsers' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("UserName" Data..=) Prelude.<$> userName
+          ]
+      )
+
+instance Data.ToPath DescribeUsers where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeUsers where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeUsersResponse' smart constructor.
+data DescribeUsersResponse = DescribeUsersResponse'
+  { -- | An optional argument to pass in case the total number of records exceeds
+    -- the value of MaxResults. If nextToken is returned, there are more
+    -- results available. The value of nextToken is a unique pagination token
+    -- for each page. Make the call again using the returned token to retrieve
+    -- the next page. Keep all other arguments unchanged.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of users.
+    users :: Prelude.Maybe [User],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeUsersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeUsersResponse_nextToken' - An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+--
+-- 'users', 'describeUsersResponse_users' - A list of users.
+--
+-- 'httpStatus', 'describeUsersResponse_httpStatus' - The response's http status code.
+newDescribeUsersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeUsersResponse
+newDescribeUsersResponse pHttpStatus_ =
+  DescribeUsersResponse'
+    { nextToken = Prelude.Nothing,
+      users = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An optional argument to pass in case the total number of records exceeds
+-- the value of MaxResults. If nextToken is returned, there are more
+-- results available. The value of nextToken is a unique pagination token
+-- for each page. Make the call again using the returned token to retrieve
+-- the next page. Keep all other arguments unchanged.
+describeUsersResponse_nextToken :: Lens.Lens' DescribeUsersResponse (Prelude.Maybe Prelude.Text)
+describeUsersResponse_nextToken = Lens.lens (\DescribeUsersResponse' {nextToken} -> nextToken) (\s@DescribeUsersResponse' {} a -> s {nextToken = a} :: DescribeUsersResponse)
+
+-- | A list of users.
+describeUsersResponse_users :: Lens.Lens' DescribeUsersResponse (Prelude.Maybe [User])
+describeUsersResponse_users = Lens.lens (\DescribeUsersResponse' {users} -> users) (\s@DescribeUsersResponse' {} a -> s {users = a} :: DescribeUsersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeUsersResponse_httpStatus :: Lens.Lens' DescribeUsersResponse Prelude.Int
+describeUsersResponse_httpStatus = Lens.lens (\DescribeUsersResponse' {httpStatus} -> httpStatus) (\s@DescribeUsersResponse' {} a -> s {httpStatus = a} :: DescribeUsersResponse)
+
+instance Prelude.NFData DescribeUsersResponse where
+  rnf DescribeUsersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf users
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/FailoverShard.hs b/gen/Amazonka/MemoryDb/FailoverShard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/FailoverShard.hs
@@ -0,0 +1,191 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.FailoverShard
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Used to failover a shard. This API is designed for testing the behavior
+-- of your application in case of MemoryDB failover. It is not designed to
+-- be used as a production-level tool for initiating a failover to overcome
+-- a problem you may have with the cluster. Moreover, in certain conditions
+-- such as large scale operational events, Amazon may block this API.
+module Amazonka.MemoryDb.FailoverShard
+  ( -- * Creating a Request
+    FailoverShard (..),
+    newFailoverShard,
+
+    -- * Request Lenses
+    failoverShard_clusterName,
+    failoverShard_shardName,
+
+    -- * Destructuring the Response
+    FailoverShardResponse (..),
+    newFailoverShardResponse,
+
+    -- * Response Lenses
+    failoverShardResponse_cluster,
+    failoverShardResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newFailoverShard' smart constructor.
+data FailoverShard = FailoverShard'
+  { -- | The cluster being failed over
+    clusterName :: Prelude.Text,
+    -- | The name of the shard
+    shardName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FailoverShard' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterName', 'failoverShard_clusterName' - The cluster being failed over
+--
+-- 'shardName', 'failoverShard_shardName' - The name of the shard
+newFailoverShard ::
+  -- | 'clusterName'
+  Prelude.Text ->
+  -- | 'shardName'
+  Prelude.Text ->
+  FailoverShard
+newFailoverShard pClusterName_ pShardName_ =
+  FailoverShard'
+    { clusterName = pClusterName_,
+      shardName = pShardName_
+    }
+
+-- | The cluster being failed over
+failoverShard_clusterName :: Lens.Lens' FailoverShard Prelude.Text
+failoverShard_clusterName = Lens.lens (\FailoverShard' {clusterName} -> clusterName) (\s@FailoverShard' {} a -> s {clusterName = a} :: FailoverShard)
+
+-- | The name of the shard
+failoverShard_shardName :: Lens.Lens' FailoverShard Prelude.Text
+failoverShard_shardName = Lens.lens (\FailoverShard' {shardName} -> shardName) (\s@FailoverShard' {} a -> s {shardName = a} :: FailoverShard)
+
+instance Core.AWSRequest FailoverShard where
+  type
+    AWSResponse FailoverShard =
+      FailoverShardResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          FailoverShardResponse'
+            Prelude.<$> (x Data..?> "Cluster")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable FailoverShard where
+  hashWithSalt _salt FailoverShard' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterName
+      `Prelude.hashWithSalt` shardName
+
+instance Prelude.NFData FailoverShard where
+  rnf FailoverShard' {..} =
+    Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf shardName
+
+instance Data.ToHeaders FailoverShard where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.FailoverShard" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON FailoverShard where
+  toJSON FailoverShard' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ClusterName" Data..= clusterName),
+            Prelude.Just ("ShardName" Data..= shardName)
+          ]
+      )
+
+instance Data.ToPath FailoverShard where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery FailoverShard where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newFailoverShardResponse' smart constructor.
+data FailoverShardResponse = FailoverShardResponse'
+  { -- | The cluster being failed over
+    cluster :: Prelude.Maybe Cluster,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FailoverShardResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cluster', 'failoverShardResponse_cluster' - The cluster being failed over
+--
+-- 'httpStatus', 'failoverShardResponse_httpStatus' - The response's http status code.
+newFailoverShardResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  FailoverShardResponse
+newFailoverShardResponse pHttpStatus_ =
+  FailoverShardResponse'
+    { cluster = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The cluster being failed over
+failoverShardResponse_cluster :: Lens.Lens' FailoverShardResponse (Prelude.Maybe Cluster)
+failoverShardResponse_cluster = Lens.lens (\FailoverShardResponse' {cluster} -> cluster) (\s@FailoverShardResponse' {} a -> s {cluster = a} :: FailoverShardResponse)
+
+-- | The response's http status code.
+failoverShardResponse_httpStatus :: Lens.Lens' FailoverShardResponse Prelude.Int
+failoverShardResponse_httpStatus = Lens.lens (\FailoverShardResponse' {httpStatus} -> httpStatus) (\s@FailoverShardResponse' {} a -> s {httpStatus = a} :: FailoverShardResponse)
+
+instance Prelude.NFData FailoverShardResponse where
+  rnf FailoverShardResponse' {..} =
+    Prelude.rnf cluster
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/Lens.hs b/gen/Amazonka/MemoryDb/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Lens.hs
@@ -0,0 +1,645 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Lens
+  ( -- * Operations
+
+    -- ** BatchUpdateCluster
+    batchUpdateCluster_serviceUpdate,
+    batchUpdateCluster_clusterNames,
+    batchUpdateClusterResponse_processedClusters,
+    batchUpdateClusterResponse_unprocessedClusters,
+    batchUpdateClusterResponse_httpStatus,
+
+    -- ** CopySnapshot
+    copySnapshot_kmsKeyId,
+    copySnapshot_tags,
+    copySnapshot_targetBucket,
+    copySnapshot_sourceSnapshotName,
+    copySnapshot_targetSnapshotName,
+    copySnapshotResponse_snapshot,
+    copySnapshotResponse_httpStatus,
+
+    -- ** CreateACL
+    createACL_tags,
+    createACL_userNames,
+    createACL_aCLName,
+    createACLResponse_acl,
+    createACLResponse_httpStatus,
+
+    -- ** CreateCluster
+    createCluster_autoMinorVersionUpgrade,
+    createCluster_dataTiering,
+    createCluster_description,
+    createCluster_engineVersion,
+    createCluster_kmsKeyId,
+    createCluster_maintenanceWindow,
+    createCluster_numReplicasPerShard,
+    createCluster_numShards,
+    createCluster_parameterGroupName,
+    createCluster_port,
+    createCluster_securityGroupIds,
+    createCluster_snapshotArns,
+    createCluster_snapshotName,
+    createCluster_snapshotRetentionLimit,
+    createCluster_snapshotWindow,
+    createCluster_snsTopicArn,
+    createCluster_subnetGroupName,
+    createCluster_tLSEnabled,
+    createCluster_tags,
+    createCluster_clusterName,
+    createCluster_nodeType,
+    createCluster_aCLName,
+    createClusterResponse_cluster,
+    createClusterResponse_httpStatus,
+
+    -- ** CreateParameterGroup
+    createParameterGroup_description,
+    createParameterGroup_tags,
+    createParameterGroup_parameterGroupName,
+    createParameterGroup_family,
+    createParameterGroupResponse_parameterGroup,
+    createParameterGroupResponse_httpStatus,
+
+    -- ** CreateSnapshot
+    createSnapshot_kmsKeyId,
+    createSnapshot_tags,
+    createSnapshot_clusterName,
+    createSnapshot_snapshotName,
+    createSnapshotResponse_snapshot,
+    createSnapshotResponse_httpStatus,
+
+    -- ** CreateSubnetGroup
+    createSubnetGroup_description,
+    createSubnetGroup_tags,
+    createSubnetGroup_subnetGroupName,
+    createSubnetGroup_subnetIds,
+    createSubnetGroupResponse_subnetGroup,
+    createSubnetGroupResponse_httpStatus,
+
+    -- ** CreateUser
+    createUser_tags,
+    createUser_userName,
+    createUser_authenticationMode,
+    createUser_accessString,
+    createUserResponse_user,
+    createUserResponse_httpStatus,
+
+    -- ** DeleteACL
+    deleteACL_aCLName,
+    deleteACLResponse_acl,
+    deleteACLResponse_httpStatus,
+
+    -- ** DeleteCluster
+    deleteCluster_finalSnapshotName,
+    deleteCluster_clusterName,
+    deleteClusterResponse_cluster,
+    deleteClusterResponse_httpStatus,
+
+    -- ** DeleteParameterGroup
+    deleteParameterGroup_parameterGroupName,
+    deleteParameterGroupResponse_parameterGroup,
+    deleteParameterGroupResponse_httpStatus,
+
+    -- ** DeleteSnapshot
+    deleteSnapshot_snapshotName,
+    deleteSnapshotResponse_snapshot,
+    deleteSnapshotResponse_httpStatus,
+
+    -- ** DeleteSubnetGroup
+    deleteSubnetGroup_subnetGroupName,
+    deleteSubnetGroupResponse_subnetGroup,
+    deleteSubnetGroupResponse_httpStatus,
+
+    -- ** DeleteUser
+    deleteUser_userName,
+    deleteUserResponse_user,
+    deleteUserResponse_httpStatus,
+
+    -- ** DescribeACLs
+    describeACLs_aCLName,
+    describeACLs_maxResults,
+    describeACLs_nextToken,
+    describeACLsResponse_aCLs,
+    describeACLsResponse_nextToken,
+    describeACLsResponse_httpStatus,
+
+    -- ** DescribeClusters
+    describeClusters_clusterName,
+    describeClusters_maxResults,
+    describeClusters_nextToken,
+    describeClusters_showShardDetails,
+    describeClustersResponse_clusters,
+    describeClustersResponse_nextToken,
+    describeClustersResponse_httpStatus,
+
+    -- ** DescribeEngineVersions
+    describeEngineVersions_defaultOnly,
+    describeEngineVersions_engineVersion,
+    describeEngineVersions_maxResults,
+    describeEngineVersions_nextToken,
+    describeEngineVersions_parameterGroupFamily,
+    describeEngineVersionsResponse_engineVersions,
+    describeEngineVersionsResponse_nextToken,
+    describeEngineVersionsResponse_httpStatus,
+
+    -- ** DescribeEvents
+    describeEvents_duration,
+    describeEvents_endTime,
+    describeEvents_maxResults,
+    describeEvents_nextToken,
+    describeEvents_sourceName,
+    describeEvents_sourceType,
+    describeEvents_startTime,
+    describeEventsResponse_events,
+    describeEventsResponse_nextToken,
+    describeEventsResponse_httpStatus,
+
+    -- ** DescribeParameterGroups
+    describeParameterGroups_maxResults,
+    describeParameterGroups_nextToken,
+    describeParameterGroups_parameterGroupName,
+    describeParameterGroupsResponse_nextToken,
+    describeParameterGroupsResponse_parameterGroups,
+    describeParameterGroupsResponse_httpStatus,
+
+    -- ** DescribeParameters
+    describeParameters_maxResults,
+    describeParameters_nextToken,
+    describeParameters_parameterGroupName,
+    describeParametersResponse_nextToken,
+    describeParametersResponse_parameters,
+    describeParametersResponse_httpStatus,
+
+    -- ** DescribeReservedNodes
+    describeReservedNodes_duration,
+    describeReservedNodes_maxResults,
+    describeReservedNodes_nextToken,
+    describeReservedNodes_nodeType,
+    describeReservedNodes_offeringType,
+    describeReservedNodes_reservationId,
+    describeReservedNodes_reservedNodesOfferingId,
+    describeReservedNodesResponse_nextToken,
+    describeReservedNodesResponse_reservedNodes,
+    describeReservedNodesResponse_httpStatus,
+
+    -- ** DescribeReservedNodesOfferings
+    describeReservedNodesOfferings_duration,
+    describeReservedNodesOfferings_maxResults,
+    describeReservedNodesOfferings_nextToken,
+    describeReservedNodesOfferings_nodeType,
+    describeReservedNodesOfferings_offeringType,
+    describeReservedNodesOfferings_reservedNodesOfferingId,
+    describeReservedNodesOfferingsResponse_nextToken,
+    describeReservedNodesOfferingsResponse_reservedNodesOfferings,
+    describeReservedNodesOfferingsResponse_httpStatus,
+
+    -- ** DescribeServiceUpdates
+    describeServiceUpdates_clusterNames,
+    describeServiceUpdates_maxResults,
+    describeServiceUpdates_nextToken,
+    describeServiceUpdates_serviceUpdateName,
+    describeServiceUpdates_status,
+    describeServiceUpdatesResponse_nextToken,
+    describeServiceUpdatesResponse_serviceUpdates,
+    describeServiceUpdatesResponse_httpStatus,
+
+    -- ** DescribeSnapshots
+    describeSnapshots_clusterName,
+    describeSnapshots_maxResults,
+    describeSnapshots_nextToken,
+    describeSnapshots_showDetail,
+    describeSnapshots_snapshotName,
+    describeSnapshots_source,
+    describeSnapshotsResponse_nextToken,
+    describeSnapshotsResponse_snapshots,
+    describeSnapshotsResponse_httpStatus,
+
+    -- ** DescribeSubnetGroups
+    describeSubnetGroups_maxResults,
+    describeSubnetGroups_nextToken,
+    describeSubnetGroups_subnetGroupName,
+    describeSubnetGroupsResponse_nextToken,
+    describeSubnetGroupsResponse_subnetGroups,
+    describeSubnetGroupsResponse_httpStatus,
+
+    -- ** DescribeUsers
+    describeUsers_filters,
+    describeUsers_maxResults,
+    describeUsers_nextToken,
+    describeUsers_userName,
+    describeUsersResponse_nextToken,
+    describeUsersResponse_users,
+    describeUsersResponse_httpStatus,
+
+    -- ** FailoverShard
+    failoverShard_clusterName,
+    failoverShard_shardName,
+    failoverShardResponse_cluster,
+    failoverShardResponse_httpStatus,
+
+    -- ** ListAllowedNodeTypeUpdates
+    listAllowedNodeTypeUpdates_clusterName,
+    listAllowedNodeTypeUpdatesResponse_scaleDownNodeTypes,
+    listAllowedNodeTypeUpdatesResponse_scaleUpNodeTypes,
+    listAllowedNodeTypeUpdatesResponse_httpStatus,
+
+    -- ** ListTags
+    listTags_resourceArn,
+    listTagsResponse_tagList,
+    listTagsResponse_httpStatus,
+
+    -- ** PurchaseReservedNodesOffering
+    purchaseReservedNodesOffering_nodeCount,
+    purchaseReservedNodesOffering_reservationId,
+    purchaseReservedNodesOffering_tags,
+    purchaseReservedNodesOffering_reservedNodesOfferingId,
+    purchaseReservedNodesOfferingResponse_reservedNode,
+    purchaseReservedNodesOfferingResponse_httpStatus,
+
+    -- ** ResetParameterGroup
+    resetParameterGroup_allParameters,
+    resetParameterGroup_parameterNames,
+    resetParameterGroup_parameterGroupName,
+    resetParameterGroupResponse_parameterGroup,
+    resetParameterGroupResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_tagList,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_tagList,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateACL
+    updateACL_userNamesToAdd,
+    updateACL_userNamesToRemove,
+    updateACL_aCLName,
+    updateACLResponse_acl,
+    updateACLResponse_httpStatus,
+
+    -- ** UpdateCluster
+    updateCluster_aCLName,
+    updateCluster_description,
+    updateCluster_engineVersion,
+    updateCluster_maintenanceWindow,
+    updateCluster_nodeType,
+    updateCluster_parameterGroupName,
+    updateCluster_replicaConfiguration,
+    updateCluster_securityGroupIds,
+    updateCluster_shardConfiguration,
+    updateCluster_snapshotRetentionLimit,
+    updateCluster_snapshotWindow,
+    updateCluster_snsTopicArn,
+    updateCluster_snsTopicStatus,
+    updateCluster_clusterName,
+    updateClusterResponse_cluster,
+    updateClusterResponse_httpStatus,
+
+    -- ** UpdateParameterGroup
+    updateParameterGroup_parameterGroupName,
+    updateParameterGroup_parameterNameValues,
+    updateParameterGroupResponse_parameterGroup,
+    updateParameterGroupResponse_httpStatus,
+
+    -- ** UpdateSubnetGroup
+    updateSubnetGroup_description,
+    updateSubnetGroup_subnetIds,
+    updateSubnetGroup_subnetGroupName,
+    updateSubnetGroupResponse_subnetGroup,
+    updateSubnetGroupResponse_httpStatus,
+
+    -- ** UpdateUser
+    updateUser_accessString,
+    updateUser_authenticationMode,
+    updateUser_userName,
+    updateUserResponse_user,
+    updateUserResponse_httpStatus,
+
+    -- * Types
+
+    -- ** ACL
+    acl_arn,
+    acl_clusters,
+    acl_minimumEngineVersion,
+    acl_name,
+    acl_pendingChanges,
+    acl_status,
+    acl_userNames,
+
+    -- ** ACLPendingChanges
+    aCLPendingChanges_userNamesToAdd,
+    aCLPendingChanges_userNamesToRemove,
+
+    -- ** ACLsUpdateStatus
+    aCLsUpdateStatus_aCLToApply,
+
+    -- ** Authentication
+    authentication_passwordCount,
+    authentication_type,
+
+    -- ** AuthenticationMode
+    authenticationMode_passwords,
+    authenticationMode_type,
+
+    -- ** AvailabilityZone
+    availabilityZone_name,
+
+    -- ** Cluster
+    cluster_aCLName,
+    cluster_arn,
+    cluster_autoMinorVersionUpgrade,
+    cluster_availabilityMode,
+    cluster_clusterEndpoint,
+    cluster_dataTiering,
+    cluster_description,
+    cluster_enginePatchVersion,
+    cluster_engineVersion,
+    cluster_kmsKeyId,
+    cluster_maintenanceWindow,
+    cluster_name,
+    cluster_nodeType,
+    cluster_numberOfShards,
+    cluster_parameterGroupName,
+    cluster_parameterGroupStatus,
+    cluster_pendingUpdates,
+    cluster_securityGroups,
+    cluster_shards,
+    cluster_snapshotRetentionLimit,
+    cluster_snapshotWindow,
+    cluster_snsTopicArn,
+    cluster_snsTopicStatus,
+    cluster_status,
+    cluster_subnetGroupName,
+    cluster_tLSEnabled,
+
+    -- ** ClusterConfiguration
+    clusterConfiguration_description,
+    clusterConfiguration_engineVersion,
+    clusterConfiguration_maintenanceWindow,
+    clusterConfiguration_name,
+    clusterConfiguration_nodeType,
+    clusterConfiguration_numShards,
+    clusterConfiguration_parameterGroupName,
+    clusterConfiguration_port,
+    clusterConfiguration_shards,
+    clusterConfiguration_snapshotRetentionLimit,
+    clusterConfiguration_snapshotWindow,
+    clusterConfiguration_subnetGroupName,
+    clusterConfiguration_topicArn,
+    clusterConfiguration_vpcId,
+
+    -- ** ClusterPendingUpdates
+    clusterPendingUpdates_aCLs,
+    clusterPendingUpdates_resharding,
+    clusterPendingUpdates_serviceUpdates,
+
+    -- ** Endpoint
+    endpoint_address,
+    endpoint_port,
+
+    -- ** EngineVersionInfo
+    engineVersionInfo_enginePatchVersion,
+    engineVersionInfo_engineVersion,
+    engineVersionInfo_parameterGroupFamily,
+
+    -- ** Event
+    event_date,
+    event_message,
+    event_sourceName,
+    event_sourceType,
+
+    -- ** Filter
+    filter_name,
+    filter_values,
+
+    -- ** Node
+    node_availabilityZone,
+    node_createTime,
+    node_endpoint,
+    node_name,
+    node_status,
+
+    -- ** Parameter
+    parameter_allowedValues,
+    parameter_dataType,
+    parameter_description,
+    parameter_minimumEngineVersion,
+    parameter_name,
+    parameter_value,
+
+    -- ** ParameterGroup
+    parameterGroup_arn,
+    parameterGroup_description,
+    parameterGroup_family,
+    parameterGroup_name,
+
+    -- ** ParameterNameValue
+    parameterNameValue_parameterName,
+    parameterNameValue_parameterValue,
+
+    -- ** PendingModifiedServiceUpdate
+    pendingModifiedServiceUpdate_serviceUpdateName,
+    pendingModifiedServiceUpdate_status,
+
+    -- ** RecurringCharge
+    recurringCharge_recurringChargeAmount,
+    recurringCharge_recurringChargeFrequency,
+
+    -- ** ReplicaConfigurationRequest
+    replicaConfigurationRequest_replicaCount,
+
+    -- ** ReservedNode
+    reservedNode_arn,
+    reservedNode_duration,
+    reservedNode_fixedPrice,
+    reservedNode_nodeCount,
+    reservedNode_nodeType,
+    reservedNode_offeringType,
+    reservedNode_recurringCharges,
+    reservedNode_reservationId,
+    reservedNode_reservedNodesOfferingId,
+    reservedNode_startTime,
+    reservedNode_state,
+
+    -- ** ReservedNodesOffering
+    reservedNodesOffering_duration,
+    reservedNodesOffering_fixedPrice,
+    reservedNodesOffering_nodeType,
+    reservedNodesOffering_offeringType,
+    reservedNodesOffering_recurringCharges,
+    reservedNodesOffering_reservedNodesOfferingId,
+
+    -- ** ReshardingStatus
+    reshardingStatus_slotMigration,
+
+    -- ** SecurityGroupMembership
+    securityGroupMembership_securityGroupId,
+    securityGroupMembership_status,
+
+    -- ** ServiceUpdate
+    serviceUpdate_autoUpdateStartDate,
+    serviceUpdate_clusterName,
+    serviceUpdate_description,
+    serviceUpdate_nodesUpdated,
+    serviceUpdate_releaseDate,
+    serviceUpdate_serviceUpdateName,
+    serviceUpdate_status,
+    serviceUpdate_type,
+
+    -- ** ServiceUpdateRequest
+    serviceUpdateRequest_serviceUpdateNameToApply,
+
+    -- ** Shard
+    shard_name,
+    shard_nodes,
+    shard_numberOfNodes,
+    shard_slots,
+    shard_status,
+
+    -- ** ShardConfiguration
+    shardConfiguration_replicaCount,
+    shardConfiguration_slots,
+
+    -- ** ShardConfigurationRequest
+    shardConfigurationRequest_shardCount,
+
+    -- ** ShardDetail
+    shardDetail_configuration,
+    shardDetail_name,
+    shardDetail_size,
+    shardDetail_snapshotCreationTime,
+
+    -- ** SlotMigration
+    slotMigration_progressPercentage,
+
+    -- ** Snapshot
+    snapshot_arn,
+    snapshot_clusterConfiguration,
+    snapshot_dataTiering,
+    snapshot_kmsKeyId,
+    snapshot_name,
+    snapshot_source,
+    snapshot_status,
+
+    -- ** Subnet
+    subnet_availabilityZone,
+    subnet_identifier,
+
+    -- ** SubnetGroup
+    subnetGroup_arn,
+    subnetGroup_description,
+    subnetGroup_name,
+    subnetGroup_subnets,
+    subnetGroup_vpcId,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+
+    -- ** UnprocessedCluster
+    unprocessedCluster_clusterName,
+    unprocessedCluster_errorMessage,
+    unprocessedCluster_errorType,
+
+    -- ** User
+    user_aCLNames,
+    user_arn,
+    user_accessString,
+    user_authentication,
+    user_minimumEngineVersion,
+    user_name,
+    user_status,
+  )
+where
+
+import Amazonka.MemoryDb.BatchUpdateCluster
+import Amazonka.MemoryDb.CopySnapshot
+import Amazonka.MemoryDb.CreateACL
+import Amazonka.MemoryDb.CreateCluster
+import Amazonka.MemoryDb.CreateParameterGroup
+import Amazonka.MemoryDb.CreateSnapshot
+import Amazonka.MemoryDb.CreateSubnetGroup
+import Amazonka.MemoryDb.CreateUser
+import Amazonka.MemoryDb.DeleteACL
+import Amazonka.MemoryDb.DeleteCluster
+import Amazonka.MemoryDb.DeleteParameterGroup
+import Amazonka.MemoryDb.DeleteSnapshot
+import Amazonka.MemoryDb.DeleteSubnetGroup
+import Amazonka.MemoryDb.DeleteUser
+import Amazonka.MemoryDb.DescribeACLs
+import Amazonka.MemoryDb.DescribeClusters
+import Amazonka.MemoryDb.DescribeEngineVersions
+import Amazonka.MemoryDb.DescribeEvents
+import Amazonka.MemoryDb.DescribeParameterGroups
+import Amazonka.MemoryDb.DescribeParameters
+import Amazonka.MemoryDb.DescribeReservedNodes
+import Amazonka.MemoryDb.DescribeReservedNodesOfferings
+import Amazonka.MemoryDb.DescribeServiceUpdates
+import Amazonka.MemoryDb.DescribeSnapshots
+import Amazonka.MemoryDb.DescribeSubnetGroups
+import Amazonka.MemoryDb.DescribeUsers
+import Amazonka.MemoryDb.FailoverShard
+import Amazonka.MemoryDb.ListAllowedNodeTypeUpdates
+import Amazonka.MemoryDb.ListTags
+import Amazonka.MemoryDb.PurchaseReservedNodesOffering
+import Amazonka.MemoryDb.ResetParameterGroup
+import Amazonka.MemoryDb.TagResource
+import Amazonka.MemoryDb.Types.ACL
+import Amazonka.MemoryDb.Types.ACLPendingChanges
+import Amazonka.MemoryDb.Types.ACLsUpdateStatus
+import Amazonka.MemoryDb.Types.Authentication
+import Amazonka.MemoryDb.Types.AuthenticationMode
+import Amazonka.MemoryDb.Types.AvailabilityZone
+import Amazonka.MemoryDb.Types.Cluster
+import Amazonka.MemoryDb.Types.ClusterConfiguration
+import Amazonka.MemoryDb.Types.ClusterPendingUpdates
+import Amazonka.MemoryDb.Types.Endpoint
+import Amazonka.MemoryDb.Types.EngineVersionInfo
+import Amazonka.MemoryDb.Types.Event
+import Amazonka.MemoryDb.Types.Filter
+import Amazonka.MemoryDb.Types.Node
+import Amazonka.MemoryDb.Types.Parameter
+import Amazonka.MemoryDb.Types.ParameterGroup
+import Amazonka.MemoryDb.Types.ParameterNameValue
+import Amazonka.MemoryDb.Types.PendingModifiedServiceUpdate
+import Amazonka.MemoryDb.Types.RecurringCharge
+import Amazonka.MemoryDb.Types.ReplicaConfigurationRequest
+import Amazonka.MemoryDb.Types.ReservedNode
+import Amazonka.MemoryDb.Types.ReservedNodesOffering
+import Amazonka.MemoryDb.Types.ReshardingStatus
+import Amazonka.MemoryDb.Types.SecurityGroupMembership
+import Amazonka.MemoryDb.Types.ServiceUpdate
+import Amazonka.MemoryDb.Types.ServiceUpdateRequest
+import Amazonka.MemoryDb.Types.Shard
+import Amazonka.MemoryDb.Types.ShardConfiguration
+import Amazonka.MemoryDb.Types.ShardConfigurationRequest
+import Amazonka.MemoryDb.Types.ShardDetail
+import Amazonka.MemoryDb.Types.SlotMigration
+import Amazonka.MemoryDb.Types.Snapshot
+import Amazonka.MemoryDb.Types.Subnet
+import Amazonka.MemoryDb.Types.SubnetGroup
+import Amazonka.MemoryDb.Types.Tag
+import Amazonka.MemoryDb.Types.UnprocessedCluster
+import Amazonka.MemoryDb.Types.User
+import Amazonka.MemoryDb.UntagResource
+import Amazonka.MemoryDb.UpdateACL
+import Amazonka.MemoryDb.UpdateCluster
+import Amazonka.MemoryDb.UpdateParameterGroup
+import Amazonka.MemoryDb.UpdateSubnetGroup
+import Amazonka.MemoryDb.UpdateUser
diff --git a/gen/Amazonka/MemoryDb/ListAllowedNodeTypeUpdates.hs b/gen/Amazonka/MemoryDb/ListAllowedNodeTypeUpdates.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/ListAllowedNodeTypeUpdates.hs
@@ -0,0 +1,202 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.ListAllowedNodeTypeUpdates
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all available node types that you can scale to from your
+-- cluster\'s current node type. When you use the UpdateCluster operation
+-- to scale your cluster, the value of the NodeType parameter must be one
+-- of the node types returned by this operation.
+module Amazonka.MemoryDb.ListAllowedNodeTypeUpdates
+  ( -- * Creating a Request
+    ListAllowedNodeTypeUpdates (..),
+    newListAllowedNodeTypeUpdates,
+
+    -- * Request Lenses
+    listAllowedNodeTypeUpdates_clusterName,
+
+    -- * Destructuring the Response
+    ListAllowedNodeTypeUpdatesResponse (..),
+    newListAllowedNodeTypeUpdatesResponse,
+
+    -- * Response Lenses
+    listAllowedNodeTypeUpdatesResponse_scaleDownNodeTypes,
+    listAllowedNodeTypeUpdatesResponse_scaleUpNodeTypes,
+    listAllowedNodeTypeUpdatesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListAllowedNodeTypeUpdates' smart constructor.
+data ListAllowedNodeTypeUpdates = ListAllowedNodeTypeUpdates'
+  { -- | The name of the cluster you want to scale. MemoryDB uses the cluster
+    -- name to identify the current node type being used by this cluster, and
+    -- from that to create a list of node types you can scale up to.
+    clusterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAllowedNodeTypeUpdates' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterName', 'listAllowedNodeTypeUpdates_clusterName' - The name of the cluster you want to scale. MemoryDB uses the cluster
+-- name to identify the current node type being used by this cluster, and
+-- from that to create a list of node types you can scale up to.
+newListAllowedNodeTypeUpdates ::
+  -- | 'clusterName'
+  Prelude.Text ->
+  ListAllowedNodeTypeUpdates
+newListAllowedNodeTypeUpdates pClusterName_ =
+  ListAllowedNodeTypeUpdates'
+    { clusterName =
+        pClusterName_
+    }
+
+-- | The name of the cluster you want to scale. MemoryDB uses the cluster
+-- name to identify the current node type being used by this cluster, and
+-- from that to create a list of node types you can scale up to.
+listAllowedNodeTypeUpdates_clusterName :: Lens.Lens' ListAllowedNodeTypeUpdates Prelude.Text
+listAllowedNodeTypeUpdates_clusterName = Lens.lens (\ListAllowedNodeTypeUpdates' {clusterName} -> clusterName) (\s@ListAllowedNodeTypeUpdates' {} a -> s {clusterName = a} :: ListAllowedNodeTypeUpdates)
+
+instance Core.AWSRequest ListAllowedNodeTypeUpdates where
+  type
+    AWSResponse ListAllowedNodeTypeUpdates =
+      ListAllowedNodeTypeUpdatesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAllowedNodeTypeUpdatesResponse'
+            Prelude.<$> ( x
+                            Data..?> "ScaleDownNodeTypes"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..?> "ScaleUpNodeTypes"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListAllowedNodeTypeUpdates where
+  hashWithSalt _salt ListAllowedNodeTypeUpdates' {..} =
+    _salt `Prelude.hashWithSalt` clusterName
+
+instance Prelude.NFData ListAllowedNodeTypeUpdates where
+  rnf ListAllowedNodeTypeUpdates' {..} =
+    Prelude.rnf clusterName
+
+instance Data.ToHeaders ListAllowedNodeTypeUpdates where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.ListAllowedNodeTypeUpdates" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListAllowedNodeTypeUpdates where
+  toJSON ListAllowedNodeTypeUpdates' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ClusterName" Data..= clusterName)]
+      )
+
+instance Data.ToPath ListAllowedNodeTypeUpdates where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListAllowedNodeTypeUpdates where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListAllowedNodeTypeUpdatesResponse' smart constructor.
+data ListAllowedNodeTypeUpdatesResponse = ListAllowedNodeTypeUpdatesResponse'
+  { -- | A list node types which you can use to scale down your cluster.
+    scaleDownNodeTypes :: Prelude.Maybe [Prelude.Text],
+    -- | A list node types which you can use to scale up your cluster.
+    scaleUpNodeTypes :: Prelude.Maybe [Prelude.Text],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAllowedNodeTypeUpdatesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'scaleDownNodeTypes', 'listAllowedNodeTypeUpdatesResponse_scaleDownNodeTypes' - A list node types which you can use to scale down your cluster.
+--
+-- 'scaleUpNodeTypes', 'listAllowedNodeTypeUpdatesResponse_scaleUpNodeTypes' - A list node types which you can use to scale up your cluster.
+--
+-- 'httpStatus', 'listAllowedNodeTypeUpdatesResponse_httpStatus' - The response's http status code.
+newListAllowedNodeTypeUpdatesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAllowedNodeTypeUpdatesResponse
+newListAllowedNodeTypeUpdatesResponse pHttpStatus_ =
+  ListAllowedNodeTypeUpdatesResponse'
+    { scaleDownNodeTypes =
+        Prelude.Nothing,
+      scaleUpNodeTypes = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list node types which you can use to scale down your cluster.
+listAllowedNodeTypeUpdatesResponse_scaleDownNodeTypes :: Lens.Lens' ListAllowedNodeTypeUpdatesResponse (Prelude.Maybe [Prelude.Text])
+listAllowedNodeTypeUpdatesResponse_scaleDownNodeTypes = Lens.lens (\ListAllowedNodeTypeUpdatesResponse' {scaleDownNodeTypes} -> scaleDownNodeTypes) (\s@ListAllowedNodeTypeUpdatesResponse' {} a -> s {scaleDownNodeTypes = a} :: ListAllowedNodeTypeUpdatesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list node types which you can use to scale up your cluster.
+listAllowedNodeTypeUpdatesResponse_scaleUpNodeTypes :: Lens.Lens' ListAllowedNodeTypeUpdatesResponse (Prelude.Maybe [Prelude.Text])
+listAllowedNodeTypeUpdatesResponse_scaleUpNodeTypes = Lens.lens (\ListAllowedNodeTypeUpdatesResponse' {scaleUpNodeTypes} -> scaleUpNodeTypes) (\s@ListAllowedNodeTypeUpdatesResponse' {} a -> s {scaleUpNodeTypes = a} :: ListAllowedNodeTypeUpdatesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listAllowedNodeTypeUpdatesResponse_httpStatus :: Lens.Lens' ListAllowedNodeTypeUpdatesResponse Prelude.Int
+listAllowedNodeTypeUpdatesResponse_httpStatus = Lens.lens (\ListAllowedNodeTypeUpdatesResponse' {httpStatus} -> httpStatus) (\s@ListAllowedNodeTypeUpdatesResponse' {} a -> s {httpStatus = a} :: ListAllowedNodeTypeUpdatesResponse)
+
+instance
+  Prelude.NFData
+    ListAllowedNodeTypeUpdatesResponse
+  where
+  rnf ListAllowedNodeTypeUpdatesResponse' {..} =
+    Prelude.rnf scaleDownNodeTypes
+      `Prelude.seq` Prelude.rnf scaleUpNodeTypes
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/ListTags.hs b/gen/Amazonka/MemoryDb/ListTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/ListTags.hs
@@ -0,0 +1,169 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.ListTags
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all tags currently on a named resource. A tag is a key-value pair
+-- where the key and value are case-sensitive. You can use tags to
+-- categorize and track your MemoryDB resources. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/Tagging-Resources.html Tagging your MemoryDB resources>
+module Amazonka.MemoryDb.ListTags
+  ( -- * Creating a Request
+    ListTags (..),
+    newListTags,
+
+    -- * Request Lenses
+    listTags_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsResponse (..),
+    newListTagsResponse,
+
+    -- * Response Lenses
+    listTagsResponse_tagList,
+    listTagsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTags' smart constructor.
+data ListTags = ListTags'
+  { -- | The Amazon Resource Name (ARN) of the resource for which you want the
+    -- list of tags
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTags' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTags_resourceArn' - The Amazon Resource Name (ARN) of the resource for which you want the
+-- list of tags
+newListTags ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTags
+newListTags pResourceArn_ =
+  ListTags' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) of the resource for which you want the
+-- list of tags
+listTags_resourceArn :: Lens.Lens' ListTags Prelude.Text
+listTags_resourceArn = Lens.lens (\ListTags' {resourceArn} -> resourceArn) (\s@ListTags' {} a -> s {resourceArn = a} :: ListTags)
+
+instance Core.AWSRequest ListTags where
+  type AWSResponse ListTags = ListTagsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsResponse'
+            Prelude.<$> (x Data..?> "TagList" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTags where
+  hashWithSalt _salt ListTags' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTags where
+  rnf ListTags' {..} = Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTags where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("AmazonMemoryDB.ListTags" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTags where
+  toJSON ListTags' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ResourceArn" Data..= resourceArn)]
+      )
+
+instance Data.ToPath ListTags where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListTags where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsResponse' smart constructor.
+data ListTagsResponse = ListTagsResponse'
+  { -- | A list of tags as key-value pairs.
+    tagList :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tagList', 'listTagsResponse_tagList' - A list of tags as key-value pairs.
+--
+-- 'httpStatus', 'listTagsResponse_httpStatus' - The response's http status code.
+newListTagsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsResponse
+newListTagsResponse pHttpStatus_ =
+  ListTagsResponse'
+    { tagList = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of tags as key-value pairs.
+listTagsResponse_tagList :: Lens.Lens' ListTagsResponse (Prelude.Maybe [Tag])
+listTagsResponse_tagList = Lens.lens (\ListTagsResponse' {tagList} -> tagList) (\s@ListTagsResponse' {} a -> s {tagList = a} :: ListTagsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsResponse_httpStatus :: Lens.Lens' ListTagsResponse Prelude.Int
+listTagsResponse_httpStatus = Lens.lens (\ListTagsResponse' {httpStatus} -> httpStatus) (\s@ListTagsResponse' {} a -> s {httpStatus = a} :: ListTagsResponse)
+
+instance Prelude.NFData ListTagsResponse where
+  rnf ListTagsResponse' {..} =
+    Prelude.rnf tagList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/PurchaseReservedNodesOffering.hs b/gen/Amazonka/MemoryDb/PurchaseReservedNodesOffering.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/PurchaseReservedNodesOffering.hs
@@ -0,0 +1,231 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.PurchaseReservedNodesOffering
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows you to purchase a reserved node offering. Reserved nodes are not
+-- eligible for cancellation and are non-refundable.
+module Amazonka.MemoryDb.PurchaseReservedNodesOffering
+  ( -- * Creating a Request
+    PurchaseReservedNodesOffering (..),
+    newPurchaseReservedNodesOffering,
+
+    -- * Request Lenses
+    purchaseReservedNodesOffering_nodeCount,
+    purchaseReservedNodesOffering_reservationId,
+    purchaseReservedNodesOffering_tags,
+    purchaseReservedNodesOffering_reservedNodesOfferingId,
+
+    -- * Destructuring the Response
+    PurchaseReservedNodesOfferingResponse (..),
+    newPurchaseReservedNodesOfferingResponse,
+
+    -- * Response Lenses
+    purchaseReservedNodesOfferingResponse_reservedNode,
+    purchaseReservedNodesOfferingResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPurchaseReservedNodesOffering' smart constructor.
+data PurchaseReservedNodesOffering = PurchaseReservedNodesOffering'
+  { -- | The number of node instances to reserve.
+    nodeCount :: Prelude.Maybe Prelude.Int,
+    -- | A customer-specified identifier to track this reservation.
+    reservationId :: Prelude.Maybe Prelude.Text,
+    -- | A list of tags to be added to this resource. A tag is a key-value pair.
+    -- A tag key must be accompanied by a tag value, although null is accepted.
+    tags :: Prelude.Maybe [Tag],
+    -- | The ID of the reserved node offering to purchase.
+    reservedNodesOfferingId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PurchaseReservedNodesOffering' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nodeCount', 'purchaseReservedNodesOffering_nodeCount' - The number of node instances to reserve.
+--
+-- 'reservationId', 'purchaseReservedNodesOffering_reservationId' - A customer-specified identifier to track this reservation.
+--
+-- 'tags', 'purchaseReservedNodesOffering_tags' - A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+--
+-- 'reservedNodesOfferingId', 'purchaseReservedNodesOffering_reservedNodesOfferingId' - The ID of the reserved node offering to purchase.
+newPurchaseReservedNodesOffering ::
+  -- | 'reservedNodesOfferingId'
+  Prelude.Text ->
+  PurchaseReservedNodesOffering
+newPurchaseReservedNodesOffering
+  pReservedNodesOfferingId_ =
+    PurchaseReservedNodesOffering'
+      { nodeCount =
+          Prelude.Nothing,
+        reservationId = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        reservedNodesOfferingId =
+          pReservedNodesOfferingId_
+      }
+
+-- | The number of node instances to reserve.
+purchaseReservedNodesOffering_nodeCount :: Lens.Lens' PurchaseReservedNodesOffering (Prelude.Maybe Prelude.Int)
+purchaseReservedNodesOffering_nodeCount = Lens.lens (\PurchaseReservedNodesOffering' {nodeCount} -> nodeCount) (\s@PurchaseReservedNodesOffering' {} a -> s {nodeCount = a} :: PurchaseReservedNodesOffering)
+
+-- | A customer-specified identifier to track this reservation.
+purchaseReservedNodesOffering_reservationId :: Lens.Lens' PurchaseReservedNodesOffering (Prelude.Maybe Prelude.Text)
+purchaseReservedNodesOffering_reservationId = Lens.lens (\PurchaseReservedNodesOffering' {reservationId} -> reservationId) (\s@PurchaseReservedNodesOffering' {} a -> s {reservationId = a} :: PurchaseReservedNodesOffering)
+
+-- | A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+purchaseReservedNodesOffering_tags :: Lens.Lens' PurchaseReservedNodesOffering (Prelude.Maybe [Tag])
+purchaseReservedNodesOffering_tags = Lens.lens (\PurchaseReservedNodesOffering' {tags} -> tags) (\s@PurchaseReservedNodesOffering' {} a -> s {tags = a} :: PurchaseReservedNodesOffering) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the reserved node offering to purchase.
+purchaseReservedNodesOffering_reservedNodesOfferingId :: Lens.Lens' PurchaseReservedNodesOffering Prelude.Text
+purchaseReservedNodesOffering_reservedNodesOfferingId = Lens.lens (\PurchaseReservedNodesOffering' {reservedNodesOfferingId} -> reservedNodesOfferingId) (\s@PurchaseReservedNodesOffering' {} a -> s {reservedNodesOfferingId = a} :: PurchaseReservedNodesOffering)
+
+instance
+  Core.AWSRequest
+    PurchaseReservedNodesOffering
+  where
+  type
+    AWSResponse PurchaseReservedNodesOffering =
+      PurchaseReservedNodesOfferingResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PurchaseReservedNodesOfferingResponse'
+            Prelude.<$> (x Data..?> "ReservedNode")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    PurchaseReservedNodesOffering
+  where
+  hashWithSalt _salt PurchaseReservedNodesOffering' {..} =
+    _salt
+      `Prelude.hashWithSalt` nodeCount
+      `Prelude.hashWithSalt` reservationId
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` reservedNodesOfferingId
+
+instance Prelude.NFData PurchaseReservedNodesOffering where
+  rnf PurchaseReservedNodesOffering' {..} =
+    Prelude.rnf nodeCount
+      `Prelude.seq` Prelude.rnf reservationId
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf reservedNodesOfferingId
+
+instance Data.ToHeaders PurchaseReservedNodesOffering where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.PurchaseReservedNodesOffering" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PurchaseReservedNodesOffering where
+  toJSON PurchaseReservedNodesOffering' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("NodeCount" Data..=) Prelude.<$> nodeCount,
+            ("ReservationId" Data..=) Prelude.<$> reservationId,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ( "ReservedNodesOfferingId"
+                  Data..= reservedNodesOfferingId
+              )
+          ]
+      )
+
+instance Data.ToPath PurchaseReservedNodesOffering where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PurchaseReservedNodesOffering where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPurchaseReservedNodesOfferingResponse' smart constructor.
+data PurchaseReservedNodesOfferingResponse = PurchaseReservedNodesOfferingResponse'
+  { -- | Represents the output of a @PurchaseReservedNodesOffering@ operation.
+    reservedNode :: Prelude.Maybe ReservedNode,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PurchaseReservedNodesOfferingResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'reservedNode', 'purchaseReservedNodesOfferingResponse_reservedNode' - Represents the output of a @PurchaseReservedNodesOffering@ operation.
+--
+-- 'httpStatus', 'purchaseReservedNodesOfferingResponse_httpStatus' - The response's http status code.
+newPurchaseReservedNodesOfferingResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PurchaseReservedNodesOfferingResponse
+newPurchaseReservedNodesOfferingResponse pHttpStatus_ =
+  PurchaseReservedNodesOfferingResponse'
+    { reservedNode =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Represents the output of a @PurchaseReservedNodesOffering@ operation.
+purchaseReservedNodesOfferingResponse_reservedNode :: Lens.Lens' PurchaseReservedNodesOfferingResponse (Prelude.Maybe ReservedNode)
+purchaseReservedNodesOfferingResponse_reservedNode = Lens.lens (\PurchaseReservedNodesOfferingResponse' {reservedNode} -> reservedNode) (\s@PurchaseReservedNodesOfferingResponse' {} a -> s {reservedNode = a} :: PurchaseReservedNodesOfferingResponse)
+
+-- | The response's http status code.
+purchaseReservedNodesOfferingResponse_httpStatus :: Lens.Lens' PurchaseReservedNodesOfferingResponse Prelude.Int
+purchaseReservedNodesOfferingResponse_httpStatus = Lens.lens (\PurchaseReservedNodesOfferingResponse' {httpStatus} -> httpStatus) (\s@PurchaseReservedNodesOfferingResponse' {} a -> s {httpStatus = a} :: PurchaseReservedNodesOfferingResponse)
+
+instance
+  Prelude.NFData
+    PurchaseReservedNodesOfferingResponse
+  where
+  rnf PurchaseReservedNodesOfferingResponse' {..} =
+    Prelude.rnf reservedNode
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/ResetParameterGroup.hs b/gen/Amazonka/MemoryDb/ResetParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/ResetParameterGroup.hs
@@ -0,0 +1,217 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.ResetParameterGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies the parameters of a parameter group to the engine or system
+-- default value. You can reset specific parameters by submitting a list of
+-- parameter names. To reset the entire parameter group, specify the
+-- AllParameters and ParameterGroupName parameters.
+module Amazonka.MemoryDb.ResetParameterGroup
+  ( -- * Creating a Request
+    ResetParameterGroup (..),
+    newResetParameterGroup,
+
+    -- * Request Lenses
+    resetParameterGroup_allParameters,
+    resetParameterGroup_parameterNames,
+    resetParameterGroup_parameterGroupName,
+
+    -- * Destructuring the Response
+    ResetParameterGroupResponse (..),
+    newResetParameterGroupResponse,
+
+    -- * Response Lenses
+    resetParameterGroupResponse_parameterGroup,
+    resetParameterGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newResetParameterGroup' smart constructor.
+data ResetParameterGroup = ResetParameterGroup'
+  { -- | If true, all parameters in the parameter group are reset to their
+    -- default values. If false, only the parameters listed by ParameterNames
+    -- are reset to their default values.
+    allParameters :: Prelude.Maybe Prelude.Bool,
+    -- | An array of parameter names to reset to their default values. If
+    -- AllParameters is true, do not use ParameterNames. If AllParameters is
+    -- false, you must specify the name of at least one parameter to reset.
+    parameterNames :: Prelude.Maybe [Prelude.Text],
+    -- | The name of the parameter group to reset.
+    parameterGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResetParameterGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'allParameters', 'resetParameterGroup_allParameters' - If true, all parameters in the parameter group are reset to their
+-- default values. If false, only the parameters listed by ParameterNames
+-- are reset to their default values.
+--
+-- 'parameterNames', 'resetParameterGroup_parameterNames' - An array of parameter names to reset to their default values. If
+-- AllParameters is true, do not use ParameterNames. If AllParameters is
+-- false, you must specify the name of at least one parameter to reset.
+--
+-- 'parameterGroupName', 'resetParameterGroup_parameterGroupName' - The name of the parameter group to reset.
+newResetParameterGroup ::
+  -- | 'parameterGroupName'
+  Prelude.Text ->
+  ResetParameterGroup
+newResetParameterGroup pParameterGroupName_ =
+  ResetParameterGroup'
+    { allParameters =
+        Prelude.Nothing,
+      parameterNames = Prelude.Nothing,
+      parameterGroupName = pParameterGroupName_
+    }
+
+-- | If true, all parameters in the parameter group are reset to their
+-- default values. If false, only the parameters listed by ParameterNames
+-- are reset to their default values.
+resetParameterGroup_allParameters :: Lens.Lens' ResetParameterGroup (Prelude.Maybe Prelude.Bool)
+resetParameterGroup_allParameters = Lens.lens (\ResetParameterGroup' {allParameters} -> allParameters) (\s@ResetParameterGroup' {} a -> s {allParameters = a} :: ResetParameterGroup)
+
+-- | An array of parameter names to reset to their default values. If
+-- AllParameters is true, do not use ParameterNames. If AllParameters is
+-- false, you must specify the name of at least one parameter to reset.
+resetParameterGroup_parameterNames :: Lens.Lens' ResetParameterGroup (Prelude.Maybe [Prelude.Text])
+resetParameterGroup_parameterNames = Lens.lens (\ResetParameterGroup' {parameterNames} -> parameterNames) (\s@ResetParameterGroup' {} a -> s {parameterNames = a} :: ResetParameterGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the parameter group to reset.
+resetParameterGroup_parameterGroupName :: Lens.Lens' ResetParameterGroup Prelude.Text
+resetParameterGroup_parameterGroupName = Lens.lens (\ResetParameterGroup' {parameterGroupName} -> parameterGroupName) (\s@ResetParameterGroup' {} a -> s {parameterGroupName = a} :: ResetParameterGroup)
+
+instance Core.AWSRequest ResetParameterGroup where
+  type
+    AWSResponse ResetParameterGroup =
+      ResetParameterGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ResetParameterGroupResponse'
+            Prelude.<$> (x Data..?> "ParameterGroup")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ResetParameterGroup where
+  hashWithSalt _salt ResetParameterGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` allParameters
+      `Prelude.hashWithSalt` parameterNames
+      `Prelude.hashWithSalt` parameterGroupName
+
+instance Prelude.NFData ResetParameterGroup where
+  rnf ResetParameterGroup' {..} =
+    Prelude.rnf allParameters
+      `Prelude.seq` Prelude.rnf parameterNames
+      `Prelude.seq` Prelude.rnf parameterGroupName
+
+instance Data.ToHeaders ResetParameterGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.ResetParameterGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ResetParameterGroup where
+  toJSON ResetParameterGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AllParameters" Data..=) Prelude.<$> allParameters,
+            ("ParameterNames" Data..=)
+              Prelude.<$> parameterNames,
+            Prelude.Just
+              ("ParameterGroupName" Data..= parameterGroupName)
+          ]
+      )
+
+instance Data.ToPath ResetParameterGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ResetParameterGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newResetParameterGroupResponse' smart constructor.
+data ResetParameterGroupResponse = ResetParameterGroupResponse'
+  { -- | The parameter group being reset.
+    parameterGroup :: Prelude.Maybe ParameterGroup,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResetParameterGroupResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'parameterGroup', 'resetParameterGroupResponse_parameterGroup' - The parameter group being reset.
+--
+-- 'httpStatus', 'resetParameterGroupResponse_httpStatus' - The response's http status code.
+newResetParameterGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ResetParameterGroupResponse
+newResetParameterGroupResponse pHttpStatus_ =
+  ResetParameterGroupResponse'
+    { parameterGroup =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The parameter group being reset.
+resetParameterGroupResponse_parameterGroup :: Lens.Lens' ResetParameterGroupResponse (Prelude.Maybe ParameterGroup)
+resetParameterGroupResponse_parameterGroup = Lens.lens (\ResetParameterGroupResponse' {parameterGroup} -> parameterGroup) (\s@ResetParameterGroupResponse' {} a -> s {parameterGroup = a} :: ResetParameterGroupResponse)
+
+-- | The response's http status code.
+resetParameterGroupResponse_httpStatus :: Lens.Lens' ResetParameterGroupResponse Prelude.Int
+resetParameterGroupResponse_httpStatus = Lens.lens (\ResetParameterGroupResponse' {httpStatus} -> httpStatus) (\s@ResetParameterGroupResponse' {} a -> s {httpStatus = a} :: ResetParameterGroupResponse)
+
+instance Prelude.NFData ResetParameterGroupResponse where
+  rnf ResetParameterGroupResponse' {..} =
+    Prelude.rnf parameterGroup
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/TagResource.hs b/gen/Amazonka/MemoryDb/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/TagResource.hs
@@ -0,0 +1,199 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- A tag is a key-value pair where the key and value are case-sensitive.
+-- You can use tags to categorize and track all your MemoryDB resources.
+-- When you add or remove tags on clusters, those actions will be
+-- replicated to all nodes in the cluster. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/iam.resourcelevelpermissions.html Resource-level permissions>.
+--
+-- For example, you can use cost-allocation tags to your MemoryDB
+-- resources, Amazon generates a cost allocation report as a
+-- comma-separated value (CSV) file with your usage and costs aggregated by
+-- your tags. You can apply tags that represent business categories (such
+-- as cost centers, application names, or owners) to organize your costs
+-- across multiple services. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/tagging.html Using Cost Allocation Tags>.
+module Amazonka.MemoryDb.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_tagList,
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource to which the tags are to
+    -- be added
+    resourceArn :: Prelude.Text,
+    -- | A list of tags to be added to this resource. A tag is a key-value pair.
+    -- A tag key must be accompanied by a tag value, although null is accepted.
+    tags :: [Tag]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource to which the tags are to
+-- be added
+--
+-- 'tags', 'tagResource_tags' - A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource to which the tags are to
+-- be added
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | A list of tags to be added to this resource. A tag is a key-value pair.
+-- A tag key must be accompanied by a tag value, although null is accepted.
+tagResource_tags :: Lens.Lens' TagResource [Tag]
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (x Data..?> "TagList" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("AmazonMemoryDB.TagResource" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ResourceArn" Data..= resourceArn),
+            Prelude.Just ("Tags" Data..= tags)
+          ]
+      )
+
+instance Data.ToPath TagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | A list of tags as key-value pairs.
+    tagList :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tagList', 'tagResourceResponse_tagList' - A list of tags as key-value pairs.
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse'
+    { tagList = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of tags as key-value pairs.
+tagResourceResponse_tagList :: Lens.Lens' TagResourceResponse (Prelude.Maybe [Tag])
+tagResourceResponse_tagList = Lens.lens (\TagResourceResponse' {tagList} -> tagList) (\s@TagResourceResponse' {} a -> s {tagList = a} :: TagResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} =
+    Prelude.rnf tagList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/Types.hs b/gen/Amazonka/MemoryDb/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types.hs
@@ -0,0 +1,845 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _ACLAlreadyExistsFault,
+    _ACLNotFoundFault,
+    _ACLQuotaExceededFault,
+    _APICallRateForCustomerExceededFault,
+    _ClusterAlreadyExistsFault,
+    _ClusterNotFoundFault,
+    _ClusterQuotaForCustomerExceededFault,
+    _DefaultUserRequired,
+    _DuplicateUserNameFault,
+    _InsufficientClusterCapacityFault,
+    _InvalidACLStateFault,
+    _InvalidARNFault,
+    _InvalidClusterStateFault,
+    _InvalidCredentialsException,
+    _InvalidKMSKeyFault,
+    _InvalidNodeStateFault,
+    _InvalidParameterCombinationException,
+    _InvalidParameterGroupStateFault,
+    _InvalidParameterValueException,
+    _InvalidSnapshotStateFault,
+    _InvalidSubnet,
+    _InvalidUserStateFault,
+    _InvalidVPCNetworkStateFault,
+    _NoOperationFault,
+    _NodeQuotaForClusterExceededFault,
+    _NodeQuotaForCustomerExceededFault,
+    _ParameterGroupAlreadyExistsFault,
+    _ParameterGroupNotFoundFault,
+    _ParameterGroupQuotaExceededFault,
+    _ReservedNodeAlreadyExistsFault,
+    _ReservedNodeNotFoundFault,
+    _ReservedNodeQuotaExceededFault,
+    _ReservedNodesOfferingNotFoundFault,
+    _ServiceLinkedRoleNotFoundFault,
+    _ServiceUpdateNotFoundFault,
+    _ShardNotFoundFault,
+    _ShardsPerClusterQuotaExceededFault,
+    _SnapshotAlreadyExistsFault,
+    _SnapshotNotFoundFault,
+    _SnapshotQuotaExceededFault,
+    _SubnetGroupAlreadyExistsFault,
+    _SubnetGroupInUseFault,
+    _SubnetGroupNotFoundFault,
+    _SubnetGroupQuotaExceededFault,
+    _SubnetInUse,
+    _SubnetNotAllowedFault,
+    _SubnetQuotaExceededFault,
+    _TagNotFoundFault,
+    _TagQuotaPerResourceExceeded,
+    _TestFailoverNotAvailableFault,
+    _UserAlreadyExistsFault,
+    _UserNotFoundFault,
+    _UserQuotaExceededFault,
+
+    -- * AZStatus
+    AZStatus (..),
+
+    -- * AuthenticationType
+    AuthenticationType (..),
+
+    -- * DataTieringStatus
+    DataTieringStatus (..),
+
+    -- * InputAuthenticationType
+    InputAuthenticationType (..),
+
+    -- * ServiceUpdateStatus
+    ServiceUpdateStatus (..),
+
+    -- * ServiceUpdateType
+    ServiceUpdateType (..),
+
+    -- * SourceType
+    SourceType (..),
+
+    -- * ACL
+    ACL (..),
+    newACL,
+    acl_arn,
+    acl_clusters,
+    acl_minimumEngineVersion,
+    acl_name,
+    acl_pendingChanges,
+    acl_status,
+    acl_userNames,
+
+    -- * ACLPendingChanges
+    ACLPendingChanges (..),
+    newACLPendingChanges,
+    aCLPendingChanges_userNamesToAdd,
+    aCLPendingChanges_userNamesToRemove,
+
+    -- * ACLsUpdateStatus
+    ACLsUpdateStatus (..),
+    newACLsUpdateStatus,
+    aCLsUpdateStatus_aCLToApply,
+
+    -- * Authentication
+    Authentication (..),
+    newAuthentication,
+    authentication_passwordCount,
+    authentication_type,
+
+    -- * AuthenticationMode
+    AuthenticationMode (..),
+    newAuthenticationMode,
+    authenticationMode_passwords,
+    authenticationMode_type,
+
+    -- * AvailabilityZone
+    AvailabilityZone (..),
+    newAvailabilityZone,
+    availabilityZone_name,
+
+    -- * Cluster
+    Cluster (..),
+    newCluster,
+    cluster_aCLName,
+    cluster_arn,
+    cluster_autoMinorVersionUpgrade,
+    cluster_availabilityMode,
+    cluster_clusterEndpoint,
+    cluster_dataTiering,
+    cluster_description,
+    cluster_enginePatchVersion,
+    cluster_engineVersion,
+    cluster_kmsKeyId,
+    cluster_maintenanceWindow,
+    cluster_name,
+    cluster_nodeType,
+    cluster_numberOfShards,
+    cluster_parameterGroupName,
+    cluster_parameterGroupStatus,
+    cluster_pendingUpdates,
+    cluster_securityGroups,
+    cluster_shards,
+    cluster_snapshotRetentionLimit,
+    cluster_snapshotWindow,
+    cluster_snsTopicArn,
+    cluster_snsTopicStatus,
+    cluster_status,
+    cluster_subnetGroupName,
+    cluster_tLSEnabled,
+
+    -- * ClusterConfiguration
+    ClusterConfiguration (..),
+    newClusterConfiguration,
+    clusterConfiguration_description,
+    clusterConfiguration_engineVersion,
+    clusterConfiguration_maintenanceWindow,
+    clusterConfiguration_name,
+    clusterConfiguration_nodeType,
+    clusterConfiguration_numShards,
+    clusterConfiguration_parameterGroupName,
+    clusterConfiguration_port,
+    clusterConfiguration_shards,
+    clusterConfiguration_snapshotRetentionLimit,
+    clusterConfiguration_snapshotWindow,
+    clusterConfiguration_subnetGroupName,
+    clusterConfiguration_topicArn,
+    clusterConfiguration_vpcId,
+
+    -- * ClusterPendingUpdates
+    ClusterPendingUpdates (..),
+    newClusterPendingUpdates,
+    clusterPendingUpdates_aCLs,
+    clusterPendingUpdates_resharding,
+    clusterPendingUpdates_serviceUpdates,
+
+    -- * Endpoint
+    Endpoint (..),
+    newEndpoint,
+    endpoint_address,
+    endpoint_port,
+
+    -- * EngineVersionInfo
+    EngineVersionInfo (..),
+    newEngineVersionInfo,
+    engineVersionInfo_enginePatchVersion,
+    engineVersionInfo_engineVersion,
+    engineVersionInfo_parameterGroupFamily,
+
+    -- * Event
+    Event (..),
+    newEvent,
+    event_date,
+    event_message,
+    event_sourceName,
+    event_sourceType,
+
+    -- * Filter
+    Filter (..),
+    newFilter,
+    filter_name,
+    filter_values,
+
+    -- * Node
+    Node (..),
+    newNode,
+    node_availabilityZone,
+    node_createTime,
+    node_endpoint,
+    node_name,
+    node_status,
+
+    -- * Parameter
+    Parameter (..),
+    newParameter,
+    parameter_allowedValues,
+    parameter_dataType,
+    parameter_description,
+    parameter_minimumEngineVersion,
+    parameter_name,
+    parameter_value,
+
+    -- * ParameterGroup
+    ParameterGroup (..),
+    newParameterGroup,
+    parameterGroup_arn,
+    parameterGroup_description,
+    parameterGroup_family,
+    parameterGroup_name,
+
+    -- * ParameterNameValue
+    ParameterNameValue (..),
+    newParameterNameValue,
+    parameterNameValue_parameterName,
+    parameterNameValue_parameterValue,
+
+    -- * PendingModifiedServiceUpdate
+    PendingModifiedServiceUpdate (..),
+    newPendingModifiedServiceUpdate,
+    pendingModifiedServiceUpdate_serviceUpdateName,
+    pendingModifiedServiceUpdate_status,
+
+    -- * RecurringCharge
+    RecurringCharge (..),
+    newRecurringCharge,
+    recurringCharge_recurringChargeAmount,
+    recurringCharge_recurringChargeFrequency,
+
+    -- * ReplicaConfigurationRequest
+    ReplicaConfigurationRequest (..),
+    newReplicaConfigurationRequest,
+    replicaConfigurationRequest_replicaCount,
+
+    -- * ReservedNode
+    ReservedNode (..),
+    newReservedNode,
+    reservedNode_arn,
+    reservedNode_duration,
+    reservedNode_fixedPrice,
+    reservedNode_nodeCount,
+    reservedNode_nodeType,
+    reservedNode_offeringType,
+    reservedNode_recurringCharges,
+    reservedNode_reservationId,
+    reservedNode_reservedNodesOfferingId,
+    reservedNode_startTime,
+    reservedNode_state,
+
+    -- * ReservedNodesOffering
+    ReservedNodesOffering (..),
+    newReservedNodesOffering,
+    reservedNodesOffering_duration,
+    reservedNodesOffering_fixedPrice,
+    reservedNodesOffering_nodeType,
+    reservedNodesOffering_offeringType,
+    reservedNodesOffering_recurringCharges,
+    reservedNodesOffering_reservedNodesOfferingId,
+
+    -- * ReshardingStatus
+    ReshardingStatus (..),
+    newReshardingStatus,
+    reshardingStatus_slotMigration,
+
+    -- * SecurityGroupMembership
+    SecurityGroupMembership (..),
+    newSecurityGroupMembership,
+    securityGroupMembership_securityGroupId,
+    securityGroupMembership_status,
+
+    -- * ServiceUpdate
+    ServiceUpdate (..),
+    newServiceUpdate,
+    serviceUpdate_autoUpdateStartDate,
+    serviceUpdate_clusterName,
+    serviceUpdate_description,
+    serviceUpdate_nodesUpdated,
+    serviceUpdate_releaseDate,
+    serviceUpdate_serviceUpdateName,
+    serviceUpdate_status,
+    serviceUpdate_type,
+
+    -- * ServiceUpdateRequest
+    ServiceUpdateRequest (..),
+    newServiceUpdateRequest,
+    serviceUpdateRequest_serviceUpdateNameToApply,
+
+    -- * Shard
+    Shard (..),
+    newShard,
+    shard_name,
+    shard_nodes,
+    shard_numberOfNodes,
+    shard_slots,
+    shard_status,
+
+    -- * ShardConfiguration
+    ShardConfiguration (..),
+    newShardConfiguration,
+    shardConfiguration_replicaCount,
+    shardConfiguration_slots,
+
+    -- * ShardConfigurationRequest
+    ShardConfigurationRequest (..),
+    newShardConfigurationRequest,
+    shardConfigurationRequest_shardCount,
+
+    -- * ShardDetail
+    ShardDetail (..),
+    newShardDetail,
+    shardDetail_configuration,
+    shardDetail_name,
+    shardDetail_size,
+    shardDetail_snapshotCreationTime,
+
+    -- * SlotMigration
+    SlotMigration (..),
+    newSlotMigration,
+    slotMigration_progressPercentage,
+
+    -- * Snapshot
+    Snapshot (..),
+    newSnapshot,
+    snapshot_arn,
+    snapshot_clusterConfiguration,
+    snapshot_dataTiering,
+    snapshot_kmsKeyId,
+    snapshot_name,
+    snapshot_source,
+    snapshot_status,
+
+    -- * Subnet
+    Subnet (..),
+    newSubnet,
+    subnet_availabilityZone,
+    subnet_identifier,
+
+    -- * SubnetGroup
+    SubnetGroup (..),
+    newSubnetGroup,
+    subnetGroup_arn,
+    subnetGroup_description,
+    subnetGroup_name,
+    subnetGroup_subnets,
+    subnetGroup_vpcId,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+
+    -- * UnprocessedCluster
+    UnprocessedCluster (..),
+    newUnprocessedCluster,
+    unprocessedCluster_clusterName,
+    unprocessedCluster_errorMessage,
+    unprocessedCluster_errorType,
+
+    -- * User
+    User (..),
+    newUser,
+    user_aCLNames,
+    user_arn,
+    user_accessString,
+    user_authentication,
+    user_minimumEngineVersion,
+    user_name,
+    user_status,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.MemoryDb.Types.ACL
+import Amazonka.MemoryDb.Types.ACLPendingChanges
+import Amazonka.MemoryDb.Types.ACLsUpdateStatus
+import Amazonka.MemoryDb.Types.AZStatus
+import Amazonka.MemoryDb.Types.Authentication
+import Amazonka.MemoryDb.Types.AuthenticationMode
+import Amazonka.MemoryDb.Types.AuthenticationType
+import Amazonka.MemoryDb.Types.AvailabilityZone
+import Amazonka.MemoryDb.Types.Cluster
+import Amazonka.MemoryDb.Types.ClusterConfiguration
+import Amazonka.MemoryDb.Types.ClusterPendingUpdates
+import Amazonka.MemoryDb.Types.DataTieringStatus
+import Amazonka.MemoryDb.Types.Endpoint
+import Amazonka.MemoryDb.Types.EngineVersionInfo
+import Amazonka.MemoryDb.Types.Event
+import Amazonka.MemoryDb.Types.Filter
+import Amazonka.MemoryDb.Types.InputAuthenticationType
+import Amazonka.MemoryDb.Types.Node
+import Amazonka.MemoryDb.Types.Parameter
+import Amazonka.MemoryDb.Types.ParameterGroup
+import Amazonka.MemoryDb.Types.ParameterNameValue
+import Amazonka.MemoryDb.Types.PendingModifiedServiceUpdate
+import Amazonka.MemoryDb.Types.RecurringCharge
+import Amazonka.MemoryDb.Types.ReplicaConfigurationRequest
+import Amazonka.MemoryDb.Types.ReservedNode
+import Amazonka.MemoryDb.Types.ReservedNodesOffering
+import Amazonka.MemoryDb.Types.ReshardingStatus
+import Amazonka.MemoryDb.Types.SecurityGroupMembership
+import Amazonka.MemoryDb.Types.ServiceUpdate
+import Amazonka.MemoryDb.Types.ServiceUpdateRequest
+import Amazonka.MemoryDb.Types.ServiceUpdateStatus
+import Amazonka.MemoryDb.Types.ServiceUpdateType
+import Amazonka.MemoryDb.Types.Shard
+import Amazonka.MemoryDb.Types.ShardConfiguration
+import Amazonka.MemoryDb.Types.ShardConfigurationRequest
+import Amazonka.MemoryDb.Types.ShardDetail
+import Amazonka.MemoryDb.Types.SlotMigration
+import Amazonka.MemoryDb.Types.Snapshot
+import Amazonka.MemoryDb.Types.SourceType
+import Amazonka.MemoryDb.Types.Subnet
+import Amazonka.MemoryDb.Types.SubnetGroup
+import Amazonka.MemoryDb.Types.Tag
+import Amazonka.MemoryDb.Types.UnprocessedCluster
+import Amazonka.MemoryDb.Types.User
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2021-01-01@ of the Amazon MemoryDB SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "MemoryDb",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "memory-db",
+      Core.signingName = "memorydb",
+      Core.version = "2021-01-01",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "MemoryDb",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+_ACLAlreadyExistsFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ACLAlreadyExistsFault =
+  Core._MatchServiceError
+    defaultService
+    "ACLAlreadyExistsFault"
+
+_ACLNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ACLNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "ACLNotFoundFault"
+
+_ACLQuotaExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ACLQuotaExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "ACLQuotaExceededFault"
+
+_APICallRateForCustomerExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_APICallRateForCustomerExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "APICallRateForCustomerExceededFault"
+
+_ClusterAlreadyExistsFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ClusterAlreadyExistsFault =
+  Core._MatchServiceError
+    defaultService
+    "ClusterAlreadyExistsFault"
+
+_ClusterNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ClusterNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "ClusterNotFoundFault"
+
+_ClusterQuotaForCustomerExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ClusterQuotaForCustomerExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "ClusterQuotaForCustomerExceededFault"
+
+_DefaultUserRequired :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_DefaultUserRequired =
+  Core._MatchServiceError
+    defaultService
+    "DefaultUserRequired"
+
+_DuplicateUserNameFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_DuplicateUserNameFault =
+  Core._MatchServiceError
+    defaultService
+    "DuplicateUserNameFault"
+
+_InsufficientClusterCapacityFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InsufficientClusterCapacityFault =
+  Core._MatchServiceError
+    defaultService
+    "InsufficientClusterCapacityFault"
+
+_InvalidACLStateFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidACLStateFault =
+  Core._MatchServiceError
+    defaultService
+    "InvalidACLStateFault"
+
+_InvalidARNFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidARNFault =
+  Core._MatchServiceError
+    defaultService
+    "InvalidARNFault"
+
+_InvalidClusterStateFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidClusterStateFault =
+  Core._MatchServiceError
+    defaultService
+    "InvalidClusterStateFault"
+
+_InvalidCredentialsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidCredentialsException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidCredentialsException"
+
+_InvalidKMSKeyFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidKMSKeyFault =
+  Core._MatchServiceError
+    defaultService
+    "InvalidKMSKeyFault"
+
+_InvalidNodeStateFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidNodeStateFault =
+  Core._MatchServiceError
+    defaultService
+    "InvalidNodeStateFault"
+
+_InvalidParameterCombinationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidParameterCombinationException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidParameterCombinationException"
+
+_InvalidParameterGroupStateFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidParameterGroupStateFault =
+  Core._MatchServiceError
+    defaultService
+    "InvalidParameterGroupStateFault"
+
+_InvalidParameterValueException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidParameterValueException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidParameterValueException"
+
+_InvalidSnapshotStateFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidSnapshotStateFault =
+  Core._MatchServiceError
+    defaultService
+    "InvalidSnapshotStateFault"
+
+_InvalidSubnet :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidSubnet =
+  Core._MatchServiceError
+    defaultService
+    "InvalidSubnet"
+
+_InvalidUserStateFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidUserStateFault =
+  Core._MatchServiceError
+    defaultService
+    "InvalidUserStateFault"
+
+_InvalidVPCNetworkStateFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidVPCNetworkStateFault =
+  Core._MatchServiceError
+    defaultService
+    "InvalidVPCNetworkStateFault"
+
+_NoOperationFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_NoOperationFault =
+  Core._MatchServiceError
+    defaultService
+    "NoOperationFault"
+
+_NodeQuotaForClusterExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_NodeQuotaForClusterExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "NodeQuotaForClusterExceededFault"
+
+_NodeQuotaForCustomerExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_NodeQuotaForCustomerExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "NodeQuotaForCustomerExceededFault"
+
+_ParameterGroupAlreadyExistsFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ParameterGroupAlreadyExistsFault =
+  Core._MatchServiceError
+    defaultService
+    "ParameterGroupAlreadyExistsFault"
+
+_ParameterGroupNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ParameterGroupNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "ParameterGroupNotFoundFault"
+
+_ParameterGroupQuotaExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ParameterGroupQuotaExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "ParameterGroupQuotaExceededFault"
+
+-- | You already have a reservation with the given identifier.
+_ReservedNodeAlreadyExistsFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ReservedNodeAlreadyExistsFault =
+  Core._MatchServiceError
+    defaultService
+    "ReservedNodeAlreadyExistsFault"
+
+-- | The requested node does not exist.
+_ReservedNodeNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ReservedNodeNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "ReservedNodeNotFoundFault"
+
+-- | The request cannot be processed because it would exceed the user\'s node
+-- quota.
+_ReservedNodeQuotaExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ReservedNodeQuotaExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "ReservedNodeQuotaExceededFault"
+
+-- | The requested node offering does not exist.
+_ReservedNodesOfferingNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ReservedNodesOfferingNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "ReservedNodesOfferingNotFoundFault"
+
+_ServiceLinkedRoleNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceLinkedRoleNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "ServiceLinkedRoleNotFoundFault"
+
+_ServiceUpdateNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceUpdateNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "ServiceUpdateNotFoundFault"
+
+_ShardNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ShardNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "ShardNotFoundFault"
+
+_ShardsPerClusterQuotaExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ShardsPerClusterQuotaExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "ShardsPerClusterQuotaExceededFault"
+
+_SnapshotAlreadyExistsFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_SnapshotAlreadyExistsFault =
+  Core._MatchServiceError
+    defaultService
+    "SnapshotAlreadyExistsFault"
+
+_SnapshotNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_SnapshotNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "SnapshotNotFoundFault"
+
+_SnapshotQuotaExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_SnapshotQuotaExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "SnapshotQuotaExceededFault"
+
+_SubnetGroupAlreadyExistsFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_SubnetGroupAlreadyExistsFault =
+  Core._MatchServiceError
+    defaultService
+    "SubnetGroupAlreadyExistsFault"
+
+_SubnetGroupInUseFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_SubnetGroupInUseFault =
+  Core._MatchServiceError
+    defaultService
+    "SubnetGroupInUseFault"
+
+_SubnetGroupNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_SubnetGroupNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "SubnetGroupNotFoundFault"
+
+_SubnetGroupQuotaExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_SubnetGroupQuotaExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "SubnetGroupQuotaExceededFault"
+
+_SubnetInUse :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_SubnetInUse =
+  Core._MatchServiceError
+    defaultService
+    "SubnetInUse"
+
+_SubnetNotAllowedFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_SubnetNotAllowedFault =
+  Core._MatchServiceError
+    defaultService
+    "SubnetNotAllowedFault"
+
+_SubnetQuotaExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_SubnetQuotaExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "SubnetQuotaExceededFault"
+
+_TagNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TagNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "TagNotFoundFault"
+
+_TagQuotaPerResourceExceeded :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TagQuotaPerResourceExceeded =
+  Core._MatchServiceError
+    defaultService
+    "TagQuotaPerResourceExceeded"
+
+_TestFailoverNotAvailableFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TestFailoverNotAvailableFault =
+  Core._MatchServiceError
+    defaultService
+    "TestFailoverNotAvailableFault"
+
+_UserAlreadyExistsFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UserAlreadyExistsFault =
+  Core._MatchServiceError
+    defaultService
+    "UserAlreadyExistsFault"
+
+_UserNotFoundFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UserNotFoundFault =
+  Core._MatchServiceError
+    defaultService
+    "UserNotFoundFault"
+
+_UserQuotaExceededFault :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UserQuotaExceededFault =
+  Core._MatchServiceError
+    defaultService
+    "UserQuotaExceededFault"
diff --git a/gen/Amazonka/MemoryDb/Types/ACL.hs b/gen/Amazonka/MemoryDb/Types/ACL.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ACL.hs
@@ -0,0 +1,151 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ACL
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ACL where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.ACLPendingChanges
+import qualified Amazonka.Prelude as Prelude
+
+-- | An Access Control List. You can authenticate users with Access Contol
+-- Lists. ACLs enable you to control cluster access by grouping users.
+-- These Access control lists are designed as a way to organize access to
+-- clusters.
+--
+-- /See:/ 'newACL' smart constructor.
+data ACL = ACL'
+  { -- | The Amazon Resource Name (ARN) of the ACL
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | A list of clusters associated with the ACL.
+    clusters :: Prelude.Maybe [Prelude.Text],
+    -- | The minimum engine version supported for the ACL
+    minimumEngineVersion :: Prelude.Maybe Prelude.Text,
+    -- | The name of the Access Control List
+    name :: Prelude.Maybe Prelude.Text,
+    -- | A list of updates being applied to the ACL.
+    pendingChanges :: Prelude.Maybe ACLPendingChanges,
+    -- | Indicates ACL status. Can be \"creating\", \"active\", \"modifying\",
+    -- \"deleting\".
+    status :: Prelude.Maybe Prelude.Text,
+    -- | The list of user names that belong to the ACL.
+    userNames :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ACL' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'acl_arn' - The Amazon Resource Name (ARN) of the ACL
+--
+-- 'clusters', 'acl_clusters' - A list of clusters associated with the ACL.
+--
+-- 'minimumEngineVersion', 'acl_minimumEngineVersion' - The minimum engine version supported for the ACL
+--
+-- 'name', 'acl_name' - The name of the Access Control List
+--
+-- 'pendingChanges', 'acl_pendingChanges' - A list of updates being applied to the ACL.
+--
+-- 'status', 'acl_status' - Indicates ACL status. Can be \"creating\", \"active\", \"modifying\",
+-- \"deleting\".
+--
+-- 'userNames', 'acl_userNames' - The list of user names that belong to the ACL.
+newACL ::
+  ACL
+newACL =
+  ACL'
+    { arn = Prelude.Nothing,
+      clusters = Prelude.Nothing,
+      minimumEngineVersion = Prelude.Nothing,
+      name = Prelude.Nothing,
+      pendingChanges = Prelude.Nothing,
+      status = Prelude.Nothing,
+      userNames = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the ACL
+acl_arn :: Lens.Lens' ACL (Prelude.Maybe Prelude.Text)
+acl_arn = Lens.lens (\ACL' {arn} -> arn) (\s@ACL' {} a -> s {arn = a} :: ACL)
+
+-- | A list of clusters associated with the ACL.
+acl_clusters :: Lens.Lens' ACL (Prelude.Maybe [Prelude.Text])
+acl_clusters = Lens.lens (\ACL' {clusters} -> clusters) (\s@ACL' {} a -> s {clusters = a} :: ACL) Prelude.. Lens.mapping Lens.coerced
+
+-- | The minimum engine version supported for the ACL
+acl_minimumEngineVersion :: Lens.Lens' ACL (Prelude.Maybe Prelude.Text)
+acl_minimumEngineVersion = Lens.lens (\ACL' {minimumEngineVersion} -> minimumEngineVersion) (\s@ACL' {} a -> s {minimumEngineVersion = a} :: ACL)
+
+-- | The name of the Access Control List
+acl_name :: Lens.Lens' ACL (Prelude.Maybe Prelude.Text)
+acl_name = Lens.lens (\ACL' {name} -> name) (\s@ACL' {} a -> s {name = a} :: ACL)
+
+-- | A list of updates being applied to the ACL.
+acl_pendingChanges :: Lens.Lens' ACL (Prelude.Maybe ACLPendingChanges)
+acl_pendingChanges = Lens.lens (\ACL' {pendingChanges} -> pendingChanges) (\s@ACL' {} a -> s {pendingChanges = a} :: ACL)
+
+-- | Indicates ACL status. Can be \"creating\", \"active\", \"modifying\",
+-- \"deleting\".
+acl_status :: Lens.Lens' ACL (Prelude.Maybe Prelude.Text)
+acl_status = Lens.lens (\ACL' {status} -> status) (\s@ACL' {} a -> s {status = a} :: ACL)
+
+-- | The list of user names that belong to the ACL.
+acl_userNames :: Lens.Lens' ACL (Prelude.Maybe [Prelude.Text])
+acl_userNames = Lens.lens (\ACL' {userNames} -> userNames) (\s@ACL' {} a -> s {userNames = a} :: ACL) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ACL where
+  parseJSON =
+    Data.withObject
+      "ACL"
+      ( \x ->
+          ACL'
+            Prelude.<$> (x Data..:? "ARN")
+            Prelude.<*> (x Data..:? "Clusters" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "MinimumEngineVersion")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "PendingChanges")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "UserNames" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ACL where
+  hashWithSalt _salt ACL' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` clusters
+      `Prelude.hashWithSalt` minimumEngineVersion
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` pendingChanges
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` userNames
+
+instance Prelude.NFData ACL where
+  rnf ACL' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf clusters
+      `Prelude.seq` Prelude.rnf minimumEngineVersion
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf pendingChanges
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf userNames
diff --git a/gen/Amazonka/MemoryDb/Types/ACLPendingChanges.hs b/gen/Amazonka/MemoryDb/Types/ACLPendingChanges.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ACLPendingChanges.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ACLPendingChanges
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ACLPendingChanges where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Returns the updates being applied to the ACL.
+--
+-- /See:/ 'newACLPendingChanges' smart constructor.
+data ACLPendingChanges = ACLPendingChanges'
+  { -- | A list of users being added to the ACL
+    userNamesToAdd :: Prelude.Maybe [Prelude.Text],
+    -- | A list of user names being removed from the ACL
+    userNamesToRemove :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ACLPendingChanges' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'userNamesToAdd', 'aCLPendingChanges_userNamesToAdd' - A list of users being added to the ACL
+--
+-- 'userNamesToRemove', 'aCLPendingChanges_userNamesToRemove' - A list of user names being removed from the ACL
+newACLPendingChanges ::
+  ACLPendingChanges
+newACLPendingChanges =
+  ACLPendingChanges'
+    { userNamesToAdd =
+        Prelude.Nothing,
+      userNamesToRemove = Prelude.Nothing
+    }
+
+-- | A list of users being added to the ACL
+aCLPendingChanges_userNamesToAdd :: Lens.Lens' ACLPendingChanges (Prelude.Maybe [Prelude.Text])
+aCLPendingChanges_userNamesToAdd = Lens.lens (\ACLPendingChanges' {userNamesToAdd} -> userNamesToAdd) (\s@ACLPendingChanges' {} a -> s {userNamesToAdd = a} :: ACLPendingChanges) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of user names being removed from the ACL
+aCLPendingChanges_userNamesToRemove :: Lens.Lens' ACLPendingChanges (Prelude.Maybe [Prelude.Text])
+aCLPendingChanges_userNamesToRemove = Lens.lens (\ACLPendingChanges' {userNamesToRemove} -> userNamesToRemove) (\s@ACLPendingChanges' {} a -> s {userNamesToRemove = a} :: ACLPendingChanges) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ACLPendingChanges where
+  parseJSON =
+    Data.withObject
+      "ACLPendingChanges"
+      ( \x ->
+          ACLPendingChanges'
+            Prelude.<$> (x Data..:? "UserNamesToAdd" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "UserNamesToRemove"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ACLPendingChanges where
+  hashWithSalt _salt ACLPendingChanges' {..} =
+    _salt
+      `Prelude.hashWithSalt` userNamesToAdd
+      `Prelude.hashWithSalt` userNamesToRemove
+
+instance Prelude.NFData ACLPendingChanges where
+  rnf ACLPendingChanges' {..} =
+    Prelude.rnf userNamesToAdd
+      `Prelude.seq` Prelude.rnf userNamesToRemove
diff --git a/gen/Amazonka/MemoryDb/Types/ACLsUpdateStatus.hs b/gen/Amazonka/MemoryDb/Types/ACLsUpdateStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ACLsUpdateStatus.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ACLsUpdateStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ACLsUpdateStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The status of the ACL update
+--
+-- /See:/ 'newACLsUpdateStatus' smart constructor.
+data ACLsUpdateStatus = ACLsUpdateStatus'
+  { -- | A list of ACLs pending to be applied.
+    aCLToApply :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ACLsUpdateStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aCLToApply', 'aCLsUpdateStatus_aCLToApply' - A list of ACLs pending to be applied.
+newACLsUpdateStatus ::
+  ACLsUpdateStatus
+newACLsUpdateStatus =
+  ACLsUpdateStatus' {aCLToApply = Prelude.Nothing}
+
+-- | A list of ACLs pending to be applied.
+aCLsUpdateStatus_aCLToApply :: Lens.Lens' ACLsUpdateStatus (Prelude.Maybe Prelude.Text)
+aCLsUpdateStatus_aCLToApply = Lens.lens (\ACLsUpdateStatus' {aCLToApply} -> aCLToApply) (\s@ACLsUpdateStatus' {} a -> s {aCLToApply = a} :: ACLsUpdateStatus)
+
+instance Data.FromJSON ACLsUpdateStatus where
+  parseJSON =
+    Data.withObject
+      "ACLsUpdateStatus"
+      ( \x ->
+          ACLsUpdateStatus'
+            Prelude.<$> (x Data..:? "ACLToApply")
+      )
+
+instance Prelude.Hashable ACLsUpdateStatus where
+  hashWithSalt _salt ACLsUpdateStatus' {..} =
+    _salt `Prelude.hashWithSalt` aCLToApply
+
+instance Prelude.NFData ACLsUpdateStatus where
+  rnf ACLsUpdateStatus' {..} = Prelude.rnf aCLToApply
diff --git a/gen/Amazonka/MemoryDb/Types/AZStatus.hs b/gen/Amazonka/MemoryDb/Types/AZStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/AZStatus.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.AZStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.AZStatus
+  ( AZStatus
+      ( ..,
+        AZStatus_Multiaz,
+        AZStatus_Singleaz
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AZStatus = AZStatus'
+  { fromAZStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AZStatus_Multiaz :: AZStatus
+pattern AZStatus_Multiaz = AZStatus' "multiaz"
+
+pattern AZStatus_Singleaz :: AZStatus
+pattern AZStatus_Singleaz = AZStatus' "singleaz"
+
+{-# COMPLETE
+  AZStatus_Multiaz,
+  AZStatus_Singleaz,
+  AZStatus'
+  #-}
diff --git a/gen/Amazonka/MemoryDb/Types/Authentication.hs b/gen/Amazonka/MemoryDb/Types/Authentication.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Authentication.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Authentication
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Authentication where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.AuthenticationType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Denotes the user\'s authentication properties, such as whether it
+-- requires a password to authenticate. Used in output responses.
+--
+-- /See:/ 'newAuthentication' smart constructor.
+data Authentication = Authentication'
+  { -- | The number of passwords belonging to the user. The maximum is two.
+    passwordCount :: Prelude.Maybe Prelude.Int,
+    -- | Indicates whether the user requires a password to authenticate.
+    type' :: Prelude.Maybe AuthenticationType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Authentication' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'passwordCount', 'authentication_passwordCount' - The number of passwords belonging to the user. The maximum is two.
+--
+-- 'type'', 'authentication_type' - Indicates whether the user requires a password to authenticate.
+newAuthentication ::
+  Authentication
+newAuthentication =
+  Authentication'
+    { passwordCount = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The number of passwords belonging to the user. The maximum is two.
+authentication_passwordCount :: Lens.Lens' Authentication (Prelude.Maybe Prelude.Int)
+authentication_passwordCount = Lens.lens (\Authentication' {passwordCount} -> passwordCount) (\s@Authentication' {} a -> s {passwordCount = a} :: Authentication)
+
+-- | Indicates whether the user requires a password to authenticate.
+authentication_type :: Lens.Lens' Authentication (Prelude.Maybe AuthenticationType)
+authentication_type = Lens.lens (\Authentication' {type'} -> type') (\s@Authentication' {} a -> s {type' = a} :: Authentication)
+
+instance Data.FromJSON Authentication where
+  parseJSON =
+    Data.withObject
+      "Authentication"
+      ( \x ->
+          Authentication'
+            Prelude.<$> (x Data..:? "PasswordCount")
+            Prelude.<*> (x Data..:? "Type")
+      )
+
+instance Prelude.Hashable Authentication where
+  hashWithSalt _salt Authentication' {..} =
+    _salt
+      `Prelude.hashWithSalt` passwordCount
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData Authentication where
+  rnf Authentication' {..} =
+    Prelude.rnf passwordCount
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/MemoryDb/Types/AuthenticationMode.hs b/gen/Amazonka/MemoryDb/Types/AuthenticationMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/AuthenticationMode.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.AuthenticationMode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.AuthenticationMode where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.InputAuthenticationType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Denotes the user\'s authentication properties, such as whether it
+-- requires a password to authenticate. Used in output responses.
+--
+-- /See:/ 'newAuthenticationMode' smart constructor.
+data AuthenticationMode = AuthenticationMode'
+  { -- | The password(s) used for authentication
+    passwords :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | Indicates whether the user requires a password to authenticate. All
+    -- newly-created users require a password.
+    type' :: Prelude.Maybe InputAuthenticationType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AuthenticationMode' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'passwords', 'authenticationMode_passwords' - The password(s) used for authentication
+--
+-- 'type'', 'authenticationMode_type' - Indicates whether the user requires a password to authenticate. All
+-- newly-created users require a password.
+newAuthenticationMode ::
+  AuthenticationMode
+newAuthenticationMode =
+  AuthenticationMode'
+    { passwords = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The password(s) used for authentication
+authenticationMode_passwords :: Lens.Lens' AuthenticationMode (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+authenticationMode_passwords = Lens.lens (\AuthenticationMode' {passwords} -> passwords) (\s@AuthenticationMode' {} a -> s {passwords = a} :: AuthenticationMode) Prelude.. Lens.mapping Lens.coerced
+
+-- | Indicates whether the user requires a password to authenticate. All
+-- newly-created users require a password.
+authenticationMode_type :: Lens.Lens' AuthenticationMode (Prelude.Maybe InputAuthenticationType)
+authenticationMode_type = Lens.lens (\AuthenticationMode' {type'} -> type') (\s@AuthenticationMode' {} a -> s {type' = a} :: AuthenticationMode)
+
+instance Prelude.Hashable AuthenticationMode where
+  hashWithSalt _salt AuthenticationMode' {..} =
+    _salt
+      `Prelude.hashWithSalt` passwords
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData AuthenticationMode where
+  rnf AuthenticationMode' {..} =
+    Prelude.rnf passwords
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON AuthenticationMode where
+  toJSON AuthenticationMode' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Passwords" Data..=) Prelude.<$> passwords,
+            ("Type" Data..=) Prelude.<$> type'
+          ]
+      )
diff --git a/gen/Amazonka/MemoryDb/Types/AuthenticationType.hs b/gen/Amazonka/MemoryDb/Types/AuthenticationType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/AuthenticationType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.AuthenticationType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.AuthenticationType
+  ( AuthenticationType
+      ( ..,
+        AuthenticationType_No_password,
+        AuthenticationType_Password
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AuthenticationType = AuthenticationType'
+  { fromAuthenticationType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AuthenticationType_No_password :: AuthenticationType
+pattern AuthenticationType_No_password = AuthenticationType' "no-password"
+
+pattern AuthenticationType_Password :: AuthenticationType
+pattern AuthenticationType_Password = AuthenticationType' "password"
+
+{-# COMPLETE
+  AuthenticationType_No_password,
+  AuthenticationType_Password,
+  AuthenticationType'
+  #-}
diff --git a/gen/Amazonka/MemoryDb/Types/AvailabilityZone.hs b/gen/Amazonka/MemoryDb/Types/AvailabilityZone.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/AvailabilityZone.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.AvailabilityZone
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.AvailabilityZone where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Indicates if the cluster has a Multi-AZ configuration (multiaz) or not
+-- (singleaz).
+--
+-- /See:/ 'newAvailabilityZone' smart constructor.
+data AvailabilityZone = AvailabilityZone'
+  { -- | The name of the Availability Zone.
+    name :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AvailabilityZone' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'availabilityZone_name' - The name of the Availability Zone.
+newAvailabilityZone ::
+  AvailabilityZone
+newAvailabilityZone =
+  AvailabilityZone' {name = Prelude.Nothing}
+
+-- | The name of the Availability Zone.
+availabilityZone_name :: Lens.Lens' AvailabilityZone (Prelude.Maybe Prelude.Text)
+availabilityZone_name = Lens.lens (\AvailabilityZone' {name} -> name) (\s@AvailabilityZone' {} a -> s {name = a} :: AvailabilityZone)
+
+instance Data.FromJSON AvailabilityZone where
+  parseJSON =
+    Data.withObject
+      "AvailabilityZone"
+      ( \x ->
+          AvailabilityZone' Prelude.<$> (x Data..:? "Name")
+      )
+
+instance Prelude.Hashable AvailabilityZone where
+  hashWithSalt _salt AvailabilityZone' {..} =
+    _salt `Prelude.hashWithSalt` name
+
+instance Prelude.NFData AvailabilityZone where
+  rnf AvailabilityZone' {..} = Prelude.rnf name
diff --git a/gen/Amazonka/MemoryDb/Types/Cluster.hs b/gen/Amazonka/MemoryDb/Types/Cluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Cluster.hs
@@ -0,0 +1,430 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Cluster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Cluster where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.AZStatus
+import Amazonka.MemoryDb.Types.ClusterPendingUpdates
+import Amazonka.MemoryDb.Types.DataTieringStatus
+import Amazonka.MemoryDb.Types.Endpoint
+import Amazonka.MemoryDb.Types.SecurityGroupMembership
+import Amazonka.MemoryDb.Types.Shard
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains all of the attributes of a specific cluster.
+--
+-- /See:/ 'newCluster' smart constructor.
+data Cluster = Cluster'
+  { -- | The name of the Access Control List associated with this cluster.
+    aCLName :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | When set to true, the cluster will automatically receive minor engine
+    -- version upgrades after launch.
+    autoMinorVersionUpgrade :: Prelude.Maybe Prelude.Bool,
+    -- | Indicates if the cluster has a Multi-AZ configuration (multiaz) or not
+    -- (singleaz).
+    availabilityMode :: Prelude.Maybe AZStatus,
+    -- | The cluster\'s configuration endpoint
+    clusterEndpoint :: Prelude.Maybe Endpoint,
+    -- | Enables data tiering. Data tiering is only supported for clusters using
+    -- the r6gd node type. This parameter must be set when using r6gd nodes.
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/memorydb/latest/devguide/data-tiering.html Data tiering>.
+    dataTiering :: Prelude.Maybe DataTieringStatus,
+    -- | A description of the cluster
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The Redis engine patch version used by the cluster
+    enginePatchVersion :: Prelude.Maybe Prelude.Text,
+    -- | The Redis engine version used by the cluster
+    engineVersion :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the KMS key used to encrypt the cluster
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | Specifies the weekly time range during which maintenance on the cluster
+    -- is performed. It is specified as a range in the format
+    -- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+    -- is a 60 minute period.
+    maintenanceWindow :: Prelude.Maybe Prelude.Text,
+    -- | The user-supplied name of the cluster. This identifier is a unique key
+    -- that identifies a cluster.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The cluster\'s node type
+    nodeType :: Prelude.Maybe Prelude.Text,
+    -- | The number of shards in the cluster
+    numberOfShards :: Prelude.Maybe Prelude.Int,
+    -- | The name of the parameter group used by the cluster
+    parameterGroupName :: Prelude.Maybe Prelude.Text,
+    -- | The status of the parameter group used by the cluster, for example
+    -- \'active\' or \'applying\'.
+    parameterGroupStatus :: Prelude.Maybe Prelude.Text,
+    -- | A group of settings that are currently being applied.
+    pendingUpdates :: Prelude.Maybe ClusterPendingUpdates,
+    -- | A list of security groups used by the cluster
+    securityGroups :: Prelude.Maybe [SecurityGroupMembership],
+    -- | A list of shards that are members of the cluster.
+    shards :: Prelude.Maybe [Shard],
+    -- | The number of days for which MemoryDB retains automatic snapshots before
+    -- deleting them. For example, if you set SnapshotRetentionLimit to 5, a
+    -- snapshot that was taken today is retained for 5 days before being
+    -- deleted.
+    snapshotRetentionLimit :: Prelude.Maybe Prelude.Int,
+    -- | The daily time range (in UTC) during which MemoryDB begins taking a
+    -- daily snapshot of your shard. Example: 05:00-09:00 If you do not specify
+    -- this parameter, MemoryDB automatically chooses an appropriate time
+    -- range.
+    snapshotWindow :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the SNS notification topic
+    snsTopicArn :: Prelude.Maybe Prelude.Text,
+    -- | The SNS topic must be in Active status to receive notifications
+    snsTopicStatus :: Prelude.Maybe Prelude.Text,
+    -- | The status of the cluster. For example, Available, Updating, Creating.
+    status :: Prelude.Maybe Prelude.Text,
+    -- | The name of the subnet group used by the cluster
+    subnetGroupName :: Prelude.Maybe Prelude.Text,
+    -- | A flag to indicate if In-transit encryption is enabled
+    tLSEnabled :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Cluster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aCLName', 'cluster_aCLName' - The name of the Access Control List associated with this cluster.
+--
+-- 'arn', 'cluster_arn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'autoMinorVersionUpgrade', 'cluster_autoMinorVersionUpgrade' - When set to true, the cluster will automatically receive minor engine
+-- version upgrades after launch.
+--
+-- 'availabilityMode', 'cluster_availabilityMode' - Indicates if the cluster has a Multi-AZ configuration (multiaz) or not
+-- (singleaz).
+--
+-- 'clusterEndpoint', 'cluster_clusterEndpoint' - The cluster\'s configuration endpoint
+--
+-- 'dataTiering', 'cluster_dataTiering' - Enables data tiering. Data tiering is only supported for clusters using
+-- the r6gd node type. This parameter must be set when using r6gd nodes.
+-- For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/data-tiering.html Data tiering>.
+--
+-- 'description', 'cluster_description' - A description of the cluster
+--
+-- 'enginePatchVersion', 'cluster_enginePatchVersion' - The Redis engine patch version used by the cluster
+--
+-- 'engineVersion', 'cluster_engineVersion' - The Redis engine version used by the cluster
+--
+-- 'kmsKeyId', 'cluster_kmsKeyId' - The ID of the KMS key used to encrypt the cluster
+--
+-- 'maintenanceWindow', 'cluster_maintenanceWindow' - Specifies the weekly time range during which maintenance on the cluster
+-- is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period.
+--
+-- 'name', 'cluster_name' - The user-supplied name of the cluster. This identifier is a unique key
+-- that identifies a cluster.
+--
+-- 'nodeType', 'cluster_nodeType' - The cluster\'s node type
+--
+-- 'numberOfShards', 'cluster_numberOfShards' - The number of shards in the cluster
+--
+-- 'parameterGroupName', 'cluster_parameterGroupName' - The name of the parameter group used by the cluster
+--
+-- 'parameterGroupStatus', 'cluster_parameterGroupStatus' - The status of the parameter group used by the cluster, for example
+-- \'active\' or \'applying\'.
+--
+-- 'pendingUpdates', 'cluster_pendingUpdates' - A group of settings that are currently being applied.
+--
+-- 'securityGroups', 'cluster_securityGroups' - A list of security groups used by the cluster
+--
+-- 'shards', 'cluster_shards' - A list of shards that are members of the cluster.
+--
+-- 'snapshotRetentionLimit', 'cluster_snapshotRetentionLimit' - The number of days for which MemoryDB retains automatic snapshots before
+-- deleting them. For example, if you set SnapshotRetentionLimit to 5, a
+-- snapshot that was taken today is retained for 5 days before being
+-- deleted.
+--
+-- 'snapshotWindow', 'cluster_snapshotWindow' - The daily time range (in UTC) during which MemoryDB begins taking a
+-- daily snapshot of your shard. Example: 05:00-09:00 If you do not specify
+-- this parameter, MemoryDB automatically chooses an appropriate time
+-- range.
+--
+-- 'snsTopicArn', 'cluster_snsTopicArn' - The Amazon Resource Name (ARN) of the SNS notification topic
+--
+-- 'snsTopicStatus', 'cluster_snsTopicStatus' - The SNS topic must be in Active status to receive notifications
+--
+-- 'status', 'cluster_status' - The status of the cluster. For example, Available, Updating, Creating.
+--
+-- 'subnetGroupName', 'cluster_subnetGroupName' - The name of the subnet group used by the cluster
+--
+-- 'tLSEnabled', 'cluster_tLSEnabled' - A flag to indicate if In-transit encryption is enabled
+newCluster ::
+  Cluster
+newCluster =
+  Cluster'
+    { aCLName = Prelude.Nothing,
+      arn = Prelude.Nothing,
+      autoMinorVersionUpgrade = Prelude.Nothing,
+      availabilityMode = Prelude.Nothing,
+      clusterEndpoint = Prelude.Nothing,
+      dataTiering = Prelude.Nothing,
+      description = Prelude.Nothing,
+      enginePatchVersion = Prelude.Nothing,
+      engineVersion = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      maintenanceWindow = Prelude.Nothing,
+      name = Prelude.Nothing,
+      nodeType = Prelude.Nothing,
+      numberOfShards = Prelude.Nothing,
+      parameterGroupName = Prelude.Nothing,
+      parameterGroupStatus = Prelude.Nothing,
+      pendingUpdates = Prelude.Nothing,
+      securityGroups = Prelude.Nothing,
+      shards = Prelude.Nothing,
+      snapshotRetentionLimit = Prelude.Nothing,
+      snapshotWindow = Prelude.Nothing,
+      snsTopicArn = Prelude.Nothing,
+      snsTopicStatus = Prelude.Nothing,
+      status = Prelude.Nothing,
+      subnetGroupName = Prelude.Nothing,
+      tLSEnabled = Prelude.Nothing
+    }
+
+-- | The name of the Access Control List associated with this cluster.
+cluster_aCLName :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_aCLName = Lens.lens (\Cluster' {aCLName} -> aCLName) (\s@Cluster' {} a -> s {aCLName = a} :: Cluster)
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+cluster_arn :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_arn = Lens.lens (\Cluster' {arn} -> arn) (\s@Cluster' {} a -> s {arn = a} :: Cluster)
+
+-- | When set to true, the cluster will automatically receive minor engine
+-- version upgrades after launch.
+cluster_autoMinorVersionUpgrade :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Bool)
+cluster_autoMinorVersionUpgrade = Lens.lens (\Cluster' {autoMinorVersionUpgrade} -> autoMinorVersionUpgrade) (\s@Cluster' {} a -> s {autoMinorVersionUpgrade = a} :: Cluster)
+
+-- | Indicates if the cluster has a Multi-AZ configuration (multiaz) or not
+-- (singleaz).
+cluster_availabilityMode :: Lens.Lens' Cluster (Prelude.Maybe AZStatus)
+cluster_availabilityMode = Lens.lens (\Cluster' {availabilityMode} -> availabilityMode) (\s@Cluster' {} a -> s {availabilityMode = a} :: Cluster)
+
+-- | The cluster\'s configuration endpoint
+cluster_clusterEndpoint :: Lens.Lens' Cluster (Prelude.Maybe Endpoint)
+cluster_clusterEndpoint = Lens.lens (\Cluster' {clusterEndpoint} -> clusterEndpoint) (\s@Cluster' {} a -> s {clusterEndpoint = a} :: Cluster)
+
+-- | Enables data tiering. Data tiering is only supported for clusters using
+-- the r6gd node type. This parameter must be set when using r6gd nodes.
+-- For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/data-tiering.html Data tiering>.
+cluster_dataTiering :: Lens.Lens' Cluster (Prelude.Maybe DataTieringStatus)
+cluster_dataTiering = Lens.lens (\Cluster' {dataTiering} -> dataTiering) (\s@Cluster' {} a -> s {dataTiering = a} :: Cluster)
+
+-- | A description of the cluster
+cluster_description :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_description = Lens.lens (\Cluster' {description} -> description) (\s@Cluster' {} a -> s {description = a} :: Cluster)
+
+-- | The Redis engine patch version used by the cluster
+cluster_enginePatchVersion :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_enginePatchVersion = Lens.lens (\Cluster' {enginePatchVersion} -> enginePatchVersion) (\s@Cluster' {} a -> s {enginePatchVersion = a} :: Cluster)
+
+-- | The Redis engine version used by the cluster
+cluster_engineVersion :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_engineVersion = Lens.lens (\Cluster' {engineVersion} -> engineVersion) (\s@Cluster' {} a -> s {engineVersion = a} :: Cluster)
+
+-- | The ID of the KMS key used to encrypt the cluster
+cluster_kmsKeyId :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_kmsKeyId = Lens.lens (\Cluster' {kmsKeyId} -> kmsKeyId) (\s@Cluster' {} a -> s {kmsKeyId = a} :: Cluster)
+
+-- | Specifies the weekly time range during which maintenance on the cluster
+-- is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period.
+cluster_maintenanceWindow :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_maintenanceWindow = Lens.lens (\Cluster' {maintenanceWindow} -> maintenanceWindow) (\s@Cluster' {} a -> s {maintenanceWindow = a} :: Cluster)
+
+-- | The user-supplied name of the cluster. This identifier is a unique key
+-- that identifies a cluster.
+cluster_name :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_name = Lens.lens (\Cluster' {name} -> name) (\s@Cluster' {} a -> s {name = a} :: Cluster)
+
+-- | The cluster\'s node type
+cluster_nodeType :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_nodeType = Lens.lens (\Cluster' {nodeType} -> nodeType) (\s@Cluster' {} a -> s {nodeType = a} :: Cluster)
+
+-- | The number of shards in the cluster
+cluster_numberOfShards :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Int)
+cluster_numberOfShards = Lens.lens (\Cluster' {numberOfShards} -> numberOfShards) (\s@Cluster' {} a -> s {numberOfShards = a} :: Cluster)
+
+-- | The name of the parameter group used by the cluster
+cluster_parameterGroupName :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_parameterGroupName = Lens.lens (\Cluster' {parameterGroupName} -> parameterGroupName) (\s@Cluster' {} a -> s {parameterGroupName = a} :: Cluster)
+
+-- | The status of the parameter group used by the cluster, for example
+-- \'active\' or \'applying\'.
+cluster_parameterGroupStatus :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_parameterGroupStatus = Lens.lens (\Cluster' {parameterGroupStatus} -> parameterGroupStatus) (\s@Cluster' {} a -> s {parameterGroupStatus = a} :: Cluster)
+
+-- | A group of settings that are currently being applied.
+cluster_pendingUpdates :: Lens.Lens' Cluster (Prelude.Maybe ClusterPendingUpdates)
+cluster_pendingUpdates = Lens.lens (\Cluster' {pendingUpdates} -> pendingUpdates) (\s@Cluster' {} a -> s {pendingUpdates = a} :: Cluster)
+
+-- | A list of security groups used by the cluster
+cluster_securityGroups :: Lens.Lens' Cluster (Prelude.Maybe [SecurityGroupMembership])
+cluster_securityGroups = Lens.lens (\Cluster' {securityGroups} -> securityGroups) (\s@Cluster' {} a -> s {securityGroups = a} :: Cluster) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of shards that are members of the cluster.
+cluster_shards :: Lens.Lens' Cluster (Prelude.Maybe [Shard])
+cluster_shards = Lens.lens (\Cluster' {shards} -> shards) (\s@Cluster' {} a -> s {shards = a} :: Cluster) Prelude.. Lens.mapping Lens.coerced
+
+-- | The number of days for which MemoryDB retains automatic snapshots before
+-- deleting them. For example, if you set SnapshotRetentionLimit to 5, a
+-- snapshot that was taken today is retained for 5 days before being
+-- deleted.
+cluster_snapshotRetentionLimit :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Int)
+cluster_snapshotRetentionLimit = Lens.lens (\Cluster' {snapshotRetentionLimit} -> snapshotRetentionLimit) (\s@Cluster' {} a -> s {snapshotRetentionLimit = a} :: Cluster)
+
+-- | The daily time range (in UTC) during which MemoryDB begins taking a
+-- daily snapshot of your shard. Example: 05:00-09:00 If you do not specify
+-- this parameter, MemoryDB automatically chooses an appropriate time
+-- range.
+cluster_snapshotWindow :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_snapshotWindow = Lens.lens (\Cluster' {snapshotWindow} -> snapshotWindow) (\s@Cluster' {} a -> s {snapshotWindow = a} :: Cluster)
+
+-- | The Amazon Resource Name (ARN) of the SNS notification topic
+cluster_snsTopicArn :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_snsTopicArn = Lens.lens (\Cluster' {snsTopicArn} -> snsTopicArn) (\s@Cluster' {} a -> s {snsTopicArn = a} :: Cluster)
+
+-- | The SNS topic must be in Active status to receive notifications
+cluster_snsTopicStatus :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_snsTopicStatus = Lens.lens (\Cluster' {snsTopicStatus} -> snsTopicStatus) (\s@Cluster' {} a -> s {snsTopicStatus = a} :: Cluster)
+
+-- | The status of the cluster. For example, Available, Updating, Creating.
+cluster_status :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_status = Lens.lens (\Cluster' {status} -> status) (\s@Cluster' {} a -> s {status = a} :: Cluster)
+
+-- | The name of the subnet group used by the cluster
+cluster_subnetGroupName :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_subnetGroupName = Lens.lens (\Cluster' {subnetGroupName} -> subnetGroupName) (\s@Cluster' {} a -> s {subnetGroupName = a} :: Cluster)
+
+-- | A flag to indicate if In-transit encryption is enabled
+cluster_tLSEnabled :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Bool)
+cluster_tLSEnabled = Lens.lens (\Cluster' {tLSEnabled} -> tLSEnabled) (\s@Cluster' {} a -> s {tLSEnabled = a} :: Cluster)
+
+instance Data.FromJSON Cluster where
+  parseJSON =
+    Data.withObject
+      "Cluster"
+      ( \x ->
+          Cluster'
+            Prelude.<$> (x Data..:? "ACLName")
+            Prelude.<*> (x Data..:? "ARN")
+            Prelude.<*> (x Data..:? "AutoMinorVersionUpgrade")
+            Prelude.<*> (x Data..:? "AvailabilityMode")
+            Prelude.<*> (x Data..:? "ClusterEndpoint")
+            Prelude.<*> (x Data..:? "DataTiering")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "EnginePatchVersion")
+            Prelude.<*> (x Data..:? "EngineVersion")
+            Prelude.<*> (x Data..:? "KmsKeyId")
+            Prelude.<*> (x Data..:? "MaintenanceWindow")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "NodeType")
+            Prelude.<*> (x Data..:? "NumberOfShards")
+            Prelude.<*> (x Data..:? "ParameterGroupName")
+            Prelude.<*> (x Data..:? "ParameterGroupStatus")
+            Prelude.<*> (x Data..:? "PendingUpdates")
+            Prelude.<*> (x Data..:? "SecurityGroups" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Shards" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "SnapshotRetentionLimit")
+            Prelude.<*> (x Data..:? "SnapshotWindow")
+            Prelude.<*> (x Data..:? "SnsTopicArn")
+            Prelude.<*> (x Data..:? "SnsTopicStatus")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "SubnetGroupName")
+            Prelude.<*> (x Data..:? "TLSEnabled")
+      )
+
+instance Prelude.Hashable Cluster where
+  hashWithSalt _salt Cluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` aCLName
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` autoMinorVersionUpgrade
+      `Prelude.hashWithSalt` availabilityMode
+      `Prelude.hashWithSalt` clusterEndpoint
+      `Prelude.hashWithSalt` dataTiering
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` enginePatchVersion
+      `Prelude.hashWithSalt` engineVersion
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` maintenanceWindow
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` nodeType
+      `Prelude.hashWithSalt` numberOfShards
+      `Prelude.hashWithSalt` parameterGroupName
+      `Prelude.hashWithSalt` parameterGroupStatus
+      `Prelude.hashWithSalt` pendingUpdates
+      `Prelude.hashWithSalt` securityGroups
+      `Prelude.hashWithSalt` shards
+      `Prelude.hashWithSalt` snapshotRetentionLimit
+      `Prelude.hashWithSalt` snapshotWindow
+      `Prelude.hashWithSalt` snsTopicArn
+      `Prelude.hashWithSalt` snsTopicStatus
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` subnetGroupName
+      `Prelude.hashWithSalt` tLSEnabled
+
+instance Prelude.NFData Cluster where
+  rnf Cluster' {..} =
+    Prelude.rnf aCLName
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf autoMinorVersionUpgrade
+      `Prelude.seq` Prelude.rnf availabilityMode
+      `Prelude.seq` Prelude.rnf clusterEndpoint
+      `Prelude.seq` Prelude.rnf dataTiering
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf enginePatchVersion
+      `Prelude.seq` Prelude.rnf engineVersion
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf maintenanceWindow
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf nodeType
+      `Prelude.seq` Prelude.rnf numberOfShards
+      `Prelude.seq` Prelude.rnf parameterGroupName
+      `Prelude.seq` Prelude.rnf parameterGroupStatus
+      `Prelude.seq` Prelude.rnf pendingUpdates
+      `Prelude.seq` Prelude.rnf securityGroups
+      `Prelude.seq` Prelude.rnf shards
+      `Prelude.seq` Prelude.rnf
+        snapshotRetentionLimit
+      `Prelude.seq` Prelude.rnf snapshotWindow
+      `Prelude.seq` Prelude.rnf snsTopicArn
+      `Prelude.seq` Prelude.rnf
+        snsTopicStatus
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf
+        subnetGroupName
+      `Prelude.seq` Prelude.rnf
+        tLSEnabled
diff --git a/gen/Amazonka/MemoryDb/Types/ClusterConfiguration.hs b/gen/Amazonka/MemoryDb/Types/ClusterConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ClusterConfiguration.hs
@@ -0,0 +1,233 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ClusterConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ClusterConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.ShardDetail
+import qualified Amazonka.Prelude as Prelude
+
+-- | A list of cluster configuration options.
+--
+-- /See:/ 'newClusterConfiguration' smart constructor.
+data ClusterConfiguration = ClusterConfiguration'
+  { -- | The description of the cluster configuration
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The Redis engine version used by the cluster
+    engineVersion :: Prelude.Maybe Prelude.Text,
+    -- | The specified maintenance window for the cluster
+    maintenanceWindow :: Prelude.Maybe Prelude.Text,
+    -- | The name of the cluster
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The node type used for the cluster
+    nodeType :: Prelude.Maybe Prelude.Text,
+    -- | The number of shards in the cluster
+    numShards :: Prelude.Maybe Prelude.Int,
+    -- | The name of parameter group used by the cluster
+    parameterGroupName :: Prelude.Maybe Prelude.Text,
+    -- | The port used by the cluster
+    port :: Prelude.Maybe Prelude.Int,
+    -- | The list of shards in the cluster
+    shards :: Prelude.Maybe [ShardDetail],
+    -- | The snapshot retention limit set by the cluster
+    snapshotRetentionLimit :: Prelude.Maybe Prelude.Int,
+    -- | The snapshot window set by the cluster
+    snapshotWindow :: Prelude.Maybe Prelude.Text,
+    -- | The name of the subnet group used by the cluster
+    subnetGroupName :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the SNS notification topic for the
+    -- cluster
+    topicArn :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the VPC the cluster belongs to
+    vpcId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClusterConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'clusterConfiguration_description' - The description of the cluster configuration
+--
+-- 'engineVersion', 'clusterConfiguration_engineVersion' - The Redis engine version used by the cluster
+--
+-- 'maintenanceWindow', 'clusterConfiguration_maintenanceWindow' - The specified maintenance window for the cluster
+--
+-- 'name', 'clusterConfiguration_name' - The name of the cluster
+--
+-- 'nodeType', 'clusterConfiguration_nodeType' - The node type used for the cluster
+--
+-- 'numShards', 'clusterConfiguration_numShards' - The number of shards in the cluster
+--
+-- 'parameterGroupName', 'clusterConfiguration_parameterGroupName' - The name of parameter group used by the cluster
+--
+-- 'port', 'clusterConfiguration_port' - The port used by the cluster
+--
+-- 'shards', 'clusterConfiguration_shards' - The list of shards in the cluster
+--
+-- 'snapshotRetentionLimit', 'clusterConfiguration_snapshotRetentionLimit' - The snapshot retention limit set by the cluster
+--
+-- 'snapshotWindow', 'clusterConfiguration_snapshotWindow' - The snapshot window set by the cluster
+--
+-- 'subnetGroupName', 'clusterConfiguration_subnetGroupName' - The name of the subnet group used by the cluster
+--
+-- 'topicArn', 'clusterConfiguration_topicArn' - The Amazon Resource Name (ARN) of the SNS notification topic for the
+-- cluster
+--
+-- 'vpcId', 'clusterConfiguration_vpcId' - The ID of the VPC the cluster belongs to
+newClusterConfiguration ::
+  ClusterConfiguration
+newClusterConfiguration =
+  ClusterConfiguration'
+    { description =
+        Prelude.Nothing,
+      engineVersion = Prelude.Nothing,
+      maintenanceWindow = Prelude.Nothing,
+      name = Prelude.Nothing,
+      nodeType = Prelude.Nothing,
+      numShards = Prelude.Nothing,
+      parameterGroupName = Prelude.Nothing,
+      port = Prelude.Nothing,
+      shards = Prelude.Nothing,
+      snapshotRetentionLimit = Prelude.Nothing,
+      snapshotWindow = Prelude.Nothing,
+      subnetGroupName = Prelude.Nothing,
+      topicArn = Prelude.Nothing,
+      vpcId = Prelude.Nothing
+    }
+
+-- | The description of the cluster configuration
+clusterConfiguration_description :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Text)
+clusterConfiguration_description = Lens.lens (\ClusterConfiguration' {description} -> description) (\s@ClusterConfiguration' {} a -> s {description = a} :: ClusterConfiguration)
+
+-- | The Redis engine version used by the cluster
+clusterConfiguration_engineVersion :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Text)
+clusterConfiguration_engineVersion = Lens.lens (\ClusterConfiguration' {engineVersion} -> engineVersion) (\s@ClusterConfiguration' {} a -> s {engineVersion = a} :: ClusterConfiguration)
+
+-- | The specified maintenance window for the cluster
+clusterConfiguration_maintenanceWindow :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Text)
+clusterConfiguration_maintenanceWindow = Lens.lens (\ClusterConfiguration' {maintenanceWindow} -> maintenanceWindow) (\s@ClusterConfiguration' {} a -> s {maintenanceWindow = a} :: ClusterConfiguration)
+
+-- | The name of the cluster
+clusterConfiguration_name :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Text)
+clusterConfiguration_name = Lens.lens (\ClusterConfiguration' {name} -> name) (\s@ClusterConfiguration' {} a -> s {name = a} :: ClusterConfiguration)
+
+-- | The node type used for the cluster
+clusterConfiguration_nodeType :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Text)
+clusterConfiguration_nodeType = Lens.lens (\ClusterConfiguration' {nodeType} -> nodeType) (\s@ClusterConfiguration' {} a -> s {nodeType = a} :: ClusterConfiguration)
+
+-- | The number of shards in the cluster
+clusterConfiguration_numShards :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Int)
+clusterConfiguration_numShards = Lens.lens (\ClusterConfiguration' {numShards} -> numShards) (\s@ClusterConfiguration' {} a -> s {numShards = a} :: ClusterConfiguration)
+
+-- | The name of parameter group used by the cluster
+clusterConfiguration_parameterGroupName :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Text)
+clusterConfiguration_parameterGroupName = Lens.lens (\ClusterConfiguration' {parameterGroupName} -> parameterGroupName) (\s@ClusterConfiguration' {} a -> s {parameterGroupName = a} :: ClusterConfiguration)
+
+-- | The port used by the cluster
+clusterConfiguration_port :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Int)
+clusterConfiguration_port = Lens.lens (\ClusterConfiguration' {port} -> port) (\s@ClusterConfiguration' {} a -> s {port = a} :: ClusterConfiguration)
+
+-- | The list of shards in the cluster
+clusterConfiguration_shards :: Lens.Lens' ClusterConfiguration (Prelude.Maybe [ShardDetail])
+clusterConfiguration_shards = Lens.lens (\ClusterConfiguration' {shards} -> shards) (\s@ClusterConfiguration' {} a -> s {shards = a} :: ClusterConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | The snapshot retention limit set by the cluster
+clusterConfiguration_snapshotRetentionLimit :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Int)
+clusterConfiguration_snapshotRetentionLimit = Lens.lens (\ClusterConfiguration' {snapshotRetentionLimit} -> snapshotRetentionLimit) (\s@ClusterConfiguration' {} a -> s {snapshotRetentionLimit = a} :: ClusterConfiguration)
+
+-- | The snapshot window set by the cluster
+clusterConfiguration_snapshotWindow :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Text)
+clusterConfiguration_snapshotWindow = Lens.lens (\ClusterConfiguration' {snapshotWindow} -> snapshotWindow) (\s@ClusterConfiguration' {} a -> s {snapshotWindow = a} :: ClusterConfiguration)
+
+-- | The name of the subnet group used by the cluster
+clusterConfiguration_subnetGroupName :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Text)
+clusterConfiguration_subnetGroupName = Lens.lens (\ClusterConfiguration' {subnetGroupName} -> subnetGroupName) (\s@ClusterConfiguration' {} a -> s {subnetGroupName = a} :: ClusterConfiguration)
+
+-- | The Amazon Resource Name (ARN) of the SNS notification topic for the
+-- cluster
+clusterConfiguration_topicArn :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Text)
+clusterConfiguration_topicArn = Lens.lens (\ClusterConfiguration' {topicArn} -> topicArn) (\s@ClusterConfiguration' {} a -> s {topicArn = a} :: ClusterConfiguration)
+
+-- | The ID of the VPC the cluster belongs to
+clusterConfiguration_vpcId :: Lens.Lens' ClusterConfiguration (Prelude.Maybe Prelude.Text)
+clusterConfiguration_vpcId = Lens.lens (\ClusterConfiguration' {vpcId} -> vpcId) (\s@ClusterConfiguration' {} a -> s {vpcId = a} :: ClusterConfiguration)
+
+instance Data.FromJSON ClusterConfiguration where
+  parseJSON =
+    Data.withObject
+      "ClusterConfiguration"
+      ( \x ->
+          ClusterConfiguration'
+            Prelude.<$> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "EngineVersion")
+            Prelude.<*> (x Data..:? "MaintenanceWindow")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "NodeType")
+            Prelude.<*> (x Data..:? "NumShards")
+            Prelude.<*> (x Data..:? "ParameterGroupName")
+            Prelude.<*> (x Data..:? "Port")
+            Prelude.<*> (x Data..:? "Shards" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "SnapshotRetentionLimit")
+            Prelude.<*> (x Data..:? "SnapshotWindow")
+            Prelude.<*> (x Data..:? "SubnetGroupName")
+            Prelude.<*> (x Data..:? "TopicArn")
+            Prelude.<*> (x Data..:? "VpcId")
+      )
+
+instance Prelude.Hashable ClusterConfiguration where
+  hashWithSalt _salt ClusterConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` engineVersion
+      `Prelude.hashWithSalt` maintenanceWindow
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` nodeType
+      `Prelude.hashWithSalt` numShards
+      `Prelude.hashWithSalt` parameterGroupName
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` shards
+      `Prelude.hashWithSalt` snapshotRetentionLimit
+      `Prelude.hashWithSalt` snapshotWindow
+      `Prelude.hashWithSalt` subnetGroupName
+      `Prelude.hashWithSalt` topicArn
+      `Prelude.hashWithSalt` vpcId
+
+instance Prelude.NFData ClusterConfiguration where
+  rnf ClusterConfiguration' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf engineVersion
+      `Prelude.seq` Prelude.rnf maintenanceWindow
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf nodeType
+      `Prelude.seq` Prelude.rnf numShards
+      `Prelude.seq` Prelude.rnf parameterGroupName
+      `Prelude.seq` Prelude.rnf port
+      `Prelude.seq` Prelude.rnf shards
+      `Prelude.seq` Prelude.rnf snapshotRetentionLimit
+      `Prelude.seq` Prelude.rnf snapshotWindow
+      `Prelude.seq` Prelude.rnf subnetGroupName
+      `Prelude.seq` Prelude.rnf topicArn
+      `Prelude.seq` Prelude.rnf vpcId
diff --git a/gen/Amazonka/MemoryDb/Types/ClusterPendingUpdates.hs b/gen/Amazonka/MemoryDb/Types/ClusterPendingUpdates.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ClusterPendingUpdates.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ClusterPendingUpdates
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ClusterPendingUpdates where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.ACLsUpdateStatus
+import Amazonka.MemoryDb.Types.PendingModifiedServiceUpdate
+import Amazonka.MemoryDb.Types.ReshardingStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | A list of updates being applied to the cluster
+--
+-- /See:/ 'newClusterPendingUpdates' smart constructor.
+data ClusterPendingUpdates = ClusterPendingUpdates'
+  { -- | A list of ACLs associated with the cluster that are being updated
+    aCLs :: Prelude.Maybe ACLsUpdateStatus,
+    -- | The status of an online resharding operation.
+    resharding :: Prelude.Maybe ReshardingStatus,
+    -- | A list of service updates being applied to the cluster
+    serviceUpdates :: Prelude.Maybe [PendingModifiedServiceUpdate]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClusterPendingUpdates' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aCLs', 'clusterPendingUpdates_aCLs' - A list of ACLs associated with the cluster that are being updated
+--
+-- 'resharding', 'clusterPendingUpdates_resharding' - The status of an online resharding operation.
+--
+-- 'serviceUpdates', 'clusterPendingUpdates_serviceUpdates' - A list of service updates being applied to the cluster
+newClusterPendingUpdates ::
+  ClusterPendingUpdates
+newClusterPendingUpdates =
+  ClusterPendingUpdates'
+    { aCLs = Prelude.Nothing,
+      resharding = Prelude.Nothing,
+      serviceUpdates = Prelude.Nothing
+    }
+
+-- | A list of ACLs associated with the cluster that are being updated
+clusterPendingUpdates_aCLs :: Lens.Lens' ClusterPendingUpdates (Prelude.Maybe ACLsUpdateStatus)
+clusterPendingUpdates_aCLs = Lens.lens (\ClusterPendingUpdates' {aCLs} -> aCLs) (\s@ClusterPendingUpdates' {} a -> s {aCLs = a} :: ClusterPendingUpdates)
+
+-- | The status of an online resharding operation.
+clusterPendingUpdates_resharding :: Lens.Lens' ClusterPendingUpdates (Prelude.Maybe ReshardingStatus)
+clusterPendingUpdates_resharding = Lens.lens (\ClusterPendingUpdates' {resharding} -> resharding) (\s@ClusterPendingUpdates' {} a -> s {resharding = a} :: ClusterPendingUpdates)
+
+-- | A list of service updates being applied to the cluster
+clusterPendingUpdates_serviceUpdates :: Lens.Lens' ClusterPendingUpdates (Prelude.Maybe [PendingModifiedServiceUpdate])
+clusterPendingUpdates_serviceUpdates = Lens.lens (\ClusterPendingUpdates' {serviceUpdates} -> serviceUpdates) (\s@ClusterPendingUpdates' {} a -> s {serviceUpdates = a} :: ClusterPendingUpdates) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ClusterPendingUpdates where
+  parseJSON =
+    Data.withObject
+      "ClusterPendingUpdates"
+      ( \x ->
+          ClusterPendingUpdates'
+            Prelude.<$> (x Data..:? "ACLs")
+            Prelude.<*> (x Data..:? "Resharding")
+            Prelude.<*> ( x
+                            Data..:? "ServiceUpdates"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ClusterPendingUpdates where
+  hashWithSalt _salt ClusterPendingUpdates' {..} =
+    _salt
+      `Prelude.hashWithSalt` aCLs
+      `Prelude.hashWithSalt` resharding
+      `Prelude.hashWithSalt` serviceUpdates
+
+instance Prelude.NFData ClusterPendingUpdates where
+  rnf ClusterPendingUpdates' {..} =
+    Prelude.rnf aCLs
+      `Prelude.seq` Prelude.rnf resharding
+      `Prelude.seq` Prelude.rnf serviceUpdates
diff --git a/gen/Amazonka/MemoryDb/Types/DataTieringStatus.hs b/gen/Amazonka/MemoryDb/Types/DataTieringStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/DataTieringStatus.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.DataTieringStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.DataTieringStatus
+  ( DataTieringStatus
+      ( ..,
+        DataTieringStatus_False,
+        DataTieringStatus_True
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DataTieringStatus = DataTieringStatus'
+  { fromDataTieringStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DataTieringStatus_False :: DataTieringStatus
+pattern DataTieringStatus_False = DataTieringStatus' "false"
+
+pattern DataTieringStatus_True :: DataTieringStatus
+pattern DataTieringStatus_True = DataTieringStatus' "true"
+
+{-# COMPLETE
+  DataTieringStatus_False,
+  DataTieringStatus_True,
+  DataTieringStatus'
+  #-}
diff --git a/gen/Amazonka/MemoryDb/Types/Endpoint.hs b/gen/Amazonka/MemoryDb/Types/Endpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Endpoint.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Endpoint
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Endpoint where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents the information required for client programs to connect to
+-- the cluster and its nodes.
+--
+-- /See:/ 'newEndpoint' smart constructor.
+data Endpoint = Endpoint'
+  { -- | The DNS hostname of the node.
+    address :: Prelude.Maybe Prelude.Text,
+    -- | The port number that the engine is listening on.
+    port :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Endpoint' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'address', 'endpoint_address' - The DNS hostname of the node.
+--
+-- 'port', 'endpoint_port' - The port number that the engine is listening on.
+newEndpoint ::
+  Endpoint
+newEndpoint =
+  Endpoint'
+    { address = Prelude.Nothing,
+      port = Prelude.Nothing
+    }
+
+-- | The DNS hostname of the node.
+endpoint_address :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_address = Lens.lens (\Endpoint' {address} -> address) (\s@Endpoint' {} a -> s {address = a} :: Endpoint)
+
+-- | The port number that the engine is listening on.
+endpoint_port :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Int)
+endpoint_port = Lens.lens (\Endpoint' {port} -> port) (\s@Endpoint' {} a -> s {port = a} :: Endpoint)
+
+instance Data.FromJSON Endpoint where
+  parseJSON =
+    Data.withObject
+      "Endpoint"
+      ( \x ->
+          Endpoint'
+            Prelude.<$> (x Data..:? "Address")
+            Prelude.<*> (x Data..:? "Port")
+      )
+
+instance Prelude.Hashable Endpoint where
+  hashWithSalt _salt Endpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` address
+      `Prelude.hashWithSalt` port
+
+instance Prelude.NFData Endpoint where
+  rnf Endpoint' {..} =
+    Prelude.rnf address `Prelude.seq` Prelude.rnf port
diff --git a/gen/Amazonka/MemoryDb/Types/EngineVersionInfo.hs b/gen/Amazonka/MemoryDb/Types/EngineVersionInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/EngineVersionInfo.hs
@@ -0,0 +1,100 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.EngineVersionInfo
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.EngineVersionInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides details of the Redis engine version
+--
+-- /See:/ 'newEngineVersionInfo' smart constructor.
+data EngineVersionInfo = EngineVersionInfo'
+  { -- | The patched engine version
+    enginePatchVersion :: Prelude.Maybe Prelude.Text,
+    -- | The engine version
+    engineVersion :: Prelude.Maybe Prelude.Text,
+    -- | Specifies the name of the parameter group family to which the engine
+    -- default parameters apply.
+    parameterGroupFamily :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EngineVersionInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enginePatchVersion', 'engineVersionInfo_enginePatchVersion' - The patched engine version
+--
+-- 'engineVersion', 'engineVersionInfo_engineVersion' - The engine version
+--
+-- 'parameterGroupFamily', 'engineVersionInfo_parameterGroupFamily' - Specifies the name of the parameter group family to which the engine
+-- default parameters apply.
+newEngineVersionInfo ::
+  EngineVersionInfo
+newEngineVersionInfo =
+  EngineVersionInfo'
+    { enginePatchVersion =
+        Prelude.Nothing,
+      engineVersion = Prelude.Nothing,
+      parameterGroupFamily = Prelude.Nothing
+    }
+
+-- | The patched engine version
+engineVersionInfo_enginePatchVersion :: Lens.Lens' EngineVersionInfo (Prelude.Maybe Prelude.Text)
+engineVersionInfo_enginePatchVersion = Lens.lens (\EngineVersionInfo' {enginePatchVersion} -> enginePatchVersion) (\s@EngineVersionInfo' {} a -> s {enginePatchVersion = a} :: EngineVersionInfo)
+
+-- | The engine version
+engineVersionInfo_engineVersion :: Lens.Lens' EngineVersionInfo (Prelude.Maybe Prelude.Text)
+engineVersionInfo_engineVersion = Lens.lens (\EngineVersionInfo' {engineVersion} -> engineVersion) (\s@EngineVersionInfo' {} a -> s {engineVersion = a} :: EngineVersionInfo)
+
+-- | Specifies the name of the parameter group family to which the engine
+-- default parameters apply.
+engineVersionInfo_parameterGroupFamily :: Lens.Lens' EngineVersionInfo (Prelude.Maybe Prelude.Text)
+engineVersionInfo_parameterGroupFamily = Lens.lens (\EngineVersionInfo' {parameterGroupFamily} -> parameterGroupFamily) (\s@EngineVersionInfo' {} a -> s {parameterGroupFamily = a} :: EngineVersionInfo)
+
+instance Data.FromJSON EngineVersionInfo where
+  parseJSON =
+    Data.withObject
+      "EngineVersionInfo"
+      ( \x ->
+          EngineVersionInfo'
+            Prelude.<$> (x Data..:? "EnginePatchVersion")
+            Prelude.<*> (x Data..:? "EngineVersion")
+            Prelude.<*> (x Data..:? "ParameterGroupFamily")
+      )
+
+instance Prelude.Hashable EngineVersionInfo where
+  hashWithSalt _salt EngineVersionInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` enginePatchVersion
+      `Prelude.hashWithSalt` engineVersion
+      `Prelude.hashWithSalt` parameterGroupFamily
+
+instance Prelude.NFData EngineVersionInfo where
+  rnf EngineVersionInfo' {..} =
+    Prelude.rnf enginePatchVersion
+      `Prelude.seq` Prelude.rnf engineVersion
+      `Prelude.seq` Prelude.rnf parameterGroupFamily
diff --git a/gen/Amazonka/MemoryDb/Types/Event.hs b/gen/Amazonka/MemoryDb/Types/Event.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Event.hs
@@ -0,0 +1,117 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Event
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Event where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.SourceType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents a single occurrence of something interesting within the
+-- system. Some examples of events are creating a cluster or adding or
+-- removing a node.
+--
+-- /See:/ 'newEvent' smart constructor.
+data Event = Event'
+  { -- | The date and time when the event occurred.
+    date :: Prelude.Maybe Data.POSIX,
+    -- | The text of the event.
+    message :: Prelude.Maybe Prelude.Text,
+    -- | The name for the source of the event. For example, if the event occurred
+    -- at the cluster level, the identifier would be the name of the cluster.
+    sourceName :: Prelude.Maybe Prelude.Text,
+    -- | Specifies the origin of this event - a cluster, a parameter group, a
+    -- security group, etc.
+    sourceType :: Prelude.Maybe SourceType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Event' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'date', 'event_date' - The date and time when the event occurred.
+--
+-- 'message', 'event_message' - The text of the event.
+--
+-- 'sourceName', 'event_sourceName' - The name for the source of the event. For example, if the event occurred
+-- at the cluster level, the identifier would be the name of the cluster.
+--
+-- 'sourceType', 'event_sourceType' - Specifies the origin of this event - a cluster, a parameter group, a
+-- security group, etc.
+newEvent ::
+  Event
+newEvent =
+  Event'
+    { date = Prelude.Nothing,
+      message = Prelude.Nothing,
+      sourceName = Prelude.Nothing,
+      sourceType = Prelude.Nothing
+    }
+
+-- | The date and time when the event occurred.
+event_date :: Lens.Lens' Event (Prelude.Maybe Prelude.UTCTime)
+event_date = Lens.lens (\Event' {date} -> date) (\s@Event' {} a -> s {date = a} :: Event) Prelude.. Lens.mapping Data._Time
+
+-- | The text of the event.
+event_message :: Lens.Lens' Event (Prelude.Maybe Prelude.Text)
+event_message = Lens.lens (\Event' {message} -> message) (\s@Event' {} a -> s {message = a} :: Event)
+
+-- | The name for the source of the event. For example, if the event occurred
+-- at the cluster level, the identifier would be the name of the cluster.
+event_sourceName :: Lens.Lens' Event (Prelude.Maybe Prelude.Text)
+event_sourceName = Lens.lens (\Event' {sourceName} -> sourceName) (\s@Event' {} a -> s {sourceName = a} :: Event)
+
+-- | Specifies the origin of this event - a cluster, a parameter group, a
+-- security group, etc.
+event_sourceType :: Lens.Lens' Event (Prelude.Maybe SourceType)
+event_sourceType = Lens.lens (\Event' {sourceType} -> sourceType) (\s@Event' {} a -> s {sourceType = a} :: Event)
+
+instance Data.FromJSON Event where
+  parseJSON =
+    Data.withObject
+      "Event"
+      ( \x ->
+          Event'
+            Prelude.<$> (x Data..:? "Date")
+            Prelude.<*> (x Data..:? "Message")
+            Prelude.<*> (x Data..:? "SourceName")
+            Prelude.<*> (x Data..:? "SourceType")
+      )
+
+instance Prelude.Hashable Event where
+  hashWithSalt _salt Event' {..} =
+    _salt
+      `Prelude.hashWithSalt` date
+      `Prelude.hashWithSalt` message
+      `Prelude.hashWithSalt` sourceName
+      `Prelude.hashWithSalt` sourceType
+
+instance Prelude.NFData Event where
+  rnf Event' {..} =
+    Prelude.rnf date
+      `Prelude.seq` Prelude.rnf message
+      `Prelude.seq` Prelude.rnf sourceName
+      `Prelude.seq` Prelude.rnf sourceType
diff --git a/gen/Amazonka/MemoryDb/Types/Filter.hs b/gen/Amazonka/MemoryDb/Types/Filter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Filter.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Filter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Filter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Used to streamline results of a search based on the property being
+-- filtered.
+--
+-- /See:/ 'newFilter' smart constructor.
+data Filter = Filter'
+  { -- | The property being filtered. For example, UserName.
+    name :: Prelude.Text,
+    -- | The property values to filter on. For example, \"user-123\".
+    values :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Filter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'filter_name' - The property being filtered. For example, UserName.
+--
+-- 'values', 'filter_values' - The property values to filter on. For example, \"user-123\".
+newFilter ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'values'
+  Prelude.NonEmpty Prelude.Text ->
+  Filter
+newFilter pName_ pValues_ =
+  Filter'
+    { name = pName_,
+      values = Lens.coerced Lens.# pValues_
+    }
+
+-- | The property being filtered. For example, UserName.
+filter_name :: Lens.Lens' Filter Prelude.Text
+filter_name = Lens.lens (\Filter' {name} -> name) (\s@Filter' {} a -> s {name = a} :: Filter)
+
+-- | The property values to filter on. For example, \"user-123\".
+filter_values :: Lens.Lens' Filter (Prelude.NonEmpty Prelude.Text)
+filter_values = Lens.lens (\Filter' {values} -> values) (\s@Filter' {} a -> s {values = a} :: Filter) Prelude.. Lens.coerced
+
+instance Prelude.Hashable Filter where
+  hashWithSalt _salt Filter' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData Filter where
+  rnf Filter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON Filter where
+  toJSON Filter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Values" Data..= values)
+          ]
+      )
diff --git a/gen/Amazonka/MemoryDb/Types/InputAuthenticationType.hs b/gen/Amazonka/MemoryDb/Types/InputAuthenticationType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/InputAuthenticationType.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.InputAuthenticationType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.InputAuthenticationType
+  ( InputAuthenticationType
+      ( ..,
+        InputAuthenticationType_Password
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype InputAuthenticationType = InputAuthenticationType'
+  { fromInputAuthenticationType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern InputAuthenticationType_Password :: InputAuthenticationType
+pattern InputAuthenticationType_Password = InputAuthenticationType' "password"
+
+{-# COMPLETE
+  InputAuthenticationType_Password,
+  InputAuthenticationType'
+  #-}
diff --git a/gen/Amazonka/MemoryDb/Types/Node.hs b/gen/Amazonka/MemoryDb/Types/Node.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Node.hs
@@ -0,0 +1,128 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Node
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Node where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.Endpoint
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents an individual node within a cluster. Each node runs its own
+-- instance of the cluster\'s protocol-compliant caching software.
+--
+-- /See:/ 'newNode' smart constructor.
+data Node = Node'
+  { -- | The Availability Zone in which the node resides
+    availabilityZone :: Prelude.Maybe Prelude.Text,
+    -- | The date and time when the node was created.
+    createTime :: Prelude.Maybe Data.POSIX,
+    -- | The hostname for connecting to this node.
+    endpoint :: Prelude.Maybe Endpoint,
+    -- | The node identifier. A node name is a numeric identifier (0001, 0002,
+    -- etc.). The combination of cluster name, shard name and node name
+    -- uniquely identifies every node used in a customer\'s Amazon account.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The status of the service update on the node
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Node' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'availabilityZone', 'node_availabilityZone' - The Availability Zone in which the node resides
+--
+-- 'createTime', 'node_createTime' - The date and time when the node was created.
+--
+-- 'endpoint', 'node_endpoint' - The hostname for connecting to this node.
+--
+-- 'name', 'node_name' - The node identifier. A node name is a numeric identifier (0001, 0002,
+-- etc.). The combination of cluster name, shard name and node name
+-- uniquely identifies every node used in a customer\'s Amazon account.
+--
+-- 'status', 'node_status' - The status of the service update on the node
+newNode ::
+  Node
+newNode =
+  Node'
+    { availabilityZone = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      endpoint = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Availability Zone in which the node resides
+node_availabilityZone :: Lens.Lens' Node (Prelude.Maybe Prelude.Text)
+node_availabilityZone = Lens.lens (\Node' {availabilityZone} -> availabilityZone) (\s@Node' {} a -> s {availabilityZone = a} :: Node)
+
+-- | The date and time when the node was created.
+node_createTime :: Lens.Lens' Node (Prelude.Maybe Prelude.UTCTime)
+node_createTime = Lens.lens (\Node' {createTime} -> createTime) (\s@Node' {} a -> s {createTime = a} :: Node) Prelude.. Lens.mapping Data._Time
+
+-- | The hostname for connecting to this node.
+node_endpoint :: Lens.Lens' Node (Prelude.Maybe Endpoint)
+node_endpoint = Lens.lens (\Node' {endpoint} -> endpoint) (\s@Node' {} a -> s {endpoint = a} :: Node)
+
+-- | The node identifier. A node name is a numeric identifier (0001, 0002,
+-- etc.). The combination of cluster name, shard name and node name
+-- uniquely identifies every node used in a customer\'s Amazon account.
+node_name :: Lens.Lens' Node (Prelude.Maybe Prelude.Text)
+node_name = Lens.lens (\Node' {name} -> name) (\s@Node' {} a -> s {name = a} :: Node)
+
+-- | The status of the service update on the node
+node_status :: Lens.Lens' Node (Prelude.Maybe Prelude.Text)
+node_status = Lens.lens (\Node' {status} -> status) (\s@Node' {} a -> s {status = a} :: Node)
+
+instance Data.FromJSON Node where
+  parseJSON =
+    Data.withObject
+      "Node"
+      ( \x ->
+          Node'
+            Prelude.<$> (x Data..:? "AvailabilityZone")
+            Prelude.<*> (x Data..:? "CreateTime")
+            Prelude.<*> (x Data..:? "Endpoint")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable Node where
+  hashWithSalt _salt Node' {..} =
+    _salt
+      `Prelude.hashWithSalt` availabilityZone
+      `Prelude.hashWithSalt` createTime
+      `Prelude.hashWithSalt` endpoint
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Node where
+  rnf Node' {..} =
+    Prelude.rnf availabilityZone
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf endpoint
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/MemoryDb/Types/Parameter.hs b/gen/Amazonka/MemoryDb/Types/Parameter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Parameter.hs
@@ -0,0 +1,133 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Parameter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Parameter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an individual setting that controls some aspect of MemoryDB
+-- behavior.
+--
+-- /See:/ 'newParameter' smart constructor.
+data Parameter = Parameter'
+  { -- | The valid range of values for the parameter.
+    allowedValues :: Prelude.Maybe Prelude.Text,
+    -- | The parameter\'s data type
+    dataType :: Prelude.Maybe Prelude.Text,
+    -- | A description of the parameter
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The earliest engine version to which the parameter can apply.
+    minimumEngineVersion :: Prelude.Maybe Prelude.Text,
+    -- | The name of the parameter
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The value of the parameter
+    value :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Parameter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'allowedValues', 'parameter_allowedValues' - The valid range of values for the parameter.
+--
+-- 'dataType', 'parameter_dataType' - The parameter\'s data type
+--
+-- 'description', 'parameter_description' - A description of the parameter
+--
+-- 'minimumEngineVersion', 'parameter_minimumEngineVersion' - The earliest engine version to which the parameter can apply.
+--
+-- 'name', 'parameter_name' - The name of the parameter
+--
+-- 'value', 'parameter_value' - The value of the parameter
+newParameter ::
+  Parameter
+newParameter =
+  Parameter'
+    { allowedValues = Prelude.Nothing,
+      dataType = Prelude.Nothing,
+      description = Prelude.Nothing,
+      minimumEngineVersion = Prelude.Nothing,
+      name = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | The valid range of values for the parameter.
+parameter_allowedValues :: Lens.Lens' Parameter (Prelude.Maybe Prelude.Text)
+parameter_allowedValues = Lens.lens (\Parameter' {allowedValues} -> allowedValues) (\s@Parameter' {} a -> s {allowedValues = a} :: Parameter)
+
+-- | The parameter\'s data type
+parameter_dataType :: Lens.Lens' Parameter (Prelude.Maybe Prelude.Text)
+parameter_dataType = Lens.lens (\Parameter' {dataType} -> dataType) (\s@Parameter' {} a -> s {dataType = a} :: Parameter)
+
+-- | A description of the parameter
+parameter_description :: Lens.Lens' Parameter (Prelude.Maybe Prelude.Text)
+parameter_description = Lens.lens (\Parameter' {description} -> description) (\s@Parameter' {} a -> s {description = a} :: Parameter)
+
+-- | The earliest engine version to which the parameter can apply.
+parameter_minimumEngineVersion :: Lens.Lens' Parameter (Prelude.Maybe Prelude.Text)
+parameter_minimumEngineVersion = Lens.lens (\Parameter' {minimumEngineVersion} -> minimumEngineVersion) (\s@Parameter' {} a -> s {minimumEngineVersion = a} :: Parameter)
+
+-- | The name of the parameter
+parameter_name :: Lens.Lens' Parameter (Prelude.Maybe Prelude.Text)
+parameter_name = Lens.lens (\Parameter' {name} -> name) (\s@Parameter' {} a -> s {name = a} :: Parameter)
+
+-- | The value of the parameter
+parameter_value :: Lens.Lens' Parameter (Prelude.Maybe Prelude.Text)
+parameter_value = Lens.lens (\Parameter' {value} -> value) (\s@Parameter' {} a -> s {value = a} :: Parameter)
+
+instance Data.FromJSON Parameter where
+  parseJSON =
+    Data.withObject
+      "Parameter"
+      ( \x ->
+          Parameter'
+            Prelude.<$> (x Data..:? "AllowedValues")
+            Prelude.<*> (x Data..:? "DataType")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "MinimumEngineVersion")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Value")
+      )
+
+instance Prelude.Hashable Parameter where
+  hashWithSalt _salt Parameter' {..} =
+    _salt
+      `Prelude.hashWithSalt` allowedValues
+      `Prelude.hashWithSalt` dataType
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` minimumEngineVersion
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Parameter where
+  rnf Parameter' {..} =
+    Prelude.rnf allowedValues
+      `Prelude.seq` Prelude.rnf dataType
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf minimumEngineVersion
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/MemoryDb/Types/ParameterGroup.hs b/gen/Amazonka/MemoryDb/Types/ParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ParameterGroup.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ParameterGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ParameterGroup where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents the output of a CreateParameterGroup operation. A parameter
+-- group represents a combination of specific values for the parameters
+-- that are passed to the engine software during startup.
+--
+-- /See:/ 'newParameterGroup' smart constructor.
+data ParameterGroup = ParameterGroup'
+  { -- | The Amazon Resource Name (ARN) of the parameter group
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | A description of the parameter group
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The name of the parameter group family that this parameter group is
+    -- compatible with.
+    family :: Prelude.Maybe Prelude.Text,
+    -- | The name of the parameter group
+    name :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ParameterGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'parameterGroup_arn' - The Amazon Resource Name (ARN) of the parameter group
+--
+-- 'description', 'parameterGroup_description' - A description of the parameter group
+--
+-- 'family', 'parameterGroup_family' - The name of the parameter group family that this parameter group is
+-- compatible with.
+--
+-- 'name', 'parameterGroup_name' - The name of the parameter group
+newParameterGroup ::
+  ParameterGroup
+newParameterGroup =
+  ParameterGroup'
+    { arn = Prelude.Nothing,
+      description = Prelude.Nothing,
+      family = Prelude.Nothing,
+      name = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the parameter group
+parameterGroup_arn :: Lens.Lens' ParameterGroup (Prelude.Maybe Prelude.Text)
+parameterGroup_arn = Lens.lens (\ParameterGroup' {arn} -> arn) (\s@ParameterGroup' {} a -> s {arn = a} :: ParameterGroup)
+
+-- | A description of the parameter group
+parameterGroup_description :: Lens.Lens' ParameterGroup (Prelude.Maybe Prelude.Text)
+parameterGroup_description = Lens.lens (\ParameterGroup' {description} -> description) (\s@ParameterGroup' {} a -> s {description = a} :: ParameterGroup)
+
+-- | The name of the parameter group family that this parameter group is
+-- compatible with.
+parameterGroup_family :: Lens.Lens' ParameterGroup (Prelude.Maybe Prelude.Text)
+parameterGroup_family = Lens.lens (\ParameterGroup' {family} -> family) (\s@ParameterGroup' {} a -> s {family = a} :: ParameterGroup)
+
+-- | The name of the parameter group
+parameterGroup_name :: Lens.Lens' ParameterGroup (Prelude.Maybe Prelude.Text)
+parameterGroup_name = Lens.lens (\ParameterGroup' {name} -> name) (\s@ParameterGroup' {} a -> s {name = a} :: ParameterGroup)
+
+instance Data.FromJSON ParameterGroup where
+  parseJSON =
+    Data.withObject
+      "ParameterGroup"
+      ( \x ->
+          ParameterGroup'
+            Prelude.<$> (x Data..:? "ARN")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "Family")
+            Prelude.<*> (x Data..:? "Name")
+      )
+
+instance Prelude.Hashable ParameterGroup where
+  hashWithSalt _salt ParameterGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` family
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData ParameterGroup where
+  rnf ParameterGroup' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf family
+      `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/MemoryDb/Types/ParameterNameValue.hs b/gen/Amazonka/MemoryDb/Types/ParameterNameValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ParameterNameValue.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ParameterNameValue
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ParameterNameValue where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a name-value pair that is used to update the value of a
+-- parameter.
+--
+-- /See:/ 'newParameterNameValue' smart constructor.
+data ParameterNameValue = ParameterNameValue'
+  { -- | The name of the parameter
+    parameterName :: Prelude.Maybe Prelude.Text,
+    -- | The value of the parameter
+    parameterValue :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ParameterNameValue' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'parameterName', 'parameterNameValue_parameterName' - The name of the parameter
+--
+-- 'parameterValue', 'parameterNameValue_parameterValue' - The value of the parameter
+newParameterNameValue ::
+  ParameterNameValue
+newParameterNameValue =
+  ParameterNameValue'
+    { parameterName =
+        Prelude.Nothing,
+      parameterValue = Prelude.Nothing
+    }
+
+-- | The name of the parameter
+parameterNameValue_parameterName :: Lens.Lens' ParameterNameValue (Prelude.Maybe Prelude.Text)
+parameterNameValue_parameterName = Lens.lens (\ParameterNameValue' {parameterName} -> parameterName) (\s@ParameterNameValue' {} a -> s {parameterName = a} :: ParameterNameValue)
+
+-- | The value of the parameter
+parameterNameValue_parameterValue :: Lens.Lens' ParameterNameValue (Prelude.Maybe Prelude.Text)
+parameterNameValue_parameterValue = Lens.lens (\ParameterNameValue' {parameterValue} -> parameterValue) (\s@ParameterNameValue' {} a -> s {parameterValue = a} :: ParameterNameValue)
+
+instance Prelude.Hashable ParameterNameValue where
+  hashWithSalt _salt ParameterNameValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` parameterName
+      `Prelude.hashWithSalt` parameterValue
+
+instance Prelude.NFData ParameterNameValue where
+  rnf ParameterNameValue' {..} =
+    Prelude.rnf parameterName
+      `Prelude.seq` Prelude.rnf parameterValue
+
+instance Data.ToJSON ParameterNameValue where
+  toJSON ParameterNameValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ParameterName" Data..=) Prelude.<$> parameterName,
+            ("ParameterValue" Data..=)
+              Prelude.<$> parameterValue
+          ]
+      )
diff --git a/gen/Amazonka/MemoryDb/Types/PendingModifiedServiceUpdate.hs b/gen/Amazonka/MemoryDb/Types/PendingModifiedServiceUpdate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/PendingModifiedServiceUpdate.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.PendingModifiedServiceUpdate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.PendingModifiedServiceUpdate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.ServiceUpdateStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Update action that has yet to be processed for the corresponding
+-- apply\/stop request
+--
+-- /See:/ 'newPendingModifiedServiceUpdate' smart constructor.
+data PendingModifiedServiceUpdate = PendingModifiedServiceUpdate'
+  { -- | The unique ID of the service update
+    serviceUpdateName :: Prelude.Maybe Prelude.Text,
+    -- | The status of the service update
+    status :: Prelude.Maybe ServiceUpdateStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PendingModifiedServiceUpdate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'serviceUpdateName', 'pendingModifiedServiceUpdate_serviceUpdateName' - The unique ID of the service update
+--
+-- 'status', 'pendingModifiedServiceUpdate_status' - The status of the service update
+newPendingModifiedServiceUpdate ::
+  PendingModifiedServiceUpdate
+newPendingModifiedServiceUpdate =
+  PendingModifiedServiceUpdate'
+    { serviceUpdateName =
+        Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The unique ID of the service update
+pendingModifiedServiceUpdate_serviceUpdateName :: Lens.Lens' PendingModifiedServiceUpdate (Prelude.Maybe Prelude.Text)
+pendingModifiedServiceUpdate_serviceUpdateName = Lens.lens (\PendingModifiedServiceUpdate' {serviceUpdateName} -> serviceUpdateName) (\s@PendingModifiedServiceUpdate' {} a -> s {serviceUpdateName = a} :: PendingModifiedServiceUpdate)
+
+-- | The status of the service update
+pendingModifiedServiceUpdate_status :: Lens.Lens' PendingModifiedServiceUpdate (Prelude.Maybe ServiceUpdateStatus)
+pendingModifiedServiceUpdate_status = Lens.lens (\PendingModifiedServiceUpdate' {status} -> status) (\s@PendingModifiedServiceUpdate' {} a -> s {status = a} :: PendingModifiedServiceUpdate)
+
+instance Data.FromJSON PendingModifiedServiceUpdate where
+  parseJSON =
+    Data.withObject
+      "PendingModifiedServiceUpdate"
+      ( \x ->
+          PendingModifiedServiceUpdate'
+            Prelude.<$> (x Data..:? "ServiceUpdateName")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance
+  Prelude.Hashable
+    PendingModifiedServiceUpdate
+  where
+  hashWithSalt _salt PendingModifiedServiceUpdate' {..} =
+    _salt
+      `Prelude.hashWithSalt` serviceUpdateName
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData PendingModifiedServiceUpdate where
+  rnf PendingModifiedServiceUpdate' {..} =
+    Prelude.rnf serviceUpdateName
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/MemoryDb/Types/RecurringCharge.hs b/gen/Amazonka/MemoryDb/Types/RecurringCharge.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/RecurringCharge.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.RecurringCharge
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.RecurringCharge where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The recurring charge to run this reserved node.
+--
+-- /See:/ 'newRecurringCharge' smart constructor.
+data RecurringCharge = RecurringCharge'
+  { -- | The amount of the recurring charge to run this reserved node.
+    recurringChargeAmount :: Prelude.Maybe Prelude.Double,
+    -- | The frequency of the recurring price charged to run this reserved node.
+    recurringChargeFrequency :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RecurringCharge' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recurringChargeAmount', 'recurringCharge_recurringChargeAmount' - The amount of the recurring charge to run this reserved node.
+--
+-- 'recurringChargeFrequency', 'recurringCharge_recurringChargeFrequency' - The frequency of the recurring price charged to run this reserved node.
+newRecurringCharge ::
+  RecurringCharge
+newRecurringCharge =
+  RecurringCharge'
+    { recurringChargeAmount =
+        Prelude.Nothing,
+      recurringChargeFrequency = Prelude.Nothing
+    }
+
+-- | The amount of the recurring charge to run this reserved node.
+recurringCharge_recurringChargeAmount :: Lens.Lens' RecurringCharge (Prelude.Maybe Prelude.Double)
+recurringCharge_recurringChargeAmount = Lens.lens (\RecurringCharge' {recurringChargeAmount} -> recurringChargeAmount) (\s@RecurringCharge' {} a -> s {recurringChargeAmount = a} :: RecurringCharge)
+
+-- | The frequency of the recurring price charged to run this reserved node.
+recurringCharge_recurringChargeFrequency :: Lens.Lens' RecurringCharge (Prelude.Maybe Prelude.Text)
+recurringCharge_recurringChargeFrequency = Lens.lens (\RecurringCharge' {recurringChargeFrequency} -> recurringChargeFrequency) (\s@RecurringCharge' {} a -> s {recurringChargeFrequency = a} :: RecurringCharge)
+
+instance Data.FromJSON RecurringCharge where
+  parseJSON =
+    Data.withObject
+      "RecurringCharge"
+      ( \x ->
+          RecurringCharge'
+            Prelude.<$> (x Data..:? "RecurringChargeAmount")
+            Prelude.<*> (x Data..:? "RecurringChargeFrequency")
+      )
+
+instance Prelude.Hashable RecurringCharge where
+  hashWithSalt _salt RecurringCharge' {..} =
+    _salt
+      `Prelude.hashWithSalt` recurringChargeAmount
+      `Prelude.hashWithSalt` recurringChargeFrequency
+
+instance Prelude.NFData RecurringCharge where
+  rnf RecurringCharge' {..} =
+    Prelude.rnf recurringChargeAmount
+      `Prelude.seq` Prelude.rnf recurringChargeFrequency
diff --git a/gen/Amazonka/MemoryDb/Types/ReplicaConfigurationRequest.hs b/gen/Amazonka/MemoryDb/Types/ReplicaConfigurationRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ReplicaConfigurationRequest.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ReplicaConfigurationRequest
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ReplicaConfigurationRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A request to configure the number of replicas in a shard
+--
+-- /See:/ 'newReplicaConfigurationRequest' smart constructor.
+data ReplicaConfigurationRequest = ReplicaConfigurationRequest'
+  { -- | The number of replicas to scale up or down to
+    replicaCount :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReplicaConfigurationRequest' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'replicaCount', 'replicaConfigurationRequest_replicaCount' - The number of replicas to scale up or down to
+newReplicaConfigurationRequest ::
+  ReplicaConfigurationRequest
+newReplicaConfigurationRequest =
+  ReplicaConfigurationRequest'
+    { replicaCount =
+        Prelude.Nothing
+    }
+
+-- | The number of replicas to scale up or down to
+replicaConfigurationRequest_replicaCount :: Lens.Lens' ReplicaConfigurationRequest (Prelude.Maybe Prelude.Int)
+replicaConfigurationRequest_replicaCount = Lens.lens (\ReplicaConfigurationRequest' {replicaCount} -> replicaCount) (\s@ReplicaConfigurationRequest' {} a -> s {replicaCount = a} :: ReplicaConfigurationRequest)
+
+instance Prelude.Hashable ReplicaConfigurationRequest where
+  hashWithSalt _salt ReplicaConfigurationRequest' {..} =
+    _salt `Prelude.hashWithSalt` replicaCount
+
+instance Prelude.NFData ReplicaConfigurationRequest where
+  rnf ReplicaConfigurationRequest' {..} =
+    Prelude.rnf replicaCount
+
+instance Data.ToJSON ReplicaConfigurationRequest where
+  toJSON ReplicaConfigurationRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("ReplicaCount" Data..=) Prelude.<$> replicaCount]
+      )
diff --git a/gen/Amazonka/MemoryDb/Types/ReservedNode.hs b/gen/Amazonka/MemoryDb/Types/ReservedNode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ReservedNode.hs
@@ -0,0 +1,196 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ReservedNode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ReservedNode where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.RecurringCharge
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents the output of a @PurchaseReservedNodesOffering@ operation.
+--
+-- /See:/ 'newReservedNode' smart constructor.
+data ReservedNode = ReservedNode'
+  { -- | The Amazon Resource Name (ARN) of the reserved node.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The duration of the reservation in seconds.
+    duration :: Prelude.Maybe Prelude.Int,
+    -- | The fixed price charged for this reserved node.
+    fixedPrice :: Prelude.Maybe Prelude.Double,
+    -- | The number of nodes that have been reserved.
+    nodeCount :: Prelude.Maybe Prelude.Int,
+    -- | The node type for the reserved nodes.
+    nodeType :: Prelude.Maybe Prelude.Text,
+    -- | The offering type of this reserved node.
+    offeringType :: Prelude.Maybe Prelude.Text,
+    -- | The recurring price charged to run this reserved node.
+    recurringCharges :: Prelude.Maybe [RecurringCharge],
+    -- | A customer-specified identifier to track this reservation.
+    reservationId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the reserved node offering to purchase.
+    reservedNodesOfferingId :: Prelude.Maybe Prelude.Text,
+    -- | The time the reservation started.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | The state of the reserved node.
+    state :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReservedNode' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'reservedNode_arn' - The Amazon Resource Name (ARN) of the reserved node.
+--
+-- 'duration', 'reservedNode_duration' - The duration of the reservation in seconds.
+--
+-- 'fixedPrice', 'reservedNode_fixedPrice' - The fixed price charged for this reserved node.
+--
+-- 'nodeCount', 'reservedNode_nodeCount' - The number of nodes that have been reserved.
+--
+-- 'nodeType', 'reservedNode_nodeType' - The node type for the reserved nodes.
+--
+-- 'offeringType', 'reservedNode_offeringType' - The offering type of this reserved node.
+--
+-- 'recurringCharges', 'reservedNode_recurringCharges' - The recurring price charged to run this reserved node.
+--
+-- 'reservationId', 'reservedNode_reservationId' - A customer-specified identifier to track this reservation.
+--
+-- 'reservedNodesOfferingId', 'reservedNode_reservedNodesOfferingId' - The ID of the reserved node offering to purchase.
+--
+-- 'startTime', 'reservedNode_startTime' - The time the reservation started.
+--
+-- 'state', 'reservedNode_state' - The state of the reserved node.
+newReservedNode ::
+  ReservedNode
+newReservedNode =
+  ReservedNode'
+    { arn = Prelude.Nothing,
+      duration = Prelude.Nothing,
+      fixedPrice = Prelude.Nothing,
+      nodeCount = Prelude.Nothing,
+      nodeType = Prelude.Nothing,
+      offeringType = Prelude.Nothing,
+      recurringCharges = Prelude.Nothing,
+      reservationId = Prelude.Nothing,
+      reservedNodesOfferingId = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      state = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the reserved node.
+reservedNode_arn :: Lens.Lens' ReservedNode (Prelude.Maybe Prelude.Text)
+reservedNode_arn = Lens.lens (\ReservedNode' {arn} -> arn) (\s@ReservedNode' {} a -> s {arn = a} :: ReservedNode)
+
+-- | The duration of the reservation in seconds.
+reservedNode_duration :: Lens.Lens' ReservedNode (Prelude.Maybe Prelude.Int)
+reservedNode_duration = Lens.lens (\ReservedNode' {duration} -> duration) (\s@ReservedNode' {} a -> s {duration = a} :: ReservedNode)
+
+-- | The fixed price charged for this reserved node.
+reservedNode_fixedPrice :: Lens.Lens' ReservedNode (Prelude.Maybe Prelude.Double)
+reservedNode_fixedPrice = Lens.lens (\ReservedNode' {fixedPrice} -> fixedPrice) (\s@ReservedNode' {} a -> s {fixedPrice = a} :: ReservedNode)
+
+-- | The number of nodes that have been reserved.
+reservedNode_nodeCount :: Lens.Lens' ReservedNode (Prelude.Maybe Prelude.Int)
+reservedNode_nodeCount = Lens.lens (\ReservedNode' {nodeCount} -> nodeCount) (\s@ReservedNode' {} a -> s {nodeCount = a} :: ReservedNode)
+
+-- | The node type for the reserved nodes.
+reservedNode_nodeType :: Lens.Lens' ReservedNode (Prelude.Maybe Prelude.Text)
+reservedNode_nodeType = Lens.lens (\ReservedNode' {nodeType} -> nodeType) (\s@ReservedNode' {} a -> s {nodeType = a} :: ReservedNode)
+
+-- | The offering type of this reserved node.
+reservedNode_offeringType :: Lens.Lens' ReservedNode (Prelude.Maybe Prelude.Text)
+reservedNode_offeringType = Lens.lens (\ReservedNode' {offeringType} -> offeringType) (\s@ReservedNode' {} a -> s {offeringType = a} :: ReservedNode)
+
+-- | The recurring price charged to run this reserved node.
+reservedNode_recurringCharges :: Lens.Lens' ReservedNode (Prelude.Maybe [RecurringCharge])
+reservedNode_recurringCharges = Lens.lens (\ReservedNode' {recurringCharges} -> recurringCharges) (\s@ReservedNode' {} a -> s {recurringCharges = a} :: ReservedNode) Prelude.. Lens.mapping Lens.coerced
+
+-- | A customer-specified identifier to track this reservation.
+reservedNode_reservationId :: Lens.Lens' ReservedNode (Prelude.Maybe Prelude.Text)
+reservedNode_reservationId = Lens.lens (\ReservedNode' {reservationId} -> reservationId) (\s@ReservedNode' {} a -> s {reservationId = a} :: ReservedNode)
+
+-- | The ID of the reserved node offering to purchase.
+reservedNode_reservedNodesOfferingId :: Lens.Lens' ReservedNode (Prelude.Maybe Prelude.Text)
+reservedNode_reservedNodesOfferingId = Lens.lens (\ReservedNode' {reservedNodesOfferingId} -> reservedNodesOfferingId) (\s@ReservedNode' {} a -> s {reservedNodesOfferingId = a} :: ReservedNode)
+
+-- | The time the reservation started.
+reservedNode_startTime :: Lens.Lens' ReservedNode (Prelude.Maybe Prelude.UTCTime)
+reservedNode_startTime = Lens.lens (\ReservedNode' {startTime} -> startTime) (\s@ReservedNode' {} a -> s {startTime = a} :: ReservedNode) Prelude.. Lens.mapping Data._Time
+
+-- | The state of the reserved node.
+reservedNode_state :: Lens.Lens' ReservedNode (Prelude.Maybe Prelude.Text)
+reservedNode_state = Lens.lens (\ReservedNode' {state} -> state) (\s@ReservedNode' {} a -> s {state = a} :: ReservedNode)
+
+instance Data.FromJSON ReservedNode where
+  parseJSON =
+    Data.withObject
+      "ReservedNode"
+      ( \x ->
+          ReservedNode'
+            Prelude.<$> (x Data..:? "ARN")
+            Prelude.<*> (x Data..:? "Duration")
+            Prelude.<*> (x Data..:? "FixedPrice")
+            Prelude.<*> (x Data..:? "NodeCount")
+            Prelude.<*> (x Data..:? "NodeType")
+            Prelude.<*> (x Data..:? "OfferingType")
+            Prelude.<*> ( x
+                            Data..:? "RecurringCharges"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "ReservationId")
+            Prelude.<*> (x Data..:? "ReservedNodesOfferingId")
+            Prelude.<*> (x Data..:? "StartTime")
+            Prelude.<*> (x Data..:? "State")
+      )
+
+instance Prelude.Hashable ReservedNode where
+  hashWithSalt _salt ReservedNode' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` duration
+      `Prelude.hashWithSalt` fixedPrice
+      `Prelude.hashWithSalt` nodeCount
+      `Prelude.hashWithSalt` nodeType
+      `Prelude.hashWithSalt` offeringType
+      `Prelude.hashWithSalt` recurringCharges
+      `Prelude.hashWithSalt` reservationId
+      `Prelude.hashWithSalt` reservedNodesOfferingId
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData ReservedNode where
+  rnf ReservedNode' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf duration
+      `Prelude.seq` Prelude.rnf fixedPrice
+      `Prelude.seq` Prelude.rnf nodeCount
+      `Prelude.seq` Prelude.rnf nodeType
+      `Prelude.seq` Prelude.rnf offeringType
+      `Prelude.seq` Prelude.rnf recurringCharges
+      `Prelude.seq` Prelude.rnf reservationId
+      `Prelude.seq` Prelude.rnf reservedNodesOfferingId
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/MemoryDb/Types/ReservedNodesOffering.hs b/gen/Amazonka/MemoryDb/Types/ReservedNodesOffering.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ReservedNodesOffering.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ReservedNodesOffering
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ReservedNodesOffering where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.RecurringCharge
+import qualified Amazonka.Prelude as Prelude
+
+-- | The offering type of this node.
+--
+-- /See:/ 'newReservedNodesOffering' smart constructor.
+data ReservedNodesOffering = ReservedNodesOffering'
+  { -- | The duration of the reservation in seconds.
+    duration :: Prelude.Maybe Prelude.Int,
+    -- | The fixed price charged for this reserved node.
+    fixedPrice :: Prelude.Maybe Prelude.Double,
+    -- | The node type for the reserved nodes. For more information, see
+    -- <https://docs.aws.amazon.com/memorydb/latest/devguide/nodes.reserved.html#reserved-nodes-supported Supported node types>.
+    nodeType :: Prelude.Maybe Prelude.Text,
+    -- | The offering type of this reserved node.
+    offeringType :: Prelude.Maybe Prelude.Text,
+    -- | The recurring price charged to run this reserved node.
+    recurringCharges :: Prelude.Maybe [RecurringCharge],
+    -- | The offering identifier.
+    reservedNodesOfferingId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReservedNodesOffering' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'duration', 'reservedNodesOffering_duration' - The duration of the reservation in seconds.
+--
+-- 'fixedPrice', 'reservedNodesOffering_fixedPrice' - The fixed price charged for this reserved node.
+--
+-- 'nodeType', 'reservedNodesOffering_nodeType' - The node type for the reserved nodes. For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/nodes.reserved.html#reserved-nodes-supported Supported node types>.
+--
+-- 'offeringType', 'reservedNodesOffering_offeringType' - The offering type of this reserved node.
+--
+-- 'recurringCharges', 'reservedNodesOffering_recurringCharges' - The recurring price charged to run this reserved node.
+--
+-- 'reservedNodesOfferingId', 'reservedNodesOffering_reservedNodesOfferingId' - The offering identifier.
+newReservedNodesOffering ::
+  ReservedNodesOffering
+newReservedNodesOffering =
+  ReservedNodesOffering'
+    { duration = Prelude.Nothing,
+      fixedPrice = Prelude.Nothing,
+      nodeType = Prelude.Nothing,
+      offeringType = Prelude.Nothing,
+      recurringCharges = Prelude.Nothing,
+      reservedNodesOfferingId = Prelude.Nothing
+    }
+
+-- | The duration of the reservation in seconds.
+reservedNodesOffering_duration :: Lens.Lens' ReservedNodesOffering (Prelude.Maybe Prelude.Int)
+reservedNodesOffering_duration = Lens.lens (\ReservedNodesOffering' {duration} -> duration) (\s@ReservedNodesOffering' {} a -> s {duration = a} :: ReservedNodesOffering)
+
+-- | The fixed price charged for this reserved node.
+reservedNodesOffering_fixedPrice :: Lens.Lens' ReservedNodesOffering (Prelude.Maybe Prelude.Double)
+reservedNodesOffering_fixedPrice = Lens.lens (\ReservedNodesOffering' {fixedPrice} -> fixedPrice) (\s@ReservedNodesOffering' {} a -> s {fixedPrice = a} :: ReservedNodesOffering)
+
+-- | The node type for the reserved nodes. For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/nodes.reserved.html#reserved-nodes-supported Supported node types>.
+reservedNodesOffering_nodeType :: Lens.Lens' ReservedNodesOffering (Prelude.Maybe Prelude.Text)
+reservedNodesOffering_nodeType = Lens.lens (\ReservedNodesOffering' {nodeType} -> nodeType) (\s@ReservedNodesOffering' {} a -> s {nodeType = a} :: ReservedNodesOffering)
+
+-- | The offering type of this reserved node.
+reservedNodesOffering_offeringType :: Lens.Lens' ReservedNodesOffering (Prelude.Maybe Prelude.Text)
+reservedNodesOffering_offeringType = Lens.lens (\ReservedNodesOffering' {offeringType} -> offeringType) (\s@ReservedNodesOffering' {} a -> s {offeringType = a} :: ReservedNodesOffering)
+
+-- | The recurring price charged to run this reserved node.
+reservedNodesOffering_recurringCharges :: Lens.Lens' ReservedNodesOffering (Prelude.Maybe [RecurringCharge])
+reservedNodesOffering_recurringCharges = Lens.lens (\ReservedNodesOffering' {recurringCharges} -> recurringCharges) (\s@ReservedNodesOffering' {} a -> s {recurringCharges = a} :: ReservedNodesOffering) Prelude.. Lens.mapping Lens.coerced
+
+-- | The offering identifier.
+reservedNodesOffering_reservedNodesOfferingId :: Lens.Lens' ReservedNodesOffering (Prelude.Maybe Prelude.Text)
+reservedNodesOffering_reservedNodesOfferingId = Lens.lens (\ReservedNodesOffering' {reservedNodesOfferingId} -> reservedNodesOfferingId) (\s@ReservedNodesOffering' {} a -> s {reservedNodesOfferingId = a} :: ReservedNodesOffering)
+
+instance Data.FromJSON ReservedNodesOffering where
+  parseJSON =
+    Data.withObject
+      "ReservedNodesOffering"
+      ( \x ->
+          ReservedNodesOffering'
+            Prelude.<$> (x Data..:? "Duration")
+            Prelude.<*> (x Data..:? "FixedPrice")
+            Prelude.<*> (x Data..:? "NodeType")
+            Prelude.<*> (x Data..:? "OfferingType")
+            Prelude.<*> ( x
+                            Data..:? "RecurringCharges"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "ReservedNodesOfferingId")
+      )
+
+instance Prelude.Hashable ReservedNodesOffering where
+  hashWithSalt _salt ReservedNodesOffering' {..} =
+    _salt
+      `Prelude.hashWithSalt` duration
+      `Prelude.hashWithSalt` fixedPrice
+      `Prelude.hashWithSalt` nodeType
+      `Prelude.hashWithSalt` offeringType
+      `Prelude.hashWithSalt` recurringCharges
+      `Prelude.hashWithSalt` reservedNodesOfferingId
+
+instance Prelude.NFData ReservedNodesOffering where
+  rnf ReservedNodesOffering' {..} =
+    Prelude.rnf duration
+      `Prelude.seq` Prelude.rnf fixedPrice
+      `Prelude.seq` Prelude.rnf nodeType
+      `Prelude.seq` Prelude.rnf offeringType
+      `Prelude.seq` Prelude.rnf recurringCharges
+      `Prelude.seq` Prelude.rnf reservedNodesOfferingId
diff --git a/gen/Amazonka/MemoryDb/Types/ReshardingStatus.hs b/gen/Amazonka/MemoryDb/Types/ReshardingStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ReshardingStatus.hs
@@ -0,0 +1,69 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ReshardingStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ReshardingStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.SlotMigration
+import qualified Amazonka.Prelude as Prelude
+
+-- | The status of the online resharding
+--
+-- /See:/ 'newReshardingStatus' smart constructor.
+data ReshardingStatus = ReshardingStatus'
+  { -- | The status of the online resharding slot migration
+    slotMigration :: Prelude.Maybe SlotMigration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReshardingStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'slotMigration', 'reshardingStatus_slotMigration' - The status of the online resharding slot migration
+newReshardingStatus ::
+  ReshardingStatus
+newReshardingStatus =
+  ReshardingStatus' {slotMigration = Prelude.Nothing}
+
+-- | The status of the online resharding slot migration
+reshardingStatus_slotMigration :: Lens.Lens' ReshardingStatus (Prelude.Maybe SlotMigration)
+reshardingStatus_slotMigration = Lens.lens (\ReshardingStatus' {slotMigration} -> slotMigration) (\s@ReshardingStatus' {} a -> s {slotMigration = a} :: ReshardingStatus)
+
+instance Data.FromJSON ReshardingStatus where
+  parseJSON =
+    Data.withObject
+      "ReshardingStatus"
+      ( \x ->
+          ReshardingStatus'
+            Prelude.<$> (x Data..:? "SlotMigration")
+      )
+
+instance Prelude.Hashable ReshardingStatus where
+  hashWithSalt _salt ReshardingStatus' {..} =
+    _salt `Prelude.hashWithSalt` slotMigration
+
+instance Prelude.NFData ReshardingStatus where
+  rnf ReshardingStatus' {..} = Prelude.rnf slotMigration
diff --git a/gen/Amazonka/MemoryDb/Types/SecurityGroupMembership.hs b/gen/Amazonka/MemoryDb/Types/SecurityGroupMembership.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/SecurityGroupMembership.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.SecurityGroupMembership
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.SecurityGroupMembership where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents a single security group and its status.
+--
+-- /See:/ 'newSecurityGroupMembership' smart constructor.
+data SecurityGroupMembership = SecurityGroupMembership'
+  { -- | The identifier of the security group.
+    securityGroupId :: Prelude.Maybe Prelude.Text,
+    -- | The status of the security group membership. The status changes whenever
+    -- a security group is modified, or when the security groups assigned to a
+    -- cluster are modified.
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SecurityGroupMembership' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'securityGroupId', 'securityGroupMembership_securityGroupId' - The identifier of the security group.
+--
+-- 'status', 'securityGroupMembership_status' - The status of the security group membership. The status changes whenever
+-- a security group is modified, or when the security groups assigned to a
+-- cluster are modified.
+newSecurityGroupMembership ::
+  SecurityGroupMembership
+newSecurityGroupMembership =
+  SecurityGroupMembership'
+    { securityGroupId =
+        Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The identifier of the security group.
+securityGroupMembership_securityGroupId :: Lens.Lens' SecurityGroupMembership (Prelude.Maybe Prelude.Text)
+securityGroupMembership_securityGroupId = Lens.lens (\SecurityGroupMembership' {securityGroupId} -> securityGroupId) (\s@SecurityGroupMembership' {} a -> s {securityGroupId = a} :: SecurityGroupMembership)
+
+-- | The status of the security group membership. The status changes whenever
+-- a security group is modified, or when the security groups assigned to a
+-- cluster are modified.
+securityGroupMembership_status :: Lens.Lens' SecurityGroupMembership (Prelude.Maybe Prelude.Text)
+securityGroupMembership_status = Lens.lens (\SecurityGroupMembership' {status} -> status) (\s@SecurityGroupMembership' {} a -> s {status = a} :: SecurityGroupMembership)
+
+instance Data.FromJSON SecurityGroupMembership where
+  parseJSON =
+    Data.withObject
+      "SecurityGroupMembership"
+      ( \x ->
+          SecurityGroupMembership'
+            Prelude.<$> (x Data..:? "SecurityGroupId")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable SecurityGroupMembership where
+  hashWithSalt _salt SecurityGroupMembership' {..} =
+    _salt
+      `Prelude.hashWithSalt` securityGroupId
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData SecurityGroupMembership where
+  rnf SecurityGroupMembership' {..} =
+    Prelude.rnf securityGroupId
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/MemoryDb/Types/ServiceUpdate.hs b/gen/Amazonka/MemoryDb/Types/ServiceUpdate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ServiceUpdate.hs
@@ -0,0 +1,159 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ServiceUpdate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ServiceUpdate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.ServiceUpdateStatus
+import Amazonka.MemoryDb.Types.ServiceUpdateType
+import qualified Amazonka.Prelude as Prelude
+
+-- | An update that you can apply to your MemoryDB clusters.
+--
+-- /See:/ 'newServiceUpdate' smart constructor.
+data ServiceUpdate = ServiceUpdate'
+  { -- | The date at which the service update will be automatically applied
+    autoUpdateStartDate :: Prelude.Maybe Data.POSIX,
+    -- | The name of the cluster to which the service update applies
+    clusterName :: Prelude.Maybe Prelude.Text,
+    -- | Provides details of the service update
+    description :: Prelude.Maybe Prelude.Text,
+    -- | A list of nodes updated by the service update
+    nodesUpdated :: Prelude.Maybe Prelude.Text,
+    -- | The date when the service update is initially available
+    releaseDate :: Prelude.Maybe Data.POSIX,
+    -- | The unique ID of the service update
+    serviceUpdateName :: Prelude.Maybe Prelude.Text,
+    -- | The status of the service update
+    status :: Prelude.Maybe ServiceUpdateStatus,
+    -- | Reflects the nature of the service update
+    type' :: Prelude.Maybe ServiceUpdateType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ServiceUpdate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'autoUpdateStartDate', 'serviceUpdate_autoUpdateStartDate' - The date at which the service update will be automatically applied
+--
+-- 'clusterName', 'serviceUpdate_clusterName' - The name of the cluster to which the service update applies
+--
+-- 'description', 'serviceUpdate_description' - Provides details of the service update
+--
+-- 'nodesUpdated', 'serviceUpdate_nodesUpdated' - A list of nodes updated by the service update
+--
+-- 'releaseDate', 'serviceUpdate_releaseDate' - The date when the service update is initially available
+--
+-- 'serviceUpdateName', 'serviceUpdate_serviceUpdateName' - The unique ID of the service update
+--
+-- 'status', 'serviceUpdate_status' - The status of the service update
+--
+-- 'type'', 'serviceUpdate_type' - Reflects the nature of the service update
+newServiceUpdate ::
+  ServiceUpdate
+newServiceUpdate =
+  ServiceUpdate'
+    { autoUpdateStartDate =
+        Prelude.Nothing,
+      clusterName = Prelude.Nothing,
+      description = Prelude.Nothing,
+      nodesUpdated = Prelude.Nothing,
+      releaseDate = Prelude.Nothing,
+      serviceUpdateName = Prelude.Nothing,
+      status = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The date at which the service update will be automatically applied
+serviceUpdate_autoUpdateStartDate :: Lens.Lens' ServiceUpdate (Prelude.Maybe Prelude.UTCTime)
+serviceUpdate_autoUpdateStartDate = Lens.lens (\ServiceUpdate' {autoUpdateStartDate} -> autoUpdateStartDate) (\s@ServiceUpdate' {} a -> s {autoUpdateStartDate = a} :: ServiceUpdate) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the cluster to which the service update applies
+serviceUpdate_clusterName :: Lens.Lens' ServiceUpdate (Prelude.Maybe Prelude.Text)
+serviceUpdate_clusterName = Lens.lens (\ServiceUpdate' {clusterName} -> clusterName) (\s@ServiceUpdate' {} a -> s {clusterName = a} :: ServiceUpdate)
+
+-- | Provides details of the service update
+serviceUpdate_description :: Lens.Lens' ServiceUpdate (Prelude.Maybe Prelude.Text)
+serviceUpdate_description = Lens.lens (\ServiceUpdate' {description} -> description) (\s@ServiceUpdate' {} a -> s {description = a} :: ServiceUpdate)
+
+-- | A list of nodes updated by the service update
+serviceUpdate_nodesUpdated :: Lens.Lens' ServiceUpdate (Prelude.Maybe Prelude.Text)
+serviceUpdate_nodesUpdated = Lens.lens (\ServiceUpdate' {nodesUpdated} -> nodesUpdated) (\s@ServiceUpdate' {} a -> s {nodesUpdated = a} :: ServiceUpdate)
+
+-- | The date when the service update is initially available
+serviceUpdate_releaseDate :: Lens.Lens' ServiceUpdate (Prelude.Maybe Prelude.UTCTime)
+serviceUpdate_releaseDate = Lens.lens (\ServiceUpdate' {releaseDate} -> releaseDate) (\s@ServiceUpdate' {} a -> s {releaseDate = a} :: ServiceUpdate) Prelude.. Lens.mapping Data._Time
+
+-- | The unique ID of the service update
+serviceUpdate_serviceUpdateName :: Lens.Lens' ServiceUpdate (Prelude.Maybe Prelude.Text)
+serviceUpdate_serviceUpdateName = Lens.lens (\ServiceUpdate' {serviceUpdateName} -> serviceUpdateName) (\s@ServiceUpdate' {} a -> s {serviceUpdateName = a} :: ServiceUpdate)
+
+-- | The status of the service update
+serviceUpdate_status :: Lens.Lens' ServiceUpdate (Prelude.Maybe ServiceUpdateStatus)
+serviceUpdate_status = Lens.lens (\ServiceUpdate' {status} -> status) (\s@ServiceUpdate' {} a -> s {status = a} :: ServiceUpdate)
+
+-- | Reflects the nature of the service update
+serviceUpdate_type :: Lens.Lens' ServiceUpdate (Prelude.Maybe ServiceUpdateType)
+serviceUpdate_type = Lens.lens (\ServiceUpdate' {type'} -> type') (\s@ServiceUpdate' {} a -> s {type' = a} :: ServiceUpdate)
+
+instance Data.FromJSON ServiceUpdate where
+  parseJSON =
+    Data.withObject
+      "ServiceUpdate"
+      ( \x ->
+          ServiceUpdate'
+            Prelude.<$> (x Data..:? "AutoUpdateStartDate")
+            Prelude.<*> (x Data..:? "ClusterName")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "NodesUpdated")
+            Prelude.<*> (x Data..:? "ReleaseDate")
+            Prelude.<*> (x Data..:? "ServiceUpdateName")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "Type")
+      )
+
+instance Prelude.Hashable ServiceUpdate where
+  hashWithSalt _salt ServiceUpdate' {..} =
+    _salt
+      `Prelude.hashWithSalt` autoUpdateStartDate
+      `Prelude.hashWithSalt` clusterName
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` nodesUpdated
+      `Prelude.hashWithSalt` releaseDate
+      `Prelude.hashWithSalt` serviceUpdateName
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData ServiceUpdate where
+  rnf ServiceUpdate' {..} =
+    Prelude.rnf autoUpdateStartDate
+      `Prelude.seq` Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf nodesUpdated
+      `Prelude.seq` Prelude.rnf releaseDate
+      `Prelude.seq` Prelude.rnf serviceUpdateName
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/MemoryDb/Types/ServiceUpdateRequest.hs b/gen/Amazonka/MemoryDb/Types/ServiceUpdateRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ServiceUpdateRequest.hs
@@ -0,0 +1,73 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ServiceUpdateRequest
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ServiceUpdateRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A request to apply a service update
+--
+-- /See:/ 'newServiceUpdateRequest' smart constructor.
+data ServiceUpdateRequest = ServiceUpdateRequest'
+  { -- | The unique ID of the service update
+    serviceUpdateNameToApply :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ServiceUpdateRequest' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'serviceUpdateNameToApply', 'serviceUpdateRequest_serviceUpdateNameToApply' - The unique ID of the service update
+newServiceUpdateRequest ::
+  ServiceUpdateRequest
+newServiceUpdateRequest =
+  ServiceUpdateRequest'
+    { serviceUpdateNameToApply =
+        Prelude.Nothing
+    }
+
+-- | The unique ID of the service update
+serviceUpdateRequest_serviceUpdateNameToApply :: Lens.Lens' ServiceUpdateRequest (Prelude.Maybe Prelude.Text)
+serviceUpdateRequest_serviceUpdateNameToApply = Lens.lens (\ServiceUpdateRequest' {serviceUpdateNameToApply} -> serviceUpdateNameToApply) (\s@ServiceUpdateRequest' {} a -> s {serviceUpdateNameToApply = a} :: ServiceUpdateRequest)
+
+instance Prelude.Hashable ServiceUpdateRequest where
+  hashWithSalt _salt ServiceUpdateRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` serviceUpdateNameToApply
+
+instance Prelude.NFData ServiceUpdateRequest where
+  rnf ServiceUpdateRequest' {..} =
+    Prelude.rnf serviceUpdateNameToApply
+
+instance Data.ToJSON ServiceUpdateRequest where
+  toJSON ServiceUpdateRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ServiceUpdateNameToApply" Data..=)
+              Prelude.<$> serviceUpdateNameToApply
+          ]
+      )
diff --git a/gen/Amazonka/MemoryDb/Types/ServiceUpdateStatus.hs b/gen/Amazonka/MemoryDb/Types/ServiceUpdateStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ServiceUpdateStatus.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ServiceUpdateStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ServiceUpdateStatus
+  ( ServiceUpdateStatus
+      ( ..,
+        ServiceUpdateStatus_Available,
+        ServiceUpdateStatus_Complete,
+        ServiceUpdateStatus_In_progress,
+        ServiceUpdateStatus_Scheduled
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ServiceUpdateStatus = ServiceUpdateStatus'
+  { fromServiceUpdateStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ServiceUpdateStatus_Available :: ServiceUpdateStatus
+pattern ServiceUpdateStatus_Available = ServiceUpdateStatus' "available"
+
+pattern ServiceUpdateStatus_Complete :: ServiceUpdateStatus
+pattern ServiceUpdateStatus_Complete = ServiceUpdateStatus' "complete"
+
+pattern ServiceUpdateStatus_In_progress :: ServiceUpdateStatus
+pattern ServiceUpdateStatus_In_progress = ServiceUpdateStatus' "in-progress"
+
+pattern ServiceUpdateStatus_Scheduled :: ServiceUpdateStatus
+pattern ServiceUpdateStatus_Scheduled = ServiceUpdateStatus' "scheduled"
+
+{-# COMPLETE
+  ServiceUpdateStatus_Available,
+  ServiceUpdateStatus_Complete,
+  ServiceUpdateStatus_In_progress,
+  ServiceUpdateStatus_Scheduled,
+  ServiceUpdateStatus'
+  #-}
diff --git a/gen/Amazonka/MemoryDb/Types/ServiceUpdateType.hs b/gen/Amazonka/MemoryDb/Types/ServiceUpdateType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ServiceUpdateType.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ServiceUpdateType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ServiceUpdateType
+  ( ServiceUpdateType
+      ( ..,
+        ServiceUpdateType_Security_update
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ServiceUpdateType = ServiceUpdateType'
+  { fromServiceUpdateType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ServiceUpdateType_Security_update :: ServiceUpdateType
+pattern ServiceUpdateType_Security_update = ServiceUpdateType' "security-update"
+
+{-# COMPLETE
+  ServiceUpdateType_Security_update,
+  ServiceUpdateType'
+  #-}
diff --git a/gen/Amazonka/MemoryDb/Types/Shard.hs b/gen/Amazonka/MemoryDb/Types/Shard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Shard.hs
@@ -0,0 +1,126 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Shard
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Shard where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.Node
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents a collection of nodes in a cluster. One node in the node
+-- group is the read\/write primary node. All the other nodes are read-only
+-- Replica nodes.
+--
+-- /See:/ 'newShard' smart constructor.
+data Shard = Shard'
+  { -- | The name of the shard
+    name :: Prelude.Maybe Prelude.Text,
+    -- | A list containing information about individual nodes within the shard
+    nodes :: Prelude.Maybe [Node],
+    -- | The number of nodes in the shard
+    numberOfNodes :: Prelude.Maybe Prelude.Int,
+    -- | The keyspace for this shard.
+    slots :: Prelude.Maybe Prelude.Text,
+    -- | The current state of this replication group - creating, available,
+    -- modifying, deleting.
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Shard' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'shard_name' - The name of the shard
+--
+-- 'nodes', 'shard_nodes' - A list containing information about individual nodes within the shard
+--
+-- 'numberOfNodes', 'shard_numberOfNodes' - The number of nodes in the shard
+--
+-- 'slots', 'shard_slots' - The keyspace for this shard.
+--
+-- 'status', 'shard_status' - The current state of this replication group - creating, available,
+-- modifying, deleting.
+newShard ::
+  Shard
+newShard =
+  Shard'
+    { name = Prelude.Nothing,
+      nodes = Prelude.Nothing,
+      numberOfNodes = Prelude.Nothing,
+      slots = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The name of the shard
+shard_name :: Lens.Lens' Shard (Prelude.Maybe Prelude.Text)
+shard_name = Lens.lens (\Shard' {name} -> name) (\s@Shard' {} a -> s {name = a} :: Shard)
+
+-- | A list containing information about individual nodes within the shard
+shard_nodes :: Lens.Lens' Shard (Prelude.Maybe [Node])
+shard_nodes = Lens.lens (\Shard' {nodes} -> nodes) (\s@Shard' {} a -> s {nodes = a} :: Shard) Prelude.. Lens.mapping Lens.coerced
+
+-- | The number of nodes in the shard
+shard_numberOfNodes :: Lens.Lens' Shard (Prelude.Maybe Prelude.Int)
+shard_numberOfNodes = Lens.lens (\Shard' {numberOfNodes} -> numberOfNodes) (\s@Shard' {} a -> s {numberOfNodes = a} :: Shard)
+
+-- | The keyspace for this shard.
+shard_slots :: Lens.Lens' Shard (Prelude.Maybe Prelude.Text)
+shard_slots = Lens.lens (\Shard' {slots} -> slots) (\s@Shard' {} a -> s {slots = a} :: Shard)
+
+-- | The current state of this replication group - creating, available,
+-- modifying, deleting.
+shard_status :: Lens.Lens' Shard (Prelude.Maybe Prelude.Text)
+shard_status = Lens.lens (\Shard' {status} -> status) (\s@Shard' {} a -> s {status = a} :: Shard)
+
+instance Data.FromJSON Shard where
+  parseJSON =
+    Data.withObject
+      "Shard"
+      ( \x ->
+          Shard'
+            Prelude.<$> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Nodes" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "NumberOfNodes")
+            Prelude.<*> (x Data..:? "Slots")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable Shard where
+  hashWithSalt _salt Shard' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` nodes
+      `Prelude.hashWithSalt` numberOfNodes
+      `Prelude.hashWithSalt` slots
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Shard where
+  rnf Shard' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf nodes
+      `Prelude.seq` Prelude.rnf numberOfNodes
+      `Prelude.seq` Prelude.rnf slots
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/MemoryDb/Types/ShardConfiguration.hs b/gen/Amazonka/MemoryDb/Types/ShardConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ShardConfiguration.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ShardConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ShardConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Shard configuration options. Each shard configuration has the following:
+-- Slots and ReplicaCount.
+--
+-- /See:/ 'newShardConfiguration' smart constructor.
+data ShardConfiguration = ShardConfiguration'
+  { -- | The number of read replica nodes in this shard.
+    replicaCount :: Prelude.Maybe Prelude.Int,
+    -- | A string that specifies the keyspace for a particular node group.
+    -- Keyspaces range from 0 to 16,383. The string is in the format
+    -- startkey-endkey.
+    slots :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ShardConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'replicaCount', 'shardConfiguration_replicaCount' - The number of read replica nodes in this shard.
+--
+-- 'slots', 'shardConfiguration_slots' - A string that specifies the keyspace for a particular node group.
+-- Keyspaces range from 0 to 16,383. The string is in the format
+-- startkey-endkey.
+newShardConfiguration ::
+  ShardConfiguration
+newShardConfiguration =
+  ShardConfiguration'
+    { replicaCount = Prelude.Nothing,
+      slots = Prelude.Nothing
+    }
+
+-- | The number of read replica nodes in this shard.
+shardConfiguration_replicaCount :: Lens.Lens' ShardConfiguration (Prelude.Maybe Prelude.Int)
+shardConfiguration_replicaCount = Lens.lens (\ShardConfiguration' {replicaCount} -> replicaCount) (\s@ShardConfiguration' {} a -> s {replicaCount = a} :: ShardConfiguration)
+
+-- | A string that specifies the keyspace for a particular node group.
+-- Keyspaces range from 0 to 16,383. The string is in the format
+-- startkey-endkey.
+shardConfiguration_slots :: Lens.Lens' ShardConfiguration (Prelude.Maybe Prelude.Text)
+shardConfiguration_slots = Lens.lens (\ShardConfiguration' {slots} -> slots) (\s@ShardConfiguration' {} a -> s {slots = a} :: ShardConfiguration)
+
+instance Data.FromJSON ShardConfiguration where
+  parseJSON =
+    Data.withObject
+      "ShardConfiguration"
+      ( \x ->
+          ShardConfiguration'
+            Prelude.<$> (x Data..:? "ReplicaCount")
+            Prelude.<*> (x Data..:? "Slots")
+      )
+
+instance Prelude.Hashable ShardConfiguration where
+  hashWithSalt _salt ShardConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` replicaCount
+      `Prelude.hashWithSalt` slots
+
+instance Prelude.NFData ShardConfiguration where
+  rnf ShardConfiguration' {..} =
+    Prelude.rnf replicaCount
+      `Prelude.seq` Prelude.rnf slots
diff --git a/gen/Amazonka/MemoryDb/Types/ShardConfigurationRequest.hs b/gen/Amazonka/MemoryDb/Types/ShardConfigurationRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ShardConfigurationRequest.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ShardConfigurationRequest
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ShardConfigurationRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A request to configure the sharding properties of a cluster
+--
+-- /See:/ 'newShardConfigurationRequest' smart constructor.
+data ShardConfigurationRequest = ShardConfigurationRequest'
+  { -- | The number of shards in the cluster
+    shardCount :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ShardConfigurationRequest' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'shardCount', 'shardConfigurationRequest_shardCount' - The number of shards in the cluster
+newShardConfigurationRequest ::
+  ShardConfigurationRequest
+newShardConfigurationRequest =
+  ShardConfigurationRequest'
+    { shardCount =
+        Prelude.Nothing
+    }
+
+-- | The number of shards in the cluster
+shardConfigurationRequest_shardCount :: Lens.Lens' ShardConfigurationRequest (Prelude.Maybe Prelude.Int)
+shardConfigurationRequest_shardCount = Lens.lens (\ShardConfigurationRequest' {shardCount} -> shardCount) (\s@ShardConfigurationRequest' {} a -> s {shardCount = a} :: ShardConfigurationRequest)
+
+instance Prelude.Hashable ShardConfigurationRequest where
+  hashWithSalt _salt ShardConfigurationRequest' {..} =
+    _salt `Prelude.hashWithSalt` shardCount
+
+instance Prelude.NFData ShardConfigurationRequest where
+  rnf ShardConfigurationRequest' {..} =
+    Prelude.rnf shardCount
+
+instance Data.ToJSON ShardConfigurationRequest where
+  toJSON ShardConfigurationRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("ShardCount" Data..=) Prelude.<$> shardCount]
+      )
diff --git a/gen/Amazonka/MemoryDb/Types/ShardDetail.hs b/gen/Amazonka/MemoryDb/Types/ShardDetail.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/ShardDetail.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.ShardDetail
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.ShardDetail where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.ShardConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides details of a shard in a snapshot
+--
+-- /See:/ 'newShardDetail' smart constructor.
+data ShardDetail = ShardDetail'
+  { -- | The configuration details of the shard
+    configuration :: Prelude.Maybe ShardConfiguration,
+    -- | The name of the shard
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The size of the shard\'s snapshot
+    size :: Prelude.Maybe Prelude.Text,
+    -- | The date and time that the shard\'s snapshot was created
+    snapshotCreationTime :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ShardDetail' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configuration', 'shardDetail_configuration' - The configuration details of the shard
+--
+-- 'name', 'shardDetail_name' - The name of the shard
+--
+-- 'size', 'shardDetail_size' - The size of the shard\'s snapshot
+--
+-- 'snapshotCreationTime', 'shardDetail_snapshotCreationTime' - The date and time that the shard\'s snapshot was created
+newShardDetail ::
+  ShardDetail
+newShardDetail =
+  ShardDetail'
+    { configuration = Prelude.Nothing,
+      name = Prelude.Nothing,
+      size = Prelude.Nothing,
+      snapshotCreationTime = Prelude.Nothing
+    }
+
+-- | The configuration details of the shard
+shardDetail_configuration :: Lens.Lens' ShardDetail (Prelude.Maybe ShardConfiguration)
+shardDetail_configuration = Lens.lens (\ShardDetail' {configuration} -> configuration) (\s@ShardDetail' {} a -> s {configuration = a} :: ShardDetail)
+
+-- | The name of the shard
+shardDetail_name :: Lens.Lens' ShardDetail (Prelude.Maybe Prelude.Text)
+shardDetail_name = Lens.lens (\ShardDetail' {name} -> name) (\s@ShardDetail' {} a -> s {name = a} :: ShardDetail)
+
+-- | The size of the shard\'s snapshot
+shardDetail_size :: Lens.Lens' ShardDetail (Prelude.Maybe Prelude.Text)
+shardDetail_size = Lens.lens (\ShardDetail' {size} -> size) (\s@ShardDetail' {} a -> s {size = a} :: ShardDetail)
+
+-- | The date and time that the shard\'s snapshot was created
+shardDetail_snapshotCreationTime :: Lens.Lens' ShardDetail (Prelude.Maybe Prelude.UTCTime)
+shardDetail_snapshotCreationTime = Lens.lens (\ShardDetail' {snapshotCreationTime} -> snapshotCreationTime) (\s@ShardDetail' {} a -> s {snapshotCreationTime = a} :: ShardDetail) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON ShardDetail where
+  parseJSON =
+    Data.withObject
+      "ShardDetail"
+      ( \x ->
+          ShardDetail'
+            Prelude.<$> (x Data..:? "Configuration")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Size")
+            Prelude.<*> (x Data..:? "SnapshotCreationTime")
+      )
+
+instance Prelude.Hashable ShardDetail where
+  hashWithSalt _salt ShardDetail' {..} =
+    _salt
+      `Prelude.hashWithSalt` configuration
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` size
+      `Prelude.hashWithSalt` snapshotCreationTime
+
+instance Prelude.NFData ShardDetail where
+  rnf ShardDetail' {..} =
+    Prelude.rnf configuration
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf size
+      `Prelude.seq` Prelude.rnf snapshotCreationTime
diff --git a/gen/Amazonka/MemoryDb/Types/SlotMigration.hs b/gen/Amazonka/MemoryDb/Types/SlotMigration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/SlotMigration.hs
@@ -0,0 +1,72 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.SlotMigration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.SlotMigration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents the progress of an online resharding operation.
+--
+-- /See:/ 'newSlotMigration' smart constructor.
+data SlotMigration = SlotMigration'
+  { -- | The percentage of the slot migration that is complete.
+    progressPercentage :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SlotMigration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'progressPercentage', 'slotMigration_progressPercentage' - The percentage of the slot migration that is complete.
+newSlotMigration ::
+  SlotMigration
+newSlotMigration =
+  SlotMigration'
+    { progressPercentage =
+        Prelude.Nothing
+    }
+
+-- | The percentage of the slot migration that is complete.
+slotMigration_progressPercentage :: Lens.Lens' SlotMigration (Prelude.Maybe Prelude.Double)
+slotMigration_progressPercentage = Lens.lens (\SlotMigration' {progressPercentage} -> progressPercentage) (\s@SlotMigration' {} a -> s {progressPercentage = a} :: SlotMigration)
+
+instance Data.FromJSON SlotMigration where
+  parseJSON =
+    Data.withObject
+      "SlotMigration"
+      ( \x ->
+          SlotMigration'
+            Prelude.<$> (x Data..:? "ProgressPercentage")
+      )
+
+instance Prelude.Hashable SlotMigration where
+  hashWithSalt _salt SlotMigration' {..} =
+    _salt `Prelude.hashWithSalt` progressPercentage
+
+instance Prelude.NFData SlotMigration where
+  rnf SlotMigration' {..} =
+    Prelude.rnf progressPercentage
diff --git a/gen/Amazonka/MemoryDb/Types/Snapshot.hs b/gen/Amazonka/MemoryDb/Types/Snapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Snapshot.hs
@@ -0,0 +1,162 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Snapshot
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Snapshot where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.ClusterConfiguration
+import Amazonka.MemoryDb.Types.DataTieringStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents a copy of an entire cluster as of the time when the snapshot
+-- was taken.
+--
+-- /See:/ 'newSnapshot' smart constructor.
+data Snapshot = Snapshot'
+  { -- | The ARN (Amazon Resource Name) of the snapshot.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The configuration of the cluster from which the snapshot was taken
+    clusterConfiguration :: Prelude.Maybe ClusterConfiguration,
+    -- | Enables data tiering. Data tiering is only supported for clusters using
+    -- the r6gd node type. This parameter must be set when using r6gd nodes.
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/memorydb/latest/devguide/data-tiering.html Data tiering>.
+    dataTiering :: Prelude.Maybe DataTieringStatus,
+    -- | The ID of the KMS key used to encrypt the snapshot.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the snapshot
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Indicates whether the snapshot is from an automatic backup (automated)
+    -- or was created manually (manual).
+    source :: Prelude.Maybe Prelude.Text,
+    -- | The status of the snapshot. Valid values: creating | available |
+    -- restoring | copying | deleting.
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Snapshot' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'snapshot_arn' - The ARN (Amazon Resource Name) of the snapshot.
+--
+-- 'clusterConfiguration', 'snapshot_clusterConfiguration' - The configuration of the cluster from which the snapshot was taken
+--
+-- 'dataTiering', 'snapshot_dataTiering' - Enables data tiering. Data tiering is only supported for clusters using
+-- the r6gd node type. This parameter must be set when using r6gd nodes.
+-- For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/data-tiering.html Data tiering>.
+--
+-- 'kmsKeyId', 'snapshot_kmsKeyId' - The ID of the KMS key used to encrypt the snapshot.
+--
+-- 'name', 'snapshot_name' - The name of the snapshot
+--
+-- 'source', 'snapshot_source' - Indicates whether the snapshot is from an automatic backup (automated)
+-- or was created manually (manual).
+--
+-- 'status', 'snapshot_status' - The status of the snapshot. Valid values: creating | available |
+-- restoring | copying | deleting.
+newSnapshot ::
+  Snapshot
+newSnapshot =
+  Snapshot'
+    { arn = Prelude.Nothing,
+      clusterConfiguration = Prelude.Nothing,
+      dataTiering = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      name = Prelude.Nothing,
+      source = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The ARN (Amazon Resource Name) of the snapshot.
+snapshot_arn :: Lens.Lens' Snapshot (Prelude.Maybe Prelude.Text)
+snapshot_arn = Lens.lens (\Snapshot' {arn} -> arn) (\s@Snapshot' {} a -> s {arn = a} :: Snapshot)
+
+-- | The configuration of the cluster from which the snapshot was taken
+snapshot_clusterConfiguration :: Lens.Lens' Snapshot (Prelude.Maybe ClusterConfiguration)
+snapshot_clusterConfiguration = Lens.lens (\Snapshot' {clusterConfiguration} -> clusterConfiguration) (\s@Snapshot' {} a -> s {clusterConfiguration = a} :: Snapshot)
+
+-- | Enables data tiering. Data tiering is only supported for clusters using
+-- the r6gd node type. This parameter must be set when using r6gd nodes.
+-- For more information, see
+-- <https://docs.aws.amazon.com/memorydb/latest/devguide/data-tiering.html Data tiering>.
+snapshot_dataTiering :: Lens.Lens' Snapshot (Prelude.Maybe DataTieringStatus)
+snapshot_dataTiering = Lens.lens (\Snapshot' {dataTiering} -> dataTiering) (\s@Snapshot' {} a -> s {dataTiering = a} :: Snapshot)
+
+-- | The ID of the KMS key used to encrypt the snapshot.
+snapshot_kmsKeyId :: Lens.Lens' Snapshot (Prelude.Maybe Prelude.Text)
+snapshot_kmsKeyId = Lens.lens (\Snapshot' {kmsKeyId} -> kmsKeyId) (\s@Snapshot' {} a -> s {kmsKeyId = a} :: Snapshot)
+
+-- | The name of the snapshot
+snapshot_name :: Lens.Lens' Snapshot (Prelude.Maybe Prelude.Text)
+snapshot_name = Lens.lens (\Snapshot' {name} -> name) (\s@Snapshot' {} a -> s {name = a} :: Snapshot)
+
+-- | Indicates whether the snapshot is from an automatic backup (automated)
+-- or was created manually (manual).
+snapshot_source :: Lens.Lens' Snapshot (Prelude.Maybe Prelude.Text)
+snapshot_source = Lens.lens (\Snapshot' {source} -> source) (\s@Snapshot' {} a -> s {source = a} :: Snapshot)
+
+-- | The status of the snapshot. Valid values: creating | available |
+-- restoring | copying | deleting.
+snapshot_status :: Lens.Lens' Snapshot (Prelude.Maybe Prelude.Text)
+snapshot_status = Lens.lens (\Snapshot' {status} -> status) (\s@Snapshot' {} a -> s {status = a} :: Snapshot)
+
+instance Data.FromJSON Snapshot where
+  parseJSON =
+    Data.withObject
+      "Snapshot"
+      ( \x ->
+          Snapshot'
+            Prelude.<$> (x Data..:? "ARN")
+            Prelude.<*> (x Data..:? "ClusterConfiguration")
+            Prelude.<*> (x Data..:? "DataTiering")
+            Prelude.<*> (x Data..:? "KmsKeyId")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Source")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable Snapshot where
+  hashWithSalt _salt Snapshot' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` clusterConfiguration
+      `Prelude.hashWithSalt` dataTiering
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` source
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Snapshot where
+  rnf Snapshot' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf clusterConfiguration
+      `Prelude.seq` Prelude.rnf dataTiering
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf source
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/MemoryDb/Types/SourceType.hs b/gen/Amazonka/MemoryDb/Types/SourceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/SourceType.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.SourceType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.SourceType
+  ( SourceType
+      ( ..,
+        SourceType_Acl,
+        SourceType_Cluster,
+        SourceType_Node,
+        SourceType_Parameter_group,
+        SourceType_Subnet_group,
+        SourceType_User
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SourceType = SourceType'
+  { fromSourceType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern SourceType_Acl :: SourceType
+pattern SourceType_Acl = SourceType' "acl"
+
+pattern SourceType_Cluster :: SourceType
+pattern SourceType_Cluster = SourceType' "cluster"
+
+pattern SourceType_Node :: SourceType
+pattern SourceType_Node = SourceType' "node"
+
+pattern SourceType_Parameter_group :: SourceType
+pattern SourceType_Parameter_group = SourceType' "parameter-group"
+
+pattern SourceType_Subnet_group :: SourceType
+pattern SourceType_Subnet_group = SourceType' "subnet-group"
+
+pattern SourceType_User :: SourceType
+pattern SourceType_User = SourceType' "user"
+
+{-# COMPLETE
+  SourceType_Acl,
+  SourceType_Cluster,
+  SourceType_Node,
+  SourceType_Parameter_group,
+  SourceType_Subnet_group,
+  SourceType_User,
+  SourceType'
+  #-}
diff --git a/gen/Amazonka/MemoryDb/Types/Subnet.hs b/gen/Amazonka/MemoryDb/Types/Subnet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Subnet.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Subnet
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Subnet where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.AvailabilityZone
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents the subnet associated with a cluster. This parameter refers
+-- to subnets defined in Amazon Virtual Private Cloud (Amazon VPC) and used
+-- with MemoryDB.
+--
+-- /See:/ 'newSubnet' smart constructor.
+data Subnet = Subnet'
+  { -- | The Availability Zone where the subnet resides
+    availabilityZone :: Prelude.Maybe AvailabilityZone,
+    -- | The unique identifier for the subnet.
+    identifier :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Subnet' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'availabilityZone', 'subnet_availabilityZone' - The Availability Zone where the subnet resides
+--
+-- 'identifier', 'subnet_identifier' - The unique identifier for the subnet.
+newSubnet ::
+  Subnet
+newSubnet =
+  Subnet'
+    { availabilityZone = Prelude.Nothing,
+      identifier = Prelude.Nothing
+    }
+
+-- | The Availability Zone where the subnet resides
+subnet_availabilityZone :: Lens.Lens' Subnet (Prelude.Maybe AvailabilityZone)
+subnet_availabilityZone = Lens.lens (\Subnet' {availabilityZone} -> availabilityZone) (\s@Subnet' {} a -> s {availabilityZone = a} :: Subnet)
+
+-- | The unique identifier for the subnet.
+subnet_identifier :: Lens.Lens' Subnet (Prelude.Maybe Prelude.Text)
+subnet_identifier = Lens.lens (\Subnet' {identifier} -> identifier) (\s@Subnet' {} a -> s {identifier = a} :: Subnet)
+
+instance Data.FromJSON Subnet where
+  parseJSON =
+    Data.withObject
+      "Subnet"
+      ( \x ->
+          Subnet'
+            Prelude.<$> (x Data..:? "AvailabilityZone")
+            Prelude.<*> (x Data..:? "Identifier")
+      )
+
+instance Prelude.Hashable Subnet where
+  hashWithSalt _salt Subnet' {..} =
+    _salt
+      `Prelude.hashWithSalt` availabilityZone
+      `Prelude.hashWithSalt` identifier
+
+instance Prelude.NFData Subnet where
+  rnf Subnet' {..} =
+    Prelude.rnf availabilityZone
+      `Prelude.seq` Prelude.rnf identifier
diff --git a/gen/Amazonka/MemoryDb/Types/SubnetGroup.hs b/gen/Amazonka/MemoryDb/Types/SubnetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/SubnetGroup.hs
@@ -0,0 +1,132 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.SubnetGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.SubnetGroup where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.Subnet
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents the output of one of the following operations:
+--
+-- -   CreateSubnetGroup
+--
+-- -   UpdateSubnetGroup
+--
+-- A subnet group is a collection of subnets (typically private) that you
+-- can designate for your clusters running in an Amazon Virtual Private
+-- Cloud (VPC) environment.
+--
+-- /See:/ 'newSubnetGroup' smart constructor.
+data SubnetGroup = SubnetGroup'
+  { -- | The ARN (Amazon Resource Name) of the subnet group.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | A description of the subnet group
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The name of the subnet group
+    name :: Prelude.Maybe Prelude.Text,
+    -- | A list of subnets associated with the subnet group.
+    subnets :: Prelude.Maybe [Subnet],
+    -- | The Amazon Virtual Private Cloud identifier (VPC ID) of the subnet
+    -- group.
+    vpcId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SubnetGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'subnetGroup_arn' - The ARN (Amazon Resource Name) of the subnet group.
+--
+-- 'description', 'subnetGroup_description' - A description of the subnet group
+--
+-- 'name', 'subnetGroup_name' - The name of the subnet group
+--
+-- 'subnets', 'subnetGroup_subnets' - A list of subnets associated with the subnet group.
+--
+-- 'vpcId', 'subnetGroup_vpcId' - The Amazon Virtual Private Cloud identifier (VPC ID) of the subnet
+-- group.
+newSubnetGroup ::
+  SubnetGroup
+newSubnetGroup =
+  SubnetGroup'
+    { arn = Prelude.Nothing,
+      description = Prelude.Nothing,
+      name = Prelude.Nothing,
+      subnets = Prelude.Nothing,
+      vpcId = Prelude.Nothing
+    }
+
+-- | The ARN (Amazon Resource Name) of the subnet group.
+subnetGroup_arn :: Lens.Lens' SubnetGroup (Prelude.Maybe Prelude.Text)
+subnetGroup_arn = Lens.lens (\SubnetGroup' {arn} -> arn) (\s@SubnetGroup' {} a -> s {arn = a} :: SubnetGroup)
+
+-- | A description of the subnet group
+subnetGroup_description :: Lens.Lens' SubnetGroup (Prelude.Maybe Prelude.Text)
+subnetGroup_description = Lens.lens (\SubnetGroup' {description} -> description) (\s@SubnetGroup' {} a -> s {description = a} :: SubnetGroup)
+
+-- | The name of the subnet group
+subnetGroup_name :: Lens.Lens' SubnetGroup (Prelude.Maybe Prelude.Text)
+subnetGroup_name = Lens.lens (\SubnetGroup' {name} -> name) (\s@SubnetGroup' {} a -> s {name = a} :: SubnetGroup)
+
+-- | A list of subnets associated with the subnet group.
+subnetGroup_subnets :: Lens.Lens' SubnetGroup (Prelude.Maybe [Subnet])
+subnetGroup_subnets = Lens.lens (\SubnetGroup' {subnets} -> subnets) (\s@SubnetGroup' {} a -> s {subnets = a} :: SubnetGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Virtual Private Cloud identifier (VPC ID) of the subnet
+-- group.
+subnetGroup_vpcId :: Lens.Lens' SubnetGroup (Prelude.Maybe Prelude.Text)
+subnetGroup_vpcId = Lens.lens (\SubnetGroup' {vpcId} -> vpcId) (\s@SubnetGroup' {} a -> s {vpcId = a} :: SubnetGroup)
+
+instance Data.FromJSON SubnetGroup where
+  parseJSON =
+    Data.withObject
+      "SubnetGroup"
+      ( \x ->
+          SubnetGroup'
+            Prelude.<$> (x Data..:? "ARN")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Subnets" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "VpcId")
+      )
+
+instance Prelude.Hashable SubnetGroup where
+  hashWithSalt _salt SubnetGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` subnets
+      `Prelude.hashWithSalt` vpcId
+
+instance Prelude.NFData SubnetGroup where
+  rnf SubnetGroup' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf subnets
+      `Prelude.seq` Prelude.rnf vpcId
diff --git a/gen/Amazonka/MemoryDb/Types/Tag.hs b/gen/Amazonka/MemoryDb/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/Tag.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.Tag
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.Tag where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A tag that can be added to an MemoryDB resource. Tags are composed of a
+-- Key\/Value pair. You can use tags to categorize and track all your
+-- MemoryDB resources. When you add or remove tags on clusters, those
+-- actions will be replicated to all nodes in the cluster. A tag with a
+-- null Value is permitted. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/tagging-resources.html Tagging your MemoryDB resources>
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | The key for the tag. May not be null.
+    key :: Prelude.Maybe Prelude.Text,
+    -- | The tag\'s value. May be null.
+    value :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Tag' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'key', 'tag_key' - The key for the tag. May not be null.
+--
+-- 'value', 'tag_value' - The tag\'s value. May be null.
+newTag ::
+  Tag
+newTag =
+  Tag'
+    { key = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | The key for the tag. May not be null.
+tag_key :: Lens.Lens' Tag (Prelude.Maybe Prelude.Text)
+tag_key = Lens.lens (\Tag' {key} -> key) (\s@Tag' {} a -> s {key = a} :: Tag)
+
+-- | The tag\'s value. May be null.
+tag_value :: Lens.Lens' Tag (Prelude.Maybe Prelude.Text)
+tag_value = Lens.lens (\Tag' {value} -> value) (\s@Tag' {} a -> s {value = a} :: Tag)
+
+instance Data.FromJSON Tag where
+  parseJSON =
+    Data.withObject
+      "Tag"
+      ( \x ->
+          Tag'
+            Prelude.<$> (x Data..:? "Key")
+            Prelude.<*> (x Data..:? "Value")
+      )
+
+instance Prelude.Hashable Tag where
+  hashWithSalt _salt Tag' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Tag where
+  rnf Tag' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Tag where
+  toJSON Tag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Key" Data..=) Prelude.<$> key,
+            ("Value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/MemoryDb/Types/UnprocessedCluster.hs b/gen/Amazonka/MemoryDb/Types/UnprocessedCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/UnprocessedCluster.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.UnprocessedCluster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.UnprocessedCluster where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A cluster whose updates have failed
+--
+-- /See:/ 'newUnprocessedCluster' smart constructor.
+data UnprocessedCluster = UnprocessedCluster'
+  { -- | The name of the cluster
+    clusterName :: Prelude.Maybe Prelude.Text,
+    -- | The error message associated with the update failure
+    errorMessage :: Prelude.Maybe Prelude.Text,
+    -- | The error type associated with the update failure
+    errorType :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UnprocessedCluster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterName', 'unprocessedCluster_clusterName' - The name of the cluster
+--
+-- 'errorMessage', 'unprocessedCluster_errorMessage' - The error message associated with the update failure
+--
+-- 'errorType', 'unprocessedCluster_errorType' - The error type associated with the update failure
+newUnprocessedCluster ::
+  UnprocessedCluster
+newUnprocessedCluster =
+  UnprocessedCluster'
+    { clusterName = Prelude.Nothing,
+      errorMessage = Prelude.Nothing,
+      errorType = Prelude.Nothing
+    }
+
+-- | The name of the cluster
+unprocessedCluster_clusterName :: Lens.Lens' UnprocessedCluster (Prelude.Maybe Prelude.Text)
+unprocessedCluster_clusterName = Lens.lens (\UnprocessedCluster' {clusterName} -> clusterName) (\s@UnprocessedCluster' {} a -> s {clusterName = a} :: UnprocessedCluster)
+
+-- | The error message associated with the update failure
+unprocessedCluster_errorMessage :: Lens.Lens' UnprocessedCluster (Prelude.Maybe Prelude.Text)
+unprocessedCluster_errorMessage = Lens.lens (\UnprocessedCluster' {errorMessage} -> errorMessage) (\s@UnprocessedCluster' {} a -> s {errorMessage = a} :: UnprocessedCluster)
+
+-- | The error type associated with the update failure
+unprocessedCluster_errorType :: Lens.Lens' UnprocessedCluster (Prelude.Maybe Prelude.Text)
+unprocessedCluster_errorType = Lens.lens (\UnprocessedCluster' {errorType} -> errorType) (\s@UnprocessedCluster' {} a -> s {errorType = a} :: UnprocessedCluster)
+
+instance Data.FromJSON UnprocessedCluster where
+  parseJSON =
+    Data.withObject
+      "UnprocessedCluster"
+      ( \x ->
+          UnprocessedCluster'
+            Prelude.<$> (x Data..:? "ClusterName")
+            Prelude.<*> (x Data..:? "ErrorMessage")
+            Prelude.<*> (x Data..:? "ErrorType")
+      )
+
+instance Prelude.Hashable UnprocessedCluster where
+  hashWithSalt _salt UnprocessedCluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterName
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` errorType
+
+instance Prelude.NFData UnprocessedCluster where
+  rnf UnprocessedCluster' {..} =
+    Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf errorType
diff --git a/gen/Amazonka/MemoryDb/Types/User.hs b/gen/Amazonka/MemoryDb/Types/User.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Types/User.hs
@@ -0,0 +1,151 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Types.User
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Types.User where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types.Authentication
+import qualified Amazonka.Prelude as Prelude
+
+-- | You create users and assign them specific permissions by using an access
+-- string. You assign the users to Access Control Lists aligned with a
+-- specific role (administrators, human resources) that are then deployed
+-- to one or more MemoryDB clusters.
+--
+-- /See:/ 'newUser' smart constructor.
+data User = User'
+  { -- | The names of the Access Control Lists to which the user belongs
+    aCLNames :: Prelude.Maybe [Prelude.Text],
+    -- | The Amazon Resource Name (ARN) of the user.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | Access permissions string used for this user.
+    accessString :: Prelude.Maybe Prelude.Text,
+    -- | Denotes whether the user requires a password to authenticate.
+    authentication :: Prelude.Maybe Authentication,
+    -- | The minimum engine version supported for the user
+    minimumEngineVersion :: Prelude.Maybe Prelude.Text,
+    -- | The name of the user
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Indicates the user status. Can be \"active\", \"modifying\" or
+    -- \"deleting\".
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'User' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aCLNames', 'user_aCLNames' - The names of the Access Control Lists to which the user belongs
+--
+-- 'arn', 'user_arn' - The Amazon Resource Name (ARN) of the user.
+--
+-- 'accessString', 'user_accessString' - Access permissions string used for this user.
+--
+-- 'authentication', 'user_authentication' - Denotes whether the user requires a password to authenticate.
+--
+-- 'minimumEngineVersion', 'user_minimumEngineVersion' - The minimum engine version supported for the user
+--
+-- 'name', 'user_name' - The name of the user
+--
+-- 'status', 'user_status' - Indicates the user status. Can be \"active\", \"modifying\" or
+-- \"deleting\".
+newUser ::
+  User
+newUser =
+  User'
+    { aCLNames = Prelude.Nothing,
+      arn = Prelude.Nothing,
+      accessString = Prelude.Nothing,
+      authentication = Prelude.Nothing,
+      minimumEngineVersion = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The names of the Access Control Lists to which the user belongs
+user_aCLNames :: Lens.Lens' User (Prelude.Maybe [Prelude.Text])
+user_aCLNames = Lens.lens (\User' {aCLNames} -> aCLNames) (\s@User' {} a -> s {aCLNames = a} :: User) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of the user.
+user_arn :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_arn = Lens.lens (\User' {arn} -> arn) (\s@User' {} a -> s {arn = a} :: User)
+
+-- | Access permissions string used for this user.
+user_accessString :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_accessString = Lens.lens (\User' {accessString} -> accessString) (\s@User' {} a -> s {accessString = a} :: User)
+
+-- | Denotes whether the user requires a password to authenticate.
+user_authentication :: Lens.Lens' User (Prelude.Maybe Authentication)
+user_authentication = Lens.lens (\User' {authentication} -> authentication) (\s@User' {} a -> s {authentication = a} :: User)
+
+-- | The minimum engine version supported for the user
+user_minimumEngineVersion :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_minimumEngineVersion = Lens.lens (\User' {minimumEngineVersion} -> minimumEngineVersion) (\s@User' {} a -> s {minimumEngineVersion = a} :: User)
+
+-- | The name of the user
+user_name :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_name = Lens.lens (\User' {name} -> name) (\s@User' {} a -> s {name = a} :: User)
+
+-- | Indicates the user status. Can be \"active\", \"modifying\" or
+-- \"deleting\".
+user_status :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_status = Lens.lens (\User' {status} -> status) (\s@User' {} a -> s {status = a} :: User)
+
+instance Data.FromJSON User where
+  parseJSON =
+    Data.withObject
+      "User"
+      ( \x ->
+          User'
+            Prelude.<$> (x Data..:? "ACLNames" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "ARN")
+            Prelude.<*> (x Data..:? "AccessString")
+            Prelude.<*> (x Data..:? "Authentication")
+            Prelude.<*> (x Data..:? "MinimumEngineVersion")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable User where
+  hashWithSalt _salt User' {..} =
+    _salt
+      `Prelude.hashWithSalt` aCLNames
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` accessString
+      `Prelude.hashWithSalt` authentication
+      `Prelude.hashWithSalt` minimumEngineVersion
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData User where
+  rnf User' {..} =
+    Prelude.rnf aCLNames
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf accessString
+      `Prelude.seq` Prelude.rnf authentication
+      `Prelude.seq` Prelude.rnf minimumEngineVersion
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/MemoryDb/UntagResource.hs b/gen/Amazonka/MemoryDb/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/UntagResource.hs
@@ -0,0 +1,188 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Use this operation to remove tags on a resource
+module Amazonka.MemoryDb.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_tagList,
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource to which the tags are to
+    -- be removed
+    resourceArn :: Prelude.Text,
+    -- | The list of keys of the tags that are to be removed
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource to which the tags are to
+-- be removed
+--
+-- 'tagKeys', 'untagResource_tagKeys' - The list of keys of the tags that are to be removed
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource to which the tags are to
+-- be removed
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | The list of keys of the tags that are to be removed
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (x Data..?> "TagList" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.UntagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UntagResource where
+  toJSON UntagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ResourceArn" Data..= resourceArn),
+            Prelude.Just ("TagKeys" Data..= tagKeys)
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UntagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The list of tags removed
+    tagList :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tagList', 'untagResourceResponse_tagList' - The list of tags removed
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse'
+    { tagList = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of tags removed
+untagResourceResponse_tagList :: Lens.Lens' UntagResourceResponse (Prelude.Maybe [Tag])
+untagResourceResponse_tagList = Lens.lens (\UntagResourceResponse' {tagList} -> tagList) (\s@UntagResourceResponse' {} a -> s {tagList = a} :: UntagResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf tagList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/UpdateACL.hs b/gen/Amazonka/MemoryDb/UpdateACL.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/UpdateACL.hs
@@ -0,0 +1,196 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.UpdateACL
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Changes the list of users that belong to the Access Control List.
+module Amazonka.MemoryDb.UpdateACL
+  ( -- * Creating a Request
+    UpdateACL (..),
+    newUpdateACL,
+
+    -- * Request Lenses
+    updateACL_userNamesToAdd,
+    updateACL_userNamesToRemove,
+    updateACL_aCLName,
+
+    -- * Destructuring the Response
+    UpdateACLResponse (..),
+    newUpdateACLResponse,
+
+    -- * Response Lenses
+    updateACLResponse_acl,
+    updateACLResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateACL' smart constructor.
+data UpdateACL = UpdateACL'
+  { -- | The list of users to add to the Access Control List
+    userNamesToAdd :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The list of users to remove from the Access Control List
+    userNamesToRemove :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The name of the Access Control List
+    aCLName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateACL' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'userNamesToAdd', 'updateACL_userNamesToAdd' - The list of users to add to the Access Control List
+--
+-- 'userNamesToRemove', 'updateACL_userNamesToRemove' - The list of users to remove from the Access Control List
+--
+-- 'aCLName', 'updateACL_aCLName' - The name of the Access Control List
+newUpdateACL ::
+  -- | 'aCLName'
+  Prelude.Text ->
+  UpdateACL
+newUpdateACL pACLName_ =
+  UpdateACL'
+    { userNamesToAdd = Prelude.Nothing,
+      userNamesToRemove = Prelude.Nothing,
+      aCLName = pACLName_
+    }
+
+-- | The list of users to add to the Access Control List
+updateACL_userNamesToAdd :: Lens.Lens' UpdateACL (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+updateACL_userNamesToAdd = Lens.lens (\UpdateACL' {userNamesToAdd} -> userNamesToAdd) (\s@UpdateACL' {} a -> s {userNamesToAdd = a} :: UpdateACL) Prelude.. Lens.mapping Lens.coerced
+
+-- | The list of users to remove from the Access Control List
+updateACL_userNamesToRemove :: Lens.Lens' UpdateACL (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+updateACL_userNamesToRemove = Lens.lens (\UpdateACL' {userNamesToRemove} -> userNamesToRemove) (\s@UpdateACL' {} a -> s {userNamesToRemove = a} :: UpdateACL) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the Access Control List
+updateACL_aCLName :: Lens.Lens' UpdateACL Prelude.Text
+updateACL_aCLName = Lens.lens (\UpdateACL' {aCLName} -> aCLName) (\s@UpdateACL' {} a -> s {aCLName = a} :: UpdateACL)
+
+instance Core.AWSRequest UpdateACL where
+  type AWSResponse UpdateACL = UpdateACLResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateACLResponse'
+            Prelude.<$> (x Data..?> "ACL")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateACL where
+  hashWithSalt _salt UpdateACL' {..} =
+    _salt
+      `Prelude.hashWithSalt` userNamesToAdd
+      `Prelude.hashWithSalt` userNamesToRemove
+      `Prelude.hashWithSalt` aCLName
+
+instance Prelude.NFData UpdateACL where
+  rnf UpdateACL' {..} =
+    Prelude.rnf userNamesToAdd
+      `Prelude.seq` Prelude.rnf userNamesToRemove
+      `Prelude.seq` Prelude.rnf aCLName
+
+instance Data.ToHeaders UpdateACL where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("AmazonMemoryDB.UpdateACL" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateACL where
+  toJSON UpdateACL' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("UserNamesToAdd" Data..=)
+              Prelude.<$> userNamesToAdd,
+            ("UserNamesToRemove" Data..=)
+              Prelude.<$> userNamesToRemove,
+            Prelude.Just ("ACLName" Data..= aCLName)
+          ]
+      )
+
+instance Data.ToPath UpdateACL where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateACL where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateACLResponse' smart constructor.
+data UpdateACLResponse = UpdateACLResponse'
+  { -- | The updated Access Control List
+    acl :: Prelude.Maybe ACL,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateACLResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'acl', 'updateACLResponse_acl' - The updated Access Control List
+--
+-- 'httpStatus', 'updateACLResponse_httpStatus' - The response's http status code.
+newUpdateACLResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateACLResponse
+newUpdateACLResponse pHttpStatus_ =
+  UpdateACLResponse'
+    { acl = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The updated Access Control List
+updateACLResponse_acl :: Lens.Lens' UpdateACLResponse (Prelude.Maybe ACL)
+updateACLResponse_acl = Lens.lens (\UpdateACLResponse' {acl} -> acl) (\s@UpdateACLResponse' {} a -> s {acl = a} :: UpdateACLResponse)
+
+-- | The response's http status code.
+updateACLResponse_httpStatus :: Lens.Lens' UpdateACLResponse Prelude.Int
+updateACLResponse_httpStatus = Lens.lens (\UpdateACLResponse' {httpStatus} -> httpStatus) (\s@UpdateACLResponse' {} a -> s {httpStatus = a} :: UpdateACLResponse)
+
+instance Prelude.NFData UpdateACLResponse where
+  rnf UpdateACLResponse' {..} =
+    Prelude.rnf acl
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/UpdateCluster.hs b/gen/Amazonka/MemoryDb/UpdateCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/UpdateCluster.hs
@@ -0,0 +1,441 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.UpdateCluster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies the settings for a cluster. You can use this operation to
+-- change one or more cluster configuration settings by specifying the
+-- settings and the new values.
+module Amazonka.MemoryDb.UpdateCluster
+  ( -- * Creating a Request
+    UpdateCluster (..),
+    newUpdateCluster,
+
+    -- * Request Lenses
+    updateCluster_aCLName,
+    updateCluster_description,
+    updateCluster_engineVersion,
+    updateCluster_maintenanceWindow,
+    updateCluster_nodeType,
+    updateCluster_parameterGroupName,
+    updateCluster_replicaConfiguration,
+    updateCluster_securityGroupIds,
+    updateCluster_shardConfiguration,
+    updateCluster_snapshotRetentionLimit,
+    updateCluster_snapshotWindow,
+    updateCluster_snsTopicArn,
+    updateCluster_snsTopicStatus,
+    updateCluster_clusterName,
+
+    -- * Destructuring the Response
+    UpdateClusterResponse (..),
+    newUpdateClusterResponse,
+
+    -- * Response Lenses
+    updateClusterResponse_cluster,
+    updateClusterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateCluster' smart constructor.
+data UpdateCluster = UpdateCluster'
+  { -- | The Access Control List that is associated with the cluster
+    aCLName :: Prelude.Maybe Prelude.Text,
+    -- | The description of the cluster to update
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The upgraded version of the engine to be run on the nodes. You can
+    -- upgrade to a newer engine version, but you cannot downgrade to an
+    -- earlier engine version. If you want to use an earlier engine version,
+    -- you must delete the existing cluster and create it anew with the earlier
+    -- engine version.
+    engineVersion :: Prelude.Maybe Prelude.Text,
+    -- | Specifies the weekly time range during which maintenance on the cluster
+    -- is performed. It is specified as a range in the format
+    -- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+    -- is a 60 minute period.
+    --
+    -- Valid values for @ddd@ are:
+    --
+    -- -   @sun@
+    --
+    -- -   @mon@
+    --
+    -- -   @tue@
+    --
+    -- -   @wed@
+    --
+    -- -   @thu@
+    --
+    -- -   @fri@
+    --
+    -- -   @sat@
+    --
+    -- Example: @sun:23:00-mon:01:30@
+    maintenanceWindow :: Prelude.Maybe Prelude.Text,
+    -- | A valid node type that you want to scale this cluster up or down to.
+    nodeType :: Prelude.Maybe Prelude.Text,
+    -- | The name of the parameter group to update
+    parameterGroupName :: Prelude.Maybe Prelude.Text,
+    -- | The number of replicas that will reside in each shard
+    replicaConfiguration :: Prelude.Maybe ReplicaConfigurationRequest,
+    -- | The SecurityGroupIds to update
+    securityGroupIds :: Prelude.Maybe [Prelude.Text],
+    -- | The number of shards in the cluster
+    shardConfiguration :: Prelude.Maybe ShardConfigurationRequest,
+    -- | The number of days for which MemoryDB retains automatic cluster
+    -- snapshots before deleting them. For example, if you set
+    -- SnapshotRetentionLimit to 5, a snapshot that was taken today is retained
+    -- for 5 days before being deleted.
+    snapshotRetentionLimit :: Prelude.Maybe Prelude.Int,
+    -- | The daily time range (in UTC) during which MemoryDB begins taking a
+    -- daily snapshot of your cluster.
+    snapshotWindow :: Prelude.Maybe Prelude.Text,
+    -- | The SNS topic ARN to update
+    snsTopicArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the Amazon SNS notification topic. Notifications are sent
+    -- only if the status is active.
+    snsTopicStatus :: Prelude.Maybe Prelude.Text,
+    -- | The name of the cluster to update
+    clusterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateCluster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aCLName', 'updateCluster_aCLName' - The Access Control List that is associated with the cluster
+--
+-- 'description', 'updateCluster_description' - The description of the cluster to update
+--
+-- 'engineVersion', 'updateCluster_engineVersion' - The upgraded version of the engine to be run on the nodes. You can
+-- upgrade to a newer engine version, but you cannot downgrade to an
+-- earlier engine version. If you want to use an earlier engine version,
+-- you must delete the existing cluster and create it anew with the earlier
+-- engine version.
+--
+-- 'maintenanceWindow', 'updateCluster_maintenanceWindow' - Specifies the weekly time range during which maintenance on the cluster
+-- is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period.
+--
+-- Valid values for @ddd@ are:
+--
+-- -   @sun@
+--
+-- -   @mon@
+--
+-- -   @tue@
+--
+-- -   @wed@
+--
+-- -   @thu@
+--
+-- -   @fri@
+--
+-- -   @sat@
+--
+-- Example: @sun:23:00-mon:01:30@
+--
+-- 'nodeType', 'updateCluster_nodeType' - A valid node type that you want to scale this cluster up or down to.
+--
+-- 'parameterGroupName', 'updateCluster_parameterGroupName' - The name of the parameter group to update
+--
+-- 'replicaConfiguration', 'updateCluster_replicaConfiguration' - The number of replicas that will reside in each shard
+--
+-- 'securityGroupIds', 'updateCluster_securityGroupIds' - The SecurityGroupIds to update
+--
+-- 'shardConfiguration', 'updateCluster_shardConfiguration' - The number of shards in the cluster
+--
+-- 'snapshotRetentionLimit', 'updateCluster_snapshotRetentionLimit' - The number of days for which MemoryDB retains automatic cluster
+-- snapshots before deleting them. For example, if you set
+-- SnapshotRetentionLimit to 5, a snapshot that was taken today is retained
+-- for 5 days before being deleted.
+--
+-- 'snapshotWindow', 'updateCluster_snapshotWindow' - The daily time range (in UTC) during which MemoryDB begins taking a
+-- daily snapshot of your cluster.
+--
+-- 'snsTopicArn', 'updateCluster_snsTopicArn' - The SNS topic ARN to update
+--
+-- 'snsTopicStatus', 'updateCluster_snsTopicStatus' - The status of the Amazon SNS notification topic. Notifications are sent
+-- only if the status is active.
+--
+-- 'clusterName', 'updateCluster_clusterName' - The name of the cluster to update
+newUpdateCluster ::
+  -- | 'clusterName'
+  Prelude.Text ->
+  UpdateCluster
+newUpdateCluster pClusterName_ =
+  UpdateCluster'
+    { aCLName = Prelude.Nothing,
+      description = Prelude.Nothing,
+      engineVersion = Prelude.Nothing,
+      maintenanceWindow = Prelude.Nothing,
+      nodeType = Prelude.Nothing,
+      parameterGroupName = Prelude.Nothing,
+      replicaConfiguration = Prelude.Nothing,
+      securityGroupIds = Prelude.Nothing,
+      shardConfiguration = Prelude.Nothing,
+      snapshotRetentionLimit = Prelude.Nothing,
+      snapshotWindow = Prelude.Nothing,
+      snsTopicArn = Prelude.Nothing,
+      snsTopicStatus = Prelude.Nothing,
+      clusterName = pClusterName_
+    }
+
+-- | The Access Control List that is associated with the cluster
+updateCluster_aCLName :: Lens.Lens' UpdateCluster (Prelude.Maybe Prelude.Text)
+updateCluster_aCLName = Lens.lens (\UpdateCluster' {aCLName} -> aCLName) (\s@UpdateCluster' {} a -> s {aCLName = a} :: UpdateCluster)
+
+-- | The description of the cluster to update
+updateCluster_description :: Lens.Lens' UpdateCluster (Prelude.Maybe Prelude.Text)
+updateCluster_description = Lens.lens (\UpdateCluster' {description} -> description) (\s@UpdateCluster' {} a -> s {description = a} :: UpdateCluster)
+
+-- | The upgraded version of the engine to be run on the nodes. You can
+-- upgrade to a newer engine version, but you cannot downgrade to an
+-- earlier engine version. If you want to use an earlier engine version,
+-- you must delete the existing cluster and create it anew with the earlier
+-- engine version.
+updateCluster_engineVersion :: Lens.Lens' UpdateCluster (Prelude.Maybe Prelude.Text)
+updateCluster_engineVersion = Lens.lens (\UpdateCluster' {engineVersion} -> engineVersion) (\s@UpdateCluster' {} a -> s {engineVersion = a} :: UpdateCluster)
+
+-- | Specifies the weekly time range during which maintenance on the cluster
+-- is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period.
+--
+-- Valid values for @ddd@ are:
+--
+-- -   @sun@
+--
+-- -   @mon@
+--
+-- -   @tue@
+--
+-- -   @wed@
+--
+-- -   @thu@
+--
+-- -   @fri@
+--
+-- -   @sat@
+--
+-- Example: @sun:23:00-mon:01:30@
+updateCluster_maintenanceWindow :: Lens.Lens' UpdateCluster (Prelude.Maybe Prelude.Text)
+updateCluster_maintenanceWindow = Lens.lens (\UpdateCluster' {maintenanceWindow} -> maintenanceWindow) (\s@UpdateCluster' {} a -> s {maintenanceWindow = a} :: UpdateCluster)
+
+-- | A valid node type that you want to scale this cluster up or down to.
+updateCluster_nodeType :: Lens.Lens' UpdateCluster (Prelude.Maybe Prelude.Text)
+updateCluster_nodeType = Lens.lens (\UpdateCluster' {nodeType} -> nodeType) (\s@UpdateCluster' {} a -> s {nodeType = a} :: UpdateCluster)
+
+-- | The name of the parameter group to update
+updateCluster_parameterGroupName :: Lens.Lens' UpdateCluster (Prelude.Maybe Prelude.Text)
+updateCluster_parameterGroupName = Lens.lens (\UpdateCluster' {parameterGroupName} -> parameterGroupName) (\s@UpdateCluster' {} a -> s {parameterGroupName = a} :: UpdateCluster)
+
+-- | The number of replicas that will reside in each shard
+updateCluster_replicaConfiguration :: Lens.Lens' UpdateCluster (Prelude.Maybe ReplicaConfigurationRequest)
+updateCluster_replicaConfiguration = Lens.lens (\UpdateCluster' {replicaConfiguration} -> replicaConfiguration) (\s@UpdateCluster' {} a -> s {replicaConfiguration = a} :: UpdateCluster)
+
+-- | The SecurityGroupIds to update
+updateCluster_securityGroupIds :: Lens.Lens' UpdateCluster (Prelude.Maybe [Prelude.Text])
+updateCluster_securityGroupIds = Lens.lens (\UpdateCluster' {securityGroupIds} -> securityGroupIds) (\s@UpdateCluster' {} a -> s {securityGroupIds = a} :: UpdateCluster) Prelude.. Lens.mapping Lens.coerced
+
+-- | The number of shards in the cluster
+updateCluster_shardConfiguration :: Lens.Lens' UpdateCluster (Prelude.Maybe ShardConfigurationRequest)
+updateCluster_shardConfiguration = Lens.lens (\UpdateCluster' {shardConfiguration} -> shardConfiguration) (\s@UpdateCluster' {} a -> s {shardConfiguration = a} :: UpdateCluster)
+
+-- | The number of days for which MemoryDB retains automatic cluster
+-- snapshots before deleting them. For example, if you set
+-- SnapshotRetentionLimit to 5, a snapshot that was taken today is retained
+-- for 5 days before being deleted.
+updateCluster_snapshotRetentionLimit :: Lens.Lens' UpdateCluster (Prelude.Maybe Prelude.Int)
+updateCluster_snapshotRetentionLimit = Lens.lens (\UpdateCluster' {snapshotRetentionLimit} -> snapshotRetentionLimit) (\s@UpdateCluster' {} a -> s {snapshotRetentionLimit = a} :: UpdateCluster)
+
+-- | The daily time range (in UTC) during which MemoryDB begins taking a
+-- daily snapshot of your cluster.
+updateCluster_snapshotWindow :: Lens.Lens' UpdateCluster (Prelude.Maybe Prelude.Text)
+updateCluster_snapshotWindow = Lens.lens (\UpdateCluster' {snapshotWindow} -> snapshotWindow) (\s@UpdateCluster' {} a -> s {snapshotWindow = a} :: UpdateCluster)
+
+-- | The SNS topic ARN to update
+updateCluster_snsTopicArn :: Lens.Lens' UpdateCluster (Prelude.Maybe Prelude.Text)
+updateCluster_snsTopicArn = Lens.lens (\UpdateCluster' {snsTopicArn} -> snsTopicArn) (\s@UpdateCluster' {} a -> s {snsTopicArn = a} :: UpdateCluster)
+
+-- | The status of the Amazon SNS notification topic. Notifications are sent
+-- only if the status is active.
+updateCluster_snsTopicStatus :: Lens.Lens' UpdateCluster (Prelude.Maybe Prelude.Text)
+updateCluster_snsTopicStatus = Lens.lens (\UpdateCluster' {snsTopicStatus} -> snsTopicStatus) (\s@UpdateCluster' {} a -> s {snsTopicStatus = a} :: UpdateCluster)
+
+-- | The name of the cluster to update
+updateCluster_clusterName :: Lens.Lens' UpdateCluster Prelude.Text
+updateCluster_clusterName = Lens.lens (\UpdateCluster' {clusterName} -> clusterName) (\s@UpdateCluster' {} a -> s {clusterName = a} :: UpdateCluster)
+
+instance Core.AWSRequest UpdateCluster where
+  type
+    AWSResponse UpdateCluster =
+      UpdateClusterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateClusterResponse'
+            Prelude.<$> (x Data..?> "Cluster")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateCluster where
+  hashWithSalt _salt UpdateCluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` aCLName
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` engineVersion
+      `Prelude.hashWithSalt` maintenanceWindow
+      `Prelude.hashWithSalt` nodeType
+      `Prelude.hashWithSalt` parameterGroupName
+      `Prelude.hashWithSalt` replicaConfiguration
+      `Prelude.hashWithSalt` securityGroupIds
+      `Prelude.hashWithSalt` shardConfiguration
+      `Prelude.hashWithSalt` snapshotRetentionLimit
+      `Prelude.hashWithSalt` snapshotWindow
+      `Prelude.hashWithSalt` snsTopicArn
+      `Prelude.hashWithSalt` snsTopicStatus
+      `Prelude.hashWithSalt` clusterName
+
+instance Prelude.NFData UpdateCluster where
+  rnf UpdateCluster' {..} =
+    Prelude.rnf aCLName
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf engineVersion
+      `Prelude.seq` Prelude.rnf maintenanceWindow
+      `Prelude.seq` Prelude.rnf nodeType
+      `Prelude.seq` Prelude.rnf parameterGroupName
+      `Prelude.seq` Prelude.rnf replicaConfiguration
+      `Prelude.seq` Prelude.rnf securityGroupIds
+      `Prelude.seq` Prelude.rnf shardConfiguration
+      `Prelude.seq` Prelude.rnf snapshotRetentionLimit
+      `Prelude.seq` Prelude.rnf snapshotWindow
+      `Prelude.seq` Prelude.rnf snsTopicArn
+      `Prelude.seq` Prelude.rnf snsTopicStatus
+      `Prelude.seq` Prelude.rnf clusterName
+
+instance Data.ToHeaders UpdateCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.UpdateCluster" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateCluster where
+  toJSON UpdateCluster' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ACLName" Data..=) Prelude.<$> aCLName,
+            ("Description" Data..=) Prelude.<$> description,
+            ("EngineVersion" Data..=) Prelude.<$> engineVersion,
+            ("MaintenanceWindow" Data..=)
+              Prelude.<$> maintenanceWindow,
+            ("NodeType" Data..=) Prelude.<$> nodeType,
+            ("ParameterGroupName" Data..=)
+              Prelude.<$> parameterGroupName,
+            ("ReplicaConfiguration" Data..=)
+              Prelude.<$> replicaConfiguration,
+            ("SecurityGroupIds" Data..=)
+              Prelude.<$> securityGroupIds,
+            ("ShardConfiguration" Data..=)
+              Prelude.<$> shardConfiguration,
+            ("SnapshotRetentionLimit" Data..=)
+              Prelude.<$> snapshotRetentionLimit,
+            ("SnapshotWindow" Data..=)
+              Prelude.<$> snapshotWindow,
+            ("SnsTopicArn" Data..=) Prelude.<$> snsTopicArn,
+            ("SnsTopicStatus" Data..=)
+              Prelude.<$> snsTopicStatus,
+            Prelude.Just ("ClusterName" Data..= clusterName)
+          ]
+      )
+
+instance Data.ToPath UpdateCluster where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateClusterResponse' smart constructor.
+data UpdateClusterResponse = UpdateClusterResponse'
+  { -- | The updated cluster
+    cluster :: Prelude.Maybe Cluster,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateClusterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cluster', 'updateClusterResponse_cluster' - The updated cluster
+--
+-- 'httpStatus', 'updateClusterResponse_httpStatus' - The response's http status code.
+newUpdateClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateClusterResponse
+newUpdateClusterResponse pHttpStatus_ =
+  UpdateClusterResponse'
+    { cluster = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The updated cluster
+updateClusterResponse_cluster :: Lens.Lens' UpdateClusterResponse (Prelude.Maybe Cluster)
+updateClusterResponse_cluster = Lens.lens (\UpdateClusterResponse' {cluster} -> cluster) (\s@UpdateClusterResponse' {} a -> s {cluster = a} :: UpdateClusterResponse)
+
+-- | The response's http status code.
+updateClusterResponse_httpStatus :: Lens.Lens' UpdateClusterResponse Prelude.Int
+updateClusterResponse_httpStatus = Lens.lens (\UpdateClusterResponse' {httpStatus} -> httpStatus) (\s@UpdateClusterResponse' {} a -> s {httpStatus = a} :: UpdateClusterResponse)
+
+instance Prelude.NFData UpdateClusterResponse where
+  rnf UpdateClusterResponse' {..} =
+    Prelude.rnf cluster
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/UpdateParameterGroup.hs b/gen/Amazonka/MemoryDb/UpdateParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/UpdateParameterGroup.hs
@@ -0,0 +1,197 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.UpdateParameterGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the parameters of a parameter group. You can modify up to 20
+-- parameters in a single request by submitting a list parameter name and
+-- value pairs.
+module Amazonka.MemoryDb.UpdateParameterGroup
+  ( -- * Creating a Request
+    UpdateParameterGroup (..),
+    newUpdateParameterGroup,
+
+    -- * Request Lenses
+    updateParameterGroup_parameterGroupName,
+    updateParameterGroup_parameterNameValues,
+
+    -- * Destructuring the Response
+    UpdateParameterGroupResponse (..),
+    newUpdateParameterGroupResponse,
+
+    -- * Response Lenses
+    updateParameterGroupResponse_parameterGroup,
+    updateParameterGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateParameterGroup' smart constructor.
+data UpdateParameterGroup = UpdateParameterGroup'
+  { -- | The name of the parameter group to update.
+    parameterGroupName :: Prelude.Text,
+    -- | An array of parameter names and values for the parameter update. You
+    -- must supply at least one parameter name and value; subsequent arguments
+    -- are optional. A maximum of 20 parameters may be updated per request.
+    parameterNameValues :: [ParameterNameValue]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateParameterGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'parameterGroupName', 'updateParameterGroup_parameterGroupName' - The name of the parameter group to update.
+--
+-- 'parameterNameValues', 'updateParameterGroup_parameterNameValues' - An array of parameter names and values for the parameter update. You
+-- must supply at least one parameter name and value; subsequent arguments
+-- are optional. A maximum of 20 parameters may be updated per request.
+newUpdateParameterGroup ::
+  -- | 'parameterGroupName'
+  Prelude.Text ->
+  UpdateParameterGroup
+newUpdateParameterGroup pParameterGroupName_ =
+  UpdateParameterGroup'
+    { parameterGroupName =
+        pParameterGroupName_,
+      parameterNameValues = Prelude.mempty
+    }
+
+-- | The name of the parameter group to update.
+updateParameterGroup_parameterGroupName :: Lens.Lens' UpdateParameterGroup Prelude.Text
+updateParameterGroup_parameterGroupName = Lens.lens (\UpdateParameterGroup' {parameterGroupName} -> parameterGroupName) (\s@UpdateParameterGroup' {} a -> s {parameterGroupName = a} :: UpdateParameterGroup)
+
+-- | An array of parameter names and values for the parameter update. You
+-- must supply at least one parameter name and value; subsequent arguments
+-- are optional. A maximum of 20 parameters may be updated per request.
+updateParameterGroup_parameterNameValues :: Lens.Lens' UpdateParameterGroup [ParameterNameValue]
+updateParameterGroup_parameterNameValues = Lens.lens (\UpdateParameterGroup' {parameterNameValues} -> parameterNameValues) (\s@UpdateParameterGroup' {} a -> s {parameterNameValues = a} :: UpdateParameterGroup) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UpdateParameterGroup where
+  type
+    AWSResponse UpdateParameterGroup =
+      UpdateParameterGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateParameterGroupResponse'
+            Prelude.<$> (x Data..?> "ParameterGroup")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateParameterGroup where
+  hashWithSalt _salt UpdateParameterGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` parameterGroupName
+      `Prelude.hashWithSalt` parameterNameValues
+
+instance Prelude.NFData UpdateParameterGroup where
+  rnf UpdateParameterGroup' {..} =
+    Prelude.rnf parameterGroupName
+      `Prelude.seq` Prelude.rnf parameterNameValues
+
+instance Data.ToHeaders UpdateParameterGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.UpdateParameterGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateParameterGroup where
+  toJSON UpdateParameterGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("ParameterGroupName" Data..= parameterGroupName),
+            Prelude.Just
+              ("ParameterNameValues" Data..= parameterNameValues)
+          ]
+      )
+
+instance Data.ToPath UpdateParameterGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateParameterGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateParameterGroupResponse' smart constructor.
+data UpdateParameterGroupResponse = UpdateParameterGroupResponse'
+  { -- | The updated parameter group
+    parameterGroup :: Prelude.Maybe ParameterGroup,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateParameterGroupResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'parameterGroup', 'updateParameterGroupResponse_parameterGroup' - The updated parameter group
+--
+-- 'httpStatus', 'updateParameterGroupResponse_httpStatus' - The response's http status code.
+newUpdateParameterGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateParameterGroupResponse
+newUpdateParameterGroupResponse pHttpStatus_ =
+  UpdateParameterGroupResponse'
+    { parameterGroup =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The updated parameter group
+updateParameterGroupResponse_parameterGroup :: Lens.Lens' UpdateParameterGroupResponse (Prelude.Maybe ParameterGroup)
+updateParameterGroupResponse_parameterGroup = Lens.lens (\UpdateParameterGroupResponse' {parameterGroup} -> parameterGroup) (\s@UpdateParameterGroupResponse' {} a -> s {parameterGroup = a} :: UpdateParameterGroupResponse)
+
+-- | The response's http status code.
+updateParameterGroupResponse_httpStatus :: Lens.Lens' UpdateParameterGroupResponse Prelude.Int
+updateParameterGroupResponse_httpStatus = Lens.lens (\UpdateParameterGroupResponse' {httpStatus} -> httpStatus) (\s@UpdateParameterGroupResponse' {} a -> s {httpStatus = a} :: UpdateParameterGroupResponse)
+
+instance Prelude.NFData UpdateParameterGroupResponse where
+  rnf UpdateParameterGroupResponse' {..} =
+    Prelude.rnf parameterGroup
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/UpdateSubnetGroup.hs b/gen/Amazonka/MemoryDb/UpdateSubnetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/UpdateSubnetGroup.hs
@@ -0,0 +1,201 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.UpdateSubnetGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a subnet group. For more information, see
+-- <https://docs.aws.amazon.com/MemoryDB/latest/devguide/ubnetGroups.Modifying.html Updating a subnet group>
+module Amazonka.MemoryDb.UpdateSubnetGroup
+  ( -- * Creating a Request
+    UpdateSubnetGroup (..),
+    newUpdateSubnetGroup,
+
+    -- * Request Lenses
+    updateSubnetGroup_description,
+    updateSubnetGroup_subnetIds,
+    updateSubnetGroup_subnetGroupName,
+
+    -- * Destructuring the Response
+    UpdateSubnetGroupResponse (..),
+    newUpdateSubnetGroupResponse,
+
+    -- * Response Lenses
+    updateSubnetGroupResponse_subnetGroup,
+    updateSubnetGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateSubnetGroup' smart constructor.
+data UpdateSubnetGroup = UpdateSubnetGroup'
+  { -- | A description of the subnet group
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The EC2 subnet IDs for the subnet group.
+    subnetIds :: Prelude.Maybe [Prelude.Text],
+    -- | The name of the subnet group
+    subnetGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateSubnetGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'updateSubnetGroup_description' - A description of the subnet group
+--
+-- 'subnetIds', 'updateSubnetGroup_subnetIds' - The EC2 subnet IDs for the subnet group.
+--
+-- 'subnetGroupName', 'updateSubnetGroup_subnetGroupName' - The name of the subnet group
+newUpdateSubnetGroup ::
+  -- | 'subnetGroupName'
+  Prelude.Text ->
+  UpdateSubnetGroup
+newUpdateSubnetGroup pSubnetGroupName_ =
+  UpdateSubnetGroup'
+    { description = Prelude.Nothing,
+      subnetIds = Prelude.Nothing,
+      subnetGroupName = pSubnetGroupName_
+    }
+
+-- | A description of the subnet group
+updateSubnetGroup_description :: Lens.Lens' UpdateSubnetGroup (Prelude.Maybe Prelude.Text)
+updateSubnetGroup_description = Lens.lens (\UpdateSubnetGroup' {description} -> description) (\s@UpdateSubnetGroup' {} a -> s {description = a} :: UpdateSubnetGroup)
+
+-- | The EC2 subnet IDs for the subnet group.
+updateSubnetGroup_subnetIds :: Lens.Lens' UpdateSubnetGroup (Prelude.Maybe [Prelude.Text])
+updateSubnetGroup_subnetIds = Lens.lens (\UpdateSubnetGroup' {subnetIds} -> subnetIds) (\s@UpdateSubnetGroup' {} a -> s {subnetIds = a} :: UpdateSubnetGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the subnet group
+updateSubnetGroup_subnetGroupName :: Lens.Lens' UpdateSubnetGroup Prelude.Text
+updateSubnetGroup_subnetGroupName = Lens.lens (\UpdateSubnetGroup' {subnetGroupName} -> subnetGroupName) (\s@UpdateSubnetGroup' {} a -> s {subnetGroupName = a} :: UpdateSubnetGroup)
+
+instance Core.AWSRequest UpdateSubnetGroup where
+  type
+    AWSResponse UpdateSubnetGroup =
+      UpdateSubnetGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateSubnetGroupResponse'
+            Prelude.<$> (x Data..?> "SubnetGroup")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateSubnetGroup where
+  hashWithSalt _salt UpdateSubnetGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` subnetIds
+      `Prelude.hashWithSalt` subnetGroupName
+
+instance Prelude.NFData UpdateSubnetGroup where
+  rnf UpdateSubnetGroup' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf subnetIds
+      `Prelude.seq` Prelude.rnf subnetGroupName
+
+instance Data.ToHeaders UpdateSubnetGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonMemoryDB.UpdateSubnetGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateSubnetGroup where
+  toJSON UpdateSubnetGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Description" Data..=) Prelude.<$> description,
+            ("SubnetIds" Data..=) Prelude.<$> subnetIds,
+            Prelude.Just
+              ("SubnetGroupName" Data..= subnetGroupName)
+          ]
+      )
+
+instance Data.ToPath UpdateSubnetGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateSubnetGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateSubnetGroupResponse' smart constructor.
+data UpdateSubnetGroupResponse = UpdateSubnetGroupResponse'
+  { -- | The updated subnet group
+    subnetGroup :: Prelude.Maybe SubnetGroup,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateSubnetGroupResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'subnetGroup', 'updateSubnetGroupResponse_subnetGroup' - The updated subnet group
+--
+-- 'httpStatus', 'updateSubnetGroupResponse_httpStatus' - The response's http status code.
+newUpdateSubnetGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateSubnetGroupResponse
+newUpdateSubnetGroupResponse pHttpStatus_ =
+  UpdateSubnetGroupResponse'
+    { subnetGroup =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The updated subnet group
+updateSubnetGroupResponse_subnetGroup :: Lens.Lens' UpdateSubnetGroupResponse (Prelude.Maybe SubnetGroup)
+updateSubnetGroupResponse_subnetGroup = Lens.lens (\UpdateSubnetGroupResponse' {subnetGroup} -> subnetGroup) (\s@UpdateSubnetGroupResponse' {} a -> s {subnetGroup = a} :: UpdateSubnetGroupResponse)
+
+-- | The response's http status code.
+updateSubnetGroupResponse_httpStatus :: Lens.Lens' UpdateSubnetGroupResponse Prelude.Int
+updateSubnetGroupResponse_httpStatus = Lens.lens (\UpdateSubnetGroupResponse' {httpStatus} -> httpStatus) (\s@UpdateSubnetGroupResponse' {} a -> s {httpStatus = a} :: UpdateSubnetGroupResponse)
+
+instance Prelude.NFData UpdateSubnetGroupResponse where
+  rnf UpdateSubnetGroupResponse' {..} =
+    Prelude.rnf subnetGroup
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/UpdateUser.hs b/gen/Amazonka/MemoryDb/UpdateUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/UpdateUser.hs
@@ -0,0 +1,198 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.UpdateUser
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Changes user password(s) and\/or access string.
+module Amazonka.MemoryDb.UpdateUser
+  ( -- * Creating a Request
+    UpdateUser (..),
+    newUpdateUser,
+
+    -- * Request Lenses
+    updateUser_accessString,
+    updateUser_authenticationMode,
+    updateUser_userName,
+
+    -- * Destructuring the Response
+    UpdateUserResponse (..),
+    newUpdateUserResponse,
+
+    -- * Response Lenses
+    updateUserResponse_user,
+    updateUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateUser' smart constructor.
+data UpdateUser = UpdateUser'
+  { -- | Access permissions string used for this user.
+    accessString :: Prelude.Maybe Prelude.Text,
+    -- | Denotes the user\'s authentication properties, such as whether it
+    -- requires a password to authenticate.
+    authenticationMode :: Prelude.Maybe AuthenticationMode,
+    -- | The name of the user
+    userName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateUser' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accessString', 'updateUser_accessString' - Access permissions string used for this user.
+--
+-- 'authenticationMode', 'updateUser_authenticationMode' - Denotes the user\'s authentication properties, such as whether it
+-- requires a password to authenticate.
+--
+-- 'userName', 'updateUser_userName' - The name of the user
+newUpdateUser ::
+  -- | 'userName'
+  Prelude.Text ->
+  UpdateUser
+newUpdateUser pUserName_ =
+  UpdateUser'
+    { accessString = Prelude.Nothing,
+      authenticationMode = Prelude.Nothing,
+      userName = pUserName_
+    }
+
+-- | Access permissions string used for this user.
+updateUser_accessString :: Lens.Lens' UpdateUser (Prelude.Maybe Prelude.Text)
+updateUser_accessString = Lens.lens (\UpdateUser' {accessString} -> accessString) (\s@UpdateUser' {} a -> s {accessString = a} :: UpdateUser)
+
+-- | Denotes the user\'s authentication properties, such as whether it
+-- requires a password to authenticate.
+updateUser_authenticationMode :: Lens.Lens' UpdateUser (Prelude.Maybe AuthenticationMode)
+updateUser_authenticationMode = Lens.lens (\UpdateUser' {authenticationMode} -> authenticationMode) (\s@UpdateUser' {} a -> s {authenticationMode = a} :: UpdateUser)
+
+-- | The name of the user
+updateUser_userName :: Lens.Lens' UpdateUser Prelude.Text
+updateUser_userName = Lens.lens (\UpdateUser' {userName} -> userName) (\s@UpdateUser' {} a -> s {userName = a} :: UpdateUser)
+
+instance Core.AWSRequest UpdateUser where
+  type AWSResponse UpdateUser = UpdateUserResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateUserResponse'
+            Prelude.<$> (x Data..?> "User")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateUser where
+  hashWithSalt _salt UpdateUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` accessString
+      `Prelude.hashWithSalt` authenticationMode
+      `Prelude.hashWithSalt` userName
+
+instance Prelude.NFData UpdateUser where
+  rnf UpdateUser' {..} =
+    Prelude.rnf accessString
+      `Prelude.seq` Prelude.rnf authenticationMode
+      `Prelude.seq` Prelude.rnf userName
+
+instance Data.ToHeaders UpdateUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("AmazonMemoryDB.UpdateUser" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateUser where
+  toJSON UpdateUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AccessString" Data..=) Prelude.<$> accessString,
+            ("AuthenticationMode" Data..=)
+              Prelude.<$> authenticationMode,
+            Prelude.Just ("UserName" Data..= userName)
+          ]
+      )
+
+instance Data.ToPath UpdateUser where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateUserResponse' smart constructor.
+data UpdateUserResponse = UpdateUserResponse'
+  { -- | The updated user
+    user :: Prelude.Maybe User,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateUserResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'user', 'updateUserResponse_user' - The updated user
+--
+-- 'httpStatus', 'updateUserResponse_httpStatus' - The response's http status code.
+newUpdateUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateUserResponse
+newUpdateUserResponse pHttpStatus_ =
+  UpdateUserResponse'
+    { user = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The updated user
+updateUserResponse_user :: Lens.Lens' UpdateUserResponse (Prelude.Maybe User)
+updateUserResponse_user = Lens.lens (\UpdateUserResponse' {user} -> user) (\s@UpdateUserResponse' {} a -> s {user = a} :: UpdateUserResponse)
+
+-- | The response's http status code.
+updateUserResponse_httpStatus :: Lens.Lens' UpdateUserResponse Prelude.Int
+updateUserResponse_httpStatus = Lens.lens (\UpdateUserResponse' {httpStatus} -> httpStatus) (\s@UpdateUserResponse' {} a -> s {httpStatus = a} :: UpdateUserResponse)
+
+instance Prelude.NFData UpdateUserResponse where
+  rnf UpdateUserResponse' {..} =
+    Prelude.rnf user
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/MemoryDb/Waiters.hs b/gen/Amazonka/MemoryDb/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/MemoryDb/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.MemoryDb.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.MemoryDb.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.MemoryDb.Lens
+import Amazonka.MemoryDb.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.MemoryDb
+import Test.Amazonka.MemoryDb.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "MemoryDb"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/MemoryDb.hs b/test/Test/Amazonka/Gen/MemoryDb.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/MemoryDb.hs
@@ -0,0 +1,798 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.MemoryDb
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.MemoryDb where
+
+import Amazonka.MemoryDb
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.MemoryDb.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestBatchUpdateCluster $
+--             newBatchUpdateCluster
+--
+--         , requestCopySnapshot $
+--             newCopySnapshot
+--
+--         , requestCreateACL $
+--             newCreateACL
+--
+--         , requestCreateCluster $
+--             newCreateCluster
+--
+--         , requestCreateParameterGroup $
+--             newCreateParameterGroup
+--
+--         , requestCreateSnapshot $
+--             newCreateSnapshot
+--
+--         , requestCreateSubnetGroup $
+--             newCreateSubnetGroup
+--
+--         , requestCreateUser $
+--             newCreateUser
+--
+--         , requestDeleteACL $
+--             newDeleteACL
+--
+--         , requestDeleteCluster $
+--             newDeleteCluster
+--
+--         , requestDeleteParameterGroup $
+--             newDeleteParameterGroup
+--
+--         , requestDeleteSnapshot $
+--             newDeleteSnapshot
+--
+--         , requestDeleteSubnetGroup $
+--             newDeleteSubnetGroup
+--
+--         , requestDeleteUser $
+--             newDeleteUser
+--
+--         , requestDescribeACLs $
+--             newDescribeACLs
+--
+--         , requestDescribeClusters $
+--             newDescribeClusters
+--
+--         , requestDescribeEngineVersions $
+--             newDescribeEngineVersions
+--
+--         , requestDescribeEvents $
+--             newDescribeEvents
+--
+--         , requestDescribeParameterGroups $
+--             newDescribeParameterGroups
+--
+--         , requestDescribeParameters $
+--             newDescribeParameters
+--
+--         , requestDescribeReservedNodes $
+--             newDescribeReservedNodes
+--
+--         , requestDescribeReservedNodesOfferings $
+--             newDescribeReservedNodesOfferings
+--
+--         , requestDescribeServiceUpdates $
+--             newDescribeServiceUpdates
+--
+--         , requestDescribeSnapshots $
+--             newDescribeSnapshots
+--
+--         , requestDescribeSubnetGroups $
+--             newDescribeSubnetGroups
+--
+--         , requestDescribeUsers $
+--             newDescribeUsers
+--
+--         , requestFailoverShard $
+--             newFailoverShard
+--
+--         , requestListAllowedNodeTypeUpdates $
+--             newListAllowedNodeTypeUpdates
+--
+--         , requestListTags $
+--             newListTags
+--
+--         , requestPurchaseReservedNodesOffering $
+--             newPurchaseReservedNodesOffering
+--
+--         , requestResetParameterGroup $
+--             newResetParameterGroup
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateACL $
+--             newUpdateACL
+--
+--         , requestUpdateCluster $
+--             newUpdateCluster
+--
+--         , requestUpdateParameterGroup $
+--             newUpdateParameterGroup
+--
+--         , requestUpdateSubnetGroup $
+--             newUpdateSubnetGroup
+--
+--         , requestUpdateUser $
+--             newUpdateUser
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseBatchUpdateCluster $
+--             newBatchUpdateClusterResponse
+--
+--         , responseCopySnapshot $
+--             newCopySnapshotResponse
+--
+--         , responseCreateACL $
+--             newCreateACLResponse
+--
+--         , responseCreateCluster $
+--             newCreateClusterResponse
+--
+--         , responseCreateParameterGroup $
+--             newCreateParameterGroupResponse
+--
+--         , responseCreateSnapshot $
+--             newCreateSnapshotResponse
+--
+--         , responseCreateSubnetGroup $
+--             newCreateSubnetGroupResponse
+--
+--         , responseCreateUser $
+--             newCreateUserResponse
+--
+--         , responseDeleteACL $
+--             newDeleteACLResponse
+--
+--         , responseDeleteCluster $
+--             newDeleteClusterResponse
+--
+--         , responseDeleteParameterGroup $
+--             newDeleteParameterGroupResponse
+--
+--         , responseDeleteSnapshot $
+--             newDeleteSnapshotResponse
+--
+--         , responseDeleteSubnetGroup $
+--             newDeleteSubnetGroupResponse
+--
+--         , responseDeleteUser $
+--             newDeleteUserResponse
+--
+--         , responseDescribeACLs $
+--             newDescribeACLsResponse
+--
+--         , responseDescribeClusters $
+--             newDescribeClustersResponse
+--
+--         , responseDescribeEngineVersions $
+--             newDescribeEngineVersionsResponse
+--
+--         , responseDescribeEvents $
+--             newDescribeEventsResponse
+--
+--         , responseDescribeParameterGroups $
+--             newDescribeParameterGroupsResponse
+--
+--         , responseDescribeParameters $
+--             newDescribeParametersResponse
+--
+--         , responseDescribeReservedNodes $
+--             newDescribeReservedNodesResponse
+--
+--         , responseDescribeReservedNodesOfferings $
+--             newDescribeReservedNodesOfferingsResponse
+--
+--         , responseDescribeServiceUpdates $
+--             newDescribeServiceUpdatesResponse
+--
+--         , responseDescribeSnapshots $
+--             newDescribeSnapshotsResponse
+--
+--         , responseDescribeSubnetGroups $
+--             newDescribeSubnetGroupsResponse
+--
+--         , responseDescribeUsers $
+--             newDescribeUsersResponse
+--
+--         , responseFailoverShard $
+--             newFailoverShardResponse
+--
+--         , responseListAllowedNodeTypeUpdates $
+--             newListAllowedNodeTypeUpdatesResponse
+--
+--         , responseListTags $
+--             newListTagsResponse
+--
+--         , responsePurchaseReservedNodesOffering $
+--             newPurchaseReservedNodesOfferingResponse
+--
+--         , responseResetParameterGroup $
+--             newResetParameterGroupResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateACL $
+--             newUpdateACLResponse
+--
+--         , responseUpdateCluster $
+--             newUpdateClusterResponse
+--
+--         , responseUpdateParameterGroup $
+--             newUpdateParameterGroupResponse
+--
+--         , responseUpdateSubnetGroup $
+--             newUpdateSubnetGroupResponse
+--
+--         , responseUpdateUser $
+--             newUpdateUserResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestBatchUpdateCluster :: BatchUpdateCluster -> TestTree
+requestBatchUpdateCluster =
+  req
+    "BatchUpdateCluster"
+    "fixture/BatchUpdateCluster.yaml"
+
+requestCopySnapshot :: CopySnapshot -> TestTree
+requestCopySnapshot =
+  req
+    "CopySnapshot"
+    "fixture/CopySnapshot.yaml"
+
+requestCreateACL :: CreateACL -> TestTree
+requestCreateACL =
+  req
+    "CreateACL"
+    "fixture/CreateACL.yaml"
+
+requestCreateCluster :: CreateCluster -> TestTree
+requestCreateCluster =
+  req
+    "CreateCluster"
+    "fixture/CreateCluster.yaml"
+
+requestCreateParameterGroup :: CreateParameterGroup -> TestTree
+requestCreateParameterGroup =
+  req
+    "CreateParameterGroup"
+    "fixture/CreateParameterGroup.yaml"
+
+requestCreateSnapshot :: CreateSnapshot -> TestTree
+requestCreateSnapshot =
+  req
+    "CreateSnapshot"
+    "fixture/CreateSnapshot.yaml"
+
+requestCreateSubnetGroup :: CreateSubnetGroup -> TestTree
+requestCreateSubnetGroup =
+  req
+    "CreateSubnetGroup"
+    "fixture/CreateSubnetGroup.yaml"
+
+requestCreateUser :: CreateUser -> TestTree
+requestCreateUser =
+  req
+    "CreateUser"
+    "fixture/CreateUser.yaml"
+
+requestDeleteACL :: DeleteACL -> TestTree
+requestDeleteACL =
+  req
+    "DeleteACL"
+    "fixture/DeleteACL.yaml"
+
+requestDeleteCluster :: DeleteCluster -> TestTree
+requestDeleteCluster =
+  req
+    "DeleteCluster"
+    "fixture/DeleteCluster.yaml"
+
+requestDeleteParameterGroup :: DeleteParameterGroup -> TestTree
+requestDeleteParameterGroup =
+  req
+    "DeleteParameterGroup"
+    "fixture/DeleteParameterGroup.yaml"
+
+requestDeleteSnapshot :: DeleteSnapshot -> TestTree
+requestDeleteSnapshot =
+  req
+    "DeleteSnapshot"
+    "fixture/DeleteSnapshot.yaml"
+
+requestDeleteSubnetGroup :: DeleteSubnetGroup -> TestTree
+requestDeleteSubnetGroup =
+  req
+    "DeleteSubnetGroup"
+    "fixture/DeleteSubnetGroup.yaml"
+
+requestDeleteUser :: DeleteUser -> TestTree
+requestDeleteUser =
+  req
+    "DeleteUser"
+    "fixture/DeleteUser.yaml"
+
+requestDescribeACLs :: DescribeACLs -> TestTree
+requestDescribeACLs =
+  req
+    "DescribeACLs"
+    "fixture/DescribeACLs.yaml"
+
+requestDescribeClusters :: DescribeClusters -> TestTree
+requestDescribeClusters =
+  req
+    "DescribeClusters"
+    "fixture/DescribeClusters.yaml"
+
+requestDescribeEngineVersions :: DescribeEngineVersions -> TestTree
+requestDescribeEngineVersions =
+  req
+    "DescribeEngineVersions"
+    "fixture/DescribeEngineVersions.yaml"
+
+requestDescribeEvents :: DescribeEvents -> TestTree
+requestDescribeEvents =
+  req
+    "DescribeEvents"
+    "fixture/DescribeEvents.yaml"
+
+requestDescribeParameterGroups :: DescribeParameterGroups -> TestTree
+requestDescribeParameterGroups =
+  req
+    "DescribeParameterGroups"
+    "fixture/DescribeParameterGroups.yaml"
+
+requestDescribeParameters :: DescribeParameters -> TestTree
+requestDescribeParameters =
+  req
+    "DescribeParameters"
+    "fixture/DescribeParameters.yaml"
+
+requestDescribeReservedNodes :: DescribeReservedNodes -> TestTree
+requestDescribeReservedNodes =
+  req
+    "DescribeReservedNodes"
+    "fixture/DescribeReservedNodes.yaml"
+
+requestDescribeReservedNodesOfferings :: DescribeReservedNodesOfferings -> TestTree
+requestDescribeReservedNodesOfferings =
+  req
+    "DescribeReservedNodesOfferings"
+    "fixture/DescribeReservedNodesOfferings.yaml"
+
+requestDescribeServiceUpdates :: DescribeServiceUpdates -> TestTree
+requestDescribeServiceUpdates =
+  req
+    "DescribeServiceUpdates"
+    "fixture/DescribeServiceUpdates.yaml"
+
+requestDescribeSnapshots :: DescribeSnapshots -> TestTree
+requestDescribeSnapshots =
+  req
+    "DescribeSnapshots"
+    "fixture/DescribeSnapshots.yaml"
+
+requestDescribeSubnetGroups :: DescribeSubnetGroups -> TestTree
+requestDescribeSubnetGroups =
+  req
+    "DescribeSubnetGroups"
+    "fixture/DescribeSubnetGroups.yaml"
+
+requestDescribeUsers :: DescribeUsers -> TestTree
+requestDescribeUsers =
+  req
+    "DescribeUsers"
+    "fixture/DescribeUsers.yaml"
+
+requestFailoverShard :: FailoverShard -> TestTree
+requestFailoverShard =
+  req
+    "FailoverShard"
+    "fixture/FailoverShard.yaml"
+
+requestListAllowedNodeTypeUpdates :: ListAllowedNodeTypeUpdates -> TestTree
+requestListAllowedNodeTypeUpdates =
+  req
+    "ListAllowedNodeTypeUpdates"
+    "fixture/ListAllowedNodeTypeUpdates.yaml"
+
+requestListTags :: ListTags -> TestTree
+requestListTags =
+  req
+    "ListTags"
+    "fixture/ListTags.yaml"
+
+requestPurchaseReservedNodesOffering :: PurchaseReservedNodesOffering -> TestTree
+requestPurchaseReservedNodesOffering =
+  req
+    "PurchaseReservedNodesOffering"
+    "fixture/PurchaseReservedNodesOffering.yaml"
+
+requestResetParameterGroup :: ResetParameterGroup -> TestTree
+requestResetParameterGroup =
+  req
+    "ResetParameterGroup"
+    "fixture/ResetParameterGroup.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateACL :: UpdateACL -> TestTree
+requestUpdateACL =
+  req
+    "UpdateACL"
+    "fixture/UpdateACL.yaml"
+
+requestUpdateCluster :: UpdateCluster -> TestTree
+requestUpdateCluster =
+  req
+    "UpdateCluster"
+    "fixture/UpdateCluster.yaml"
+
+requestUpdateParameterGroup :: UpdateParameterGroup -> TestTree
+requestUpdateParameterGroup =
+  req
+    "UpdateParameterGroup"
+    "fixture/UpdateParameterGroup.yaml"
+
+requestUpdateSubnetGroup :: UpdateSubnetGroup -> TestTree
+requestUpdateSubnetGroup =
+  req
+    "UpdateSubnetGroup"
+    "fixture/UpdateSubnetGroup.yaml"
+
+requestUpdateUser :: UpdateUser -> TestTree
+requestUpdateUser =
+  req
+    "UpdateUser"
+    "fixture/UpdateUser.yaml"
+
+-- Responses
+
+responseBatchUpdateCluster :: BatchUpdateClusterResponse -> TestTree
+responseBatchUpdateCluster =
+  res
+    "BatchUpdateClusterResponse"
+    "fixture/BatchUpdateClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchUpdateCluster)
+
+responseCopySnapshot :: CopySnapshotResponse -> TestTree
+responseCopySnapshot =
+  res
+    "CopySnapshotResponse"
+    "fixture/CopySnapshotResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CopySnapshot)
+
+responseCreateACL :: CreateACLResponse -> TestTree
+responseCreateACL =
+  res
+    "CreateACLResponse"
+    "fixture/CreateACLResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateACL)
+
+responseCreateCluster :: CreateClusterResponse -> TestTree
+responseCreateCluster =
+  res
+    "CreateClusterResponse"
+    "fixture/CreateClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateCluster)
+
+responseCreateParameterGroup :: CreateParameterGroupResponse -> TestTree
+responseCreateParameterGroup =
+  res
+    "CreateParameterGroupResponse"
+    "fixture/CreateParameterGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateParameterGroup)
+
+responseCreateSnapshot :: CreateSnapshotResponse -> TestTree
+responseCreateSnapshot =
+  res
+    "CreateSnapshotResponse"
+    "fixture/CreateSnapshotResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateSnapshot)
+
+responseCreateSubnetGroup :: CreateSubnetGroupResponse -> TestTree
+responseCreateSubnetGroup =
+  res
+    "CreateSubnetGroupResponse"
+    "fixture/CreateSubnetGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateSubnetGroup)
+
+responseCreateUser :: CreateUserResponse -> TestTree
+responseCreateUser =
+  res
+    "CreateUserResponse"
+    "fixture/CreateUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateUser)
+
+responseDeleteACL :: DeleteACLResponse -> TestTree
+responseDeleteACL =
+  res
+    "DeleteACLResponse"
+    "fixture/DeleteACLResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteACL)
+
+responseDeleteCluster :: DeleteClusterResponse -> TestTree
+responseDeleteCluster =
+  res
+    "DeleteClusterResponse"
+    "fixture/DeleteClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteCluster)
+
+responseDeleteParameterGroup :: DeleteParameterGroupResponse -> TestTree
+responseDeleteParameterGroup =
+  res
+    "DeleteParameterGroupResponse"
+    "fixture/DeleteParameterGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteParameterGroup)
+
+responseDeleteSnapshot :: DeleteSnapshotResponse -> TestTree
+responseDeleteSnapshot =
+  res
+    "DeleteSnapshotResponse"
+    "fixture/DeleteSnapshotResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteSnapshot)
+
+responseDeleteSubnetGroup :: DeleteSubnetGroupResponse -> TestTree
+responseDeleteSubnetGroup =
+  res
+    "DeleteSubnetGroupResponse"
+    "fixture/DeleteSubnetGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteSubnetGroup)
+
+responseDeleteUser :: DeleteUserResponse -> TestTree
+responseDeleteUser =
+  res
+    "DeleteUserResponse"
+    "fixture/DeleteUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteUser)
+
+responseDescribeACLs :: DescribeACLsResponse -> TestTree
+responseDescribeACLs =
+  res
+    "DescribeACLsResponse"
+    "fixture/DescribeACLsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeACLs)
+
+responseDescribeClusters :: DescribeClustersResponse -> TestTree
+responseDescribeClusters =
+  res
+    "DescribeClustersResponse"
+    "fixture/DescribeClustersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeClusters)
+
+responseDescribeEngineVersions :: DescribeEngineVersionsResponse -> TestTree
+responseDescribeEngineVersions =
+  res
+    "DescribeEngineVersionsResponse"
+    "fixture/DescribeEngineVersionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeEngineVersions)
+
+responseDescribeEvents :: DescribeEventsResponse -> TestTree
+responseDescribeEvents =
+  res
+    "DescribeEventsResponse"
+    "fixture/DescribeEventsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeEvents)
+
+responseDescribeParameterGroups :: DescribeParameterGroupsResponse -> TestTree
+responseDescribeParameterGroups =
+  res
+    "DescribeParameterGroupsResponse"
+    "fixture/DescribeParameterGroupsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeParameterGroups)
+
+responseDescribeParameters :: DescribeParametersResponse -> TestTree
+responseDescribeParameters =
+  res
+    "DescribeParametersResponse"
+    "fixture/DescribeParametersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeParameters)
+
+responseDescribeReservedNodes :: DescribeReservedNodesResponse -> TestTree
+responseDescribeReservedNodes =
+  res
+    "DescribeReservedNodesResponse"
+    "fixture/DescribeReservedNodesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeReservedNodes)
+
+responseDescribeReservedNodesOfferings :: DescribeReservedNodesOfferingsResponse -> TestTree
+responseDescribeReservedNodesOfferings =
+  res
+    "DescribeReservedNodesOfferingsResponse"
+    "fixture/DescribeReservedNodesOfferingsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeReservedNodesOfferings)
+
+responseDescribeServiceUpdates :: DescribeServiceUpdatesResponse -> TestTree
+responseDescribeServiceUpdates =
+  res
+    "DescribeServiceUpdatesResponse"
+    "fixture/DescribeServiceUpdatesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeServiceUpdates)
+
+responseDescribeSnapshots :: DescribeSnapshotsResponse -> TestTree
+responseDescribeSnapshots =
+  res
+    "DescribeSnapshotsResponse"
+    "fixture/DescribeSnapshotsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeSnapshots)
+
+responseDescribeSubnetGroups :: DescribeSubnetGroupsResponse -> TestTree
+responseDescribeSubnetGroups =
+  res
+    "DescribeSubnetGroupsResponse"
+    "fixture/DescribeSubnetGroupsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeSubnetGroups)
+
+responseDescribeUsers :: DescribeUsersResponse -> TestTree
+responseDescribeUsers =
+  res
+    "DescribeUsersResponse"
+    "fixture/DescribeUsersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeUsers)
+
+responseFailoverShard :: FailoverShardResponse -> TestTree
+responseFailoverShard =
+  res
+    "FailoverShardResponse"
+    "fixture/FailoverShardResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy FailoverShard)
+
+responseListAllowedNodeTypeUpdates :: ListAllowedNodeTypeUpdatesResponse -> TestTree
+responseListAllowedNodeTypeUpdates =
+  res
+    "ListAllowedNodeTypeUpdatesResponse"
+    "fixture/ListAllowedNodeTypeUpdatesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAllowedNodeTypeUpdates)
+
+responseListTags :: ListTagsResponse -> TestTree
+responseListTags =
+  res
+    "ListTagsResponse"
+    "fixture/ListTagsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTags)
+
+responsePurchaseReservedNodesOffering :: PurchaseReservedNodesOfferingResponse -> TestTree
+responsePurchaseReservedNodesOffering =
+  res
+    "PurchaseReservedNodesOfferingResponse"
+    "fixture/PurchaseReservedNodesOfferingResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PurchaseReservedNodesOffering)
+
+responseResetParameterGroup :: ResetParameterGroupResponse -> TestTree
+responseResetParameterGroup =
+  res
+    "ResetParameterGroupResponse"
+    "fixture/ResetParameterGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ResetParameterGroup)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateACL :: UpdateACLResponse -> TestTree
+responseUpdateACL =
+  res
+    "UpdateACLResponse"
+    "fixture/UpdateACLResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateACL)
+
+responseUpdateCluster :: UpdateClusterResponse -> TestTree
+responseUpdateCluster =
+  res
+    "UpdateClusterResponse"
+    "fixture/UpdateClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateCluster)
+
+responseUpdateParameterGroup :: UpdateParameterGroupResponse -> TestTree
+responseUpdateParameterGroup =
+  res
+    "UpdateParameterGroupResponse"
+    "fixture/UpdateParameterGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateParameterGroup)
+
+responseUpdateSubnetGroup :: UpdateSubnetGroupResponse -> TestTree
+responseUpdateSubnetGroup =
+  res
+    "UpdateSubnetGroupResponse"
+    "fixture/UpdateSubnetGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateSubnetGroup)
+
+responseUpdateUser :: UpdateUserResponse -> TestTree
+responseUpdateUser =
+  res
+    "UpdateUserResponse"
+    "fixture/UpdateUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateUser)
diff --git a/test/Test/Amazonka/MemoryDb.hs b/test/Test/Amazonka/MemoryDb.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/MemoryDb.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.MemoryDb
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.MemoryDb
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/MemoryDb/Internal.hs b/test/Test/Amazonka/MemoryDb/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/MemoryDb/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.MemoryDb.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.MemoryDb.Internal where
