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 Keyspaces SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2022-02-10@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-keyspaces)
+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.KeySpaces](http://hackage.haskell.org/package/amazonka-keyspaces/docs/Amazonka-KeySpaces.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-keyspaces` 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-keyspaces.cabal b/amazonka-keyspaces.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-keyspaces.cabal
@@ -0,0 +1,117 @@
+cabal-version:      2.2
+name:               amazonka-keyspaces
+version:            2.0
+synopsis:           Amazon Keyspaces 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 @2022-02-10@ 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.KeySpaces.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.KeySpaces" 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-keyspaces
+
+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.KeySpaces
+    Amazonka.KeySpaces.CreateKeyspace
+    Amazonka.KeySpaces.CreateTable
+    Amazonka.KeySpaces.DeleteKeyspace
+    Amazonka.KeySpaces.DeleteTable
+    Amazonka.KeySpaces.GetKeyspace
+    Amazonka.KeySpaces.GetTable
+    Amazonka.KeySpaces.Lens
+    Amazonka.KeySpaces.ListKeyspaces
+    Amazonka.KeySpaces.ListTables
+    Amazonka.KeySpaces.ListTagsForResource
+    Amazonka.KeySpaces.RestoreTable
+    Amazonka.KeySpaces.TagResource
+    Amazonka.KeySpaces.Types
+    Amazonka.KeySpaces.Types.CapacitySpecification
+    Amazonka.KeySpaces.Types.CapacitySpecificationSummary
+    Amazonka.KeySpaces.Types.ClusteringKey
+    Amazonka.KeySpaces.Types.ColumnDefinition
+    Amazonka.KeySpaces.Types.Comment
+    Amazonka.KeySpaces.Types.EncryptionSpecification
+    Amazonka.KeySpaces.Types.EncryptionType
+    Amazonka.KeySpaces.Types.KeyspaceSummary
+    Amazonka.KeySpaces.Types.PartitionKey
+    Amazonka.KeySpaces.Types.PointInTimeRecovery
+    Amazonka.KeySpaces.Types.PointInTimeRecoveryStatus
+    Amazonka.KeySpaces.Types.PointInTimeRecoverySummary
+    Amazonka.KeySpaces.Types.SchemaDefinition
+    Amazonka.KeySpaces.Types.SortOrder
+    Amazonka.KeySpaces.Types.StaticColumn
+    Amazonka.KeySpaces.Types.TableStatus
+    Amazonka.KeySpaces.Types.TableSummary
+    Amazonka.KeySpaces.Types.Tag
+    Amazonka.KeySpaces.Types.ThroughputMode
+    Amazonka.KeySpaces.Types.TimeToLive
+    Amazonka.KeySpaces.Types.TimeToLiveStatus
+    Amazonka.KeySpaces.UntagResource
+    Amazonka.KeySpaces.UpdateTable
+    Amazonka.KeySpaces.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-keyspaces-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.KeySpaces
+    Test.Amazonka.KeySpaces
+    Test.Amazonka.KeySpaces.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-keyspaces
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateKeyspace.yaml b/fixture/CreateKeyspace.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateKeyspace.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/CreateKeyspaceResponse.proto b/fixture/CreateKeyspaceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateKeyspaceResponse.proto
diff --git a/fixture/CreateTable.yaml b/fixture/CreateTable.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateTable.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/CreateTableResponse.proto b/fixture/CreateTableResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateTableResponse.proto
diff --git a/fixture/DeleteKeyspace.yaml b/fixture/DeleteKeyspace.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteKeyspace.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/DeleteKeyspaceResponse.proto b/fixture/DeleteKeyspaceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteKeyspaceResponse.proto
diff --git a/fixture/DeleteTable.yaml b/fixture/DeleteTable.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteTable.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/DeleteTableResponse.proto b/fixture/DeleteTableResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteTableResponse.proto
diff --git a/fixture/GetKeyspace.yaml b/fixture/GetKeyspace.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetKeyspace.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/GetKeyspaceResponse.proto b/fixture/GetKeyspaceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetKeyspaceResponse.proto
diff --git a/fixture/GetTable.yaml b/fixture/GetTable.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetTable.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/GetTableResponse.proto b/fixture/GetTableResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetTableResponse.proto
diff --git a/fixture/ListKeyspaces.yaml b/fixture/ListKeyspaces.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListKeyspaces.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/ListKeyspacesResponse.proto b/fixture/ListKeyspacesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListKeyspacesResponse.proto
diff --git a/fixture/ListTables.yaml b/fixture/ListTables.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTables.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/ListTablesResponse.proto b/fixture/ListTablesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTablesResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/RestoreTable.yaml b/fixture/RestoreTable.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RestoreTable.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/RestoreTableResponse.proto b/fixture/RestoreTableResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RestoreTableResponse.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/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/UpdateTable.yaml b/fixture/UpdateTable.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateTable.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/cassandra/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  cassandra.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/UpdateTableResponse.proto b/fixture/UpdateTableResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateTableResponse.proto
diff --git a/gen/Amazonka/KeySpaces.hs b/gen/Amazonka/KeySpaces.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces.hs
@@ -0,0 +1,275 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.KeySpaces
+-- 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 @2022-02-10@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon Keyspaces (for Apache Cassandra) is a scalable, highly available,
+-- and managed Apache Cassandra-compatible database service. Amazon
+-- Keyspaces makes it easy to migrate, run, and scale Cassandra workloads
+-- in the Amazon Web Services Cloud. With just a few clicks on the Amazon
+-- Web Services Management Console or a few lines of code, you can create
+-- keyspaces and tables in Amazon Keyspaces, without deploying any
+-- infrastructure or installing software.
+--
+-- In addition to supporting Cassandra Query Language (CQL) requests via
+-- open-source Cassandra drivers, Amazon Keyspaces supports data definition
+-- language (DDL) operations to manage keyspaces and tables using the
+-- Amazon Web Services SDK and CLI. This API reference describes the
+-- supported DDL operations in detail.
+--
+-- For the list of all supported CQL APIs, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/cassandra-apis.html Supported Cassandra APIs, operations, and data types in Amazon Keyspaces>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- To learn how Amazon Keyspaces API actions are recorded with CloudTrail,
+-- see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/logging-using-cloudtrail.html#service-name-info-in-cloudtrail Amazon Keyspaces information in CloudTrail>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- For more information about Amazon Web Services APIs, for example how to
+-- implement retry logic or how to sign Amazon Web Services API requests,
+-- see
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-apis.html Amazon Web Services APIs>
+-- in the /General Reference/.
+module Amazonka.KeySpaces
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateKeyspace
+    CreateKeyspace (CreateKeyspace'),
+    newCreateKeyspace,
+    CreateKeyspaceResponse (CreateKeyspaceResponse'),
+    newCreateKeyspaceResponse,
+
+    -- ** CreateTable
+    CreateTable (CreateTable'),
+    newCreateTable,
+    CreateTableResponse (CreateTableResponse'),
+    newCreateTableResponse,
+
+    -- ** DeleteKeyspace
+    DeleteKeyspace (DeleteKeyspace'),
+    newDeleteKeyspace,
+    DeleteKeyspaceResponse (DeleteKeyspaceResponse'),
+    newDeleteKeyspaceResponse,
+
+    -- ** DeleteTable
+    DeleteTable (DeleteTable'),
+    newDeleteTable,
+    DeleteTableResponse (DeleteTableResponse'),
+    newDeleteTableResponse,
+
+    -- ** GetKeyspace
+    GetKeyspace (GetKeyspace'),
+    newGetKeyspace,
+    GetKeyspaceResponse (GetKeyspaceResponse'),
+    newGetKeyspaceResponse,
+
+    -- ** GetTable
+    GetTable (GetTable'),
+    newGetTable,
+    GetTableResponse (GetTableResponse'),
+    newGetTableResponse,
+
+    -- ** ListKeyspaces (Paginated)
+    ListKeyspaces (ListKeyspaces'),
+    newListKeyspaces,
+    ListKeyspacesResponse (ListKeyspacesResponse'),
+    newListKeyspacesResponse,
+
+    -- ** ListTables (Paginated)
+    ListTables (ListTables'),
+    newListTables,
+    ListTablesResponse (ListTablesResponse'),
+    newListTablesResponse,
+
+    -- ** ListTagsForResource (Paginated)
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** RestoreTable
+    RestoreTable (RestoreTable'),
+    newRestoreTable,
+    RestoreTableResponse (RestoreTableResponse'),
+    newRestoreTableResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateTable
+    UpdateTable (UpdateTable'),
+    newUpdateTable,
+    UpdateTableResponse (UpdateTableResponse'),
+    newUpdateTableResponse,
+
+    -- * Types
+
+    -- ** EncryptionType
+    EncryptionType (..),
+
+    -- ** PointInTimeRecoveryStatus
+    PointInTimeRecoveryStatus (..),
+
+    -- ** SortOrder
+    SortOrder (..),
+
+    -- ** TableStatus
+    TableStatus (..),
+
+    -- ** ThroughputMode
+    ThroughputMode (..),
+
+    -- ** TimeToLiveStatus
+    TimeToLiveStatus (..),
+
+    -- ** CapacitySpecification
+    CapacitySpecification (CapacitySpecification'),
+    newCapacitySpecification,
+
+    -- ** CapacitySpecificationSummary
+    CapacitySpecificationSummary (CapacitySpecificationSummary'),
+    newCapacitySpecificationSummary,
+
+    -- ** ClusteringKey
+    ClusteringKey (ClusteringKey'),
+    newClusteringKey,
+
+    -- ** ColumnDefinition
+    ColumnDefinition (ColumnDefinition'),
+    newColumnDefinition,
+
+    -- ** Comment
+    Comment (Comment'),
+    newComment,
+
+    -- ** EncryptionSpecification
+    EncryptionSpecification (EncryptionSpecification'),
+    newEncryptionSpecification,
+
+    -- ** KeyspaceSummary
+    KeyspaceSummary (KeyspaceSummary'),
+    newKeyspaceSummary,
+
+    -- ** PartitionKey
+    PartitionKey (PartitionKey'),
+    newPartitionKey,
+
+    -- ** PointInTimeRecovery
+    PointInTimeRecovery (PointInTimeRecovery'),
+    newPointInTimeRecovery,
+
+    -- ** PointInTimeRecoverySummary
+    PointInTimeRecoverySummary (PointInTimeRecoverySummary'),
+    newPointInTimeRecoverySummary,
+
+    -- ** SchemaDefinition
+    SchemaDefinition (SchemaDefinition'),
+    newSchemaDefinition,
+
+    -- ** StaticColumn
+    StaticColumn (StaticColumn'),
+    newStaticColumn,
+
+    -- ** TableSummary
+    TableSummary (TableSummary'),
+    newTableSummary,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+
+    -- ** TimeToLive
+    TimeToLive (TimeToLive'),
+    newTimeToLive,
+  )
+where
+
+import Amazonka.KeySpaces.CreateKeyspace
+import Amazonka.KeySpaces.CreateTable
+import Amazonka.KeySpaces.DeleteKeyspace
+import Amazonka.KeySpaces.DeleteTable
+import Amazonka.KeySpaces.GetKeyspace
+import Amazonka.KeySpaces.GetTable
+import Amazonka.KeySpaces.Lens
+import Amazonka.KeySpaces.ListKeyspaces
+import Amazonka.KeySpaces.ListTables
+import Amazonka.KeySpaces.ListTagsForResource
+import Amazonka.KeySpaces.RestoreTable
+import Amazonka.KeySpaces.TagResource
+import Amazonka.KeySpaces.Types
+import Amazonka.KeySpaces.UntagResource
+import Amazonka.KeySpaces.UpdateTable
+import Amazonka.KeySpaces.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 'KeySpaces'.
+
+-- $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/KeySpaces/CreateKeyspace.hs b/gen/Amazonka/KeySpaces/CreateKeyspace.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/CreateKeyspace.hs
@@ -0,0 +1,212 @@
+{-# 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.KeySpaces.CreateKeyspace
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The @CreateKeyspace@ operation adds a new keyspace to your account. In
+-- an Amazon Web Services account, keyspace names must be unique within
+-- each Region.
+--
+-- @CreateKeyspace@ is an asynchronous operation. You can monitor the
+-- creation status of the new keyspace by using the @GetKeyspace@
+-- operation.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/working-with-keyspaces.html#keyspaces-create Creating keyspaces>
+-- in the /Amazon Keyspaces Developer Guide/.
+module Amazonka.KeySpaces.CreateKeyspace
+  ( -- * Creating a Request
+    CreateKeyspace (..),
+    newCreateKeyspace,
+
+    -- * Request Lenses
+    createKeyspace_tags,
+    createKeyspace_keyspaceName,
+
+    -- * Destructuring the Response
+    CreateKeyspaceResponse (..),
+    newCreateKeyspaceResponse,
+
+    -- * Response Lenses
+    createKeyspaceResponse_httpStatus,
+    createKeyspaceResponse_resourceArn,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateKeyspace' smart constructor.
+data CreateKeyspace = CreateKeyspace'
+  { -- | A list of key-value pair tags to be attached to the keyspace.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | The name of the keyspace to be created.
+    keyspaceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateKeyspace' 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', 'createKeyspace_tags' - A list of key-value pair tags to be attached to the keyspace.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'keyspaceName', 'createKeyspace_keyspaceName' - The name of the keyspace to be created.
+newCreateKeyspace ::
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  CreateKeyspace
+newCreateKeyspace pKeyspaceName_ =
+  CreateKeyspace'
+    { tags = Prelude.Nothing,
+      keyspaceName = pKeyspaceName_
+    }
+
+-- | A list of key-value pair tags to be attached to the keyspace.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+-- in the /Amazon Keyspaces Developer Guide/.
+createKeyspace_tags :: Lens.Lens' CreateKeyspace (Prelude.Maybe (Prelude.NonEmpty Tag))
+createKeyspace_tags = Lens.lens (\CreateKeyspace' {tags} -> tags) (\s@CreateKeyspace' {} a -> s {tags = a} :: CreateKeyspace) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the keyspace to be created.
+createKeyspace_keyspaceName :: Lens.Lens' CreateKeyspace Prelude.Text
+createKeyspace_keyspaceName = Lens.lens (\CreateKeyspace' {keyspaceName} -> keyspaceName) (\s@CreateKeyspace' {} a -> s {keyspaceName = a} :: CreateKeyspace)
+
+instance Core.AWSRequest CreateKeyspace where
+  type
+    AWSResponse CreateKeyspace =
+      CreateKeyspaceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateKeyspaceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "resourceArn")
+      )
+
+instance Prelude.Hashable CreateKeyspace where
+  hashWithSalt _salt CreateKeyspace' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` keyspaceName
+
+instance Prelude.NFData CreateKeyspace where
+  rnf CreateKeyspace' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf keyspaceName
+
+instance Data.ToHeaders CreateKeyspace where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.CreateKeyspace" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateKeyspace where
+  toJSON CreateKeyspace' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("keyspaceName" Data..= keyspaceName)
+          ]
+      )
+
+instance Data.ToPath CreateKeyspace where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateKeyspace where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateKeyspaceResponse' smart constructor.
+data CreateKeyspaceResponse = CreateKeyspaceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The unique identifier of the keyspace in the format of an Amazon
+    -- Resource Name (ARN).
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateKeyspaceResponse' 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:
+--
+-- 'httpStatus', 'createKeyspaceResponse_httpStatus' - The response's http status code.
+--
+-- 'resourceArn', 'createKeyspaceResponse_resourceArn' - The unique identifier of the keyspace in the format of an Amazon
+-- Resource Name (ARN).
+newCreateKeyspaceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'resourceArn'
+  Prelude.Text ->
+  CreateKeyspaceResponse
+newCreateKeyspaceResponse pHttpStatus_ pResourceArn_ =
+  CreateKeyspaceResponse'
+    { httpStatus = pHttpStatus_,
+      resourceArn = pResourceArn_
+    }
+
+-- | The response's http status code.
+createKeyspaceResponse_httpStatus :: Lens.Lens' CreateKeyspaceResponse Prelude.Int
+createKeyspaceResponse_httpStatus = Lens.lens (\CreateKeyspaceResponse' {httpStatus} -> httpStatus) (\s@CreateKeyspaceResponse' {} a -> s {httpStatus = a} :: CreateKeyspaceResponse)
+
+-- | The unique identifier of the keyspace in the format of an Amazon
+-- Resource Name (ARN).
+createKeyspaceResponse_resourceArn :: Lens.Lens' CreateKeyspaceResponse Prelude.Text
+createKeyspaceResponse_resourceArn = Lens.lens (\CreateKeyspaceResponse' {resourceArn} -> resourceArn) (\s@CreateKeyspaceResponse' {} a -> s {resourceArn = a} :: CreateKeyspaceResponse)
+
+instance Prelude.NFData CreateKeyspaceResponse where
+  rnf CreateKeyspaceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf resourceArn
diff --git a/gen/Amazonka/KeySpaces/CreateTable.hs b/gen/Amazonka/KeySpaces/CreateTable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/CreateTable.hs
@@ -0,0 +1,583 @@
+{-# 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.KeySpaces.CreateTable
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The @CreateTable@ operation adds a new table to the specified keyspace.
+-- Within a keyspace, table names must be unique.
+--
+-- @CreateTable@ is an asynchronous operation. When the request is
+-- received, the status of the table is set to @CREATING@. You can monitor
+-- the creation status of the new table by using the @GetTable@ operation,
+-- which returns the current @status@ of the table. You can start using a
+-- table when the status is @ACTIVE@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/working-with-tables.html#tables-create Creating tables>
+-- in the /Amazon Keyspaces Developer Guide/.
+module Amazonka.KeySpaces.CreateTable
+  ( -- * Creating a Request
+    CreateTable (..),
+    newCreateTable,
+
+    -- * Request Lenses
+    createTable_capacitySpecification,
+    createTable_comment,
+    createTable_defaultTimeToLive,
+    createTable_encryptionSpecification,
+    createTable_pointInTimeRecovery,
+    createTable_tags,
+    createTable_ttl,
+    createTable_keyspaceName,
+    createTable_tableName,
+    createTable_schemaDefinition,
+
+    -- * Destructuring the Response
+    CreateTableResponse (..),
+    newCreateTableResponse,
+
+    -- * Response Lenses
+    createTableResponse_httpStatus,
+    createTableResponse_resourceArn,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateTable' smart constructor.
+data CreateTable = CreateTable'
+  { -- | Specifies the read\/write throughput capacity mode for the table. The
+    -- options are:
+    --
+    -- • @throughputMode:PAY_PER_REQUEST@ and
+    --
+    -- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+    -- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+    --
+    -- The default is @throughput_mode:PAY_PER_REQUEST@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    capacitySpecification :: Prelude.Maybe CapacitySpecification,
+    -- | This parameter allows to enter a description of the table.
+    comment :: Prelude.Maybe Comment,
+    -- | The default Time to Live setting in seconds for the table.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL-how-it-works.html#ttl-howitworks_default_ttl Setting the default TTL value for a table>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    defaultTimeToLive :: Prelude.Maybe Prelude.Natural,
+    -- | Specifies how the encryption key for encryption at rest is managed for
+    -- the table. You can choose one of the following KMS key (KMS key):
+    --
+    -- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+    --
+    -- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+    -- and is created, owned, and managed by you. This option requires the
+    -- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+    -- as input.
+    --
+    -- The default is @type:AWS_OWNED_KMS_KEY@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    encryptionSpecification :: Prelude.Maybe EncryptionSpecification,
+    -- | Specifies if @pointInTimeRecovery@ is enabled or disabled for the table.
+    -- The options are:
+    --
+    -- • @ENABLED@
+    --
+    -- • @DISABLED@
+    --
+    -- If it\'s not specified, the default is @DISABLED@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery.html Point-in-time recovery>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    pointInTimeRecovery :: Prelude.Maybe PointInTimeRecovery,
+    -- | A list of key-value pair tags to be attached to the resource.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | Enables Time to Live custom settings for the table. The options are:
+    --
+    -- • @status:enabled@
+    --
+    -- • @status:disabled@
+    --
+    -- The default is @status:disabled@. After @ttl@ is enabled, you can\'t
+    -- disable it for the table.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL.html Expiring data by using Amazon Keyspaces Time to Live (TTL)>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    ttl :: Prelude.Maybe TimeToLive,
+    -- | The name of the keyspace that the table is going to be created in.
+    keyspaceName :: Prelude.Text,
+    -- | The name of the table.
+    tableName :: Prelude.Text,
+    -- | The @schemaDefinition@ consists of the following parameters.
+    --
+    -- For each column to be created:
+    --
+    -- • @name@ - The name of the column.
+    --
+    -- • @type@ - An Amazon Keyspaces data type. For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.data-types Data types>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    --
+    -- The primary key of the table consists of the following columns:
+    --
+    -- • @partitionKeys@ - The partition key can be a single column, or it can
+    -- be a compound value composed of two or more columns. The partition key
+    -- portion of the primary key is required and determines how Amazon
+    -- Keyspaces stores your data.
+    --
+    -- • @name@ - The name of each partition key column.
+    --
+    -- • @clusteringKeys@ - The optional clustering column portion of your
+    -- primary key determines how the data is clustered and sorted within each
+    -- partition.
+    --
+    -- • @name@ - The name of the clustering column.
+    --
+    -- • @orderBy@ - Sets the ascendant (@ASC@) or descendant (@DESC@) order
+    -- modifier.
+    --
+    -- To define a column as static use @staticColumns@ - Static columns store
+    -- values that are shared by all rows in the same partition:
+    --
+    -- • @name@ - The name of the column.
+    --
+    -- • @type@ - An Amazon Keyspaces data type.
+    schemaDefinition :: SchemaDefinition
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateTable' 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:
+--
+-- 'capacitySpecification', 'createTable_capacitySpecification' - Specifies the read\/write throughput capacity mode for the table. The
+-- options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@ and
+--
+-- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+-- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+--
+-- The default is @throughput_mode:PAY_PER_REQUEST@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'comment', 'createTable_comment' - This parameter allows to enter a description of the table.
+--
+-- 'defaultTimeToLive', 'createTable_defaultTimeToLive' - The default Time to Live setting in seconds for the table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL-how-it-works.html#ttl-howitworks_default_ttl Setting the default TTL value for a table>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'encryptionSpecification', 'createTable_encryptionSpecification' - Specifies how the encryption key for encryption at rest is managed for
+-- the table. You can choose one of the following KMS key (KMS key):
+--
+-- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+--
+-- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+-- and is created, owned, and managed by you. This option requires the
+-- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+-- as input.
+--
+-- The default is @type:AWS_OWNED_KMS_KEY@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'pointInTimeRecovery', 'createTable_pointInTimeRecovery' - Specifies if @pointInTimeRecovery@ is enabled or disabled for the table.
+-- The options are:
+--
+-- • @ENABLED@
+--
+-- • @DISABLED@
+--
+-- If it\'s not specified, the default is @DISABLED@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery.html Point-in-time recovery>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'tags', 'createTable_tags' - A list of key-value pair tags to be attached to the resource.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'ttl', 'createTable_ttl' - Enables Time to Live custom settings for the table. The options are:
+--
+-- • @status:enabled@
+--
+-- • @status:disabled@
+--
+-- The default is @status:disabled@. After @ttl@ is enabled, you can\'t
+-- disable it for the table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL.html Expiring data by using Amazon Keyspaces Time to Live (TTL)>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'keyspaceName', 'createTable_keyspaceName' - The name of the keyspace that the table is going to be created in.
+--
+-- 'tableName', 'createTable_tableName' - The name of the table.
+--
+-- 'schemaDefinition', 'createTable_schemaDefinition' - The @schemaDefinition@ consists of the following parameters.
+--
+-- For each column to be created:
+--
+-- • @name@ - The name of the column.
+--
+-- • @type@ - An Amazon Keyspaces data type. For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.data-types Data types>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- The primary key of the table consists of the following columns:
+--
+-- • @partitionKeys@ - The partition key can be a single column, or it can
+-- be a compound value composed of two or more columns. The partition key
+-- portion of the primary key is required and determines how Amazon
+-- Keyspaces stores your data.
+--
+-- • @name@ - The name of each partition key column.
+--
+-- • @clusteringKeys@ - The optional clustering column portion of your
+-- primary key determines how the data is clustered and sorted within each
+-- partition.
+--
+-- • @name@ - The name of the clustering column.
+--
+-- • @orderBy@ - Sets the ascendant (@ASC@) or descendant (@DESC@) order
+-- modifier.
+--
+-- To define a column as static use @staticColumns@ - Static columns store
+-- values that are shared by all rows in the same partition:
+--
+-- • @name@ - The name of the column.
+--
+-- • @type@ - An Amazon Keyspaces data type.
+newCreateTable ::
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  -- | 'schemaDefinition'
+  SchemaDefinition ->
+  CreateTable
+newCreateTable
+  pKeyspaceName_
+  pTableName_
+  pSchemaDefinition_ =
+    CreateTable'
+      { capacitySpecification =
+          Prelude.Nothing,
+        comment = Prelude.Nothing,
+        defaultTimeToLive = Prelude.Nothing,
+        encryptionSpecification = Prelude.Nothing,
+        pointInTimeRecovery = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        ttl = Prelude.Nothing,
+        keyspaceName = pKeyspaceName_,
+        tableName = pTableName_,
+        schemaDefinition = pSchemaDefinition_
+      }
+
+-- | Specifies the read\/write throughput capacity mode for the table. The
+-- options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@ and
+--
+-- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+-- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+--
+-- The default is @throughput_mode:PAY_PER_REQUEST@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+createTable_capacitySpecification :: Lens.Lens' CreateTable (Prelude.Maybe CapacitySpecification)
+createTable_capacitySpecification = Lens.lens (\CreateTable' {capacitySpecification} -> capacitySpecification) (\s@CreateTable' {} a -> s {capacitySpecification = a} :: CreateTable)
+
+-- | This parameter allows to enter a description of the table.
+createTable_comment :: Lens.Lens' CreateTable (Prelude.Maybe Comment)
+createTable_comment = Lens.lens (\CreateTable' {comment} -> comment) (\s@CreateTable' {} a -> s {comment = a} :: CreateTable)
+
+-- | The default Time to Live setting in seconds for the table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL-how-it-works.html#ttl-howitworks_default_ttl Setting the default TTL value for a table>
+-- in the /Amazon Keyspaces Developer Guide/.
+createTable_defaultTimeToLive :: Lens.Lens' CreateTable (Prelude.Maybe Prelude.Natural)
+createTable_defaultTimeToLive = Lens.lens (\CreateTable' {defaultTimeToLive} -> defaultTimeToLive) (\s@CreateTable' {} a -> s {defaultTimeToLive = a} :: CreateTable)
+
+-- | Specifies how the encryption key for encryption at rest is managed for
+-- the table. You can choose one of the following KMS key (KMS key):
+--
+-- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+--
+-- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+-- and is created, owned, and managed by you. This option requires the
+-- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+-- as input.
+--
+-- The default is @type:AWS_OWNED_KMS_KEY@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+-- in the /Amazon Keyspaces Developer Guide/.
+createTable_encryptionSpecification :: Lens.Lens' CreateTable (Prelude.Maybe EncryptionSpecification)
+createTable_encryptionSpecification = Lens.lens (\CreateTable' {encryptionSpecification} -> encryptionSpecification) (\s@CreateTable' {} a -> s {encryptionSpecification = a} :: CreateTable)
+
+-- | Specifies if @pointInTimeRecovery@ is enabled or disabled for the table.
+-- The options are:
+--
+-- • @ENABLED@
+--
+-- • @DISABLED@
+--
+-- If it\'s not specified, the default is @DISABLED@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery.html Point-in-time recovery>
+-- in the /Amazon Keyspaces Developer Guide/.
+createTable_pointInTimeRecovery :: Lens.Lens' CreateTable (Prelude.Maybe PointInTimeRecovery)
+createTable_pointInTimeRecovery = Lens.lens (\CreateTable' {pointInTimeRecovery} -> pointInTimeRecovery) (\s@CreateTable' {} a -> s {pointInTimeRecovery = a} :: CreateTable)
+
+-- | A list of key-value pair tags to be attached to the resource.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+-- in the /Amazon Keyspaces Developer Guide/.
+createTable_tags :: Lens.Lens' CreateTable (Prelude.Maybe (Prelude.NonEmpty Tag))
+createTable_tags = Lens.lens (\CreateTable' {tags} -> tags) (\s@CreateTable' {} a -> s {tags = a} :: CreateTable) Prelude.. Lens.mapping Lens.coerced
+
+-- | Enables Time to Live custom settings for the table. The options are:
+--
+-- • @status:enabled@
+--
+-- • @status:disabled@
+--
+-- The default is @status:disabled@. After @ttl@ is enabled, you can\'t
+-- disable it for the table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL.html Expiring data by using Amazon Keyspaces Time to Live (TTL)>
+-- in the /Amazon Keyspaces Developer Guide/.
+createTable_ttl :: Lens.Lens' CreateTable (Prelude.Maybe TimeToLive)
+createTable_ttl = Lens.lens (\CreateTable' {ttl} -> ttl) (\s@CreateTable' {} a -> s {ttl = a} :: CreateTable)
+
+-- | The name of the keyspace that the table is going to be created in.
+createTable_keyspaceName :: Lens.Lens' CreateTable Prelude.Text
+createTable_keyspaceName = Lens.lens (\CreateTable' {keyspaceName} -> keyspaceName) (\s@CreateTable' {} a -> s {keyspaceName = a} :: CreateTable)
+
+-- | The name of the table.
+createTable_tableName :: Lens.Lens' CreateTable Prelude.Text
+createTable_tableName = Lens.lens (\CreateTable' {tableName} -> tableName) (\s@CreateTable' {} a -> s {tableName = a} :: CreateTable)
+
+-- | The @schemaDefinition@ consists of the following parameters.
+--
+-- For each column to be created:
+--
+-- • @name@ - The name of the column.
+--
+-- • @type@ - An Amazon Keyspaces data type. For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.data-types Data types>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- The primary key of the table consists of the following columns:
+--
+-- • @partitionKeys@ - The partition key can be a single column, or it can
+-- be a compound value composed of two or more columns. The partition key
+-- portion of the primary key is required and determines how Amazon
+-- Keyspaces stores your data.
+--
+-- • @name@ - The name of each partition key column.
+--
+-- • @clusteringKeys@ - The optional clustering column portion of your
+-- primary key determines how the data is clustered and sorted within each
+-- partition.
+--
+-- • @name@ - The name of the clustering column.
+--
+-- • @orderBy@ - Sets the ascendant (@ASC@) or descendant (@DESC@) order
+-- modifier.
+--
+-- To define a column as static use @staticColumns@ - Static columns store
+-- values that are shared by all rows in the same partition:
+--
+-- • @name@ - The name of the column.
+--
+-- • @type@ - An Amazon Keyspaces data type.
+createTable_schemaDefinition :: Lens.Lens' CreateTable SchemaDefinition
+createTable_schemaDefinition = Lens.lens (\CreateTable' {schemaDefinition} -> schemaDefinition) (\s@CreateTable' {} a -> s {schemaDefinition = a} :: CreateTable)
+
+instance Core.AWSRequest CreateTable where
+  type AWSResponse CreateTable = CreateTableResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateTableResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "resourceArn")
+      )
+
+instance Prelude.Hashable CreateTable where
+  hashWithSalt _salt CreateTable' {..} =
+    _salt
+      `Prelude.hashWithSalt` capacitySpecification
+      `Prelude.hashWithSalt` comment
+      `Prelude.hashWithSalt` defaultTimeToLive
+      `Prelude.hashWithSalt` encryptionSpecification
+      `Prelude.hashWithSalt` pointInTimeRecovery
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` ttl
+      `Prelude.hashWithSalt` keyspaceName
+      `Prelude.hashWithSalt` tableName
+      `Prelude.hashWithSalt` schemaDefinition
+
+instance Prelude.NFData CreateTable where
+  rnf CreateTable' {..} =
+    Prelude.rnf capacitySpecification
+      `Prelude.seq` Prelude.rnf comment
+      `Prelude.seq` Prelude.rnf defaultTimeToLive
+      `Prelude.seq` Prelude.rnf encryptionSpecification
+      `Prelude.seq` Prelude.rnf pointInTimeRecovery
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf ttl
+      `Prelude.seq` Prelude.rnf keyspaceName
+      `Prelude.seq` Prelude.rnf tableName
+      `Prelude.seq` Prelude.rnf schemaDefinition
+
+instance Data.ToHeaders CreateTable where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.CreateTable" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateTable where
+  toJSON CreateTable' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("capacitySpecification" Data..=)
+              Prelude.<$> capacitySpecification,
+            ("comment" Data..=) Prelude.<$> comment,
+            ("defaultTimeToLive" Data..=)
+              Prelude.<$> defaultTimeToLive,
+            ("encryptionSpecification" Data..=)
+              Prelude.<$> encryptionSpecification,
+            ("pointInTimeRecovery" Data..=)
+              Prelude.<$> pointInTimeRecovery,
+            ("tags" Data..=) Prelude.<$> tags,
+            ("ttl" Data..=) Prelude.<$> ttl,
+            Prelude.Just ("keyspaceName" Data..= keyspaceName),
+            Prelude.Just ("tableName" Data..= tableName),
+            Prelude.Just
+              ("schemaDefinition" Data..= schemaDefinition)
+          ]
+      )
+
+instance Data.ToPath CreateTable where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateTable where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateTableResponse' smart constructor.
+data CreateTableResponse = CreateTableResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The unique identifier of the table in the format of an Amazon Resource
+    -- Name (ARN).
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateTableResponse' 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:
+--
+-- 'httpStatus', 'createTableResponse_httpStatus' - The response's http status code.
+--
+-- 'resourceArn', 'createTableResponse_resourceArn' - The unique identifier of the table in the format of an Amazon Resource
+-- Name (ARN).
+newCreateTableResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'resourceArn'
+  Prelude.Text ->
+  CreateTableResponse
+newCreateTableResponse pHttpStatus_ pResourceArn_ =
+  CreateTableResponse'
+    { httpStatus = pHttpStatus_,
+      resourceArn = pResourceArn_
+    }
+
+-- | The response's http status code.
+createTableResponse_httpStatus :: Lens.Lens' CreateTableResponse Prelude.Int
+createTableResponse_httpStatus = Lens.lens (\CreateTableResponse' {httpStatus} -> httpStatus) (\s@CreateTableResponse' {} a -> s {httpStatus = a} :: CreateTableResponse)
+
+-- | The unique identifier of the table in the format of an Amazon Resource
+-- Name (ARN).
+createTableResponse_resourceArn :: Lens.Lens' CreateTableResponse Prelude.Text
+createTableResponse_resourceArn = Lens.lens (\CreateTableResponse' {resourceArn} -> resourceArn) (\s@CreateTableResponse' {} a -> s {resourceArn = a} :: CreateTableResponse)
+
+instance Prelude.NFData CreateTableResponse where
+  rnf CreateTableResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf resourceArn
diff --git a/gen/Amazonka/KeySpaces/DeleteKeyspace.hs b/gen/Amazonka/KeySpaces/DeleteKeyspace.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/DeleteKeyspace.hs
@@ -0,0 +1,153 @@
+{-# 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.KeySpaces.DeleteKeyspace
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The @DeleteKeyspace@ operation deletes a keyspace and all of its tables.
+module Amazonka.KeySpaces.DeleteKeyspace
+  ( -- * Creating a Request
+    DeleteKeyspace (..),
+    newDeleteKeyspace,
+
+    -- * Request Lenses
+    deleteKeyspace_keyspaceName,
+
+    -- * Destructuring the Response
+    DeleteKeyspaceResponse (..),
+    newDeleteKeyspaceResponse,
+
+    -- * Response Lenses
+    deleteKeyspaceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteKeyspace' smart constructor.
+data DeleteKeyspace = DeleteKeyspace'
+  { -- | The name of the keyspace to be deleted.
+    keyspaceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteKeyspace' 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:
+--
+-- 'keyspaceName', 'deleteKeyspace_keyspaceName' - The name of the keyspace to be deleted.
+newDeleteKeyspace ::
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  DeleteKeyspace
+newDeleteKeyspace pKeyspaceName_ =
+  DeleteKeyspace' {keyspaceName = pKeyspaceName_}
+
+-- | The name of the keyspace to be deleted.
+deleteKeyspace_keyspaceName :: Lens.Lens' DeleteKeyspace Prelude.Text
+deleteKeyspace_keyspaceName = Lens.lens (\DeleteKeyspace' {keyspaceName} -> keyspaceName) (\s@DeleteKeyspace' {} a -> s {keyspaceName = a} :: DeleteKeyspace)
+
+instance Core.AWSRequest DeleteKeyspace where
+  type
+    AWSResponse DeleteKeyspace =
+      DeleteKeyspaceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteKeyspaceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteKeyspace where
+  hashWithSalt _salt DeleteKeyspace' {..} =
+    _salt `Prelude.hashWithSalt` keyspaceName
+
+instance Prelude.NFData DeleteKeyspace where
+  rnf DeleteKeyspace' {..} = Prelude.rnf keyspaceName
+
+instance Data.ToHeaders DeleteKeyspace where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.DeleteKeyspace" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteKeyspace where
+  toJSON DeleteKeyspace' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("keyspaceName" Data..= keyspaceName)]
+      )
+
+instance Data.ToPath DeleteKeyspace where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteKeyspace where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteKeyspaceResponse' smart constructor.
+data DeleteKeyspaceResponse = DeleteKeyspaceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteKeyspaceResponse' 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:
+--
+-- 'httpStatus', 'deleteKeyspaceResponse_httpStatus' - The response's http status code.
+newDeleteKeyspaceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteKeyspaceResponse
+newDeleteKeyspaceResponse pHttpStatus_ =
+  DeleteKeyspaceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteKeyspaceResponse_httpStatus :: Lens.Lens' DeleteKeyspaceResponse Prelude.Int
+deleteKeyspaceResponse_httpStatus = Lens.lens (\DeleteKeyspaceResponse' {httpStatus} -> httpStatus) (\s@DeleteKeyspaceResponse' {} a -> s {httpStatus = a} :: DeleteKeyspaceResponse)
+
+instance Prelude.NFData DeleteKeyspaceResponse where
+  rnf DeleteKeyspaceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/KeySpaces/DeleteTable.hs b/gen/Amazonka/KeySpaces/DeleteTable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/DeleteTable.hs
@@ -0,0 +1,177 @@
+{-# 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.KeySpaces.DeleteTable
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The @DeleteTable@ operation deletes a table and all of its data. After a
+-- @DeleteTable@ request is received, the specified table is in the
+-- @DELETING@ state until Amazon Keyspaces completes the deletion. If the
+-- table is in the @ACTIVE@ state, you can delete it. If a table is either
+-- in the @CREATING@ or @UPDATING@ states, then Amazon Keyspaces returns a
+-- @ResourceInUseException@. If the specified table does not exist, Amazon
+-- Keyspaces returns a @ResourceNotFoundException@. If the table is already
+-- in the @DELETING@ state, no error is returned.
+module Amazonka.KeySpaces.DeleteTable
+  ( -- * Creating a Request
+    DeleteTable (..),
+    newDeleteTable,
+
+    -- * Request Lenses
+    deleteTable_keyspaceName,
+    deleteTable_tableName,
+
+    -- * Destructuring the Response
+    DeleteTableResponse (..),
+    newDeleteTableResponse,
+
+    -- * Response Lenses
+    deleteTableResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteTable' smart constructor.
+data DeleteTable = DeleteTable'
+  { -- | The name of the keyspace of the to be deleted table.
+    keyspaceName :: Prelude.Text,
+    -- | The name of the table to be deleted.
+    tableName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteTable' 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:
+--
+-- 'keyspaceName', 'deleteTable_keyspaceName' - The name of the keyspace of the to be deleted table.
+--
+-- 'tableName', 'deleteTable_tableName' - The name of the table to be deleted.
+newDeleteTable ::
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  DeleteTable
+newDeleteTable pKeyspaceName_ pTableName_ =
+  DeleteTable'
+    { keyspaceName = pKeyspaceName_,
+      tableName = pTableName_
+    }
+
+-- | The name of the keyspace of the to be deleted table.
+deleteTable_keyspaceName :: Lens.Lens' DeleteTable Prelude.Text
+deleteTable_keyspaceName = Lens.lens (\DeleteTable' {keyspaceName} -> keyspaceName) (\s@DeleteTable' {} a -> s {keyspaceName = a} :: DeleteTable)
+
+-- | The name of the table to be deleted.
+deleteTable_tableName :: Lens.Lens' DeleteTable Prelude.Text
+deleteTable_tableName = Lens.lens (\DeleteTable' {tableName} -> tableName) (\s@DeleteTable' {} a -> s {tableName = a} :: DeleteTable)
+
+instance Core.AWSRequest DeleteTable where
+  type AWSResponse DeleteTable = DeleteTableResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteTableResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteTable where
+  hashWithSalt _salt DeleteTable' {..} =
+    _salt
+      `Prelude.hashWithSalt` keyspaceName
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData DeleteTable where
+  rnf DeleteTable' {..} =
+    Prelude.rnf keyspaceName
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders DeleteTable where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.DeleteTable" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteTable where
+  toJSON DeleteTable' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("keyspaceName" Data..= keyspaceName),
+            Prelude.Just ("tableName" Data..= tableName)
+          ]
+      )
+
+instance Data.ToPath DeleteTable where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteTable where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteTableResponse' smart constructor.
+data DeleteTableResponse = DeleteTableResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteTableResponse' 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:
+--
+-- 'httpStatus', 'deleteTableResponse_httpStatus' - The response's http status code.
+newDeleteTableResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteTableResponse
+newDeleteTableResponse pHttpStatus_ =
+  DeleteTableResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteTableResponse_httpStatus :: Lens.Lens' DeleteTableResponse Prelude.Int
+deleteTableResponse_httpStatus = Lens.lens (\DeleteTableResponse' {httpStatus} -> httpStatus) (\s@DeleteTableResponse' {} a -> s {httpStatus = a} :: DeleteTableResponse)
+
+instance Prelude.NFData DeleteTableResponse where
+  rnf DeleteTableResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/KeySpaces/GetKeyspace.hs b/gen/Amazonka/KeySpaces/GetKeyspace.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/GetKeyspace.hs
@@ -0,0 +1,185 @@
+{-# 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.KeySpaces.GetKeyspace
+-- 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 name and the Amazon Resource Name (ARN) of the specified
+-- table.
+module Amazonka.KeySpaces.GetKeyspace
+  ( -- * Creating a Request
+    GetKeyspace (..),
+    newGetKeyspace,
+
+    -- * Request Lenses
+    getKeyspace_keyspaceName,
+
+    -- * Destructuring the Response
+    GetKeyspaceResponse (..),
+    newGetKeyspaceResponse,
+
+    -- * Response Lenses
+    getKeyspaceResponse_httpStatus,
+    getKeyspaceResponse_keyspaceName,
+    getKeyspaceResponse_resourceArn,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetKeyspace' smart constructor.
+data GetKeyspace = GetKeyspace'
+  { -- | The name of the keyspace.
+    keyspaceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetKeyspace' 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:
+--
+-- 'keyspaceName', 'getKeyspace_keyspaceName' - The name of the keyspace.
+newGetKeyspace ::
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  GetKeyspace
+newGetKeyspace pKeyspaceName_ =
+  GetKeyspace' {keyspaceName = pKeyspaceName_}
+
+-- | The name of the keyspace.
+getKeyspace_keyspaceName :: Lens.Lens' GetKeyspace Prelude.Text
+getKeyspace_keyspaceName = Lens.lens (\GetKeyspace' {keyspaceName} -> keyspaceName) (\s@GetKeyspace' {} a -> s {keyspaceName = a} :: GetKeyspace)
+
+instance Core.AWSRequest GetKeyspace where
+  type AWSResponse GetKeyspace = GetKeyspaceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetKeyspaceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "keyspaceName")
+            Prelude.<*> (x Data..:> "resourceArn")
+      )
+
+instance Prelude.Hashable GetKeyspace where
+  hashWithSalt _salt GetKeyspace' {..} =
+    _salt `Prelude.hashWithSalt` keyspaceName
+
+instance Prelude.NFData GetKeyspace where
+  rnf GetKeyspace' {..} = Prelude.rnf keyspaceName
+
+instance Data.ToHeaders GetKeyspace where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.GetKeyspace" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetKeyspace where
+  toJSON GetKeyspace' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("keyspaceName" Data..= keyspaceName)]
+      )
+
+instance Data.ToPath GetKeyspace where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetKeyspace where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetKeyspaceResponse' smart constructor.
+data GetKeyspaceResponse = GetKeyspaceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The name of the keyspace.
+    keyspaceName :: Prelude.Text,
+    -- | The ARN of the keyspace.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetKeyspaceResponse' 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:
+--
+-- 'httpStatus', 'getKeyspaceResponse_httpStatus' - The response's http status code.
+--
+-- 'keyspaceName', 'getKeyspaceResponse_keyspaceName' - The name of the keyspace.
+--
+-- 'resourceArn', 'getKeyspaceResponse_resourceArn' - The ARN of the keyspace.
+newGetKeyspaceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  -- | 'resourceArn'
+  Prelude.Text ->
+  GetKeyspaceResponse
+newGetKeyspaceResponse
+  pHttpStatus_
+  pKeyspaceName_
+  pResourceArn_ =
+    GetKeyspaceResponse'
+      { httpStatus = pHttpStatus_,
+        keyspaceName = pKeyspaceName_,
+        resourceArn = pResourceArn_
+      }
+
+-- | The response's http status code.
+getKeyspaceResponse_httpStatus :: Lens.Lens' GetKeyspaceResponse Prelude.Int
+getKeyspaceResponse_httpStatus = Lens.lens (\GetKeyspaceResponse' {httpStatus} -> httpStatus) (\s@GetKeyspaceResponse' {} a -> s {httpStatus = a} :: GetKeyspaceResponse)
+
+-- | The name of the keyspace.
+getKeyspaceResponse_keyspaceName :: Lens.Lens' GetKeyspaceResponse Prelude.Text
+getKeyspaceResponse_keyspaceName = Lens.lens (\GetKeyspaceResponse' {keyspaceName} -> keyspaceName) (\s@GetKeyspaceResponse' {} a -> s {keyspaceName = a} :: GetKeyspaceResponse)
+
+-- | The ARN of the keyspace.
+getKeyspaceResponse_resourceArn :: Lens.Lens' GetKeyspaceResponse Prelude.Text
+getKeyspaceResponse_resourceArn = Lens.lens (\GetKeyspaceResponse' {resourceArn} -> resourceArn) (\s@GetKeyspaceResponse' {} a -> s {resourceArn = a} :: GetKeyspaceResponse)
+
+instance Prelude.NFData GetKeyspaceResponse where
+  rnf GetKeyspaceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf keyspaceName
+      `Prelude.seq` Prelude.rnf resourceArn
diff --git a/gen/Amazonka/KeySpaces/GetTable.hs b/gen/Amazonka/KeySpaces/GetTable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/GetTable.hs
@@ -0,0 +1,342 @@
+{-# 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.KeySpaces.GetTable
+-- 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 the table, including the table\'s name and
+-- current status, the keyspace name, configuration settings, and metadata.
+--
+-- To read table metadata using @GetTable@, @Select@ action permissions for
+-- the table and system tables are required to complete the operation.
+module Amazonka.KeySpaces.GetTable
+  ( -- * Creating a Request
+    GetTable (..),
+    newGetTable,
+
+    -- * Request Lenses
+    getTable_keyspaceName,
+    getTable_tableName,
+
+    -- * Destructuring the Response
+    GetTableResponse (..),
+    newGetTableResponse,
+
+    -- * Response Lenses
+    getTableResponse_capacitySpecification,
+    getTableResponse_comment,
+    getTableResponse_creationTimestamp,
+    getTableResponse_defaultTimeToLive,
+    getTableResponse_encryptionSpecification,
+    getTableResponse_pointInTimeRecovery,
+    getTableResponse_schemaDefinition,
+    getTableResponse_status,
+    getTableResponse_ttl,
+    getTableResponse_httpStatus,
+    getTableResponse_keyspaceName,
+    getTableResponse_tableName,
+    getTableResponse_resourceArn,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetTable' smart constructor.
+data GetTable = GetTable'
+  { -- | The name of the keyspace that the table is stored in.
+    keyspaceName :: Prelude.Text,
+    -- | The name of the table.
+    tableName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetTable' 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:
+--
+-- 'keyspaceName', 'getTable_keyspaceName' - The name of the keyspace that the table is stored in.
+--
+-- 'tableName', 'getTable_tableName' - The name of the table.
+newGetTable ::
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  GetTable
+newGetTable pKeyspaceName_ pTableName_ =
+  GetTable'
+    { keyspaceName = pKeyspaceName_,
+      tableName = pTableName_
+    }
+
+-- | The name of the keyspace that the table is stored in.
+getTable_keyspaceName :: Lens.Lens' GetTable Prelude.Text
+getTable_keyspaceName = Lens.lens (\GetTable' {keyspaceName} -> keyspaceName) (\s@GetTable' {} a -> s {keyspaceName = a} :: GetTable)
+
+-- | The name of the table.
+getTable_tableName :: Lens.Lens' GetTable Prelude.Text
+getTable_tableName = Lens.lens (\GetTable' {tableName} -> tableName) (\s@GetTable' {} a -> s {tableName = a} :: GetTable)
+
+instance Core.AWSRequest GetTable where
+  type AWSResponse GetTable = GetTableResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetTableResponse'
+            Prelude.<$> (x Data..?> "capacitySpecification")
+            Prelude.<*> (x Data..?> "comment")
+            Prelude.<*> (x Data..?> "creationTimestamp")
+            Prelude.<*> (x Data..?> "defaultTimeToLive")
+            Prelude.<*> (x Data..?> "encryptionSpecification")
+            Prelude.<*> (x Data..?> "pointInTimeRecovery")
+            Prelude.<*> (x Data..?> "schemaDefinition")
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (x Data..?> "ttl")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "keyspaceName")
+            Prelude.<*> (x Data..:> "tableName")
+            Prelude.<*> (x Data..:> "resourceArn")
+      )
+
+instance Prelude.Hashable GetTable where
+  hashWithSalt _salt GetTable' {..} =
+    _salt
+      `Prelude.hashWithSalt` keyspaceName
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData GetTable where
+  rnf GetTable' {..} =
+    Prelude.rnf keyspaceName
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders GetTable where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("KeyspacesService.GetTable" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetTable where
+  toJSON GetTable' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("keyspaceName" Data..= keyspaceName),
+            Prelude.Just ("tableName" Data..= tableName)
+          ]
+      )
+
+instance Data.ToPath GetTable where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetTable where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetTableResponse' smart constructor.
+data GetTableResponse = GetTableResponse'
+  { -- | The read\/write throughput capacity mode for a table. The options are:
+    --
+    -- • @throughputMode:PAY_PER_REQUEST@
+    --
+    -- • @throughputMode:PROVISIONED@
+    capacitySpecification :: Prelude.Maybe CapacitySpecificationSummary,
+    -- | The the description of the specified table.
+    comment :: Prelude.Maybe Comment,
+    -- | The creation timestamp of the specified table.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The default Time to Live settings of the specified table.
+    defaultTimeToLive :: Prelude.Maybe Prelude.Natural,
+    -- | The encryption settings of the specified table.
+    encryptionSpecification :: Prelude.Maybe EncryptionSpecification,
+    -- | The point-in-time recovery status of the specified table.
+    pointInTimeRecovery :: Prelude.Maybe PointInTimeRecoverySummary,
+    -- | The schema definition of the specified table.
+    schemaDefinition :: Prelude.Maybe SchemaDefinition,
+    -- | The current status of the specified table.
+    status :: Prelude.Maybe TableStatus,
+    -- | The custom Time to Live settings of the specified table.
+    ttl :: Prelude.Maybe TimeToLive,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The name of the keyspace that the specified table is stored in.
+    keyspaceName :: Prelude.Text,
+    -- | The name of the specified table.
+    tableName :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the specified table.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetTableResponse' 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:
+--
+-- 'capacitySpecification', 'getTableResponse_capacitySpecification' - The read\/write throughput capacity mode for a table. The options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@
+--
+-- • @throughputMode:PROVISIONED@
+--
+-- 'comment', 'getTableResponse_comment' - The the description of the specified table.
+--
+-- 'creationTimestamp', 'getTableResponse_creationTimestamp' - The creation timestamp of the specified table.
+--
+-- 'defaultTimeToLive', 'getTableResponse_defaultTimeToLive' - The default Time to Live settings of the specified table.
+--
+-- 'encryptionSpecification', 'getTableResponse_encryptionSpecification' - The encryption settings of the specified table.
+--
+-- 'pointInTimeRecovery', 'getTableResponse_pointInTimeRecovery' - The point-in-time recovery status of the specified table.
+--
+-- 'schemaDefinition', 'getTableResponse_schemaDefinition' - The schema definition of the specified table.
+--
+-- 'status', 'getTableResponse_status' - The current status of the specified table.
+--
+-- 'ttl', 'getTableResponse_ttl' - The custom Time to Live settings of the specified table.
+--
+-- 'httpStatus', 'getTableResponse_httpStatus' - The response's http status code.
+--
+-- 'keyspaceName', 'getTableResponse_keyspaceName' - The name of the keyspace that the specified table is stored in.
+--
+-- 'tableName', 'getTableResponse_tableName' - The name of the specified table.
+--
+-- 'resourceArn', 'getTableResponse_resourceArn' - The Amazon Resource Name (ARN) of the specified table.
+newGetTableResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  -- | 'resourceArn'
+  Prelude.Text ->
+  GetTableResponse
+newGetTableResponse
+  pHttpStatus_
+  pKeyspaceName_
+  pTableName_
+  pResourceArn_ =
+    GetTableResponse'
+      { capacitySpecification =
+          Prelude.Nothing,
+        comment = Prelude.Nothing,
+        creationTimestamp = Prelude.Nothing,
+        defaultTimeToLive = Prelude.Nothing,
+        encryptionSpecification = Prelude.Nothing,
+        pointInTimeRecovery = Prelude.Nothing,
+        schemaDefinition = Prelude.Nothing,
+        status = Prelude.Nothing,
+        ttl = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        keyspaceName = pKeyspaceName_,
+        tableName = pTableName_,
+        resourceArn = pResourceArn_
+      }
+
+-- | The read\/write throughput capacity mode for a table. The options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@
+--
+-- • @throughputMode:PROVISIONED@
+getTableResponse_capacitySpecification :: Lens.Lens' GetTableResponse (Prelude.Maybe CapacitySpecificationSummary)
+getTableResponse_capacitySpecification = Lens.lens (\GetTableResponse' {capacitySpecification} -> capacitySpecification) (\s@GetTableResponse' {} a -> s {capacitySpecification = a} :: GetTableResponse)
+
+-- | The the description of the specified table.
+getTableResponse_comment :: Lens.Lens' GetTableResponse (Prelude.Maybe Comment)
+getTableResponse_comment = Lens.lens (\GetTableResponse' {comment} -> comment) (\s@GetTableResponse' {} a -> s {comment = a} :: GetTableResponse)
+
+-- | The creation timestamp of the specified table.
+getTableResponse_creationTimestamp :: Lens.Lens' GetTableResponse (Prelude.Maybe Prelude.UTCTime)
+getTableResponse_creationTimestamp = Lens.lens (\GetTableResponse' {creationTimestamp} -> creationTimestamp) (\s@GetTableResponse' {} a -> s {creationTimestamp = a} :: GetTableResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The default Time to Live settings of the specified table.
+getTableResponse_defaultTimeToLive :: Lens.Lens' GetTableResponse (Prelude.Maybe Prelude.Natural)
+getTableResponse_defaultTimeToLive = Lens.lens (\GetTableResponse' {defaultTimeToLive} -> defaultTimeToLive) (\s@GetTableResponse' {} a -> s {defaultTimeToLive = a} :: GetTableResponse)
+
+-- | The encryption settings of the specified table.
+getTableResponse_encryptionSpecification :: Lens.Lens' GetTableResponse (Prelude.Maybe EncryptionSpecification)
+getTableResponse_encryptionSpecification = Lens.lens (\GetTableResponse' {encryptionSpecification} -> encryptionSpecification) (\s@GetTableResponse' {} a -> s {encryptionSpecification = a} :: GetTableResponse)
+
+-- | The point-in-time recovery status of the specified table.
+getTableResponse_pointInTimeRecovery :: Lens.Lens' GetTableResponse (Prelude.Maybe PointInTimeRecoverySummary)
+getTableResponse_pointInTimeRecovery = Lens.lens (\GetTableResponse' {pointInTimeRecovery} -> pointInTimeRecovery) (\s@GetTableResponse' {} a -> s {pointInTimeRecovery = a} :: GetTableResponse)
+
+-- | The schema definition of the specified table.
+getTableResponse_schemaDefinition :: Lens.Lens' GetTableResponse (Prelude.Maybe SchemaDefinition)
+getTableResponse_schemaDefinition = Lens.lens (\GetTableResponse' {schemaDefinition} -> schemaDefinition) (\s@GetTableResponse' {} a -> s {schemaDefinition = a} :: GetTableResponse)
+
+-- | The current status of the specified table.
+getTableResponse_status :: Lens.Lens' GetTableResponse (Prelude.Maybe TableStatus)
+getTableResponse_status = Lens.lens (\GetTableResponse' {status} -> status) (\s@GetTableResponse' {} a -> s {status = a} :: GetTableResponse)
+
+-- | The custom Time to Live settings of the specified table.
+getTableResponse_ttl :: Lens.Lens' GetTableResponse (Prelude.Maybe TimeToLive)
+getTableResponse_ttl = Lens.lens (\GetTableResponse' {ttl} -> ttl) (\s@GetTableResponse' {} a -> s {ttl = a} :: GetTableResponse)
+
+-- | The response's http status code.
+getTableResponse_httpStatus :: Lens.Lens' GetTableResponse Prelude.Int
+getTableResponse_httpStatus = Lens.lens (\GetTableResponse' {httpStatus} -> httpStatus) (\s@GetTableResponse' {} a -> s {httpStatus = a} :: GetTableResponse)
+
+-- | The name of the keyspace that the specified table is stored in.
+getTableResponse_keyspaceName :: Lens.Lens' GetTableResponse Prelude.Text
+getTableResponse_keyspaceName = Lens.lens (\GetTableResponse' {keyspaceName} -> keyspaceName) (\s@GetTableResponse' {} a -> s {keyspaceName = a} :: GetTableResponse)
+
+-- | The name of the specified table.
+getTableResponse_tableName :: Lens.Lens' GetTableResponse Prelude.Text
+getTableResponse_tableName = Lens.lens (\GetTableResponse' {tableName} -> tableName) (\s@GetTableResponse' {} a -> s {tableName = a} :: GetTableResponse)
+
+-- | The Amazon Resource Name (ARN) of the specified table.
+getTableResponse_resourceArn :: Lens.Lens' GetTableResponse Prelude.Text
+getTableResponse_resourceArn = Lens.lens (\GetTableResponse' {resourceArn} -> resourceArn) (\s@GetTableResponse' {} a -> s {resourceArn = a} :: GetTableResponse)
+
+instance Prelude.NFData GetTableResponse where
+  rnf GetTableResponse' {..} =
+    Prelude.rnf capacitySpecification
+      `Prelude.seq` Prelude.rnf comment
+      `Prelude.seq` Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf defaultTimeToLive
+      `Prelude.seq` Prelude.rnf encryptionSpecification
+      `Prelude.seq` Prelude.rnf pointInTimeRecovery
+      `Prelude.seq` Prelude.rnf schemaDefinition
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf ttl
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf keyspaceName
+      `Prelude.seq` Prelude.rnf tableName
+      `Prelude.seq` Prelude.rnf resourceArn
diff --git a/gen/Amazonka/KeySpaces/Lens.hs b/gen/Amazonka/KeySpaces/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Lens.hs
@@ -0,0 +1,219 @@
+{-# 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.KeySpaces.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.KeySpaces.Lens
+  ( -- * Operations
+
+    -- ** CreateKeyspace
+    createKeyspace_tags,
+    createKeyspace_keyspaceName,
+    createKeyspaceResponse_httpStatus,
+    createKeyspaceResponse_resourceArn,
+
+    -- ** CreateTable
+    createTable_capacitySpecification,
+    createTable_comment,
+    createTable_defaultTimeToLive,
+    createTable_encryptionSpecification,
+    createTable_pointInTimeRecovery,
+    createTable_tags,
+    createTable_ttl,
+    createTable_keyspaceName,
+    createTable_tableName,
+    createTable_schemaDefinition,
+    createTableResponse_httpStatus,
+    createTableResponse_resourceArn,
+
+    -- ** DeleteKeyspace
+    deleteKeyspace_keyspaceName,
+    deleteKeyspaceResponse_httpStatus,
+
+    -- ** DeleteTable
+    deleteTable_keyspaceName,
+    deleteTable_tableName,
+    deleteTableResponse_httpStatus,
+
+    -- ** GetKeyspace
+    getKeyspace_keyspaceName,
+    getKeyspaceResponse_httpStatus,
+    getKeyspaceResponse_keyspaceName,
+    getKeyspaceResponse_resourceArn,
+
+    -- ** GetTable
+    getTable_keyspaceName,
+    getTable_tableName,
+    getTableResponse_capacitySpecification,
+    getTableResponse_comment,
+    getTableResponse_creationTimestamp,
+    getTableResponse_defaultTimeToLive,
+    getTableResponse_encryptionSpecification,
+    getTableResponse_pointInTimeRecovery,
+    getTableResponse_schemaDefinition,
+    getTableResponse_status,
+    getTableResponse_ttl,
+    getTableResponse_httpStatus,
+    getTableResponse_keyspaceName,
+    getTableResponse_tableName,
+    getTableResponse_resourceArn,
+
+    -- ** ListKeyspaces
+    listKeyspaces_maxResults,
+    listKeyspaces_nextToken,
+    listKeyspacesResponse_nextToken,
+    listKeyspacesResponse_httpStatus,
+    listKeyspacesResponse_keyspaces,
+
+    -- ** ListTables
+    listTables_maxResults,
+    listTables_nextToken,
+    listTables_keyspaceName,
+    listTablesResponse_nextToken,
+    listTablesResponse_tables,
+    listTablesResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_maxResults,
+    listTagsForResource_nextToken,
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_nextToken,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** RestoreTable
+    restoreTable_capacitySpecificationOverride,
+    restoreTable_encryptionSpecificationOverride,
+    restoreTable_pointInTimeRecoveryOverride,
+    restoreTable_restoreTimestamp,
+    restoreTable_tagsOverride,
+    restoreTable_sourceKeyspaceName,
+    restoreTable_sourceTableName,
+    restoreTable_targetKeyspaceName,
+    restoreTable_targetTableName,
+    restoreTableResponse_httpStatus,
+    restoreTableResponse_restoredTableARN,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tags,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateTable
+    updateTable_addColumns,
+    updateTable_capacitySpecification,
+    updateTable_defaultTimeToLive,
+    updateTable_encryptionSpecification,
+    updateTable_pointInTimeRecovery,
+    updateTable_ttl,
+    updateTable_keyspaceName,
+    updateTable_tableName,
+    updateTableResponse_httpStatus,
+    updateTableResponse_resourceArn,
+
+    -- * Types
+
+    -- ** CapacitySpecification
+    capacitySpecification_readCapacityUnits,
+    capacitySpecification_writeCapacityUnits,
+    capacitySpecification_throughputMode,
+
+    -- ** CapacitySpecificationSummary
+    capacitySpecificationSummary_lastUpdateToPayPerRequestTimestamp,
+    capacitySpecificationSummary_readCapacityUnits,
+    capacitySpecificationSummary_writeCapacityUnits,
+    capacitySpecificationSummary_throughputMode,
+
+    -- ** ClusteringKey
+    clusteringKey_name,
+    clusteringKey_orderBy,
+
+    -- ** ColumnDefinition
+    columnDefinition_name,
+    columnDefinition_type,
+
+    -- ** Comment
+    comment_message,
+
+    -- ** EncryptionSpecification
+    encryptionSpecification_kmsKeyIdentifier,
+    encryptionSpecification_type,
+
+    -- ** KeyspaceSummary
+    keyspaceSummary_keyspaceName,
+    keyspaceSummary_resourceArn,
+
+    -- ** PartitionKey
+    partitionKey_name,
+
+    -- ** PointInTimeRecovery
+    pointInTimeRecovery_status,
+
+    -- ** PointInTimeRecoverySummary
+    pointInTimeRecoverySummary_earliestRestorableTimestamp,
+    pointInTimeRecoverySummary_status,
+
+    -- ** SchemaDefinition
+    schemaDefinition_clusteringKeys,
+    schemaDefinition_staticColumns,
+    schemaDefinition_allColumns,
+    schemaDefinition_partitionKeys,
+
+    -- ** StaticColumn
+    staticColumn_name,
+
+    -- ** TableSummary
+    tableSummary_keyspaceName,
+    tableSummary_tableName,
+    tableSummary_resourceArn,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+
+    -- ** TimeToLive
+    timeToLive_status,
+  )
+where
+
+import Amazonka.KeySpaces.CreateKeyspace
+import Amazonka.KeySpaces.CreateTable
+import Amazonka.KeySpaces.DeleteKeyspace
+import Amazonka.KeySpaces.DeleteTable
+import Amazonka.KeySpaces.GetKeyspace
+import Amazonka.KeySpaces.GetTable
+import Amazonka.KeySpaces.ListKeyspaces
+import Amazonka.KeySpaces.ListTables
+import Amazonka.KeySpaces.ListTagsForResource
+import Amazonka.KeySpaces.RestoreTable
+import Amazonka.KeySpaces.TagResource
+import Amazonka.KeySpaces.Types.CapacitySpecification
+import Amazonka.KeySpaces.Types.CapacitySpecificationSummary
+import Amazonka.KeySpaces.Types.ClusteringKey
+import Amazonka.KeySpaces.Types.ColumnDefinition
+import Amazonka.KeySpaces.Types.Comment
+import Amazonka.KeySpaces.Types.EncryptionSpecification
+import Amazonka.KeySpaces.Types.KeyspaceSummary
+import Amazonka.KeySpaces.Types.PartitionKey
+import Amazonka.KeySpaces.Types.PointInTimeRecovery
+import Amazonka.KeySpaces.Types.PointInTimeRecoverySummary
+import Amazonka.KeySpaces.Types.SchemaDefinition
+import Amazonka.KeySpaces.Types.StaticColumn
+import Amazonka.KeySpaces.Types.TableSummary
+import Amazonka.KeySpaces.Types.Tag
+import Amazonka.KeySpaces.Types.TimeToLive
+import Amazonka.KeySpaces.UntagResource
+import Amazonka.KeySpaces.UpdateTable
diff --git a/gen/Amazonka/KeySpaces/ListKeyspaces.hs b/gen/Amazonka/KeySpaces/ListKeyspaces.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/ListKeyspaces.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.KeySpaces.ListKeyspaces
+-- 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 keyspaces.
+--
+-- This operation returns paginated results.
+module Amazonka.KeySpaces.ListKeyspaces
+  ( -- * Creating a Request
+    ListKeyspaces (..),
+    newListKeyspaces,
+
+    -- * Request Lenses
+    listKeyspaces_maxResults,
+    listKeyspaces_nextToken,
+
+    -- * Destructuring the Response
+    ListKeyspacesResponse (..),
+    newListKeyspacesResponse,
+
+    -- * Response Lenses
+    listKeyspacesResponse_nextToken,
+    listKeyspacesResponse_httpStatus,
+    listKeyspacesResponse_keyspaces,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListKeyspaces' smart constructor.
+data ListKeyspaces = ListKeyspaces'
+  { -- | The total number of keyspaces to return in the output. If the total
+    -- number of keyspaces available is more than the value specified, a
+    -- @NextToken@ is provided in the output. To resume pagination, provide the
+    -- @NextToken@ value as an argument of a subsequent API invocation.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token. To resume pagination, provide the @NextToken@
+    -- value as argument of a subsequent API invocation.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListKeyspaces' 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', 'listKeyspaces_maxResults' - The total number of keyspaces to return in the output. If the total
+-- number of keyspaces available is more than the value specified, a
+-- @NextToken@ is provided in the output. To resume pagination, provide the
+-- @NextToken@ value as an argument of a subsequent API invocation.
+--
+-- 'nextToken', 'listKeyspaces_nextToken' - The pagination token. To resume pagination, provide the @NextToken@
+-- value as argument of a subsequent API invocation.
+newListKeyspaces ::
+  ListKeyspaces
+newListKeyspaces =
+  ListKeyspaces'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The total number of keyspaces to return in the output. If the total
+-- number of keyspaces available is more than the value specified, a
+-- @NextToken@ is provided in the output. To resume pagination, provide the
+-- @NextToken@ value as an argument of a subsequent API invocation.
+listKeyspaces_maxResults :: Lens.Lens' ListKeyspaces (Prelude.Maybe Prelude.Natural)
+listKeyspaces_maxResults = Lens.lens (\ListKeyspaces' {maxResults} -> maxResults) (\s@ListKeyspaces' {} a -> s {maxResults = a} :: ListKeyspaces)
+
+-- | The pagination token. To resume pagination, provide the @NextToken@
+-- value as argument of a subsequent API invocation.
+listKeyspaces_nextToken :: Lens.Lens' ListKeyspaces (Prelude.Maybe Prelude.Text)
+listKeyspaces_nextToken = Lens.lens (\ListKeyspaces' {nextToken} -> nextToken) (\s@ListKeyspaces' {} a -> s {nextToken = a} :: ListKeyspaces)
+
+instance Core.AWSPager ListKeyspaces where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listKeyspacesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listKeyspacesResponse_keyspaces) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listKeyspaces_nextToken
+          Lens..~ rs
+          Lens.^? listKeyspacesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListKeyspaces where
+  type
+    AWSResponse ListKeyspaces =
+      ListKeyspacesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListKeyspacesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "keyspaces" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListKeyspaces where
+  hashWithSalt _salt ListKeyspaces' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListKeyspaces where
+  rnf ListKeyspaces' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListKeyspaces where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.ListKeyspaces" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListKeyspaces where
+  toJSON ListKeyspaces' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListKeyspaces where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListKeyspaces where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListKeyspacesResponse' smart constructor.
+data ListKeyspacesResponse = ListKeyspacesResponse'
+  { -- | A token to specify where to start paginating. This is the @NextToken@
+    -- from a previously truncated response.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of keyspaces.
+    keyspaces :: [KeyspaceSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListKeyspacesResponse' 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', 'listKeyspacesResponse_nextToken' - A token to specify where to start paginating. This is the @NextToken@
+-- from a previously truncated response.
+--
+-- 'httpStatus', 'listKeyspacesResponse_httpStatus' - The response's http status code.
+--
+-- 'keyspaces', 'listKeyspacesResponse_keyspaces' - A list of keyspaces.
+newListKeyspacesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListKeyspacesResponse
+newListKeyspacesResponse pHttpStatus_ =
+  ListKeyspacesResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      keyspaces = Prelude.mempty
+    }
+
+-- | A token to specify where to start paginating. This is the @NextToken@
+-- from a previously truncated response.
+listKeyspacesResponse_nextToken :: Lens.Lens' ListKeyspacesResponse (Prelude.Maybe Prelude.Text)
+listKeyspacesResponse_nextToken = Lens.lens (\ListKeyspacesResponse' {nextToken} -> nextToken) (\s@ListKeyspacesResponse' {} a -> s {nextToken = a} :: ListKeyspacesResponse)
+
+-- | The response's http status code.
+listKeyspacesResponse_httpStatus :: Lens.Lens' ListKeyspacesResponse Prelude.Int
+listKeyspacesResponse_httpStatus = Lens.lens (\ListKeyspacesResponse' {httpStatus} -> httpStatus) (\s@ListKeyspacesResponse' {} a -> s {httpStatus = a} :: ListKeyspacesResponse)
+
+-- | A list of keyspaces.
+listKeyspacesResponse_keyspaces :: Lens.Lens' ListKeyspacesResponse [KeyspaceSummary]
+listKeyspacesResponse_keyspaces = Lens.lens (\ListKeyspacesResponse' {keyspaces} -> keyspaces) (\s@ListKeyspacesResponse' {} a -> s {keyspaces = a} :: ListKeyspacesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListKeyspacesResponse where
+  rnf ListKeyspacesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf keyspaces
diff --git a/gen/Amazonka/KeySpaces/ListTables.hs b/gen/Amazonka/KeySpaces/ListTables.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/ListTables.hs
@@ -0,0 +1,247 @@
+{-# 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.KeySpaces.ListTables
+-- 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 tables for a specified keyspace.
+--
+-- This operation returns paginated results.
+module Amazonka.KeySpaces.ListTables
+  ( -- * Creating a Request
+    ListTables (..),
+    newListTables,
+
+    -- * Request Lenses
+    listTables_maxResults,
+    listTables_nextToken,
+    listTables_keyspaceName,
+
+    -- * Destructuring the Response
+    ListTablesResponse (..),
+    newListTablesResponse,
+
+    -- * Response Lenses
+    listTablesResponse_nextToken,
+    listTablesResponse_tables,
+    listTablesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTables' smart constructor.
+data ListTables = ListTables'
+  { -- | The total number of tables to return in the output. If the total number
+    -- of tables available is more than the value specified, a @NextToken@ is
+    -- provided in the output. To resume pagination, provide the @NextToken@
+    -- value as an argument of a subsequent API invocation.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token. To resume pagination, provide the @NextToken@
+    -- value as an argument of a subsequent API invocation.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the keyspace.
+    keyspaceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTables' 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', 'listTables_maxResults' - The total number of tables to return in the output. If the total number
+-- of tables available is more than the value specified, a @NextToken@ is
+-- provided in the output. To resume pagination, provide the @NextToken@
+-- value as an argument of a subsequent API invocation.
+--
+-- 'nextToken', 'listTables_nextToken' - The pagination token. To resume pagination, provide the @NextToken@
+-- value as an argument of a subsequent API invocation.
+--
+-- 'keyspaceName', 'listTables_keyspaceName' - The name of the keyspace.
+newListTables ::
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  ListTables
+newListTables pKeyspaceName_ =
+  ListTables'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      keyspaceName = pKeyspaceName_
+    }
+
+-- | The total number of tables to return in the output. If the total number
+-- of tables available is more than the value specified, a @NextToken@ is
+-- provided in the output. To resume pagination, provide the @NextToken@
+-- value as an argument of a subsequent API invocation.
+listTables_maxResults :: Lens.Lens' ListTables (Prelude.Maybe Prelude.Natural)
+listTables_maxResults = Lens.lens (\ListTables' {maxResults} -> maxResults) (\s@ListTables' {} a -> s {maxResults = a} :: ListTables)
+
+-- | The pagination token. To resume pagination, provide the @NextToken@
+-- value as an argument of a subsequent API invocation.
+listTables_nextToken :: Lens.Lens' ListTables (Prelude.Maybe Prelude.Text)
+listTables_nextToken = Lens.lens (\ListTables' {nextToken} -> nextToken) (\s@ListTables' {} a -> s {nextToken = a} :: ListTables)
+
+-- | The name of the keyspace.
+listTables_keyspaceName :: Lens.Lens' ListTables Prelude.Text
+listTables_keyspaceName = Lens.lens (\ListTables' {keyspaceName} -> keyspaceName) (\s@ListTables' {} a -> s {keyspaceName = a} :: ListTables)
+
+instance Core.AWSPager ListTables where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listTablesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listTablesResponse_tables
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listTables_nextToken
+          Lens..~ rs
+          Lens.^? listTablesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListTables where
+  type AWSResponse ListTables = ListTablesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTablesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "tables" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTables where
+  hashWithSalt _salt ListTables' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` keyspaceName
+
+instance Prelude.NFData ListTables where
+  rnf ListTables' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf keyspaceName
+
+instance Data.ToHeaders ListTables where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.ListTables" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTables where
+  toJSON ListTables' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("keyspaceName" Data..= keyspaceName)
+          ]
+      )
+
+instance Data.ToPath ListTables where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListTables where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTablesResponse' smart constructor.
+data ListTablesResponse = ListTablesResponse'
+  { -- | A token to specify where to start paginating. This is the @NextToken@
+    -- from a previously truncated response.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of tables.
+    tables :: Prelude.Maybe [TableSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTablesResponse' 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', 'listTablesResponse_nextToken' - A token to specify where to start paginating. This is the @NextToken@
+-- from a previously truncated response.
+--
+-- 'tables', 'listTablesResponse_tables' - A list of tables.
+--
+-- 'httpStatus', 'listTablesResponse_httpStatus' - The response's http status code.
+newListTablesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTablesResponse
+newListTablesResponse pHttpStatus_ =
+  ListTablesResponse'
+    { nextToken = Prelude.Nothing,
+      tables = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token to specify where to start paginating. This is the @NextToken@
+-- from a previously truncated response.
+listTablesResponse_nextToken :: Lens.Lens' ListTablesResponse (Prelude.Maybe Prelude.Text)
+listTablesResponse_nextToken = Lens.lens (\ListTablesResponse' {nextToken} -> nextToken) (\s@ListTablesResponse' {} a -> s {nextToken = a} :: ListTablesResponse)
+
+-- | A list of tables.
+listTablesResponse_tables :: Lens.Lens' ListTablesResponse (Prelude.Maybe [TableSummary])
+listTablesResponse_tables = Lens.lens (\ListTablesResponse' {tables} -> tables) (\s@ListTablesResponse' {} a -> s {tables = a} :: ListTablesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTablesResponse_httpStatus :: Lens.Lens' ListTablesResponse Prelude.Int
+listTablesResponse_httpStatus = Lens.lens (\ListTablesResponse' {httpStatus} -> httpStatus) (\s@ListTablesResponse' {} a -> s {httpStatus = a} :: ListTablesResponse)
+
+instance Prelude.NFData ListTablesResponse where
+  rnf ListTablesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf tables
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/KeySpaces/ListTagsForResource.hs b/gen/Amazonka/KeySpaces/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/ListTagsForResource.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.KeySpaces.ListTagsForResource
+-- 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 all tags associated with the specified Amazon
+-- Keyspaces resource.
+--
+-- This operation returns paginated results.
+module Amazonka.KeySpaces.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_maxResults,
+    listTagsForResource_nextToken,
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_nextToken,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The total number of tags to return in the output. If the total number of
+    -- tags available is more than the value specified, a @NextToken@ is
+    -- provided in the output. To resume pagination, provide the @NextToken@
+    -- value as an argument of a subsequent API invocation.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token. To resume pagination, provide the @NextToken@
+    -- value as argument of a subsequent API invocation.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the Amazon Keyspaces resource.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' 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', 'listTagsForResource_maxResults' - The total number of tags to return in the output. If the total number of
+-- tags available is more than the value specified, a @NextToken@ is
+-- provided in the output. To resume pagination, provide the @NextToken@
+-- value as an argument of a subsequent API invocation.
+--
+-- 'nextToken', 'listTagsForResource_nextToken' - The pagination token. To resume pagination, provide the @NextToken@
+-- value as argument of a subsequent API invocation.
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The Amazon Resource Name (ARN) of the Amazon Keyspaces resource.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      resourceArn = pResourceArn_
+    }
+
+-- | The total number of tags to return in the output. If the total number of
+-- tags available is more than the value specified, a @NextToken@ is
+-- provided in the output. To resume pagination, provide the @NextToken@
+-- value as an argument of a subsequent API invocation.
+listTagsForResource_maxResults :: Lens.Lens' ListTagsForResource (Prelude.Maybe Prelude.Natural)
+listTagsForResource_maxResults = Lens.lens (\ListTagsForResource' {maxResults} -> maxResults) (\s@ListTagsForResource' {} a -> s {maxResults = a} :: ListTagsForResource)
+
+-- | The pagination token. To resume pagination, provide the @NextToken@
+-- value as argument of a subsequent API invocation.
+listTagsForResource_nextToken :: Lens.Lens' ListTagsForResource (Prelude.Maybe Prelude.Text)
+listTagsForResource_nextToken = Lens.lens (\ListTagsForResource' {nextToken} -> nextToken) (\s@ListTagsForResource' {} a -> s {nextToken = a} :: ListTagsForResource)
+
+-- | The Amazon Resource Name (ARN) of the Amazon Keyspaces resource.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSPager ListTagsForResource where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listTagsForResourceResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listTagsForResourceResponse_tags
+            Prelude.. Lens._Just
+            Prelude.. Lens.to Prelude.toList
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listTagsForResource_nextToken
+          Lens..~ rs
+          Lens.^? listTagsForResourceResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "tags")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.ListTagsForResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTagsForResource where
+  toJSON ListTagsForResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("resourceArn" Data..= resourceArn)
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | A token to specify where to start paginating. This is the @NextToken@
+    -- from a previously truncated response.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of tags.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' 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', 'listTagsForResourceResponse_nextToken' - A token to specify where to start paginating. This is the @NextToken@
+-- from a previously truncated response.
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - A list of tags.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { nextToken =
+        Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token to specify where to start paginating. This is the @NextToken@
+-- from a previously truncated response.
+listTagsForResourceResponse_nextToken :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe Prelude.Text)
+listTagsForResourceResponse_nextToken = Lens.lens (\ListTagsForResourceResponse' {nextToken} -> nextToken) (\s@ListTagsForResourceResponse' {} a -> s {nextToken = a} :: ListTagsForResourceResponse)
+
+-- | A list of tags.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.NonEmpty Tag))
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/KeySpaces/RestoreTable.hs b/gen/Amazonka/KeySpaces/RestoreTable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/RestoreTable.hs
@@ -0,0 +1,464 @@
+{-# 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.KeySpaces.RestoreTable
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Restores the specified table to the specified point in time within the
+-- @earliest_restorable_timestamp@ and the current time. For more
+-- information about restore points, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery_HowItWorks.html#howitworks_backup_window Time window for PITR continuous backups>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- Any number of users can execute up to 4 concurrent restores (any type of
+-- restore) in a given account.
+--
+-- When you restore using point in time recovery, Amazon Keyspaces restores
+-- your source table\'s schema and data to the state based on the selected
+-- timestamp @(day:hour:minute:second)@ to a new table. The Time to Live
+-- (TTL) settings are also restored to the state based on the selected
+-- timestamp.
+--
+-- In addition to the table\'s schema, data, and TTL settings,
+-- @RestoreTable@ restores the capacity mode, encryption, and point-in-time
+-- recovery settings from the source table. Unlike the table\'s schema data
+-- and TTL settings, which are restored based on the selected timestamp,
+-- these settings are always restored based on the table\'s settings as of
+-- the current time or when the table was deleted.
+--
+-- You can also overwrite these settings during restore:
+--
+-- • Read\/write capacity mode
+--
+-- • Provisioned throughput capacity settings
+--
+-- • Point-in-time (PITR) settings
+--
+-- • Tags
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery_HowItWorks.html#howitworks_backup_settings PITR restore settings>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- Note that the following settings are not restored, and you must
+-- configure them manually for the new table:
+--
+-- • Automatic scaling policies (for tables that use provisioned capacity
+-- mode)
+--
+-- • Identity and Access Management (IAM) policies
+--
+-- • Amazon CloudWatch metrics and alarms
+module Amazonka.KeySpaces.RestoreTable
+  ( -- * Creating a Request
+    RestoreTable (..),
+    newRestoreTable,
+
+    -- * Request Lenses
+    restoreTable_capacitySpecificationOverride,
+    restoreTable_encryptionSpecificationOverride,
+    restoreTable_pointInTimeRecoveryOverride,
+    restoreTable_restoreTimestamp,
+    restoreTable_tagsOverride,
+    restoreTable_sourceKeyspaceName,
+    restoreTable_sourceTableName,
+    restoreTable_targetKeyspaceName,
+    restoreTable_targetTableName,
+
+    -- * Destructuring the Response
+    RestoreTableResponse (..),
+    newRestoreTableResponse,
+
+    -- * Response Lenses
+    restoreTableResponse_httpStatus,
+    restoreTableResponse_restoredTableARN,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newRestoreTable' smart constructor.
+data RestoreTable = RestoreTable'
+  { -- | Specifies the read\/write throughput capacity mode for the target table.
+    -- The options are:
+    --
+    -- • @throughputMode:PAY_PER_REQUEST@
+    --
+    -- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+    -- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+    --
+    -- The default is @throughput_mode:PAY_PER_REQUEST@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    capacitySpecificationOverride :: Prelude.Maybe CapacitySpecification,
+    -- | Specifies the encryption settings for the target table. You can choose
+    -- one of the following KMS key (KMS key):
+    --
+    -- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+    --
+    -- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+    -- and is created, owned, and managed by you. This option requires the
+    -- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+    -- as input.
+    --
+    -- The default is @type:AWS_OWNED_KMS_KEY@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    encryptionSpecificationOverride :: Prelude.Maybe EncryptionSpecification,
+    -- | Specifies the @pointInTimeRecovery@ settings for the target table. The
+    -- options are:
+    --
+    -- • @ENABLED@
+    --
+    -- • @DISABLED@
+    --
+    -- If it\'s not specified, the default is @DISABLED@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery.html Point-in-time recovery>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    pointInTimeRecoveryOverride :: Prelude.Maybe PointInTimeRecovery,
+    -- | The restore timestamp in ISO 8601 format.
+    restoreTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | A list of key-value pair tags to be attached to the restored table.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    tagsOverride :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | The keyspace name of the source table.
+    sourceKeyspaceName :: Prelude.Text,
+    -- | The name of the source table.
+    sourceTableName :: Prelude.Text,
+    -- | The name of the target keyspace.
+    targetKeyspaceName :: Prelude.Text,
+    -- | The name of the target table.
+    targetTableName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RestoreTable' 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:
+--
+-- 'capacitySpecificationOverride', 'restoreTable_capacitySpecificationOverride' - Specifies the read\/write throughput capacity mode for the target table.
+-- The options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@
+--
+-- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+-- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+--
+-- The default is @throughput_mode:PAY_PER_REQUEST@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'encryptionSpecificationOverride', 'restoreTable_encryptionSpecificationOverride' - Specifies the encryption settings for the target table. You can choose
+-- one of the following KMS key (KMS key):
+--
+-- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+--
+-- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+-- and is created, owned, and managed by you. This option requires the
+-- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+-- as input.
+--
+-- The default is @type:AWS_OWNED_KMS_KEY@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'pointInTimeRecoveryOverride', 'restoreTable_pointInTimeRecoveryOverride' - Specifies the @pointInTimeRecovery@ settings for the target table. The
+-- options are:
+--
+-- • @ENABLED@
+--
+-- • @DISABLED@
+--
+-- If it\'s not specified, the default is @DISABLED@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery.html Point-in-time recovery>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'restoreTimestamp', 'restoreTable_restoreTimestamp' - The restore timestamp in ISO 8601 format.
+--
+-- 'tagsOverride', 'restoreTable_tagsOverride' - A list of key-value pair tags to be attached to the restored table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'sourceKeyspaceName', 'restoreTable_sourceKeyspaceName' - The keyspace name of the source table.
+--
+-- 'sourceTableName', 'restoreTable_sourceTableName' - The name of the source table.
+--
+-- 'targetKeyspaceName', 'restoreTable_targetKeyspaceName' - The name of the target keyspace.
+--
+-- 'targetTableName', 'restoreTable_targetTableName' - The name of the target table.
+newRestoreTable ::
+  -- | 'sourceKeyspaceName'
+  Prelude.Text ->
+  -- | 'sourceTableName'
+  Prelude.Text ->
+  -- | 'targetKeyspaceName'
+  Prelude.Text ->
+  -- | 'targetTableName'
+  Prelude.Text ->
+  RestoreTable
+newRestoreTable
+  pSourceKeyspaceName_
+  pSourceTableName_
+  pTargetKeyspaceName_
+  pTargetTableName_ =
+    RestoreTable'
+      { capacitySpecificationOverride =
+          Prelude.Nothing,
+        encryptionSpecificationOverride = Prelude.Nothing,
+        pointInTimeRecoveryOverride = Prelude.Nothing,
+        restoreTimestamp = Prelude.Nothing,
+        tagsOverride = Prelude.Nothing,
+        sourceKeyspaceName = pSourceKeyspaceName_,
+        sourceTableName = pSourceTableName_,
+        targetKeyspaceName = pTargetKeyspaceName_,
+        targetTableName = pTargetTableName_
+      }
+
+-- | Specifies the read\/write throughput capacity mode for the target table.
+-- The options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@
+--
+-- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+-- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+--
+-- The default is @throughput_mode:PAY_PER_REQUEST@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+restoreTable_capacitySpecificationOverride :: Lens.Lens' RestoreTable (Prelude.Maybe CapacitySpecification)
+restoreTable_capacitySpecificationOverride = Lens.lens (\RestoreTable' {capacitySpecificationOverride} -> capacitySpecificationOverride) (\s@RestoreTable' {} a -> s {capacitySpecificationOverride = a} :: RestoreTable)
+
+-- | Specifies the encryption settings for the target table. You can choose
+-- one of the following KMS key (KMS key):
+--
+-- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+--
+-- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+-- and is created, owned, and managed by you. This option requires the
+-- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+-- as input.
+--
+-- The default is @type:AWS_OWNED_KMS_KEY@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+-- in the /Amazon Keyspaces Developer Guide/.
+restoreTable_encryptionSpecificationOverride :: Lens.Lens' RestoreTable (Prelude.Maybe EncryptionSpecification)
+restoreTable_encryptionSpecificationOverride = Lens.lens (\RestoreTable' {encryptionSpecificationOverride} -> encryptionSpecificationOverride) (\s@RestoreTable' {} a -> s {encryptionSpecificationOverride = a} :: RestoreTable)
+
+-- | Specifies the @pointInTimeRecovery@ settings for the target table. The
+-- options are:
+--
+-- • @ENABLED@
+--
+-- • @DISABLED@
+--
+-- If it\'s not specified, the default is @DISABLED@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery.html Point-in-time recovery>
+-- in the /Amazon Keyspaces Developer Guide/.
+restoreTable_pointInTimeRecoveryOverride :: Lens.Lens' RestoreTable (Prelude.Maybe PointInTimeRecovery)
+restoreTable_pointInTimeRecoveryOverride = Lens.lens (\RestoreTable' {pointInTimeRecoveryOverride} -> pointInTimeRecoveryOverride) (\s@RestoreTable' {} a -> s {pointInTimeRecoveryOverride = a} :: RestoreTable)
+
+-- | The restore timestamp in ISO 8601 format.
+restoreTable_restoreTimestamp :: Lens.Lens' RestoreTable (Prelude.Maybe Prelude.UTCTime)
+restoreTable_restoreTimestamp = Lens.lens (\RestoreTable' {restoreTimestamp} -> restoreTimestamp) (\s@RestoreTable' {} a -> s {restoreTimestamp = a} :: RestoreTable) Prelude.. Lens.mapping Data._Time
+
+-- | A list of key-value pair tags to be attached to the restored table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+-- in the /Amazon Keyspaces Developer Guide/.
+restoreTable_tagsOverride :: Lens.Lens' RestoreTable (Prelude.Maybe (Prelude.NonEmpty Tag))
+restoreTable_tagsOverride = Lens.lens (\RestoreTable' {tagsOverride} -> tagsOverride) (\s@RestoreTable' {} a -> s {tagsOverride = a} :: RestoreTable) Prelude.. Lens.mapping Lens.coerced
+
+-- | The keyspace name of the source table.
+restoreTable_sourceKeyspaceName :: Lens.Lens' RestoreTable Prelude.Text
+restoreTable_sourceKeyspaceName = Lens.lens (\RestoreTable' {sourceKeyspaceName} -> sourceKeyspaceName) (\s@RestoreTable' {} a -> s {sourceKeyspaceName = a} :: RestoreTable)
+
+-- | The name of the source table.
+restoreTable_sourceTableName :: Lens.Lens' RestoreTable Prelude.Text
+restoreTable_sourceTableName = Lens.lens (\RestoreTable' {sourceTableName} -> sourceTableName) (\s@RestoreTable' {} a -> s {sourceTableName = a} :: RestoreTable)
+
+-- | The name of the target keyspace.
+restoreTable_targetKeyspaceName :: Lens.Lens' RestoreTable Prelude.Text
+restoreTable_targetKeyspaceName = Lens.lens (\RestoreTable' {targetKeyspaceName} -> targetKeyspaceName) (\s@RestoreTable' {} a -> s {targetKeyspaceName = a} :: RestoreTable)
+
+-- | The name of the target table.
+restoreTable_targetTableName :: Lens.Lens' RestoreTable Prelude.Text
+restoreTable_targetTableName = Lens.lens (\RestoreTable' {targetTableName} -> targetTableName) (\s@RestoreTable' {} a -> s {targetTableName = a} :: RestoreTable)
+
+instance Core.AWSRequest RestoreTable where
+  type AWSResponse RestoreTable = RestoreTableResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          RestoreTableResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "restoredTableARN")
+      )
+
+instance Prelude.Hashable RestoreTable where
+  hashWithSalt _salt RestoreTable' {..} =
+    _salt
+      `Prelude.hashWithSalt` capacitySpecificationOverride
+      `Prelude.hashWithSalt` encryptionSpecificationOverride
+      `Prelude.hashWithSalt` pointInTimeRecoveryOverride
+      `Prelude.hashWithSalt` restoreTimestamp
+      `Prelude.hashWithSalt` tagsOverride
+      `Prelude.hashWithSalt` sourceKeyspaceName
+      `Prelude.hashWithSalt` sourceTableName
+      `Prelude.hashWithSalt` targetKeyspaceName
+      `Prelude.hashWithSalt` targetTableName
+
+instance Prelude.NFData RestoreTable where
+  rnf RestoreTable' {..} =
+    Prelude.rnf capacitySpecificationOverride
+      `Prelude.seq` Prelude.rnf encryptionSpecificationOverride
+      `Prelude.seq` Prelude.rnf pointInTimeRecoveryOverride
+      `Prelude.seq` Prelude.rnf restoreTimestamp
+      `Prelude.seq` Prelude.rnf tagsOverride
+      `Prelude.seq` Prelude.rnf sourceKeyspaceName
+      `Prelude.seq` Prelude.rnf sourceTableName
+      `Prelude.seq` Prelude.rnf targetKeyspaceName
+      `Prelude.seq` Prelude.rnf targetTableName
+
+instance Data.ToHeaders RestoreTable where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.RestoreTable" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON RestoreTable where
+  toJSON RestoreTable' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("capacitySpecificationOverride" Data..=)
+              Prelude.<$> capacitySpecificationOverride,
+            ("encryptionSpecificationOverride" Data..=)
+              Prelude.<$> encryptionSpecificationOverride,
+            ("pointInTimeRecoveryOverride" Data..=)
+              Prelude.<$> pointInTimeRecoveryOverride,
+            ("restoreTimestamp" Data..=)
+              Prelude.<$> restoreTimestamp,
+            ("tagsOverride" Data..=) Prelude.<$> tagsOverride,
+            Prelude.Just
+              ("sourceKeyspaceName" Data..= sourceKeyspaceName),
+            Prelude.Just
+              ("sourceTableName" Data..= sourceTableName),
+            Prelude.Just
+              ("targetKeyspaceName" Data..= targetKeyspaceName),
+            Prelude.Just
+              ("targetTableName" Data..= targetTableName)
+          ]
+      )
+
+instance Data.ToPath RestoreTable where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery RestoreTable where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newRestoreTableResponse' smart constructor.
+data RestoreTableResponse = RestoreTableResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The Amazon Resource Name (ARN) of the restored table.
+    restoredTableARN :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RestoreTableResponse' 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:
+--
+-- 'httpStatus', 'restoreTableResponse_httpStatus' - The response's http status code.
+--
+-- 'restoredTableARN', 'restoreTableResponse_restoredTableARN' - The Amazon Resource Name (ARN) of the restored table.
+newRestoreTableResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'restoredTableARN'
+  Prelude.Text ->
+  RestoreTableResponse
+newRestoreTableResponse
+  pHttpStatus_
+  pRestoredTableARN_ =
+    RestoreTableResponse'
+      { httpStatus = pHttpStatus_,
+        restoredTableARN = pRestoredTableARN_
+      }
+
+-- | The response's http status code.
+restoreTableResponse_httpStatus :: Lens.Lens' RestoreTableResponse Prelude.Int
+restoreTableResponse_httpStatus = Lens.lens (\RestoreTableResponse' {httpStatus} -> httpStatus) (\s@RestoreTableResponse' {} a -> s {httpStatus = a} :: RestoreTableResponse)
+
+-- | The Amazon Resource Name (ARN) of the restored table.
+restoreTableResponse_restoredTableARN :: Lens.Lens' RestoreTableResponse Prelude.Text
+restoreTableResponse_restoredTableARN = Lens.lens (\RestoreTableResponse' {restoredTableARN} -> restoredTableARN) (\s@RestoreTableResponse' {} a -> s {restoredTableARN = a} :: RestoreTableResponse)
+
+instance Prelude.NFData RestoreTableResponse where
+  rnf RestoreTableResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf restoredTableARN
diff --git a/gen/Amazonka/KeySpaces/TagResource.hs b/gen/Amazonka/KeySpaces/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/TagResource.hs
@@ -0,0 +1,183 @@
+{-# 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.KeySpaces.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)
+--
+-- Associates a set of tags with a Amazon Keyspaces resource. You can then
+-- activate these user-defined tags so that they appear on the Cost
+-- Management Console for cost allocation tracking. For more information,
+-- see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- For IAM policy examples that show how to control access to Amazon
+-- Keyspaces resources based on tags, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/security_iam_id-based-policy-examples-tags Amazon Keyspaces resource access based on tags>
+-- in the /Amazon Keyspaces Developer Guide/.
+module Amazonka.KeySpaces.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    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.KeySpaces.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 Amazon Keyspaces resource to which
+    -- to add tags.
+    resourceArn :: Prelude.Text,
+    -- | The tags to be assigned to the Amazon Keyspaces resource.
+    tags :: Prelude.NonEmpty 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 Amazon Keyspaces resource to which
+-- to add tags.
+--
+-- 'tags', 'tagResource_tags' - The tags to be assigned to the Amazon Keyspaces resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  -- | 'tags'
+  Prelude.NonEmpty Tag ->
+  TagResource
+newTagResource pResourceArn_ pTags_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Lens.coerced Lens.# pTags_
+    }
+
+-- | The Amazon Resource Name (ARN) of the Amazon Keyspaces resource to which
+-- to add tags.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The tags to be assigned to the Amazon Keyspaces resource.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.NonEmpty 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.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            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.=# ( "KeyspacesService.TagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          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'
+  { -- | 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:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | 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 httpStatus
diff --git a/gen/Amazonka/KeySpaces/Types.hs b/gen/Amazonka/KeySpaces/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types.hs
@@ -0,0 +1,284 @@
+{-# 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.KeySpaces.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.KeySpaces.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ValidationException,
+
+    -- * EncryptionType
+    EncryptionType (..),
+
+    -- * PointInTimeRecoveryStatus
+    PointInTimeRecoveryStatus (..),
+
+    -- * SortOrder
+    SortOrder (..),
+
+    -- * TableStatus
+    TableStatus (..),
+
+    -- * ThroughputMode
+    ThroughputMode (..),
+
+    -- * TimeToLiveStatus
+    TimeToLiveStatus (..),
+
+    -- * CapacitySpecification
+    CapacitySpecification (..),
+    newCapacitySpecification,
+    capacitySpecification_readCapacityUnits,
+    capacitySpecification_writeCapacityUnits,
+    capacitySpecification_throughputMode,
+
+    -- * CapacitySpecificationSummary
+    CapacitySpecificationSummary (..),
+    newCapacitySpecificationSummary,
+    capacitySpecificationSummary_lastUpdateToPayPerRequestTimestamp,
+    capacitySpecificationSummary_readCapacityUnits,
+    capacitySpecificationSummary_writeCapacityUnits,
+    capacitySpecificationSummary_throughputMode,
+
+    -- * ClusteringKey
+    ClusteringKey (..),
+    newClusteringKey,
+    clusteringKey_name,
+    clusteringKey_orderBy,
+
+    -- * ColumnDefinition
+    ColumnDefinition (..),
+    newColumnDefinition,
+    columnDefinition_name,
+    columnDefinition_type,
+
+    -- * Comment
+    Comment (..),
+    newComment,
+    comment_message,
+
+    -- * EncryptionSpecification
+    EncryptionSpecification (..),
+    newEncryptionSpecification,
+    encryptionSpecification_kmsKeyIdentifier,
+    encryptionSpecification_type,
+
+    -- * KeyspaceSummary
+    KeyspaceSummary (..),
+    newKeyspaceSummary,
+    keyspaceSummary_keyspaceName,
+    keyspaceSummary_resourceArn,
+
+    -- * PartitionKey
+    PartitionKey (..),
+    newPartitionKey,
+    partitionKey_name,
+
+    -- * PointInTimeRecovery
+    PointInTimeRecovery (..),
+    newPointInTimeRecovery,
+    pointInTimeRecovery_status,
+
+    -- * PointInTimeRecoverySummary
+    PointInTimeRecoverySummary (..),
+    newPointInTimeRecoverySummary,
+    pointInTimeRecoverySummary_earliestRestorableTimestamp,
+    pointInTimeRecoverySummary_status,
+
+    -- * SchemaDefinition
+    SchemaDefinition (..),
+    newSchemaDefinition,
+    schemaDefinition_clusteringKeys,
+    schemaDefinition_staticColumns,
+    schemaDefinition_allColumns,
+    schemaDefinition_partitionKeys,
+
+    -- * StaticColumn
+    StaticColumn (..),
+    newStaticColumn,
+    staticColumn_name,
+
+    -- * TableSummary
+    TableSummary (..),
+    newTableSummary,
+    tableSummary_keyspaceName,
+    tableSummary_tableName,
+    tableSummary_resourceArn,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+
+    -- * TimeToLive
+    TimeToLive (..),
+    newTimeToLive,
+    timeToLive_status,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.KeySpaces.Types.CapacitySpecification
+import Amazonka.KeySpaces.Types.CapacitySpecificationSummary
+import Amazonka.KeySpaces.Types.ClusteringKey
+import Amazonka.KeySpaces.Types.ColumnDefinition
+import Amazonka.KeySpaces.Types.Comment
+import Amazonka.KeySpaces.Types.EncryptionSpecification
+import Amazonka.KeySpaces.Types.EncryptionType
+import Amazonka.KeySpaces.Types.KeyspaceSummary
+import Amazonka.KeySpaces.Types.PartitionKey
+import Amazonka.KeySpaces.Types.PointInTimeRecovery
+import Amazonka.KeySpaces.Types.PointInTimeRecoveryStatus
+import Amazonka.KeySpaces.Types.PointInTimeRecoverySummary
+import Amazonka.KeySpaces.Types.SchemaDefinition
+import Amazonka.KeySpaces.Types.SortOrder
+import Amazonka.KeySpaces.Types.StaticColumn
+import Amazonka.KeySpaces.Types.TableStatus
+import Amazonka.KeySpaces.Types.TableSummary
+import Amazonka.KeySpaces.Types.Tag
+import Amazonka.KeySpaces.Types.ThroughputMode
+import Amazonka.KeySpaces.Types.TimeToLive
+import Amazonka.KeySpaces.Types.TimeToLiveStatus
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2022-02-10@ of the Amazon Keyspaces SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "KeySpaces",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "cassandra",
+      Core.signingName = "cassandra",
+      Core.version = "2022-02-10",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "KeySpaces",
+      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
+
+-- | You do not have sufficient access to perform this action.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+
+-- | Amazon Keyspaces could not complete the requested action. This error may
+-- occur if you try to perform an action and the same or a different action
+-- is already in progress, or if you try to create a resource that already
+-- exists.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+
+-- | Amazon Keyspaces was unable to fully process this request because of an
+-- internal server error.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+
+-- | The operation tried to access a keyspace or table that doesn\'t exist.
+-- The resource might not be specified correctly, or its status might not
+-- be @ACTIVE@.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+
+-- | The operation exceeded the service quota for this resource. For more
+-- information on service quotas, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/quotas.html Quotas>
+-- in the /Amazon Keyspaces Developer Guide/.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+
+-- | The operation failed due to an invalid or malformed request.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
diff --git a/gen/Amazonka/KeySpaces/Types/CapacitySpecification.hs b/gen/Amazonka/KeySpaces/Types/CapacitySpecification.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/CapacitySpecification.hs
@@ -0,0 +1,154 @@
+{-# 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.KeySpaces.Types.CapacitySpecification
+-- 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.KeySpaces.Types.CapacitySpecification where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types.ThroughputMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Amazon Keyspaces has two read\/write capacity modes for processing reads
+-- and writes on your tables:
+--
+-- • On-demand (default)
+--
+-- • Provisioned
+--
+-- The read\/write capacity mode that you choose controls how you are
+-- charged for read and write throughput and how table throughput capacity
+-- is managed.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- /See:/ 'newCapacitySpecification' smart constructor.
+data CapacitySpecification = CapacitySpecification'
+  { -- | The throughput capacity specified for @read@ operations defined in
+    -- @read capacity units@ @(RCUs)@.
+    readCapacityUnits :: Prelude.Maybe Prelude.Natural,
+    -- | The throughput capacity specified for @write@ operations defined in
+    -- @write capacity units@ @(WCUs)@.
+    writeCapacityUnits :: Prelude.Maybe Prelude.Natural,
+    -- | The read\/write throughput capacity mode for a table. The options are:
+    --
+    -- • @throughputMode:PAY_PER_REQUEST@ and
+    --
+    -- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+    -- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+    --
+    -- The default is @throughput_mode:PAY_PER_REQUEST@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    throughputMode :: ThroughputMode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CapacitySpecification' 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:
+--
+-- 'readCapacityUnits', 'capacitySpecification_readCapacityUnits' - The throughput capacity specified for @read@ operations defined in
+-- @read capacity units@ @(RCUs)@.
+--
+-- 'writeCapacityUnits', 'capacitySpecification_writeCapacityUnits' - The throughput capacity specified for @write@ operations defined in
+-- @write capacity units@ @(WCUs)@.
+--
+-- 'throughputMode', 'capacitySpecification_throughputMode' - The read\/write throughput capacity mode for a table. The options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@ and
+--
+-- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+-- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+--
+-- The default is @throughput_mode:PAY_PER_REQUEST@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+newCapacitySpecification ::
+  -- | 'throughputMode'
+  ThroughputMode ->
+  CapacitySpecification
+newCapacitySpecification pThroughputMode_ =
+  CapacitySpecification'
+    { readCapacityUnits =
+        Prelude.Nothing,
+      writeCapacityUnits = Prelude.Nothing,
+      throughputMode = pThroughputMode_
+    }
+
+-- | The throughput capacity specified for @read@ operations defined in
+-- @read capacity units@ @(RCUs)@.
+capacitySpecification_readCapacityUnits :: Lens.Lens' CapacitySpecification (Prelude.Maybe Prelude.Natural)
+capacitySpecification_readCapacityUnits = Lens.lens (\CapacitySpecification' {readCapacityUnits} -> readCapacityUnits) (\s@CapacitySpecification' {} a -> s {readCapacityUnits = a} :: CapacitySpecification)
+
+-- | The throughput capacity specified for @write@ operations defined in
+-- @write capacity units@ @(WCUs)@.
+capacitySpecification_writeCapacityUnits :: Lens.Lens' CapacitySpecification (Prelude.Maybe Prelude.Natural)
+capacitySpecification_writeCapacityUnits = Lens.lens (\CapacitySpecification' {writeCapacityUnits} -> writeCapacityUnits) (\s@CapacitySpecification' {} a -> s {writeCapacityUnits = a} :: CapacitySpecification)
+
+-- | The read\/write throughput capacity mode for a table. The options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@ and
+--
+-- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+-- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+--
+-- The default is @throughput_mode:PAY_PER_REQUEST@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+capacitySpecification_throughputMode :: Lens.Lens' CapacitySpecification ThroughputMode
+capacitySpecification_throughputMode = Lens.lens (\CapacitySpecification' {throughputMode} -> throughputMode) (\s@CapacitySpecification' {} a -> s {throughputMode = a} :: CapacitySpecification)
+
+instance Prelude.Hashable CapacitySpecification where
+  hashWithSalt _salt CapacitySpecification' {..} =
+    _salt
+      `Prelude.hashWithSalt` readCapacityUnits
+      `Prelude.hashWithSalt` writeCapacityUnits
+      `Prelude.hashWithSalt` throughputMode
+
+instance Prelude.NFData CapacitySpecification where
+  rnf CapacitySpecification' {..} =
+    Prelude.rnf readCapacityUnits
+      `Prelude.seq` Prelude.rnf writeCapacityUnits
+      `Prelude.seq` Prelude.rnf throughputMode
+
+instance Data.ToJSON CapacitySpecification where
+  toJSON CapacitySpecification' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("readCapacityUnits" Data..=)
+              Prelude.<$> readCapacityUnits,
+            ("writeCapacityUnits" Data..=)
+              Prelude.<$> writeCapacityUnits,
+            Prelude.Just
+              ("throughputMode" Data..= throughputMode)
+          ]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/CapacitySpecificationSummary.hs b/gen/Amazonka/KeySpaces/Types/CapacitySpecificationSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/CapacitySpecificationSummary.hs
@@ -0,0 +1,165 @@
+{-# 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.KeySpaces.Types.CapacitySpecificationSummary
+-- 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.KeySpaces.Types.CapacitySpecificationSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types.ThroughputMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | The read\/write throughput capacity mode for a table. The options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@ and
+--
+-- • @throughputMode:PROVISIONED@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- /See:/ 'newCapacitySpecificationSummary' smart constructor.
+data CapacitySpecificationSummary = CapacitySpecificationSummary'
+  { -- | The timestamp of the last operation that changed the provisioned
+    -- throughput capacity of a table.
+    lastUpdateToPayPerRequestTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The throughput capacity specified for @read@ operations defined in
+    -- @read capacity units@ @(RCUs)@.
+    readCapacityUnits :: Prelude.Maybe Prelude.Natural,
+    -- | The throughput capacity specified for @write@ operations defined in
+    -- @write capacity units@ @(WCUs)@.
+    writeCapacityUnits :: Prelude.Maybe Prelude.Natural,
+    -- | The read\/write throughput capacity mode for a table. The options are:
+    --
+    -- • @throughputMode:PAY_PER_REQUEST@ and
+    --
+    -- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+    -- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+    --
+    -- The default is @throughput_mode:PAY_PER_REQUEST@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    throughputMode :: ThroughputMode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CapacitySpecificationSummary' 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:
+--
+-- 'lastUpdateToPayPerRequestTimestamp', 'capacitySpecificationSummary_lastUpdateToPayPerRequestTimestamp' - The timestamp of the last operation that changed the provisioned
+-- throughput capacity of a table.
+--
+-- 'readCapacityUnits', 'capacitySpecificationSummary_readCapacityUnits' - The throughput capacity specified for @read@ operations defined in
+-- @read capacity units@ @(RCUs)@.
+--
+-- 'writeCapacityUnits', 'capacitySpecificationSummary_writeCapacityUnits' - The throughput capacity specified for @write@ operations defined in
+-- @write capacity units@ @(WCUs)@.
+--
+-- 'throughputMode', 'capacitySpecificationSummary_throughputMode' - The read\/write throughput capacity mode for a table. The options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@ and
+--
+-- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+-- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+--
+-- The default is @throughput_mode:PAY_PER_REQUEST@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+newCapacitySpecificationSummary ::
+  -- | 'throughputMode'
+  ThroughputMode ->
+  CapacitySpecificationSummary
+newCapacitySpecificationSummary pThroughputMode_ =
+  CapacitySpecificationSummary'
+    { lastUpdateToPayPerRequestTimestamp =
+        Prelude.Nothing,
+      readCapacityUnits = Prelude.Nothing,
+      writeCapacityUnits = Prelude.Nothing,
+      throughputMode = pThroughputMode_
+    }
+
+-- | The timestamp of the last operation that changed the provisioned
+-- throughput capacity of a table.
+capacitySpecificationSummary_lastUpdateToPayPerRequestTimestamp :: Lens.Lens' CapacitySpecificationSummary (Prelude.Maybe Prelude.UTCTime)
+capacitySpecificationSummary_lastUpdateToPayPerRequestTimestamp = Lens.lens (\CapacitySpecificationSummary' {lastUpdateToPayPerRequestTimestamp} -> lastUpdateToPayPerRequestTimestamp) (\s@CapacitySpecificationSummary' {} a -> s {lastUpdateToPayPerRequestTimestamp = a} :: CapacitySpecificationSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The throughput capacity specified for @read@ operations defined in
+-- @read capacity units@ @(RCUs)@.
+capacitySpecificationSummary_readCapacityUnits :: Lens.Lens' CapacitySpecificationSummary (Prelude.Maybe Prelude.Natural)
+capacitySpecificationSummary_readCapacityUnits = Lens.lens (\CapacitySpecificationSummary' {readCapacityUnits} -> readCapacityUnits) (\s@CapacitySpecificationSummary' {} a -> s {readCapacityUnits = a} :: CapacitySpecificationSummary)
+
+-- | The throughput capacity specified for @write@ operations defined in
+-- @write capacity units@ @(WCUs)@.
+capacitySpecificationSummary_writeCapacityUnits :: Lens.Lens' CapacitySpecificationSummary (Prelude.Maybe Prelude.Natural)
+capacitySpecificationSummary_writeCapacityUnits = Lens.lens (\CapacitySpecificationSummary' {writeCapacityUnits} -> writeCapacityUnits) (\s@CapacitySpecificationSummary' {} a -> s {writeCapacityUnits = a} :: CapacitySpecificationSummary)
+
+-- | The read\/write throughput capacity mode for a table. The options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@ and
+--
+-- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+-- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+--
+-- The default is @throughput_mode:PAY_PER_REQUEST@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+capacitySpecificationSummary_throughputMode :: Lens.Lens' CapacitySpecificationSummary ThroughputMode
+capacitySpecificationSummary_throughputMode = Lens.lens (\CapacitySpecificationSummary' {throughputMode} -> throughputMode) (\s@CapacitySpecificationSummary' {} a -> s {throughputMode = a} :: CapacitySpecificationSummary)
+
+instance Data.FromJSON CapacitySpecificationSummary where
+  parseJSON =
+    Data.withObject
+      "CapacitySpecificationSummary"
+      ( \x ->
+          CapacitySpecificationSummary'
+            Prelude.<$> (x Data..:? "lastUpdateToPayPerRequestTimestamp")
+            Prelude.<*> (x Data..:? "readCapacityUnits")
+            Prelude.<*> (x Data..:? "writeCapacityUnits")
+            Prelude.<*> (x Data..: "throughputMode")
+      )
+
+instance
+  Prelude.Hashable
+    CapacitySpecificationSummary
+  where
+  hashWithSalt _salt CapacitySpecificationSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` lastUpdateToPayPerRequestTimestamp
+      `Prelude.hashWithSalt` readCapacityUnits
+      `Prelude.hashWithSalt` writeCapacityUnits
+      `Prelude.hashWithSalt` throughputMode
+
+instance Prelude.NFData CapacitySpecificationSummary where
+  rnf CapacitySpecificationSummary' {..} =
+    Prelude.rnf lastUpdateToPayPerRequestTimestamp
+      `Prelude.seq` Prelude.rnf readCapacityUnits
+      `Prelude.seq` Prelude.rnf writeCapacityUnits
+      `Prelude.seq` Prelude.rnf throughputMode
diff --git a/gen/Amazonka/KeySpaces/Types/ClusteringKey.hs b/gen/Amazonka/KeySpaces/Types/ClusteringKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/ClusteringKey.hs
@@ -0,0 +1,95 @@
+{-# 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.KeySpaces.Types.ClusteringKey
+-- 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.KeySpaces.Types.ClusteringKey where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types.SortOrder
+import qualified Amazonka.Prelude as Prelude
+
+-- | The optional clustering column portion of your primary key determines
+-- how the data is clustered and sorted within each partition.
+--
+-- /See:/ 'newClusteringKey' smart constructor.
+data ClusteringKey = ClusteringKey'
+  { -- | The name(s) of the clustering column(s).
+    name :: Prelude.Text,
+    -- | Sets the ascendant (@ASC@) or descendant (@DESC@) order modifier.
+    orderBy :: SortOrder
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClusteringKey' 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', 'clusteringKey_name' - The name(s) of the clustering column(s).
+--
+-- 'orderBy', 'clusteringKey_orderBy' - Sets the ascendant (@ASC@) or descendant (@DESC@) order modifier.
+newClusteringKey ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'orderBy'
+  SortOrder ->
+  ClusteringKey
+newClusteringKey pName_ pOrderBy_ =
+  ClusteringKey' {name = pName_, orderBy = pOrderBy_}
+
+-- | The name(s) of the clustering column(s).
+clusteringKey_name :: Lens.Lens' ClusteringKey Prelude.Text
+clusteringKey_name = Lens.lens (\ClusteringKey' {name} -> name) (\s@ClusteringKey' {} a -> s {name = a} :: ClusteringKey)
+
+-- | Sets the ascendant (@ASC@) or descendant (@DESC@) order modifier.
+clusteringKey_orderBy :: Lens.Lens' ClusteringKey SortOrder
+clusteringKey_orderBy = Lens.lens (\ClusteringKey' {orderBy} -> orderBy) (\s@ClusteringKey' {} a -> s {orderBy = a} :: ClusteringKey)
+
+instance Data.FromJSON ClusteringKey where
+  parseJSON =
+    Data.withObject
+      "ClusteringKey"
+      ( \x ->
+          ClusteringKey'
+            Prelude.<$> (x Data..: "name")
+            Prelude.<*> (x Data..: "orderBy")
+      )
+
+instance Prelude.Hashable ClusteringKey where
+  hashWithSalt _salt ClusteringKey' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` orderBy
+
+instance Prelude.NFData ClusteringKey where
+  rnf ClusteringKey' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf orderBy
+
+instance Data.ToJSON ClusteringKey where
+  toJSON ClusteringKey' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("name" Data..= name),
+            Prelude.Just ("orderBy" Data..= orderBy)
+          ]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/ColumnDefinition.hs b/gen/Amazonka/KeySpaces/Types/ColumnDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/ColumnDefinition.hs
@@ -0,0 +1,99 @@
+{-# 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.KeySpaces.Types.ColumnDefinition
+-- 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.KeySpaces.Types.ColumnDefinition 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 names and data types of regular columns.
+--
+-- /See:/ 'newColumnDefinition' smart constructor.
+data ColumnDefinition = ColumnDefinition'
+  { -- | The name of the column.
+    name :: Prelude.Text,
+    -- | The data type of the column. For a list of available data types, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.data-types Data types>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    type' :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ColumnDefinition' 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', 'columnDefinition_name' - The name of the column.
+--
+-- 'type'', 'columnDefinition_type' - The data type of the column. For a list of available data types, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.data-types Data types>
+-- in the /Amazon Keyspaces Developer Guide/.
+newColumnDefinition ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'type''
+  Prelude.Text ->
+  ColumnDefinition
+newColumnDefinition pName_ pType_ =
+  ColumnDefinition' {name = pName_, type' = pType_}
+
+-- | The name of the column.
+columnDefinition_name :: Lens.Lens' ColumnDefinition Prelude.Text
+columnDefinition_name = Lens.lens (\ColumnDefinition' {name} -> name) (\s@ColumnDefinition' {} a -> s {name = a} :: ColumnDefinition)
+
+-- | The data type of the column. For a list of available data types, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.data-types Data types>
+-- in the /Amazon Keyspaces Developer Guide/.
+columnDefinition_type :: Lens.Lens' ColumnDefinition Prelude.Text
+columnDefinition_type = Lens.lens (\ColumnDefinition' {type'} -> type') (\s@ColumnDefinition' {} a -> s {type' = a} :: ColumnDefinition)
+
+instance Data.FromJSON ColumnDefinition where
+  parseJSON =
+    Data.withObject
+      "ColumnDefinition"
+      ( \x ->
+          ColumnDefinition'
+            Prelude.<$> (x Data..: "name")
+            Prelude.<*> (x Data..: "type")
+      )
+
+instance Prelude.Hashable ColumnDefinition where
+  hashWithSalt _salt ColumnDefinition' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData ColumnDefinition where
+  rnf ColumnDefinition' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON ColumnDefinition where
+  toJSON ColumnDefinition' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("name" Data..= name),
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/Comment.hs b/gen/Amazonka/KeySpaces/Types/Comment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/Comment.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.KeySpaces.Types.Comment
+-- 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.KeySpaces.Types.Comment 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
+
+-- | An optional comment that describes the table.
+--
+-- /See:/ 'newComment' smart constructor.
+data Comment = Comment'
+  { -- | An optional description of the table.
+    message :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Comment' 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:
+--
+-- 'message', 'comment_message' - An optional description of the table.
+newComment ::
+  -- | 'message'
+  Prelude.Text ->
+  Comment
+newComment pMessage_ = Comment' {message = pMessage_}
+
+-- | An optional description of the table.
+comment_message :: Lens.Lens' Comment Prelude.Text
+comment_message = Lens.lens (\Comment' {message} -> message) (\s@Comment' {} a -> s {message = a} :: Comment)
+
+instance Data.FromJSON Comment where
+  parseJSON =
+    Data.withObject
+      "Comment"
+      (\x -> Comment' Prelude.<$> (x Data..: "message"))
+
+instance Prelude.Hashable Comment where
+  hashWithSalt _salt Comment' {..} =
+    _salt `Prelude.hashWithSalt` message
+
+instance Prelude.NFData Comment where
+  rnf Comment' {..} = Prelude.rnf message
+
+instance Data.ToJSON Comment where
+  toJSON Comment' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("message" Data..= message)]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/EncryptionSpecification.hs b/gen/Amazonka/KeySpaces/Types/EncryptionSpecification.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/EncryptionSpecification.hs
@@ -0,0 +1,161 @@
+{-# 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.KeySpaces.Types.EncryptionSpecification
+-- 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.KeySpaces.Types.EncryptionSpecification where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types.EncryptionType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Amazon Keyspaces encrypts and decrypts the table data at rest
+-- transparently and integrates with Key Management Service for storing and
+-- managing the encryption key. You can choose one of the following KMS
+-- keys (KMS keys):
+--
+-- • Amazon Web Services owned key - This is the default encryption type.
+-- The key is owned by Amazon Keyspaces (no additional charge).
+--
+-- • Customer managed key - This key is stored in your account and is
+-- created, owned, and managed by you. You have full control over the
+-- customer managed key (KMS charges apply).
+--
+-- For more information about encryption at rest in Amazon Keyspaces, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- For more information about KMS, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html KMS management service concepts>
+-- in the /Key Management Service Developer Guide/.
+--
+-- /See:/ 'newEncryptionSpecification' smart constructor.
+data EncryptionSpecification = EncryptionSpecification'
+  { -- | The Amazon Resource Name (ARN) of the customer managed KMS key, for
+    -- example @kms_key_identifier:ARN@.
+    kmsKeyIdentifier :: Prelude.Maybe Prelude.Text,
+    -- | The encryption option specified for the table. You can choose one of the
+    -- following KMS keys (KMS keys):
+    --
+    -- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+    --
+    -- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+    -- and is created, owned, and managed by you. This option requires the
+    -- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+    -- as input.
+    --
+    -- The default is @type:AWS_OWNED_KMS_KEY@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    type' :: EncryptionType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EncryptionSpecification' 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:
+--
+-- 'kmsKeyIdentifier', 'encryptionSpecification_kmsKeyIdentifier' - The Amazon Resource Name (ARN) of the customer managed KMS key, for
+-- example @kms_key_identifier:ARN@.
+--
+-- 'type'', 'encryptionSpecification_type' - The encryption option specified for the table. You can choose one of the
+-- following KMS keys (KMS keys):
+--
+-- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+--
+-- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+-- and is created, owned, and managed by you. This option requires the
+-- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+-- as input.
+--
+-- The default is @type:AWS_OWNED_KMS_KEY@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+-- in the /Amazon Keyspaces Developer Guide/.
+newEncryptionSpecification ::
+  -- | 'type''
+  EncryptionType ->
+  EncryptionSpecification
+newEncryptionSpecification pType_ =
+  EncryptionSpecification'
+    { kmsKeyIdentifier =
+        Prelude.Nothing,
+      type' = pType_
+    }
+
+-- | The Amazon Resource Name (ARN) of the customer managed KMS key, for
+-- example @kms_key_identifier:ARN@.
+encryptionSpecification_kmsKeyIdentifier :: Lens.Lens' EncryptionSpecification (Prelude.Maybe Prelude.Text)
+encryptionSpecification_kmsKeyIdentifier = Lens.lens (\EncryptionSpecification' {kmsKeyIdentifier} -> kmsKeyIdentifier) (\s@EncryptionSpecification' {} a -> s {kmsKeyIdentifier = a} :: EncryptionSpecification)
+
+-- | The encryption option specified for the table. You can choose one of the
+-- following KMS keys (KMS keys):
+--
+-- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+--
+-- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+-- and is created, owned, and managed by you. This option requires the
+-- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+-- as input.
+--
+-- The default is @type:AWS_OWNED_KMS_KEY@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+-- in the /Amazon Keyspaces Developer Guide/.
+encryptionSpecification_type :: Lens.Lens' EncryptionSpecification EncryptionType
+encryptionSpecification_type = Lens.lens (\EncryptionSpecification' {type'} -> type') (\s@EncryptionSpecification' {} a -> s {type' = a} :: EncryptionSpecification)
+
+instance Data.FromJSON EncryptionSpecification where
+  parseJSON =
+    Data.withObject
+      "EncryptionSpecification"
+      ( \x ->
+          EncryptionSpecification'
+            Prelude.<$> (x Data..:? "kmsKeyIdentifier")
+            Prelude.<*> (x Data..: "type")
+      )
+
+instance Prelude.Hashable EncryptionSpecification where
+  hashWithSalt _salt EncryptionSpecification' {..} =
+    _salt
+      `Prelude.hashWithSalt` kmsKeyIdentifier
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData EncryptionSpecification where
+  rnf EncryptionSpecification' {..} =
+    Prelude.rnf kmsKeyIdentifier
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON EncryptionSpecification where
+  toJSON EncryptionSpecification' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("kmsKeyIdentifier" Data..=)
+              Prelude.<$> kmsKeyIdentifier,
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/EncryptionType.hs b/gen/Amazonka/KeySpaces/Types/EncryptionType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/EncryptionType.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.KeySpaces.Types.EncryptionType
+-- 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.KeySpaces.Types.EncryptionType
+  ( EncryptionType
+      ( ..,
+        EncryptionType_AWS_OWNED_KMS_KEY,
+        EncryptionType_CUSTOMER_MANAGED_KMS_KEY
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EncryptionType = EncryptionType'
+  { fromEncryptionType ::
+      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 EncryptionType_AWS_OWNED_KMS_KEY :: EncryptionType
+pattern EncryptionType_AWS_OWNED_KMS_KEY = EncryptionType' "AWS_OWNED_KMS_KEY"
+
+pattern EncryptionType_CUSTOMER_MANAGED_KMS_KEY :: EncryptionType
+pattern EncryptionType_CUSTOMER_MANAGED_KMS_KEY = EncryptionType' "CUSTOMER_MANAGED_KMS_KEY"
+
+{-# COMPLETE
+  EncryptionType_AWS_OWNED_KMS_KEY,
+  EncryptionType_CUSTOMER_MANAGED_KMS_KEY,
+  EncryptionType'
+  #-}
diff --git a/gen/Amazonka/KeySpaces/Types/KeyspaceSummary.hs b/gen/Amazonka/KeySpaces/Types/KeyspaceSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/KeyspaceSummary.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.KeySpaces.Types.KeyspaceSummary
+-- 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.KeySpaces.Types.KeyspaceSummary 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 properties of a keyspace.
+--
+-- /See:/ 'newKeyspaceSummary' smart constructor.
+data KeyspaceSummary = KeyspaceSummary'
+  { -- | The name of the keyspace.
+    keyspaceName :: Prelude.Text,
+    -- | The unique identifier of the keyspace in the format of an Amazon
+    -- Resource Name (ARN).
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'KeyspaceSummary' 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:
+--
+-- 'keyspaceName', 'keyspaceSummary_keyspaceName' - The name of the keyspace.
+--
+-- 'resourceArn', 'keyspaceSummary_resourceArn' - The unique identifier of the keyspace in the format of an Amazon
+-- Resource Name (ARN).
+newKeyspaceSummary ::
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  -- | 'resourceArn'
+  Prelude.Text ->
+  KeyspaceSummary
+newKeyspaceSummary pKeyspaceName_ pResourceArn_ =
+  KeyspaceSummary'
+    { keyspaceName = pKeyspaceName_,
+      resourceArn = pResourceArn_
+    }
+
+-- | The name of the keyspace.
+keyspaceSummary_keyspaceName :: Lens.Lens' KeyspaceSummary Prelude.Text
+keyspaceSummary_keyspaceName = Lens.lens (\KeyspaceSummary' {keyspaceName} -> keyspaceName) (\s@KeyspaceSummary' {} a -> s {keyspaceName = a} :: KeyspaceSummary)
+
+-- | The unique identifier of the keyspace in the format of an Amazon
+-- Resource Name (ARN).
+keyspaceSummary_resourceArn :: Lens.Lens' KeyspaceSummary Prelude.Text
+keyspaceSummary_resourceArn = Lens.lens (\KeyspaceSummary' {resourceArn} -> resourceArn) (\s@KeyspaceSummary' {} a -> s {resourceArn = a} :: KeyspaceSummary)
+
+instance Data.FromJSON KeyspaceSummary where
+  parseJSON =
+    Data.withObject
+      "KeyspaceSummary"
+      ( \x ->
+          KeyspaceSummary'
+            Prelude.<$> (x Data..: "keyspaceName")
+            Prelude.<*> (x Data..: "resourceArn")
+      )
+
+instance Prelude.Hashable KeyspaceSummary where
+  hashWithSalt _salt KeyspaceSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` keyspaceName
+      `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData KeyspaceSummary where
+  rnf KeyspaceSummary' {..} =
+    Prelude.rnf keyspaceName
+      `Prelude.seq` Prelude.rnf resourceArn
diff --git a/gen/Amazonka/KeySpaces/Types/PartitionKey.hs b/gen/Amazonka/KeySpaces/Types/PartitionKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/PartitionKey.hs
@@ -0,0 +1,75 @@
+{-# 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.KeySpaces.Types.PartitionKey
+-- 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.KeySpaces.Types.PartitionKey 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 partition key portion of the primary key is required and determines
+-- how Amazon Keyspaces stores the data. The partition key can be a single
+-- column, or it can be a compound value composed of two or more columns.
+--
+-- /See:/ 'newPartitionKey' smart constructor.
+data PartitionKey = PartitionKey'
+  { -- | The name(s) of the partition key column(s).
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PartitionKey' 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', 'partitionKey_name' - The name(s) of the partition key column(s).
+newPartitionKey ::
+  -- | 'name'
+  Prelude.Text ->
+  PartitionKey
+newPartitionKey pName_ = PartitionKey' {name = pName_}
+
+-- | The name(s) of the partition key column(s).
+partitionKey_name :: Lens.Lens' PartitionKey Prelude.Text
+partitionKey_name = Lens.lens (\PartitionKey' {name} -> name) (\s@PartitionKey' {} a -> s {name = a} :: PartitionKey)
+
+instance Data.FromJSON PartitionKey where
+  parseJSON =
+    Data.withObject
+      "PartitionKey"
+      (\x -> PartitionKey' Prelude.<$> (x Data..: "name"))
+
+instance Prelude.Hashable PartitionKey where
+  hashWithSalt _salt PartitionKey' {..} =
+    _salt `Prelude.hashWithSalt` name
+
+instance Prelude.NFData PartitionKey where
+  rnf PartitionKey' {..} = Prelude.rnf name
+
+instance Data.ToJSON PartitionKey where
+  toJSON PartitionKey' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("name" Data..= name)]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/PointInTimeRecovery.hs b/gen/Amazonka/KeySpaces/Types/PointInTimeRecovery.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/PointInTimeRecovery.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.KeySpaces.Types.PointInTimeRecovery
+-- 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.KeySpaces.Types.PointInTimeRecovery where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types.PointInTimeRecoveryStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Point-in-time recovery (PITR) helps protect your Amazon Keyspaces tables
+-- from accidental write or delete operations by providing you continuous
+-- backups of your table data.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery.html Point-in-time recovery>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- /See:/ 'newPointInTimeRecovery' smart constructor.
+data PointInTimeRecovery = PointInTimeRecovery'
+  { -- | The options are:
+    --
+    -- • @ENABLED@
+    --
+    -- • @DISABLED@
+    status :: PointInTimeRecoveryStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PointInTimeRecovery' 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:
+--
+-- 'status', 'pointInTimeRecovery_status' - The options are:
+--
+-- • @ENABLED@
+--
+-- • @DISABLED@
+newPointInTimeRecovery ::
+  -- | 'status'
+  PointInTimeRecoveryStatus ->
+  PointInTimeRecovery
+newPointInTimeRecovery pStatus_ =
+  PointInTimeRecovery' {status = pStatus_}
+
+-- | The options are:
+--
+-- • @ENABLED@
+--
+-- • @DISABLED@
+pointInTimeRecovery_status :: Lens.Lens' PointInTimeRecovery PointInTimeRecoveryStatus
+pointInTimeRecovery_status = Lens.lens (\PointInTimeRecovery' {status} -> status) (\s@PointInTimeRecovery' {} a -> s {status = a} :: PointInTimeRecovery)
+
+instance Prelude.Hashable PointInTimeRecovery where
+  hashWithSalt _salt PointInTimeRecovery' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData PointInTimeRecovery where
+  rnf PointInTimeRecovery' {..} = Prelude.rnf status
+
+instance Data.ToJSON PointInTimeRecovery where
+  toJSON PointInTimeRecovery' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("status" Data..= status)]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/PointInTimeRecoveryStatus.hs b/gen/Amazonka/KeySpaces/Types/PointInTimeRecoveryStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/PointInTimeRecoveryStatus.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.KeySpaces.Types.PointInTimeRecoveryStatus
+-- 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.KeySpaces.Types.PointInTimeRecoveryStatus
+  ( PointInTimeRecoveryStatus
+      ( ..,
+        PointInTimeRecoveryStatus_DISABLED,
+        PointInTimeRecoveryStatus_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PointInTimeRecoveryStatus = PointInTimeRecoveryStatus'
+  { fromPointInTimeRecoveryStatus ::
+      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 PointInTimeRecoveryStatus_DISABLED :: PointInTimeRecoveryStatus
+pattern PointInTimeRecoveryStatus_DISABLED = PointInTimeRecoveryStatus' "DISABLED"
+
+pattern PointInTimeRecoveryStatus_ENABLED :: PointInTimeRecoveryStatus
+pattern PointInTimeRecoveryStatus_ENABLED = PointInTimeRecoveryStatus' "ENABLED"
+
+{-# COMPLETE
+  PointInTimeRecoveryStatus_DISABLED,
+  PointInTimeRecoveryStatus_ENABLED,
+  PointInTimeRecoveryStatus'
+  #-}
diff --git a/gen/Amazonka/KeySpaces/Types/PointInTimeRecoverySummary.hs b/gen/Amazonka/KeySpaces/Types/PointInTimeRecoverySummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/PointInTimeRecoverySummary.hs
@@ -0,0 +1,94 @@
+{-# 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.KeySpaces.Types.PointInTimeRecoverySummary
+-- 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.KeySpaces.Types.PointInTimeRecoverySummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types.PointInTimeRecoveryStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The point-in-time recovery status of the specified table.
+--
+-- /See:/ 'newPointInTimeRecoverySummary' smart constructor.
+data PointInTimeRecoverySummary = PointInTimeRecoverySummary'
+  { -- | Specifies the earliest possible restore point of the table in ISO 8601
+    -- format.
+    earliestRestorableTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | Shows if point-in-time recovery is enabled or disabled for the specified
+    -- table.
+    status :: PointInTimeRecoveryStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PointInTimeRecoverySummary' 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:
+--
+-- 'earliestRestorableTimestamp', 'pointInTimeRecoverySummary_earliestRestorableTimestamp' - Specifies the earliest possible restore point of the table in ISO 8601
+-- format.
+--
+-- 'status', 'pointInTimeRecoverySummary_status' - Shows if point-in-time recovery is enabled or disabled for the specified
+-- table.
+newPointInTimeRecoverySummary ::
+  -- | 'status'
+  PointInTimeRecoveryStatus ->
+  PointInTimeRecoverySummary
+newPointInTimeRecoverySummary pStatus_ =
+  PointInTimeRecoverySummary'
+    { earliestRestorableTimestamp =
+        Prelude.Nothing,
+      status = pStatus_
+    }
+
+-- | Specifies the earliest possible restore point of the table in ISO 8601
+-- format.
+pointInTimeRecoverySummary_earliestRestorableTimestamp :: Lens.Lens' PointInTimeRecoverySummary (Prelude.Maybe Prelude.UTCTime)
+pointInTimeRecoverySummary_earliestRestorableTimestamp = Lens.lens (\PointInTimeRecoverySummary' {earliestRestorableTimestamp} -> earliestRestorableTimestamp) (\s@PointInTimeRecoverySummary' {} a -> s {earliestRestorableTimestamp = a} :: PointInTimeRecoverySummary) Prelude.. Lens.mapping Data._Time
+
+-- | Shows if point-in-time recovery is enabled or disabled for the specified
+-- table.
+pointInTimeRecoverySummary_status :: Lens.Lens' PointInTimeRecoverySummary PointInTimeRecoveryStatus
+pointInTimeRecoverySummary_status = Lens.lens (\PointInTimeRecoverySummary' {status} -> status) (\s@PointInTimeRecoverySummary' {} a -> s {status = a} :: PointInTimeRecoverySummary)
+
+instance Data.FromJSON PointInTimeRecoverySummary where
+  parseJSON =
+    Data.withObject
+      "PointInTimeRecoverySummary"
+      ( \x ->
+          PointInTimeRecoverySummary'
+            Prelude.<$> (x Data..:? "earliestRestorableTimestamp")
+            Prelude.<*> (x Data..: "status")
+      )
+
+instance Prelude.Hashable PointInTimeRecoverySummary where
+  hashWithSalt _salt PointInTimeRecoverySummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` earliestRestorableTimestamp
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData PointInTimeRecoverySummary where
+  rnf PointInTimeRecoverySummary' {..} =
+    Prelude.rnf earliestRestorableTimestamp
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/KeySpaces/Types/SchemaDefinition.hs b/gen/Amazonka/KeySpaces/Types/SchemaDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/SchemaDefinition.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.KeySpaces.Types.SchemaDefinition
+-- 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.KeySpaces.Types.SchemaDefinition where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types.ClusteringKey
+import Amazonka.KeySpaces.Types.ColumnDefinition
+import Amazonka.KeySpaces.Types.PartitionKey
+import Amazonka.KeySpaces.Types.StaticColumn
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the schema of the table.
+--
+-- /See:/ 'newSchemaDefinition' smart constructor.
+data SchemaDefinition = SchemaDefinition'
+  { -- | The columns that are part of the clustering key of the table.
+    clusteringKeys :: Prelude.Maybe [ClusteringKey],
+    -- | The columns that have been defined as @STATIC@. Static columns store
+    -- values that are shared by all rows in the same partition.
+    staticColumns :: Prelude.Maybe [StaticColumn],
+    -- | The regular columns of the table.
+    allColumns :: Prelude.NonEmpty ColumnDefinition,
+    -- | The columns that are part of the partition key of the table .
+    partitionKeys :: Prelude.NonEmpty PartitionKey
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SchemaDefinition' 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:
+--
+-- 'clusteringKeys', 'schemaDefinition_clusteringKeys' - The columns that are part of the clustering key of the table.
+--
+-- 'staticColumns', 'schemaDefinition_staticColumns' - The columns that have been defined as @STATIC@. Static columns store
+-- values that are shared by all rows in the same partition.
+--
+-- 'allColumns', 'schemaDefinition_allColumns' - The regular columns of the table.
+--
+-- 'partitionKeys', 'schemaDefinition_partitionKeys' - The columns that are part of the partition key of the table .
+newSchemaDefinition ::
+  -- | 'allColumns'
+  Prelude.NonEmpty ColumnDefinition ->
+  -- | 'partitionKeys'
+  Prelude.NonEmpty PartitionKey ->
+  SchemaDefinition
+newSchemaDefinition pAllColumns_ pPartitionKeys_ =
+  SchemaDefinition'
+    { clusteringKeys = Prelude.Nothing,
+      staticColumns = Prelude.Nothing,
+      allColumns = Lens.coerced Lens.# pAllColumns_,
+      partitionKeys = Lens.coerced Lens.# pPartitionKeys_
+    }
+
+-- | The columns that are part of the clustering key of the table.
+schemaDefinition_clusteringKeys :: Lens.Lens' SchemaDefinition (Prelude.Maybe [ClusteringKey])
+schemaDefinition_clusteringKeys = Lens.lens (\SchemaDefinition' {clusteringKeys} -> clusteringKeys) (\s@SchemaDefinition' {} a -> s {clusteringKeys = a} :: SchemaDefinition) Prelude.. Lens.mapping Lens.coerced
+
+-- | The columns that have been defined as @STATIC@. Static columns store
+-- values that are shared by all rows in the same partition.
+schemaDefinition_staticColumns :: Lens.Lens' SchemaDefinition (Prelude.Maybe [StaticColumn])
+schemaDefinition_staticColumns = Lens.lens (\SchemaDefinition' {staticColumns} -> staticColumns) (\s@SchemaDefinition' {} a -> s {staticColumns = a} :: SchemaDefinition) Prelude.. Lens.mapping Lens.coerced
+
+-- | The regular columns of the table.
+schemaDefinition_allColumns :: Lens.Lens' SchemaDefinition (Prelude.NonEmpty ColumnDefinition)
+schemaDefinition_allColumns = Lens.lens (\SchemaDefinition' {allColumns} -> allColumns) (\s@SchemaDefinition' {} a -> s {allColumns = a} :: SchemaDefinition) Prelude.. Lens.coerced
+
+-- | The columns that are part of the partition key of the table .
+schemaDefinition_partitionKeys :: Lens.Lens' SchemaDefinition (Prelude.NonEmpty PartitionKey)
+schemaDefinition_partitionKeys = Lens.lens (\SchemaDefinition' {partitionKeys} -> partitionKeys) (\s@SchemaDefinition' {} a -> s {partitionKeys = a} :: SchemaDefinition) Prelude.. Lens.coerced
+
+instance Data.FromJSON SchemaDefinition where
+  parseJSON =
+    Data.withObject
+      "SchemaDefinition"
+      ( \x ->
+          SchemaDefinition'
+            Prelude.<$> (x Data..:? "clusteringKeys" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "staticColumns" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "allColumns")
+            Prelude.<*> (x Data..: "partitionKeys")
+      )
+
+instance Prelude.Hashable SchemaDefinition where
+  hashWithSalt _salt SchemaDefinition' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusteringKeys
+      `Prelude.hashWithSalt` staticColumns
+      `Prelude.hashWithSalt` allColumns
+      `Prelude.hashWithSalt` partitionKeys
+
+instance Prelude.NFData SchemaDefinition where
+  rnf SchemaDefinition' {..} =
+    Prelude.rnf clusteringKeys
+      `Prelude.seq` Prelude.rnf staticColumns
+      `Prelude.seq` Prelude.rnf allColumns
+      `Prelude.seq` Prelude.rnf partitionKeys
+
+instance Data.ToJSON SchemaDefinition where
+  toJSON SchemaDefinition' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clusteringKeys" Data..=)
+              Prelude.<$> clusteringKeys,
+            ("staticColumns" Data..=) Prelude.<$> staticColumns,
+            Prelude.Just ("allColumns" Data..= allColumns),
+            Prelude.Just
+              ("partitionKeys" Data..= partitionKeys)
+          ]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/SortOrder.hs b/gen/Amazonka/KeySpaces/Types/SortOrder.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/SortOrder.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.KeySpaces.Types.SortOrder
+-- 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.KeySpaces.Types.SortOrder
+  ( SortOrder
+      ( ..,
+        SortOrder_ASC,
+        SortOrder_DESC
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SortOrder = SortOrder'
+  { fromSortOrder ::
+      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 SortOrder_ASC :: SortOrder
+pattern SortOrder_ASC = SortOrder' "ASC"
+
+pattern SortOrder_DESC :: SortOrder
+pattern SortOrder_DESC = SortOrder' "DESC"
+
+{-# COMPLETE
+  SortOrder_ASC,
+  SortOrder_DESC,
+  SortOrder'
+  #-}
diff --git a/gen/Amazonka/KeySpaces/Types/StaticColumn.hs b/gen/Amazonka/KeySpaces/Types/StaticColumn.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/StaticColumn.hs
@@ -0,0 +1,74 @@
+{-# 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.KeySpaces.Types.StaticColumn
+-- 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.KeySpaces.Types.StaticColumn 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 static columns of the table. Static columns store values that are
+-- shared by all rows in the same partition.
+--
+-- /See:/ 'newStaticColumn' smart constructor.
+data StaticColumn = StaticColumn'
+  { -- | The name of the static column.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StaticColumn' 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', 'staticColumn_name' - The name of the static column.
+newStaticColumn ::
+  -- | 'name'
+  Prelude.Text ->
+  StaticColumn
+newStaticColumn pName_ = StaticColumn' {name = pName_}
+
+-- | The name of the static column.
+staticColumn_name :: Lens.Lens' StaticColumn Prelude.Text
+staticColumn_name = Lens.lens (\StaticColumn' {name} -> name) (\s@StaticColumn' {} a -> s {name = a} :: StaticColumn)
+
+instance Data.FromJSON StaticColumn where
+  parseJSON =
+    Data.withObject
+      "StaticColumn"
+      (\x -> StaticColumn' Prelude.<$> (x Data..: "name"))
+
+instance Prelude.Hashable StaticColumn where
+  hashWithSalt _salt StaticColumn' {..} =
+    _salt `Prelude.hashWithSalt` name
+
+instance Prelude.NFData StaticColumn where
+  rnf StaticColumn' {..} = Prelude.rnf name
+
+instance Data.ToJSON StaticColumn where
+  toJSON StaticColumn' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("name" Data..= name)]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/TableStatus.hs b/gen/Amazonka/KeySpaces/Types/TableStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/TableStatus.hs
@@ -0,0 +1,96 @@
+{-# 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.KeySpaces.Types.TableStatus
+-- 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.KeySpaces.Types.TableStatus
+  ( TableStatus
+      ( ..,
+        TableStatus_ACTIVE,
+        TableStatus_CREATING,
+        TableStatus_DELETED,
+        TableStatus_DELETING,
+        TableStatus_INACCESSIBLE_ENCRYPTION_CREDENTIALS,
+        TableStatus_RESTORING,
+        TableStatus_UPDATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TableStatus = TableStatus'
+  { fromTableStatus ::
+      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 TableStatus_ACTIVE :: TableStatus
+pattern TableStatus_ACTIVE = TableStatus' "ACTIVE"
+
+pattern TableStatus_CREATING :: TableStatus
+pattern TableStatus_CREATING = TableStatus' "CREATING"
+
+pattern TableStatus_DELETED :: TableStatus
+pattern TableStatus_DELETED = TableStatus' "DELETED"
+
+pattern TableStatus_DELETING :: TableStatus
+pattern TableStatus_DELETING = TableStatus' "DELETING"
+
+pattern TableStatus_INACCESSIBLE_ENCRYPTION_CREDENTIALS :: TableStatus
+pattern TableStatus_INACCESSIBLE_ENCRYPTION_CREDENTIALS = TableStatus' "INACCESSIBLE_ENCRYPTION_CREDENTIALS"
+
+pattern TableStatus_RESTORING :: TableStatus
+pattern TableStatus_RESTORING = TableStatus' "RESTORING"
+
+pattern TableStatus_UPDATING :: TableStatus
+pattern TableStatus_UPDATING = TableStatus' "UPDATING"
+
+{-# COMPLETE
+  TableStatus_ACTIVE,
+  TableStatus_CREATING,
+  TableStatus_DELETED,
+  TableStatus_DELETING,
+  TableStatus_INACCESSIBLE_ENCRYPTION_CREDENTIALS,
+  TableStatus_RESTORING,
+  TableStatus_UPDATING,
+  TableStatus'
+  #-}
diff --git a/gen/Amazonka/KeySpaces/Types/TableSummary.hs b/gen/Amazonka/KeySpaces/Types/TableSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/TableSummary.hs
@@ -0,0 +1,110 @@
+{-# 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.KeySpaces.Types.TableSummary
+-- 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.KeySpaces.Types.TableSummary 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 name of the specified table, the keyspace it is stored in,
+-- and the unique identifier in the format of an Amazon Resource Name
+-- (ARN).
+--
+-- /See:/ 'newTableSummary' smart constructor.
+data TableSummary = TableSummary'
+  { -- | The name of the keyspace that the table is stored in.
+    keyspaceName :: Prelude.Text,
+    -- | The name of the table.
+    tableName :: Prelude.Text,
+    -- | The unique identifier of the table in the format of an Amazon Resource
+    -- Name (ARN).
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TableSummary' 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:
+--
+-- 'keyspaceName', 'tableSummary_keyspaceName' - The name of the keyspace that the table is stored in.
+--
+-- 'tableName', 'tableSummary_tableName' - The name of the table.
+--
+-- 'resourceArn', 'tableSummary_resourceArn' - The unique identifier of the table in the format of an Amazon Resource
+-- Name (ARN).
+newTableSummary ::
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TableSummary
+newTableSummary
+  pKeyspaceName_
+  pTableName_
+  pResourceArn_ =
+    TableSummary'
+      { keyspaceName = pKeyspaceName_,
+        tableName = pTableName_,
+        resourceArn = pResourceArn_
+      }
+
+-- | The name of the keyspace that the table is stored in.
+tableSummary_keyspaceName :: Lens.Lens' TableSummary Prelude.Text
+tableSummary_keyspaceName = Lens.lens (\TableSummary' {keyspaceName} -> keyspaceName) (\s@TableSummary' {} a -> s {keyspaceName = a} :: TableSummary)
+
+-- | The name of the table.
+tableSummary_tableName :: Lens.Lens' TableSummary Prelude.Text
+tableSummary_tableName = Lens.lens (\TableSummary' {tableName} -> tableName) (\s@TableSummary' {} a -> s {tableName = a} :: TableSummary)
+
+-- | The unique identifier of the table in the format of an Amazon Resource
+-- Name (ARN).
+tableSummary_resourceArn :: Lens.Lens' TableSummary Prelude.Text
+tableSummary_resourceArn = Lens.lens (\TableSummary' {resourceArn} -> resourceArn) (\s@TableSummary' {} a -> s {resourceArn = a} :: TableSummary)
+
+instance Data.FromJSON TableSummary where
+  parseJSON =
+    Data.withObject
+      "TableSummary"
+      ( \x ->
+          TableSummary'
+            Prelude.<$> (x Data..: "keyspaceName")
+            Prelude.<*> (x Data..: "tableName")
+            Prelude.<*> (x Data..: "resourceArn")
+      )
+
+instance Prelude.Hashable TableSummary where
+  hashWithSalt _salt TableSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` keyspaceName
+      `Prelude.hashWithSalt` tableName
+      `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData TableSummary where
+  rnf TableSummary' {..} =
+    Prelude.rnf keyspaceName
+      `Prelude.seq` Prelude.rnf tableName
+      `Prelude.seq` Prelude.rnf resourceArn
diff --git a/gen/Amazonka/KeySpaces/Types/Tag.hs b/gen/Amazonka/KeySpaces/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/Tag.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.KeySpaces.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.KeySpaces.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
+
+-- | Describes a tag. A tag is a key-value pair. You can add up to 50 tags to
+-- a single Amazon Keyspaces resource.
+--
+-- Amazon Web Services-assigned tag names and values are automatically
+-- assigned the @aws:@ prefix, which the user cannot assign. Amazon Web
+-- Services-assigned tag names do not count towards the tag limit of 50.
+-- User-assigned tag names have the prefix @user:@ in the Cost Allocation
+-- Report. You cannot backdate the application of a tag.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/tagging-keyspaces.html Adding tags and labels to Amazon Keyspaces resources>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | The key of the tag. Tag keys are case sensitive. Each Amazon Keyspaces
+    -- resource can only have up to one tag with the same key. If you try to
+    -- add an existing tag (same key), the existing tag value will be updated
+    -- to the new value.
+    key :: Prelude.Text,
+    -- | The value of the tag. Tag values are case-sensitive and can be null.
+    value :: 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 of the tag. Tag keys are case sensitive. Each Amazon Keyspaces
+-- resource can only have up to one tag with the same key. If you try to
+-- add an existing tag (same key), the existing tag value will be updated
+-- to the new value.
+--
+-- 'value', 'tag_value' - The value of the tag. Tag values are case-sensitive and can be null.
+newTag ::
+  -- | 'key'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  Tag
+newTag pKey_ pValue_ =
+  Tag' {key = pKey_, value = pValue_}
+
+-- | The key of the tag. Tag keys are case sensitive. Each Amazon Keyspaces
+-- resource can only have up to one tag with the same key. If you try to
+-- add an existing tag (same key), the existing tag value will be updated
+-- to the new value.
+tag_key :: Lens.Lens' Tag Prelude.Text
+tag_key = Lens.lens (\Tag' {key} -> key) (\s@Tag' {} a -> s {key = a} :: Tag)
+
+-- | The value of the tag. Tag values are case-sensitive and can be null.
+tag_value :: Lens.Lens' Tag 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
+          [ Prelude.Just ("key" Data..= key),
+            Prelude.Just ("value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/ThroughputMode.hs b/gen/Amazonka/KeySpaces/Types/ThroughputMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/ThroughputMode.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.KeySpaces.Types.ThroughputMode
+-- 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.KeySpaces.Types.ThroughputMode
+  ( ThroughputMode
+      ( ..,
+        ThroughputMode_PAY_PER_REQUEST,
+        ThroughputMode_PROVISIONED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ThroughputMode = ThroughputMode'
+  { fromThroughputMode ::
+      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 ThroughputMode_PAY_PER_REQUEST :: ThroughputMode
+pattern ThroughputMode_PAY_PER_REQUEST = ThroughputMode' "PAY_PER_REQUEST"
+
+pattern ThroughputMode_PROVISIONED :: ThroughputMode
+pattern ThroughputMode_PROVISIONED = ThroughputMode' "PROVISIONED"
+
+{-# COMPLETE
+  ThroughputMode_PAY_PER_REQUEST,
+  ThroughputMode_PROVISIONED,
+  ThroughputMode'
+  #-}
diff --git a/gen/Amazonka/KeySpaces/Types/TimeToLive.hs b/gen/Amazonka/KeySpaces/Types/TimeToLive.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/TimeToLive.hs
@@ -0,0 +1,83 @@
+{-# 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.KeySpaces.Types.TimeToLive
+-- 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.KeySpaces.Types.TimeToLive where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types.TimeToLiveStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Enable custom Time to Live (TTL) settings for rows and columns without
+-- setting a TTL default for the specified table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL-how-it-works.html#ttl-howitworks_enabling Enabling TTL on tables>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- /See:/ 'newTimeToLive' smart constructor.
+data TimeToLive = TimeToLive'
+  { -- | Shows how to enable custom Time to Live (TTL) settings for the specified
+    -- table.
+    status :: TimeToLiveStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TimeToLive' 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:
+--
+-- 'status', 'timeToLive_status' - Shows how to enable custom Time to Live (TTL) settings for the specified
+-- table.
+newTimeToLive ::
+  -- | 'status'
+  TimeToLiveStatus ->
+  TimeToLive
+newTimeToLive pStatus_ =
+  TimeToLive' {status = pStatus_}
+
+-- | Shows how to enable custom Time to Live (TTL) settings for the specified
+-- table.
+timeToLive_status :: Lens.Lens' TimeToLive TimeToLiveStatus
+timeToLive_status = Lens.lens (\TimeToLive' {status} -> status) (\s@TimeToLive' {} a -> s {status = a} :: TimeToLive)
+
+instance Data.FromJSON TimeToLive where
+  parseJSON =
+    Data.withObject
+      "TimeToLive"
+      (\x -> TimeToLive' Prelude.<$> (x Data..: "status"))
+
+instance Prelude.Hashable TimeToLive where
+  hashWithSalt _salt TimeToLive' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData TimeToLive where
+  rnf TimeToLive' {..} = Prelude.rnf status
+
+instance Data.ToJSON TimeToLive where
+  toJSON TimeToLive' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("status" Data..= status)]
+      )
diff --git a/gen/Amazonka/KeySpaces/Types/TimeToLiveStatus.hs b/gen/Amazonka/KeySpaces/Types/TimeToLiveStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/Types/TimeToLiveStatus.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.KeySpaces.Types.TimeToLiveStatus
+-- 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.KeySpaces.Types.TimeToLiveStatus
+  ( TimeToLiveStatus
+      ( ..,
+        TimeToLiveStatus_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TimeToLiveStatus = TimeToLiveStatus'
+  { fromTimeToLiveStatus ::
+      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 TimeToLiveStatus_ENABLED :: TimeToLiveStatus
+pattern TimeToLiveStatus_ENABLED = TimeToLiveStatus' "ENABLED"
+
+{-# COMPLETE
+  TimeToLiveStatus_ENABLED,
+  TimeToLiveStatus'
+  #-}
diff --git a/gen/Amazonka/KeySpaces/UntagResource.hs b/gen/Amazonka/KeySpaces/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/UntagResource.hs
@@ -0,0 +1,179 @@
+{-# 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.KeySpaces.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)
+--
+-- Removes the association of tags from a Amazon Keyspaces resource.
+module Amazonka.KeySpaces.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tags,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    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.KeySpaces.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 Keyspaces resource that the tags will be removed from. This
+    -- value is an Amazon Resource Name (ARN).
+    resourceArn :: Prelude.Text,
+    -- | A list of existing tags to be removed from the Amazon Keyspaces
+    -- resource.
+    tags :: Prelude.NonEmpty Tag
+  }
+  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 Keyspaces resource that the tags will be removed from. This
+-- value is an Amazon Resource Name (ARN).
+--
+-- 'tags', 'untagResource_tags' - A list of existing tags to be removed from the Amazon Keyspaces
+-- resource.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  -- | 'tags'
+  Prelude.NonEmpty Tag ->
+  UntagResource
+newUntagResource pResourceArn_ pTags_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tags = Lens.coerced Lens.# pTags_
+    }
+
+-- | The Amazon Keyspaces resource that the tags will be removed from. This
+-- value is an Amazon Resource Name (ARN).
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | A list of existing tags to be removed from the Amazon Keyspaces
+-- resource.
+untagResource_tags :: Lens.Lens' UntagResource (Prelude.NonEmpty Tag)
+untagResource_tags = Lens.lens (\UntagResource' {tags} -> tags) (\s@UntagResource' {} a -> s {tags = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.UntagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UntagResource where
+  toJSON UntagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("resourceArn" Data..= resourceArn),
+            Prelude.Just ("tags" Data..= tags)
+          ]
+      )
+
+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 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:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | 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 httpStatus
diff --git a/gen/Amazonka/KeySpaces/UpdateTable.hs b/gen/Amazonka/KeySpaces/UpdateTable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/UpdateTable.hs
@@ -0,0 +1,446 @@
+{-# 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.KeySpaces.UpdateTable
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds new columns to the table or updates one of the table\'s settings,
+-- for example capacity mode, encryption, point-in-time recovery, or ttl
+-- settings. Note that you can only update one specific table setting per
+-- update operation.
+module Amazonka.KeySpaces.UpdateTable
+  ( -- * Creating a Request
+    UpdateTable (..),
+    newUpdateTable,
+
+    -- * Request Lenses
+    updateTable_addColumns,
+    updateTable_capacitySpecification,
+    updateTable_defaultTimeToLive,
+    updateTable_encryptionSpecification,
+    updateTable_pointInTimeRecovery,
+    updateTable_ttl,
+    updateTable_keyspaceName,
+    updateTable_tableName,
+
+    -- * Destructuring the Response
+    UpdateTableResponse (..),
+    newUpdateTableResponse,
+
+    -- * Response Lenses
+    updateTableResponse_httpStatus,
+    updateTableResponse_resourceArn,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateTable' smart constructor.
+data UpdateTable = UpdateTable'
+  { -- | For each column to be added to the specified table:
+    --
+    -- • @name@ - The name of the column.
+    --
+    -- • @type@ - An Amazon Keyspaces data type. For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.data-types Data types>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    addColumns :: Prelude.Maybe (Prelude.NonEmpty ColumnDefinition),
+    -- | Modifies the read\/write throughput capacity mode for the table. The
+    -- options are:
+    --
+    -- • @throughputMode:PAY_PER_REQUEST@ and
+    --
+    -- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+    -- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+    --
+    -- The default is @throughput_mode:PAY_PER_REQUEST@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    capacitySpecification :: Prelude.Maybe CapacitySpecification,
+    -- | The default Time to Live setting in seconds for the table.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL-how-it-works.html#ttl-howitworks_default_ttl Setting the default TTL value for a table>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    defaultTimeToLive :: Prelude.Maybe Prelude.Natural,
+    -- | Modifies the encryption settings of the table. You can choose one of the
+    -- following KMS key (KMS key):
+    --
+    -- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+    --
+    -- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+    -- and is created, owned, and managed by you. This option requires the
+    -- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+    -- as input.
+    --
+    -- The default is @AWS_OWNED_KMS_KEY@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    encryptionSpecification :: Prelude.Maybe EncryptionSpecification,
+    -- | Modifies the @pointInTimeRecovery@ settings of the table. The options
+    -- are:
+    --
+    -- • @ENABLED@
+    --
+    -- • @DISABLED@
+    --
+    -- If it\'s not specified, the default is @DISABLED@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery.html Point-in-time recovery>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    pointInTimeRecovery :: Prelude.Maybe PointInTimeRecovery,
+    -- | Modifies Time to Live custom settings for the table. The options are:
+    --
+    -- • @status:enabled@
+    --
+    -- • @status:disabled@
+    --
+    -- The default is @status:disabled@. After @ttl@ is enabled, you can\'t
+    -- disable it for the table.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL.html Expiring data by using Amazon Keyspaces Time to Live (TTL)>
+    -- in the /Amazon Keyspaces Developer Guide/.
+    ttl :: Prelude.Maybe TimeToLive,
+    -- | The name of the keyspace the specified table is stored in.
+    keyspaceName :: Prelude.Text,
+    -- | The name of the table.
+    tableName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateTable' 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:
+--
+-- 'addColumns', 'updateTable_addColumns' - For each column to be added to the specified table:
+--
+-- • @name@ - The name of the column.
+--
+-- • @type@ - An Amazon Keyspaces data type. For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.data-types Data types>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'capacitySpecification', 'updateTable_capacitySpecification' - Modifies the read\/write throughput capacity mode for the table. The
+-- options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@ and
+--
+-- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+-- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+--
+-- The default is @throughput_mode:PAY_PER_REQUEST@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'defaultTimeToLive', 'updateTable_defaultTimeToLive' - The default Time to Live setting in seconds for the table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL-how-it-works.html#ttl-howitworks_default_ttl Setting the default TTL value for a table>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'encryptionSpecification', 'updateTable_encryptionSpecification' - Modifies the encryption settings of the table. You can choose one of the
+-- following KMS key (KMS key):
+--
+-- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+--
+-- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+-- and is created, owned, and managed by you. This option requires the
+-- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+-- as input.
+--
+-- The default is @AWS_OWNED_KMS_KEY@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'pointInTimeRecovery', 'updateTable_pointInTimeRecovery' - Modifies the @pointInTimeRecovery@ settings of the table. The options
+-- are:
+--
+-- • @ENABLED@
+--
+-- • @DISABLED@
+--
+-- If it\'s not specified, the default is @DISABLED@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery.html Point-in-time recovery>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'ttl', 'updateTable_ttl' - Modifies Time to Live custom settings for the table. The options are:
+--
+-- • @status:enabled@
+--
+-- • @status:disabled@
+--
+-- The default is @status:disabled@. After @ttl@ is enabled, you can\'t
+-- disable it for the table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL.html Expiring data by using Amazon Keyspaces Time to Live (TTL)>
+-- in the /Amazon Keyspaces Developer Guide/.
+--
+-- 'keyspaceName', 'updateTable_keyspaceName' - The name of the keyspace the specified table is stored in.
+--
+-- 'tableName', 'updateTable_tableName' - The name of the table.
+newUpdateTable ::
+  -- | 'keyspaceName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  UpdateTable
+newUpdateTable pKeyspaceName_ pTableName_ =
+  UpdateTable'
+    { addColumns = Prelude.Nothing,
+      capacitySpecification = Prelude.Nothing,
+      defaultTimeToLive = Prelude.Nothing,
+      encryptionSpecification = Prelude.Nothing,
+      pointInTimeRecovery = Prelude.Nothing,
+      ttl = Prelude.Nothing,
+      keyspaceName = pKeyspaceName_,
+      tableName = pTableName_
+    }
+
+-- | For each column to be added to the specified table:
+--
+-- • @name@ - The name of the column.
+--
+-- • @type@ - An Amazon Keyspaces data type. For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.data-types Data types>
+-- in the /Amazon Keyspaces Developer Guide/.
+updateTable_addColumns :: Lens.Lens' UpdateTable (Prelude.Maybe (Prelude.NonEmpty ColumnDefinition))
+updateTable_addColumns = Lens.lens (\UpdateTable' {addColumns} -> addColumns) (\s@UpdateTable' {} a -> s {addColumns = a} :: UpdateTable) Prelude.. Lens.mapping Lens.coerced
+
+-- | Modifies the read\/write throughput capacity mode for the table. The
+-- options are:
+--
+-- • @throughputMode:PAY_PER_REQUEST@ and
+--
+-- • @throughputMode:PROVISIONED@ - Provisioned capacity mode requires
+-- @readCapacityUnits@ and @writeCapacityUnits@ as input.
+--
+-- The default is @throughput_mode:PAY_PER_REQUEST@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html Read\/write capacity modes>
+-- in the /Amazon Keyspaces Developer Guide/.
+updateTable_capacitySpecification :: Lens.Lens' UpdateTable (Prelude.Maybe CapacitySpecification)
+updateTable_capacitySpecification = Lens.lens (\UpdateTable' {capacitySpecification} -> capacitySpecification) (\s@UpdateTable' {} a -> s {capacitySpecification = a} :: UpdateTable)
+
+-- | The default Time to Live setting in seconds for the table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL-how-it-works.html#ttl-howitworks_default_ttl Setting the default TTL value for a table>
+-- in the /Amazon Keyspaces Developer Guide/.
+updateTable_defaultTimeToLive :: Lens.Lens' UpdateTable (Prelude.Maybe Prelude.Natural)
+updateTable_defaultTimeToLive = Lens.lens (\UpdateTable' {defaultTimeToLive} -> defaultTimeToLive) (\s@UpdateTable' {} a -> s {defaultTimeToLive = a} :: UpdateTable)
+
+-- | Modifies the encryption settings of the table. You can choose one of the
+-- following KMS key (KMS key):
+--
+-- • @type:AWS_OWNED_KMS_KEY@ - This key is owned by Amazon Keyspaces.
+--
+-- • @type:CUSTOMER_MANAGED_KMS_KEY@ - This key is stored in your account
+-- and is created, owned, and managed by you. This option requires the
+-- @kms_key_identifier@ of the KMS key in Amazon Resource Name (ARN) format
+-- as input.
+--
+-- The default is @AWS_OWNED_KMS_KEY@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html Encryption at rest>
+-- in the /Amazon Keyspaces Developer Guide/.
+updateTable_encryptionSpecification :: Lens.Lens' UpdateTable (Prelude.Maybe EncryptionSpecification)
+updateTable_encryptionSpecification = Lens.lens (\UpdateTable' {encryptionSpecification} -> encryptionSpecification) (\s@UpdateTable' {} a -> s {encryptionSpecification = a} :: UpdateTable)
+
+-- | Modifies the @pointInTimeRecovery@ settings of the table. The options
+-- are:
+--
+-- • @ENABLED@
+--
+-- • @DISABLED@
+--
+-- If it\'s not specified, the default is @DISABLED@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/PointInTimeRecovery.html Point-in-time recovery>
+-- in the /Amazon Keyspaces Developer Guide/.
+updateTable_pointInTimeRecovery :: Lens.Lens' UpdateTable (Prelude.Maybe PointInTimeRecovery)
+updateTable_pointInTimeRecovery = Lens.lens (\UpdateTable' {pointInTimeRecovery} -> pointInTimeRecovery) (\s@UpdateTable' {} a -> s {pointInTimeRecovery = a} :: UpdateTable)
+
+-- | Modifies Time to Live custom settings for the table. The options are:
+--
+-- • @status:enabled@
+--
+-- • @status:disabled@
+--
+-- The default is @status:disabled@. After @ttl@ is enabled, you can\'t
+-- disable it for the table.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL.html Expiring data by using Amazon Keyspaces Time to Live (TTL)>
+-- in the /Amazon Keyspaces Developer Guide/.
+updateTable_ttl :: Lens.Lens' UpdateTable (Prelude.Maybe TimeToLive)
+updateTable_ttl = Lens.lens (\UpdateTable' {ttl} -> ttl) (\s@UpdateTable' {} a -> s {ttl = a} :: UpdateTable)
+
+-- | The name of the keyspace the specified table is stored in.
+updateTable_keyspaceName :: Lens.Lens' UpdateTable Prelude.Text
+updateTable_keyspaceName = Lens.lens (\UpdateTable' {keyspaceName} -> keyspaceName) (\s@UpdateTable' {} a -> s {keyspaceName = a} :: UpdateTable)
+
+-- | The name of the table.
+updateTable_tableName :: Lens.Lens' UpdateTable Prelude.Text
+updateTable_tableName = Lens.lens (\UpdateTable' {tableName} -> tableName) (\s@UpdateTable' {} a -> s {tableName = a} :: UpdateTable)
+
+instance Core.AWSRequest UpdateTable where
+  type AWSResponse UpdateTable = UpdateTableResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateTableResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "resourceArn")
+      )
+
+instance Prelude.Hashable UpdateTable where
+  hashWithSalt _salt UpdateTable' {..} =
+    _salt
+      `Prelude.hashWithSalt` addColumns
+      `Prelude.hashWithSalt` capacitySpecification
+      `Prelude.hashWithSalt` defaultTimeToLive
+      `Prelude.hashWithSalt` encryptionSpecification
+      `Prelude.hashWithSalt` pointInTimeRecovery
+      `Prelude.hashWithSalt` ttl
+      `Prelude.hashWithSalt` keyspaceName
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData UpdateTable where
+  rnf UpdateTable' {..} =
+    Prelude.rnf addColumns
+      `Prelude.seq` Prelude.rnf capacitySpecification
+      `Prelude.seq` Prelude.rnf defaultTimeToLive
+      `Prelude.seq` Prelude.rnf encryptionSpecification
+      `Prelude.seq` Prelude.rnf pointInTimeRecovery
+      `Prelude.seq` Prelude.rnf ttl
+      `Prelude.seq` Prelude.rnf keyspaceName
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders UpdateTable where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "KeyspacesService.UpdateTable" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateTable where
+  toJSON UpdateTable' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("addColumns" Data..=) Prelude.<$> addColumns,
+            ("capacitySpecification" Data..=)
+              Prelude.<$> capacitySpecification,
+            ("defaultTimeToLive" Data..=)
+              Prelude.<$> defaultTimeToLive,
+            ("encryptionSpecification" Data..=)
+              Prelude.<$> encryptionSpecification,
+            ("pointInTimeRecovery" Data..=)
+              Prelude.<$> pointInTimeRecovery,
+            ("ttl" Data..=) Prelude.<$> ttl,
+            Prelude.Just ("keyspaceName" Data..= keyspaceName),
+            Prelude.Just ("tableName" Data..= tableName)
+          ]
+      )
+
+instance Data.ToPath UpdateTable where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateTable where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateTableResponse' smart constructor.
+data UpdateTableResponse = UpdateTableResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The Amazon Resource Name (ARN) of the modified table.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateTableResponse' 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:
+--
+-- 'httpStatus', 'updateTableResponse_httpStatus' - The response's http status code.
+--
+-- 'resourceArn', 'updateTableResponse_resourceArn' - The Amazon Resource Name (ARN) of the modified table.
+newUpdateTableResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UpdateTableResponse
+newUpdateTableResponse pHttpStatus_ pResourceArn_ =
+  UpdateTableResponse'
+    { httpStatus = pHttpStatus_,
+      resourceArn = pResourceArn_
+    }
+
+-- | The response's http status code.
+updateTableResponse_httpStatus :: Lens.Lens' UpdateTableResponse Prelude.Int
+updateTableResponse_httpStatus = Lens.lens (\UpdateTableResponse' {httpStatus} -> httpStatus) (\s@UpdateTableResponse' {} a -> s {httpStatus = a} :: UpdateTableResponse)
+
+-- | The Amazon Resource Name (ARN) of the modified table.
+updateTableResponse_resourceArn :: Lens.Lens' UpdateTableResponse Prelude.Text
+updateTableResponse_resourceArn = Lens.lens (\UpdateTableResponse' {resourceArn} -> resourceArn) (\s@UpdateTableResponse' {} a -> s {resourceArn = a} :: UpdateTableResponse)
+
+instance Prelude.NFData UpdateTableResponse where
+  rnf UpdateTableResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf resourceArn
diff --git a/gen/Amazonka/KeySpaces/Waiters.hs b/gen/Amazonka/KeySpaces/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KeySpaces/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.KeySpaces.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.KeySpaces.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KeySpaces.Lens
+import Amazonka.KeySpaces.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.KeySpaces
+import Test.Amazonka.KeySpaces.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "KeySpaces"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/KeySpaces.hs b/test/Test/Amazonka/Gen/KeySpaces.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/KeySpaces.hs
@@ -0,0 +1,298 @@
+{-# 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.KeySpaces
+-- 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.KeySpaces where
+
+import Amazonka.KeySpaces
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.KeySpaces.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"
+--         [ requestCreateKeyspace $
+--             newCreateKeyspace
+--
+--         , requestCreateTable $
+--             newCreateTable
+--
+--         , requestDeleteKeyspace $
+--             newDeleteKeyspace
+--
+--         , requestDeleteTable $
+--             newDeleteTable
+--
+--         , requestGetKeyspace $
+--             newGetKeyspace
+--
+--         , requestGetTable $
+--             newGetTable
+--
+--         , requestListKeyspaces $
+--             newListKeyspaces
+--
+--         , requestListTables $
+--             newListTables
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestRestoreTable $
+--             newRestoreTable
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateTable $
+--             newUpdateTable
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateKeyspace $
+--             newCreateKeyspaceResponse
+--
+--         , responseCreateTable $
+--             newCreateTableResponse
+--
+--         , responseDeleteKeyspace $
+--             newDeleteKeyspaceResponse
+--
+--         , responseDeleteTable $
+--             newDeleteTableResponse
+--
+--         , responseGetKeyspace $
+--             newGetKeyspaceResponse
+--
+--         , responseGetTable $
+--             newGetTableResponse
+--
+--         , responseListKeyspaces $
+--             newListKeyspacesResponse
+--
+--         , responseListTables $
+--             newListTablesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseRestoreTable $
+--             newRestoreTableResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateTable $
+--             newUpdateTableResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateKeyspace :: CreateKeyspace -> TestTree
+requestCreateKeyspace =
+  req
+    "CreateKeyspace"
+    "fixture/CreateKeyspace.yaml"
+
+requestCreateTable :: CreateTable -> TestTree
+requestCreateTable =
+  req
+    "CreateTable"
+    "fixture/CreateTable.yaml"
+
+requestDeleteKeyspace :: DeleteKeyspace -> TestTree
+requestDeleteKeyspace =
+  req
+    "DeleteKeyspace"
+    "fixture/DeleteKeyspace.yaml"
+
+requestDeleteTable :: DeleteTable -> TestTree
+requestDeleteTable =
+  req
+    "DeleteTable"
+    "fixture/DeleteTable.yaml"
+
+requestGetKeyspace :: GetKeyspace -> TestTree
+requestGetKeyspace =
+  req
+    "GetKeyspace"
+    "fixture/GetKeyspace.yaml"
+
+requestGetTable :: GetTable -> TestTree
+requestGetTable =
+  req
+    "GetTable"
+    "fixture/GetTable.yaml"
+
+requestListKeyspaces :: ListKeyspaces -> TestTree
+requestListKeyspaces =
+  req
+    "ListKeyspaces"
+    "fixture/ListKeyspaces.yaml"
+
+requestListTables :: ListTables -> TestTree
+requestListTables =
+  req
+    "ListTables"
+    "fixture/ListTables.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestRestoreTable :: RestoreTable -> TestTree
+requestRestoreTable =
+  req
+    "RestoreTable"
+    "fixture/RestoreTable.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateTable :: UpdateTable -> TestTree
+requestUpdateTable =
+  req
+    "UpdateTable"
+    "fixture/UpdateTable.yaml"
+
+-- Responses
+
+responseCreateKeyspace :: CreateKeyspaceResponse -> TestTree
+responseCreateKeyspace =
+  res
+    "CreateKeyspaceResponse"
+    "fixture/CreateKeyspaceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateKeyspace)
+
+responseCreateTable :: CreateTableResponse -> TestTree
+responseCreateTable =
+  res
+    "CreateTableResponse"
+    "fixture/CreateTableResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateTable)
+
+responseDeleteKeyspace :: DeleteKeyspaceResponse -> TestTree
+responseDeleteKeyspace =
+  res
+    "DeleteKeyspaceResponse"
+    "fixture/DeleteKeyspaceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteKeyspace)
+
+responseDeleteTable :: DeleteTableResponse -> TestTree
+responseDeleteTable =
+  res
+    "DeleteTableResponse"
+    "fixture/DeleteTableResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteTable)
+
+responseGetKeyspace :: GetKeyspaceResponse -> TestTree
+responseGetKeyspace =
+  res
+    "GetKeyspaceResponse"
+    "fixture/GetKeyspaceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetKeyspace)
+
+responseGetTable :: GetTableResponse -> TestTree
+responseGetTable =
+  res
+    "GetTableResponse"
+    "fixture/GetTableResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetTable)
+
+responseListKeyspaces :: ListKeyspacesResponse -> TestTree
+responseListKeyspaces =
+  res
+    "ListKeyspacesResponse"
+    "fixture/ListKeyspacesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListKeyspaces)
+
+responseListTables :: ListTablesResponse -> TestTree
+responseListTables =
+  res
+    "ListTablesResponse"
+    "fixture/ListTablesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTables)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseRestoreTable :: RestoreTableResponse -> TestTree
+responseRestoreTable =
+  res
+    "RestoreTableResponse"
+    "fixture/RestoreTableResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RestoreTable)
+
+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)
+
+responseUpdateTable :: UpdateTableResponse -> TestTree
+responseUpdateTable =
+  res
+    "UpdateTableResponse"
+    "fixture/UpdateTableResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateTable)
diff --git a/test/Test/Amazonka/KeySpaces.hs b/test/Test/Amazonka/KeySpaces.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/KeySpaces.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.KeySpaces
+-- 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.KeySpaces
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/KeySpaces/Internal.hs b/test/Test/Amazonka/KeySpaces/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/KeySpaces/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.KeySpaces.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.KeySpaces.Internal where
