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 Timestream Write SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2018-11-01@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-timestream-write)
+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.TimeStreamWrite](http://hackage.haskell.org/package/amazonka-timestream-write/docs/Amazonka-TimeStreamWrite.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-timestream-write` 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-timestream-write.cabal b/amazonka-timestream-write.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-timestream-write.cabal
@@ -0,0 +1,115 @@
+cabal-version:      2.2
+name:               amazonka-timestream-write
+version:            2.0
+synopsis:           Amazon Timestream Write 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 @2018-11-01@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.TimeStreamWrite.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.TimeStreamWrite" 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-timestream-write
+
+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.TimeStreamWrite
+    Amazonka.TimeStreamWrite.CreateDatabase
+    Amazonka.TimeStreamWrite.CreateTable
+    Amazonka.TimeStreamWrite.DeleteDatabase
+    Amazonka.TimeStreamWrite.DeleteTable
+    Amazonka.TimeStreamWrite.DescribeDatabase
+    Amazonka.TimeStreamWrite.DescribeEndpoints
+    Amazonka.TimeStreamWrite.DescribeTable
+    Amazonka.TimeStreamWrite.Lens
+    Amazonka.TimeStreamWrite.ListDatabases
+    Amazonka.TimeStreamWrite.ListTables
+    Amazonka.TimeStreamWrite.ListTagsForResource
+    Amazonka.TimeStreamWrite.TagResource
+    Amazonka.TimeStreamWrite.Types
+    Amazonka.TimeStreamWrite.Types.Database
+    Amazonka.TimeStreamWrite.Types.Dimension
+    Amazonka.TimeStreamWrite.Types.DimensionValueType
+    Amazonka.TimeStreamWrite.Types.Endpoint
+    Amazonka.TimeStreamWrite.Types.MagneticStoreRejectedDataLocation
+    Amazonka.TimeStreamWrite.Types.MagneticStoreWriteProperties
+    Amazonka.TimeStreamWrite.Types.MeasureValue
+    Amazonka.TimeStreamWrite.Types.MeasureValueType
+    Amazonka.TimeStreamWrite.Types.Record
+    Amazonka.TimeStreamWrite.Types.RecordsIngested
+    Amazonka.TimeStreamWrite.Types.RetentionProperties
+    Amazonka.TimeStreamWrite.Types.S3Configuration
+    Amazonka.TimeStreamWrite.Types.S3EncryptionOption
+    Amazonka.TimeStreamWrite.Types.Table
+    Amazonka.TimeStreamWrite.Types.TableStatus
+    Amazonka.TimeStreamWrite.Types.Tag
+    Amazonka.TimeStreamWrite.Types.TimeUnit
+    Amazonka.TimeStreamWrite.UntagResource
+    Amazonka.TimeStreamWrite.UpdateDatabase
+    Amazonka.TimeStreamWrite.UpdateTable
+    Amazonka.TimeStreamWrite.Waiters
+    Amazonka.TimeStreamWrite.WriteRecords
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-timestream-write-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.TimeStreamWrite
+    Test.Amazonka.TimeStreamWrite
+    Test.Amazonka.TimeStreamWrite.Internal
+
+  build-depends:
+    , amazonka-core              >=2.0 && <2.1
+    , amazonka-test              >=2.0 && <2.1
+    , amazonka-timestream-write
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateDatabase.yaml b/fixture/CreateDatabase.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatabase.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/CreateDatabaseResponse.proto b/fixture/CreateDatabaseResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatabaseResponse.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/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/DeleteDatabase.yaml b/fixture/DeleteDatabase.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDatabase.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/DeleteDatabaseResponse.proto b/fixture/DeleteDatabaseResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDatabaseResponse.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/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/DescribeDatabase.yaml b/fixture/DescribeDatabase.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDatabase.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/DescribeDatabaseResponse.proto b/fixture/DescribeDatabaseResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDatabaseResponse.proto
diff --git a/fixture/DescribeEndpoints.yaml b/fixture/DescribeEndpoints.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEndpoints.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/DescribeEndpointsResponse.proto b/fixture/DescribeEndpointsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEndpointsResponse.proto
diff --git a/fixture/DescribeTable.yaml b/fixture/DescribeTable.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeTable.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/DescribeTableResponse.proto b/fixture/DescribeTableResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeTableResponse.proto
diff --git a/fixture/ListDatabases.yaml b/fixture/ListDatabases.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatabases.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/ListDatabasesResponse.proto b/fixture/ListDatabasesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatabasesResponse.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/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/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/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/UpdateDatabase.yaml b/fixture/UpdateDatabase.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDatabase.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/UpdateDatabaseResponse.proto b/fixture/UpdateDatabaseResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDatabaseResponse.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/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/fixture/WriteRecords.yaml b/fixture/WriteRecords.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/WriteRecords.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ingest.timestream/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ingest.timestream.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/WriteRecordsResponse.proto b/fixture/WriteRecordsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/WriteRecordsResponse.proto
diff --git a/gen/Amazonka/TimeStreamWrite.hs b/gen/Amazonka/TimeStreamWrite.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite.hs
@@ -0,0 +1,271 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.TimeStreamWrite
+-- 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 @2018-11-01@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon Timestream Write
+--
+-- Amazon Timestream is a fast, scalable, fully managed time series
+-- database service that makes it easy to store and analyze trillions of
+-- time series data points per day. With Timestream, you can easily store
+-- and analyze IoT sensor data to derive insights from your IoT
+-- applications. You can analyze industrial telemetry to streamline
+-- equipment management and maintenance. You can also store and analyze log
+-- data and metrics to improve the performance and availability of your
+-- applications. Timestream is built from the ground up to effectively
+-- ingest, process, and store time series data. It organizes data to
+-- optimize query processing. It automatically scales based on the volume
+-- of data ingested and on the query volume to ensure you receive optimal
+-- performance while inserting and querying data. As your data grows over
+-- time, Timestream’s adaptive query processing engine spans across storage
+-- tiers to provide fast analysis while reducing costs.
+module Amazonka.TimeStreamWrite
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** InvalidEndpointException
+    _InvalidEndpointException,
+
+    -- ** RejectedRecordsException
+    _RejectedRecordsException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateDatabase
+    CreateDatabase (CreateDatabase'),
+    newCreateDatabase,
+    CreateDatabaseResponse (CreateDatabaseResponse'),
+    newCreateDatabaseResponse,
+
+    -- ** CreateTable
+    CreateTable (CreateTable'),
+    newCreateTable,
+    CreateTableResponse (CreateTableResponse'),
+    newCreateTableResponse,
+
+    -- ** DeleteDatabase
+    DeleteDatabase (DeleteDatabase'),
+    newDeleteDatabase,
+    DeleteDatabaseResponse (DeleteDatabaseResponse'),
+    newDeleteDatabaseResponse,
+
+    -- ** DeleteTable
+    DeleteTable (DeleteTable'),
+    newDeleteTable,
+    DeleteTableResponse (DeleteTableResponse'),
+    newDeleteTableResponse,
+
+    -- ** DescribeDatabase
+    DescribeDatabase (DescribeDatabase'),
+    newDescribeDatabase,
+    DescribeDatabaseResponse (DescribeDatabaseResponse'),
+    newDescribeDatabaseResponse,
+
+    -- ** DescribeEndpoints
+    DescribeEndpoints (DescribeEndpoints'),
+    newDescribeEndpoints,
+    DescribeEndpointsResponse (DescribeEndpointsResponse'),
+    newDescribeEndpointsResponse,
+
+    -- ** DescribeTable
+    DescribeTable (DescribeTable'),
+    newDescribeTable,
+    DescribeTableResponse (DescribeTableResponse'),
+    newDescribeTableResponse,
+
+    -- ** ListDatabases
+    ListDatabases (ListDatabases'),
+    newListDatabases,
+    ListDatabasesResponse (ListDatabasesResponse'),
+    newListDatabasesResponse,
+
+    -- ** ListTables
+    ListTables (ListTables'),
+    newListTables,
+    ListTablesResponse (ListTablesResponse'),
+    newListTablesResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateDatabase
+    UpdateDatabase (UpdateDatabase'),
+    newUpdateDatabase,
+    UpdateDatabaseResponse (UpdateDatabaseResponse'),
+    newUpdateDatabaseResponse,
+
+    -- ** UpdateTable
+    UpdateTable (UpdateTable'),
+    newUpdateTable,
+    UpdateTableResponse (UpdateTableResponse'),
+    newUpdateTableResponse,
+
+    -- ** WriteRecords
+    WriteRecords (WriteRecords'),
+    newWriteRecords,
+    WriteRecordsResponse (WriteRecordsResponse'),
+    newWriteRecordsResponse,
+
+    -- * Types
+
+    -- ** DimensionValueType
+    DimensionValueType (..),
+
+    -- ** MeasureValueType
+    MeasureValueType (..),
+
+    -- ** S3EncryptionOption
+    S3EncryptionOption (..),
+
+    -- ** TableStatus
+    TableStatus (..),
+
+    -- ** TimeUnit
+    TimeUnit (..),
+
+    -- ** Database
+    Database (Database'),
+    newDatabase,
+
+    -- ** Dimension
+    Dimension (Dimension'),
+    newDimension,
+
+    -- ** Endpoint
+    Endpoint (Endpoint'),
+    newEndpoint,
+
+    -- ** MagneticStoreRejectedDataLocation
+    MagneticStoreRejectedDataLocation (MagneticStoreRejectedDataLocation'),
+    newMagneticStoreRejectedDataLocation,
+
+    -- ** MagneticStoreWriteProperties
+    MagneticStoreWriteProperties (MagneticStoreWriteProperties'),
+    newMagneticStoreWriteProperties,
+
+    -- ** MeasureValue
+    MeasureValue (MeasureValue'),
+    newMeasureValue,
+
+    -- ** Record
+    Record (Record'),
+    newRecord,
+
+    -- ** RecordsIngested
+    RecordsIngested (RecordsIngested'),
+    newRecordsIngested,
+
+    -- ** RetentionProperties
+    RetentionProperties (RetentionProperties'),
+    newRetentionProperties,
+
+    -- ** S3Configuration
+    S3Configuration (S3Configuration'),
+    newS3Configuration,
+
+    -- ** Table
+    Table (Table'),
+    newTable,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+  )
+where
+
+import Amazonka.TimeStreamWrite.CreateDatabase
+import Amazonka.TimeStreamWrite.CreateTable
+import Amazonka.TimeStreamWrite.DeleteDatabase
+import Amazonka.TimeStreamWrite.DeleteTable
+import Amazonka.TimeStreamWrite.DescribeDatabase
+import Amazonka.TimeStreamWrite.DescribeEndpoints
+import Amazonka.TimeStreamWrite.DescribeTable
+import Amazonka.TimeStreamWrite.Lens
+import Amazonka.TimeStreamWrite.ListDatabases
+import Amazonka.TimeStreamWrite.ListTables
+import Amazonka.TimeStreamWrite.ListTagsForResource
+import Amazonka.TimeStreamWrite.TagResource
+import Amazonka.TimeStreamWrite.Types
+import Amazonka.TimeStreamWrite.UntagResource
+import Amazonka.TimeStreamWrite.UpdateDatabase
+import Amazonka.TimeStreamWrite.UpdateTable
+import Amazonka.TimeStreamWrite.Waiters
+import Amazonka.TimeStreamWrite.WriteRecords
+
+-- $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 'TimeStreamWrite'.
+
+-- $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/TimeStreamWrite/CreateDatabase.hs b/gen/Amazonka/TimeStreamWrite/CreateDatabase.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/CreateDatabase.hs
@@ -0,0 +1,218 @@
+{-# 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.TimeStreamWrite.CreateDatabase
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new Timestream database. If the KMS key is not specified, the
+-- database will be encrypted with a Timestream managed KMS key located in
+-- your account. Refer to
+-- <https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk Amazon Web Services managed KMS keys>
+-- for more info.
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html Service quotas apply>.
+-- See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.create-db.html code sample>
+-- for details.
+module Amazonka.TimeStreamWrite.CreateDatabase
+  ( -- * Creating a Request
+    CreateDatabase (..),
+    newCreateDatabase,
+
+    -- * Request Lenses
+    createDatabase_kmsKeyId,
+    createDatabase_tags,
+    createDatabase_databaseName,
+
+    -- * Destructuring the Response
+    CreateDatabaseResponse (..),
+    newCreateDatabaseResponse,
+
+    -- * Response Lenses
+    createDatabaseResponse_database,
+    createDatabaseResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newCreateDatabase' smart constructor.
+data CreateDatabase = CreateDatabase'
+  { -- | The KMS key for the database. If the KMS key is not specified, the
+    -- database will be encrypted with a Timestream managed KMS key located in
+    -- your account. Refer to
+    -- <https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk Amazon Web Services managed KMS keys>
+    -- for more info.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | A list of key-value pairs to label the table.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the Timestream database.
+    databaseName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDatabase' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kmsKeyId', 'createDatabase_kmsKeyId' - The KMS key for the database. If the KMS key is not specified, the
+-- database will be encrypted with a Timestream managed KMS key located in
+-- your account. Refer to
+-- <https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk Amazon Web Services managed KMS keys>
+-- for more info.
+--
+-- 'tags', 'createDatabase_tags' - A list of key-value pairs to label the table.
+--
+-- 'databaseName', 'createDatabase_databaseName' - The name of the Timestream database.
+newCreateDatabase ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  CreateDatabase
+newCreateDatabase pDatabaseName_ =
+  CreateDatabase'
+    { kmsKeyId = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      databaseName = pDatabaseName_
+    }
+
+-- | The KMS key for the database. If the KMS key is not specified, the
+-- database will be encrypted with a Timestream managed KMS key located in
+-- your account. Refer to
+-- <https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk Amazon Web Services managed KMS keys>
+-- for more info.
+createDatabase_kmsKeyId :: Lens.Lens' CreateDatabase (Prelude.Maybe Prelude.Text)
+createDatabase_kmsKeyId = Lens.lens (\CreateDatabase' {kmsKeyId} -> kmsKeyId) (\s@CreateDatabase' {} a -> s {kmsKeyId = a} :: CreateDatabase)
+
+-- | A list of key-value pairs to label the table.
+createDatabase_tags :: Lens.Lens' CreateDatabase (Prelude.Maybe [Tag])
+createDatabase_tags = Lens.lens (\CreateDatabase' {tags} -> tags) (\s@CreateDatabase' {} a -> s {tags = a} :: CreateDatabase) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the Timestream database.
+createDatabase_databaseName :: Lens.Lens' CreateDatabase Prelude.Text
+createDatabase_databaseName = Lens.lens (\CreateDatabase' {databaseName} -> databaseName) (\s@CreateDatabase' {} a -> s {databaseName = a} :: CreateDatabase)
+
+instance Core.AWSRequest CreateDatabase where
+  type
+    AWSResponse CreateDatabase =
+      CreateDatabaseResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDatabaseResponse'
+            Prelude.<$> (x Data..?> "Database")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDatabase where
+  hashWithSalt _salt CreateDatabase' {..} =
+    _salt
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` databaseName
+
+instance Prelude.NFData CreateDatabase where
+  rnf CreateDatabase' {..} =
+    Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf databaseName
+
+instance Data.ToHeaders CreateDatabase where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.CreateDatabase" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDatabase where
+  toJSON CreateDatabase' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("KmsKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("DatabaseName" Data..= databaseName)
+          ]
+      )
+
+instance Data.ToPath CreateDatabase where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateDatabase where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateDatabaseResponse' smart constructor.
+data CreateDatabaseResponse = CreateDatabaseResponse'
+  { -- | The newly created Timestream database.
+    database :: Prelude.Maybe Database,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDatabaseResponse' 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:
+--
+-- 'database', 'createDatabaseResponse_database' - The newly created Timestream database.
+--
+-- 'httpStatus', 'createDatabaseResponse_httpStatus' - The response's http status code.
+newCreateDatabaseResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDatabaseResponse
+newCreateDatabaseResponse pHttpStatus_ =
+  CreateDatabaseResponse'
+    { database = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The newly created Timestream database.
+createDatabaseResponse_database :: Lens.Lens' CreateDatabaseResponse (Prelude.Maybe Database)
+createDatabaseResponse_database = Lens.lens (\CreateDatabaseResponse' {database} -> database) (\s@CreateDatabaseResponse' {} a -> s {database = a} :: CreateDatabaseResponse)
+
+-- | The response's http status code.
+createDatabaseResponse_httpStatus :: Lens.Lens' CreateDatabaseResponse Prelude.Int
+createDatabaseResponse_httpStatus = Lens.lens (\CreateDatabaseResponse' {httpStatus} -> httpStatus) (\s@CreateDatabaseResponse' {} a -> s {httpStatus = a} :: CreateDatabaseResponse)
+
+instance Prelude.NFData CreateDatabaseResponse where
+  rnf CreateDatabaseResponse' {..} =
+    Prelude.rnf database
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/TimeStreamWrite/CreateTable.hs b/gen/Amazonka/TimeStreamWrite/CreateTable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/CreateTable.hs
@@ -0,0 +1,242 @@
+{-# 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.TimeStreamWrite.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 an existing database in
+-- your account. In an Amazon Web Services account, table names must be at
+-- least unique within each Region if they are in the same database. You
+-- may have identical table names in the same Region if the tables are in
+-- separate databases. While creating the table, you must specify the table
+-- name, database name, and the retention properties.
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html Service quotas apply>.
+-- See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.create-table.html code sample>
+-- for details.
+module Amazonka.TimeStreamWrite.CreateTable
+  ( -- * Creating a Request
+    CreateTable (..),
+    newCreateTable,
+
+    -- * Request Lenses
+    createTable_magneticStoreWriteProperties,
+    createTable_retentionProperties,
+    createTable_tags,
+    createTable_databaseName,
+    createTable_tableName,
+
+    -- * Destructuring the Response
+    CreateTableResponse (..),
+    newCreateTableResponse,
+
+    -- * Response Lenses
+    createTableResponse_table,
+    createTableResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newCreateTable' smart constructor.
+data CreateTable = CreateTable'
+  { -- | Contains properties to set on the table when enabling magnetic store
+    -- writes.
+    magneticStoreWriteProperties :: Prelude.Maybe MagneticStoreWriteProperties,
+    -- | The duration for which your time series data must be stored in the
+    -- memory store and the magnetic store.
+    retentionProperties :: Prelude.Maybe RetentionProperties,
+    -- | A list of key-value pairs to label the table.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the Timestream database.
+    databaseName :: Prelude.Text,
+    -- | The name of the Timestream table.
+    tableName :: Prelude.Text
+  }
+  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:
+--
+-- 'magneticStoreWriteProperties', 'createTable_magneticStoreWriteProperties' - Contains properties to set on the table when enabling magnetic store
+-- writes.
+--
+-- 'retentionProperties', 'createTable_retentionProperties' - The duration for which your time series data must be stored in the
+-- memory store and the magnetic store.
+--
+-- 'tags', 'createTable_tags' - A list of key-value pairs to label the table.
+--
+-- 'databaseName', 'createTable_databaseName' - The name of the Timestream database.
+--
+-- 'tableName', 'createTable_tableName' - The name of the Timestream table.
+newCreateTable ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  CreateTable
+newCreateTable pDatabaseName_ pTableName_ =
+  CreateTable'
+    { magneticStoreWriteProperties =
+        Prelude.Nothing,
+      retentionProperties = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      databaseName = pDatabaseName_,
+      tableName = pTableName_
+    }
+
+-- | Contains properties to set on the table when enabling magnetic store
+-- writes.
+createTable_magneticStoreWriteProperties :: Lens.Lens' CreateTable (Prelude.Maybe MagneticStoreWriteProperties)
+createTable_magneticStoreWriteProperties = Lens.lens (\CreateTable' {magneticStoreWriteProperties} -> magneticStoreWriteProperties) (\s@CreateTable' {} a -> s {magneticStoreWriteProperties = a} :: CreateTable)
+
+-- | The duration for which your time series data must be stored in the
+-- memory store and the magnetic store.
+createTable_retentionProperties :: Lens.Lens' CreateTable (Prelude.Maybe RetentionProperties)
+createTable_retentionProperties = Lens.lens (\CreateTable' {retentionProperties} -> retentionProperties) (\s@CreateTable' {} a -> s {retentionProperties = a} :: CreateTable)
+
+-- | A list of key-value pairs to label the table.
+createTable_tags :: Lens.Lens' CreateTable (Prelude.Maybe [Tag])
+createTable_tags = Lens.lens (\CreateTable' {tags} -> tags) (\s@CreateTable' {} a -> s {tags = a} :: CreateTable) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the Timestream database.
+createTable_databaseName :: Lens.Lens' CreateTable Prelude.Text
+createTable_databaseName = Lens.lens (\CreateTable' {databaseName} -> databaseName) (\s@CreateTable' {} a -> s {databaseName = a} :: CreateTable)
+
+-- | The name of the Timestream table.
+createTable_tableName :: Lens.Lens' CreateTable Prelude.Text
+createTable_tableName = Lens.lens (\CreateTable' {tableName} -> tableName) (\s@CreateTable' {} a -> s {tableName = 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.<$> (x Data..?> "Table")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateTable where
+  hashWithSalt _salt CreateTable' {..} =
+    _salt
+      `Prelude.hashWithSalt` magneticStoreWriteProperties
+      `Prelude.hashWithSalt` retentionProperties
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData CreateTable where
+  rnf CreateTable' {..} =
+    Prelude.rnf magneticStoreWriteProperties
+      `Prelude.seq` Prelude.rnf retentionProperties
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders CreateTable where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.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
+          [ ("MagneticStoreWriteProperties" Data..=)
+              Prelude.<$> magneticStoreWriteProperties,
+            ("RetentionProperties" Data..=)
+              Prelude.<$> retentionProperties,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("TableName" Data..= tableName)
+          ]
+      )
+
+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 newly created Timestream table.
+    table :: Prelude.Maybe Table,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  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:
+--
+-- 'table', 'createTableResponse_table' - The newly created Timestream table.
+--
+-- 'httpStatus', 'createTableResponse_httpStatus' - The response's http status code.
+newCreateTableResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateTableResponse
+newCreateTableResponse pHttpStatus_ =
+  CreateTableResponse'
+    { table = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The newly created Timestream table.
+createTableResponse_table :: Lens.Lens' CreateTableResponse (Prelude.Maybe Table)
+createTableResponse_table = Lens.lens (\CreateTableResponse' {table} -> table) (\s@CreateTableResponse' {} a -> s {table = a} :: CreateTableResponse)
+
+-- | 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)
+
+instance Prelude.NFData CreateTableResponse where
+  rnf CreateTableResponse' {..} =
+    Prelude.rnf table
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/TimeStreamWrite/DeleteDatabase.hs b/gen/Amazonka/TimeStreamWrite/DeleteDatabase.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/DeleteDatabase.hs
@@ -0,0 +1,145 @@
+{-# 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.TimeStreamWrite.DeleteDatabase
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a given Timestream database. /This is an irreversible operation.
+-- After a database is deleted, the time series data from its tables cannot
+-- be recovered./
+--
+-- All tables in the database must be deleted first, or a
+-- ValidationException error will be thrown.
+--
+-- Due to the nature of distributed retries, the operation can return
+-- either success or a ResourceNotFoundException. Clients should consider
+-- them equivalent.
+--
+-- See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.delete-db.html code sample>
+-- for details.
+module Amazonka.TimeStreamWrite.DeleteDatabase
+  ( -- * Creating a Request
+    DeleteDatabase (..),
+    newDeleteDatabase,
+
+    -- * Request Lenses
+    deleteDatabase_databaseName,
+
+    -- * Destructuring the Response
+    DeleteDatabaseResponse (..),
+    newDeleteDatabaseResponse,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newDeleteDatabase' smart constructor.
+data DeleteDatabase = DeleteDatabase'
+  { -- | The name of the Timestream database to be deleted.
+    databaseName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDatabase' 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:
+--
+-- 'databaseName', 'deleteDatabase_databaseName' - The name of the Timestream database to be deleted.
+newDeleteDatabase ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  DeleteDatabase
+newDeleteDatabase pDatabaseName_ =
+  DeleteDatabase' {databaseName = pDatabaseName_}
+
+-- | The name of the Timestream database to be deleted.
+deleteDatabase_databaseName :: Lens.Lens' DeleteDatabase Prelude.Text
+deleteDatabase_databaseName = Lens.lens (\DeleteDatabase' {databaseName} -> databaseName) (\s@DeleteDatabase' {} a -> s {databaseName = a} :: DeleteDatabase)
+
+instance Core.AWSRequest DeleteDatabase where
+  type
+    AWSResponse DeleteDatabase =
+      DeleteDatabaseResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteDatabaseResponse'
+
+instance Prelude.Hashable DeleteDatabase where
+  hashWithSalt _salt DeleteDatabase' {..} =
+    _salt `Prelude.hashWithSalt` databaseName
+
+instance Prelude.NFData DeleteDatabase where
+  rnf DeleteDatabase' {..} = Prelude.rnf databaseName
+
+instance Data.ToHeaders DeleteDatabase where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.DeleteDatabase" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteDatabase where
+  toJSON DeleteDatabase' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("DatabaseName" Data..= databaseName)]
+      )
+
+instance Data.ToPath DeleteDatabase where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteDatabase where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteDatabaseResponse' smart constructor.
+data DeleteDatabaseResponse = DeleteDatabaseResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDatabaseResponse' 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.
+newDeleteDatabaseResponse ::
+  DeleteDatabaseResponse
+newDeleteDatabaseResponse = DeleteDatabaseResponse'
+
+instance Prelude.NFData DeleteDatabaseResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/TimeStreamWrite/DeleteTable.hs b/gen/Amazonka/TimeStreamWrite/DeleteTable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/DeleteTable.hs
@@ -0,0 +1,159 @@
+{-# 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.TimeStreamWrite.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)
+--
+-- Deletes a given Timestream table. This is an irreversible operation.
+-- After a Timestream database table is deleted, the time series data
+-- stored in the table cannot be recovered.
+--
+-- Due to the nature of distributed retries, the operation can return
+-- either success or a ResourceNotFoundException. Clients should consider
+-- them equivalent.
+--
+-- See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.delete-table.html code sample>
+-- for details.
+module Amazonka.TimeStreamWrite.DeleteTable
+  ( -- * Creating a Request
+    DeleteTable (..),
+    newDeleteTable,
+
+    -- * Request Lenses
+    deleteTable_databaseName,
+    deleteTable_tableName,
+
+    -- * Destructuring the Response
+    DeleteTableResponse (..),
+    newDeleteTableResponse,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newDeleteTable' smart constructor.
+data DeleteTable = DeleteTable'
+  { -- | The name of the database where the Timestream database is to be deleted.
+    databaseName :: Prelude.Text,
+    -- | The name of the Timestream 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:
+--
+-- 'databaseName', 'deleteTable_databaseName' - The name of the database where the Timestream database is to be deleted.
+--
+-- 'tableName', 'deleteTable_tableName' - The name of the Timestream table to be deleted.
+newDeleteTable ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  DeleteTable
+newDeleteTable pDatabaseName_ pTableName_ =
+  DeleteTable'
+    { databaseName = pDatabaseName_,
+      tableName = pTableName_
+    }
+
+-- | The name of the database where the Timestream database is to be deleted.
+deleteTable_databaseName :: Lens.Lens' DeleteTable Prelude.Text
+deleteTable_databaseName = Lens.lens (\DeleteTable' {databaseName} -> databaseName) (\s@DeleteTable' {} a -> s {databaseName = a} :: DeleteTable)
+
+-- | The name of the Timestream 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.receiveNull DeleteTableResponse'
+
+instance Prelude.Hashable DeleteTable where
+  hashWithSalt _salt DeleteTable' {..} =
+    _salt
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData DeleteTable where
+  rnf DeleteTable' {..} =
+    Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders DeleteTable where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.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 ("DatabaseName" Data..= databaseName),
+            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'
+  {
+  }
+  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.
+newDeleteTableResponse ::
+  DeleteTableResponse
+newDeleteTableResponse = DeleteTableResponse'
+
+instance Prelude.NFData DeleteTableResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/TimeStreamWrite/DescribeDatabase.hs b/gen/Amazonka/TimeStreamWrite/DescribeDatabase.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/DescribeDatabase.hs
@@ -0,0 +1,174 @@
+{-# 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.TimeStreamWrite.DescribeDatabase
+-- 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 database, including the database name,
+-- time that the database was created, and the total number of tables found
+-- within the database.
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html Service quotas apply>.
+-- See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.describe-db.html code sample>
+-- for details.
+module Amazonka.TimeStreamWrite.DescribeDatabase
+  ( -- * Creating a Request
+    DescribeDatabase (..),
+    newDescribeDatabase,
+
+    -- * Request Lenses
+    describeDatabase_databaseName,
+
+    -- * Destructuring the Response
+    DescribeDatabaseResponse (..),
+    newDescribeDatabaseResponse,
+
+    -- * Response Lenses
+    describeDatabaseResponse_database,
+    describeDatabaseResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newDescribeDatabase' smart constructor.
+data DescribeDatabase = DescribeDatabase'
+  { -- | The name of the Timestream database.
+    databaseName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDatabase' 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:
+--
+-- 'databaseName', 'describeDatabase_databaseName' - The name of the Timestream database.
+newDescribeDatabase ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  DescribeDatabase
+newDescribeDatabase pDatabaseName_ =
+  DescribeDatabase' {databaseName = pDatabaseName_}
+
+-- | The name of the Timestream database.
+describeDatabase_databaseName :: Lens.Lens' DescribeDatabase Prelude.Text
+describeDatabase_databaseName = Lens.lens (\DescribeDatabase' {databaseName} -> databaseName) (\s@DescribeDatabase' {} a -> s {databaseName = a} :: DescribeDatabase)
+
+instance Core.AWSRequest DescribeDatabase where
+  type
+    AWSResponse DescribeDatabase =
+      DescribeDatabaseResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDatabaseResponse'
+            Prelude.<$> (x Data..?> "Database")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDatabase where
+  hashWithSalt _salt DescribeDatabase' {..} =
+    _salt `Prelude.hashWithSalt` databaseName
+
+instance Prelude.NFData DescribeDatabase where
+  rnf DescribeDatabase' {..} = Prelude.rnf databaseName
+
+instance Data.ToHeaders DescribeDatabase where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.DescribeDatabase" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeDatabase where
+  toJSON DescribeDatabase' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("DatabaseName" Data..= databaseName)]
+      )
+
+instance Data.ToPath DescribeDatabase where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeDatabase where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDatabaseResponse' smart constructor.
+data DescribeDatabaseResponse = DescribeDatabaseResponse'
+  { -- | The name of the Timestream table.
+    database :: Prelude.Maybe Database,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDatabaseResponse' 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:
+--
+-- 'database', 'describeDatabaseResponse_database' - The name of the Timestream table.
+--
+-- 'httpStatus', 'describeDatabaseResponse_httpStatus' - The response's http status code.
+newDescribeDatabaseResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDatabaseResponse
+newDescribeDatabaseResponse pHttpStatus_ =
+  DescribeDatabaseResponse'
+    { database =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The name of the Timestream table.
+describeDatabaseResponse_database :: Lens.Lens' DescribeDatabaseResponse (Prelude.Maybe Database)
+describeDatabaseResponse_database = Lens.lens (\DescribeDatabaseResponse' {database} -> database) (\s@DescribeDatabaseResponse' {} a -> s {database = a} :: DescribeDatabaseResponse)
+
+-- | The response's http status code.
+describeDatabaseResponse_httpStatus :: Lens.Lens' DescribeDatabaseResponse Prelude.Int
+describeDatabaseResponse_httpStatus = Lens.lens (\DescribeDatabaseResponse' {httpStatus} -> httpStatus) (\s@DescribeDatabaseResponse' {} a -> s {httpStatus = a} :: DescribeDatabaseResponse)
+
+instance Prelude.NFData DescribeDatabaseResponse where
+  rnf DescribeDatabaseResponse' {..} =
+    Prelude.rnf database
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/TimeStreamWrite/DescribeEndpoints.hs b/gen/Amazonka/TimeStreamWrite/DescribeEndpoints.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/DescribeEndpoints.hs
@@ -0,0 +1,169 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.TimeStreamWrite.DescribeEndpoints
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- DescribeEndpoints returns a list of available endpoints to make
+-- Timestream API calls against. This API is available through both Write
+-- and Query.
+--
+-- Because the Timestream SDKs are designed to transparently work with the
+-- service’s architecture, including the management and mapping of the
+-- service endpoints, /it is not recommended that you use this API unless/:
+--
+-- -   You are using
+--     <https://docs.aws.amazon.com/timestream/latest/developerguide/VPCEndpoints VPC endpoints (Amazon Web Services PrivateLink) with Timestream>
+--
+-- -   Your application uses a programming language that does not yet have
+--     SDK support
+--
+-- -   You require better control over the client-side implementation
+--
+-- For detailed information on how and when to use and implement
+-- DescribeEndpoints, see
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/Using.API.html#Using-API.endpoint-discovery The Endpoint Discovery Pattern>.
+module Amazonka.TimeStreamWrite.DescribeEndpoints
+  ( -- * Creating a Request
+    DescribeEndpoints (..),
+    newDescribeEndpoints,
+
+    -- * Destructuring the Response
+    DescribeEndpointsResponse (..),
+    newDescribeEndpointsResponse,
+
+    -- * Response Lenses
+    describeEndpointsResponse_httpStatus,
+    describeEndpointsResponse_endpoints,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newDescribeEndpoints' smart constructor.
+data DescribeEndpoints = DescribeEndpoints'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEndpoints' 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.
+newDescribeEndpoints ::
+  DescribeEndpoints
+newDescribeEndpoints = DescribeEndpoints'
+
+instance Core.AWSRequest DescribeEndpoints where
+  type
+    AWSResponse DescribeEndpoints =
+      DescribeEndpointsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeEndpointsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Endpoints" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable DescribeEndpoints where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData DescribeEndpoints where
+  rnf _ = ()
+
+instance Data.ToHeaders DescribeEndpoints where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.DescribeEndpoints" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeEndpoints where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath DescribeEndpoints where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeEndpoints where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeEndpointsResponse' smart constructor.
+data DescribeEndpointsResponse = DescribeEndpointsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | An @Endpoints@ object is returned when a @DescribeEndpoints@ request is
+    -- made.
+    endpoints :: [Endpoint]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEndpointsResponse' 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', 'describeEndpointsResponse_httpStatus' - The response's http status code.
+--
+-- 'endpoints', 'describeEndpointsResponse_endpoints' - An @Endpoints@ object is returned when a @DescribeEndpoints@ request is
+-- made.
+newDescribeEndpointsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeEndpointsResponse
+newDescribeEndpointsResponse pHttpStatus_ =
+  DescribeEndpointsResponse'
+    { httpStatus =
+        pHttpStatus_,
+      endpoints = Prelude.mempty
+    }
+
+-- | The response's http status code.
+describeEndpointsResponse_httpStatus :: Lens.Lens' DescribeEndpointsResponse Prelude.Int
+describeEndpointsResponse_httpStatus = Lens.lens (\DescribeEndpointsResponse' {httpStatus} -> httpStatus) (\s@DescribeEndpointsResponse' {} a -> s {httpStatus = a} :: DescribeEndpointsResponse)
+
+-- | An @Endpoints@ object is returned when a @DescribeEndpoints@ request is
+-- made.
+describeEndpointsResponse_endpoints :: Lens.Lens' DescribeEndpointsResponse [Endpoint]
+describeEndpointsResponse_endpoints = Lens.lens (\DescribeEndpointsResponse' {endpoints} -> endpoints) (\s@DescribeEndpointsResponse' {} a -> s {endpoints = a} :: DescribeEndpointsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData DescribeEndpointsResponse where
+  rnf DescribeEndpointsResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf endpoints
diff --git a/gen/Amazonka/TimeStreamWrite/DescribeTable.hs b/gen/Amazonka/TimeStreamWrite/DescribeTable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/DescribeTable.hs
@@ -0,0 +1,192 @@
+{-# 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.TimeStreamWrite.DescribeTable
+-- 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 name, database
+-- name, retention duration of the memory store and the magnetic store.
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html Service quotas apply>.
+-- See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.describe-table.html code sample>
+-- for details.
+module Amazonka.TimeStreamWrite.DescribeTable
+  ( -- * Creating a Request
+    DescribeTable (..),
+    newDescribeTable,
+
+    -- * Request Lenses
+    describeTable_databaseName,
+    describeTable_tableName,
+
+    -- * Destructuring the Response
+    DescribeTableResponse (..),
+    newDescribeTableResponse,
+
+    -- * Response Lenses
+    describeTableResponse_table,
+    describeTableResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newDescribeTable' smart constructor.
+data DescribeTable = DescribeTable'
+  { -- | The name of the Timestream database.
+    databaseName :: Prelude.Text,
+    -- | The name of the Timestream table.
+    tableName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeTable' 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:
+--
+-- 'databaseName', 'describeTable_databaseName' - The name of the Timestream database.
+--
+-- 'tableName', 'describeTable_tableName' - The name of the Timestream table.
+newDescribeTable ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  DescribeTable
+newDescribeTable pDatabaseName_ pTableName_ =
+  DescribeTable'
+    { databaseName = pDatabaseName_,
+      tableName = pTableName_
+    }
+
+-- | The name of the Timestream database.
+describeTable_databaseName :: Lens.Lens' DescribeTable Prelude.Text
+describeTable_databaseName = Lens.lens (\DescribeTable' {databaseName} -> databaseName) (\s@DescribeTable' {} a -> s {databaseName = a} :: DescribeTable)
+
+-- | The name of the Timestream table.
+describeTable_tableName :: Lens.Lens' DescribeTable Prelude.Text
+describeTable_tableName = Lens.lens (\DescribeTable' {tableName} -> tableName) (\s@DescribeTable' {} a -> s {tableName = a} :: DescribeTable)
+
+instance Core.AWSRequest DescribeTable where
+  type
+    AWSResponse DescribeTable =
+      DescribeTableResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeTableResponse'
+            Prelude.<$> (x Data..?> "Table")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeTable where
+  hashWithSalt _salt DescribeTable' {..} =
+    _salt
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData DescribeTable where
+  rnf DescribeTable' {..} =
+    Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders DescribeTable where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.DescribeTable" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeTable where
+  toJSON DescribeTable' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("TableName" Data..= tableName)
+          ]
+      )
+
+instance Data.ToPath DescribeTable where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeTable where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeTableResponse' smart constructor.
+data DescribeTableResponse = DescribeTableResponse'
+  { -- | The Timestream table.
+    table :: Prelude.Maybe Table,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeTableResponse' 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:
+--
+-- 'table', 'describeTableResponse_table' - The Timestream table.
+--
+-- 'httpStatus', 'describeTableResponse_httpStatus' - The response's http status code.
+newDescribeTableResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeTableResponse
+newDescribeTableResponse pHttpStatus_ =
+  DescribeTableResponse'
+    { table = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Timestream table.
+describeTableResponse_table :: Lens.Lens' DescribeTableResponse (Prelude.Maybe Table)
+describeTableResponse_table = Lens.lens (\DescribeTableResponse' {table} -> table) (\s@DescribeTableResponse' {} a -> s {table = a} :: DescribeTableResponse)
+
+-- | The response's http status code.
+describeTableResponse_httpStatus :: Lens.Lens' DescribeTableResponse Prelude.Int
+describeTableResponse_httpStatus = Lens.lens (\DescribeTableResponse' {httpStatus} -> httpStatus) (\s@DescribeTableResponse' {} a -> s {httpStatus = a} :: DescribeTableResponse)
+
+instance Prelude.NFData DescribeTableResponse where
+  rnf DescribeTableResponse' {..} =
+    Prelude.rnf table
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/TimeStreamWrite/Lens.hs b/gen/Amazonka/TimeStreamWrite/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Lens.hs
@@ -0,0 +1,205 @@
+{-# 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.TimeStreamWrite.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.TimeStreamWrite.Lens
+  ( -- * Operations
+
+    -- ** CreateDatabase
+    createDatabase_kmsKeyId,
+    createDatabase_tags,
+    createDatabase_databaseName,
+    createDatabaseResponse_database,
+    createDatabaseResponse_httpStatus,
+
+    -- ** CreateTable
+    createTable_magneticStoreWriteProperties,
+    createTable_retentionProperties,
+    createTable_tags,
+    createTable_databaseName,
+    createTable_tableName,
+    createTableResponse_table,
+    createTableResponse_httpStatus,
+
+    -- ** DeleteDatabase
+    deleteDatabase_databaseName,
+
+    -- ** DeleteTable
+    deleteTable_databaseName,
+    deleteTable_tableName,
+
+    -- ** DescribeDatabase
+    describeDatabase_databaseName,
+    describeDatabaseResponse_database,
+    describeDatabaseResponse_httpStatus,
+
+    -- ** DescribeEndpoints
+    describeEndpointsResponse_httpStatus,
+    describeEndpointsResponse_endpoints,
+
+    -- ** DescribeTable
+    describeTable_databaseName,
+    describeTable_tableName,
+    describeTableResponse_table,
+    describeTableResponse_httpStatus,
+
+    -- ** ListDatabases
+    listDatabases_maxResults,
+    listDatabases_nextToken,
+    listDatabasesResponse_databases,
+    listDatabasesResponse_nextToken,
+    listDatabasesResponse_httpStatus,
+
+    -- ** ListTables
+    listTables_databaseName,
+    listTables_maxResults,
+    listTables_nextToken,
+    listTablesResponse_nextToken,
+    listTablesResponse_tables,
+    listTablesResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceARN,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceARN,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceARN,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateDatabase
+    updateDatabase_databaseName,
+    updateDatabase_kmsKeyId,
+    updateDatabaseResponse_database,
+    updateDatabaseResponse_httpStatus,
+
+    -- ** UpdateTable
+    updateTable_magneticStoreWriteProperties,
+    updateTable_retentionProperties,
+    updateTable_databaseName,
+    updateTable_tableName,
+    updateTableResponse_table,
+    updateTableResponse_httpStatus,
+
+    -- ** WriteRecords
+    writeRecords_commonAttributes,
+    writeRecords_databaseName,
+    writeRecords_tableName,
+    writeRecords_records,
+    writeRecordsResponse_recordsIngested,
+    writeRecordsResponse_httpStatus,
+
+    -- * Types
+
+    -- ** Database
+    database_arn,
+    database_creationTime,
+    database_databaseName,
+    database_kmsKeyId,
+    database_lastUpdatedTime,
+    database_tableCount,
+
+    -- ** Dimension
+    dimension_dimensionValueType,
+    dimension_name,
+    dimension_value,
+
+    -- ** Endpoint
+    endpoint_address,
+    endpoint_cachePeriodInMinutes,
+
+    -- ** MagneticStoreRejectedDataLocation
+    magneticStoreRejectedDataLocation_s3Configuration,
+
+    -- ** MagneticStoreWriteProperties
+    magneticStoreWriteProperties_magneticStoreRejectedDataLocation,
+    magneticStoreWriteProperties_enableMagneticStoreWrites,
+
+    -- ** MeasureValue
+    measureValue_name,
+    measureValue_value,
+    measureValue_type,
+
+    -- ** Record
+    record_dimensions,
+    record_measureName,
+    record_measureValue,
+    record_measureValueType,
+    record_measureValues,
+    record_time,
+    record_timeUnit,
+    record_version,
+
+    -- ** RecordsIngested
+    recordsIngested_magneticStore,
+    recordsIngested_memoryStore,
+    recordsIngested_total,
+
+    -- ** RetentionProperties
+    retentionProperties_memoryStoreRetentionPeriodInHours,
+    retentionProperties_magneticStoreRetentionPeriodInDays,
+
+    -- ** S3Configuration
+    s3Configuration_bucketName,
+    s3Configuration_encryptionOption,
+    s3Configuration_kmsKeyId,
+    s3Configuration_objectKeyPrefix,
+
+    -- ** Table
+    table_arn,
+    table_creationTime,
+    table_databaseName,
+    table_lastUpdatedTime,
+    table_magneticStoreWriteProperties,
+    table_retentionProperties,
+    table_tableName,
+    table_tableStatus,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+  )
+where
+
+import Amazonka.TimeStreamWrite.CreateDatabase
+import Amazonka.TimeStreamWrite.CreateTable
+import Amazonka.TimeStreamWrite.DeleteDatabase
+import Amazonka.TimeStreamWrite.DeleteTable
+import Amazonka.TimeStreamWrite.DescribeDatabase
+import Amazonka.TimeStreamWrite.DescribeEndpoints
+import Amazonka.TimeStreamWrite.DescribeTable
+import Amazonka.TimeStreamWrite.ListDatabases
+import Amazonka.TimeStreamWrite.ListTables
+import Amazonka.TimeStreamWrite.ListTagsForResource
+import Amazonka.TimeStreamWrite.TagResource
+import Amazonka.TimeStreamWrite.Types.Database
+import Amazonka.TimeStreamWrite.Types.Dimension
+import Amazonka.TimeStreamWrite.Types.Endpoint
+import Amazonka.TimeStreamWrite.Types.MagneticStoreRejectedDataLocation
+import Amazonka.TimeStreamWrite.Types.MagneticStoreWriteProperties
+import Amazonka.TimeStreamWrite.Types.MeasureValue
+import Amazonka.TimeStreamWrite.Types.Record
+import Amazonka.TimeStreamWrite.Types.RecordsIngested
+import Amazonka.TimeStreamWrite.Types.RetentionProperties
+import Amazonka.TimeStreamWrite.Types.S3Configuration
+import Amazonka.TimeStreamWrite.Types.Table
+import Amazonka.TimeStreamWrite.Types.Tag
+import Amazonka.TimeStreamWrite.UntagResource
+import Amazonka.TimeStreamWrite.UpdateDatabase
+import Amazonka.TimeStreamWrite.UpdateTable
+import Amazonka.TimeStreamWrite.WriteRecords
diff --git a/gen/Amazonka/TimeStreamWrite/ListDatabases.hs b/gen/Amazonka/TimeStreamWrite/ListDatabases.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/ListDatabases.hs
@@ -0,0 +1,214 @@
+{-# 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.TimeStreamWrite.ListDatabases
+-- 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 your Timestream databases.
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html Service quotas apply>.
+-- See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.list-db.html code sample>
+-- for details.
+module Amazonka.TimeStreamWrite.ListDatabases
+  ( -- * Creating a Request
+    ListDatabases (..),
+    newListDatabases,
+
+    -- * Request Lenses
+    listDatabases_maxResults,
+    listDatabases_nextToken,
+
+    -- * Destructuring the Response
+    ListDatabasesResponse (..),
+    newListDatabasesResponse,
+
+    -- * Response Lenses
+    listDatabasesResponse_databases,
+    listDatabasesResponse_nextToken,
+    listDatabasesResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newListDatabases' smart constructor.
+data ListDatabases = ListDatabases'
+  { -- | The total number of items to return in the output. If the total number
+    -- of items available is more than the value specified, a NextToken is
+    -- provided in the output. To resume pagination, provide the NextToken
+    -- value as 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 'ListDatabases' 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', 'listDatabases_maxResults' - The total number of items to return in the output. If the total number
+-- of items available is more than the value specified, a NextToken is
+-- provided in the output. To resume pagination, provide the NextToken
+-- value as argument of a subsequent API invocation.
+--
+-- 'nextToken', 'listDatabases_nextToken' - The pagination token. To resume pagination, provide the NextToken value
+-- as argument of a subsequent API invocation.
+newListDatabases ::
+  ListDatabases
+newListDatabases =
+  ListDatabases'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The total number of items to return in the output. If the total number
+-- of items available is more than the value specified, a NextToken is
+-- provided in the output. To resume pagination, provide the NextToken
+-- value as argument of a subsequent API invocation.
+listDatabases_maxResults :: Lens.Lens' ListDatabases (Prelude.Maybe Prelude.Natural)
+listDatabases_maxResults = Lens.lens (\ListDatabases' {maxResults} -> maxResults) (\s@ListDatabases' {} a -> s {maxResults = a} :: ListDatabases)
+
+-- | The pagination token. To resume pagination, provide the NextToken value
+-- as argument of a subsequent API invocation.
+listDatabases_nextToken :: Lens.Lens' ListDatabases (Prelude.Maybe Prelude.Text)
+listDatabases_nextToken = Lens.lens (\ListDatabases' {nextToken} -> nextToken) (\s@ListDatabases' {} a -> s {nextToken = a} :: ListDatabases)
+
+instance Core.AWSRequest ListDatabases where
+  type
+    AWSResponse ListDatabases =
+      ListDatabasesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDatabasesResponse'
+            Prelude.<$> (x Data..?> "Databases" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDatabases where
+  hashWithSalt _salt ListDatabases' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListDatabases where
+  rnf ListDatabases' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListDatabases where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.ListDatabases" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListDatabases where
+  toJSON ListDatabases' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListDatabases where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListDatabases where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListDatabasesResponse' smart constructor.
+data ListDatabasesResponse = ListDatabasesResponse'
+  { -- | A list of database names.
+    databases :: Prelude.Maybe [Database],
+    -- | The pagination token. This parameter is returned when the response is
+    -- truncated.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatabasesResponse' 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:
+--
+-- 'databases', 'listDatabasesResponse_databases' - A list of database names.
+--
+-- 'nextToken', 'listDatabasesResponse_nextToken' - The pagination token. This parameter is returned when the response is
+-- truncated.
+--
+-- 'httpStatus', 'listDatabasesResponse_httpStatus' - The response's http status code.
+newListDatabasesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDatabasesResponse
+newListDatabasesResponse pHttpStatus_ =
+  ListDatabasesResponse'
+    { databases = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of database names.
+listDatabasesResponse_databases :: Lens.Lens' ListDatabasesResponse (Prelude.Maybe [Database])
+listDatabasesResponse_databases = Lens.lens (\ListDatabasesResponse' {databases} -> databases) (\s@ListDatabasesResponse' {} a -> s {databases = a} :: ListDatabasesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The pagination token. This parameter is returned when the response is
+-- truncated.
+listDatabasesResponse_nextToken :: Lens.Lens' ListDatabasesResponse (Prelude.Maybe Prelude.Text)
+listDatabasesResponse_nextToken = Lens.lens (\ListDatabasesResponse' {nextToken} -> nextToken) (\s@ListDatabasesResponse' {} a -> s {nextToken = a} :: ListDatabasesResponse)
+
+-- | The response's http status code.
+listDatabasesResponse_httpStatus :: Lens.Lens' ListDatabasesResponse Prelude.Int
+listDatabasesResponse_httpStatus = Lens.lens (\ListDatabasesResponse' {httpStatus} -> httpStatus) (\s@ListDatabasesResponse' {} a -> s {httpStatus = a} :: ListDatabasesResponse)
+
+instance Prelude.NFData ListDatabasesResponse where
+  rnf ListDatabasesResponse' {..} =
+    Prelude.rnf databases
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/TimeStreamWrite/ListTables.hs b/gen/Amazonka/TimeStreamWrite/ListTables.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/ListTables.hs
@@ -0,0 +1,224 @@
+{-# 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.TimeStreamWrite.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)
+--
+-- A list of tables, along with the name, status and retention properties
+-- of each table. See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.list-table.html code sample>
+-- for details.
+module Amazonka.TimeStreamWrite.ListTables
+  ( -- * Creating a Request
+    ListTables (..),
+    newListTables,
+
+    -- * Request Lenses
+    listTables_databaseName,
+    listTables_maxResults,
+    listTables_nextToken,
+
+    -- * 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 qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newListTables' smart constructor.
+data ListTables = ListTables'
+  { -- | The name of the Timestream database.
+    databaseName :: Prelude.Maybe Prelude.Text,
+    -- | The total number of items to return in the output. If the total number
+    -- of items available is more than the value specified, a NextToken is
+    -- provided in the output. To resume pagination, provide the NextToken
+    -- value as 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 '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:
+--
+-- 'databaseName', 'listTables_databaseName' - The name of the Timestream database.
+--
+-- 'maxResults', 'listTables_maxResults' - The total number of items to return in the output. If the total number
+-- of items available is more than the value specified, a NextToken is
+-- provided in the output. To resume pagination, provide the NextToken
+-- value as argument of a subsequent API invocation.
+--
+-- 'nextToken', 'listTables_nextToken' - The pagination token. To resume pagination, provide the NextToken value
+-- as argument of a subsequent API invocation.
+newListTables ::
+  ListTables
+newListTables =
+  ListTables'
+    { databaseName = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The name of the Timestream database.
+listTables_databaseName :: Lens.Lens' ListTables (Prelude.Maybe Prelude.Text)
+listTables_databaseName = Lens.lens (\ListTables' {databaseName} -> databaseName) (\s@ListTables' {} a -> s {databaseName = a} :: ListTables)
+
+-- | The total number of items to return in the output. If the total number
+-- of items available is more than the value specified, a NextToken is
+-- provided in the output. To resume pagination, provide the NextToken
+-- value as 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 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)
+
+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` databaseName
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListTables where
+  rnf ListTables' {..} =
+    Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListTables where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.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
+          [ ("DatabaseName" Data..=) Prelude.<$> databaseName,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+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 [Table],
+    -- | 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 [Table])
+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/TimeStreamWrite/ListTagsForResource.hs b/gen/Amazonka/TimeStreamWrite/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/ListTagsForResource.hs
@@ -0,0 +1,172 @@
+{-# 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.TimeStreamWrite.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)
+--
+-- List all tags on a Timestream resource.
+module Amazonka.TimeStreamWrite.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceARN,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    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 qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The Timestream resource with tags to be listed. This value is an Amazon
+    -- Resource Name (ARN).
+    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:
+--
+-- 'resourceARN', 'listTagsForResource_resourceARN' - The Timestream resource with tags to be listed. This value is an Amazon
+-- Resource Name (ARN).
+newListTagsForResource ::
+  -- | 'resourceARN'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceARN_ =
+  ListTagsForResource' {resourceARN = pResourceARN_}
+
+-- | The Timestream resource with tags to be listed. This value is an Amazon
+-- Resource Name (ARN).
+listTagsForResource_resourceARN :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceARN = Lens.lens (\ListTagsForResource' {resourceARN} -> resourceARN) (\s@ListTagsForResource' {} a -> s {resourceARN = a} :: ListTagsForResource)
+
+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..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceARN
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceARN
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.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
+          [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'
+  { -- | The tags currently associated with the Timestream resource.
+    tags :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of '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:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The tags currently associated with the Timestream resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The tags currently associated with the Timestream resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe [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 tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/TimeStreamWrite/TagResource.hs b/gen/Amazonka/TimeStreamWrite/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/TagResource.hs
@@ -0,0 +1,173 @@
+{-# 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.TimeStreamWrite.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)
+--
+-- Associate a set of tags with a Timestream resource. You can then
+-- activate these user-defined tags so that they appear on the Billing and
+-- Cost Management console for cost allocation tracking.
+module Amazonka.TimeStreamWrite.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 qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | Identifies the Timestream resource to which tags should be added. This
+    -- value is an Amazon Resource Name (ARN).
+    resourceARN :: Prelude.Text,
+    -- | The tags to be assigned to the Timestream resource.
+    tags :: [Tag]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceARN', 'tagResource_resourceARN' - Identifies the Timestream resource to which tags should be added. This
+-- value is an Amazon Resource Name (ARN).
+--
+-- 'tags', 'tagResource_tags' - The tags to be assigned to the Timestream resource.
+newTagResource ::
+  -- | 'resourceARN'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceARN_ =
+  TagResource'
+    { resourceARN = pResourceARN_,
+      tags = Prelude.mempty
+    }
+
+-- | Identifies the Timestream resource to which tags should be added. This
+-- value is an Amazon Resource Name (ARN).
+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 Timestream resource.
+tagResource_tags :: Lens.Lens' TagResource [Tag]
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.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.=# ( "Timestream_20181101.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/TimeStreamWrite/Types.hs b/gen/Amazonka/TimeStreamWrite/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types.hs
@@ -0,0 +1,321 @@
+{-# 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.TimeStreamWrite.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.TimeStreamWrite.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _InvalidEndpointException,
+    _RejectedRecordsException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * DimensionValueType
+    DimensionValueType (..),
+
+    -- * MeasureValueType
+    MeasureValueType (..),
+
+    -- * S3EncryptionOption
+    S3EncryptionOption (..),
+
+    -- * TableStatus
+    TableStatus (..),
+
+    -- * TimeUnit
+    TimeUnit (..),
+
+    -- * Database
+    Database (..),
+    newDatabase,
+    database_arn,
+    database_creationTime,
+    database_databaseName,
+    database_kmsKeyId,
+    database_lastUpdatedTime,
+    database_tableCount,
+
+    -- * Dimension
+    Dimension (..),
+    newDimension,
+    dimension_dimensionValueType,
+    dimension_name,
+    dimension_value,
+
+    -- * Endpoint
+    Endpoint (..),
+    newEndpoint,
+    endpoint_address,
+    endpoint_cachePeriodInMinutes,
+
+    -- * MagneticStoreRejectedDataLocation
+    MagneticStoreRejectedDataLocation (..),
+    newMagneticStoreRejectedDataLocation,
+    magneticStoreRejectedDataLocation_s3Configuration,
+
+    -- * MagneticStoreWriteProperties
+    MagneticStoreWriteProperties (..),
+    newMagneticStoreWriteProperties,
+    magneticStoreWriteProperties_magneticStoreRejectedDataLocation,
+    magneticStoreWriteProperties_enableMagneticStoreWrites,
+
+    -- * MeasureValue
+    MeasureValue (..),
+    newMeasureValue,
+    measureValue_name,
+    measureValue_value,
+    measureValue_type,
+
+    -- * Record
+    Record (..),
+    newRecord,
+    record_dimensions,
+    record_measureName,
+    record_measureValue,
+    record_measureValueType,
+    record_measureValues,
+    record_time,
+    record_timeUnit,
+    record_version,
+
+    -- * RecordsIngested
+    RecordsIngested (..),
+    newRecordsIngested,
+    recordsIngested_magneticStore,
+    recordsIngested_memoryStore,
+    recordsIngested_total,
+
+    -- * RetentionProperties
+    RetentionProperties (..),
+    newRetentionProperties,
+    retentionProperties_memoryStoreRetentionPeriodInHours,
+    retentionProperties_magneticStoreRetentionPeriodInDays,
+
+    -- * S3Configuration
+    S3Configuration (..),
+    newS3Configuration,
+    s3Configuration_bucketName,
+    s3Configuration_encryptionOption,
+    s3Configuration_kmsKeyId,
+    s3Configuration_objectKeyPrefix,
+
+    -- * Table
+    Table (..),
+    newTable,
+    table_arn,
+    table_creationTime,
+    table_databaseName,
+    table_lastUpdatedTime,
+    table_magneticStoreWriteProperties,
+    table_retentionProperties,
+    table_tableName,
+    table_tableStatus,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+import Amazonka.TimeStreamWrite.Types.Database
+import Amazonka.TimeStreamWrite.Types.Dimension
+import Amazonka.TimeStreamWrite.Types.DimensionValueType
+import Amazonka.TimeStreamWrite.Types.Endpoint
+import Amazonka.TimeStreamWrite.Types.MagneticStoreRejectedDataLocation
+import Amazonka.TimeStreamWrite.Types.MagneticStoreWriteProperties
+import Amazonka.TimeStreamWrite.Types.MeasureValue
+import Amazonka.TimeStreamWrite.Types.MeasureValueType
+import Amazonka.TimeStreamWrite.Types.Record
+import Amazonka.TimeStreamWrite.Types.RecordsIngested
+import Amazonka.TimeStreamWrite.Types.RetentionProperties
+import Amazonka.TimeStreamWrite.Types.S3Configuration
+import Amazonka.TimeStreamWrite.Types.S3EncryptionOption
+import Amazonka.TimeStreamWrite.Types.Table
+import Amazonka.TimeStreamWrite.Types.TableStatus
+import Amazonka.TimeStreamWrite.Types.Tag
+import Amazonka.TimeStreamWrite.Types.TimeUnit
+
+-- | API version @2018-11-01@ of the Amazon Timestream Write SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "TimeStreamWrite",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "ingest.timestream",
+      Core.signingName = "timestream",
+      Core.version = "2018-11-01",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "TimeStreamWrite",
+      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 are not authorized to perform this action.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+
+-- | Timestream was unable to process this request because it contains
+-- resource that already exists.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+
+-- | Timestream 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 requested endpoint was invalid.
+_InvalidEndpointException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidEndpointException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidEndpointException"
+
+-- | WriteRecords would throw this exception in the following cases:
+--
+-- -   Records with duplicate data where there are multiple records with
+--     the same dimensions, timestamps, and measure names but:
+--
+--     -   Measure values are different
+--
+--     -   Version is not present in the request /or/ the value of version
+--         in the new record is equal to or lower than the existing value
+--
+--     In this case, if Timestream rejects data, the @ExistingVersion@
+--     field in the @RejectedRecords@ response will indicate the current
+--     record’s version. To force an update, you can resend the request
+--     with a version for the record set to a value greater than the
+--     @ExistingVersion@.
+--
+-- -   Records with timestamps that lie outside the retention duration of
+--     the memory store
+--
+-- -   Records with dimensions or measures that exceed the Timestream
+--     defined limits.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html Quotas>
+-- in the Timestream Developer Guide.
+_RejectedRecordsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RejectedRecordsException =
+  Core._MatchServiceError
+    defaultService
+    "RejectedRecordsException"
+
+-- | The operation tried to access a nonexistent resource. 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"
+
+-- | Instance quota of resource exceeded for this account.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+
+-- | Too many requests were made by a user exceeding service quotas. The
+-- request was throttled.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+
+-- | Invalid or malformed request.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
diff --git a/gen/Amazonka/TimeStreamWrite/Types/Database.hs b/gen/Amazonka/TimeStreamWrite/Types/Database.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/Database.hs
@@ -0,0 +1,140 @@
+{-# 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.TimeStreamWrite.Types.Database
+-- 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.TimeStreamWrite.Types.Database where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A top level container for a table. Databases and tables are the
+-- fundamental management concepts in Amazon Timestream. All tables in a
+-- database are encrypted with the same KMS key.
+--
+-- /See:/ 'newDatabase' smart constructor.
+data Database = Database'
+  { -- | The Amazon Resource Name that uniquely identifies this database.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The time when the database was created, calculated from the Unix epoch
+    -- time.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the Timestream database.
+    databaseName :: Prelude.Maybe Prelude.Text,
+    -- | The identifier of the KMS key used to encrypt the data stored in the
+    -- database.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The last time that this database was updated.
+    lastUpdatedTime :: Prelude.Maybe Data.POSIX,
+    -- | The total number of tables found within a Timestream database.
+    tableCount :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Database' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'database_arn' - The Amazon Resource Name that uniquely identifies this database.
+--
+-- 'creationTime', 'database_creationTime' - The time when the database was created, calculated from the Unix epoch
+-- time.
+--
+-- 'databaseName', 'database_databaseName' - The name of the Timestream database.
+--
+-- 'kmsKeyId', 'database_kmsKeyId' - The identifier of the KMS key used to encrypt the data stored in the
+-- database.
+--
+-- 'lastUpdatedTime', 'database_lastUpdatedTime' - The last time that this database was updated.
+--
+-- 'tableCount', 'database_tableCount' - The total number of tables found within a Timestream database.
+newDatabase ::
+  Database
+newDatabase =
+  Database'
+    { arn = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      databaseName = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      lastUpdatedTime = Prelude.Nothing,
+      tableCount = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name that uniquely identifies this database.
+database_arn :: Lens.Lens' Database (Prelude.Maybe Prelude.Text)
+database_arn = Lens.lens (\Database' {arn} -> arn) (\s@Database' {} a -> s {arn = a} :: Database)
+
+-- | The time when the database was created, calculated from the Unix epoch
+-- time.
+database_creationTime :: Lens.Lens' Database (Prelude.Maybe Prelude.UTCTime)
+database_creationTime = Lens.lens (\Database' {creationTime} -> creationTime) (\s@Database' {} a -> s {creationTime = a} :: Database) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the Timestream database.
+database_databaseName :: Lens.Lens' Database (Prelude.Maybe Prelude.Text)
+database_databaseName = Lens.lens (\Database' {databaseName} -> databaseName) (\s@Database' {} a -> s {databaseName = a} :: Database)
+
+-- | The identifier of the KMS key used to encrypt the data stored in the
+-- database.
+database_kmsKeyId :: Lens.Lens' Database (Prelude.Maybe Prelude.Text)
+database_kmsKeyId = Lens.lens (\Database' {kmsKeyId} -> kmsKeyId) (\s@Database' {} a -> s {kmsKeyId = a} :: Database)
+
+-- | The last time that this database was updated.
+database_lastUpdatedTime :: Lens.Lens' Database (Prelude.Maybe Prelude.UTCTime)
+database_lastUpdatedTime = Lens.lens (\Database' {lastUpdatedTime} -> lastUpdatedTime) (\s@Database' {} a -> s {lastUpdatedTime = a} :: Database) Prelude.. Lens.mapping Data._Time
+
+-- | The total number of tables found within a Timestream database.
+database_tableCount :: Lens.Lens' Database (Prelude.Maybe Prelude.Integer)
+database_tableCount = Lens.lens (\Database' {tableCount} -> tableCount) (\s@Database' {} a -> s {tableCount = a} :: Database)
+
+instance Data.FromJSON Database where
+  parseJSON =
+    Data.withObject
+      "Database"
+      ( \x ->
+          Database'
+            Prelude.<$> (x Data..:? "Arn")
+            Prelude.<*> (x Data..:? "CreationTime")
+            Prelude.<*> (x Data..:? "DatabaseName")
+            Prelude.<*> (x Data..:? "KmsKeyId")
+            Prelude.<*> (x Data..:? "LastUpdatedTime")
+            Prelude.<*> (x Data..:? "TableCount")
+      )
+
+instance Prelude.Hashable Database where
+  hashWithSalt _salt Database' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` lastUpdatedTime
+      `Prelude.hashWithSalt` tableCount
+
+instance Prelude.NFData Database where
+  rnf Database' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf lastUpdatedTime
+      `Prelude.seq` Prelude.rnf tableCount
diff --git a/gen/Amazonka/TimeStreamWrite/Types/Dimension.hs b/gen/Amazonka/TimeStreamWrite/Types/Dimension.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/Dimension.hs
@@ -0,0 +1,118 @@
+{-# 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.TimeStreamWrite.Types.Dimension
+-- 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.TimeStreamWrite.Types.Dimension 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
+import Amazonka.TimeStreamWrite.Types.DimensionValueType
+
+-- | Dimension represents the meta data attributes of the time series. For
+-- example, the name and availability zone of an EC2 instance or the name
+-- of the manufacturer of a wind turbine are dimensions.
+--
+-- /See:/ 'newDimension' smart constructor.
+data Dimension = Dimension'
+  { -- | The data type of the dimension for the time series data point.
+    dimensionValueType :: Prelude.Maybe DimensionValueType,
+    -- | Dimension represents the meta data attributes of the time series. For
+    -- example, the name and availability zone of an EC2 instance or the name
+    -- of the manufacturer of a wind turbine are dimensions.
+    --
+    -- For constraints on Dimension names, see
+    -- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html#limits.naming Naming Constraints>.
+    name :: Prelude.Text,
+    -- | The value of the dimension.
+    value :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Dimension' 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:
+--
+-- 'dimensionValueType', 'dimension_dimensionValueType' - The data type of the dimension for the time series data point.
+--
+-- 'name', 'dimension_name' - Dimension represents the meta data attributes of the time series. For
+-- example, the name and availability zone of an EC2 instance or the name
+-- of the manufacturer of a wind turbine are dimensions.
+--
+-- For constraints on Dimension names, see
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html#limits.naming Naming Constraints>.
+--
+-- 'value', 'dimension_value' - The value of the dimension.
+newDimension ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  Dimension
+newDimension pName_ pValue_ =
+  Dimension'
+    { dimensionValueType = Prelude.Nothing,
+      name = pName_,
+      value = pValue_
+    }
+
+-- | The data type of the dimension for the time series data point.
+dimension_dimensionValueType :: Lens.Lens' Dimension (Prelude.Maybe DimensionValueType)
+dimension_dimensionValueType = Lens.lens (\Dimension' {dimensionValueType} -> dimensionValueType) (\s@Dimension' {} a -> s {dimensionValueType = a} :: Dimension)
+
+-- | Dimension represents the meta data attributes of the time series. For
+-- example, the name and availability zone of an EC2 instance or the name
+-- of the manufacturer of a wind turbine are dimensions.
+--
+-- For constraints on Dimension names, see
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html#limits.naming Naming Constraints>.
+dimension_name :: Lens.Lens' Dimension Prelude.Text
+dimension_name = Lens.lens (\Dimension' {name} -> name) (\s@Dimension' {} a -> s {name = a} :: Dimension)
+
+-- | The value of the dimension.
+dimension_value :: Lens.Lens' Dimension Prelude.Text
+dimension_value = Lens.lens (\Dimension' {value} -> value) (\s@Dimension' {} a -> s {value = a} :: Dimension)
+
+instance Prelude.Hashable Dimension where
+  hashWithSalt _salt Dimension' {..} =
+    _salt
+      `Prelude.hashWithSalt` dimensionValueType
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Dimension where
+  rnf Dimension' {..} =
+    Prelude.rnf dimensionValueType
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Dimension where
+  toJSON Dimension' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DimensionValueType" Data..=)
+              Prelude.<$> dimensionValueType,
+            Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/TimeStreamWrite/Types/DimensionValueType.hs b/gen/Amazonka/TimeStreamWrite/Types/DimensionValueType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/DimensionValueType.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.TimeStreamWrite.Types.DimensionValueType
+-- 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.TimeStreamWrite.Types.DimensionValueType
+  ( DimensionValueType
+      ( ..,
+        DimensionValueType_VARCHAR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DimensionValueType = DimensionValueType'
+  { fromDimensionValueType ::
+      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 DimensionValueType_VARCHAR :: DimensionValueType
+pattern DimensionValueType_VARCHAR = DimensionValueType' "VARCHAR"
+
+{-# COMPLETE
+  DimensionValueType_VARCHAR,
+  DimensionValueType'
+  #-}
diff --git a/gen/Amazonka/TimeStreamWrite/Types/Endpoint.hs b/gen/Amazonka/TimeStreamWrite/Types/Endpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/Endpoint.hs
@@ -0,0 +1,89 @@
+{-# 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.TimeStreamWrite.Types.Endpoint
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.TimeStreamWrite.Types.Endpoint where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents an available endpoint against which to make API calls
+-- agaisnt, as well as the TTL for that endpoint.
+--
+-- /See:/ 'newEndpoint' smart constructor.
+data Endpoint = Endpoint'
+  { -- | An endpoint address.
+    address :: Prelude.Text,
+    -- | The TTL for the endpoint, in minutes.
+    cachePeriodInMinutes :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Endpoint' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'address', 'endpoint_address' - An endpoint address.
+--
+-- 'cachePeriodInMinutes', 'endpoint_cachePeriodInMinutes' - The TTL for the endpoint, in minutes.
+newEndpoint ::
+  -- | 'address'
+  Prelude.Text ->
+  -- | 'cachePeriodInMinutes'
+  Prelude.Integer ->
+  Endpoint
+newEndpoint pAddress_ pCachePeriodInMinutes_ =
+  Endpoint'
+    { address = pAddress_,
+      cachePeriodInMinutes = pCachePeriodInMinutes_
+    }
+
+-- | An endpoint address.
+endpoint_address :: Lens.Lens' Endpoint Prelude.Text
+endpoint_address = Lens.lens (\Endpoint' {address} -> address) (\s@Endpoint' {} a -> s {address = a} :: Endpoint)
+
+-- | The TTL for the endpoint, in minutes.
+endpoint_cachePeriodInMinutes :: Lens.Lens' Endpoint Prelude.Integer
+endpoint_cachePeriodInMinutes = Lens.lens (\Endpoint' {cachePeriodInMinutes} -> cachePeriodInMinutes) (\s@Endpoint' {} a -> s {cachePeriodInMinutes = a} :: Endpoint)
+
+instance Data.FromJSON Endpoint where
+  parseJSON =
+    Data.withObject
+      "Endpoint"
+      ( \x ->
+          Endpoint'
+            Prelude.<$> (x Data..: "Address")
+            Prelude.<*> (x Data..: "CachePeriodInMinutes")
+      )
+
+instance Prelude.Hashable Endpoint where
+  hashWithSalt _salt Endpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` address
+      `Prelude.hashWithSalt` cachePeriodInMinutes
+
+instance Prelude.NFData Endpoint where
+  rnf Endpoint' {..} =
+    Prelude.rnf address
+      `Prelude.seq` Prelude.rnf cachePeriodInMinutes
diff --git a/gen/Amazonka/TimeStreamWrite/Types/MagneticStoreRejectedDataLocation.hs b/gen/Amazonka/TimeStreamWrite/Types/MagneticStoreRejectedDataLocation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/MagneticStoreRejectedDataLocation.hs
@@ -0,0 +1,100 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.TimeStreamWrite.Types.MagneticStoreRejectedDataLocation
+-- 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.TimeStreamWrite.Types.MagneticStoreRejectedDataLocation 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
+import Amazonka.TimeStreamWrite.Types.S3Configuration
+
+-- | The location to write error reports for records rejected,
+-- asynchronously, during magnetic store writes.
+--
+-- /See:/ 'newMagneticStoreRejectedDataLocation' smart constructor.
+data MagneticStoreRejectedDataLocation = MagneticStoreRejectedDataLocation'
+  { -- | Configuration of an S3 location to write error reports for records
+    -- rejected, asynchronously, during magnetic store writes.
+    s3Configuration :: Prelude.Maybe S3Configuration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MagneticStoreRejectedDataLocation' 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:
+--
+-- 's3Configuration', 'magneticStoreRejectedDataLocation_s3Configuration' - Configuration of an S3 location to write error reports for records
+-- rejected, asynchronously, during magnetic store writes.
+newMagneticStoreRejectedDataLocation ::
+  MagneticStoreRejectedDataLocation
+newMagneticStoreRejectedDataLocation =
+  MagneticStoreRejectedDataLocation'
+    { s3Configuration =
+        Prelude.Nothing
+    }
+
+-- | Configuration of an S3 location to write error reports for records
+-- rejected, asynchronously, during magnetic store writes.
+magneticStoreRejectedDataLocation_s3Configuration :: Lens.Lens' MagneticStoreRejectedDataLocation (Prelude.Maybe S3Configuration)
+magneticStoreRejectedDataLocation_s3Configuration = Lens.lens (\MagneticStoreRejectedDataLocation' {s3Configuration} -> s3Configuration) (\s@MagneticStoreRejectedDataLocation' {} a -> s {s3Configuration = a} :: MagneticStoreRejectedDataLocation)
+
+instance
+  Data.FromJSON
+    MagneticStoreRejectedDataLocation
+  where
+  parseJSON =
+    Data.withObject
+      "MagneticStoreRejectedDataLocation"
+      ( \x ->
+          MagneticStoreRejectedDataLocation'
+            Prelude.<$> (x Data..:? "S3Configuration")
+      )
+
+instance
+  Prelude.Hashable
+    MagneticStoreRejectedDataLocation
+  where
+  hashWithSalt
+    _salt
+    MagneticStoreRejectedDataLocation' {..} =
+      _salt `Prelude.hashWithSalt` s3Configuration
+
+instance
+  Prelude.NFData
+    MagneticStoreRejectedDataLocation
+  where
+  rnf MagneticStoreRejectedDataLocation' {..} =
+    Prelude.rnf s3Configuration
+
+instance
+  Data.ToJSON
+    MagneticStoreRejectedDataLocation
+  where
+  toJSON MagneticStoreRejectedDataLocation' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("S3Configuration" Data..=)
+              Prelude.<$> s3Configuration
+          ]
+      )
diff --git a/gen/Amazonka/TimeStreamWrite/Types/MagneticStoreWriteProperties.hs b/gen/Amazonka/TimeStreamWrite/Types/MagneticStoreWriteProperties.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/MagneticStoreWriteProperties.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.TimeStreamWrite.Types.MagneticStoreWriteProperties
+-- 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.TimeStreamWrite.Types.MagneticStoreWriteProperties 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
+import Amazonka.TimeStreamWrite.Types.MagneticStoreRejectedDataLocation
+
+-- | The set of properties on a table for configuring magnetic store writes.
+--
+-- /See:/ 'newMagneticStoreWriteProperties' smart constructor.
+data MagneticStoreWriteProperties = MagneticStoreWriteProperties'
+  { -- | The location to write error reports for records rejected asynchronously
+    -- during magnetic store writes.
+    magneticStoreRejectedDataLocation :: Prelude.Maybe MagneticStoreRejectedDataLocation,
+    -- | A flag to enable magnetic store writes.
+    enableMagneticStoreWrites :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MagneticStoreWriteProperties' 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:
+--
+-- 'magneticStoreRejectedDataLocation', 'magneticStoreWriteProperties_magneticStoreRejectedDataLocation' - The location to write error reports for records rejected asynchronously
+-- during magnetic store writes.
+--
+-- 'enableMagneticStoreWrites', 'magneticStoreWriteProperties_enableMagneticStoreWrites' - A flag to enable magnetic store writes.
+newMagneticStoreWriteProperties ::
+  -- | 'enableMagneticStoreWrites'
+  Prelude.Bool ->
+  MagneticStoreWriteProperties
+newMagneticStoreWriteProperties
+  pEnableMagneticStoreWrites_ =
+    MagneticStoreWriteProperties'
+      { magneticStoreRejectedDataLocation =
+          Prelude.Nothing,
+        enableMagneticStoreWrites =
+          pEnableMagneticStoreWrites_
+      }
+
+-- | The location to write error reports for records rejected asynchronously
+-- during magnetic store writes.
+magneticStoreWriteProperties_magneticStoreRejectedDataLocation :: Lens.Lens' MagneticStoreWriteProperties (Prelude.Maybe MagneticStoreRejectedDataLocation)
+magneticStoreWriteProperties_magneticStoreRejectedDataLocation = Lens.lens (\MagneticStoreWriteProperties' {magneticStoreRejectedDataLocation} -> magneticStoreRejectedDataLocation) (\s@MagneticStoreWriteProperties' {} a -> s {magneticStoreRejectedDataLocation = a} :: MagneticStoreWriteProperties)
+
+-- | A flag to enable magnetic store writes.
+magneticStoreWriteProperties_enableMagneticStoreWrites :: Lens.Lens' MagneticStoreWriteProperties Prelude.Bool
+magneticStoreWriteProperties_enableMagneticStoreWrites = Lens.lens (\MagneticStoreWriteProperties' {enableMagneticStoreWrites} -> enableMagneticStoreWrites) (\s@MagneticStoreWriteProperties' {} a -> s {enableMagneticStoreWrites = a} :: MagneticStoreWriteProperties)
+
+instance Data.FromJSON MagneticStoreWriteProperties where
+  parseJSON =
+    Data.withObject
+      "MagneticStoreWriteProperties"
+      ( \x ->
+          MagneticStoreWriteProperties'
+            Prelude.<$> (x Data..:? "MagneticStoreRejectedDataLocation")
+            Prelude.<*> (x Data..: "EnableMagneticStoreWrites")
+      )
+
+instance
+  Prelude.Hashable
+    MagneticStoreWriteProperties
+  where
+  hashWithSalt _salt MagneticStoreWriteProperties' {..} =
+    _salt
+      `Prelude.hashWithSalt` magneticStoreRejectedDataLocation
+      `Prelude.hashWithSalt` enableMagneticStoreWrites
+
+instance Prelude.NFData MagneticStoreWriteProperties where
+  rnf MagneticStoreWriteProperties' {..} =
+    Prelude.rnf magneticStoreRejectedDataLocation
+      `Prelude.seq` Prelude.rnf enableMagneticStoreWrites
+
+instance Data.ToJSON MagneticStoreWriteProperties where
+  toJSON MagneticStoreWriteProperties' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MagneticStoreRejectedDataLocation" Data..=)
+              Prelude.<$> magneticStoreRejectedDataLocation,
+            Prelude.Just
+              ( "EnableMagneticStoreWrites"
+                  Data..= enableMagneticStoreWrites
+              )
+          ]
+      )
diff --git a/gen/Amazonka/TimeStreamWrite/Types/MeasureValue.hs b/gen/Amazonka/TimeStreamWrite/Types/MeasureValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/MeasureValue.hs
@@ -0,0 +1,123 @@
+{-# 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.TimeStreamWrite.Types.MeasureValue
+-- 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.TimeStreamWrite.Types.MeasureValue 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
+import Amazonka.TimeStreamWrite.Types.MeasureValueType
+
+-- | MeasureValue represents the data attribute of the time series. For
+-- example, the CPU utilization of an EC2 instance or the RPM of a wind
+-- turbine are measures. MeasureValue has both name and value.
+--
+-- MeasureValue is only allowed for type @MULTI@. Using @MULTI@ type, you
+-- can pass multiple data attributes associated with the same time series
+-- in a single record
+--
+-- /See:/ 'newMeasureValue' smart constructor.
+data MeasureValue = MeasureValue'
+  { -- | Name of the MeasureValue.
+    --
+    -- For constraints on MeasureValue names, refer to
+    -- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html#limits.naming Naming Constraints>
+    -- in the Timestream developer guide.
+    name :: Prelude.Text,
+    -- | Value for the MeasureValue.
+    value :: Prelude.Text,
+    -- | Contains the data type of the MeasureValue for the time series data
+    -- point.
+    type' :: MeasureValueType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MeasureValue' 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', 'measureValue_name' - Name of the MeasureValue.
+--
+-- For constraints on MeasureValue names, refer to
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html#limits.naming Naming Constraints>
+-- in the Timestream developer guide.
+--
+-- 'value', 'measureValue_value' - Value for the MeasureValue.
+--
+-- 'type'', 'measureValue_type' - Contains the data type of the MeasureValue for the time series data
+-- point.
+newMeasureValue ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  -- | 'type''
+  MeasureValueType ->
+  MeasureValue
+newMeasureValue pName_ pValue_ pType_ =
+  MeasureValue'
+    { name = pName_,
+      value = pValue_,
+      type' = pType_
+    }
+
+-- | Name of the MeasureValue.
+--
+-- For constraints on MeasureValue names, refer to
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html#limits.naming Naming Constraints>
+-- in the Timestream developer guide.
+measureValue_name :: Lens.Lens' MeasureValue Prelude.Text
+measureValue_name = Lens.lens (\MeasureValue' {name} -> name) (\s@MeasureValue' {} a -> s {name = a} :: MeasureValue)
+
+-- | Value for the MeasureValue.
+measureValue_value :: Lens.Lens' MeasureValue Prelude.Text
+measureValue_value = Lens.lens (\MeasureValue' {value} -> value) (\s@MeasureValue' {} a -> s {value = a} :: MeasureValue)
+
+-- | Contains the data type of the MeasureValue for the time series data
+-- point.
+measureValue_type :: Lens.Lens' MeasureValue MeasureValueType
+measureValue_type = Lens.lens (\MeasureValue' {type'} -> type') (\s@MeasureValue' {} a -> s {type' = a} :: MeasureValue)
+
+instance Prelude.Hashable MeasureValue where
+  hashWithSalt _salt MeasureValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` value
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData MeasureValue where
+  rnf MeasureValue' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf value
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON MeasureValue where
+  toJSON MeasureValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Value" Data..= value),
+            Prelude.Just ("Type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/TimeStreamWrite/Types/MeasureValueType.hs b/gen/Amazonka/TimeStreamWrite/Types/MeasureValueType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/MeasureValueType.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.TimeStreamWrite.Types.MeasureValueType
+-- 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.TimeStreamWrite.Types.MeasureValueType
+  ( MeasureValueType
+      ( ..,
+        MeasureValueType_BIGINT,
+        MeasureValueType_BOOLEAN,
+        MeasureValueType_DOUBLE,
+        MeasureValueType_MULTI,
+        MeasureValueType_TIMESTAMP,
+        MeasureValueType_VARCHAR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype MeasureValueType = MeasureValueType'
+  { fromMeasureValueType ::
+      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 MeasureValueType_BIGINT :: MeasureValueType
+pattern MeasureValueType_BIGINT = MeasureValueType' "BIGINT"
+
+pattern MeasureValueType_BOOLEAN :: MeasureValueType
+pattern MeasureValueType_BOOLEAN = MeasureValueType' "BOOLEAN"
+
+pattern MeasureValueType_DOUBLE :: MeasureValueType
+pattern MeasureValueType_DOUBLE = MeasureValueType' "DOUBLE"
+
+pattern MeasureValueType_MULTI :: MeasureValueType
+pattern MeasureValueType_MULTI = MeasureValueType' "MULTI"
+
+pattern MeasureValueType_TIMESTAMP :: MeasureValueType
+pattern MeasureValueType_TIMESTAMP = MeasureValueType' "TIMESTAMP"
+
+pattern MeasureValueType_VARCHAR :: MeasureValueType
+pattern MeasureValueType_VARCHAR = MeasureValueType' "VARCHAR"
+
+{-# COMPLETE
+  MeasureValueType_BIGINT,
+  MeasureValueType_BOOLEAN,
+  MeasureValueType_DOUBLE,
+  MeasureValueType_MULTI,
+  MeasureValueType_TIMESTAMP,
+  MeasureValueType_VARCHAR,
+  MeasureValueType'
+  #-}
diff --git a/gen/Amazonka/TimeStreamWrite/Types/Record.hs b/gen/Amazonka/TimeStreamWrite/Types/Record.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/Record.hs
@@ -0,0 +1,227 @@
+{-# 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.TimeStreamWrite.Types.Record
+-- 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.TimeStreamWrite.Types.Record 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
+import Amazonka.TimeStreamWrite.Types.Dimension
+import Amazonka.TimeStreamWrite.Types.MeasureValue
+import Amazonka.TimeStreamWrite.Types.MeasureValueType
+import Amazonka.TimeStreamWrite.Types.TimeUnit
+
+-- | Record represents a time series data point being written into
+-- Timestream. Each record contains an array of dimensions. Dimensions
+-- represent the meta data attributes of a time series data point such as
+-- the instance name or availability zone of an EC2 instance. A record also
+-- contains the measure name which is the name of the measure being
+-- collected for example the CPU utilization of an EC2 instance. A record
+-- also contains the measure value and the value type which is the data
+-- type of the measure value. In addition, the record contains the
+-- timestamp when the measure was collected that the timestamp unit which
+-- represents the granularity of the timestamp.
+--
+-- Records have a @Version@ field, which is a 64-bit @long@ that you can
+-- use for updating data points. Writes of a duplicate record with the same
+-- dimension, timestamp, and measure name but different measure value will
+-- only succeed if the @Version@ attribute of the record in the write
+-- request is higher than that of the existing record. Timestream defaults
+-- to a @Version@ of @1@ for records without the @Version@ field.
+--
+-- /See:/ 'newRecord' smart constructor.
+data Record = Record'
+  { -- | Contains the list of dimensions for time series data points.
+    dimensions :: Prelude.Maybe [Dimension],
+    -- | Measure represents the data attribute of the time series. For example,
+    -- the CPU utilization of an EC2 instance or the RPM of a wind turbine are
+    -- measures.
+    measureName :: Prelude.Maybe Prelude.Text,
+    -- | Contains the measure value for the time series data point.
+    measureValue :: Prelude.Maybe Prelude.Text,
+    -- | Contains the data type of the measure value for the time series data
+    -- point. Default type is @DOUBLE@.
+    measureValueType :: Prelude.Maybe MeasureValueType,
+    -- | Contains the list of MeasureValue for time series data points.
+    --
+    -- This is only allowed for type @MULTI@. For scalar values, use
+    -- @MeasureValue@ attribute of the Record directly.
+    measureValues :: Prelude.Maybe [MeasureValue],
+    -- | Contains the time at which the measure value for the data point was
+    -- collected. The time value plus the unit provides the time elapsed since
+    -- the epoch. For example, if the time value is @12345@ and the unit is
+    -- @ms@, then @12345 ms@ have elapsed since the epoch.
+    time :: Prelude.Maybe Prelude.Text,
+    -- | The granularity of the timestamp unit. It indicates if the time value is
+    -- in seconds, milliseconds, nanoseconds or other supported values. Default
+    -- is @MILLISECONDS@.
+    timeUnit :: Prelude.Maybe TimeUnit,
+    -- | 64-bit attribute used for record updates. Write requests for duplicate
+    -- data with a higher version number will update the existing measure value
+    -- and version. In cases where the measure value is the same, @Version@
+    -- will still be updated . Default value is @1@.
+    --
+    -- @Version@ must be @1@ or greater, or you will receive a
+    -- @ValidationException@ error.
+    version :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Record' 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:
+--
+-- 'dimensions', 'record_dimensions' - Contains the list of dimensions for time series data points.
+--
+-- 'measureName', 'record_measureName' - Measure represents the data attribute of the time series. For example,
+-- the CPU utilization of an EC2 instance or the RPM of a wind turbine are
+-- measures.
+--
+-- 'measureValue', 'record_measureValue' - Contains the measure value for the time series data point.
+--
+-- 'measureValueType', 'record_measureValueType' - Contains the data type of the measure value for the time series data
+-- point. Default type is @DOUBLE@.
+--
+-- 'measureValues', 'record_measureValues' - Contains the list of MeasureValue for time series data points.
+--
+-- This is only allowed for type @MULTI@. For scalar values, use
+-- @MeasureValue@ attribute of the Record directly.
+--
+-- 'time', 'record_time' - Contains the time at which the measure value for the data point was
+-- collected. The time value plus the unit provides the time elapsed since
+-- the epoch. For example, if the time value is @12345@ and the unit is
+-- @ms@, then @12345 ms@ have elapsed since the epoch.
+--
+-- 'timeUnit', 'record_timeUnit' - The granularity of the timestamp unit. It indicates if the time value is
+-- in seconds, milliseconds, nanoseconds or other supported values. Default
+-- is @MILLISECONDS@.
+--
+-- 'version', 'record_version' - 64-bit attribute used for record updates. Write requests for duplicate
+-- data with a higher version number will update the existing measure value
+-- and version. In cases where the measure value is the same, @Version@
+-- will still be updated . Default value is @1@.
+--
+-- @Version@ must be @1@ or greater, or you will receive a
+-- @ValidationException@ error.
+newRecord ::
+  Record
+newRecord =
+  Record'
+    { dimensions = Prelude.Nothing,
+      measureName = Prelude.Nothing,
+      measureValue = Prelude.Nothing,
+      measureValueType = Prelude.Nothing,
+      measureValues = Prelude.Nothing,
+      time = Prelude.Nothing,
+      timeUnit = Prelude.Nothing,
+      version = Prelude.Nothing
+    }
+
+-- | Contains the list of dimensions for time series data points.
+record_dimensions :: Lens.Lens' Record (Prelude.Maybe [Dimension])
+record_dimensions = Lens.lens (\Record' {dimensions} -> dimensions) (\s@Record' {} a -> s {dimensions = a} :: Record) Prelude.. Lens.mapping Lens.coerced
+
+-- | Measure represents the data attribute of the time series. For example,
+-- the CPU utilization of an EC2 instance or the RPM of a wind turbine are
+-- measures.
+record_measureName :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
+record_measureName = Lens.lens (\Record' {measureName} -> measureName) (\s@Record' {} a -> s {measureName = a} :: Record)
+
+-- | Contains the measure value for the time series data point.
+record_measureValue :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
+record_measureValue = Lens.lens (\Record' {measureValue} -> measureValue) (\s@Record' {} a -> s {measureValue = a} :: Record)
+
+-- | Contains the data type of the measure value for the time series data
+-- point. Default type is @DOUBLE@.
+record_measureValueType :: Lens.Lens' Record (Prelude.Maybe MeasureValueType)
+record_measureValueType = Lens.lens (\Record' {measureValueType} -> measureValueType) (\s@Record' {} a -> s {measureValueType = a} :: Record)
+
+-- | Contains the list of MeasureValue for time series data points.
+--
+-- This is only allowed for type @MULTI@. For scalar values, use
+-- @MeasureValue@ attribute of the Record directly.
+record_measureValues :: Lens.Lens' Record (Prelude.Maybe [MeasureValue])
+record_measureValues = Lens.lens (\Record' {measureValues} -> measureValues) (\s@Record' {} a -> s {measureValues = a} :: Record) Prelude.. Lens.mapping Lens.coerced
+
+-- | Contains the time at which the measure value for the data point was
+-- collected. The time value plus the unit provides the time elapsed since
+-- the epoch. For example, if the time value is @12345@ and the unit is
+-- @ms@, then @12345 ms@ have elapsed since the epoch.
+record_time :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
+record_time = Lens.lens (\Record' {time} -> time) (\s@Record' {} a -> s {time = a} :: Record)
+
+-- | The granularity of the timestamp unit. It indicates if the time value is
+-- in seconds, milliseconds, nanoseconds or other supported values. Default
+-- is @MILLISECONDS@.
+record_timeUnit :: Lens.Lens' Record (Prelude.Maybe TimeUnit)
+record_timeUnit = Lens.lens (\Record' {timeUnit} -> timeUnit) (\s@Record' {} a -> s {timeUnit = a} :: Record)
+
+-- | 64-bit attribute used for record updates. Write requests for duplicate
+-- data with a higher version number will update the existing measure value
+-- and version. In cases where the measure value is the same, @Version@
+-- will still be updated . Default value is @1@.
+--
+-- @Version@ must be @1@ or greater, or you will receive a
+-- @ValidationException@ error.
+record_version :: Lens.Lens' Record (Prelude.Maybe Prelude.Integer)
+record_version = Lens.lens (\Record' {version} -> version) (\s@Record' {} a -> s {version = a} :: Record)
+
+instance Prelude.Hashable Record where
+  hashWithSalt _salt Record' {..} =
+    _salt
+      `Prelude.hashWithSalt` dimensions
+      `Prelude.hashWithSalt` measureName
+      `Prelude.hashWithSalt` measureValue
+      `Prelude.hashWithSalt` measureValueType
+      `Prelude.hashWithSalt` measureValues
+      `Prelude.hashWithSalt` time
+      `Prelude.hashWithSalt` timeUnit
+      `Prelude.hashWithSalt` version
+
+instance Prelude.NFData Record where
+  rnf Record' {..} =
+    Prelude.rnf dimensions
+      `Prelude.seq` Prelude.rnf measureName
+      `Prelude.seq` Prelude.rnf measureValue
+      `Prelude.seq` Prelude.rnf measureValueType
+      `Prelude.seq` Prelude.rnf measureValues
+      `Prelude.seq` Prelude.rnf time
+      `Prelude.seq` Prelude.rnf timeUnit
+      `Prelude.seq` Prelude.rnf version
+
+instance Data.ToJSON Record where
+  toJSON Record' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Dimensions" Data..=) Prelude.<$> dimensions,
+            ("MeasureName" Data..=) Prelude.<$> measureName,
+            ("MeasureValue" Data..=) Prelude.<$> measureValue,
+            ("MeasureValueType" Data..=)
+              Prelude.<$> measureValueType,
+            ("MeasureValues" Data..=) Prelude.<$> measureValues,
+            ("Time" Data..=) Prelude.<$> time,
+            ("TimeUnit" Data..=) Prelude.<$> timeUnit,
+            ("Version" Data..=) Prelude.<$> version
+          ]
+      )
diff --git a/gen/Amazonka/TimeStreamWrite/Types/RecordsIngested.hs b/gen/Amazonka/TimeStreamWrite/Types/RecordsIngested.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/RecordsIngested.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.TimeStreamWrite.Types.RecordsIngested
+-- 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.TimeStreamWrite.Types.RecordsIngested 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
+
+-- | Information on the records ingested by this request.
+--
+-- /See:/ 'newRecordsIngested' smart constructor.
+data RecordsIngested = RecordsIngested'
+  { -- | Count of records ingested into the magnetic store.
+    magneticStore :: Prelude.Maybe Prelude.Int,
+    -- | Count of records ingested into the memory store.
+    memoryStore :: Prelude.Maybe Prelude.Int,
+    -- | Total count of successfully ingested records.
+    total :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RecordsIngested' 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:
+--
+-- 'magneticStore', 'recordsIngested_magneticStore' - Count of records ingested into the magnetic store.
+--
+-- 'memoryStore', 'recordsIngested_memoryStore' - Count of records ingested into the memory store.
+--
+-- 'total', 'recordsIngested_total' - Total count of successfully ingested records.
+newRecordsIngested ::
+  RecordsIngested
+newRecordsIngested =
+  RecordsIngested'
+    { magneticStore = Prelude.Nothing,
+      memoryStore = Prelude.Nothing,
+      total = Prelude.Nothing
+    }
+
+-- | Count of records ingested into the magnetic store.
+recordsIngested_magneticStore :: Lens.Lens' RecordsIngested (Prelude.Maybe Prelude.Int)
+recordsIngested_magneticStore = Lens.lens (\RecordsIngested' {magneticStore} -> magneticStore) (\s@RecordsIngested' {} a -> s {magneticStore = a} :: RecordsIngested)
+
+-- | Count of records ingested into the memory store.
+recordsIngested_memoryStore :: Lens.Lens' RecordsIngested (Prelude.Maybe Prelude.Int)
+recordsIngested_memoryStore = Lens.lens (\RecordsIngested' {memoryStore} -> memoryStore) (\s@RecordsIngested' {} a -> s {memoryStore = a} :: RecordsIngested)
+
+-- | Total count of successfully ingested records.
+recordsIngested_total :: Lens.Lens' RecordsIngested (Prelude.Maybe Prelude.Int)
+recordsIngested_total = Lens.lens (\RecordsIngested' {total} -> total) (\s@RecordsIngested' {} a -> s {total = a} :: RecordsIngested)
+
+instance Data.FromJSON RecordsIngested where
+  parseJSON =
+    Data.withObject
+      "RecordsIngested"
+      ( \x ->
+          RecordsIngested'
+            Prelude.<$> (x Data..:? "MagneticStore")
+            Prelude.<*> (x Data..:? "MemoryStore")
+            Prelude.<*> (x Data..:? "Total")
+      )
+
+instance Prelude.Hashable RecordsIngested where
+  hashWithSalt _salt RecordsIngested' {..} =
+    _salt
+      `Prelude.hashWithSalt` magneticStore
+      `Prelude.hashWithSalt` memoryStore
+      `Prelude.hashWithSalt` total
+
+instance Prelude.NFData RecordsIngested where
+  rnf RecordsIngested' {..} =
+    Prelude.rnf magneticStore
+      `Prelude.seq` Prelude.rnf memoryStore
+      `Prelude.seq` Prelude.rnf total
diff --git a/gen/Amazonka/TimeStreamWrite/Types/RetentionProperties.hs b/gen/Amazonka/TimeStreamWrite/Types/RetentionProperties.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/RetentionProperties.hs
@@ -0,0 +1,108 @@
+{-# 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.TimeStreamWrite.Types.RetentionProperties
+-- 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.TimeStreamWrite.Types.RetentionProperties 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
+
+-- | Retention properties contain the duration for which your time series
+-- data must be stored in the magnetic store and the memory store.
+--
+-- /See:/ 'newRetentionProperties' smart constructor.
+data RetentionProperties = RetentionProperties'
+  { -- | The duration for which data must be stored in the memory store.
+    memoryStoreRetentionPeriodInHours :: Prelude.Natural,
+    -- | The duration for which data must be stored in the magnetic store.
+    magneticStoreRetentionPeriodInDays :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RetentionProperties' 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:
+--
+-- 'memoryStoreRetentionPeriodInHours', 'retentionProperties_memoryStoreRetentionPeriodInHours' - The duration for which data must be stored in the memory store.
+--
+-- 'magneticStoreRetentionPeriodInDays', 'retentionProperties_magneticStoreRetentionPeriodInDays' - The duration for which data must be stored in the magnetic store.
+newRetentionProperties ::
+  -- | 'memoryStoreRetentionPeriodInHours'
+  Prelude.Natural ->
+  -- | 'magneticStoreRetentionPeriodInDays'
+  Prelude.Natural ->
+  RetentionProperties
+newRetentionProperties
+  pMemoryStoreRetentionPeriodInHours_
+  pMagneticStoreRetentionPeriodInDays_ =
+    RetentionProperties'
+      { memoryStoreRetentionPeriodInHours =
+          pMemoryStoreRetentionPeriodInHours_,
+        magneticStoreRetentionPeriodInDays =
+          pMagneticStoreRetentionPeriodInDays_
+      }
+
+-- | The duration for which data must be stored in the memory store.
+retentionProperties_memoryStoreRetentionPeriodInHours :: Lens.Lens' RetentionProperties Prelude.Natural
+retentionProperties_memoryStoreRetentionPeriodInHours = Lens.lens (\RetentionProperties' {memoryStoreRetentionPeriodInHours} -> memoryStoreRetentionPeriodInHours) (\s@RetentionProperties' {} a -> s {memoryStoreRetentionPeriodInHours = a} :: RetentionProperties)
+
+-- | The duration for which data must be stored in the magnetic store.
+retentionProperties_magneticStoreRetentionPeriodInDays :: Lens.Lens' RetentionProperties Prelude.Natural
+retentionProperties_magneticStoreRetentionPeriodInDays = Lens.lens (\RetentionProperties' {magneticStoreRetentionPeriodInDays} -> magneticStoreRetentionPeriodInDays) (\s@RetentionProperties' {} a -> s {magneticStoreRetentionPeriodInDays = a} :: RetentionProperties)
+
+instance Data.FromJSON RetentionProperties where
+  parseJSON =
+    Data.withObject
+      "RetentionProperties"
+      ( \x ->
+          RetentionProperties'
+            Prelude.<$> (x Data..: "MemoryStoreRetentionPeriodInHours")
+            Prelude.<*> (x Data..: "MagneticStoreRetentionPeriodInDays")
+      )
+
+instance Prelude.Hashable RetentionProperties where
+  hashWithSalt _salt RetentionProperties' {..} =
+    _salt
+      `Prelude.hashWithSalt` memoryStoreRetentionPeriodInHours
+      `Prelude.hashWithSalt` magneticStoreRetentionPeriodInDays
+
+instance Prelude.NFData RetentionProperties where
+  rnf RetentionProperties' {..} =
+    Prelude.rnf memoryStoreRetentionPeriodInHours
+      `Prelude.seq` Prelude.rnf magneticStoreRetentionPeriodInDays
+
+instance Data.ToJSON RetentionProperties where
+  toJSON RetentionProperties' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "MemoryStoreRetentionPeriodInHours"
+                  Data..= memoryStoreRetentionPeriodInHours
+              ),
+            Prelude.Just
+              ( "MagneticStoreRetentionPeriodInDays"
+                  Data..= magneticStoreRetentionPeriodInDays
+              )
+          ]
+      )
diff --git a/gen/Amazonka/TimeStreamWrite/Types/S3Configuration.hs b/gen/Amazonka/TimeStreamWrite/Types/S3Configuration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/S3Configuration.hs
@@ -0,0 +1,128 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.TimeStreamWrite.Types.S3Configuration
+-- 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.TimeStreamWrite.Types.S3Configuration 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
+import Amazonka.TimeStreamWrite.Types.S3EncryptionOption
+
+-- | Configuration specifing an S3 location.
+--
+-- /See:/ 'newS3Configuration' smart constructor.
+data S3Configuration = S3Configuration'
+  { -- | >Bucket name of the customer S3 bucket.
+    bucketName :: Prelude.Maybe Prelude.Text,
+    -- | Encryption option for the customer s3 location. Options are S3 server
+    -- side encryption with an S3-managed key or KMS managed key.
+    encryptionOption :: Prelude.Maybe S3EncryptionOption,
+    -- | KMS key id for the customer s3 location when encrypting with a KMS
+    -- managed key.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | Object key preview for the customer S3 location.
+    objectKeyPrefix :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3Configuration' 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:
+--
+-- 'bucketName', 's3Configuration_bucketName' - >Bucket name of the customer S3 bucket.
+--
+-- 'encryptionOption', 's3Configuration_encryptionOption' - Encryption option for the customer s3 location. Options are S3 server
+-- side encryption with an S3-managed key or KMS managed key.
+--
+-- 'kmsKeyId', 's3Configuration_kmsKeyId' - KMS key id for the customer s3 location when encrypting with a KMS
+-- managed key.
+--
+-- 'objectKeyPrefix', 's3Configuration_objectKeyPrefix' - Object key preview for the customer S3 location.
+newS3Configuration ::
+  S3Configuration
+newS3Configuration =
+  S3Configuration'
+    { bucketName = Prelude.Nothing,
+      encryptionOption = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      objectKeyPrefix = Prelude.Nothing
+    }
+
+-- | >Bucket name of the customer S3 bucket.
+s3Configuration_bucketName :: Lens.Lens' S3Configuration (Prelude.Maybe Prelude.Text)
+s3Configuration_bucketName = Lens.lens (\S3Configuration' {bucketName} -> bucketName) (\s@S3Configuration' {} a -> s {bucketName = a} :: S3Configuration)
+
+-- | Encryption option for the customer s3 location. Options are S3 server
+-- side encryption with an S3-managed key or KMS managed key.
+s3Configuration_encryptionOption :: Lens.Lens' S3Configuration (Prelude.Maybe S3EncryptionOption)
+s3Configuration_encryptionOption = Lens.lens (\S3Configuration' {encryptionOption} -> encryptionOption) (\s@S3Configuration' {} a -> s {encryptionOption = a} :: S3Configuration)
+
+-- | KMS key id for the customer s3 location when encrypting with a KMS
+-- managed key.
+s3Configuration_kmsKeyId :: Lens.Lens' S3Configuration (Prelude.Maybe Prelude.Text)
+s3Configuration_kmsKeyId = Lens.lens (\S3Configuration' {kmsKeyId} -> kmsKeyId) (\s@S3Configuration' {} a -> s {kmsKeyId = a} :: S3Configuration)
+
+-- | Object key preview for the customer S3 location.
+s3Configuration_objectKeyPrefix :: Lens.Lens' S3Configuration (Prelude.Maybe Prelude.Text)
+s3Configuration_objectKeyPrefix = Lens.lens (\S3Configuration' {objectKeyPrefix} -> objectKeyPrefix) (\s@S3Configuration' {} a -> s {objectKeyPrefix = a} :: S3Configuration)
+
+instance Data.FromJSON S3Configuration where
+  parseJSON =
+    Data.withObject
+      "S3Configuration"
+      ( \x ->
+          S3Configuration'
+            Prelude.<$> (x Data..:? "BucketName")
+            Prelude.<*> (x Data..:? "EncryptionOption")
+            Prelude.<*> (x Data..:? "KmsKeyId")
+            Prelude.<*> (x Data..:? "ObjectKeyPrefix")
+      )
+
+instance Prelude.Hashable S3Configuration where
+  hashWithSalt _salt S3Configuration' {..} =
+    _salt
+      `Prelude.hashWithSalt` bucketName
+      `Prelude.hashWithSalt` encryptionOption
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` objectKeyPrefix
+
+instance Prelude.NFData S3Configuration where
+  rnf S3Configuration' {..} =
+    Prelude.rnf bucketName
+      `Prelude.seq` Prelude.rnf encryptionOption
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf objectKeyPrefix
+
+instance Data.ToJSON S3Configuration where
+  toJSON S3Configuration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("BucketName" Data..=) Prelude.<$> bucketName,
+            ("EncryptionOption" Data..=)
+              Prelude.<$> encryptionOption,
+            ("KmsKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("ObjectKeyPrefix" Data..=)
+              Prelude.<$> objectKeyPrefix
+          ]
+      )
diff --git a/gen/Amazonka/TimeStreamWrite/Types/S3EncryptionOption.hs b/gen/Amazonka/TimeStreamWrite/Types/S3EncryptionOption.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/S3EncryptionOption.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.TimeStreamWrite.Types.S3EncryptionOption
+-- 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.TimeStreamWrite.Types.S3EncryptionOption
+  ( S3EncryptionOption
+      ( ..,
+        S3EncryptionOption_SSE_KMS,
+        S3EncryptionOption_SSE_S3
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype S3EncryptionOption = S3EncryptionOption'
+  { fromS3EncryptionOption ::
+      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 S3EncryptionOption_SSE_KMS :: S3EncryptionOption
+pattern S3EncryptionOption_SSE_KMS = S3EncryptionOption' "SSE_KMS"
+
+pattern S3EncryptionOption_SSE_S3 :: S3EncryptionOption
+pattern S3EncryptionOption_SSE_S3 = S3EncryptionOption' "SSE_S3"
+
+{-# COMPLETE
+  S3EncryptionOption_SSE_KMS,
+  S3EncryptionOption_SSE_S3,
+  S3EncryptionOption'
+  #-}
diff --git a/gen/Amazonka/TimeStreamWrite/Types/Table.hs b/gen/Amazonka/TimeStreamWrite/Types/Table.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/Table.hs
@@ -0,0 +1,176 @@
+{-# 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.TimeStreamWrite.Types.Table
+-- 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.TimeStreamWrite.Types.Table 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
+import Amazonka.TimeStreamWrite.Types.MagneticStoreWriteProperties
+import Amazonka.TimeStreamWrite.Types.RetentionProperties
+import Amazonka.TimeStreamWrite.Types.TableStatus
+
+-- | Table represents a database table in Timestream. Tables contain one or
+-- more related time series. You can modify the retention duration of the
+-- memory store and the magnetic store for a table.
+--
+-- /See:/ 'newTable' smart constructor.
+data Table = Table'
+  { -- | The Amazon Resource Name that uniquely identifies this table.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The time when the Timestream table was created.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the Timestream database that contains this table.
+    databaseName :: Prelude.Maybe Prelude.Text,
+    -- | The time when the Timestream table was last updated.
+    lastUpdatedTime :: Prelude.Maybe Data.POSIX,
+    -- | Contains properties to set on the table when enabling magnetic store
+    -- writes.
+    magneticStoreWriteProperties :: Prelude.Maybe MagneticStoreWriteProperties,
+    -- | The retention duration for the memory store and magnetic store.
+    retentionProperties :: Prelude.Maybe RetentionProperties,
+    -- | The name of the Timestream table.
+    tableName :: Prelude.Maybe Prelude.Text,
+    -- | The current state of the table:
+    --
+    -- -   @DELETING@ - The table is being deleted.
+    --
+    -- -   @ACTIVE@ - The table is ready for use.
+    tableStatus :: Prelude.Maybe TableStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Table' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'table_arn' - The Amazon Resource Name that uniquely identifies this table.
+--
+-- 'creationTime', 'table_creationTime' - The time when the Timestream table was created.
+--
+-- 'databaseName', 'table_databaseName' - The name of the Timestream database that contains this table.
+--
+-- 'lastUpdatedTime', 'table_lastUpdatedTime' - The time when the Timestream table was last updated.
+--
+-- 'magneticStoreWriteProperties', 'table_magneticStoreWriteProperties' - Contains properties to set on the table when enabling magnetic store
+-- writes.
+--
+-- 'retentionProperties', 'table_retentionProperties' - The retention duration for the memory store and magnetic store.
+--
+-- 'tableName', 'table_tableName' - The name of the Timestream table.
+--
+-- 'tableStatus', 'table_tableStatus' - The current state of the table:
+--
+-- -   @DELETING@ - The table is being deleted.
+--
+-- -   @ACTIVE@ - The table is ready for use.
+newTable ::
+  Table
+newTable =
+  Table'
+    { arn = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      databaseName = Prelude.Nothing,
+      lastUpdatedTime = Prelude.Nothing,
+      magneticStoreWriteProperties = Prelude.Nothing,
+      retentionProperties = Prelude.Nothing,
+      tableName = Prelude.Nothing,
+      tableStatus = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name that uniquely identifies this table.
+table_arn :: Lens.Lens' Table (Prelude.Maybe Prelude.Text)
+table_arn = Lens.lens (\Table' {arn} -> arn) (\s@Table' {} a -> s {arn = a} :: Table)
+
+-- | The time when the Timestream table was created.
+table_creationTime :: Lens.Lens' Table (Prelude.Maybe Prelude.UTCTime)
+table_creationTime = Lens.lens (\Table' {creationTime} -> creationTime) (\s@Table' {} a -> s {creationTime = a} :: Table) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the Timestream database that contains this table.
+table_databaseName :: Lens.Lens' Table (Prelude.Maybe Prelude.Text)
+table_databaseName = Lens.lens (\Table' {databaseName} -> databaseName) (\s@Table' {} a -> s {databaseName = a} :: Table)
+
+-- | The time when the Timestream table was last updated.
+table_lastUpdatedTime :: Lens.Lens' Table (Prelude.Maybe Prelude.UTCTime)
+table_lastUpdatedTime = Lens.lens (\Table' {lastUpdatedTime} -> lastUpdatedTime) (\s@Table' {} a -> s {lastUpdatedTime = a} :: Table) Prelude.. Lens.mapping Data._Time
+
+-- | Contains properties to set on the table when enabling magnetic store
+-- writes.
+table_magneticStoreWriteProperties :: Lens.Lens' Table (Prelude.Maybe MagneticStoreWriteProperties)
+table_magneticStoreWriteProperties = Lens.lens (\Table' {magneticStoreWriteProperties} -> magneticStoreWriteProperties) (\s@Table' {} a -> s {magneticStoreWriteProperties = a} :: Table)
+
+-- | The retention duration for the memory store and magnetic store.
+table_retentionProperties :: Lens.Lens' Table (Prelude.Maybe RetentionProperties)
+table_retentionProperties = Lens.lens (\Table' {retentionProperties} -> retentionProperties) (\s@Table' {} a -> s {retentionProperties = a} :: Table)
+
+-- | The name of the Timestream table.
+table_tableName :: Lens.Lens' Table (Prelude.Maybe Prelude.Text)
+table_tableName = Lens.lens (\Table' {tableName} -> tableName) (\s@Table' {} a -> s {tableName = a} :: Table)
+
+-- | The current state of the table:
+--
+-- -   @DELETING@ - The table is being deleted.
+--
+-- -   @ACTIVE@ - The table is ready for use.
+table_tableStatus :: Lens.Lens' Table (Prelude.Maybe TableStatus)
+table_tableStatus = Lens.lens (\Table' {tableStatus} -> tableStatus) (\s@Table' {} a -> s {tableStatus = a} :: Table)
+
+instance Data.FromJSON Table where
+  parseJSON =
+    Data.withObject
+      "Table"
+      ( \x ->
+          Table'
+            Prelude.<$> (x Data..:? "Arn")
+            Prelude.<*> (x Data..:? "CreationTime")
+            Prelude.<*> (x Data..:? "DatabaseName")
+            Prelude.<*> (x Data..:? "LastUpdatedTime")
+            Prelude.<*> (x Data..:? "MagneticStoreWriteProperties")
+            Prelude.<*> (x Data..:? "RetentionProperties")
+            Prelude.<*> (x Data..:? "TableName")
+            Prelude.<*> (x Data..:? "TableStatus")
+      )
+
+instance Prelude.Hashable Table where
+  hashWithSalt _salt Table' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` lastUpdatedTime
+      `Prelude.hashWithSalt` magneticStoreWriteProperties
+      `Prelude.hashWithSalt` retentionProperties
+      `Prelude.hashWithSalt` tableName
+      `Prelude.hashWithSalt` tableStatus
+
+instance Prelude.NFData Table where
+  rnf Table' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf lastUpdatedTime
+      `Prelude.seq` Prelude.rnf magneticStoreWriteProperties
+      `Prelude.seq` Prelude.rnf retentionProperties
+      `Prelude.seq` Prelude.rnf tableName
+      `Prelude.seq` Prelude.rnf tableStatus
diff --git a/gen/Amazonka/TimeStreamWrite/Types/TableStatus.hs b/gen/Amazonka/TimeStreamWrite/Types/TableStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/TableStatus.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.TimeStreamWrite.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.TimeStreamWrite.Types.TableStatus
+  ( TableStatus
+      ( ..,
+        TableStatus_ACTIVE,
+        TableStatus_DELETING
+      ),
+  )
+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_DELETING :: TableStatus
+pattern TableStatus_DELETING = TableStatus' "DELETING"
+
+{-# COMPLETE
+  TableStatus_ACTIVE,
+  TableStatus_DELETING,
+  TableStatus'
+  #-}
diff --git a/gen/Amazonka/TimeStreamWrite/Types/Tag.hs b/gen/Amazonka/TimeStreamWrite/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/Tag.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.TimeStreamWrite.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.TimeStreamWrite.Types.Tag where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A tag is a label that you assign to a Timestream database and\/or table.
+-- Each tag consists of a key and an optional value, both of which you
+-- define. Tags enable you to categorize databases and\/or tables, for
+-- example, by purpose, owner, or environment.
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | The key of the tag. Tag keys are case sensitive.
+    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.
+--
+-- '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.
+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/TimeStreamWrite/Types/TimeUnit.hs b/gen/Amazonka/TimeStreamWrite/Types/TimeUnit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/Types/TimeUnit.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.TimeStreamWrite.Types.TimeUnit
+-- 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.TimeStreamWrite.Types.TimeUnit
+  ( TimeUnit
+      ( ..,
+        TimeUnit_MICROSECONDS,
+        TimeUnit_MILLISECONDS,
+        TimeUnit_NANOSECONDS,
+        TimeUnit_SECONDS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TimeUnit = TimeUnit'
+  { fromTimeUnit ::
+      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 TimeUnit_MICROSECONDS :: TimeUnit
+pattern TimeUnit_MICROSECONDS = TimeUnit' "MICROSECONDS"
+
+pattern TimeUnit_MILLISECONDS :: TimeUnit
+pattern TimeUnit_MILLISECONDS = TimeUnit' "MILLISECONDS"
+
+pattern TimeUnit_NANOSECONDS :: TimeUnit
+pattern TimeUnit_NANOSECONDS = TimeUnit' "NANOSECONDS"
+
+pattern TimeUnit_SECONDS :: TimeUnit
+pattern TimeUnit_SECONDS = TimeUnit' "SECONDS"
+
+{-# COMPLETE
+  TimeUnit_MICROSECONDS,
+  TimeUnit_MILLISECONDS,
+  TimeUnit_NANOSECONDS,
+  TimeUnit_SECONDS,
+  TimeUnit'
+  #-}
diff --git a/gen/Amazonka/TimeStreamWrite/UntagResource.hs b/gen/Amazonka/TimeStreamWrite/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/UntagResource.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.TimeStreamWrite.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 Timestream resource.
+module Amazonka.TimeStreamWrite.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceARN,
+    untagResource_tagKeys,
+
+    -- * 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 qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Timestream resource that the tags will be removed from. This value
+    -- is an Amazon Resource Name (ARN).
+    resourceARN :: Prelude.Text,
+    -- | A list of tags keys. Existing tags of the resource whose keys are
+    -- members of this list will be removed from the Timestream resource.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceARN', 'untagResource_resourceARN' - The Timestream resource that the tags will be removed from. This value
+-- is an Amazon Resource Name (ARN).
+--
+-- 'tagKeys', 'untagResource_tagKeys' - A list of tags keys. Existing tags of the resource whose keys are
+-- members of this list will be removed from the Timestream resource.
+newUntagResource ::
+  -- | 'resourceARN'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceARN_ =
+  UntagResource'
+    { resourceARN = pResourceARN_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The Timestream 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 tags keys. Existing tags of the resource whose keys are
+-- members of this list will be removed from the Timestream resource.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.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` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceARN
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.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 ("TagKeys" Data..= tagKeys)
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UntagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The 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/TimeStreamWrite/UpdateDatabase.hs b/gen/Amazonka/TimeStreamWrite/UpdateDatabase.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/UpdateDatabase.hs
@@ -0,0 +1,235 @@
+{-# 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.TimeStreamWrite.UpdateDatabase
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies the KMS key for an existing database. While updating the
+-- database, you must specify the database name and the identifier of the
+-- new KMS key to be used (@KmsKeyId@). If there are any concurrent
+-- @UpdateDatabase@ requests, first writer wins.
+--
+-- See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.update-db.html code sample>
+-- for details.
+module Amazonka.TimeStreamWrite.UpdateDatabase
+  ( -- * Creating a Request
+    UpdateDatabase (..),
+    newUpdateDatabase,
+
+    -- * Request Lenses
+    updateDatabase_databaseName,
+    updateDatabase_kmsKeyId,
+
+    -- * Destructuring the Response
+    UpdateDatabaseResponse (..),
+    newUpdateDatabaseResponse,
+
+    -- * Response Lenses
+    updateDatabaseResponse_database,
+    updateDatabaseResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newUpdateDatabase' smart constructor.
+data UpdateDatabase = UpdateDatabase'
+  { -- | The name of the database.
+    databaseName :: Prelude.Text,
+    -- | The identifier of the new KMS key (@KmsKeyId@) to be used to encrypt the
+    -- data stored in the database. If the @KmsKeyId@ currently registered with
+    -- the database is the same as the @KmsKeyId@ in the request, there will
+    -- not be any update.
+    --
+    -- You can specify the @KmsKeyId@ using any of the following:
+    --
+    -- -   Key ID: @1234abcd-12ab-34cd-56ef-1234567890ab@
+    --
+    -- -   Key ARN:
+    --     @arn:aws:kms:us-east-1:111122223333:key\/1234abcd-12ab-34cd-56ef-1234567890ab@
+    --
+    -- -   Alias name: @alias\/ExampleAlias@
+    --
+    -- -   Alias ARN: @arn:aws:kms:us-east-1:111122223333:alias\/ExampleAlias@
+    kmsKeyId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDatabase' 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:
+--
+-- 'databaseName', 'updateDatabase_databaseName' - The name of the database.
+--
+-- 'kmsKeyId', 'updateDatabase_kmsKeyId' - The identifier of the new KMS key (@KmsKeyId@) to be used to encrypt the
+-- data stored in the database. If the @KmsKeyId@ currently registered with
+-- the database is the same as the @KmsKeyId@ in the request, there will
+-- not be any update.
+--
+-- You can specify the @KmsKeyId@ using any of the following:
+--
+-- -   Key ID: @1234abcd-12ab-34cd-56ef-1234567890ab@
+--
+-- -   Key ARN:
+--     @arn:aws:kms:us-east-1:111122223333:key\/1234abcd-12ab-34cd-56ef-1234567890ab@
+--
+-- -   Alias name: @alias\/ExampleAlias@
+--
+-- -   Alias ARN: @arn:aws:kms:us-east-1:111122223333:alias\/ExampleAlias@
+newUpdateDatabase ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'kmsKeyId'
+  Prelude.Text ->
+  UpdateDatabase
+newUpdateDatabase pDatabaseName_ pKmsKeyId_ =
+  UpdateDatabase'
+    { databaseName = pDatabaseName_,
+      kmsKeyId = pKmsKeyId_
+    }
+
+-- | The name of the database.
+updateDatabase_databaseName :: Lens.Lens' UpdateDatabase Prelude.Text
+updateDatabase_databaseName = Lens.lens (\UpdateDatabase' {databaseName} -> databaseName) (\s@UpdateDatabase' {} a -> s {databaseName = a} :: UpdateDatabase)
+
+-- | The identifier of the new KMS key (@KmsKeyId@) to be used to encrypt the
+-- data stored in the database. If the @KmsKeyId@ currently registered with
+-- the database is the same as the @KmsKeyId@ in the request, there will
+-- not be any update.
+--
+-- You can specify the @KmsKeyId@ using any of the following:
+--
+-- -   Key ID: @1234abcd-12ab-34cd-56ef-1234567890ab@
+--
+-- -   Key ARN:
+--     @arn:aws:kms:us-east-1:111122223333:key\/1234abcd-12ab-34cd-56ef-1234567890ab@
+--
+-- -   Alias name: @alias\/ExampleAlias@
+--
+-- -   Alias ARN: @arn:aws:kms:us-east-1:111122223333:alias\/ExampleAlias@
+updateDatabase_kmsKeyId :: Lens.Lens' UpdateDatabase Prelude.Text
+updateDatabase_kmsKeyId = Lens.lens (\UpdateDatabase' {kmsKeyId} -> kmsKeyId) (\s@UpdateDatabase' {} a -> s {kmsKeyId = a} :: UpdateDatabase)
+
+instance Core.AWSRequest UpdateDatabase where
+  type
+    AWSResponse UpdateDatabase =
+      UpdateDatabaseResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateDatabaseResponse'
+            Prelude.<$> (x Data..?> "Database")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateDatabase where
+  hashWithSalt _salt UpdateDatabase' {..} =
+    _salt
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` kmsKeyId
+
+instance Prelude.NFData UpdateDatabase where
+  rnf UpdateDatabase' {..} =
+    Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf kmsKeyId
+
+instance Data.ToHeaders UpdateDatabase where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.UpdateDatabase" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateDatabase where
+  toJSON UpdateDatabase' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("KmsKeyId" Data..= kmsKeyId)
+          ]
+      )
+
+instance Data.ToPath UpdateDatabase where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateDatabase where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateDatabaseResponse' smart constructor.
+data UpdateDatabaseResponse = UpdateDatabaseResponse'
+  { database :: Prelude.Maybe Database,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDatabaseResponse' 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:
+--
+-- 'database', 'updateDatabaseResponse_database' - Undocumented member.
+--
+-- 'httpStatus', 'updateDatabaseResponse_httpStatus' - The response's http status code.
+newUpdateDatabaseResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateDatabaseResponse
+newUpdateDatabaseResponse pHttpStatus_ =
+  UpdateDatabaseResponse'
+    { database = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Undocumented member.
+updateDatabaseResponse_database :: Lens.Lens' UpdateDatabaseResponse (Prelude.Maybe Database)
+updateDatabaseResponse_database = Lens.lens (\UpdateDatabaseResponse' {database} -> database) (\s@UpdateDatabaseResponse' {} a -> s {database = a} :: UpdateDatabaseResponse)
+
+-- | The response's http status code.
+updateDatabaseResponse_httpStatus :: Lens.Lens' UpdateDatabaseResponse Prelude.Int
+updateDatabaseResponse_httpStatus = Lens.lens (\UpdateDatabaseResponse' {httpStatus} -> httpStatus) (\s@UpdateDatabaseResponse' {} a -> s {httpStatus = a} :: UpdateDatabaseResponse)
+
+instance Prelude.NFData UpdateDatabaseResponse where
+  rnf UpdateDatabaseResponse' {..} =
+    Prelude.rnf database
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/TimeStreamWrite/UpdateTable.hs b/gen/Amazonka/TimeStreamWrite/UpdateTable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/UpdateTable.hs
@@ -0,0 +1,228 @@
+{-# 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.TimeStreamWrite.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)
+--
+-- Modifies the retention duration of the memory store and magnetic store
+-- for your Timestream table. Note that the change in retention duration
+-- takes effect immediately. For example, if the retention period of the
+-- memory store was initially set to 2 hours and then changed to 24 hours,
+-- the memory store will be capable of holding 24 hours of data, but will
+-- be populated with 24 hours of data 22 hours after this change was made.
+-- Timestream does not retrieve data from the magnetic store to populate
+-- the memory store.
+--
+-- See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.update-table.html code sample>
+-- for details.
+module Amazonka.TimeStreamWrite.UpdateTable
+  ( -- * Creating a Request
+    UpdateTable (..),
+    newUpdateTable,
+
+    -- * Request Lenses
+    updateTable_magneticStoreWriteProperties,
+    updateTable_retentionProperties,
+    updateTable_databaseName,
+    updateTable_tableName,
+
+    -- * Destructuring the Response
+    UpdateTableResponse (..),
+    newUpdateTableResponse,
+
+    -- * Response Lenses
+    updateTableResponse_table,
+    updateTableResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newUpdateTable' smart constructor.
+data UpdateTable = UpdateTable'
+  { -- | Contains properties to set on the table when enabling magnetic store
+    -- writes.
+    magneticStoreWriteProperties :: Prelude.Maybe MagneticStoreWriteProperties,
+    -- | The retention duration of the memory store and the magnetic store.
+    retentionProperties :: Prelude.Maybe RetentionProperties,
+    -- | The name of the Timestream database.
+    databaseName :: Prelude.Text,
+    -- | The name of the Timestream 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:
+--
+-- 'magneticStoreWriteProperties', 'updateTable_magneticStoreWriteProperties' - Contains properties to set on the table when enabling magnetic store
+-- writes.
+--
+-- 'retentionProperties', 'updateTable_retentionProperties' - The retention duration of the memory store and the magnetic store.
+--
+-- 'databaseName', 'updateTable_databaseName' - The name of the Timestream database.
+--
+-- 'tableName', 'updateTable_tableName' - The name of the Timestream table.
+newUpdateTable ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  UpdateTable
+newUpdateTable pDatabaseName_ pTableName_ =
+  UpdateTable'
+    { magneticStoreWriteProperties =
+        Prelude.Nothing,
+      retentionProperties = Prelude.Nothing,
+      databaseName = pDatabaseName_,
+      tableName = pTableName_
+    }
+
+-- | Contains properties to set on the table when enabling magnetic store
+-- writes.
+updateTable_magneticStoreWriteProperties :: Lens.Lens' UpdateTable (Prelude.Maybe MagneticStoreWriteProperties)
+updateTable_magneticStoreWriteProperties = Lens.lens (\UpdateTable' {magneticStoreWriteProperties} -> magneticStoreWriteProperties) (\s@UpdateTable' {} a -> s {magneticStoreWriteProperties = a} :: UpdateTable)
+
+-- | The retention duration of the memory store and the magnetic store.
+updateTable_retentionProperties :: Lens.Lens' UpdateTable (Prelude.Maybe RetentionProperties)
+updateTable_retentionProperties = Lens.lens (\UpdateTable' {retentionProperties} -> retentionProperties) (\s@UpdateTable' {} a -> s {retentionProperties = a} :: UpdateTable)
+
+-- | The name of the Timestream database.
+updateTable_databaseName :: Lens.Lens' UpdateTable Prelude.Text
+updateTable_databaseName = Lens.lens (\UpdateTable' {databaseName} -> databaseName) (\s@UpdateTable' {} a -> s {databaseName = a} :: UpdateTable)
+
+-- | The name of the Timestream 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.<$> (x Data..?> "Table")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateTable where
+  hashWithSalt _salt UpdateTable' {..} =
+    _salt
+      `Prelude.hashWithSalt` magneticStoreWriteProperties
+      `Prelude.hashWithSalt` retentionProperties
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData UpdateTable where
+  rnf UpdateTable' {..} =
+    Prelude.rnf magneticStoreWriteProperties
+      `Prelude.seq` Prelude.rnf retentionProperties
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders UpdateTable where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.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
+          [ ("MagneticStoreWriteProperties" Data..=)
+              Prelude.<$> magneticStoreWriteProperties,
+            ("RetentionProperties" Data..=)
+              Prelude.<$> retentionProperties,
+            Prelude.Just ("DatabaseName" Data..= databaseName),
+            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 updated Timestream table.
+    table :: Prelude.Maybe Table,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  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:
+--
+-- 'table', 'updateTableResponse_table' - The updated Timestream table.
+--
+-- 'httpStatus', 'updateTableResponse_httpStatus' - The response's http status code.
+newUpdateTableResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateTableResponse
+newUpdateTableResponse pHttpStatus_ =
+  UpdateTableResponse'
+    { table = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The updated Timestream table.
+updateTableResponse_table :: Lens.Lens' UpdateTableResponse (Prelude.Maybe Table)
+updateTableResponse_table = Lens.lens (\UpdateTableResponse' {table} -> table) (\s@UpdateTableResponse' {} a -> s {table = a} :: UpdateTableResponse)
+
+-- | 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)
+
+instance Prelude.NFData UpdateTableResponse where
+  rnf UpdateTableResponse' {..} =
+    Prelude.rnf table
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/TimeStreamWrite/Waiters.hs b/gen/Amazonka/TimeStreamWrite/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/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.TimeStreamWrite.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.TimeStreamWrite.Waiters 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
+import Amazonka.TimeStreamWrite.Lens
+import Amazonka.TimeStreamWrite.Types
diff --git a/gen/Amazonka/TimeStreamWrite/WriteRecords.hs b/gen/Amazonka/TimeStreamWrite/WriteRecords.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/TimeStreamWrite/WriteRecords.hs
@@ -0,0 +1,281 @@
+{-# 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.TimeStreamWrite.WriteRecords
+-- 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 WriteRecords operation enables you to write your time series data
+-- into Timestream. You can specify a single data point or a batch of data
+-- points to be inserted into the system. Timestream offers you with a
+-- flexible schema that auto detects the column names and data types for
+-- your Timestream tables based on the dimension names and data types of
+-- the data points you specify when invoking writes into the database.
+-- Timestream support eventual consistency read semantics. This means that
+-- when you query data immediately after writing a batch of data into
+-- Timestream, the query results might not reflect the results of a
+-- recently completed write operation. The results may also include some
+-- stale data. If you repeat the query request after a short time, the
+-- results should return the latest data.
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html Service quotas apply>.
+--
+-- See
+-- <https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.write.html code sample>
+-- for details.
+--
+-- __Upserts__
+--
+-- You can use the @Version@ parameter in a @WriteRecords@ request to
+-- update data points. Timestream tracks a version number with each record.
+-- @Version@ defaults to @1@ when not specified for the record in the
+-- request. Timestream will update an existing record’s measure value along
+-- with its @Version@ upon receiving a write request with a higher
+-- @Version@ number for that record. Upon receiving an update request where
+-- the measure value is the same as that of the existing record, Timestream
+-- still updates @Version@, if it is greater than the existing value of
+-- @Version@. You can update a data point as many times as desired, as long
+-- as the value of @Version@ continuously increases.
+--
+-- For example, suppose you write a new record without indicating @Version@
+-- in the request. Timestream will store this record, and set @Version@ to
+-- @1@. Now, suppose you try to update this record with a @WriteRecords@
+-- request of the same record with a different measure value but, like
+-- before, do not provide @Version@. In this case, Timestream will reject
+-- this update with a @RejectedRecordsException@ since the updated record’s
+-- version is not greater than the existing value of Version. However, if
+-- you were to resend the update request with @Version@ set to @2@,
+-- Timestream would then succeed in updating the record’s value, and the
+-- @Version@ would be set to @2@. Next, suppose you sent a @WriteRecords@
+-- request with this same record and an identical measure value, but with
+-- @Version@ set to @3@. In this case, Timestream would only update
+-- @Version@ to @3@. Any further updates would need to send a version
+-- number greater than @3@, or the update requests would receive a
+-- @RejectedRecordsException@.
+module Amazonka.TimeStreamWrite.WriteRecords
+  ( -- * Creating a Request
+    WriteRecords (..),
+    newWriteRecords,
+
+    -- * Request Lenses
+    writeRecords_commonAttributes,
+    writeRecords_databaseName,
+    writeRecords_tableName,
+    writeRecords_records,
+
+    -- * Destructuring the Response
+    WriteRecordsResponse (..),
+    newWriteRecordsResponse,
+
+    -- * Response Lenses
+    writeRecordsResponse_recordsIngested,
+    writeRecordsResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.TimeStreamWrite.Types
+
+-- | /See:/ 'newWriteRecords' smart constructor.
+data WriteRecords = WriteRecords'
+  { -- | A record containing the common measure, dimension, time, and version
+    -- attributes shared across all the records in the request. The measure and
+    -- dimension attributes specified will be merged with the measure and
+    -- dimension attributes in the records object when the data is written into
+    -- Timestream. Dimensions may not overlap, or a @ValidationException@ will
+    -- be thrown. In other words, a record must contain dimensions with unique
+    -- names.
+    commonAttributes :: Prelude.Maybe Record,
+    -- | The name of the Timestream database.
+    databaseName :: Prelude.Text,
+    -- | The name of the Timestream table.
+    tableName :: Prelude.Text,
+    -- | An array of records containing the unique measure, dimension, time, and
+    -- version attributes for each time series data point.
+    records :: Prelude.NonEmpty Record
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'WriteRecords' 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:
+--
+-- 'commonAttributes', 'writeRecords_commonAttributes' - A record containing the common measure, dimension, time, and version
+-- attributes shared across all the records in the request. The measure and
+-- dimension attributes specified will be merged with the measure and
+-- dimension attributes in the records object when the data is written into
+-- Timestream. Dimensions may not overlap, or a @ValidationException@ will
+-- be thrown. In other words, a record must contain dimensions with unique
+-- names.
+--
+-- 'databaseName', 'writeRecords_databaseName' - The name of the Timestream database.
+--
+-- 'tableName', 'writeRecords_tableName' - The name of the Timestream table.
+--
+-- 'records', 'writeRecords_records' - An array of records containing the unique measure, dimension, time, and
+-- version attributes for each time series data point.
+newWriteRecords ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  -- | 'records'
+  Prelude.NonEmpty Record ->
+  WriteRecords
+newWriteRecords pDatabaseName_ pTableName_ pRecords_ =
+  WriteRecords'
+    { commonAttributes = Prelude.Nothing,
+      databaseName = pDatabaseName_,
+      tableName = pTableName_,
+      records = Lens.coerced Lens.# pRecords_
+    }
+
+-- | A record containing the common measure, dimension, time, and version
+-- attributes shared across all the records in the request. The measure and
+-- dimension attributes specified will be merged with the measure and
+-- dimension attributes in the records object when the data is written into
+-- Timestream. Dimensions may not overlap, or a @ValidationException@ will
+-- be thrown. In other words, a record must contain dimensions with unique
+-- names.
+writeRecords_commonAttributes :: Lens.Lens' WriteRecords (Prelude.Maybe Record)
+writeRecords_commonAttributes = Lens.lens (\WriteRecords' {commonAttributes} -> commonAttributes) (\s@WriteRecords' {} a -> s {commonAttributes = a} :: WriteRecords)
+
+-- | The name of the Timestream database.
+writeRecords_databaseName :: Lens.Lens' WriteRecords Prelude.Text
+writeRecords_databaseName = Lens.lens (\WriteRecords' {databaseName} -> databaseName) (\s@WriteRecords' {} a -> s {databaseName = a} :: WriteRecords)
+
+-- | The name of the Timestream table.
+writeRecords_tableName :: Lens.Lens' WriteRecords Prelude.Text
+writeRecords_tableName = Lens.lens (\WriteRecords' {tableName} -> tableName) (\s@WriteRecords' {} a -> s {tableName = a} :: WriteRecords)
+
+-- | An array of records containing the unique measure, dimension, time, and
+-- version attributes for each time series data point.
+writeRecords_records :: Lens.Lens' WriteRecords (Prelude.NonEmpty Record)
+writeRecords_records = Lens.lens (\WriteRecords' {records} -> records) (\s@WriteRecords' {} a -> s {records = a} :: WriteRecords) Prelude.. Lens.coerced
+
+instance Core.AWSRequest WriteRecords where
+  type AWSResponse WriteRecords = WriteRecordsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          WriteRecordsResponse'
+            Prelude.<$> (x Data..?> "RecordsIngested")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable WriteRecords where
+  hashWithSalt _salt WriteRecords' {..} =
+    _salt
+      `Prelude.hashWithSalt` commonAttributes
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+      `Prelude.hashWithSalt` records
+
+instance Prelude.NFData WriteRecords where
+  rnf WriteRecords' {..} =
+    Prelude.rnf commonAttributes
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+      `Prelude.seq` Prelude.rnf records
+
+instance Data.ToHeaders WriteRecords where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Timestream_20181101.WriteRecords" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON WriteRecords where
+  toJSON WriteRecords' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CommonAttributes" Data..=)
+              Prelude.<$> commonAttributes,
+            Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("TableName" Data..= tableName),
+            Prelude.Just ("Records" Data..= records)
+          ]
+      )
+
+instance Data.ToPath WriteRecords where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery WriteRecords where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newWriteRecordsResponse' smart constructor.
+data WriteRecordsResponse = WriteRecordsResponse'
+  { -- | Information on the records ingested by this request.
+    recordsIngested :: Prelude.Maybe RecordsIngested,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'WriteRecordsResponse' 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:
+--
+-- 'recordsIngested', 'writeRecordsResponse_recordsIngested' - Information on the records ingested by this request.
+--
+-- 'httpStatus', 'writeRecordsResponse_httpStatus' - The response's http status code.
+newWriteRecordsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  WriteRecordsResponse
+newWriteRecordsResponse pHttpStatus_ =
+  WriteRecordsResponse'
+    { recordsIngested =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information on the records ingested by this request.
+writeRecordsResponse_recordsIngested :: Lens.Lens' WriteRecordsResponse (Prelude.Maybe RecordsIngested)
+writeRecordsResponse_recordsIngested = Lens.lens (\WriteRecordsResponse' {recordsIngested} -> recordsIngested) (\s@WriteRecordsResponse' {} a -> s {recordsIngested = a} :: WriteRecordsResponse)
+
+-- | The response's http status code.
+writeRecordsResponse_httpStatus :: Lens.Lens' WriteRecordsResponse Prelude.Int
+writeRecordsResponse_httpStatus = Lens.lens (\WriteRecordsResponse' {httpStatus} -> httpStatus) (\s@WriteRecordsResponse' {} a -> s {httpStatus = a} :: WriteRecordsResponse)
+
+instance Prelude.NFData WriteRecordsResponse where
+  rnf WriteRecordsResponse' {..} =
+    Prelude.rnf recordsIngested
+      `Prelude.seq` Prelude.rnf httpStatus
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.TimeStreamWrite
+import Test.Amazonka.TimeStreamWrite.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "TimeStreamWrite"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/TimeStreamWrite.hs b/test/Test/Amazonka/Gen/TimeStreamWrite.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/TimeStreamWrite.hs
@@ -0,0 +1,338 @@
+{-# 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.TimeStreamWrite
+-- 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.TimeStreamWrite where
+
+import Amazonka.TimeStreamWrite
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Prelude
+import Test.Amazonka.TimeStreamWrite.Internal
+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"
+--         [ requestCreateDatabase $
+--             newCreateDatabase
+--
+--         , requestCreateTable $
+--             newCreateTable
+--
+--         , requestDeleteDatabase $
+--             newDeleteDatabase
+--
+--         , requestDeleteTable $
+--             newDeleteTable
+--
+--         , requestDescribeDatabase $
+--             newDescribeDatabase
+--
+--         , requestDescribeEndpoints $
+--             newDescribeEndpoints
+--
+--         , requestDescribeTable $
+--             newDescribeTable
+--
+--         , requestListDatabases $
+--             newListDatabases
+--
+--         , requestListTables $
+--             newListTables
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateDatabase $
+--             newUpdateDatabase
+--
+--         , requestUpdateTable $
+--             newUpdateTable
+--
+--         , requestWriteRecords $
+--             newWriteRecords
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateDatabase $
+--             newCreateDatabaseResponse
+--
+--         , responseCreateTable $
+--             newCreateTableResponse
+--
+--         , responseDeleteDatabase $
+--             newDeleteDatabaseResponse
+--
+--         , responseDeleteTable $
+--             newDeleteTableResponse
+--
+--         , responseDescribeDatabase $
+--             newDescribeDatabaseResponse
+--
+--         , responseDescribeEndpoints $
+--             newDescribeEndpointsResponse
+--
+--         , responseDescribeTable $
+--             newDescribeTableResponse
+--
+--         , responseListDatabases $
+--             newListDatabasesResponse
+--
+--         , responseListTables $
+--             newListTablesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateDatabase $
+--             newUpdateDatabaseResponse
+--
+--         , responseUpdateTable $
+--             newUpdateTableResponse
+--
+--         , responseWriteRecords $
+--             newWriteRecordsResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateDatabase :: CreateDatabase -> TestTree
+requestCreateDatabase =
+  req
+    "CreateDatabase"
+    "fixture/CreateDatabase.yaml"
+
+requestCreateTable :: CreateTable -> TestTree
+requestCreateTable =
+  req
+    "CreateTable"
+    "fixture/CreateTable.yaml"
+
+requestDeleteDatabase :: DeleteDatabase -> TestTree
+requestDeleteDatabase =
+  req
+    "DeleteDatabase"
+    "fixture/DeleteDatabase.yaml"
+
+requestDeleteTable :: DeleteTable -> TestTree
+requestDeleteTable =
+  req
+    "DeleteTable"
+    "fixture/DeleteTable.yaml"
+
+requestDescribeDatabase :: DescribeDatabase -> TestTree
+requestDescribeDatabase =
+  req
+    "DescribeDatabase"
+    "fixture/DescribeDatabase.yaml"
+
+requestDescribeEndpoints :: DescribeEndpoints -> TestTree
+requestDescribeEndpoints =
+  req
+    "DescribeEndpoints"
+    "fixture/DescribeEndpoints.yaml"
+
+requestDescribeTable :: DescribeTable -> TestTree
+requestDescribeTable =
+  req
+    "DescribeTable"
+    "fixture/DescribeTable.yaml"
+
+requestListDatabases :: ListDatabases -> TestTree
+requestListDatabases =
+  req
+    "ListDatabases"
+    "fixture/ListDatabases.yaml"
+
+requestListTables :: ListTables -> TestTree
+requestListTables =
+  req
+    "ListTables"
+    "fixture/ListTables.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateDatabase :: UpdateDatabase -> TestTree
+requestUpdateDatabase =
+  req
+    "UpdateDatabase"
+    "fixture/UpdateDatabase.yaml"
+
+requestUpdateTable :: UpdateTable -> TestTree
+requestUpdateTable =
+  req
+    "UpdateTable"
+    "fixture/UpdateTable.yaml"
+
+requestWriteRecords :: WriteRecords -> TestTree
+requestWriteRecords =
+  req
+    "WriteRecords"
+    "fixture/WriteRecords.yaml"
+
+-- Responses
+
+responseCreateDatabase :: CreateDatabaseResponse -> TestTree
+responseCreateDatabase =
+  res
+    "CreateDatabaseResponse"
+    "fixture/CreateDatabaseResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDatabase)
+
+responseCreateTable :: CreateTableResponse -> TestTree
+responseCreateTable =
+  res
+    "CreateTableResponse"
+    "fixture/CreateTableResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateTable)
+
+responseDeleteDatabase :: DeleteDatabaseResponse -> TestTree
+responseDeleteDatabase =
+  res
+    "DeleteDatabaseResponse"
+    "fixture/DeleteDatabaseResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDatabase)
+
+responseDeleteTable :: DeleteTableResponse -> TestTree
+responseDeleteTable =
+  res
+    "DeleteTableResponse"
+    "fixture/DeleteTableResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteTable)
+
+responseDescribeDatabase :: DescribeDatabaseResponse -> TestTree
+responseDescribeDatabase =
+  res
+    "DescribeDatabaseResponse"
+    "fixture/DescribeDatabaseResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDatabase)
+
+responseDescribeEndpoints :: DescribeEndpointsResponse -> TestTree
+responseDescribeEndpoints =
+  res
+    "DescribeEndpointsResponse"
+    "fixture/DescribeEndpointsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeEndpoints)
+
+responseDescribeTable :: DescribeTableResponse -> TestTree
+responseDescribeTable =
+  res
+    "DescribeTableResponse"
+    "fixture/DescribeTableResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeTable)
+
+responseListDatabases :: ListDatabasesResponse -> TestTree
+responseListDatabases =
+  res
+    "ListDatabasesResponse"
+    "fixture/ListDatabasesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDatabases)
+
+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)
+
+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)
+
+responseUpdateDatabase :: UpdateDatabaseResponse -> TestTree
+responseUpdateDatabase =
+  res
+    "UpdateDatabaseResponse"
+    "fixture/UpdateDatabaseResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateDatabase)
+
+responseUpdateTable :: UpdateTableResponse -> TestTree
+responseUpdateTable =
+  res
+    "UpdateTableResponse"
+    "fixture/UpdateTableResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateTable)
+
+responseWriteRecords :: WriteRecordsResponse -> TestTree
+responseWriteRecords =
+  res
+    "WriteRecordsResponse"
+    "fixture/WriteRecordsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy WriteRecords)
diff --git a/test/Test/Amazonka/TimeStreamWrite.hs b/test/Test/Amazonka/TimeStreamWrite.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/TimeStreamWrite.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.TimeStreamWrite
+-- 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.TimeStreamWrite
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/TimeStreamWrite/Internal.hs b/test/Test/Amazonka/TimeStreamWrite/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/TimeStreamWrite/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.TimeStreamWrite.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.TimeStreamWrite.Internal where
