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 Lake Formation SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2017-03-31@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-lakeformation)
+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.LakeFormation](http://hackage.haskell.org/package/amazonka-lakeformation/docs/Amazonka-LakeFormation.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-lakeformation` 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-lakeformation.cabal b/amazonka-lakeformation.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-lakeformation.cabal
@@ -0,0 +1,184 @@
+cabal-version:      2.2
+name:               amazonka-lakeformation
+version:            2.0
+synopsis:           Amazon Lake Formation 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 @2017-03-31@ 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.LakeFormation.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.LakeFormation" 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-lakeformation
+
+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.LakeFormation
+    Amazonka.LakeFormation.AddLFTagsToResource
+    Amazonka.LakeFormation.AssumeDecoratedRoleWithSAML
+    Amazonka.LakeFormation.BatchGrantPermissions
+    Amazonka.LakeFormation.BatchRevokePermissions
+    Amazonka.LakeFormation.CancelTransaction
+    Amazonka.LakeFormation.CommitTransaction
+    Amazonka.LakeFormation.CreateDataCellsFilter
+    Amazonka.LakeFormation.CreateLFTag
+    Amazonka.LakeFormation.DeleteDataCellsFilter
+    Amazonka.LakeFormation.DeleteLFTag
+    Amazonka.LakeFormation.DeleteObjectsOnCancel
+    Amazonka.LakeFormation.DeregisterResource
+    Amazonka.LakeFormation.DescribeResource
+    Amazonka.LakeFormation.DescribeTransaction
+    Amazonka.LakeFormation.ExtendTransaction
+    Amazonka.LakeFormation.GetDataLakeSettings
+    Amazonka.LakeFormation.GetEffectivePermissionsForPath
+    Amazonka.LakeFormation.GetLFTag
+    Amazonka.LakeFormation.GetQueryState
+    Amazonka.LakeFormation.GetQueryStatistics
+    Amazonka.LakeFormation.GetResourceLFTags
+    Amazonka.LakeFormation.GetTableObjects
+    Amazonka.LakeFormation.GetTemporaryGluePartitionCredentials
+    Amazonka.LakeFormation.GetTemporaryGlueTableCredentials
+    Amazonka.LakeFormation.GetWorkUnitResults
+    Amazonka.LakeFormation.GetWorkUnits
+    Amazonka.LakeFormation.GrantPermissions
+    Amazonka.LakeFormation.Lens
+    Amazonka.LakeFormation.ListDataCellsFilter
+    Amazonka.LakeFormation.ListLFTags
+    Amazonka.LakeFormation.ListPermissions
+    Amazonka.LakeFormation.ListResources
+    Amazonka.LakeFormation.ListTableStorageOptimizers
+    Amazonka.LakeFormation.ListTransactions
+    Amazonka.LakeFormation.PutDataLakeSettings
+    Amazonka.LakeFormation.RegisterResource
+    Amazonka.LakeFormation.RemoveLFTagsFromResource
+    Amazonka.LakeFormation.RevokePermissions
+    Amazonka.LakeFormation.SearchDatabasesByLFTags
+    Amazonka.LakeFormation.SearchTablesByLFTags
+    Amazonka.LakeFormation.StartQueryPlanning
+    Amazonka.LakeFormation.StartTransaction
+    Amazonka.LakeFormation.Types
+    Amazonka.LakeFormation.Types.AddObjectInput
+    Amazonka.LakeFormation.Types.AllRowsWildcard
+    Amazonka.LakeFormation.Types.AuditContext
+    Amazonka.LakeFormation.Types.BatchPermissionsFailureEntry
+    Amazonka.LakeFormation.Types.BatchPermissionsRequestEntry
+    Amazonka.LakeFormation.Types.CatalogResource
+    Amazonka.LakeFormation.Types.ColumnLFTag
+    Amazonka.LakeFormation.Types.ColumnWildcard
+    Amazonka.LakeFormation.Types.ComparisonOperator
+    Amazonka.LakeFormation.Types.DatabaseResource
+    Amazonka.LakeFormation.Types.DataCellsFilter
+    Amazonka.LakeFormation.Types.DataCellsFilterResource
+    Amazonka.LakeFormation.Types.DataLakePrincipal
+    Amazonka.LakeFormation.Types.DataLakeResourceType
+    Amazonka.LakeFormation.Types.DataLakeSettings
+    Amazonka.LakeFormation.Types.DataLocationResource
+    Amazonka.LakeFormation.Types.DeleteObjectInput
+    Amazonka.LakeFormation.Types.DetailsMap
+    Amazonka.LakeFormation.Types.ErrorDetail
+    Amazonka.LakeFormation.Types.ExecutionStatistics
+    Amazonka.LakeFormation.Types.FieldNameString
+    Amazonka.LakeFormation.Types.FilterCondition
+    Amazonka.LakeFormation.Types.LFTag
+    Amazonka.LakeFormation.Types.LFTagError
+    Amazonka.LakeFormation.Types.LFTagKeyResource
+    Amazonka.LakeFormation.Types.LFTagPair
+    Amazonka.LakeFormation.Types.LFTagPolicyResource
+    Amazonka.LakeFormation.Types.OptimizerType
+    Amazonka.LakeFormation.Types.PartitionObjects
+    Amazonka.LakeFormation.Types.PartitionValueList
+    Amazonka.LakeFormation.Types.Permission
+    Amazonka.LakeFormation.Types.PermissionType
+    Amazonka.LakeFormation.Types.PlanningStatistics
+    Amazonka.LakeFormation.Types.PrincipalPermissions
+    Amazonka.LakeFormation.Types.PrincipalResourcePermissions
+    Amazonka.LakeFormation.Types.QueryPlanningContext
+    Amazonka.LakeFormation.Types.QueryStateString
+    Amazonka.LakeFormation.Types.Resource
+    Amazonka.LakeFormation.Types.ResourceInfo
+    Amazonka.LakeFormation.Types.ResourceShareType
+    Amazonka.LakeFormation.Types.ResourceType
+    Amazonka.LakeFormation.Types.RowFilter
+    Amazonka.LakeFormation.Types.StorageOptimizer
+    Amazonka.LakeFormation.Types.TableObject
+    Amazonka.LakeFormation.Types.TableResource
+    Amazonka.LakeFormation.Types.TableWildcard
+    Amazonka.LakeFormation.Types.TableWithColumnsResource
+    Amazonka.LakeFormation.Types.TaggedDatabase
+    Amazonka.LakeFormation.Types.TaggedTable
+    Amazonka.LakeFormation.Types.TransactionDescription
+    Amazonka.LakeFormation.Types.TransactionStatus
+    Amazonka.LakeFormation.Types.TransactionStatusFilter
+    Amazonka.LakeFormation.Types.TransactionType
+    Amazonka.LakeFormation.Types.VirtualObject
+    Amazonka.LakeFormation.Types.WorkUnitRange
+    Amazonka.LakeFormation.Types.WriteOperation
+    Amazonka.LakeFormation.UpdateLFTag
+    Amazonka.LakeFormation.UpdateResource
+    Amazonka.LakeFormation.UpdateTableObjects
+    Amazonka.LakeFormation.UpdateTableStorageOptimizer
+    Amazonka.LakeFormation.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-lakeformation-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.LakeFormation
+    Test.Amazonka.LakeFormation
+    Test.Amazonka.LakeFormation.Internal
+
+  build-depends:
+    , amazonka-core           >=2.0 && <2.1
+    , amazonka-lakeformation
+    , amazonka-test           >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/AddLFTagsToResource.yaml b/fixture/AddLFTagsToResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AddLFTagsToResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/AddLFTagsToResourceResponse.proto b/fixture/AddLFTagsToResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AddLFTagsToResourceResponse.proto
diff --git a/fixture/AssumeDecoratedRoleWithSAML.yaml b/fixture/AssumeDecoratedRoleWithSAML.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssumeDecoratedRoleWithSAML.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/AssumeDecoratedRoleWithSAMLResponse.proto b/fixture/AssumeDecoratedRoleWithSAMLResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssumeDecoratedRoleWithSAMLResponse.proto
diff --git a/fixture/BatchGrantPermissions.yaml b/fixture/BatchGrantPermissions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGrantPermissions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/BatchGrantPermissionsResponse.proto b/fixture/BatchGrantPermissionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGrantPermissionsResponse.proto
diff --git a/fixture/BatchRevokePermissions.yaml b/fixture/BatchRevokePermissions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchRevokePermissions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/BatchRevokePermissionsResponse.proto b/fixture/BatchRevokePermissionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchRevokePermissionsResponse.proto
diff --git a/fixture/CancelTransaction.yaml b/fixture/CancelTransaction.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CancelTransaction.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/CancelTransactionResponse.proto b/fixture/CancelTransactionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CancelTransactionResponse.proto
diff --git a/fixture/CommitTransaction.yaml b/fixture/CommitTransaction.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CommitTransaction.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/CommitTransactionResponse.proto b/fixture/CommitTransactionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CommitTransactionResponse.proto
diff --git a/fixture/CreateDataCellsFilter.yaml b/fixture/CreateDataCellsFilter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDataCellsFilter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/CreateDataCellsFilterResponse.proto b/fixture/CreateDataCellsFilterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDataCellsFilterResponse.proto
diff --git a/fixture/CreateLFTag.yaml b/fixture/CreateLFTag.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateLFTag.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/CreateLFTagResponse.proto b/fixture/CreateLFTagResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateLFTagResponse.proto
diff --git a/fixture/DeleteDataCellsFilter.yaml b/fixture/DeleteDataCellsFilter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDataCellsFilter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/DeleteDataCellsFilterResponse.proto b/fixture/DeleteDataCellsFilterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDataCellsFilterResponse.proto
diff --git a/fixture/DeleteLFTag.yaml b/fixture/DeleteLFTag.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteLFTag.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/DeleteLFTagResponse.proto b/fixture/DeleteLFTagResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteLFTagResponse.proto
diff --git a/fixture/DeleteObjectsOnCancel.yaml b/fixture/DeleteObjectsOnCancel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteObjectsOnCancel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/DeleteObjectsOnCancelResponse.proto b/fixture/DeleteObjectsOnCancelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteObjectsOnCancelResponse.proto
diff --git a/fixture/DeregisterResource.yaml b/fixture/DeregisterResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeregisterResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/DeregisterResourceResponse.proto b/fixture/DeregisterResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeregisterResourceResponse.proto
diff --git a/fixture/DescribeResource.yaml b/fixture/DescribeResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/DescribeResourceResponse.proto b/fixture/DescribeResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeResourceResponse.proto
diff --git a/fixture/DescribeTransaction.yaml b/fixture/DescribeTransaction.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeTransaction.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/DescribeTransactionResponse.proto b/fixture/DescribeTransactionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeTransactionResponse.proto
diff --git a/fixture/ExtendTransaction.yaml b/fixture/ExtendTransaction.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ExtendTransaction.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/ExtendTransactionResponse.proto b/fixture/ExtendTransactionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ExtendTransactionResponse.proto
diff --git a/fixture/GetDataLakeSettings.yaml b/fixture/GetDataLakeSettings.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetDataLakeSettings.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetDataLakeSettingsResponse.proto b/fixture/GetDataLakeSettingsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetDataLakeSettingsResponse.proto
diff --git a/fixture/GetEffectivePermissionsForPath.yaml b/fixture/GetEffectivePermissionsForPath.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetEffectivePermissionsForPath.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetEffectivePermissionsForPathResponse.proto b/fixture/GetEffectivePermissionsForPathResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetEffectivePermissionsForPathResponse.proto
diff --git a/fixture/GetLFTag.yaml b/fixture/GetLFTag.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetLFTag.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetLFTagResponse.proto b/fixture/GetLFTagResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetLFTagResponse.proto
diff --git a/fixture/GetQueryState.yaml b/fixture/GetQueryState.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetQueryState.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetQueryStateResponse.proto b/fixture/GetQueryStateResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetQueryStateResponse.proto
diff --git a/fixture/GetQueryStatistics.yaml b/fixture/GetQueryStatistics.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetQueryStatistics.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetQueryStatisticsResponse.proto b/fixture/GetQueryStatisticsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetQueryStatisticsResponse.proto
diff --git a/fixture/GetResourceLFTags.yaml b/fixture/GetResourceLFTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetResourceLFTags.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetResourceLFTagsResponse.proto b/fixture/GetResourceLFTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetResourceLFTagsResponse.proto
diff --git a/fixture/GetTableObjects.yaml b/fixture/GetTableObjects.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetTableObjects.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetTableObjectsResponse.proto b/fixture/GetTableObjectsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetTableObjectsResponse.proto
diff --git a/fixture/GetTemporaryGluePartitionCredentials.yaml b/fixture/GetTemporaryGluePartitionCredentials.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetTemporaryGluePartitionCredentials.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetTemporaryGluePartitionCredentialsResponse.proto b/fixture/GetTemporaryGluePartitionCredentialsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetTemporaryGluePartitionCredentialsResponse.proto
diff --git a/fixture/GetTemporaryGlueTableCredentials.yaml b/fixture/GetTemporaryGlueTableCredentials.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetTemporaryGlueTableCredentials.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetTemporaryGlueTableCredentialsResponse.proto b/fixture/GetTemporaryGlueTableCredentialsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetTemporaryGlueTableCredentialsResponse.proto
diff --git a/fixture/GetWorkUnitResults.yaml b/fixture/GetWorkUnitResults.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetWorkUnitResults.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetWorkUnitResultsResponse.proto b/fixture/GetWorkUnitResultsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetWorkUnitResultsResponse.proto
diff --git a/fixture/GetWorkUnits.yaml b/fixture/GetWorkUnits.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetWorkUnits.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GetWorkUnitsResponse.proto b/fixture/GetWorkUnitsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetWorkUnitsResponse.proto
diff --git a/fixture/GrantPermissions.yaml b/fixture/GrantPermissions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GrantPermissions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/GrantPermissionsResponse.proto b/fixture/GrantPermissionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GrantPermissionsResponse.proto
diff --git a/fixture/ListDataCellsFilter.yaml b/fixture/ListDataCellsFilter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDataCellsFilter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/ListDataCellsFilterResponse.proto b/fixture/ListDataCellsFilterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDataCellsFilterResponse.proto
diff --git a/fixture/ListLFTags.yaml b/fixture/ListLFTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListLFTags.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/ListLFTagsResponse.proto b/fixture/ListLFTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListLFTagsResponse.proto
diff --git a/fixture/ListPermissions.yaml b/fixture/ListPermissions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPermissions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/ListPermissionsResponse.proto b/fixture/ListPermissionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPermissionsResponse.proto
diff --git a/fixture/ListResources.yaml b/fixture/ListResources.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListResources.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/ListResourcesResponse.proto b/fixture/ListResourcesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListResourcesResponse.proto
diff --git a/fixture/ListTableStorageOptimizers.yaml b/fixture/ListTableStorageOptimizers.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTableStorageOptimizers.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/ListTableStorageOptimizersResponse.proto b/fixture/ListTableStorageOptimizersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTableStorageOptimizersResponse.proto
diff --git a/fixture/ListTransactions.yaml b/fixture/ListTransactions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTransactions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/ListTransactionsResponse.proto b/fixture/ListTransactionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTransactionsResponse.proto
diff --git a/fixture/PutDataLakeSettings.yaml b/fixture/PutDataLakeSettings.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutDataLakeSettings.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/PutDataLakeSettingsResponse.proto b/fixture/PutDataLakeSettingsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutDataLakeSettingsResponse.proto
diff --git a/fixture/RegisterResource.yaml b/fixture/RegisterResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RegisterResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/RegisterResourceResponse.proto b/fixture/RegisterResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RegisterResourceResponse.proto
diff --git a/fixture/RemoveLFTagsFromResource.yaml b/fixture/RemoveLFTagsFromResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveLFTagsFromResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/RemoveLFTagsFromResourceResponse.proto b/fixture/RemoveLFTagsFromResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveLFTagsFromResourceResponse.proto
diff --git a/fixture/RevokePermissions.yaml b/fixture/RevokePermissions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RevokePermissions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/RevokePermissionsResponse.proto b/fixture/RevokePermissionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RevokePermissionsResponse.proto
diff --git a/fixture/SearchDatabasesByLFTags.yaml b/fixture/SearchDatabasesByLFTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SearchDatabasesByLFTags.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/SearchDatabasesByLFTagsResponse.proto b/fixture/SearchDatabasesByLFTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SearchDatabasesByLFTagsResponse.proto
diff --git a/fixture/SearchTablesByLFTags.yaml b/fixture/SearchTablesByLFTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SearchTablesByLFTags.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/SearchTablesByLFTagsResponse.proto b/fixture/SearchTablesByLFTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SearchTablesByLFTagsResponse.proto
diff --git a/fixture/StartQueryPlanning.yaml b/fixture/StartQueryPlanning.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartQueryPlanning.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/StartQueryPlanningResponse.proto b/fixture/StartQueryPlanningResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartQueryPlanningResponse.proto
diff --git a/fixture/StartTransaction.yaml b/fixture/StartTransaction.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartTransaction.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/StartTransactionResponse.proto b/fixture/StartTransactionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartTransactionResponse.proto
diff --git a/fixture/UpdateLFTag.yaml b/fixture/UpdateLFTag.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateLFTag.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/UpdateLFTagResponse.proto b/fixture/UpdateLFTagResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateLFTagResponse.proto
diff --git a/fixture/UpdateResource.yaml b/fixture/UpdateResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/UpdateResourceResponse.proto b/fixture/UpdateResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateResourceResponse.proto
diff --git a/fixture/UpdateTableObjects.yaml b/fixture/UpdateTableObjects.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateTableObjects.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/UpdateTableObjectsResponse.proto b/fixture/UpdateTableObjectsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateTableObjectsResponse.proto
diff --git a/fixture/UpdateTableStorageOptimizer.yaml b/fixture/UpdateTableStorageOptimizer.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateTableStorageOptimizer.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lakeformation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lakeformation.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/UpdateTableStorageOptimizerResponse.proto b/fixture/UpdateTableStorageOptimizerResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateTableStorageOptimizerResponse.proto
diff --git a/gen/Amazonka/LakeFormation.hs b/gen/Amazonka/LakeFormation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation.hs
@@ -0,0 +1,644 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.LakeFormation
+-- 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 @2017-03-31@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Lake Formation
+--
+-- Defines the public endpoint for the Lake Formation service.
+module Amazonka.LakeFormation
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** AlreadyExistsException
+    _AlreadyExistsException,
+
+    -- ** ConcurrentModificationException
+    _ConcurrentModificationException,
+
+    -- ** EntityNotFoundException
+    _EntityNotFoundException,
+
+    -- ** ExpiredException
+    _ExpiredException,
+
+    -- ** GlueEncryptionException
+    _GlueEncryptionException,
+
+    -- ** InternalServiceException
+    _InternalServiceException,
+
+    -- ** InvalidInputException
+    _InvalidInputException,
+
+    -- ** OperationTimeoutException
+    _OperationTimeoutException,
+
+    -- ** PermissionTypeMismatchException
+    _PermissionTypeMismatchException,
+
+    -- ** ResourceNotReadyException
+    _ResourceNotReadyException,
+
+    -- ** ResourceNumberLimitExceededException
+    _ResourceNumberLimitExceededException,
+
+    -- ** StatisticsNotReadyYetException
+    _StatisticsNotReadyYetException,
+
+    -- ** ThrottledException
+    _ThrottledException,
+
+    -- ** TransactionCanceledException
+    _TransactionCanceledException,
+
+    -- ** TransactionCommitInProgressException
+    _TransactionCommitInProgressException,
+
+    -- ** TransactionCommittedException
+    _TransactionCommittedException,
+
+    -- ** WorkUnitsNotReadyYetException
+    _WorkUnitsNotReadyYetException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** AddLFTagsToResource
+    AddLFTagsToResource (AddLFTagsToResource'),
+    newAddLFTagsToResource,
+    AddLFTagsToResourceResponse (AddLFTagsToResourceResponse'),
+    newAddLFTagsToResourceResponse,
+
+    -- ** AssumeDecoratedRoleWithSAML
+    AssumeDecoratedRoleWithSAML (AssumeDecoratedRoleWithSAML'),
+    newAssumeDecoratedRoleWithSAML,
+    AssumeDecoratedRoleWithSAMLResponse (AssumeDecoratedRoleWithSAMLResponse'),
+    newAssumeDecoratedRoleWithSAMLResponse,
+
+    -- ** BatchGrantPermissions
+    BatchGrantPermissions (BatchGrantPermissions'),
+    newBatchGrantPermissions,
+    BatchGrantPermissionsResponse (BatchGrantPermissionsResponse'),
+    newBatchGrantPermissionsResponse,
+
+    -- ** BatchRevokePermissions
+    BatchRevokePermissions (BatchRevokePermissions'),
+    newBatchRevokePermissions,
+    BatchRevokePermissionsResponse (BatchRevokePermissionsResponse'),
+    newBatchRevokePermissionsResponse,
+
+    -- ** CancelTransaction
+    CancelTransaction (CancelTransaction'),
+    newCancelTransaction,
+    CancelTransactionResponse (CancelTransactionResponse'),
+    newCancelTransactionResponse,
+
+    -- ** CommitTransaction
+    CommitTransaction (CommitTransaction'),
+    newCommitTransaction,
+    CommitTransactionResponse (CommitTransactionResponse'),
+    newCommitTransactionResponse,
+
+    -- ** CreateDataCellsFilter
+    CreateDataCellsFilter (CreateDataCellsFilter'),
+    newCreateDataCellsFilter,
+    CreateDataCellsFilterResponse (CreateDataCellsFilterResponse'),
+    newCreateDataCellsFilterResponse,
+
+    -- ** CreateLFTag
+    CreateLFTag (CreateLFTag'),
+    newCreateLFTag,
+    CreateLFTagResponse (CreateLFTagResponse'),
+    newCreateLFTagResponse,
+
+    -- ** DeleteDataCellsFilter
+    DeleteDataCellsFilter (DeleteDataCellsFilter'),
+    newDeleteDataCellsFilter,
+    DeleteDataCellsFilterResponse (DeleteDataCellsFilterResponse'),
+    newDeleteDataCellsFilterResponse,
+
+    -- ** DeleteLFTag
+    DeleteLFTag (DeleteLFTag'),
+    newDeleteLFTag,
+    DeleteLFTagResponse (DeleteLFTagResponse'),
+    newDeleteLFTagResponse,
+
+    -- ** DeleteObjectsOnCancel
+    DeleteObjectsOnCancel (DeleteObjectsOnCancel'),
+    newDeleteObjectsOnCancel,
+    DeleteObjectsOnCancelResponse (DeleteObjectsOnCancelResponse'),
+    newDeleteObjectsOnCancelResponse,
+
+    -- ** DeregisterResource
+    DeregisterResource (DeregisterResource'),
+    newDeregisterResource,
+    DeregisterResourceResponse (DeregisterResourceResponse'),
+    newDeregisterResourceResponse,
+
+    -- ** DescribeResource
+    DescribeResource (DescribeResource'),
+    newDescribeResource,
+    DescribeResourceResponse (DescribeResourceResponse'),
+    newDescribeResourceResponse,
+
+    -- ** DescribeTransaction
+    DescribeTransaction (DescribeTransaction'),
+    newDescribeTransaction,
+    DescribeTransactionResponse (DescribeTransactionResponse'),
+    newDescribeTransactionResponse,
+
+    -- ** ExtendTransaction
+    ExtendTransaction (ExtendTransaction'),
+    newExtendTransaction,
+    ExtendTransactionResponse (ExtendTransactionResponse'),
+    newExtendTransactionResponse,
+
+    -- ** GetDataLakeSettings
+    GetDataLakeSettings (GetDataLakeSettings'),
+    newGetDataLakeSettings,
+    GetDataLakeSettingsResponse (GetDataLakeSettingsResponse'),
+    newGetDataLakeSettingsResponse,
+
+    -- ** GetEffectivePermissionsForPath
+    GetEffectivePermissionsForPath (GetEffectivePermissionsForPath'),
+    newGetEffectivePermissionsForPath,
+    GetEffectivePermissionsForPathResponse (GetEffectivePermissionsForPathResponse'),
+    newGetEffectivePermissionsForPathResponse,
+
+    -- ** GetLFTag
+    GetLFTag (GetLFTag'),
+    newGetLFTag,
+    GetLFTagResponse (GetLFTagResponse'),
+    newGetLFTagResponse,
+
+    -- ** GetQueryState
+    GetQueryState (GetQueryState'),
+    newGetQueryState,
+    GetQueryStateResponse (GetQueryStateResponse'),
+    newGetQueryStateResponse,
+
+    -- ** GetQueryStatistics
+    GetQueryStatistics (GetQueryStatistics'),
+    newGetQueryStatistics,
+    GetQueryStatisticsResponse (GetQueryStatisticsResponse'),
+    newGetQueryStatisticsResponse,
+
+    -- ** GetResourceLFTags
+    GetResourceLFTags (GetResourceLFTags'),
+    newGetResourceLFTags,
+    GetResourceLFTagsResponse (GetResourceLFTagsResponse'),
+    newGetResourceLFTagsResponse,
+
+    -- ** GetTableObjects
+    GetTableObjects (GetTableObjects'),
+    newGetTableObjects,
+    GetTableObjectsResponse (GetTableObjectsResponse'),
+    newGetTableObjectsResponse,
+
+    -- ** GetTemporaryGluePartitionCredentials
+    GetTemporaryGluePartitionCredentials (GetTemporaryGluePartitionCredentials'),
+    newGetTemporaryGluePartitionCredentials,
+    GetTemporaryGluePartitionCredentialsResponse (GetTemporaryGluePartitionCredentialsResponse'),
+    newGetTemporaryGluePartitionCredentialsResponse,
+
+    -- ** GetTemporaryGlueTableCredentials
+    GetTemporaryGlueTableCredentials (GetTemporaryGlueTableCredentials'),
+    newGetTemporaryGlueTableCredentials,
+    GetTemporaryGlueTableCredentialsResponse (GetTemporaryGlueTableCredentialsResponse'),
+    newGetTemporaryGlueTableCredentialsResponse,
+
+    -- ** GetWorkUnitResults
+    GetWorkUnitResults (GetWorkUnitResults'),
+    newGetWorkUnitResults,
+    GetWorkUnitResultsResponse (GetWorkUnitResultsResponse'),
+    newGetWorkUnitResultsResponse,
+
+    -- ** GetWorkUnits (Paginated)
+    GetWorkUnits (GetWorkUnits'),
+    newGetWorkUnits,
+    GetWorkUnitsResponse (GetWorkUnitsResponse'),
+    newGetWorkUnitsResponse,
+
+    -- ** GrantPermissions
+    GrantPermissions (GrantPermissions'),
+    newGrantPermissions,
+    GrantPermissionsResponse (GrantPermissionsResponse'),
+    newGrantPermissionsResponse,
+
+    -- ** ListDataCellsFilter (Paginated)
+    ListDataCellsFilter (ListDataCellsFilter'),
+    newListDataCellsFilter,
+    ListDataCellsFilterResponse (ListDataCellsFilterResponse'),
+    newListDataCellsFilterResponse,
+
+    -- ** ListLFTags (Paginated)
+    ListLFTags (ListLFTags'),
+    newListLFTags,
+    ListLFTagsResponse (ListLFTagsResponse'),
+    newListLFTagsResponse,
+
+    -- ** ListPermissions
+    ListPermissions (ListPermissions'),
+    newListPermissions,
+    ListPermissionsResponse (ListPermissionsResponse'),
+    newListPermissionsResponse,
+
+    -- ** ListResources
+    ListResources (ListResources'),
+    newListResources,
+    ListResourcesResponse (ListResourcesResponse'),
+    newListResourcesResponse,
+
+    -- ** ListTableStorageOptimizers
+    ListTableStorageOptimizers (ListTableStorageOptimizers'),
+    newListTableStorageOptimizers,
+    ListTableStorageOptimizersResponse (ListTableStorageOptimizersResponse'),
+    newListTableStorageOptimizersResponse,
+
+    -- ** ListTransactions
+    ListTransactions (ListTransactions'),
+    newListTransactions,
+    ListTransactionsResponse (ListTransactionsResponse'),
+    newListTransactionsResponse,
+
+    -- ** PutDataLakeSettings
+    PutDataLakeSettings (PutDataLakeSettings'),
+    newPutDataLakeSettings,
+    PutDataLakeSettingsResponse (PutDataLakeSettingsResponse'),
+    newPutDataLakeSettingsResponse,
+
+    -- ** RegisterResource
+    RegisterResource (RegisterResource'),
+    newRegisterResource,
+    RegisterResourceResponse (RegisterResourceResponse'),
+    newRegisterResourceResponse,
+
+    -- ** RemoveLFTagsFromResource
+    RemoveLFTagsFromResource (RemoveLFTagsFromResource'),
+    newRemoveLFTagsFromResource,
+    RemoveLFTagsFromResourceResponse (RemoveLFTagsFromResourceResponse'),
+    newRemoveLFTagsFromResourceResponse,
+
+    -- ** RevokePermissions
+    RevokePermissions (RevokePermissions'),
+    newRevokePermissions,
+    RevokePermissionsResponse (RevokePermissionsResponse'),
+    newRevokePermissionsResponse,
+
+    -- ** SearchDatabasesByLFTags (Paginated)
+    SearchDatabasesByLFTags (SearchDatabasesByLFTags'),
+    newSearchDatabasesByLFTags,
+    SearchDatabasesByLFTagsResponse (SearchDatabasesByLFTagsResponse'),
+    newSearchDatabasesByLFTagsResponse,
+
+    -- ** SearchTablesByLFTags (Paginated)
+    SearchTablesByLFTags (SearchTablesByLFTags'),
+    newSearchTablesByLFTags,
+    SearchTablesByLFTagsResponse (SearchTablesByLFTagsResponse'),
+    newSearchTablesByLFTagsResponse,
+
+    -- ** StartQueryPlanning
+    StartQueryPlanning (StartQueryPlanning'),
+    newStartQueryPlanning,
+    StartQueryPlanningResponse (StartQueryPlanningResponse'),
+    newStartQueryPlanningResponse,
+
+    -- ** StartTransaction
+    StartTransaction (StartTransaction'),
+    newStartTransaction,
+    StartTransactionResponse (StartTransactionResponse'),
+    newStartTransactionResponse,
+
+    -- ** UpdateLFTag
+    UpdateLFTag (UpdateLFTag'),
+    newUpdateLFTag,
+    UpdateLFTagResponse (UpdateLFTagResponse'),
+    newUpdateLFTagResponse,
+
+    -- ** UpdateResource
+    UpdateResource (UpdateResource'),
+    newUpdateResource,
+    UpdateResourceResponse (UpdateResourceResponse'),
+    newUpdateResourceResponse,
+
+    -- ** UpdateTableObjects
+    UpdateTableObjects (UpdateTableObjects'),
+    newUpdateTableObjects,
+    UpdateTableObjectsResponse (UpdateTableObjectsResponse'),
+    newUpdateTableObjectsResponse,
+
+    -- ** UpdateTableStorageOptimizer
+    UpdateTableStorageOptimizer (UpdateTableStorageOptimizer'),
+    newUpdateTableStorageOptimizer,
+    UpdateTableStorageOptimizerResponse (UpdateTableStorageOptimizerResponse'),
+    newUpdateTableStorageOptimizerResponse,
+
+    -- * Types
+
+    -- ** ComparisonOperator
+    ComparisonOperator (..),
+
+    -- ** DataLakeResourceType
+    DataLakeResourceType (..),
+
+    -- ** FieldNameString
+    FieldNameString (..),
+
+    -- ** OptimizerType
+    OptimizerType (..),
+
+    -- ** Permission
+    Permission (..),
+
+    -- ** PermissionType
+    PermissionType (..),
+
+    -- ** QueryStateString
+    QueryStateString (..),
+
+    -- ** ResourceShareType
+    ResourceShareType (..),
+
+    -- ** ResourceType
+    ResourceType (..),
+
+    -- ** TransactionStatus
+    TransactionStatus (..),
+
+    -- ** TransactionStatusFilter
+    TransactionStatusFilter (..),
+
+    -- ** TransactionType
+    TransactionType (..),
+
+    -- ** AddObjectInput
+    AddObjectInput (AddObjectInput'),
+    newAddObjectInput,
+
+    -- ** AllRowsWildcard
+    AllRowsWildcard (AllRowsWildcard'),
+    newAllRowsWildcard,
+
+    -- ** AuditContext
+    AuditContext (AuditContext'),
+    newAuditContext,
+
+    -- ** BatchPermissionsFailureEntry
+    BatchPermissionsFailureEntry (BatchPermissionsFailureEntry'),
+    newBatchPermissionsFailureEntry,
+
+    -- ** BatchPermissionsRequestEntry
+    BatchPermissionsRequestEntry (BatchPermissionsRequestEntry'),
+    newBatchPermissionsRequestEntry,
+
+    -- ** CatalogResource
+    CatalogResource (CatalogResource'),
+    newCatalogResource,
+
+    -- ** ColumnLFTag
+    ColumnLFTag (ColumnLFTag'),
+    newColumnLFTag,
+
+    -- ** ColumnWildcard
+    ColumnWildcard (ColumnWildcard'),
+    newColumnWildcard,
+
+    -- ** DataCellsFilter
+    DataCellsFilter (DataCellsFilter'),
+    newDataCellsFilter,
+
+    -- ** DataCellsFilterResource
+    DataCellsFilterResource (DataCellsFilterResource'),
+    newDataCellsFilterResource,
+
+    -- ** DataLakePrincipal
+    DataLakePrincipal (DataLakePrincipal'),
+    newDataLakePrincipal,
+
+    -- ** DataLakeSettings
+    DataLakeSettings (DataLakeSettings'),
+    newDataLakeSettings,
+
+    -- ** DataLocationResource
+    DataLocationResource (DataLocationResource'),
+    newDataLocationResource,
+
+    -- ** DatabaseResource
+    DatabaseResource (DatabaseResource'),
+    newDatabaseResource,
+
+    -- ** DeleteObjectInput
+    DeleteObjectInput (DeleteObjectInput'),
+    newDeleteObjectInput,
+
+    -- ** DetailsMap
+    DetailsMap (DetailsMap'),
+    newDetailsMap,
+
+    -- ** ErrorDetail
+    ErrorDetail (ErrorDetail'),
+    newErrorDetail,
+
+    -- ** ExecutionStatistics
+    ExecutionStatistics (ExecutionStatistics'),
+    newExecutionStatistics,
+
+    -- ** FilterCondition
+    FilterCondition (FilterCondition'),
+    newFilterCondition,
+
+    -- ** LFTag
+    LFTag (LFTag'),
+    newLFTag,
+
+    -- ** LFTagError
+    LFTagError (LFTagError'),
+    newLFTagError,
+
+    -- ** LFTagKeyResource
+    LFTagKeyResource (LFTagKeyResource'),
+    newLFTagKeyResource,
+
+    -- ** LFTagPair
+    LFTagPair (LFTagPair'),
+    newLFTagPair,
+
+    -- ** LFTagPolicyResource
+    LFTagPolicyResource (LFTagPolicyResource'),
+    newLFTagPolicyResource,
+
+    -- ** PartitionObjects
+    PartitionObjects (PartitionObjects'),
+    newPartitionObjects,
+
+    -- ** PartitionValueList
+    PartitionValueList (PartitionValueList'),
+    newPartitionValueList,
+
+    -- ** PlanningStatistics
+    PlanningStatistics (PlanningStatistics'),
+    newPlanningStatistics,
+
+    -- ** PrincipalPermissions
+    PrincipalPermissions (PrincipalPermissions'),
+    newPrincipalPermissions,
+
+    -- ** PrincipalResourcePermissions
+    PrincipalResourcePermissions (PrincipalResourcePermissions'),
+    newPrincipalResourcePermissions,
+
+    -- ** QueryPlanningContext
+    QueryPlanningContext (QueryPlanningContext'),
+    newQueryPlanningContext,
+
+    -- ** Resource
+    Resource (Resource'),
+    newResource,
+
+    -- ** ResourceInfo
+    ResourceInfo (ResourceInfo'),
+    newResourceInfo,
+
+    -- ** RowFilter
+    RowFilter (RowFilter'),
+    newRowFilter,
+
+    -- ** StorageOptimizer
+    StorageOptimizer (StorageOptimizer'),
+    newStorageOptimizer,
+
+    -- ** TableObject
+    TableObject (TableObject'),
+    newTableObject,
+
+    -- ** TableResource
+    TableResource (TableResource'),
+    newTableResource,
+
+    -- ** TableWildcard
+    TableWildcard (TableWildcard'),
+    newTableWildcard,
+
+    -- ** TableWithColumnsResource
+    TableWithColumnsResource (TableWithColumnsResource'),
+    newTableWithColumnsResource,
+
+    -- ** TaggedDatabase
+    TaggedDatabase (TaggedDatabase'),
+    newTaggedDatabase,
+
+    -- ** TaggedTable
+    TaggedTable (TaggedTable'),
+    newTaggedTable,
+
+    -- ** TransactionDescription
+    TransactionDescription (TransactionDescription'),
+    newTransactionDescription,
+
+    -- ** VirtualObject
+    VirtualObject (VirtualObject'),
+    newVirtualObject,
+
+    -- ** WorkUnitRange
+    WorkUnitRange (WorkUnitRange'),
+    newWorkUnitRange,
+
+    -- ** WriteOperation
+    WriteOperation (WriteOperation'),
+    newWriteOperation,
+  )
+where
+
+import Amazonka.LakeFormation.AddLFTagsToResource
+import Amazonka.LakeFormation.AssumeDecoratedRoleWithSAML
+import Amazonka.LakeFormation.BatchGrantPermissions
+import Amazonka.LakeFormation.BatchRevokePermissions
+import Amazonka.LakeFormation.CancelTransaction
+import Amazonka.LakeFormation.CommitTransaction
+import Amazonka.LakeFormation.CreateDataCellsFilter
+import Amazonka.LakeFormation.CreateLFTag
+import Amazonka.LakeFormation.DeleteDataCellsFilter
+import Amazonka.LakeFormation.DeleteLFTag
+import Amazonka.LakeFormation.DeleteObjectsOnCancel
+import Amazonka.LakeFormation.DeregisterResource
+import Amazonka.LakeFormation.DescribeResource
+import Amazonka.LakeFormation.DescribeTransaction
+import Amazonka.LakeFormation.ExtendTransaction
+import Amazonka.LakeFormation.GetDataLakeSettings
+import Amazonka.LakeFormation.GetEffectivePermissionsForPath
+import Amazonka.LakeFormation.GetLFTag
+import Amazonka.LakeFormation.GetQueryState
+import Amazonka.LakeFormation.GetQueryStatistics
+import Amazonka.LakeFormation.GetResourceLFTags
+import Amazonka.LakeFormation.GetTableObjects
+import Amazonka.LakeFormation.GetTemporaryGluePartitionCredentials
+import Amazonka.LakeFormation.GetTemporaryGlueTableCredentials
+import Amazonka.LakeFormation.GetWorkUnitResults
+import Amazonka.LakeFormation.GetWorkUnits
+import Amazonka.LakeFormation.GrantPermissions
+import Amazonka.LakeFormation.Lens
+import Amazonka.LakeFormation.ListDataCellsFilter
+import Amazonka.LakeFormation.ListLFTags
+import Amazonka.LakeFormation.ListPermissions
+import Amazonka.LakeFormation.ListResources
+import Amazonka.LakeFormation.ListTableStorageOptimizers
+import Amazonka.LakeFormation.ListTransactions
+import Amazonka.LakeFormation.PutDataLakeSettings
+import Amazonka.LakeFormation.RegisterResource
+import Amazonka.LakeFormation.RemoveLFTagsFromResource
+import Amazonka.LakeFormation.RevokePermissions
+import Amazonka.LakeFormation.SearchDatabasesByLFTags
+import Amazonka.LakeFormation.SearchTablesByLFTags
+import Amazonka.LakeFormation.StartQueryPlanning
+import Amazonka.LakeFormation.StartTransaction
+import Amazonka.LakeFormation.Types
+import Amazonka.LakeFormation.UpdateLFTag
+import Amazonka.LakeFormation.UpdateResource
+import Amazonka.LakeFormation.UpdateTableObjects
+import Amazonka.LakeFormation.UpdateTableStorageOptimizer
+import Amazonka.LakeFormation.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'LakeFormation'.
+
+-- $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/LakeFormation/AddLFTagsToResource.hs b/gen/Amazonka/LakeFormation/AddLFTagsToResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/AddLFTagsToResource.hs
@@ -0,0 +1,206 @@
+{-# 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.LakeFormation.AddLFTagsToResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Attaches one or more LF-tags to an existing resource.
+module Amazonka.LakeFormation.AddLFTagsToResource
+  ( -- * Creating a Request
+    AddLFTagsToResource (..),
+    newAddLFTagsToResource,
+
+    -- * Request Lenses
+    addLFTagsToResource_catalogId,
+    addLFTagsToResource_resource,
+    addLFTagsToResource_lFTags,
+
+    -- * Destructuring the Response
+    AddLFTagsToResourceResponse (..),
+    newAddLFTagsToResourceResponse,
+
+    -- * Response Lenses
+    addLFTagsToResourceResponse_failures,
+    addLFTagsToResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newAddLFTagsToResource' smart constructor.
+data AddLFTagsToResource = AddLFTagsToResource'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The database, table, or column resource to which to attach an LF-tag.
+    resource :: Resource,
+    -- | The LF-tags to attach to the resource.
+    lFTags :: Prelude.NonEmpty LFTagPair
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AddLFTagsToResource' 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:
+--
+-- 'catalogId', 'addLFTagsToResource_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'resource', 'addLFTagsToResource_resource' - The database, table, or column resource to which to attach an LF-tag.
+--
+-- 'lFTags', 'addLFTagsToResource_lFTags' - The LF-tags to attach to the resource.
+newAddLFTagsToResource ::
+  -- | 'resource'
+  Resource ->
+  -- | 'lFTags'
+  Prelude.NonEmpty LFTagPair ->
+  AddLFTagsToResource
+newAddLFTagsToResource pResource_ pLFTags_ =
+  AddLFTagsToResource'
+    { catalogId = Prelude.Nothing,
+      resource = pResource_,
+      lFTags = Lens.coerced Lens.# pLFTags_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+addLFTagsToResource_catalogId :: Lens.Lens' AddLFTagsToResource (Prelude.Maybe Prelude.Text)
+addLFTagsToResource_catalogId = Lens.lens (\AddLFTagsToResource' {catalogId} -> catalogId) (\s@AddLFTagsToResource' {} a -> s {catalogId = a} :: AddLFTagsToResource)
+
+-- | The database, table, or column resource to which to attach an LF-tag.
+addLFTagsToResource_resource :: Lens.Lens' AddLFTagsToResource Resource
+addLFTagsToResource_resource = Lens.lens (\AddLFTagsToResource' {resource} -> resource) (\s@AddLFTagsToResource' {} a -> s {resource = a} :: AddLFTagsToResource)
+
+-- | The LF-tags to attach to the resource.
+addLFTagsToResource_lFTags :: Lens.Lens' AddLFTagsToResource (Prelude.NonEmpty LFTagPair)
+addLFTagsToResource_lFTags = Lens.lens (\AddLFTagsToResource' {lFTags} -> lFTags) (\s@AddLFTagsToResource' {} a -> s {lFTags = a} :: AddLFTagsToResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest AddLFTagsToResource where
+  type
+    AWSResponse AddLFTagsToResource =
+      AddLFTagsToResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AddLFTagsToResourceResponse'
+            Prelude.<$> (x Data..?> "Failures" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable AddLFTagsToResource where
+  hashWithSalt _salt AddLFTagsToResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` resource
+      `Prelude.hashWithSalt` lFTags
+
+instance Prelude.NFData AddLFTagsToResource where
+  rnf AddLFTagsToResource' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf resource
+      `Prelude.seq` Prelude.rnf lFTags
+
+instance Data.ToHeaders AddLFTagsToResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON AddLFTagsToResource where
+  toJSON AddLFTagsToResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("Resource" Data..= resource),
+            Prelude.Just ("LFTags" Data..= lFTags)
+          ]
+      )
+
+instance Data.ToPath AddLFTagsToResource where
+  toPath = Prelude.const "/AddLFTagsToResource"
+
+instance Data.ToQuery AddLFTagsToResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAddLFTagsToResourceResponse' smart constructor.
+data AddLFTagsToResourceResponse = AddLFTagsToResourceResponse'
+  { -- | A list of failures to tag the resource.
+    failures :: Prelude.Maybe [LFTagError],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AddLFTagsToResourceResponse' 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:
+--
+-- 'failures', 'addLFTagsToResourceResponse_failures' - A list of failures to tag the resource.
+--
+-- 'httpStatus', 'addLFTagsToResourceResponse_httpStatus' - The response's http status code.
+newAddLFTagsToResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AddLFTagsToResourceResponse
+newAddLFTagsToResourceResponse pHttpStatus_ =
+  AddLFTagsToResourceResponse'
+    { failures =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of failures to tag the resource.
+addLFTagsToResourceResponse_failures :: Lens.Lens' AddLFTagsToResourceResponse (Prelude.Maybe [LFTagError])
+addLFTagsToResourceResponse_failures = Lens.lens (\AddLFTagsToResourceResponse' {failures} -> failures) (\s@AddLFTagsToResourceResponse' {} a -> s {failures = a} :: AddLFTagsToResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+addLFTagsToResourceResponse_httpStatus :: Lens.Lens' AddLFTagsToResourceResponse Prelude.Int
+addLFTagsToResourceResponse_httpStatus = Lens.lens (\AddLFTagsToResourceResponse' {httpStatus} -> httpStatus) (\s@AddLFTagsToResourceResponse' {} a -> s {httpStatus = a} :: AddLFTagsToResourceResponse)
+
+instance Prelude.NFData AddLFTagsToResourceResponse where
+  rnf AddLFTagsToResourceResponse' {..} =
+    Prelude.rnf failures
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/AssumeDecoratedRoleWithSAML.hs b/gen/Amazonka/LakeFormation/AssumeDecoratedRoleWithSAML.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/AssumeDecoratedRoleWithSAML.hs
@@ -0,0 +1,297 @@
+{-# 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.LakeFormation.AssumeDecoratedRoleWithSAML
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows a caller to assume an IAM role decorated as the SAML user
+-- specified in the SAML assertion included in the request. This decoration
+-- allows Lake Formation to enforce access policies against the SAML users
+-- and groups. This API operation requires SAML federation setup in the
+-- caller’s account as it can only be called with valid SAML assertions.
+-- Lake Formation does not scope down the permission of the assumed role.
+-- All permissions attached to the role via the SAML federation setup will
+-- be included in the role session.
+--
+-- This decorated role is expected to access data in Amazon S3 by getting
+-- temporary access from Lake Formation which is authorized via the virtual
+-- API @GetDataAccess@. Therefore, all SAML roles that can be assumed via
+-- @AssumeDecoratedRoleWithSAML@ must at a minimum include
+-- @lakeformation:GetDataAccess@ in their role policies. A typical IAM
+-- policy attached to such a role would look as follows:
+module Amazonka.LakeFormation.AssumeDecoratedRoleWithSAML
+  ( -- * Creating a Request
+    AssumeDecoratedRoleWithSAML (..),
+    newAssumeDecoratedRoleWithSAML,
+
+    -- * Request Lenses
+    assumeDecoratedRoleWithSAML_durationSeconds,
+    assumeDecoratedRoleWithSAML_sAMLAssertion,
+    assumeDecoratedRoleWithSAML_roleArn,
+    assumeDecoratedRoleWithSAML_principalArn,
+
+    -- * Destructuring the Response
+    AssumeDecoratedRoleWithSAMLResponse (..),
+    newAssumeDecoratedRoleWithSAMLResponse,
+
+    -- * Response Lenses
+    assumeDecoratedRoleWithSAMLResponse_accessKeyId,
+    assumeDecoratedRoleWithSAMLResponse_expiration,
+    assumeDecoratedRoleWithSAMLResponse_secretAccessKey,
+    assumeDecoratedRoleWithSAMLResponse_sessionToken,
+    assumeDecoratedRoleWithSAMLResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newAssumeDecoratedRoleWithSAML' smart constructor.
+data AssumeDecoratedRoleWithSAML = AssumeDecoratedRoleWithSAML'
+  { -- | The time period, between 900 and 43,200 seconds, for the timeout of the
+    -- temporary credentials.
+    durationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | A SAML assertion consisting of an assertion statement for the user who
+    -- needs temporary credentials. This must match the SAML assertion that was
+    -- issued to IAM. This must be Base64 encoded.
+    sAMLAssertion :: Prelude.Text,
+    -- | The role that represents an IAM principal whose scope down policy allows
+    -- it to call credential vending APIs such as
+    -- @GetTemporaryTableCredentials@. The caller must also have iam:PassRole
+    -- permission on this role.
+    roleArn :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the SAML provider in IAM that
+    -- describes the IdP.
+    principalArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssumeDecoratedRoleWithSAML' 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:
+--
+-- 'durationSeconds', 'assumeDecoratedRoleWithSAML_durationSeconds' - The time period, between 900 and 43,200 seconds, for the timeout of the
+-- temporary credentials.
+--
+-- 'sAMLAssertion', 'assumeDecoratedRoleWithSAML_sAMLAssertion' - A SAML assertion consisting of an assertion statement for the user who
+-- needs temporary credentials. This must match the SAML assertion that was
+-- issued to IAM. This must be Base64 encoded.
+--
+-- 'roleArn', 'assumeDecoratedRoleWithSAML_roleArn' - The role that represents an IAM principal whose scope down policy allows
+-- it to call credential vending APIs such as
+-- @GetTemporaryTableCredentials@. The caller must also have iam:PassRole
+-- permission on this role.
+--
+-- 'principalArn', 'assumeDecoratedRoleWithSAML_principalArn' - The Amazon Resource Name (ARN) of the SAML provider in IAM that
+-- describes the IdP.
+newAssumeDecoratedRoleWithSAML ::
+  -- | 'sAMLAssertion'
+  Prelude.Text ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  -- | 'principalArn'
+  Prelude.Text ->
+  AssumeDecoratedRoleWithSAML
+newAssumeDecoratedRoleWithSAML
+  pSAMLAssertion_
+  pRoleArn_
+  pPrincipalArn_ =
+    AssumeDecoratedRoleWithSAML'
+      { durationSeconds =
+          Prelude.Nothing,
+        sAMLAssertion = pSAMLAssertion_,
+        roleArn = pRoleArn_,
+        principalArn = pPrincipalArn_
+      }
+
+-- | The time period, between 900 and 43,200 seconds, for the timeout of the
+-- temporary credentials.
+assumeDecoratedRoleWithSAML_durationSeconds :: Lens.Lens' AssumeDecoratedRoleWithSAML (Prelude.Maybe Prelude.Natural)
+assumeDecoratedRoleWithSAML_durationSeconds = Lens.lens (\AssumeDecoratedRoleWithSAML' {durationSeconds} -> durationSeconds) (\s@AssumeDecoratedRoleWithSAML' {} a -> s {durationSeconds = a} :: AssumeDecoratedRoleWithSAML)
+
+-- | A SAML assertion consisting of an assertion statement for the user who
+-- needs temporary credentials. This must match the SAML assertion that was
+-- issued to IAM. This must be Base64 encoded.
+assumeDecoratedRoleWithSAML_sAMLAssertion :: Lens.Lens' AssumeDecoratedRoleWithSAML Prelude.Text
+assumeDecoratedRoleWithSAML_sAMLAssertion = Lens.lens (\AssumeDecoratedRoleWithSAML' {sAMLAssertion} -> sAMLAssertion) (\s@AssumeDecoratedRoleWithSAML' {} a -> s {sAMLAssertion = a} :: AssumeDecoratedRoleWithSAML)
+
+-- | The role that represents an IAM principal whose scope down policy allows
+-- it to call credential vending APIs such as
+-- @GetTemporaryTableCredentials@. The caller must also have iam:PassRole
+-- permission on this role.
+assumeDecoratedRoleWithSAML_roleArn :: Lens.Lens' AssumeDecoratedRoleWithSAML Prelude.Text
+assumeDecoratedRoleWithSAML_roleArn = Lens.lens (\AssumeDecoratedRoleWithSAML' {roleArn} -> roleArn) (\s@AssumeDecoratedRoleWithSAML' {} a -> s {roleArn = a} :: AssumeDecoratedRoleWithSAML)
+
+-- | The Amazon Resource Name (ARN) of the SAML provider in IAM that
+-- describes the IdP.
+assumeDecoratedRoleWithSAML_principalArn :: Lens.Lens' AssumeDecoratedRoleWithSAML Prelude.Text
+assumeDecoratedRoleWithSAML_principalArn = Lens.lens (\AssumeDecoratedRoleWithSAML' {principalArn} -> principalArn) (\s@AssumeDecoratedRoleWithSAML' {} a -> s {principalArn = a} :: AssumeDecoratedRoleWithSAML)
+
+instance Core.AWSRequest AssumeDecoratedRoleWithSAML where
+  type
+    AWSResponse AssumeDecoratedRoleWithSAML =
+      AssumeDecoratedRoleWithSAMLResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AssumeDecoratedRoleWithSAMLResponse'
+            Prelude.<$> (x Data..?> "AccessKeyId")
+            Prelude.<*> (x Data..?> "Expiration")
+            Prelude.<*> (x Data..?> "SecretAccessKey")
+            Prelude.<*> (x Data..?> "SessionToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable AssumeDecoratedRoleWithSAML where
+  hashWithSalt _salt AssumeDecoratedRoleWithSAML' {..} =
+    _salt
+      `Prelude.hashWithSalt` durationSeconds
+      `Prelude.hashWithSalt` sAMLAssertion
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` principalArn
+
+instance Prelude.NFData AssumeDecoratedRoleWithSAML where
+  rnf AssumeDecoratedRoleWithSAML' {..} =
+    Prelude.rnf durationSeconds
+      `Prelude.seq` Prelude.rnf sAMLAssertion
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf principalArn
+
+instance Data.ToHeaders AssumeDecoratedRoleWithSAML where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON AssumeDecoratedRoleWithSAML where
+  toJSON AssumeDecoratedRoleWithSAML' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DurationSeconds" Data..=)
+              Prelude.<$> durationSeconds,
+            Prelude.Just ("SAMLAssertion" Data..= sAMLAssertion),
+            Prelude.Just ("RoleArn" Data..= roleArn),
+            Prelude.Just ("PrincipalArn" Data..= principalArn)
+          ]
+      )
+
+instance Data.ToPath AssumeDecoratedRoleWithSAML where
+  toPath = Prelude.const "/AssumeDecoratedRoleWithSAML"
+
+instance Data.ToQuery AssumeDecoratedRoleWithSAML where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAssumeDecoratedRoleWithSAMLResponse' smart constructor.
+data AssumeDecoratedRoleWithSAMLResponse = AssumeDecoratedRoleWithSAMLResponse'
+  { -- | The access key ID for the temporary credentials. (The access key
+    -- consists of an access key ID and a secret key).
+    accessKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The date and time when the temporary credentials expire.
+    expiration :: Prelude.Maybe Data.POSIX,
+    -- | The secret key for the temporary credentials. (The access key consists
+    -- of an access key ID and a secret key).
+    secretAccessKey :: Prelude.Maybe Prelude.Text,
+    -- | The session token for the temporary credentials.
+    sessionToken :: 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 'AssumeDecoratedRoleWithSAMLResponse' 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:
+--
+-- 'accessKeyId', 'assumeDecoratedRoleWithSAMLResponse_accessKeyId' - The access key ID for the temporary credentials. (The access key
+-- consists of an access key ID and a secret key).
+--
+-- 'expiration', 'assumeDecoratedRoleWithSAMLResponse_expiration' - The date and time when the temporary credentials expire.
+--
+-- 'secretAccessKey', 'assumeDecoratedRoleWithSAMLResponse_secretAccessKey' - The secret key for the temporary credentials. (The access key consists
+-- of an access key ID and a secret key).
+--
+-- 'sessionToken', 'assumeDecoratedRoleWithSAMLResponse_sessionToken' - The session token for the temporary credentials.
+--
+-- 'httpStatus', 'assumeDecoratedRoleWithSAMLResponse_httpStatus' - The response's http status code.
+newAssumeDecoratedRoleWithSAMLResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AssumeDecoratedRoleWithSAMLResponse
+newAssumeDecoratedRoleWithSAMLResponse pHttpStatus_ =
+  AssumeDecoratedRoleWithSAMLResponse'
+    { accessKeyId =
+        Prelude.Nothing,
+      expiration = Prelude.Nothing,
+      secretAccessKey = Prelude.Nothing,
+      sessionToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The access key ID for the temporary credentials. (The access key
+-- consists of an access key ID and a secret key).
+assumeDecoratedRoleWithSAMLResponse_accessKeyId :: Lens.Lens' AssumeDecoratedRoleWithSAMLResponse (Prelude.Maybe Prelude.Text)
+assumeDecoratedRoleWithSAMLResponse_accessKeyId = Lens.lens (\AssumeDecoratedRoleWithSAMLResponse' {accessKeyId} -> accessKeyId) (\s@AssumeDecoratedRoleWithSAMLResponse' {} a -> s {accessKeyId = a} :: AssumeDecoratedRoleWithSAMLResponse)
+
+-- | The date and time when the temporary credentials expire.
+assumeDecoratedRoleWithSAMLResponse_expiration :: Lens.Lens' AssumeDecoratedRoleWithSAMLResponse (Prelude.Maybe Prelude.UTCTime)
+assumeDecoratedRoleWithSAMLResponse_expiration = Lens.lens (\AssumeDecoratedRoleWithSAMLResponse' {expiration} -> expiration) (\s@AssumeDecoratedRoleWithSAMLResponse' {} a -> s {expiration = a} :: AssumeDecoratedRoleWithSAMLResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The secret key for the temporary credentials. (The access key consists
+-- of an access key ID and a secret key).
+assumeDecoratedRoleWithSAMLResponse_secretAccessKey :: Lens.Lens' AssumeDecoratedRoleWithSAMLResponse (Prelude.Maybe Prelude.Text)
+assumeDecoratedRoleWithSAMLResponse_secretAccessKey = Lens.lens (\AssumeDecoratedRoleWithSAMLResponse' {secretAccessKey} -> secretAccessKey) (\s@AssumeDecoratedRoleWithSAMLResponse' {} a -> s {secretAccessKey = a} :: AssumeDecoratedRoleWithSAMLResponse)
+
+-- | The session token for the temporary credentials.
+assumeDecoratedRoleWithSAMLResponse_sessionToken :: Lens.Lens' AssumeDecoratedRoleWithSAMLResponse (Prelude.Maybe Prelude.Text)
+assumeDecoratedRoleWithSAMLResponse_sessionToken = Lens.lens (\AssumeDecoratedRoleWithSAMLResponse' {sessionToken} -> sessionToken) (\s@AssumeDecoratedRoleWithSAMLResponse' {} a -> s {sessionToken = a} :: AssumeDecoratedRoleWithSAMLResponse)
+
+-- | The response's http status code.
+assumeDecoratedRoleWithSAMLResponse_httpStatus :: Lens.Lens' AssumeDecoratedRoleWithSAMLResponse Prelude.Int
+assumeDecoratedRoleWithSAMLResponse_httpStatus = Lens.lens (\AssumeDecoratedRoleWithSAMLResponse' {httpStatus} -> httpStatus) (\s@AssumeDecoratedRoleWithSAMLResponse' {} a -> s {httpStatus = a} :: AssumeDecoratedRoleWithSAMLResponse)
+
+instance
+  Prelude.NFData
+    AssumeDecoratedRoleWithSAMLResponse
+  where
+  rnf AssumeDecoratedRoleWithSAMLResponse' {..} =
+    Prelude.rnf accessKeyId
+      `Prelude.seq` Prelude.rnf expiration
+      `Prelude.seq` Prelude.rnf secretAccessKey
+      `Prelude.seq` Prelude.rnf sessionToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/BatchGrantPermissions.hs b/gen/Amazonka/LakeFormation/BatchGrantPermissions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/BatchGrantPermissions.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.LakeFormation.BatchGrantPermissions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Batch operation to grant permissions to the principal.
+module Amazonka.LakeFormation.BatchGrantPermissions
+  ( -- * Creating a Request
+    BatchGrantPermissions (..),
+    newBatchGrantPermissions,
+
+    -- * Request Lenses
+    batchGrantPermissions_catalogId,
+    batchGrantPermissions_entries,
+
+    -- * Destructuring the Response
+    BatchGrantPermissionsResponse (..),
+    newBatchGrantPermissionsResponse,
+
+    -- * Response Lenses
+    batchGrantPermissionsResponse_failures,
+    batchGrantPermissionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchGrantPermissions' smart constructor.
+data BatchGrantPermissions = BatchGrantPermissions'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | A list of up to 20 entries for resource permissions to be granted by
+    -- batch operation to the principal.
+    entries :: [BatchPermissionsRequestEntry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGrantPermissions' 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:
+--
+-- 'catalogId', 'batchGrantPermissions_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'entries', 'batchGrantPermissions_entries' - A list of up to 20 entries for resource permissions to be granted by
+-- batch operation to the principal.
+newBatchGrantPermissions ::
+  BatchGrantPermissions
+newBatchGrantPermissions =
+  BatchGrantPermissions'
+    { catalogId = Prelude.Nothing,
+      entries = Prelude.mempty
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+batchGrantPermissions_catalogId :: Lens.Lens' BatchGrantPermissions (Prelude.Maybe Prelude.Text)
+batchGrantPermissions_catalogId = Lens.lens (\BatchGrantPermissions' {catalogId} -> catalogId) (\s@BatchGrantPermissions' {} a -> s {catalogId = a} :: BatchGrantPermissions)
+
+-- | A list of up to 20 entries for resource permissions to be granted by
+-- batch operation to the principal.
+batchGrantPermissions_entries :: Lens.Lens' BatchGrantPermissions [BatchPermissionsRequestEntry]
+batchGrantPermissions_entries = Lens.lens (\BatchGrantPermissions' {entries} -> entries) (\s@BatchGrantPermissions' {} a -> s {entries = a} :: BatchGrantPermissions) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchGrantPermissions where
+  type
+    AWSResponse BatchGrantPermissions =
+      BatchGrantPermissionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchGrantPermissionsResponse'
+            Prelude.<$> (x Data..?> "Failures" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchGrantPermissions where
+  hashWithSalt _salt BatchGrantPermissions' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` entries
+
+instance Prelude.NFData BatchGrantPermissions where
+  rnf BatchGrantPermissions' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf entries
+
+instance Data.ToHeaders BatchGrantPermissions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchGrantPermissions where
+  toJSON BatchGrantPermissions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("Entries" Data..= entries)
+          ]
+      )
+
+instance Data.ToPath BatchGrantPermissions where
+  toPath = Prelude.const "/BatchGrantPermissions"
+
+instance Data.ToQuery BatchGrantPermissions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchGrantPermissionsResponse' smart constructor.
+data BatchGrantPermissionsResponse = BatchGrantPermissionsResponse'
+  { -- | A list of failures to grant permissions to the resources.
+    failures :: Prelude.Maybe [BatchPermissionsFailureEntry],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGrantPermissionsResponse' 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:
+--
+-- 'failures', 'batchGrantPermissionsResponse_failures' - A list of failures to grant permissions to the resources.
+--
+-- 'httpStatus', 'batchGrantPermissionsResponse_httpStatus' - The response's http status code.
+newBatchGrantPermissionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchGrantPermissionsResponse
+newBatchGrantPermissionsResponse pHttpStatus_ =
+  BatchGrantPermissionsResponse'
+    { failures =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of failures to grant permissions to the resources.
+batchGrantPermissionsResponse_failures :: Lens.Lens' BatchGrantPermissionsResponse (Prelude.Maybe [BatchPermissionsFailureEntry])
+batchGrantPermissionsResponse_failures = Lens.lens (\BatchGrantPermissionsResponse' {failures} -> failures) (\s@BatchGrantPermissionsResponse' {} a -> s {failures = a} :: BatchGrantPermissionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchGrantPermissionsResponse_httpStatus :: Lens.Lens' BatchGrantPermissionsResponse Prelude.Int
+batchGrantPermissionsResponse_httpStatus = Lens.lens (\BatchGrantPermissionsResponse' {httpStatus} -> httpStatus) (\s@BatchGrantPermissionsResponse' {} a -> s {httpStatus = a} :: BatchGrantPermissionsResponse)
+
+instance Prelude.NFData BatchGrantPermissionsResponse where
+  rnf BatchGrantPermissionsResponse' {..} =
+    Prelude.rnf failures
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/BatchRevokePermissions.hs b/gen/Amazonka/LakeFormation/BatchRevokePermissions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/BatchRevokePermissions.hs
@@ -0,0 +1,196 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.BatchRevokePermissions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Batch operation to revoke permissions from the principal.
+module Amazonka.LakeFormation.BatchRevokePermissions
+  ( -- * Creating a Request
+    BatchRevokePermissions (..),
+    newBatchRevokePermissions,
+
+    -- * Request Lenses
+    batchRevokePermissions_catalogId,
+    batchRevokePermissions_entries,
+
+    -- * Destructuring the Response
+    BatchRevokePermissionsResponse (..),
+    newBatchRevokePermissionsResponse,
+
+    -- * Response Lenses
+    batchRevokePermissionsResponse_failures,
+    batchRevokePermissionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchRevokePermissions' smart constructor.
+data BatchRevokePermissions = BatchRevokePermissions'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | A list of up to 20 entries for resource permissions to be revoked by
+    -- batch operation to the principal.
+    entries :: [BatchPermissionsRequestEntry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchRevokePermissions' 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:
+--
+-- 'catalogId', 'batchRevokePermissions_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'entries', 'batchRevokePermissions_entries' - A list of up to 20 entries for resource permissions to be revoked by
+-- batch operation to the principal.
+newBatchRevokePermissions ::
+  BatchRevokePermissions
+newBatchRevokePermissions =
+  BatchRevokePermissions'
+    { catalogId =
+        Prelude.Nothing,
+      entries = Prelude.mempty
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+batchRevokePermissions_catalogId :: Lens.Lens' BatchRevokePermissions (Prelude.Maybe Prelude.Text)
+batchRevokePermissions_catalogId = Lens.lens (\BatchRevokePermissions' {catalogId} -> catalogId) (\s@BatchRevokePermissions' {} a -> s {catalogId = a} :: BatchRevokePermissions)
+
+-- | A list of up to 20 entries for resource permissions to be revoked by
+-- batch operation to the principal.
+batchRevokePermissions_entries :: Lens.Lens' BatchRevokePermissions [BatchPermissionsRequestEntry]
+batchRevokePermissions_entries = Lens.lens (\BatchRevokePermissions' {entries} -> entries) (\s@BatchRevokePermissions' {} a -> s {entries = a} :: BatchRevokePermissions) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchRevokePermissions where
+  type
+    AWSResponse BatchRevokePermissions =
+      BatchRevokePermissionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchRevokePermissionsResponse'
+            Prelude.<$> (x Data..?> "Failures" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchRevokePermissions where
+  hashWithSalt _salt BatchRevokePermissions' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` entries
+
+instance Prelude.NFData BatchRevokePermissions where
+  rnf BatchRevokePermissions' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf entries
+
+instance Data.ToHeaders BatchRevokePermissions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchRevokePermissions where
+  toJSON BatchRevokePermissions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("Entries" Data..= entries)
+          ]
+      )
+
+instance Data.ToPath BatchRevokePermissions where
+  toPath = Prelude.const "/BatchRevokePermissions"
+
+instance Data.ToQuery BatchRevokePermissions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchRevokePermissionsResponse' smart constructor.
+data BatchRevokePermissionsResponse = BatchRevokePermissionsResponse'
+  { -- | A list of failures to revoke permissions to the resources.
+    failures :: Prelude.Maybe [BatchPermissionsFailureEntry],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchRevokePermissionsResponse' 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:
+--
+-- 'failures', 'batchRevokePermissionsResponse_failures' - A list of failures to revoke permissions to the resources.
+--
+-- 'httpStatus', 'batchRevokePermissionsResponse_httpStatus' - The response's http status code.
+newBatchRevokePermissionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchRevokePermissionsResponse
+newBatchRevokePermissionsResponse pHttpStatus_ =
+  BatchRevokePermissionsResponse'
+    { failures =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of failures to revoke permissions to the resources.
+batchRevokePermissionsResponse_failures :: Lens.Lens' BatchRevokePermissionsResponse (Prelude.Maybe [BatchPermissionsFailureEntry])
+batchRevokePermissionsResponse_failures = Lens.lens (\BatchRevokePermissionsResponse' {failures} -> failures) (\s@BatchRevokePermissionsResponse' {} a -> s {failures = a} :: BatchRevokePermissionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchRevokePermissionsResponse_httpStatus :: Lens.Lens' BatchRevokePermissionsResponse Prelude.Int
+batchRevokePermissionsResponse_httpStatus = Lens.lens (\BatchRevokePermissionsResponse' {httpStatus} -> httpStatus) (\s@BatchRevokePermissionsResponse' {} a -> s {httpStatus = a} :: BatchRevokePermissionsResponse)
+
+instance
+  Prelude.NFData
+    BatchRevokePermissionsResponse
+  where
+  rnf BatchRevokePermissionsResponse' {..} =
+    Prelude.rnf failures
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/CancelTransaction.hs b/gen/Amazonka/LakeFormation/CancelTransaction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/CancelTransaction.hs
@@ -0,0 +1,156 @@
+{-# 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.LakeFormation.CancelTransaction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Attempts to cancel the specified transaction. Returns an exception if
+-- the transaction was previously committed.
+module Amazonka.LakeFormation.CancelTransaction
+  ( -- * Creating a Request
+    CancelTransaction (..),
+    newCancelTransaction,
+
+    -- * Request Lenses
+    cancelTransaction_transactionId,
+
+    -- * Destructuring the Response
+    CancelTransactionResponse (..),
+    newCancelTransactionResponse,
+
+    -- * Response Lenses
+    cancelTransactionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCancelTransaction' smart constructor.
+data CancelTransaction = CancelTransaction'
+  { -- | The transaction to cancel.
+    transactionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CancelTransaction' 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:
+--
+-- 'transactionId', 'cancelTransaction_transactionId' - The transaction to cancel.
+newCancelTransaction ::
+  -- | 'transactionId'
+  Prelude.Text ->
+  CancelTransaction
+newCancelTransaction pTransactionId_ =
+  CancelTransaction' {transactionId = pTransactionId_}
+
+-- | The transaction to cancel.
+cancelTransaction_transactionId :: Lens.Lens' CancelTransaction Prelude.Text
+cancelTransaction_transactionId = Lens.lens (\CancelTransaction' {transactionId} -> transactionId) (\s@CancelTransaction' {} a -> s {transactionId = a} :: CancelTransaction)
+
+instance Core.AWSRequest CancelTransaction where
+  type
+    AWSResponse CancelTransaction =
+      CancelTransactionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          CancelTransactionResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CancelTransaction where
+  hashWithSalt _salt CancelTransaction' {..} =
+    _salt `Prelude.hashWithSalt` transactionId
+
+instance Prelude.NFData CancelTransaction where
+  rnf CancelTransaction' {..} =
+    Prelude.rnf transactionId
+
+instance Data.ToHeaders CancelTransaction where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CancelTransaction where
+  toJSON CancelTransaction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("TransactionId" Data..= transactionId)
+          ]
+      )
+
+instance Data.ToPath CancelTransaction where
+  toPath = Prelude.const "/CancelTransaction"
+
+instance Data.ToQuery CancelTransaction where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCancelTransactionResponse' smart constructor.
+data CancelTransactionResponse = CancelTransactionResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CancelTransactionResponse' 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', 'cancelTransactionResponse_httpStatus' - The response's http status code.
+newCancelTransactionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CancelTransactionResponse
+newCancelTransactionResponse pHttpStatus_ =
+  CancelTransactionResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+cancelTransactionResponse_httpStatus :: Lens.Lens' CancelTransactionResponse Prelude.Int
+cancelTransactionResponse_httpStatus = Lens.lens (\CancelTransactionResponse' {httpStatus} -> httpStatus) (\s@CancelTransactionResponse' {} a -> s {httpStatus = a} :: CancelTransactionResponse)
+
+instance Prelude.NFData CancelTransactionResponse where
+  rnf CancelTransactionResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/CommitTransaction.hs b/gen/Amazonka/LakeFormation/CommitTransaction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/CommitTransaction.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.LakeFormation.CommitTransaction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Attempts to commit the specified transaction. Returns an exception if
+-- the transaction was previously aborted. This API action is idempotent if
+-- called multiple times for the same transaction.
+module Amazonka.LakeFormation.CommitTransaction
+  ( -- * Creating a Request
+    CommitTransaction (..),
+    newCommitTransaction,
+
+    -- * Request Lenses
+    commitTransaction_transactionId,
+
+    -- * Destructuring the Response
+    CommitTransactionResponse (..),
+    newCommitTransactionResponse,
+
+    -- * Response Lenses
+    commitTransactionResponse_transactionStatus,
+    commitTransactionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCommitTransaction' smart constructor.
+data CommitTransaction = CommitTransaction'
+  { -- | The transaction to commit.
+    transactionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CommitTransaction' 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:
+--
+-- 'transactionId', 'commitTransaction_transactionId' - The transaction to commit.
+newCommitTransaction ::
+  -- | 'transactionId'
+  Prelude.Text ->
+  CommitTransaction
+newCommitTransaction pTransactionId_ =
+  CommitTransaction' {transactionId = pTransactionId_}
+
+-- | The transaction to commit.
+commitTransaction_transactionId :: Lens.Lens' CommitTransaction Prelude.Text
+commitTransaction_transactionId = Lens.lens (\CommitTransaction' {transactionId} -> transactionId) (\s@CommitTransaction' {} a -> s {transactionId = a} :: CommitTransaction)
+
+instance Core.AWSRequest CommitTransaction where
+  type
+    AWSResponse CommitTransaction =
+      CommitTransactionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CommitTransactionResponse'
+            Prelude.<$> (x Data..?> "TransactionStatus")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CommitTransaction where
+  hashWithSalt _salt CommitTransaction' {..} =
+    _salt `Prelude.hashWithSalt` transactionId
+
+instance Prelude.NFData CommitTransaction where
+  rnf CommitTransaction' {..} =
+    Prelude.rnf transactionId
+
+instance Data.ToHeaders CommitTransaction where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CommitTransaction where
+  toJSON CommitTransaction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("TransactionId" Data..= transactionId)
+          ]
+      )
+
+instance Data.ToPath CommitTransaction where
+  toPath = Prelude.const "/CommitTransaction"
+
+instance Data.ToQuery CommitTransaction where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCommitTransactionResponse' smart constructor.
+data CommitTransactionResponse = CommitTransactionResponse'
+  { -- | The status of the transaction.
+    transactionStatus :: Prelude.Maybe TransactionStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CommitTransactionResponse' 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:
+--
+-- 'transactionStatus', 'commitTransactionResponse_transactionStatus' - The status of the transaction.
+--
+-- 'httpStatus', 'commitTransactionResponse_httpStatus' - The response's http status code.
+newCommitTransactionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CommitTransactionResponse
+newCommitTransactionResponse pHttpStatus_ =
+  CommitTransactionResponse'
+    { transactionStatus =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The status of the transaction.
+commitTransactionResponse_transactionStatus :: Lens.Lens' CommitTransactionResponse (Prelude.Maybe TransactionStatus)
+commitTransactionResponse_transactionStatus = Lens.lens (\CommitTransactionResponse' {transactionStatus} -> transactionStatus) (\s@CommitTransactionResponse' {} a -> s {transactionStatus = a} :: CommitTransactionResponse)
+
+-- | The response's http status code.
+commitTransactionResponse_httpStatus :: Lens.Lens' CommitTransactionResponse Prelude.Int
+commitTransactionResponse_httpStatus = Lens.lens (\CommitTransactionResponse' {httpStatus} -> httpStatus) (\s@CommitTransactionResponse' {} a -> s {httpStatus = a} :: CommitTransactionResponse)
+
+instance Prelude.NFData CommitTransactionResponse where
+  rnf CommitTransactionResponse' {..} =
+    Prelude.rnf transactionStatus
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/CreateDataCellsFilter.hs b/gen/Amazonka/LakeFormation/CreateDataCellsFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/CreateDataCellsFilter.hs
@@ -0,0 +1,157 @@
+{-# 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.LakeFormation.CreateDataCellsFilter
+-- 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 data cell filter to allow one to grant access to certain
+-- columns on certain rows.
+module Amazonka.LakeFormation.CreateDataCellsFilter
+  ( -- * Creating a Request
+    CreateDataCellsFilter (..),
+    newCreateDataCellsFilter,
+
+    -- * Request Lenses
+    createDataCellsFilter_tableData,
+
+    -- * Destructuring the Response
+    CreateDataCellsFilterResponse (..),
+    newCreateDataCellsFilterResponse,
+
+    -- * Response Lenses
+    createDataCellsFilterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateDataCellsFilter' smart constructor.
+data CreateDataCellsFilter = CreateDataCellsFilter'
+  { -- | A @DataCellsFilter@ structure containing information about the data
+    -- cells filter.
+    tableData :: DataCellsFilter
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDataCellsFilter' 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:
+--
+-- 'tableData', 'createDataCellsFilter_tableData' - A @DataCellsFilter@ structure containing information about the data
+-- cells filter.
+newCreateDataCellsFilter ::
+  -- | 'tableData'
+  DataCellsFilter ->
+  CreateDataCellsFilter
+newCreateDataCellsFilter pTableData_ =
+  CreateDataCellsFilter' {tableData = pTableData_}
+
+-- | A @DataCellsFilter@ structure containing information about the data
+-- cells filter.
+createDataCellsFilter_tableData :: Lens.Lens' CreateDataCellsFilter DataCellsFilter
+createDataCellsFilter_tableData = Lens.lens (\CreateDataCellsFilter' {tableData} -> tableData) (\s@CreateDataCellsFilter' {} a -> s {tableData = a} :: CreateDataCellsFilter)
+
+instance Core.AWSRequest CreateDataCellsFilter where
+  type
+    AWSResponse CreateDataCellsFilter =
+      CreateDataCellsFilterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          CreateDataCellsFilterResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDataCellsFilter where
+  hashWithSalt _salt CreateDataCellsFilter' {..} =
+    _salt `Prelude.hashWithSalt` tableData
+
+instance Prelude.NFData CreateDataCellsFilter where
+  rnf CreateDataCellsFilter' {..} =
+    Prelude.rnf tableData
+
+instance Data.ToHeaders CreateDataCellsFilter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDataCellsFilter where
+  toJSON CreateDataCellsFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("TableData" Data..= tableData)]
+      )
+
+instance Data.ToPath CreateDataCellsFilter where
+  toPath = Prelude.const "/CreateDataCellsFilter"
+
+instance Data.ToQuery CreateDataCellsFilter where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateDataCellsFilterResponse' smart constructor.
+data CreateDataCellsFilterResponse = CreateDataCellsFilterResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDataCellsFilterResponse' 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', 'createDataCellsFilterResponse_httpStatus' - The response's http status code.
+newCreateDataCellsFilterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDataCellsFilterResponse
+newCreateDataCellsFilterResponse pHttpStatus_ =
+  CreateDataCellsFilterResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+createDataCellsFilterResponse_httpStatus :: Lens.Lens' CreateDataCellsFilterResponse Prelude.Int
+createDataCellsFilterResponse_httpStatus = Lens.lens (\CreateDataCellsFilterResponse' {httpStatus} -> httpStatus) (\s@CreateDataCellsFilterResponse' {} a -> s {httpStatus = a} :: CreateDataCellsFilterResponse)
+
+instance Prelude.NFData CreateDataCellsFilterResponse where
+  rnf CreateDataCellsFilterResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/CreateLFTag.hs b/gen/Amazonka/LakeFormation/CreateLFTag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/CreateLFTag.hs
@@ -0,0 +1,188 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.CreateLFTag
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an LF-tag with the specified name and values.
+module Amazonka.LakeFormation.CreateLFTag
+  ( -- * Creating a Request
+    CreateLFTag (..),
+    newCreateLFTag,
+
+    -- * Request Lenses
+    createLFTag_catalogId,
+    createLFTag_tagKey,
+    createLFTag_tagValues,
+
+    -- * Destructuring the Response
+    CreateLFTagResponse (..),
+    newCreateLFTagResponse,
+
+    -- * Response Lenses
+    createLFTagResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateLFTag' smart constructor.
+data CreateLFTag = CreateLFTag'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The key-name for the LF-tag.
+    tagKey :: Prelude.Text,
+    -- | A list of possible values an attribute can take.
+    tagValues :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateLFTag' 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:
+--
+-- 'catalogId', 'createLFTag_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'tagKey', 'createLFTag_tagKey' - The key-name for the LF-tag.
+--
+-- 'tagValues', 'createLFTag_tagValues' - A list of possible values an attribute can take.
+newCreateLFTag ::
+  -- | 'tagKey'
+  Prelude.Text ->
+  -- | 'tagValues'
+  Prelude.NonEmpty Prelude.Text ->
+  CreateLFTag
+newCreateLFTag pTagKey_ pTagValues_ =
+  CreateLFTag'
+    { catalogId = Prelude.Nothing,
+      tagKey = pTagKey_,
+      tagValues = Lens.coerced Lens.# pTagValues_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+createLFTag_catalogId :: Lens.Lens' CreateLFTag (Prelude.Maybe Prelude.Text)
+createLFTag_catalogId = Lens.lens (\CreateLFTag' {catalogId} -> catalogId) (\s@CreateLFTag' {} a -> s {catalogId = a} :: CreateLFTag)
+
+-- | The key-name for the LF-tag.
+createLFTag_tagKey :: Lens.Lens' CreateLFTag Prelude.Text
+createLFTag_tagKey = Lens.lens (\CreateLFTag' {tagKey} -> tagKey) (\s@CreateLFTag' {} a -> s {tagKey = a} :: CreateLFTag)
+
+-- | A list of possible values an attribute can take.
+createLFTag_tagValues :: Lens.Lens' CreateLFTag (Prelude.NonEmpty Prelude.Text)
+createLFTag_tagValues = Lens.lens (\CreateLFTag' {tagValues} -> tagValues) (\s@CreateLFTag' {} a -> s {tagValues = a} :: CreateLFTag) Prelude.. Lens.coerced
+
+instance Core.AWSRequest CreateLFTag where
+  type AWSResponse CreateLFTag = CreateLFTagResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          CreateLFTagResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateLFTag where
+  hashWithSalt _salt CreateLFTag' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` tagKey
+      `Prelude.hashWithSalt` tagValues
+
+instance Prelude.NFData CreateLFTag where
+  rnf CreateLFTag' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf tagKey
+      `Prelude.seq` Prelude.rnf tagValues
+
+instance Data.ToHeaders CreateLFTag where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateLFTag where
+  toJSON CreateLFTag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("TagKey" Data..= tagKey),
+            Prelude.Just ("TagValues" Data..= tagValues)
+          ]
+      )
+
+instance Data.ToPath CreateLFTag where
+  toPath = Prelude.const "/CreateLFTag"
+
+instance Data.ToQuery CreateLFTag where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateLFTagResponse' smart constructor.
+data CreateLFTagResponse = CreateLFTagResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateLFTagResponse' 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', 'createLFTagResponse_httpStatus' - The response's http status code.
+newCreateLFTagResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateLFTagResponse
+newCreateLFTagResponse pHttpStatus_ =
+  CreateLFTagResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+createLFTagResponse_httpStatus :: Lens.Lens' CreateLFTagResponse Prelude.Int
+createLFTagResponse_httpStatus = Lens.lens (\CreateLFTagResponse' {httpStatus} -> httpStatus) (\s@CreateLFTagResponse' {} a -> s {httpStatus = a} :: CreateLFTagResponse)
+
+instance Prelude.NFData CreateLFTagResponse where
+  rnf CreateLFTagResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/DeleteDataCellsFilter.hs b/gen/Amazonka/LakeFormation/DeleteDataCellsFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/DeleteDataCellsFilter.hs
@@ -0,0 +1,196 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.DeleteDataCellsFilter
+-- 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 data cell filter.
+module Amazonka.LakeFormation.DeleteDataCellsFilter
+  ( -- * Creating a Request
+    DeleteDataCellsFilter (..),
+    newDeleteDataCellsFilter,
+
+    -- * Request Lenses
+    deleteDataCellsFilter_databaseName,
+    deleteDataCellsFilter_name,
+    deleteDataCellsFilter_tableCatalogId,
+    deleteDataCellsFilter_tableName,
+
+    -- * Destructuring the Response
+    DeleteDataCellsFilterResponse (..),
+    newDeleteDataCellsFilterResponse,
+
+    -- * Response Lenses
+    deleteDataCellsFilterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteDataCellsFilter' smart constructor.
+data DeleteDataCellsFilter = DeleteDataCellsFilter'
+  { -- | A database in the Glue Data Catalog.
+    databaseName :: Prelude.Maybe Prelude.Text,
+    -- | The name given by the user to the data filter cell.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the catalog to which the table belongs.
+    tableCatalogId :: Prelude.Maybe Prelude.Text,
+    -- | A table in the database.
+    tableName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDataCellsFilter' 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', 'deleteDataCellsFilter_databaseName' - A database in the Glue Data Catalog.
+--
+-- 'name', 'deleteDataCellsFilter_name' - The name given by the user to the data filter cell.
+--
+-- 'tableCatalogId', 'deleteDataCellsFilter_tableCatalogId' - The ID of the catalog to which the table belongs.
+--
+-- 'tableName', 'deleteDataCellsFilter_tableName' - A table in the database.
+newDeleteDataCellsFilter ::
+  DeleteDataCellsFilter
+newDeleteDataCellsFilter =
+  DeleteDataCellsFilter'
+    { databaseName =
+        Prelude.Nothing,
+      name = Prelude.Nothing,
+      tableCatalogId = Prelude.Nothing,
+      tableName = Prelude.Nothing
+    }
+
+-- | A database in the Glue Data Catalog.
+deleteDataCellsFilter_databaseName :: Lens.Lens' DeleteDataCellsFilter (Prelude.Maybe Prelude.Text)
+deleteDataCellsFilter_databaseName = Lens.lens (\DeleteDataCellsFilter' {databaseName} -> databaseName) (\s@DeleteDataCellsFilter' {} a -> s {databaseName = a} :: DeleteDataCellsFilter)
+
+-- | The name given by the user to the data filter cell.
+deleteDataCellsFilter_name :: Lens.Lens' DeleteDataCellsFilter (Prelude.Maybe Prelude.Text)
+deleteDataCellsFilter_name = Lens.lens (\DeleteDataCellsFilter' {name} -> name) (\s@DeleteDataCellsFilter' {} a -> s {name = a} :: DeleteDataCellsFilter)
+
+-- | The ID of the catalog to which the table belongs.
+deleteDataCellsFilter_tableCatalogId :: Lens.Lens' DeleteDataCellsFilter (Prelude.Maybe Prelude.Text)
+deleteDataCellsFilter_tableCatalogId = Lens.lens (\DeleteDataCellsFilter' {tableCatalogId} -> tableCatalogId) (\s@DeleteDataCellsFilter' {} a -> s {tableCatalogId = a} :: DeleteDataCellsFilter)
+
+-- | A table in the database.
+deleteDataCellsFilter_tableName :: Lens.Lens' DeleteDataCellsFilter (Prelude.Maybe Prelude.Text)
+deleteDataCellsFilter_tableName = Lens.lens (\DeleteDataCellsFilter' {tableName} -> tableName) (\s@DeleteDataCellsFilter' {} a -> s {tableName = a} :: DeleteDataCellsFilter)
+
+instance Core.AWSRequest DeleteDataCellsFilter where
+  type
+    AWSResponse DeleteDataCellsFilter =
+      DeleteDataCellsFilterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteDataCellsFilterResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteDataCellsFilter where
+  hashWithSalt _salt DeleteDataCellsFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` tableCatalogId
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData DeleteDataCellsFilter where
+  rnf DeleteDataCellsFilter' {..} =
+    Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf tableCatalogId
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders DeleteDataCellsFilter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteDataCellsFilter where
+  toJSON DeleteDataCellsFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DatabaseName" Data..=) Prelude.<$> databaseName,
+            ("Name" Data..=) Prelude.<$> name,
+            ("TableCatalogId" Data..=)
+              Prelude.<$> tableCatalogId,
+            ("TableName" Data..=) Prelude.<$> tableName
+          ]
+      )
+
+instance Data.ToPath DeleteDataCellsFilter where
+  toPath = Prelude.const "/DeleteDataCellsFilter"
+
+instance Data.ToQuery DeleteDataCellsFilter where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteDataCellsFilterResponse' smart constructor.
+data DeleteDataCellsFilterResponse = DeleteDataCellsFilterResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDataCellsFilterResponse' 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', 'deleteDataCellsFilterResponse_httpStatus' - The response's http status code.
+newDeleteDataCellsFilterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteDataCellsFilterResponse
+newDeleteDataCellsFilterResponse pHttpStatus_ =
+  DeleteDataCellsFilterResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteDataCellsFilterResponse_httpStatus :: Lens.Lens' DeleteDataCellsFilterResponse Prelude.Int
+deleteDataCellsFilterResponse_httpStatus = Lens.lens (\DeleteDataCellsFilterResponse' {httpStatus} -> httpStatus) (\s@DeleteDataCellsFilterResponse' {} a -> s {httpStatus = a} :: DeleteDataCellsFilterResponse)
+
+instance Prelude.NFData DeleteDataCellsFilterResponse where
+  rnf DeleteDataCellsFilterResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/DeleteLFTag.hs b/gen/Amazonka/LakeFormation/DeleteLFTag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/DeleteLFTag.hs
@@ -0,0 +1,178 @@
+{-# 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.LakeFormation.DeleteLFTag
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the specified LF-tag given a key name. If the input parameter
+-- tag key was not found, then the operation will throw an exception. When
+-- you delete an LF-tag, the @LFTagPolicy@ attached to the LF-tag becomes
+-- invalid. If the deleted LF-tag was still assigned to any resource, the
+-- tag policy attach to the deleted LF-tag will no longer be applied to the
+-- resource.
+module Amazonka.LakeFormation.DeleteLFTag
+  ( -- * Creating a Request
+    DeleteLFTag (..),
+    newDeleteLFTag,
+
+    -- * Request Lenses
+    deleteLFTag_catalogId,
+    deleteLFTag_tagKey,
+
+    -- * Destructuring the Response
+    DeleteLFTagResponse (..),
+    newDeleteLFTagResponse,
+
+    -- * Response Lenses
+    deleteLFTagResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteLFTag' smart constructor.
+data DeleteLFTag = DeleteLFTag'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The key-name for the LF-tag to delete.
+    tagKey :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteLFTag' 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:
+--
+-- 'catalogId', 'deleteLFTag_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'tagKey', 'deleteLFTag_tagKey' - The key-name for the LF-tag to delete.
+newDeleteLFTag ::
+  -- | 'tagKey'
+  Prelude.Text ->
+  DeleteLFTag
+newDeleteLFTag pTagKey_ =
+  DeleteLFTag'
+    { catalogId = Prelude.Nothing,
+      tagKey = pTagKey_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+deleteLFTag_catalogId :: Lens.Lens' DeleteLFTag (Prelude.Maybe Prelude.Text)
+deleteLFTag_catalogId = Lens.lens (\DeleteLFTag' {catalogId} -> catalogId) (\s@DeleteLFTag' {} a -> s {catalogId = a} :: DeleteLFTag)
+
+-- | The key-name for the LF-tag to delete.
+deleteLFTag_tagKey :: Lens.Lens' DeleteLFTag Prelude.Text
+deleteLFTag_tagKey = Lens.lens (\DeleteLFTag' {tagKey} -> tagKey) (\s@DeleteLFTag' {} a -> s {tagKey = a} :: DeleteLFTag)
+
+instance Core.AWSRequest DeleteLFTag where
+  type AWSResponse DeleteLFTag = DeleteLFTagResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteLFTagResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteLFTag where
+  hashWithSalt _salt DeleteLFTag' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` tagKey
+
+instance Prelude.NFData DeleteLFTag where
+  rnf DeleteLFTag' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf tagKey
+
+instance Data.ToHeaders DeleteLFTag where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteLFTag where
+  toJSON DeleteLFTag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("TagKey" Data..= tagKey)
+          ]
+      )
+
+instance Data.ToPath DeleteLFTag where
+  toPath = Prelude.const "/DeleteLFTag"
+
+instance Data.ToQuery DeleteLFTag where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteLFTagResponse' smart constructor.
+data DeleteLFTagResponse = DeleteLFTagResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteLFTagResponse' 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', 'deleteLFTagResponse_httpStatus' - The response's http status code.
+newDeleteLFTagResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteLFTagResponse
+newDeleteLFTagResponse pHttpStatus_ =
+  DeleteLFTagResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteLFTagResponse_httpStatus :: Lens.Lens' DeleteLFTagResponse Prelude.Int
+deleteLFTagResponse_httpStatus = Lens.lens (\DeleteLFTagResponse' {httpStatus} -> httpStatus) (\s@DeleteLFTagResponse' {} a -> s {httpStatus = a} :: DeleteLFTagResponse)
+
+instance Prelude.NFData DeleteLFTagResponse where
+  rnf DeleteLFTagResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/DeleteObjectsOnCancel.hs b/gen/Amazonka/LakeFormation/DeleteObjectsOnCancel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/DeleteObjectsOnCancel.hs
@@ -0,0 +1,234 @@
+{-# 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.LakeFormation.DeleteObjectsOnCancel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- For a specific governed table, provides a list of Amazon S3 objects that
+-- will be written during the current transaction and that can be
+-- automatically deleted if the transaction is canceled. Without this call,
+-- no Amazon S3 objects are automatically deleted when a transaction
+-- cancels.
+--
+-- The Glue ETL library function @write_dynamic_frame.from_catalog()@
+-- includes an option to automatically call @DeleteObjectsOnCancel@ before
+-- writes. For more information, see
+-- <https://docs.aws.amazon.com/lake-formation/latest/dg/transactions-data-operations.html#rolling-back-writes Rolling Back Amazon S3 Writes>.
+module Amazonka.LakeFormation.DeleteObjectsOnCancel
+  ( -- * Creating a Request
+    DeleteObjectsOnCancel (..),
+    newDeleteObjectsOnCancel,
+
+    -- * Request Lenses
+    deleteObjectsOnCancel_catalogId,
+    deleteObjectsOnCancel_databaseName,
+    deleteObjectsOnCancel_tableName,
+    deleteObjectsOnCancel_transactionId,
+    deleteObjectsOnCancel_objects,
+
+    -- * Destructuring the Response
+    DeleteObjectsOnCancelResponse (..),
+    newDeleteObjectsOnCancelResponse,
+
+    -- * Response Lenses
+    deleteObjectsOnCancelResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteObjectsOnCancel' smart constructor.
+data DeleteObjectsOnCancel = DeleteObjectsOnCancel'
+  { -- | The Glue data catalog that contains the governed table. Defaults to the
+    -- current account ID.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The database that contains the governed table.
+    databaseName :: Prelude.Text,
+    -- | The name of the governed table.
+    tableName :: Prelude.Text,
+    -- | ID of the transaction that the writes occur in.
+    transactionId :: Prelude.Text,
+    -- | A list of VirtualObject structures, which indicates the Amazon S3
+    -- objects to be deleted if the transaction cancels.
+    objects :: Prelude.NonEmpty VirtualObject
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteObjectsOnCancel' 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:
+--
+-- 'catalogId', 'deleteObjectsOnCancel_catalogId' - The Glue data catalog that contains the governed table. Defaults to the
+-- current account ID.
+--
+-- 'databaseName', 'deleteObjectsOnCancel_databaseName' - The database that contains the governed table.
+--
+-- 'tableName', 'deleteObjectsOnCancel_tableName' - The name of the governed table.
+--
+-- 'transactionId', 'deleteObjectsOnCancel_transactionId' - ID of the transaction that the writes occur in.
+--
+-- 'objects', 'deleteObjectsOnCancel_objects' - A list of VirtualObject structures, which indicates the Amazon S3
+-- objects to be deleted if the transaction cancels.
+newDeleteObjectsOnCancel ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  -- | 'transactionId'
+  Prelude.Text ->
+  -- | 'objects'
+  Prelude.NonEmpty VirtualObject ->
+  DeleteObjectsOnCancel
+newDeleteObjectsOnCancel
+  pDatabaseName_
+  pTableName_
+  pTransactionId_
+  pObjects_ =
+    DeleteObjectsOnCancel'
+      { catalogId = Prelude.Nothing,
+        databaseName = pDatabaseName_,
+        tableName = pTableName_,
+        transactionId = pTransactionId_,
+        objects = Lens.coerced Lens.# pObjects_
+      }
+
+-- | The Glue data catalog that contains the governed table. Defaults to the
+-- current account ID.
+deleteObjectsOnCancel_catalogId :: Lens.Lens' DeleteObjectsOnCancel (Prelude.Maybe Prelude.Text)
+deleteObjectsOnCancel_catalogId = Lens.lens (\DeleteObjectsOnCancel' {catalogId} -> catalogId) (\s@DeleteObjectsOnCancel' {} a -> s {catalogId = a} :: DeleteObjectsOnCancel)
+
+-- | The database that contains the governed table.
+deleteObjectsOnCancel_databaseName :: Lens.Lens' DeleteObjectsOnCancel Prelude.Text
+deleteObjectsOnCancel_databaseName = Lens.lens (\DeleteObjectsOnCancel' {databaseName} -> databaseName) (\s@DeleteObjectsOnCancel' {} a -> s {databaseName = a} :: DeleteObjectsOnCancel)
+
+-- | The name of the governed table.
+deleteObjectsOnCancel_tableName :: Lens.Lens' DeleteObjectsOnCancel Prelude.Text
+deleteObjectsOnCancel_tableName = Lens.lens (\DeleteObjectsOnCancel' {tableName} -> tableName) (\s@DeleteObjectsOnCancel' {} a -> s {tableName = a} :: DeleteObjectsOnCancel)
+
+-- | ID of the transaction that the writes occur in.
+deleteObjectsOnCancel_transactionId :: Lens.Lens' DeleteObjectsOnCancel Prelude.Text
+deleteObjectsOnCancel_transactionId = Lens.lens (\DeleteObjectsOnCancel' {transactionId} -> transactionId) (\s@DeleteObjectsOnCancel' {} a -> s {transactionId = a} :: DeleteObjectsOnCancel)
+
+-- | A list of VirtualObject structures, which indicates the Amazon S3
+-- objects to be deleted if the transaction cancels.
+deleteObjectsOnCancel_objects :: Lens.Lens' DeleteObjectsOnCancel (Prelude.NonEmpty VirtualObject)
+deleteObjectsOnCancel_objects = Lens.lens (\DeleteObjectsOnCancel' {objects} -> objects) (\s@DeleteObjectsOnCancel' {} a -> s {objects = a} :: DeleteObjectsOnCancel) Prelude.. Lens.coerced
+
+instance Core.AWSRequest DeleteObjectsOnCancel where
+  type
+    AWSResponse DeleteObjectsOnCancel =
+      DeleteObjectsOnCancelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteObjectsOnCancelResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteObjectsOnCancel where
+  hashWithSalt _salt DeleteObjectsOnCancel' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+      `Prelude.hashWithSalt` transactionId
+      `Prelude.hashWithSalt` objects
+
+instance Prelude.NFData DeleteObjectsOnCancel where
+  rnf DeleteObjectsOnCancel' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+      `Prelude.seq` Prelude.rnf transactionId
+      `Prelude.seq` Prelude.rnf objects
+
+instance Data.ToHeaders DeleteObjectsOnCancel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteObjectsOnCancel where
+  toJSON DeleteObjectsOnCancel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("TableName" Data..= tableName),
+            Prelude.Just ("TransactionId" Data..= transactionId),
+            Prelude.Just ("Objects" Data..= objects)
+          ]
+      )
+
+instance Data.ToPath DeleteObjectsOnCancel where
+  toPath = Prelude.const "/DeleteObjectsOnCancel"
+
+instance Data.ToQuery DeleteObjectsOnCancel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteObjectsOnCancelResponse' smart constructor.
+data DeleteObjectsOnCancelResponse = DeleteObjectsOnCancelResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteObjectsOnCancelResponse' 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', 'deleteObjectsOnCancelResponse_httpStatus' - The response's http status code.
+newDeleteObjectsOnCancelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteObjectsOnCancelResponse
+newDeleteObjectsOnCancelResponse pHttpStatus_ =
+  DeleteObjectsOnCancelResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteObjectsOnCancelResponse_httpStatus :: Lens.Lens' DeleteObjectsOnCancelResponse Prelude.Int
+deleteObjectsOnCancelResponse_httpStatus = Lens.lens (\DeleteObjectsOnCancelResponse' {httpStatus} -> httpStatus) (\s@DeleteObjectsOnCancelResponse' {} a -> s {httpStatus = a} :: DeleteObjectsOnCancelResponse)
+
+instance Prelude.NFData DeleteObjectsOnCancelResponse where
+  rnf DeleteObjectsOnCancelResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/DeregisterResource.hs b/gen/Amazonka/LakeFormation/DeregisterResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/DeregisterResource.hs
@@ -0,0 +1,158 @@
+{-# 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.LakeFormation.DeregisterResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deregisters the resource as managed by the Data Catalog.
+--
+-- When you deregister a path, Lake Formation removes the path from the
+-- inline policy attached to your service-linked role.
+module Amazonka.LakeFormation.DeregisterResource
+  ( -- * Creating a Request
+    DeregisterResource (..),
+    newDeregisterResource,
+
+    -- * Request Lenses
+    deregisterResource_resourceArn,
+
+    -- * Destructuring the Response
+    DeregisterResourceResponse (..),
+    newDeregisterResourceResponse,
+
+    -- * Response Lenses
+    deregisterResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeregisterResource' smart constructor.
+data DeregisterResource = DeregisterResource'
+  { -- | The Amazon Resource Name (ARN) of the resource that you want to
+    -- deregister.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeregisterResource' 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', 'deregisterResource_resourceArn' - The Amazon Resource Name (ARN) of the resource that you want to
+-- deregister.
+newDeregisterResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  DeregisterResource
+newDeregisterResource pResourceArn_ =
+  DeregisterResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) of the resource that you want to
+-- deregister.
+deregisterResource_resourceArn :: Lens.Lens' DeregisterResource Prelude.Text
+deregisterResource_resourceArn = Lens.lens (\DeregisterResource' {resourceArn} -> resourceArn) (\s@DeregisterResource' {} a -> s {resourceArn = a} :: DeregisterResource)
+
+instance Core.AWSRequest DeregisterResource where
+  type
+    AWSResponse DeregisterResource =
+      DeregisterResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeregisterResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeregisterResource where
+  hashWithSalt _salt DeregisterResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData DeregisterResource where
+  rnf DeregisterResource' {..} = Prelude.rnf resourceArn
+
+instance Data.ToHeaders DeregisterResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeregisterResource where
+  toJSON DeregisterResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ResourceArn" Data..= resourceArn)]
+      )
+
+instance Data.ToPath DeregisterResource where
+  toPath = Prelude.const "/DeregisterResource"
+
+instance Data.ToQuery DeregisterResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeregisterResourceResponse' smart constructor.
+data DeregisterResourceResponse = DeregisterResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeregisterResourceResponse' 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', 'deregisterResourceResponse_httpStatus' - The response's http status code.
+newDeregisterResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeregisterResourceResponse
+newDeregisterResourceResponse pHttpStatus_ =
+  DeregisterResourceResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deregisterResourceResponse_httpStatus :: Lens.Lens' DeregisterResourceResponse Prelude.Int
+deregisterResourceResponse_httpStatus = Lens.lens (\DeregisterResourceResponse' {httpStatus} -> httpStatus) (\s@DeregisterResourceResponse' {} a -> s {httpStatus = a} :: DeregisterResourceResponse)
+
+instance Prelude.NFData DeregisterResourceResponse where
+  rnf DeregisterResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/DescribeResource.hs b/gen/Amazonka/LakeFormation/DescribeResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/DescribeResource.hs
@@ -0,0 +1,165 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.DescribeResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the current data access role for the given resource registered
+-- in Lake Formation.
+module Amazonka.LakeFormation.DescribeResource
+  ( -- * Creating a Request
+    DescribeResource (..),
+    newDescribeResource,
+
+    -- * Request Lenses
+    describeResource_resourceArn,
+
+    -- * Destructuring the Response
+    DescribeResourceResponse (..),
+    newDescribeResourceResponse,
+
+    -- * Response Lenses
+    describeResourceResponse_resourceInfo,
+    describeResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeResource' smart constructor.
+data DescribeResource = DescribeResource'
+  { -- | The resource ARN.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeResource' 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', 'describeResource_resourceArn' - The resource ARN.
+newDescribeResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  DescribeResource
+newDescribeResource pResourceArn_ =
+  DescribeResource' {resourceArn = pResourceArn_}
+
+-- | The resource ARN.
+describeResource_resourceArn :: Lens.Lens' DescribeResource Prelude.Text
+describeResource_resourceArn = Lens.lens (\DescribeResource' {resourceArn} -> resourceArn) (\s@DescribeResource' {} a -> s {resourceArn = a} :: DescribeResource)
+
+instance Core.AWSRequest DescribeResource where
+  type
+    AWSResponse DescribeResource =
+      DescribeResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeResourceResponse'
+            Prelude.<$> (x Data..?> "ResourceInfo")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeResource where
+  hashWithSalt _salt DescribeResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData DescribeResource where
+  rnf DescribeResource' {..} = Prelude.rnf resourceArn
+
+instance Data.ToHeaders DescribeResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeResource where
+  toJSON DescribeResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ResourceArn" Data..= resourceArn)]
+      )
+
+instance Data.ToPath DescribeResource where
+  toPath = Prelude.const "/DescribeResource"
+
+instance Data.ToQuery DescribeResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeResourceResponse' smart constructor.
+data DescribeResourceResponse = DescribeResourceResponse'
+  { -- | A structure containing information about an Lake Formation resource.
+    resourceInfo :: Prelude.Maybe ResourceInfo,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeResourceResponse' 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:
+--
+-- 'resourceInfo', 'describeResourceResponse_resourceInfo' - A structure containing information about an Lake Formation resource.
+--
+-- 'httpStatus', 'describeResourceResponse_httpStatus' - The response's http status code.
+newDescribeResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeResourceResponse
+newDescribeResourceResponse pHttpStatus_ =
+  DescribeResourceResponse'
+    { resourceInfo =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A structure containing information about an Lake Formation resource.
+describeResourceResponse_resourceInfo :: Lens.Lens' DescribeResourceResponse (Prelude.Maybe ResourceInfo)
+describeResourceResponse_resourceInfo = Lens.lens (\DescribeResourceResponse' {resourceInfo} -> resourceInfo) (\s@DescribeResourceResponse' {} a -> s {resourceInfo = a} :: DescribeResourceResponse)
+
+-- | The response's http status code.
+describeResourceResponse_httpStatus :: Lens.Lens' DescribeResourceResponse Prelude.Int
+describeResourceResponse_httpStatus = Lens.lens (\DescribeResourceResponse' {httpStatus} -> httpStatus) (\s@DescribeResourceResponse' {} a -> s {httpStatus = a} :: DescribeResourceResponse)
+
+instance Prelude.NFData DescribeResourceResponse where
+  rnf DescribeResourceResponse' {..} =
+    Prelude.rnf resourceInfo
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/DescribeTransaction.hs b/gen/Amazonka/LakeFormation/DescribeTransaction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/DescribeTransaction.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.LakeFormation.DescribeTransaction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the details of a single transaction.
+module Amazonka.LakeFormation.DescribeTransaction
+  ( -- * Creating a Request
+    DescribeTransaction (..),
+    newDescribeTransaction,
+
+    -- * Request Lenses
+    describeTransaction_transactionId,
+
+    -- * Destructuring the Response
+    DescribeTransactionResponse (..),
+    newDescribeTransactionResponse,
+
+    -- * Response Lenses
+    describeTransactionResponse_transactionDescription,
+    describeTransactionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeTransaction' smart constructor.
+data DescribeTransaction = DescribeTransaction'
+  { -- | The transaction for which to return status.
+    transactionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeTransaction' 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:
+--
+-- 'transactionId', 'describeTransaction_transactionId' - The transaction for which to return status.
+newDescribeTransaction ::
+  -- | 'transactionId'
+  Prelude.Text ->
+  DescribeTransaction
+newDescribeTransaction pTransactionId_ =
+  DescribeTransaction'
+    { transactionId =
+        pTransactionId_
+    }
+
+-- | The transaction for which to return status.
+describeTransaction_transactionId :: Lens.Lens' DescribeTransaction Prelude.Text
+describeTransaction_transactionId = Lens.lens (\DescribeTransaction' {transactionId} -> transactionId) (\s@DescribeTransaction' {} a -> s {transactionId = a} :: DescribeTransaction)
+
+instance Core.AWSRequest DescribeTransaction where
+  type
+    AWSResponse DescribeTransaction =
+      DescribeTransactionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeTransactionResponse'
+            Prelude.<$> (x Data..?> "TransactionDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeTransaction where
+  hashWithSalt _salt DescribeTransaction' {..} =
+    _salt `Prelude.hashWithSalt` transactionId
+
+instance Prelude.NFData DescribeTransaction where
+  rnf DescribeTransaction' {..} =
+    Prelude.rnf transactionId
+
+instance Data.ToHeaders DescribeTransaction where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeTransaction where
+  toJSON DescribeTransaction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("TransactionId" Data..= transactionId)
+          ]
+      )
+
+instance Data.ToPath DescribeTransaction where
+  toPath = Prelude.const "/DescribeTransaction"
+
+instance Data.ToQuery DescribeTransaction where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeTransactionResponse' smart constructor.
+data DescribeTransactionResponse = DescribeTransactionResponse'
+  { -- | Returns a @TransactionDescription@ object containing information about
+    -- the transaction.
+    transactionDescription :: Prelude.Maybe TransactionDescription,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeTransactionResponse' 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:
+--
+-- 'transactionDescription', 'describeTransactionResponse_transactionDescription' - Returns a @TransactionDescription@ object containing information about
+-- the transaction.
+--
+-- 'httpStatus', 'describeTransactionResponse_httpStatus' - The response's http status code.
+newDescribeTransactionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeTransactionResponse
+newDescribeTransactionResponse pHttpStatus_ =
+  DescribeTransactionResponse'
+    { transactionDescription =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Returns a @TransactionDescription@ object containing information about
+-- the transaction.
+describeTransactionResponse_transactionDescription :: Lens.Lens' DescribeTransactionResponse (Prelude.Maybe TransactionDescription)
+describeTransactionResponse_transactionDescription = Lens.lens (\DescribeTransactionResponse' {transactionDescription} -> transactionDescription) (\s@DescribeTransactionResponse' {} a -> s {transactionDescription = a} :: DescribeTransactionResponse)
+
+-- | The response's http status code.
+describeTransactionResponse_httpStatus :: Lens.Lens' DescribeTransactionResponse Prelude.Int
+describeTransactionResponse_httpStatus = Lens.lens (\DescribeTransactionResponse' {httpStatus} -> httpStatus) (\s@DescribeTransactionResponse' {} a -> s {httpStatus = a} :: DescribeTransactionResponse)
+
+instance Prelude.NFData DescribeTransactionResponse where
+  rnf DescribeTransactionResponse' {..} =
+    Prelude.rnf transactionDescription
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/ExtendTransaction.hs b/gen/Amazonka/LakeFormation/ExtendTransaction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/ExtendTransaction.hs
@@ -0,0 +1,157 @@
+{-# 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.LakeFormation.ExtendTransaction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Indicates to the service that the specified transaction is still active
+-- and should not be treated as idle and aborted.
+--
+-- Write transactions that remain idle for a long period are automatically
+-- aborted unless explicitly extended.
+module Amazonka.LakeFormation.ExtendTransaction
+  ( -- * Creating a Request
+    ExtendTransaction (..),
+    newExtendTransaction,
+
+    -- * Request Lenses
+    extendTransaction_transactionId,
+
+    -- * Destructuring the Response
+    ExtendTransactionResponse (..),
+    newExtendTransactionResponse,
+
+    -- * Response Lenses
+    extendTransactionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newExtendTransaction' smart constructor.
+data ExtendTransaction = ExtendTransaction'
+  { -- | The transaction to extend.
+    transactionId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExtendTransaction' 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:
+--
+-- 'transactionId', 'extendTransaction_transactionId' - The transaction to extend.
+newExtendTransaction ::
+  ExtendTransaction
+newExtendTransaction =
+  ExtendTransaction' {transactionId = Prelude.Nothing}
+
+-- | The transaction to extend.
+extendTransaction_transactionId :: Lens.Lens' ExtendTransaction (Prelude.Maybe Prelude.Text)
+extendTransaction_transactionId = Lens.lens (\ExtendTransaction' {transactionId} -> transactionId) (\s@ExtendTransaction' {} a -> s {transactionId = a} :: ExtendTransaction)
+
+instance Core.AWSRequest ExtendTransaction where
+  type
+    AWSResponse ExtendTransaction =
+      ExtendTransactionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          ExtendTransactionResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ExtendTransaction where
+  hashWithSalt _salt ExtendTransaction' {..} =
+    _salt `Prelude.hashWithSalt` transactionId
+
+instance Prelude.NFData ExtendTransaction where
+  rnf ExtendTransaction' {..} =
+    Prelude.rnf transactionId
+
+instance Data.ToHeaders ExtendTransaction where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ExtendTransaction where
+  toJSON ExtendTransaction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("TransactionId" Data..=)
+              Prelude.<$> transactionId
+          ]
+      )
+
+instance Data.ToPath ExtendTransaction where
+  toPath = Prelude.const "/ExtendTransaction"
+
+instance Data.ToQuery ExtendTransaction where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newExtendTransactionResponse' smart constructor.
+data ExtendTransactionResponse = ExtendTransactionResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExtendTransactionResponse' 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', 'extendTransactionResponse_httpStatus' - The response's http status code.
+newExtendTransactionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ExtendTransactionResponse
+newExtendTransactionResponse pHttpStatus_ =
+  ExtendTransactionResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+extendTransactionResponse_httpStatus :: Lens.Lens' ExtendTransactionResponse Prelude.Int
+extendTransactionResponse_httpStatus = Lens.lens (\ExtendTransactionResponse' {httpStatus} -> httpStatus) (\s@ExtendTransactionResponse' {} a -> s {httpStatus = a} :: ExtendTransactionResponse)
+
+instance Prelude.NFData ExtendTransactionResponse where
+  rnf ExtendTransactionResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/GetDataLakeSettings.hs b/gen/Amazonka/LakeFormation/GetDataLakeSettings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetDataLakeSettings.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.GetDataLakeSettings
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the list of the data lake administrators of a Lake
+-- Formation-managed data lake.
+module Amazonka.LakeFormation.GetDataLakeSettings
+  ( -- * Creating a Request
+    GetDataLakeSettings (..),
+    newGetDataLakeSettings,
+
+    -- * Request Lenses
+    getDataLakeSettings_catalogId,
+
+    -- * Destructuring the Response
+    GetDataLakeSettingsResponse (..),
+    newGetDataLakeSettingsResponse,
+
+    -- * Response Lenses
+    getDataLakeSettingsResponse_dataLakeSettings,
+    getDataLakeSettingsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetDataLakeSettings' smart constructor.
+data GetDataLakeSettings = GetDataLakeSettings'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDataLakeSettings' 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:
+--
+-- 'catalogId', 'getDataLakeSettings_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+newGetDataLakeSettings ::
+  GetDataLakeSettings
+newGetDataLakeSettings =
+  GetDataLakeSettings' {catalogId = Prelude.Nothing}
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+getDataLakeSettings_catalogId :: Lens.Lens' GetDataLakeSettings (Prelude.Maybe Prelude.Text)
+getDataLakeSettings_catalogId = Lens.lens (\GetDataLakeSettings' {catalogId} -> catalogId) (\s@GetDataLakeSettings' {} a -> s {catalogId = a} :: GetDataLakeSettings)
+
+instance Core.AWSRequest GetDataLakeSettings where
+  type
+    AWSResponse GetDataLakeSettings =
+      GetDataLakeSettingsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetDataLakeSettingsResponse'
+            Prelude.<$> (x Data..?> "DataLakeSettings")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetDataLakeSettings where
+  hashWithSalt _salt GetDataLakeSettings' {..} =
+    _salt `Prelude.hashWithSalt` catalogId
+
+instance Prelude.NFData GetDataLakeSettings where
+  rnf GetDataLakeSettings' {..} = Prelude.rnf catalogId
+
+instance Data.ToHeaders GetDataLakeSettings where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetDataLakeSettings where
+  toJSON GetDataLakeSettings' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("CatalogId" Data..=) Prelude.<$> catalogId]
+      )
+
+instance Data.ToPath GetDataLakeSettings where
+  toPath = Prelude.const "/GetDataLakeSettings"
+
+instance Data.ToQuery GetDataLakeSettings where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetDataLakeSettingsResponse' smart constructor.
+data GetDataLakeSettingsResponse = GetDataLakeSettingsResponse'
+  { -- | A structure representing a list of Lake Formation principals designated
+    -- as data lake administrators.
+    dataLakeSettings :: Prelude.Maybe DataLakeSettings,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDataLakeSettingsResponse' 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:
+--
+-- 'dataLakeSettings', 'getDataLakeSettingsResponse_dataLakeSettings' - A structure representing a list of Lake Formation principals designated
+-- as data lake administrators.
+--
+-- 'httpStatus', 'getDataLakeSettingsResponse_httpStatus' - The response's http status code.
+newGetDataLakeSettingsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetDataLakeSettingsResponse
+newGetDataLakeSettingsResponse pHttpStatus_ =
+  GetDataLakeSettingsResponse'
+    { dataLakeSettings =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A structure representing a list of Lake Formation principals designated
+-- as data lake administrators.
+getDataLakeSettingsResponse_dataLakeSettings :: Lens.Lens' GetDataLakeSettingsResponse (Prelude.Maybe DataLakeSettings)
+getDataLakeSettingsResponse_dataLakeSettings = Lens.lens (\GetDataLakeSettingsResponse' {dataLakeSettings} -> dataLakeSettings) (\s@GetDataLakeSettingsResponse' {} a -> s {dataLakeSettings = a} :: GetDataLakeSettingsResponse)
+
+-- | The response's http status code.
+getDataLakeSettingsResponse_httpStatus :: Lens.Lens' GetDataLakeSettingsResponse Prelude.Int
+getDataLakeSettingsResponse_httpStatus = Lens.lens (\GetDataLakeSettingsResponse' {httpStatus} -> httpStatus) (\s@GetDataLakeSettingsResponse' {} a -> s {httpStatus = a} :: GetDataLakeSettingsResponse)
+
+instance Prelude.NFData GetDataLakeSettingsResponse where
+  rnf GetDataLakeSettingsResponse' {..} =
+    Prelude.rnf dataLakeSettings
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/GetEffectivePermissionsForPath.hs b/gen/Amazonka/LakeFormation/GetEffectivePermissionsForPath.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetEffectivePermissionsForPath.hs
@@ -0,0 +1,264 @@
+{-# 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.LakeFormation.GetEffectivePermissionsForPath
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the Lake Formation permissions for a specified table or database
+-- resource located at a path in Amazon S3.
+-- @GetEffectivePermissionsForPath@ will not return databases and tables if
+-- the catalog is encrypted.
+module Amazonka.LakeFormation.GetEffectivePermissionsForPath
+  ( -- * Creating a Request
+    GetEffectivePermissionsForPath (..),
+    newGetEffectivePermissionsForPath,
+
+    -- * Request Lenses
+    getEffectivePermissionsForPath_catalogId,
+    getEffectivePermissionsForPath_maxResults,
+    getEffectivePermissionsForPath_nextToken,
+    getEffectivePermissionsForPath_resourceArn,
+
+    -- * Destructuring the Response
+    GetEffectivePermissionsForPathResponse (..),
+    newGetEffectivePermissionsForPathResponse,
+
+    -- * Response Lenses
+    getEffectivePermissionsForPathResponse_nextToken,
+    getEffectivePermissionsForPathResponse_permissions,
+    getEffectivePermissionsForPathResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetEffectivePermissionsForPath' smart constructor.
+data GetEffectivePermissionsForPath = GetEffectivePermissionsForPath'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A continuation token, if this is not the first call to retrieve this
+    -- list.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the resource for which you want to get
+    -- permissions.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetEffectivePermissionsForPath' 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:
+--
+-- 'catalogId', 'getEffectivePermissionsForPath_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'maxResults', 'getEffectivePermissionsForPath_maxResults' - The maximum number of results to return.
+--
+-- 'nextToken', 'getEffectivePermissionsForPath_nextToken' - A continuation token, if this is not the first call to retrieve this
+-- list.
+--
+-- 'resourceArn', 'getEffectivePermissionsForPath_resourceArn' - The Amazon Resource Name (ARN) of the resource for which you want to get
+-- permissions.
+newGetEffectivePermissionsForPath ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  GetEffectivePermissionsForPath
+newGetEffectivePermissionsForPath pResourceArn_ =
+  GetEffectivePermissionsForPath'
+    { catalogId =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      resourceArn = pResourceArn_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+getEffectivePermissionsForPath_catalogId :: Lens.Lens' GetEffectivePermissionsForPath (Prelude.Maybe Prelude.Text)
+getEffectivePermissionsForPath_catalogId = Lens.lens (\GetEffectivePermissionsForPath' {catalogId} -> catalogId) (\s@GetEffectivePermissionsForPath' {} a -> s {catalogId = a} :: GetEffectivePermissionsForPath)
+
+-- | The maximum number of results to return.
+getEffectivePermissionsForPath_maxResults :: Lens.Lens' GetEffectivePermissionsForPath (Prelude.Maybe Prelude.Natural)
+getEffectivePermissionsForPath_maxResults = Lens.lens (\GetEffectivePermissionsForPath' {maxResults} -> maxResults) (\s@GetEffectivePermissionsForPath' {} a -> s {maxResults = a} :: GetEffectivePermissionsForPath)
+
+-- | A continuation token, if this is not the first call to retrieve this
+-- list.
+getEffectivePermissionsForPath_nextToken :: Lens.Lens' GetEffectivePermissionsForPath (Prelude.Maybe Prelude.Text)
+getEffectivePermissionsForPath_nextToken = Lens.lens (\GetEffectivePermissionsForPath' {nextToken} -> nextToken) (\s@GetEffectivePermissionsForPath' {} a -> s {nextToken = a} :: GetEffectivePermissionsForPath)
+
+-- | The Amazon Resource Name (ARN) of the resource for which you want to get
+-- permissions.
+getEffectivePermissionsForPath_resourceArn :: Lens.Lens' GetEffectivePermissionsForPath Prelude.Text
+getEffectivePermissionsForPath_resourceArn = Lens.lens (\GetEffectivePermissionsForPath' {resourceArn} -> resourceArn) (\s@GetEffectivePermissionsForPath' {} a -> s {resourceArn = a} :: GetEffectivePermissionsForPath)
+
+instance
+  Core.AWSRequest
+    GetEffectivePermissionsForPath
+  where
+  type
+    AWSResponse GetEffectivePermissionsForPath =
+      GetEffectivePermissionsForPathResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetEffectivePermissionsForPathResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Permissions" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    GetEffectivePermissionsForPath
+  where
+  hashWithSalt
+    _salt
+    GetEffectivePermissionsForPath' {..} =
+      _salt
+        `Prelude.hashWithSalt` catalogId
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` resourceArn
+
+instance
+  Prelude.NFData
+    GetEffectivePermissionsForPath
+  where
+  rnf GetEffectivePermissionsForPath' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf resourceArn
+
+instance
+  Data.ToHeaders
+    GetEffectivePermissionsForPath
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetEffectivePermissionsForPath where
+  toJSON GetEffectivePermissionsForPath' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("ResourceArn" Data..= resourceArn)
+          ]
+      )
+
+instance Data.ToPath GetEffectivePermissionsForPath where
+  toPath =
+    Prelude.const "/GetEffectivePermissionsForPath"
+
+instance Data.ToQuery GetEffectivePermissionsForPath where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetEffectivePermissionsForPathResponse' smart constructor.
+data GetEffectivePermissionsForPathResponse = GetEffectivePermissionsForPathResponse'
+  { -- | A continuation token, if this is not the first call to retrieve this
+    -- list.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of the permissions for the specified table or database resource
+    -- located at the path in Amazon S3.
+    permissions :: Prelude.Maybe [PrincipalResourcePermissions],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetEffectivePermissionsForPathResponse' 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', 'getEffectivePermissionsForPathResponse_nextToken' - A continuation token, if this is not the first call to retrieve this
+-- list.
+--
+-- 'permissions', 'getEffectivePermissionsForPathResponse_permissions' - A list of the permissions for the specified table or database resource
+-- located at the path in Amazon S3.
+--
+-- 'httpStatus', 'getEffectivePermissionsForPathResponse_httpStatus' - The response's http status code.
+newGetEffectivePermissionsForPathResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetEffectivePermissionsForPathResponse
+newGetEffectivePermissionsForPathResponse
+  pHttpStatus_ =
+    GetEffectivePermissionsForPathResponse'
+      { nextToken =
+          Prelude.Nothing,
+        permissions = Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | A continuation token, if this is not the first call to retrieve this
+-- list.
+getEffectivePermissionsForPathResponse_nextToken :: Lens.Lens' GetEffectivePermissionsForPathResponse (Prelude.Maybe Prelude.Text)
+getEffectivePermissionsForPathResponse_nextToken = Lens.lens (\GetEffectivePermissionsForPathResponse' {nextToken} -> nextToken) (\s@GetEffectivePermissionsForPathResponse' {} a -> s {nextToken = a} :: GetEffectivePermissionsForPathResponse)
+
+-- | A list of the permissions for the specified table or database resource
+-- located at the path in Amazon S3.
+getEffectivePermissionsForPathResponse_permissions :: Lens.Lens' GetEffectivePermissionsForPathResponse (Prelude.Maybe [PrincipalResourcePermissions])
+getEffectivePermissionsForPathResponse_permissions = Lens.lens (\GetEffectivePermissionsForPathResponse' {permissions} -> permissions) (\s@GetEffectivePermissionsForPathResponse' {} a -> s {permissions = a} :: GetEffectivePermissionsForPathResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getEffectivePermissionsForPathResponse_httpStatus :: Lens.Lens' GetEffectivePermissionsForPathResponse Prelude.Int
+getEffectivePermissionsForPathResponse_httpStatus = Lens.lens (\GetEffectivePermissionsForPathResponse' {httpStatus} -> httpStatus) (\s@GetEffectivePermissionsForPathResponse' {} a -> s {httpStatus = a} :: GetEffectivePermissionsForPathResponse)
+
+instance
+  Prelude.NFData
+    GetEffectivePermissionsForPathResponse
+  where
+  rnf GetEffectivePermissionsForPathResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf permissions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/GetLFTag.hs b/gen/Amazonka/LakeFormation/GetLFTag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetLFTag.hs
@@ -0,0 +1,221 @@
+{-# 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.LakeFormation.GetLFTag
+-- 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 an LF-tag definition.
+module Amazonka.LakeFormation.GetLFTag
+  ( -- * Creating a Request
+    GetLFTag (..),
+    newGetLFTag,
+
+    -- * Request Lenses
+    getLFTag_catalogId,
+    getLFTag_tagKey,
+
+    -- * Destructuring the Response
+    GetLFTagResponse (..),
+    newGetLFTagResponse,
+
+    -- * Response Lenses
+    getLFTagResponse_catalogId,
+    getLFTagResponse_tagKey,
+    getLFTagResponse_tagValues,
+    getLFTagResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetLFTag' smart constructor.
+data GetLFTag = GetLFTag'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The key-name for the LF-tag.
+    tagKey :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetLFTag' 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:
+--
+-- 'catalogId', 'getLFTag_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'tagKey', 'getLFTag_tagKey' - The key-name for the LF-tag.
+newGetLFTag ::
+  -- | 'tagKey'
+  Prelude.Text ->
+  GetLFTag
+newGetLFTag pTagKey_ =
+  GetLFTag'
+    { catalogId = Prelude.Nothing,
+      tagKey = pTagKey_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+getLFTag_catalogId :: Lens.Lens' GetLFTag (Prelude.Maybe Prelude.Text)
+getLFTag_catalogId = Lens.lens (\GetLFTag' {catalogId} -> catalogId) (\s@GetLFTag' {} a -> s {catalogId = a} :: GetLFTag)
+
+-- | The key-name for the LF-tag.
+getLFTag_tagKey :: Lens.Lens' GetLFTag Prelude.Text
+getLFTag_tagKey = Lens.lens (\GetLFTag' {tagKey} -> tagKey) (\s@GetLFTag' {} a -> s {tagKey = a} :: GetLFTag)
+
+instance Core.AWSRequest GetLFTag where
+  type AWSResponse GetLFTag = GetLFTagResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetLFTagResponse'
+            Prelude.<$> (x Data..?> "CatalogId")
+            Prelude.<*> (x Data..?> "TagKey")
+            Prelude.<*> (x Data..?> "TagValues")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetLFTag where
+  hashWithSalt _salt GetLFTag' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` tagKey
+
+instance Prelude.NFData GetLFTag where
+  rnf GetLFTag' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf tagKey
+
+instance Data.ToHeaders GetLFTag where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetLFTag where
+  toJSON GetLFTag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("TagKey" Data..= tagKey)
+          ]
+      )
+
+instance Data.ToPath GetLFTag where
+  toPath = Prelude.const "/GetLFTag"
+
+instance Data.ToQuery GetLFTag where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetLFTagResponse' smart constructor.
+data GetLFTagResponse = GetLFTagResponse'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The key-name for the LF-tag.
+    tagKey :: Prelude.Maybe Prelude.Text,
+    -- | A list of possible values an attribute can take.
+    tagValues :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetLFTagResponse' 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:
+--
+-- 'catalogId', 'getLFTagResponse_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'tagKey', 'getLFTagResponse_tagKey' - The key-name for the LF-tag.
+--
+-- 'tagValues', 'getLFTagResponse_tagValues' - A list of possible values an attribute can take.
+--
+-- 'httpStatus', 'getLFTagResponse_httpStatus' - The response's http status code.
+newGetLFTagResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetLFTagResponse
+newGetLFTagResponse pHttpStatus_ =
+  GetLFTagResponse'
+    { catalogId = Prelude.Nothing,
+      tagKey = Prelude.Nothing,
+      tagValues = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+getLFTagResponse_catalogId :: Lens.Lens' GetLFTagResponse (Prelude.Maybe Prelude.Text)
+getLFTagResponse_catalogId = Lens.lens (\GetLFTagResponse' {catalogId} -> catalogId) (\s@GetLFTagResponse' {} a -> s {catalogId = a} :: GetLFTagResponse)
+
+-- | The key-name for the LF-tag.
+getLFTagResponse_tagKey :: Lens.Lens' GetLFTagResponse (Prelude.Maybe Prelude.Text)
+getLFTagResponse_tagKey = Lens.lens (\GetLFTagResponse' {tagKey} -> tagKey) (\s@GetLFTagResponse' {} a -> s {tagKey = a} :: GetLFTagResponse)
+
+-- | A list of possible values an attribute can take.
+getLFTagResponse_tagValues :: Lens.Lens' GetLFTagResponse (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+getLFTagResponse_tagValues = Lens.lens (\GetLFTagResponse' {tagValues} -> tagValues) (\s@GetLFTagResponse' {} a -> s {tagValues = a} :: GetLFTagResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getLFTagResponse_httpStatus :: Lens.Lens' GetLFTagResponse Prelude.Int
+getLFTagResponse_httpStatus = Lens.lens (\GetLFTagResponse' {httpStatus} -> httpStatus) (\s@GetLFTagResponse' {} a -> s {httpStatus = a} :: GetLFTagResponse)
+
+instance Prelude.NFData GetLFTagResponse where
+  rnf GetLFTagResponse' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf tagKey
+      `Prelude.seq` Prelude.rnf tagValues
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/GetQueryState.hs b/gen/Amazonka/LakeFormation/GetQueryState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetQueryState.hs
@@ -0,0 +1,215 @@
+{-# 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.LakeFormation.GetQueryState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the state of a query previously submitted. Clients are expected
+-- to poll @GetQueryState@ to monitor the current state of the planning
+-- before retrieving the work units. A query state is only visible to the
+-- principal that made the initial call to @StartQueryPlanning@.
+module Amazonka.LakeFormation.GetQueryState
+  ( -- * Creating a Request
+    GetQueryState (..),
+    newGetQueryState,
+
+    -- * Request Lenses
+    getQueryState_queryId,
+
+    -- * Destructuring the Response
+    GetQueryStateResponse (..),
+    newGetQueryStateResponse,
+
+    -- * Response Lenses
+    getQueryStateResponse_error,
+    getQueryStateResponse_httpStatus,
+    getQueryStateResponse_state,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetQueryState' smart constructor.
+data GetQueryState = GetQueryState'
+  { -- | The ID of the plan query operation.
+    queryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetQueryState' 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:
+--
+-- 'queryId', 'getQueryState_queryId' - The ID of the plan query operation.
+newGetQueryState ::
+  -- | 'queryId'
+  Prelude.Text ->
+  GetQueryState
+newGetQueryState pQueryId_ =
+  GetQueryState' {queryId = pQueryId_}
+
+-- | The ID of the plan query operation.
+getQueryState_queryId :: Lens.Lens' GetQueryState Prelude.Text
+getQueryState_queryId = Lens.lens (\GetQueryState' {queryId} -> queryId) (\s@GetQueryState' {} a -> s {queryId = a} :: GetQueryState)
+
+instance Core.AWSRequest GetQueryState where
+  type
+    AWSResponse GetQueryState =
+      GetQueryStateResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetQueryStateResponse'
+            Prelude.<$> (x Data..?> "Error")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "State")
+      )
+
+instance Prelude.Hashable GetQueryState where
+  hashWithSalt _salt GetQueryState' {..} =
+    _salt `Prelude.hashWithSalt` queryId
+
+instance Prelude.NFData GetQueryState where
+  rnf GetQueryState' {..} = Prelude.rnf queryId
+
+instance Data.ToHeaders GetQueryState where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetQueryState where
+  toJSON GetQueryState' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("QueryId" Data..= queryId)]
+      )
+
+instance Data.ToPath GetQueryState where
+  toPath = Prelude.const "/GetQueryState"
+
+instance Data.ToQuery GetQueryState where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | A structure for the output.
+--
+-- /See:/ 'newGetQueryStateResponse' smart constructor.
+data GetQueryStateResponse = GetQueryStateResponse'
+  { -- | An error message when the operation fails.
+    error :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The state of a query previously submitted. The possible states are:
+    --
+    -- -   PENDING: the query is pending.
+    --
+    -- -   WORKUNITS_AVAILABLE: some work units are ready for retrieval and
+    --     execution.
+    --
+    -- -   FINISHED: the query planning finished successfully, and all work
+    --     units are ready for retrieval and execution.
+    --
+    -- -   ERROR: an error occurred with the query, such as an invalid query ID
+    --     or a backend error.
+    state :: QueryStateString
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetQueryStateResponse' 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:
+--
+-- 'error', 'getQueryStateResponse_error' - An error message when the operation fails.
+--
+-- 'httpStatus', 'getQueryStateResponse_httpStatus' - The response's http status code.
+--
+-- 'state', 'getQueryStateResponse_state' - The state of a query previously submitted. The possible states are:
+--
+-- -   PENDING: the query is pending.
+--
+-- -   WORKUNITS_AVAILABLE: some work units are ready for retrieval and
+--     execution.
+--
+-- -   FINISHED: the query planning finished successfully, and all work
+--     units are ready for retrieval and execution.
+--
+-- -   ERROR: an error occurred with the query, such as an invalid query ID
+--     or a backend error.
+newGetQueryStateResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'state'
+  QueryStateString ->
+  GetQueryStateResponse
+newGetQueryStateResponse pHttpStatus_ pState_ =
+  GetQueryStateResponse'
+    { error = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      state = pState_
+    }
+
+-- | An error message when the operation fails.
+getQueryStateResponse_error :: Lens.Lens' GetQueryStateResponse (Prelude.Maybe Prelude.Text)
+getQueryStateResponse_error = Lens.lens (\GetQueryStateResponse' {error} -> error) (\s@GetQueryStateResponse' {} a -> s {error = a} :: GetQueryStateResponse)
+
+-- | The response's http status code.
+getQueryStateResponse_httpStatus :: Lens.Lens' GetQueryStateResponse Prelude.Int
+getQueryStateResponse_httpStatus = Lens.lens (\GetQueryStateResponse' {httpStatus} -> httpStatus) (\s@GetQueryStateResponse' {} a -> s {httpStatus = a} :: GetQueryStateResponse)
+
+-- | The state of a query previously submitted. The possible states are:
+--
+-- -   PENDING: the query is pending.
+--
+-- -   WORKUNITS_AVAILABLE: some work units are ready for retrieval and
+--     execution.
+--
+-- -   FINISHED: the query planning finished successfully, and all work
+--     units are ready for retrieval and execution.
+--
+-- -   ERROR: an error occurred with the query, such as an invalid query ID
+--     or a backend error.
+getQueryStateResponse_state :: Lens.Lens' GetQueryStateResponse QueryStateString
+getQueryStateResponse_state = Lens.lens (\GetQueryStateResponse' {state} -> state) (\s@GetQueryStateResponse' {} a -> s {state = a} :: GetQueryStateResponse)
+
+instance Prelude.NFData GetQueryStateResponse where
+  rnf GetQueryStateResponse' {..} =
+    Prelude.rnf error
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/LakeFormation/GetQueryStatistics.hs b/gen/Amazonka/LakeFormation/GetQueryStatistics.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetQueryStatistics.hs
@@ -0,0 +1,188 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.GetQueryStatistics
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves statistics on the planning and execution of a query.
+module Amazonka.LakeFormation.GetQueryStatistics
+  ( -- * Creating a Request
+    GetQueryStatistics (..),
+    newGetQueryStatistics,
+
+    -- * Request Lenses
+    getQueryStatistics_queryId,
+
+    -- * Destructuring the Response
+    GetQueryStatisticsResponse (..),
+    newGetQueryStatisticsResponse,
+
+    -- * Response Lenses
+    getQueryStatisticsResponse_executionStatistics,
+    getQueryStatisticsResponse_planningStatistics,
+    getQueryStatisticsResponse_querySubmissionTime,
+    getQueryStatisticsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetQueryStatistics' smart constructor.
+data GetQueryStatistics = GetQueryStatistics'
+  { -- | The ID of the plan query operation.
+    queryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetQueryStatistics' 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:
+--
+-- 'queryId', 'getQueryStatistics_queryId' - The ID of the plan query operation.
+newGetQueryStatistics ::
+  -- | 'queryId'
+  Prelude.Text ->
+  GetQueryStatistics
+newGetQueryStatistics pQueryId_ =
+  GetQueryStatistics' {queryId = pQueryId_}
+
+-- | The ID of the plan query operation.
+getQueryStatistics_queryId :: Lens.Lens' GetQueryStatistics Prelude.Text
+getQueryStatistics_queryId = Lens.lens (\GetQueryStatistics' {queryId} -> queryId) (\s@GetQueryStatistics' {} a -> s {queryId = a} :: GetQueryStatistics)
+
+instance Core.AWSRequest GetQueryStatistics where
+  type
+    AWSResponse GetQueryStatistics =
+      GetQueryStatisticsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetQueryStatisticsResponse'
+            Prelude.<$> (x Data..?> "ExecutionStatistics")
+            Prelude.<*> (x Data..?> "PlanningStatistics")
+            Prelude.<*> (x Data..?> "QuerySubmissionTime")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetQueryStatistics where
+  hashWithSalt _salt GetQueryStatistics' {..} =
+    _salt `Prelude.hashWithSalt` queryId
+
+instance Prelude.NFData GetQueryStatistics where
+  rnf GetQueryStatistics' {..} = Prelude.rnf queryId
+
+instance Data.ToHeaders GetQueryStatistics where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetQueryStatistics where
+  toJSON GetQueryStatistics' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("QueryId" Data..= queryId)]
+      )
+
+instance Data.ToPath GetQueryStatistics where
+  toPath = Prelude.const "/GetQueryStatistics"
+
+instance Data.ToQuery GetQueryStatistics where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetQueryStatisticsResponse' smart constructor.
+data GetQueryStatisticsResponse = GetQueryStatisticsResponse'
+  { -- | An @ExecutionStatistics@ structure containing execution statistics.
+    executionStatistics :: Prelude.Maybe ExecutionStatistics,
+    -- | A @PlanningStatistics@ structure containing query planning statistics.
+    planningStatistics :: Prelude.Maybe PlanningStatistics,
+    -- | The time that the query was submitted.
+    querySubmissionTime :: Prelude.Maybe Data.ISO8601,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetQueryStatisticsResponse' 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:
+--
+-- 'executionStatistics', 'getQueryStatisticsResponse_executionStatistics' - An @ExecutionStatistics@ structure containing execution statistics.
+--
+-- 'planningStatistics', 'getQueryStatisticsResponse_planningStatistics' - A @PlanningStatistics@ structure containing query planning statistics.
+--
+-- 'querySubmissionTime', 'getQueryStatisticsResponse_querySubmissionTime' - The time that the query was submitted.
+--
+-- 'httpStatus', 'getQueryStatisticsResponse_httpStatus' - The response's http status code.
+newGetQueryStatisticsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetQueryStatisticsResponse
+newGetQueryStatisticsResponse pHttpStatus_ =
+  GetQueryStatisticsResponse'
+    { executionStatistics =
+        Prelude.Nothing,
+      planningStatistics = Prelude.Nothing,
+      querySubmissionTime = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An @ExecutionStatistics@ structure containing execution statistics.
+getQueryStatisticsResponse_executionStatistics :: Lens.Lens' GetQueryStatisticsResponse (Prelude.Maybe ExecutionStatistics)
+getQueryStatisticsResponse_executionStatistics = Lens.lens (\GetQueryStatisticsResponse' {executionStatistics} -> executionStatistics) (\s@GetQueryStatisticsResponse' {} a -> s {executionStatistics = a} :: GetQueryStatisticsResponse)
+
+-- | A @PlanningStatistics@ structure containing query planning statistics.
+getQueryStatisticsResponse_planningStatistics :: Lens.Lens' GetQueryStatisticsResponse (Prelude.Maybe PlanningStatistics)
+getQueryStatisticsResponse_planningStatistics = Lens.lens (\GetQueryStatisticsResponse' {planningStatistics} -> planningStatistics) (\s@GetQueryStatisticsResponse' {} a -> s {planningStatistics = a} :: GetQueryStatisticsResponse)
+
+-- | The time that the query was submitted.
+getQueryStatisticsResponse_querySubmissionTime :: Lens.Lens' GetQueryStatisticsResponse (Prelude.Maybe Prelude.UTCTime)
+getQueryStatisticsResponse_querySubmissionTime = Lens.lens (\GetQueryStatisticsResponse' {querySubmissionTime} -> querySubmissionTime) (\s@GetQueryStatisticsResponse' {} a -> s {querySubmissionTime = a} :: GetQueryStatisticsResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The response's http status code.
+getQueryStatisticsResponse_httpStatus :: Lens.Lens' GetQueryStatisticsResponse Prelude.Int
+getQueryStatisticsResponse_httpStatus = Lens.lens (\GetQueryStatisticsResponse' {httpStatus} -> httpStatus) (\s@GetQueryStatisticsResponse' {} a -> s {httpStatus = a} :: GetQueryStatisticsResponse)
+
+instance Prelude.NFData GetQueryStatisticsResponse where
+  rnf GetQueryStatisticsResponse' {..} =
+    Prelude.rnf executionStatistics
+      `Prelude.seq` Prelude.rnf planningStatistics
+      `Prelude.seq` Prelude.rnf querySubmissionTime
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/GetResourceLFTags.hs b/gen/Amazonka/LakeFormation/GetResourceLFTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetResourceLFTags.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.LakeFormation.GetResourceLFTags
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the LF-tags applied to a resource.
+module Amazonka.LakeFormation.GetResourceLFTags
+  ( -- * Creating a Request
+    GetResourceLFTags (..),
+    newGetResourceLFTags,
+
+    -- * Request Lenses
+    getResourceLFTags_catalogId,
+    getResourceLFTags_showAssignedLFTags,
+    getResourceLFTags_resource,
+
+    -- * Destructuring the Response
+    GetResourceLFTagsResponse (..),
+    newGetResourceLFTagsResponse,
+
+    -- * Response Lenses
+    getResourceLFTagsResponse_lFTagOnDatabase,
+    getResourceLFTagsResponse_lFTagsOnColumns,
+    getResourceLFTagsResponse_lFTagsOnTable,
+    getResourceLFTagsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetResourceLFTags' smart constructor.
+data GetResourceLFTags = GetResourceLFTags'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | Indicates whether to show the assigned LF-tags.
+    showAssignedLFTags :: Prelude.Maybe Prelude.Bool,
+    -- | The database, table, or column resource for which you want to return
+    -- LF-tags.
+    resource :: Resource
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetResourceLFTags' 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:
+--
+-- 'catalogId', 'getResourceLFTags_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'showAssignedLFTags', 'getResourceLFTags_showAssignedLFTags' - Indicates whether to show the assigned LF-tags.
+--
+-- 'resource', 'getResourceLFTags_resource' - The database, table, or column resource for which you want to return
+-- LF-tags.
+newGetResourceLFTags ::
+  -- | 'resource'
+  Resource ->
+  GetResourceLFTags
+newGetResourceLFTags pResource_ =
+  GetResourceLFTags'
+    { catalogId = Prelude.Nothing,
+      showAssignedLFTags = Prelude.Nothing,
+      resource = pResource_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+getResourceLFTags_catalogId :: Lens.Lens' GetResourceLFTags (Prelude.Maybe Prelude.Text)
+getResourceLFTags_catalogId = Lens.lens (\GetResourceLFTags' {catalogId} -> catalogId) (\s@GetResourceLFTags' {} a -> s {catalogId = a} :: GetResourceLFTags)
+
+-- | Indicates whether to show the assigned LF-tags.
+getResourceLFTags_showAssignedLFTags :: Lens.Lens' GetResourceLFTags (Prelude.Maybe Prelude.Bool)
+getResourceLFTags_showAssignedLFTags = Lens.lens (\GetResourceLFTags' {showAssignedLFTags} -> showAssignedLFTags) (\s@GetResourceLFTags' {} a -> s {showAssignedLFTags = a} :: GetResourceLFTags)
+
+-- | The database, table, or column resource for which you want to return
+-- LF-tags.
+getResourceLFTags_resource :: Lens.Lens' GetResourceLFTags Resource
+getResourceLFTags_resource = Lens.lens (\GetResourceLFTags' {resource} -> resource) (\s@GetResourceLFTags' {} a -> s {resource = a} :: GetResourceLFTags)
+
+instance Core.AWSRequest GetResourceLFTags where
+  type
+    AWSResponse GetResourceLFTags =
+      GetResourceLFTagsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetResourceLFTagsResponse'
+            Prelude.<$> (x Data..?> "LFTagOnDatabase")
+            Prelude.<*> ( x
+                            Data..?> "LFTagsOnColumns"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "LFTagsOnTable")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetResourceLFTags where
+  hashWithSalt _salt GetResourceLFTags' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` showAssignedLFTags
+      `Prelude.hashWithSalt` resource
+
+instance Prelude.NFData GetResourceLFTags where
+  rnf GetResourceLFTags' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf showAssignedLFTags
+      `Prelude.seq` Prelude.rnf resource
+
+instance Data.ToHeaders GetResourceLFTags where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetResourceLFTags where
+  toJSON GetResourceLFTags' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("ShowAssignedLFTags" Data..=)
+              Prelude.<$> showAssignedLFTags,
+            Prelude.Just ("Resource" Data..= resource)
+          ]
+      )
+
+instance Data.ToPath GetResourceLFTags where
+  toPath = Prelude.const "/GetResourceLFTags"
+
+instance Data.ToQuery GetResourceLFTags where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetResourceLFTagsResponse' smart constructor.
+data GetResourceLFTagsResponse = GetResourceLFTagsResponse'
+  { -- | A list of LF-tags applied to a database resource.
+    lFTagOnDatabase :: Prelude.Maybe (Prelude.NonEmpty LFTagPair),
+    -- | A list of LF-tags applied to a column resource.
+    lFTagsOnColumns :: Prelude.Maybe [ColumnLFTag],
+    -- | A list of LF-tags applied to a table resource.
+    lFTagsOnTable :: Prelude.Maybe (Prelude.NonEmpty LFTagPair),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetResourceLFTagsResponse' 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:
+--
+-- 'lFTagOnDatabase', 'getResourceLFTagsResponse_lFTagOnDatabase' - A list of LF-tags applied to a database resource.
+--
+-- 'lFTagsOnColumns', 'getResourceLFTagsResponse_lFTagsOnColumns' - A list of LF-tags applied to a column resource.
+--
+-- 'lFTagsOnTable', 'getResourceLFTagsResponse_lFTagsOnTable' - A list of LF-tags applied to a table resource.
+--
+-- 'httpStatus', 'getResourceLFTagsResponse_httpStatus' - The response's http status code.
+newGetResourceLFTagsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetResourceLFTagsResponse
+newGetResourceLFTagsResponse pHttpStatus_ =
+  GetResourceLFTagsResponse'
+    { lFTagOnDatabase =
+        Prelude.Nothing,
+      lFTagsOnColumns = Prelude.Nothing,
+      lFTagsOnTable = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of LF-tags applied to a database resource.
+getResourceLFTagsResponse_lFTagOnDatabase :: Lens.Lens' GetResourceLFTagsResponse (Prelude.Maybe (Prelude.NonEmpty LFTagPair))
+getResourceLFTagsResponse_lFTagOnDatabase = Lens.lens (\GetResourceLFTagsResponse' {lFTagOnDatabase} -> lFTagOnDatabase) (\s@GetResourceLFTagsResponse' {} a -> s {lFTagOnDatabase = a} :: GetResourceLFTagsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of LF-tags applied to a column resource.
+getResourceLFTagsResponse_lFTagsOnColumns :: Lens.Lens' GetResourceLFTagsResponse (Prelude.Maybe [ColumnLFTag])
+getResourceLFTagsResponse_lFTagsOnColumns = Lens.lens (\GetResourceLFTagsResponse' {lFTagsOnColumns} -> lFTagsOnColumns) (\s@GetResourceLFTagsResponse' {} a -> s {lFTagsOnColumns = a} :: GetResourceLFTagsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of LF-tags applied to a table resource.
+getResourceLFTagsResponse_lFTagsOnTable :: Lens.Lens' GetResourceLFTagsResponse (Prelude.Maybe (Prelude.NonEmpty LFTagPair))
+getResourceLFTagsResponse_lFTagsOnTable = Lens.lens (\GetResourceLFTagsResponse' {lFTagsOnTable} -> lFTagsOnTable) (\s@GetResourceLFTagsResponse' {} a -> s {lFTagsOnTable = a} :: GetResourceLFTagsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getResourceLFTagsResponse_httpStatus :: Lens.Lens' GetResourceLFTagsResponse Prelude.Int
+getResourceLFTagsResponse_httpStatus = Lens.lens (\GetResourceLFTagsResponse' {httpStatus} -> httpStatus) (\s@GetResourceLFTagsResponse' {} a -> s {httpStatus = a} :: GetResourceLFTagsResponse)
+
+instance Prelude.NFData GetResourceLFTagsResponse where
+  rnf GetResourceLFTagsResponse' {..} =
+    Prelude.rnf lFTagOnDatabase
+      `Prelude.seq` Prelude.rnf lFTagsOnColumns
+      `Prelude.seq` Prelude.rnf lFTagsOnTable
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/GetTableObjects.hs b/gen/Amazonka/LakeFormation/GetTableObjects.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetTableObjects.hs
@@ -0,0 +1,325 @@
+{-# 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.LakeFormation.GetTableObjects
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the set of Amazon S3 objects that make up the specified governed
+-- table. A transaction ID or timestamp can be specified for time-travel
+-- queries.
+module Amazonka.LakeFormation.GetTableObjects
+  ( -- * Creating a Request
+    GetTableObjects (..),
+    newGetTableObjects,
+
+    -- * Request Lenses
+    getTableObjects_catalogId,
+    getTableObjects_maxResults,
+    getTableObjects_nextToken,
+    getTableObjects_partitionPredicate,
+    getTableObjects_queryAsOfTime,
+    getTableObjects_transactionId,
+    getTableObjects_databaseName,
+    getTableObjects_tableName,
+
+    -- * Destructuring the Response
+    GetTableObjectsResponse (..),
+    newGetTableObjectsResponse,
+
+    -- * Response Lenses
+    getTableObjectsResponse_nextToken,
+    getTableObjectsResponse_objects,
+    getTableObjectsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetTableObjects' smart constructor.
+data GetTableObjects = GetTableObjects'
+  { -- | The catalog containing the governed table. Defaults to the caller’s
+    -- account.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | Specifies how many values to return in a page.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A continuation token if this is not the first call to retrieve these
+    -- objects.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A predicate to filter the objects returned based on the partition keys
+    -- defined in the governed table.
+    --
+    -- -   The comparison operators supported are: =, >, \<, >=, \<=
+    --
+    -- -   The logical operators supported are: AND
+    --
+    -- -   The data types supported are integer, long, date(yyyy-MM-dd),
+    --     timestamp(yyyy-MM-dd HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss\"), string
+    --     and decimal.
+    partitionPredicate :: Prelude.Maybe Prelude.Text,
+    -- | The time as of when to read the governed table contents. If not set, the
+    -- most recent transaction commit time is used. Cannot be specified along
+    -- with @TransactionId@.
+    queryAsOfTime :: Prelude.Maybe Data.POSIX,
+    -- | The transaction ID at which to read the governed table contents. If this
+    -- transaction has aborted, an error is returned. If not set, defaults to
+    -- the most recent committed transaction. Cannot be specified along with
+    -- @QueryAsOfTime@.
+    transactionId :: Prelude.Maybe Prelude.Text,
+    -- | The database containing the governed table.
+    databaseName :: Prelude.Text,
+    -- | The governed table for which to retrieve objects.
+    tableName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetTableObjects' 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:
+--
+-- 'catalogId', 'getTableObjects_catalogId' - The catalog containing the governed table. Defaults to the caller’s
+-- account.
+--
+-- 'maxResults', 'getTableObjects_maxResults' - Specifies how many values to return in a page.
+--
+-- 'nextToken', 'getTableObjects_nextToken' - A continuation token if this is not the first call to retrieve these
+-- objects.
+--
+-- 'partitionPredicate', 'getTableObjects_partitionPredicate' - A predicate to filter the objects returned based on the partition keys
+-- defined in the governed table.
+--
+-- -   The comparison operators supported are: =, >, \<, >=, \<=
+--
+-- -   The logical operators supported are: AND
+--
+-- -   The data types supported are integer, long, date(yyyy-MM-dd),
+--     timestamp(yyyy-MM-dd HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss\"), string
+--     and decimal.
+--
+-- 'queryAsOfTime', 'getTableObjects_queryAsOfTime' - The time as of when to read the governed table contents. If not set, the
+-- most recent transaction commit time is used. Cannot be specified along
+-- with @TransactionId@.
+--
+-- 'transactionId', 'getTableObjects_transactionId' - The transaction ID at which to read the governed table contents. If this
+-- transaction has aborted, an error is returned. If not set, defaults to
+-- the most recent committed transaction. Cannot be specified along with
+-- @QueryAsOfTime@.
+--
+-- 'databaseName', 'getTableObjects_databaseName' - The database containing the governed table.
+--
+-- 'tableName', 'getTableObjects_tableName' - The governed table for which to retrieve objects.
+newGetTableObjects ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  GetTableObjects
+newGetTableObjects pDatabaseName_ pTableName_ =
+  GetTableObjects'
+    { catalogId = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      partitionPredicate = Prelude.Nothing,
+      queryAsOfTime = Prelude.Nothing,
+      transactionId = Prelude.Nothing,
+      databaseName = pDatabaseName_,
+      tableName = pTableName_
+    }
+
+-- | The catalog containing the governed table. Defaults to the caller’s
+-- account.
+getTableObjects_catalogId :: Lens.Lens' GetTableObjects (Prelude.Maybe Prelude.Text)
+getTableObjects_catalogId = Lens.lens (\GetTableObjects' {catalogId} -> catalogId) (\s@GetTableObjects' {} a -> s {catalogId = a} :: GetTableObjects)
+
+-- | Specifies how many values to return in a page.
+getTableObjects_maxResults :: Lens.Lens' GetTableObjects (Prelude.Maybe Prelude.Natural)
+getTableObjects_maxResults = Lens.lens (\GetTableObjects' {maxResults} -> maxResults) (\s@GetTableObjects' {} a -> s {maxResults = a} :: GetTableObjects)
+
+-- | A continuation token if this is not the first call to retrieve these
+-- objects.
+getTableObjects_nextToken :: Lens.Lens' GetTableObjects (Prelude.Maybe Prelude.Text)
+getTableObjects_nextToken = Lens.lens (\GetTableObjects' {nextToken} -> nextToken) (\s@GetTableObjects' {} a -> s {nextToken = a} :: GetTableObjects)
+
+-- | A predicate to filter the objects returned based on the partition keys
+-- defined in the governed table.
+--
+-- -   The comparison operators supported are: =, >, \<, >=, \<=
+--
+-- -   The logical operators supported are: AND
+--
+-- -   The data types supported are integer, long, date(yyyy-MM-dd),
+--     timestamp(yyyy-MM-dd HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss\"), string
+--     and decimal.
+getTableObjects_partitionPredicate :: Lens.Lens' GetTableObjects (Prelude.Maybe Prelude.Text)
+getTableObjects_partitionPredicate = Lens.lens (\GetTableObjects' {partitionPredicate} -> partitionPredicate) (\s@GetTableObjects' {} a -> s {partitionPredicate = a} :: GetTableObjects)
+
+-- | The time as of when to read the governed table contents. If not set, the
+-- most recent transaction commit time is used. Cannot be specified along
+-- with @TransactionId@.
+getTableObjects_queryAsOfTime :: Lens.Lens' GetTableObjects (Prelude.Maybe Prelude.UTCTime)
+getTableObjects_queryAsOfTime = Lens.lens (\GetTableObjects' {queryAsOfTime} -> queryAsOfTime) (\s@GetTableObjects' {} a -> s {queryAsOfTime = a} :: GetTableObjects) Prelude.. Lens.mapping Data._Time
+
+-- | The transaction ID at which to read the governed table contents. If this
+-- transaction has aborted, an error is returned. If not set, defaults to
+-- the most recent committed transaction. Cannot be specified along with
+-- @QueryAsOfTime@.
+getTableObjects_transactionId :: Lens.Lens' GetTableObjects (Prelude.Maybe Prelude.Text)
+getTableObjects_transactionId = Lens.lens (\GetTableObjects' {transactionId} -> transactionId) (\s@GetTableObjects' {} a -> s {transactionId = a} :: GetTableObjects)
+
+-- | The database containing the governed table.
+getTableObjects_databaseName :: Lens.Lens' GetTableObjects Prelude.Text
+getTableObjects_databaseName = Lens.lens (\GetTableObjects' {databaseName} -> databaseName) (\s@GetTableObjects' {} a -> s {databaseName = a} :: GetTableObjects)
+
+-- | The governed table for which to retrieve objects.
+getTableObjects_tableName :: Lens.Lens' GetTableObjects Prelude.Text
+getTableObjects_tableName = Lens.lens (\GetTableObjects' {tableName} -> tableName) (\s@GetTableObjects' {} a -> s {tableName = a} :: GetTableObjects)
+
+instance Core.AWSRequest GetTableObjects where
+  type
+    AWSResponse GetTableObjects =
+      GetTableObjectsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetTableObjectsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Objects" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetTableObjects where
+  hashWithSalt _salt GetTableObjects' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` partitionPredicate
+      `Prelude.hashWithSalt` queryAsOfTime
+      `Prelude.hashWithSalt` transactionId
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData GetTableObjects where
+  rnf GetTableObjects' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf partitionPredicate
+      `Prelude.seq` Prelude.rnf queryAsOfTime
+      `Prelude.seq` Prelude.rnf transactionId
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders GetTableObjects where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetTableObjects where
+  toJSON GetTableObjects' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("PartitionPredicate" Data..=)
+              Prelude.<$> partitionPredicate,
+            ("QueryAsOfTime" Data..=) Prelude.<$> queryAsOfTime,
+            ("TransactionId" Data..=) Prelude.<$> transactionId,
+            Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("TableName" Data..= tableName)
+          ]
+      )
+
+instance Data.ToPath GetTableObjects where
+  toPath = Prelude.const "/GetTableObjects"
+
+instance Data.ToQuery GetTableObjects where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetTableObjectsResponse' smart constructor.
+data GetTableObjectsResponse = GetTableObjectsResponse'
+  { -- | A continuation token indicating whether additional data is available.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of objects organized by partition keys.
+    objects :: Prelude.Maybe [PartitionObjects],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetTableObjectsResponse' 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', 'getTableObjectsResponse_nextToken' - A continuation token indicating whether additional data is available.
+--
+-- 'objects', 'getTableObjectsResponse_objects' - A list of objects organized by partition keys.
+--
+-- 'httpStatus', 'getTableObjectsResponse_httpStatus' - The response's http status code.
+newGetTableObjectsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetTableObjectsResponse
+newGetTableObjectsResponse pHttpStatus_ =
+  GetTableObjectsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      objects = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A continuation token indicating whether additional data is available.
+getTableObjectsResponse_nextToken :: Lens.Lens' GetTableObjectsResponse (Prelude.Maybe Prelude.Text)
+getTableObjectsResponse_nextToken = Lens.lens (\GetTableObjectsResponse' {nextToken} -> nextToken) (\s@GetTableObjectsResponse' {} a -> s {nextToken = a} :: GetTableObjectsResponse)
+
+-- | A list of objects organized by partition keys.
+getTableObjectsResponse_objects :: Lens.Lens' GetTableObjectsResponse (Prelude.Maybe [PartitionObjects])
+getTableObjectsResponse_objects = Lens.lens (\GetTableObjectsResponse' {objects} -> objects) (\s@GetTableObjectsResponse' {} a -> s {objects = a} :: GetTableObjectsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getTableObjectsResponse_httpStatus :: Lens.Lens' GetTableObjectsResponse Prelude.Int
+getTableObjectsResponse_httpStatus = Lens.lens (\GetTableObjectsResponse' {httpStatus} -> httpStatus) (\s@GetTableObjectsResponse' {} a -> s {httpStatus = a} :: GetTableObjectsResponse)
+
+instance Prelude.NFData GetTableObjectsResponse where
+  rnf GetTableObjectsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf objects
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/GetTemporaryGluePartitionCredentials.hs b/gen/Amazonka/LakeFormation/GetTemporaryGluePartitionCredentials.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetTemporaryGluePartitionCredentials.hs
@@ -0,0 +1,331 @@
+{-# 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.LakeFormation.GetTemporaryGluePartitionCredentials
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- This API is identical to @GetTemporaryTableCredentials@ except that this
+-- is used when the target Data Catalog resource is of type Partition. Lake
+-- Formation restricts the permission of the vended credentials with the
+-- same scope down policy which restricts access to a single Amazon S3
+-- prefix.
+module Amazonka.LakeFormation.GetTemporaryGluePartitionCredentials
+  ( -- * Creating a Request
+    GetTemporaryGluePartitionCredentials (..),
+    newGetTemporaryGluePartitionCredentials,
+
+    -- * Request Lenses
+    getTemporaryGluePartitionCredentials_auditContext,
+    getTemporaryGluePartitionCredentials_durationSeconds,
+    getTemporaryGluePartitionCredentials_permissions,
+    getTemporaryGluePartitionCredentials_tableArn,
+    getTemporaryGluePartitionCredentials_partition,
+    getTemporaryGluePartitionCredentials_supportedPermissionTypes,
+
+    -- * Destructuring the Response
+    GetTemporaryGluePartitionCredentialsResponse (..),
+    newGetTemporaryGluePartitionCredentialsResponse,
+
+    -- * Response Lenses
+    getTemporaryGluePartitionCredentialsResponse_accessKeyId,
+    getTemporaryGluePartitionCredentialsResponse_expiration,
+    getTemporaryGluePartitionCredentialsResponse_secretAccessKey,
+    getTemporaryGluePartitionCredentialsResponse_sessionToken,
+    getTemporaryGluePartitionCredentialsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetTemporaryGluePartitionCredentials' smart constructor.
+data GetTemporaryGluePartitionCredentials = GetTemporaryGluePartitionCredentials'
+  { -- | A structure representing context to access a resource (column names,
+    -- query ID, etc).
+    auditContext :: Prelude.Maybe AuditContext,
+    -- | The time period, between 900 and 21,600 seconds, for the timeout of the
+    -- temporary credentials.
+    durationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | Filters the request based on the user having been granted a list of
+    -- specified permissions on the requested resource(s).
+    permissions :: Prelude.Maybe [Permission],
+    -- | The ARN of the partitions\' table.
+    tableArn :: Prelude.Text,
+    -- | A list of partition values identifying a single partition.
+    partition :: PartitionValueList,
+    -- | A list of supported permission types for the partition. Valid values are
+    -- @COLUMN_PERMISSION@ and @CELL_FILTER_PERMISSION@.
+    supportedPermissionTypes :: Prelude.NonEmpty PermissionType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetTemporaryGluePartitionCredentials' 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:
+--
+-- 'auditContext', 'getTemporaryGluePartitionCredentials_auditContext' - A structure representing context to access a resource (column names,
+-- query ID, etc).
+--
+-- 'durationSeconds', 'getTemporaryGluePartitionCredentials_durationSeconds' - The time period, between 900 and 21,600 seconds, for the timeout of the
+-- temporary credentials.
+--
+-- 'permissions', 'getTemporaryGluePartitionCredentials_permissions' - Filters the request based on the user having been granted a list of
+-- specified permissions on the requested resource(s).
+--
+-- 'tableArn', 'getTemporaryGluePartitionCredentials_tableArn' - The ARN of the partitions\' table.
+--
+-- 'partition', 'getTemporaryGluePartitionCredentials_partition' - A list of partition values identifying a single partition.
+--
+-- 'supportedPermissionTypes', 'getTemporaryGluePartitionCredentials_supportedPermissionTypes' - A list of supported permission types for the partition. Valid values are
+-- @COLUMN_PERMISSION@ and @CELL_FILTER_PERMISSION@.
+newGetTemporaryGluePartitionCredentials ::
+  -- | 'tableArn'
+  Prelude.Text ->
+  -- | 'partition'
+  PartitionValueList ->
+  -- | 'supportedPermissionTypes'
+  Prelude.NonEmpty PermissionType ->
+  GetTemporaryGluePartitionCredentials
+newGetTemporaryGluePartitionCredentials
+  pTableArn_
+  pPartition_
+  pSupportedPermissionTypes_ =
+    GetTemporaryGluePartitionCredentials'
+      { auditContext =
+          Prelude.Nothing,
+        durationSeconds = Prelude.Nothing,
+        permissions = Prelude.Nothing,
+        tableArn = pTableArn_,
+        partition = pPartition_,
+        supportedPermissionTypes =
+          Lens.coerced
+            Lens.# pSupportedPermissionTypes_
+      }
+
+-- | A structure representing context to access a resource (column names,
+-- query ID, etc).
+getTemporaryGluePartitionCredentials_auditContext :: Lens.Lens' GetTemporaryGluePartitionCredentials (Prelude.Maybe AuditContext)
+getTemporaryGluePartitionCredentials_auditContext = Lens.lens (\GetTemporaryGluePartitionCredentials' {auditContext} -> auditContext) (\s@GetTemporaryGluePartitionCredentials' {} a -> s {auditContext = a} :: GetTemporaryGluePartitionCredentials)
+
+-- | The time period, between 900 and 21,600 seconds, for the timeout of the
+-- temporary credentials.
+getTemporaryGluePartitionCredentials_durationSeconds :: Lens.Lens' GetTemporaryGluePartitionCredentials (Prelude.Maybe Prelude.Natural)
+getTemporaryGluePartitionCredentials_durationSeconds = Lens.lens (\GetTemporaryGluePartitionCredentials' {durationSeconds} -> durationSeconds) (\s@GetTemporaryGluePartitionCredentials' {} a -> s {durationSeconds = a} :: GetTemporaryGluePartitionCredentials)
+
+-- | Filters the request based on the user having been granted a list of
+-- specified permissions on the requested resource(s).
+getTemporaryGluePartitionCredentials_permissions :: Lens.Lens' GetTemporaryGluePartitionCredentials (Prelude.Maybe [Permission])
+getTemporaryGluePartitionCredentials_permissions = Lens.lens (\GetTemporaryGluePartitionCredentials' {permissions} -> permissions) (\s@GetTemporaryGluePartitionCredentials' {} a -> s {permissions = a} :: GetTemporaryGluePartitionCredentials) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ARN of the partitions\' table.
+getTemporaryGluePartitionCredentials_tableArn :: Lens.Lens' GetTemporaryGluePartitionCredentials Prelude.Text
+getTemporaryGluePartitionCredentials_tableArn = Lens.lens (\GetTemporaryGluePartitionCredentials' {tableArn} -> tableArn) (\s@GetTemporaryGluePartitionCredentials' {} a -> s {tableArn = a} :: GetTemporaryGluePartitionCredentials)
+
+-- | A list of partition values identifying a single partition.
+getTemporaryGluePartitionCredentials_partition :: Lens.Lens' GetTemporaryGluePartitionCredentials PartitionValueList
+getTemporaryGluePartitionCredentials_partition = Lens.lens (\GetTemporaryGluePartitionCredentials' {partition} -> partition) (\s@GetTemporaryGluePartitionCredentials' {} a -> s {partition = a} :: GetTemporaryGluePartitionCredentials)
+
+-- | A list of supported permission types for the partition. Valid values are
+-- @COLUMN_PERMISSION@ and @CELL_FILTER_PERMISSION@.
+getTemporaryGluePartitionCredentials_supportedPermissionTypes :: Lens.Lens' GetTemporaryGluePartitionCredentials (Prelude.NonEmpty PermissionType)
+getTemporaryGluePartitionCredentials_supportedPermissionTypes = Lens.lens (\GetTemporaryGluePartitionCredentials' {supportedPermissionTypes} -> supportedPermissionTypes) (\s@GetTemporaryGluePartitionCredentials' {} a -> s {supportedPermissionTypes = a} :: GetTemporaryGluePartitionCredentials) Prelude.. Lens.coerced
+
+instance
+  Core.AWSRequest
+    GetTemporaryGluePartitionCredentials
+  where
+  type
+    AWSResponse GetTemporaryGluePartitionCredentials =
+      GetTemporaryGluePartitionCredentialsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetTemporaryGluePartitionCredentialsResponse'
+            Prelude.<$> (x Data..?> "AccessKeyId")
+            Prelude.<*> (x Data..?> "Expiration")
+            Prelude.<*> (x Data..?> "SecretAccessKey")
+            Prelude.<*> (x Data..?> "SessionToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    GetTemporaryGluePartitionCredentials
+  where
+  hashWithSalt
+    _salt
+    GetTemporaryGluePartitionCredentials' {..} =
+      _salt
+        `Prelude.hashWithSalt` auditContext
+        `Prelude.hashWithSalt` durationSeconds
+        `Prelude.hashWithSalt` permissions
+        `Prelude.hashWithSalt` tableArn
+        `Prelude.hashWithSalt` partition
+        `Prelude.hashWithSalt` supportedPermissionTypes
+
+instance
+  Prelude.NFData
+    GetTemporaryGluePartitionCredentials
+  where
+  rnf GetTemporaryGluePartitionCredentials' {..} =
+    Prelude.rnf auditContext
+      `Prelude.seq` Prelude.rnf durationSeconds
+      `Prelude.seq` Prelude.rnf permissions
+      `Prelude.seq` Prelude.rnf tableArn
+      `Prelude.seq` Prelude.rnf partition
+      `Prelude.seq` Prelude.rnf supportedPermissionTypes
+
+instance
+  Data.ToHeaders
+    GetTemporaryGluePartitionCredentials
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    GetTemporaryGluePartitionCredentials
+  where
+  toJSON GetTemporaryGluePartitionCredentials' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AuditContext" Data..=) Prelude.<$> auditContext,
+            ("DurationSeconds" Data..=)
+              Prelude.<$> durationSeconds,
+            ("Permissions" Data..=) Prelude.<$> permissions,
+            Prelude.Just ("TableArn" Data..= tableArn),
+            Prelude.Just ("Partition" Data..= partition),
+            Prelude.Just
+              ( "SupportedPermissionTypes"
+                  Data..= supportedPermissionTypes
+              )
+          ]
+      )
+
+instance
+  Data.ToPath
+    GetTemporaryGluePartitionCredentials
+  where
+  toPath =
+    Prelude.const
+      "/GetTemporaryGluePartitionCredentials"
+
+instance
+  Data.ToQuery
+    GetTemporaryGluePartitionCredentials
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetTemporaryGluePartitionCredentialsResponse' smart constructor.
+data GetTemporaryGluePartitionCredentialsResponse = GetTemporaryGluePartitionCredentialsResponse'
+  { -- | The access key ID for the temporary credentials.
+    accessKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The date and time when the temporary credentials expire.
+    expiration :: Prelude.Maybe Data.POSIX,
+    -- | The secret key for the temporary credentials.
+    secretAccessKey :: Prelude.Maybe Prelude.Text,
+    -- | The session token for the temporary credentials.
+    sessionToken :: 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 'GetTemporaryGluePartitionCredentialsResponse' 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:
+--
+-- 'accessKeyId', 'getTemporaryGluePartitionCredentialsResponse_accessKeyId' - The access key ID for the temporary credentials.
+--
+-- 'expiration', 'getTemporaryGluePartitionCredentialsResponse_expiration' - The date and time when the temporary credentials expire.
+--
+-- 'secretAccessKey', 'getTemporaryGluePartitionCredentialsResponse_secretAccessKey' - The secret key for the temporary credentials.
+--
+-- 'sessionToken', 'getTemporaryGluePartitionCredentialsResponse_sessionToken' - The session token for the temporary credentials.
+--
+-- 'httpStatus', 'getTemporaryGluePartitionCredentialsResponse_httpStatus' - The response's http status code.
+newGetTemporaryGluePartitionCredentialsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetTemporaryGluePartitionCredentialsResponse
+newGetTemporaryGluePartitionCredentialsResponse
+  pHttpStatus_ =
+    GetTemporaryGluePartitionCredentialsResponse'
+      { accessKeyId =
+          Prelude.Nothing,
+        expiration = Prelude.Nothing,
+        secretAccessKey =
+          Prelude.Nothing,
+        sessionToken =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The access key ID for the temporary credentials.
+getTemporaryGluePartitionCredentialsResponse_accessKeyId :: Lens.Lens' GetTemporaryGluePartitionCredentialsResponse (Prelude.Maybe Prelude.Text)
+getTemporaryGluePartitionCredentialsResponse_accessKeyId = Lens.lens (\GetTemporaryGluePartitionCredentialsResponse' {accessKeyId} -> accessKeyId) (\s@GetTemporaryGluePartitionCredentialsResponse' {} a -> s {accessKeyId = a} :: GetTemporaryGluePartitionCredentialsResponse)
+
+-- | The date and time when the temporary credentials expire.
+getTemporaryGluePartitionCredentialsResponse_expiration :: Lens.Lens' GetTemporaryGluePartitionCredentialsResponse (Prelude.Maybe Prelude.UTCTime)
+getTemporaryGluePartitionCredentialsResponse_expiration = Lens.lens (\GetTemporaryGluePartitionCredentialsResponse' {expiration} -> expiration) (\s@GetTemporaryGluePartitionCredentialsResponse' {} a -> s {expiration = a} :: GetTemporaryGluePartitionCredentialsResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The secret key for the temporary credentials.
+getTemporaryGluePartitionCredentialsResponse_secretAccessKey :: Lens.Lens' GetTemporaryGluePartitionCredentialsResponse (Prelude.Maybe Prelude.Text)
+getTemporaryGluePartitionCredentialsResponse_secretAccessKey = Lens.lens (\GetTemporaryGluePartitionCredentialsResponse' {secretAccessKey} -> secretAccessKey) (\s@GetTemporaryGluePartitionCredentialsResponse' {} a -> s {secretAccessKey = a} :: GetTemporaryGluePartitionCredentialsResponse)
+
+-- | The session token for the temporary credentials.
+getTemporaryGluePartitionCredentialsResponse_sessionToken :: Lens.Lens' GetTemporaryGluePartitionCredentialsResponse (Prelude.Maybe Prelude.Text)
+getTemporaryGluePartitionCredentialsResponse_sessionToken = Lens.lens (\GetTemporaryGluePartitionCredentialsResponse' {sessionToken} -> sessionToken) (\s@GetTemporaryGluePartitionCredentialsResponse' {} a -> s {sessionToken = a} :: GetTemporaryGluePartitionCredentialsResponse)
+
+-- | The response's http status code.
+getTemporaryGluePartitionCredentialsResponse_httpStatus :: Lens.Lens' GetTemporaryGluePartitionCredentialsResponse Prelude.Int
+getTemporaryGluePartitionCredentialsResponse_httpStatus = Lens.lens (\GetTemporaryGluePartitionCredentialsResponse' {httpStatus} -> httpStatus) (\s@GetTemporaryGluePartitionCredentialsResponse' {} a -> s {httpStatus = a} :: GetTemporaryGluePartitionCredentialsResponse)
+
+instance
+  Prelude.NFData
+    GetTemporaryGluePartitionCredentialsResponse
+  where
+  rnf GetTemporaryGluePartitionCredentialsResponse' {..} =
+    Prelude.rnf accessKeyId
+      `Prelude.seq` Prelude.rnf expiration
+      `Prelude.seq` Prelude.rnf secretAccessKey
+      `Prelude.seq` Prelude.rnf sessionToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/GetTemporaryGlueTableCredentials.hs b/gen/Amazonka/LakeFormation/GetTemporaryGlueTableCredentials.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetTemporaryGlueTableCredentials.hs
@@ -0,0 +1,309 @@
+{-# 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.LakeFormation.GetTemporaryGlueTableCredentials
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows a caller in a secure environment to assume a role with permission
+-- to access Amazon S3. In order to vend such credentials, Lake Formation
+-- assumes the role associated with a registered location, for example an
+-- Amazon S3 bucket, with a scope down policy which restricts the access to
+-- a single prefix.
+module Amazonka.LakeFormation.GetTemporaryGlueTableCredentials
+  ( -- * Creating a Request
+    GetTemporaryGlueTableCredentials (..),
+    newGetTemporaryGlueTableCredentials,
+
+    -- * Request Lenses
+    getTemporaryGlueTableCredentials_auditContext,
+    getTemporaryGlueTableCredentials_durationSeconds,
+    getTemporaryGlueTableCredentials_permissions,
+    getTemporaryGlueTableCredentials_tableArn,
+    getTemporaryGlueTableCredentials_supportedPermissionTypes,
+
+    -- * Destructuring the Response
+    GetTemporaryGlueTableCredentialsResponse (..),
+    newGetTemporaryGlueTableCredentialsResponse,
+
+    -- * Response Lenses
+    getTemporaryGlueTableCredentialsResponse_accessKeyId,
+    getTemporaryGlueTableCredentialsResponse_expiration,
+    getTemporaryGlueTableCredentialsResponse_secretAccessKey,
+    getTemporaryGlueTableCredentialsResponse_sessionToken,
+    getTemporaryGlueTableCredentialsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetTemporaryGlueTableCredentials' smart constructor.
+data GetTemporaryGlueTableCredentials = GetTemporaryGlueTableCredentials'
+  { -- | A structure representing context to access a resource (column names,
+    -- query ID, etc).
+    auditContext :: Prelude.Maybe AuditContext,
+    -- | The time period, between 900 and 21,600 seconds, for the timeout of the
+    -- temporary credentials.
+    durationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | Filters the request based on the user having been granted a list of
+    -- specified permissions on the requested resource(s).
+    permissions :: Prelude.Maybe [Permission],
+    -- | The ARN identifying a table in the Data Catalog for the temporary
+    -- credentials request.
+    tableArn :: Prelude.Text,
+    -- | A list of supported permission types for the table. Valid values are
+    -- @COLUMN_PERMISSION@ and @CELL_FILTER_PERMISSION@.
+    supportedPermissionTypes :: Prelude.NonEmpty PermissionType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetTemporaryGlueTableCredentials' 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:
+--
+-- 'auditContext', 'getTemporaryGlueTableCredentials_auditContext' - A structure representing context to access a resource (column names,
+-- query ID, etc).
+--
+-- 'durationSeconds', 'getTemporaryGlueTableCredentials_durationSeconds' - The time period, between 900 and 21,600 seconds, for the timeout of the
+-- temporary credentials.
+--
+-- 'permissions', 'getTemporaryGlueTableCredentials_permissions' - Filters the request based on the user having been granted a list of
+-- specified permissions on the requested resource(s).
+--
+-- 'tableArn', 'getTemporaryGlueTableCredentials_tableArn' - The ARN identifying a table in the Data Catalog for the temporary
+-- credentials request.
+--
+-- 'supportedPermissionTypes', 'getTemporaryGlueTableCredentials_supportedPermissionTypes' - A list of supported permission types for the table. Valid values are
+-- @COLUMN_PERMISSION@ and @CELL_FILTER_PERMISSION@.
+newGetTemporaryGlueTableCredentials ::
+  -- | 'tableArn'
+  Prelude.Text ->
+  -- | 'supportedPermissionTypes'
+  Prelude.NonEmpty PermissionType ->
+  GetTemporaryGlueTableCredentials
+newGetTemporaryGlueTableCredentials
+  pTableArn_
+  pSupportedPermissionTypes_ =
+    GetTemporaryGlueTableCredentials'
+      { auditContext =
+          Prelude.Nothing,
+        durationSeconds = Prelude.Nothing,
+        permissions = Prelude.Nothing,
+        tableArn = pTableArn_,
+        supportedPermissionTypes =
+          Lens.coerced
+            Lens.# pSupportedPermissionTypes_
+      }
+
+-- | A structure representing context to access a resource (column names,
+-- query ID, etc).
+getTemporaryGlueTableCredentials_auditContext :: Lens.Lens' GetTemporaryGlueTableCredentials (Prelude.Maybe AuditContext)
+getTemporaryGlueTableCredentials_auditContext = Lens.lens (\GetTemporaryGlueTableCredentials' {auditContext} -> auditContext) (\s@GetTemporaryGlueTableCredentials' {} a -> s {auditContext = a} :: GetTemporaryGlueTableCredentials)
+
+-- | The time period, between 900 and 21,600 seconds, for the timeout of the
+-- temporary credentials.
+getTemporaryGlueTableCredentials_durationSeconds :: Lens.Lens' GetTemporaryGlueTableCredentials (Prelude.Maybe Prelude.Natural)
+getTemporaryGlueTableCredentials_durationSeconds = Lens.lens (\GetTemporaryGlueTableCredentials' {durationSeconds} -> durationSeconds) (\s@GetTemporaryGlueTableCredentials' {} a -> s {durationSeconds = a} :: GetTemporaryGlueTableCredentials)
+
+-- | Filters the request based on the user having been granted a list of
+-- specified permissions on the requested resource(s).
+getTemporaryGlueTableCredentials_permissions :: Lens.Lens' GetTemporaryGlueTableCredentials (Prelude.Maybe [Permission])
+getTemporaryGlueTableCredentials_permissions = Lens.lens (\GetTemporaryGlueTableCredentials' {permissions} -> permissions) (\s@GetTemporaryGlueTableCredentials' {} a -> s {permissions = a} :: GetTemporaryGlueTableCredentials) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ARN identifying a table in the Data Catalog for the temporary
+-- credentials request.
+getTemporaryGlueTableCredentials_tableArn :: Lens.Lens' GetTemporaryGlueTableCredentials Prelude.Text
+getTemporaryGlueTableCredentials_tableArn = Lens.lens (\GetTemporaryGlueTableCredentials' {tableArn} -> tableArn) (\s@GetTemporaryGlueTableCredentials' {} a -> s {tableArn = a} :: GetTemporaryGlueTableCredentials)
+
+-- | A list of supported permission types for the table. Valid values are
+-- @COLUMN_PERMISSION@ and @CELL_FILTER_PERMISSION@.
+getTemporaryGlueTableCredentials_supportedPermissionTypes :: Lens.Lens' GetTemporaryGlueTableCredentials (Prelude.NonEmpty PermissionType)
+getTemporaryGlueTableCredentials_supportedPermissionTypes = Lens.lens (\GetTemporaryGlueTableCredentials' {supportedPermissionTypes} -> supportedPermissionTypes) (\s@GetTemporaryGlueTableCredentials' {} a -> s {supportedPermissionTypes = a} :: GetTemporaryGlueTableCredentials) Prelude.. Lens.coerced
+
+instance
+  Core.AWSRequest
+    GetTemporaryGlueTableCredentials
+  where
+  type
+    AWSResponse GetTemporaryGlueTableCredentials =
+      GetTemporaryGlueTableCredentialsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetTemporaryGlueTableCredentialsResponse'
+            Prelude.<$> (x Data..?> "AccessKeyId")
+            Prelude.<*> (x Data..?> "Expiration")
+            Prelude.<*> (x Data..?> "SecretAccessKey")
+            Prelude.<*> (x Data..?> "SessionToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    GetTemporaryGlueTableCredentials
+  where
+  hashWithSalt
+    _salt
+    GetTemporaryGlueTableCredentials' {..} =
+      _salt
+        `Prelude.hashWithSalt` auditContext
+        `Prelude.hashWithSalt` durationSeconds
+        `Prelude.hashWithSalt` permissions
+        `Prelude.hashWithSalt` tableArn
+        `Prelude.hashWithSalt` supportedPermissionTypes
+
+instance
+  Prelude.NFData
+    GetTemporaryGlueTableCredentials
+  where
+  rnf GetTemporaryGlueTableCredentials' {..} =
+    Prelude.rnf auditContext
+      `Prelude.seq` Prelude.rnf durationSeconds
+      `Prelude.seq` Prelude.rnf permissions
+      `Prelude.seq` Prelude.rnf tableArn
+      `Prelude.seq` Prelude.rnf supportedPermissionTypes
+
+instance
+  Data.ToHeaders
+    GetTemporaryGlueTableCredentials
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetTemporaryGlueTableCredentials where
+  toJSON GetTemporaryGlueTableCredentials' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AuditContext" Data..=) Prelude.<$> auditContext,
+            ("DurationSeconds" Data..=)
+              Prelude.<$> durationSeconds,
+            ("Permissions" Data..=) Prelude.<$> permissions,
+            Prelude.Just ("TableArn" Data..= tableArn),
+            Prelude.Just
+              ( "SupportedPermissionTypes"
+                  Data..= supportedPermissionTypes
+              )
+          ]
+      )
+
+instance Data.ToPath GetTemporaryGlueTableCredentials where
+  toPath =
+    Prelude.const "/GetTemporaryGlueTableCredentials"
+
+instance
+  Data.ToQuery
+    GetTemporaryGlueTableCredentials
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetTemporaryGlueTableCredentialsResponse' smart constructor.
+data GetTemporaryGlueTableCredentialsResponse = GetTemporaryGlueTableCredentialsResponse'
+  { -- | The access key ID for the temporary credentials.
+    accessKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The date and time when the temporary credentials expire.
+    expiration :: Prelude.Maybe Data.POSIX,
+    -- | The secret key for the temporary credentials.
+    secretAccessKey :: Prelude.Maybe Prelude.Text,
+    -- | The session token for the temporary credentials.
+    sessionToken :: 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 'GetTemporaryGlueTableCredentialsResponse' 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:
+--
+-- 'accessKeyId', 'getTemporaryGlueTableCredentialsResponse_accessKeyId' - The access key ID for the temporary credentials.
+--
+-- 'expiration', 'getTemporaryGlueTableCredentialsResponse_expiration' - The date and time when the temporary credentials expire.
+--
+-- 'secretAccessKey', 'getTemporaryGlueTableCredentialsResponse_secretAccessKey' - The secret key for the temporary credentials.
+--
+-- 'sessionToken', 'getTemporaryGlueTableCredentialsResponse_sessionToken' - The session token for the temporary credentials.
+--
+-- 'httpStatus', 'getTemporaryGlueTableCredentialsResponse_httpStatus' - The response's http status code.
+newGetTemporaryGlueTableCredentialsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetTemporaryGlueTableCredentialsResponse
+newGetTemporaryGlueTableCredentialsResponse
+  pHttpStatus_ =
+    GetTemporaryGlueTableCredentialsResponse'
+      { accessKeyId =
+          Prelude.Nothing,
+        expiration = Prelude.Nothing,
+        secretAccessKey = Prelude.Nothing,
+        sessionToken = Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The access key ID for the temporary credentials.
+getTemporaryGlueTableCredentialsResponse_accessKeyId :: Lens.Lens' GetTemporaryGlueTableCredentialsResponse (Prelude.Maybe Prelude.Text)
+getTemporaryGlueTableCredentialsResponse_accessKeyId = Lens.lens (\GetTemporaryGlueTableCredentialsResponse' {accessKeyId} -> accessKeyId) (\s@GetTemporaryGlueTableCredentialsResponse' {} a -> s {accessKeyId = a} :: GetTemporaryGlueTableCredentialsResponse)
+
+-- | The date and time when the temporary credentials expire.
+getTemporaryGlueTableCredentialsResponse_expiration :: Lens.Lens' GetTemporaryGlueTableCredentialsResponse (Prelude.Maybe Prelude.UTCTime)
+getTemporaryGlueTableCredentialsResponse_expiration = Lens.lens (\GetTemporaryGlueTableCredentialsResponse' {expiration} -> expiration) (\s@GetTemporaryGlueTableCredentialsResponse' {} a -> s {expiration = a} :: GetTemporaryGlueTableCredentialsResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The secret key for the temporary credentials.
+getTemporaryGlueTableCredentialsResponse_secretAccessKey :: Lens.Lens' GetTemporaryGlueTableCredentialsResponse (Prelude.Maybe Prelude.Text)
+getTemporaryGlueTableCredentialsResponse_secretAccessKey = Lens.lens (\GetTemporaryGlueTableCredentialsResponse' {secretAccessKey} -> secretAccessKey) (\s@GetTemporaryGlueTableCredentialsResponse' {} a -> s {secretAccessKey = a} :: GetTemporaryGlueTableCredentialsResponse)
+
+-- | The session token for the temporary credentials.
+getTemporaryGlueTableCredentialsResponse_sessionToken :: Lens.Lens' GetTemporaryGlueTableCredentialsResponse (Prelude.Maybe Prelude.Text)
+getTemporaryGlueTableCredentialsResponse_sessionToken = Lens.lens (\GetTemporaryGlueTableCredentialsResponse' {sessionToken} -> sessionToken) (\s@GetTemporaryGlueTableCredentialsResponse' {} a -> s {sessionToken = a} :: GetTemporaryGlueTableCredentialsResponse)
+
+-- | The response's http status code.
+getTemporaryGlueTableCredentialsResponse_httpStatus :: Lens.Lens' GetTemporaryGlueTableCredentialsResponse Prelude.Int
+getTemporaryGlueTableCredentialsResponse_httpStatus = Lens.lens (\GetTemporaryGlueTableCredentialsResponse' {httpStatus} -> httpStatus) (\s@GetTemporaryGlueTableCredentialsResponse' {} a -> s {httpStatus = a} :: GetTemporaryGlueTableCredentialsResponse)
+
+instance
+  Prelude.NFData
+    GetTemporaryGlueTableCredentialsResponse
+  where
+  rnf GetTemporaryGlueTableCredentialsResponse' {..} =
+    Prelude.rnf accessKeyId
+      `Prelude.seq` Prelude.rnf expiration
+      `Prelude.seq` Prelude.rnf secretAccessKey
+      `Prelude.seq` Prelude.rnf sessionToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/GetWorkUnitResults.hs b/gen/Amazonka/LakeFormation/GetWorkUnitResults.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetWorkUnitResults.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.LakeFormation.GetWorkUnitResults
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the work units resulting from the query. Work units can be
+-- executed in any order and in parallel.
+module Amazonka.LakeFormation.GetWorkUnitResults
+  ( -- * Creating a Request
+    GetWorkUnitResults (..),
+    newGetWorkUnitResults,
+
+    -- * Request Lenses
+    getWorkUnitResults_queryId,
+    getWorkUnitResults_workUnitId,
+    getWorkUnitResults_workUnitToken,
+
+    -- * Destructuring the Response
+    GetWorkUnitResultsResponse (..),
+    newGetWorkUnitResultsResponse,
+
+    -- * Response Lenses
+    getWorkUnitResultsResponse_httpStatus,
+    getWorkUnitResultsResponse_resultStream,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetWorkUnitResults' smart constructor.
+data GetWorkUnitResults = GetWorkUnitResults'
+  { -- | The ID of the plan query operation for which to get results.
+    queryId :: Prelude.Text,
+    -- | The work unit ID for which to get results. Value generated by
+    -- enumerating @WorkUnitIdMin@ to @WorkUnitIdMax@ (inclusive) from the
+    -- @WorkUnitRange@ in the output of @GetWorkUnits@.
+    workUnitId :: Prelude.Natural,
+    -- | A work token used to query the execution service. Token output from
+    -- @GetWorkUnits@.
+    workUnitToken :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetWorkUnitResults' 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:
+--
+-- 'queryId', 'getWorkUnitResults_queryId' - The ID of the plan query operation for which to get results.
+--
+-- 'workUnitId', 'getWorkUnitResults_workUnitId' - The work unit ID for which to get results. Value generated by
+-- enumerating @WorkUnitIdMin@ to @WorkUnitIdMax@ (inclusive) from the
+-- @WorkUnitRange@ in the output of @GetWorkUnits@.
+--
+-- 'workUnitToken', 'getWorkUnitResults_workUnitToken' - A work token used to query the execution service. Token output from
+-- @GetWorkUnits@.
+newGetWorkUnitResults ::
+  -- | 'queryId'
+  Prelude.Text ->
+  -- | 'workUnitId'
+  Prelude.Natural ->
+  -- | 'workUnitToken'
+  Prelude.Text ->
+  GetWorkUnitResults
+newGetWorkUnitResults
+  pQueryId_
+  pWorkUnitId_
+  pWorkUnitToken_ =
+    GetWorkUnitResults'
+      { queryId = pQueryId_,
+        workUnitId = pWorkUnitId_,
+        workUnitToken =
+          Data._Sensitive Lens.# pWorkUnitToken_
+      }
+
+-- | The ID of the plan query operation for which to get results.
+getWorkUnitResults_queryId :: Lens.Lens' GetWorkUnitResults Prelude.Text
+getWorkUnitResults_queryId = Lens.lens (\GetWorkUnitResults' {queryId} -> queryId) (\s@GetWorkUnitResults' {} a -> s {queryId = a} :: GetWorkUnitResults)
+
+-- | The work unit ID for which to get results. Value generated by
+-- enumerating @WorkUnitIdMin@ to @WorkUnitIdMax@ (inclusive) from the
+-- @WorkUnitRange@ in the output of @GetWorkUnits@.
+getWorkUnitResults_workUnitId :: Lens.Lens' GetWorkUnitResults Prelude.Natural
+getWorkUnitResults_workUnitId = Lens.lens (\GetWorkUnitResults' {workUnitId} -> workUnitId) (\s@GetWorkUnitResults' {} a -> s {workUnitId = a} :: GetWorkUnitResults)
+
+-- | A work token used to query the execution service. Token output from
+-- @GetWorkUnits@.
+getWorkUnitResults_workUnitToken :: Lens.Lens' GetWorkUnitResults Prelude.Text
+getWorkUnitResults_workUnitToken = Lens.lens (\GetWorkUnitResults' {workUnitToken} -> workUnitToken) (\s@GetWorkUnitResults' {} a -> s {workUnitToken = a} :: GetWorkUnitResults) Prelude.. Data._Sensitive
+
+instance Core.AWSRequest GetWorkUnitResults where
+  type
+    AWSResponse GetWorkUnitResults =
+      GetWorkUnitResultsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveBody
+      ( \s h x ->
+          GetWorkUnitResultsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Prelude.pure x)
+      )
+
+instance Prelude.Hashable GetWorkUnitResults where
+  hashWithSalt _salt GetWorkUnitResults' {..} =
+    _salt
+      `Prelude.hashWithSalt` queryId
+      `Prelude.hashWithSalt` workUnitId
+      `Prelude.hashWithSalt` workUnitToken
+
+instance Prelude.NFData GetWorkUnitResults where
+  rnf GetWorkUnitResults' {..} =
+    Prelude.rnf queryId
+      `Prelude.seq` Prelude.rnf workUnitId
+      `Prelude.seq` Prelude.rnf workUnitToken
+
+instance Data.ToHeaders GetWorkUnitResults where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetWorkUnitResults where
+  toJSON GetWorkUnitResults' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("QueryId" Data..= queryId),
+            Prelude.Just ("WorkUnitId" Data..= workUnitId),
+            Prelude.Just
+              ("WorkUnitToken" Data..= workUnitToken)
+          ]
+      )
+
+instance Data.ToPath GetWorkUnitResults where
+  toPath = Prelude.const "/GetWorkUnitResults"
+
+instance Data.ToQuery GetWorkUnitResults where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | A structure for the output.
+--
+-- /See:/ 'newGetWorkUnitResultsResponse' smart constructor.
+data GetWorkUnitResultsResponse = GetWorkUnitResultsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Rows returned from the @GetWorkUnitResults@ operation as a stream of
+    -- Apache Arrow v1.0 messages.
+    resultStream :: Data.ResponseBody
+  }
+  deriving (Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetWorkUnitResultsResponse' 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', 'getWorkUnitResultsResponse_httpStatus' - The response's http status code.
+--
+-- 'resultStream', 'getWorkUnitResultsResponse_resultStream' - Rows returned from the @GetWorkUnitResults@ operation as a stream of
+-- Apache Arrow v1.0 messages.
+newGetWorkUnitResultsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'resultStream'
+  Data.ResponseBody ->
+  GetWorkUnitResultsResponse
+newGetWorkUnitResultsResponse
+  pHttpStatus_
+  pResultStream_ =
+    GetWorkUnitResultsResponse'
+      { httpStatus =
+          pHttpStatus_,
+        resultStream = pResultStream_
+      }
+
+-- | The response's http status code.
+getWorkUnitResultsResponse_httpStatus :: Lens.Lens' GetWorkUnitResultsResponse Prelude.Int
+getWorkUnitResultsResponse_httpStatus = Lens.lens (\GetWorkUnitResultsResponse' {httpStatus} -> httpStatus) (\s@GetWorkUnitResultsResponse' {} a -> s {httpStatus = a} :: GetWorkUnitResultsResponse)
+
+-- | Rows returned from the @GetWorkUnitResults@ operation as a stream of
+-- Apache Arrow v1.0 messages.
+getWorkUnitResultsResponse_resultStream :: Lens.Lens' GetWorkUnitResultsResponse Data.ResponseBody
+getWorkUnitResultsResponse_resultStream = Lens.lens (\GetWorkUnitResultsResponse' {resultStream} -> resultStream) (\s@GetWorkUnitResultsResponse' {} a -> s {resultStream = a} :: GetWorkUnitResultsResponse)
diff --git a/gen/Amazonka/LakeFormation/GetWorkUnits.hs b/gen/Amazonka/LakeFormation/GetWorkUnits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GetWorkUnits.hs
@@ -0,0 +1,263 @@
+{-# 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.LakeFormation.GetWorkUnits
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the work units generated by the @StartQueryPlanning@
+-- operation.
+--
+-- This operation returns paginated results.
+module Amazonka.LakeFormation.GetWorkUnits
+  ( -- * Creating a Request
+    GetWorkUnits (..),
+    newGetWorkUnits,
+
+    -- * Request Lenses
+    getWorkUnits_nextToken,
+    getWorkUnits_pageSize,
+    getWorkUnits_queryId,
+
+    -- * Destructuring the Response
+    GetWorkUnitsResponse (..),
+    newGetWorkUnitsResponse,
+
+    -- * Response Lenses
+    getWorkUnitsResponse_nextToken,
+    getWorkUnitsResponse_httpStatus,
+    getWorkUnitsResponse_queryId,
+    getWorkUnitsResponse_workUnitRanges,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetWorkUnits' smart constructor.
+data GetWorkUnits = GetWorkUnits'
+  { -- | A continuation token, if this is a continuation call.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The size of each page to get in the Amazon Web Services service call.
+    -- This does not affect the number of items returned in the command\'s
+    -- output. Setting a smaller page size results in more calls to the Amazon
+    -- Web Services service, retrieving fewer items in each call. This can help
+    -- prevent the Amazon Web Services service calls from timing out.
+    pageSize :: Prelude.Maybe Prelude.Int,
+    -- | The ID of the plan query operation.
+    queryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetWorkUnits' 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', 'getWorkUnits_nextToken' - A continuation token, if this is a continuation call.
+--
+-- 'pageSize', 'getWorkUnits_pageSize' - The size of each page to get in the Amazon Web Services service call.
+-- This does not affect the number of items returned in the command\'s
+-- output. Setting a smaller page size results in more calls to the Amazon
+-- Web Services service, retrieving fewer items in each call. This can help
+-- prevent the Amazon Web Services service calls from timing out.
+--
+-- 'queryId', 'getWorkUnits_queryId' - The ID of the plan query operation.
+newGetWorkUnits ::
+  -- | 'queryId'
+  Prelude.Text ->
+  GetWorkUnits
+newGetWorkUnits pQueryId_ =
+  GetWorkUnits'
+    { nextToken = Prelude.Nothing,
+      pageSize = Prelude.Nothing,
+      queryId = pQueryId_
+    }
+
+-- | A continuation token, if this is a continuation call.
+getWorkUnits_nextToken :: Lens.Lens' GetWorkUnits (Prelude.Maybe Prelude.Text)
+getWorkUnits_nextToken = Lens.lens (\GetWorkUnits' {nextToken} -> nextToken) (\s@GetWorkUnits' {} a -> s {nextToken = a} :: GetWorkUnits)
+
+-- | The size of each page to get in the Amazon Web Services service call.
+-- This does not affect the number of items returned in the command\'s
+-- output. Setting a smaller page size results in more calls to the Amazon
+-- Web Services service, retrieving fewer items in each call. This can help
+-- prevent the Amazon Web Services service calls from timing out.
+getWorkUnits_pageSize :: Lens.Lens' GetWorkUnits (Prelude.Maybe Prelude.Int)
+getWorkUnits_pageSize = Lens.lens (\GetWorkUnits' {pageSize} -> pageSize) (\s@GetWorkUnits' {} a -> s {pageSize = a} :: GetWorkUnits)
+
+-- | The ID of the plan query operation.
+getWorkUnits_queryId :: Lens.Lens' GetWorkUnits Prelude.Text
+getWorkUnits_queryId = Lens.lens (\GetWorkUnits' {queryId} -> queryId) (\s@GetWorkUnits' {} a -> s {queryId = a} :: GetWorkUnits)
+
+instance Core.AWSPager GetWorkUnits where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? getWorkUnitsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. getWorkUnitsResponse_workUnitRanges) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& getWorkUnits_nextToken
+          Lens..~ rs
+          Lens.^? getWorkUnitsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest GetWorkUnits where
+  type AWSResponse GetWorkUnits = GetWorkUnitsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetWorkUnitsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "QueryId")
+            Prelude.<*> ( x
+                            Data..?> "WorkUnitRanges"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable GetWorkUnits where
+  hashWithSalt _salt GetWorkUnits' {..} =
+    _salt
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` pageSize
+      `Prelude.hashWithSalt` queryId
+
+instance Prelude.NFData GetWorkUnits where
+  rnf GetWorkUnits' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf pageSize
+      `Prelude.seq` Prelude.rnf queryId
+
+instance Data.ToHeaders GetWorkUnits where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetWorkUnits where
+  toJSON GetWorkUnits' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("PageSize" Data..=) Prelude.<$> pageSize,
+            Prelude.Just ("QueryId" Data..= queryId)
+          ]
+      )
+
+instance Data.ToPath GetWorkUnits where
+  toPath = Prelude.const "/GetWorkUnits"
+
+instance Data.ToQuery GetWorkUnits where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | A structure for the output.
+--
+-- /See:/ 'newGetWorkUnitsResponse' smart constructor.
+data GetWorkUnitsResponse = GetWorkUnitsResponse'
+  { -- | A continuation token for paginating the returned list of tokens,
+    -- returned if the current segment of the list is not the last.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the plan query operation.
+    queryId :: Prelude.Text,
+    -- | A @WorkUnitRangeList@ object that specifies the valid range of work unit
+    -- IDs for querying the execution service.
+    workUnitRanges :: [WorkUnitRange]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetWorkUnitsResponse' 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', 'getWorkUnitsResponse_nextToken' - A continuation token for paginating the returned list of tokens,
+-- returned if the current segment of the list is not the last.
+--
+-- 'httpStatus', 'getWorkUnitsResponse_httpStatus' - The response's http status code.
+--
+-- 'queryId', 'getWorkUnitsResponse_queryId' - The ID of the plan query operation.
+--
+-- 'workUnitRanges', 'getWorkUnitsResponse_workUnitRanges' - A @WorkUnitRangeList@ object that specifies the valid range of work unit
+-- IDs for querying the execution service.
+newGetWorkUnitsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'queryId'
+  Prelude.Text ->
+  GetWorkUnitsResponse
+newGetWorkUnitsResponse pHttpStatus_ pQueryId_ =
+  GetWorkUnitsResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      queryId = pQueryId_,
+      workUnitRanges = Prelude.mempty
+    }
+
+-- | A continuation token for paginating the returned list of tokens,
+-- returned if the current segment of the list is not the last.
+getWorkUnitsResponse_nextToken :: Lens.Lens' GetWorkUnitsResponse (Prelude.Maybe Prelude.Text)
+getWorkUnitsResponse_nextToken = Lens.lens (\GetWorkUnitsResponse' {nextToken} -> nextToken) (\s@GetWorkUnitsResponse' {} a -> s {nextToken = a} :: GetWorkUnitsResponse)
+
+-- | The response's http status code.
+getWorkUnitsResponse_httpStatus :: Lens.Lens' GetWorkUnitsResponse Prelude.Int
+getWorkUnitsResponse_httpStatus = Lens.lens (\GetWorkUnitsResponse' {httpStatus} -> httpStatus) (\s@GetWorkUnitsResponse' {} a -> s {httpStatus = a} :: GetWorkUnitsResponse)
+
+-- | The ID of the plan query operation.
+getWorkUnitsResponse_queryId :: Lens.Lens' GetWorkUnitsResponse Prelude.Text
+getWorkUnitsResponse_queryId = Lens.lens (\GetWorkUnitsResponse' {queryId} -> queryId) (\s@GetWorkUnitsResponse' {} a -> s {queryId = a} :: GetWorkUnitsResponse)
+
+-- | A @WorkUnitRangeList@ object that specifies the valid range of work unit
+-- IDs for querying the execution service.
+getWorkUnitsResponse_workUnitRanges :: Lens.Lens' GetWorkUnitsResponse [WorkUnitRange]
+getWorkUnitsResponse_workUnitRanges = Lens.lens (\GetWorkUnitsResponse' {workUnitRanges} -> workUnitRanges) (\s@GetWorkUnitsResponse' {} a -> s {workUnitRanges = a} :: GetWorkUnitsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData GetWorkUnitsResponse where
+  rnf GetWorkUnitsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf queryId
+      `Prelude.seq` Prelude.rnf workUnitRanges
diff --git a/gen/Amazonka/LakeFormation/GrantPermissions.hs b/gen/Amazonka/LakeFormation/GrantPermissions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/GrantPermissions.hs
@@ -0,0 +1,264 @@
+{-# 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.LakeFormation.GrantPermissions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Grants permissions to the principal to access metadata in the Data
+-- Catalog and data organized in underlying data storage such as Amazon S3.
+--
+-- For information about permissions, see
+-- <https://docs-aws.amazon.com/lake-formation/latest/dg/security-data-access.html Security and Access Control to Metadata and Data>.
+module Amazonka.LakeFormation.GrantPermissions
+  ( -- * Creating a Request
+    GrantPermissions (..),
+    newGrantPermissions,
+
+    -- * Request Lenses
+    grantPermissions_catalogId,
+    grantPermissions_permissionsWithGrantOption,
+    grantPermissions_principal,
+    grantPermissions_resource,
+    grantPermissions_permissions,
+
+    -- * Destructuring the Response
+    GrantPermissionsResponse (..),
+    newGrantPermissionsResponse,
+
+    -- * Response Lenses
+    grantPermissionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGrantPermissions' smart constructor.
+data GrantPermissions = GrantPermissions'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | Indicates a list of the granted permissions that the principal may pass
+    -- to other users. These permissions may only be a subset of the
+    -- permissions granted in the @Privileges@.
+    permissionsWithGrantOption :: Prelude.Maybe [Permission],
+    -- | The principal to be granted the permissions on the resource. Supported
+    -- principals are IAM users or IAM roles, and they are defined by their
+    -- principal type and their ARN.
+    --
+    -- Note that if you define a resource with a particular ARN, then later
+    -- delete, and recreate a resource with that same ARN, the resource
+    -- maintains the permissions already granted.
+    principal :: DataLakePrincipal,
+    -- | The resource to which permissions are to be granted. Resources in Lake
+    -- Formation are the Data Catalog, databases, and tables.
+    resource :: Resource,
+    -- | The permissions granted to the principal on the resource. Lake Formation
+    -- defines privileges to grant and revoke access to metadata in the Data
+    -- Catalog and data organized in underlying data storage such as Amazon S3.
+    -- Lake Formation requires that each principal be authorized to perform a
+    -- specific task on Lake Formation resources.
+    permissions :: [Permission]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrantPermissions' 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:
+--
+-- 'catalogId', 'grantPermissions_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'permissionsWithGrantOption', 'grantPermissions_permissionsWithGrantOption' - Indicates a list of the granted permissions that the principal may pass
+-- to other users. These permissions may only be a subset of the
+-- permissions granted in the @Privileges@.
+--
+-- 'principal', 'grantPermissions_principal' - The principal to be granted the permissions on the resource. Supported
+-- principals are IAM users or IAM roles, and they are defined by their
+-- principal type and their ARN.
+--
+-- Note that if you define a resource with a particular ARN, then later
+-- delete, and recreate a resource with that same ARN, the resource
+-- maintains the permissions already granted.
+--
+-- 'resource', 'grantPermissions_resource' - The resource to which permissions are to be granted. Resources in Lake
+-- Formation are the Data Catalog, databases, and tables.
+--
+-- 'permissions', 'grantPermissions_permissions' - The permissions granted to the principal on the resource. Lake Formation
+-- defines privileges to grant and revoke access to metadata in the Data
+-- Catalog and data organized in underlying data storage such as Amazon S3.
+-- Lake Formation requires that each principal be authorized to perform a
+-- specific task on Lake Formation resources.
+newGrantPermissions ::
+  -- | 'principal'
+  DataLakePrincipal ->
+  -- | 'resource'
+  Resource ->
+  GrantPermissions
+newGrantPermissions pPrincipal_ pResource_ =
+  GrantPermissions'
+    { catalogId = Prelude.Nothing,
+      permissionsWithGrantOption = Prelude.Nothing,
+      principal = pPrincipal_,
+      resource = pResource_,
+      permissions = Prelude.mempty
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+grantPermissions_catalogId :: Lens.Lens' GrantPermissions (Prelude.Maybe Prelude.Text)
+grantPermissions_catalogId = Lens.lens (\GrantPermissions' {catalogId} -> catalogId) (\s@GrantPermissions' {} a -> s {catalogId = a} :: GrantPermissions)
+
+-- | Indicates a list of the granted permissions that the principal may pass
+-- to other users. These permissions may only be a subset of the
+-- permissions granted in the @Privileges@.
+grantPermissions_permissionsWithGrantOption :: Lens.Lens' GrantPermissions (Prelude.Maybe [Permission])
+grantPermissions_permissionsWithGrantOption = Lens.lens (\GrantPermissions' {permissionsWithGrantOption} -> permissionsWithGrantOption) (\s@GrantPermissions' {} a -> s {permissionsWithGrantOption = a} :: GrantPermissions) Prelude.. Lens.mapping Lens.coerced
+
+-- | The principal to be granted the permissions on the resource. Supported
+-- principals are IAM users or IAM roles, and they are defined by their
+-- principal type and their ARN.
+--
+-- Note that if you define a resource with a particular ARN, then later
+-- delete, and recreate a resource with that same ARN, the resource
+-- maintains the permissions already granted.
+grantPermissions_principal :: Lens.Lens' GrantPermissions DataLakePrincipal
+grantPermissions_principal = Lens.lens (\GrantPermissions' {principal} -> principal) (\s@GrantPermissions' {} a -> s {principal = a} :: GrantPermissions)
+
+-- | The resource to which permissions are to be granted. Resources in Lake
+-- Formation are the Data Catalog, databases, and tables.
+grantPermissions_resource :: Lens.Lens' GrantPermissions Resource
+grantPermissions_resource = Lens.lens (\GrantPermissions' {resource} -> resource) (\s@GrantPermissions' {} a -> s {resource = a} :: GrantPermissions)
+
+-- | The permissions granted to the principal on the resource. Lake Formation
+-- defines privileges to grant and revoke access to metadata in the Data
+-- Catalog and data organized in underlying data storage such as Amazon S3.
+-- Lake Formation requires that each principal be authorized to perform a
+-- specific task on Lake Formation resources.
+grantPermissions_permissions :: Lens.Lens' GrantPermissions [Permission]
+grantPermissions_permissions = Lens.lens (\GrantPermissions' {permissions} -> permissions) (\s@GrantPermissions' {} a -> s {permissions = a} :: GrantPermissions) Prelude.. Lens.coerced
+
+instance Core.AWSRequest GrantPermissions where
+  type
+    AWSResponse GrantPermissions =
+      GrantPermissionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          GrantPermissionsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GrantPermissions where
+  hashWithSalt _salt GrantPermissions' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` permissionsWithGrantOption
+      `Prelude.hashWithSalt` principal
+      `Prelude.hashWithSalt` resource
+      `Prelude.hashWithSalt` permissions
+
+instance Prelude.NFData GrantPermissions where
+  rnf GrantPermissions' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf permissionsWithGrantOption
+      `Prelude.seq` Prelude.rnf principal
+      `Prelude.seq` Prelude.rnf resource
+      `Prelude.seq` Prelude.rnf permissions
+
+instance Data.ToHeaders GrantPermissions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GrantPermissions where
+  toJSON GrantPermissions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("PermissionsWithGrantOption" Data..=)
+              Prelude.<$> permissionsWithGrantOption,
+            Prelude.Just ("Principal" Data..= principal),
+            Prelude.Just ("Resource" Data..= resource),
+            Prelude.Just ("Permissions" Data..= permissions)
+          ]
+      )
+
+instance Data.ToPath GrantPermissions where
+  toPath = Prelude.const "/GrantPermissions"
+
+instance Data.ToQuery GrantPermissions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGrantPermissionsResponse' smart constructor.
+data GrantPermissionsResponse = GrantPermissionsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrantPermissionsResponse' 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', 'grantPermissionsResponse_httpStatus' - The response's http status code.
+newGrantPermissionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GrantPermissionsResponse
+newGrantPermissionsResponse pHttpStatus_ =
+  GrantPermissionsResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+grantPermissionsResponse_httpStatus :: Lens.Lens' GrantPermissionsResponse Prelude.Int
+grantPermissionsResponse_httpStatus = Lens.lens (\GrantPermissionsResponse' {httpStatus} -> httpStatus) (\s@GrantPermissionsResponse' {} a -> s {httpStatus = a} :: GrantPermissionsResponse)
+
+instance Prelude.NFData GrantPermissionsResponse where
+  rnf GrantPermissionsResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/Lens.hs b/gen/Amazonka/LakeFormation/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Lens.hs
@@ -0,0 +1,660 @@
+{-# 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.LakeFormation.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.LakeFormation.Lens
+  ( -- * Operations
+
+    -- ** AddLFTagsToResource
+    addLFTagsToResource_catalogId,
+    addLFTagsToResource_resource,
+    addLFTagsToResource_lFTags,
+    addLFTagsToResourceResponse_failures,
+    addLFTagsToResourceResponse_httpStatus,
+
+    -- ** AssumeDecoratedRoleWithSAML
+    assumeDecoratedRoleWithSAML_durationSeconds,
+    assumeDecoratedRoleWithSAML_sAMLAssertion,
+    assumeDecoratedRoleWithSAML_roleArn,
+    assumeDecoratedRoleWithSAML_principalArn,
+    assumeDecoratedRoleWithSAMLResponse_accessKeyId,
+    assumeDecoratedRoleWithSAMLResponse_expiration,
+    assumeDecoratedRoleWithSAMLResponse_secretAccessKey,
+    assumeDecoratedRoleWithSAMLResponse_sessionToken,
+    assumeDecoratedRoleWithSAMLResponse_httpStatus,
+
+    -- ** BatchGrantPermissions
+    batchGrantPermissions_catalogId,
+    batchGrantPermissions_entries,
+    batchGrantPermissionsResponse_failures,
+    batchGrantPermissionsResponse_httpStatus,
+
+    -- ** BatchRevokePermissions
+    batchRevokePermissions_catalogId,
+    batchRevokePermissions_entries,
+    batchRevokePermissionsResponse_failures,
+    batchRevokePermissionsResponse_httpStatus,
+
+    -- ** CancelTransaction
+    cancelTransaction_transactionId,
+    cancelTransactionResponse_httpStatus,
+
+    -- ** CommitTransaction
+    commitTransaction_transactionId,
+    commitTransactionResponse_transactionStatus,
+    commitTransactionResponse_httpStatus,
+
+    -- ** CreateDataCellsFilter
+    createDataCellsFilter_tableData,
+    createDataCellsFilterResponse_httpStatus,
+
+    -- ** CreateLFTag
+    createLFTag_catalogId,
+    createLFTag_tagKey,
+    createLFTag_tagValues,
+    createLFTagResponse_httpStatus,
+
+    -- ** DeleteDataCellsFilter
+    deleteDataCellsFilter_databaseName,
+    deleteDataCellsFilter_name,
+    deleteDataCellsFilter_tableCatalogId,
+    deleteDataCellsFilter_tableName,
+    deleteDataCellsFilterResponse_httpStatus,
+
+    -- ** DeleteLFTag
+    deleteLFTag_catalogId,
+    deleteLFTag_tagKey,
+    deleteLFTagResponse_httpStatus,
+
+    -- ** DeleteObjectsOnCancel
+    deleteObjectsOnCancel_catalogId,
+    deleteObjectsOnCancel_databaseName,
+    deleteObjectsOnCancel_tableName,
+    deleteObjectsOnCancel_transactionId,
+    deleteObjectsOnCancel_objects,
+    deleteObjectsOnCancelResponse_httpStatus,
+
+    -- ** DeregisterResource
+    deregisterResource_resourceArn,
+    deregisterResourceResponse_httpStatus,
+
+    -- ** DescribeResource
+    describeResource_resourceArn,
+    describeResourceResponse_resourceInfo,
+    describeResourceResponse_httpStatus,
+
+    -- ** DescribeTransaction
+    describeTransaction_transactionId,
+    describeTransactionResponse_transactionDescription,
+    describeTransactionResponse_httpStatus,
+
+    -- ** ExtendTransaction
+    extendTransaction_transactionId,
+    extendTransactionResponse_httpStatus,
+
+    -- ** GetDataLakeSettings
+    getDataLakeSettings_catalogId,
+    getDataLakeSettingsResponse_dataLakeSettings,
+    getDataLakeSettingsResponse_httpStatus,
+
+    -- ** GetEffectivePermissionsForPath
+    getEffectivePermissionsForPath_catalogId,
+    getEffectivePermissionsForPath_maxResults,
+    getEffectivePermissionsForPath_nextToken,
+    getEffectivePermissionsForPath_resourceArn,
+    getEffectivePermissionsForPathResponse_nextToken,
+    getEffectivePermissionsForPathResponse_permissions,
+    getEffectivePermissionsForPathResponse_httpStatus,
+
+    -- ** GetLFTag
+    getLFTag_catalogId,
+    getLFTag_tagKey,
+    getLFTagResponse_catalogId,
+    getLFTagResponse_tagKey,
+    getLFTagResponse_tagValues,
+    getLFTagResponse_httpStatus,
+
+    -- ** GetQueryState
+    getQueryState_queryId,
+    getQueryStateResponse_error,
+    getQueryStateResponse_httpStatus,
+    getQueryStateResponse_state,
+
+    -- ** GetQueryStatistics
+    getQueryStatistics_queryId,
+    getQueryStatisticsResponse_executionStatistics,
+    getQueryStatisticsResponse_planningStatistics,
+    getQueryStatisticsResponse_querySubmissionTime,
+    getQueryStatisticsResponse_httpStatus,
+
+    -- ** GetResourceLFTags
+    getResourceLFTags_catalogId,
+    getResourceLFTags_showAssignedLFTags,
+    getResourceLFTags_resource,
+    getResourceLFTagsResponse_lFTagOnDatabase,
+    getResourceLFTagsResponse_lFTagsOnColumns,
+    getResourceLFTagsResponse_lFTagsOnTable,
+    getResourceLFTagsResponse_httpStatus,
+
+    -- ** GetTableObjects
+    getTableObjects_catalogId,
+    getTableObjects_maxResults,
+    getTableObjects_nextToken,
+    getTableObjects_partitionPredicate,
+    getTableObjects_queryAsOfTime,
+    getTableObjects_transactionId,
+    getTableObjects_databaseName,
+    getTableObjects_tableName,
+    getTableObjectsResponse_nextToken,
+    getTableObjectsResponse_objects,
+    getTableObjectsResponse_httpStatus,
+
+    -- ** GetTemporaryGluePartitionCredentials
+    getTemporaryGluePartitionCredentials_auditContext,
+    getTemporaryGluePartitionCredentials_durationSeconds,
+    getTemporaryGluePartitionCredentials_permissions,
+    getTemporaryGluePartitionCredentials_tableArn,
+    getTemporaryGluePartitionCredentials_partition,
+    getTemporaryGluePartitionCredentials_supportedPermissionTypes,
+    getTemporaryGluePartitionCredentialsResponse_accessKeyId,
+    getTemporaryGluePartitionCredentialsResponse_expiration,
+    getTemporaryGluePartitionCredentialsResponse_secretAccessKey,
+    getTemporaryGluePartitionCredentialsResponse_sessionToken,
+    getTemporaryGluePartitionCredentialsResponse_httpStatus,
+
+    -- ** GetTemporaryGlueTableCredentials
+    getTemporaryGlueTableCredentials_auditContext,
+    getTemporaryGlueTableCredentials_durationSeconds,
+    getTemporaryGlueTableCredentials_permissions,
+    getTemporaryGlueTableCredentials_tableArn,
+    getTemporaryGlueTableCredentials_supportedPermissionTypes,
+    getTemporaryGlueTableCredentialsResponse_accessKeyId,
+    getTemporaryGlueTableCredentialsResponse_expiration,
+    getTemporaryGlueTableCredentialsResponse_secretAccessKey,
+    getTemporaryGlueTableCredentialsResponse_sessionToken,
+    getTemporaryGlueTableCredentialsResponse_httpStatus,
+
+    -- ** GetWorkUnitResults
+    getWorkUnitResults_queryId,
+    getWorkUnitResults_workUnitId,
+    getWorkUnitResults_workUnitToken,
+    getWorkUnitResultsResponse_httpStatus,
+    getWorkUnitResultsResponse_resultStream,
+
+    -- ** GetWorkUnits
+    getWorkUnits_nextToken,
+    getWorkUnits_pageSize,
+    getWorkUnits_queryId,
+    getWorkUnitsResponse_nextToken,
+    getWorkUnitsResponse_httpStatus,
+    getWorkUnitsResponse_queryId,
+    getWorkUnitsResponse_workUnitRanges,
+
+    -- ** GrantPermissions
+    grantPermissions_catalogId,
+    grantPermissions_permissionsWithGrantOption,
+    grantPermissions_principal,
+    grantPermissions_resource,
+    grantPermissions_permissions,
+    grantPermissionsResponse_httpStatus,
+
+    -- ** ListDataCellsFilter
+    listDataCellsFilter_maxResults,
+    listDataCellsFilter_nextToken,
+    listDataCellsFilter_table,
+    listDataCellsFilterResponse_dataCellsFilters,
+    listDataCellsFilterResponse_nextToken,
+    listDataCellsFilterResponse_httpStatus,
+
+    -- ** ListLFTags
+    listLFTags_catalogId,
+    listLFTags_maxResults,
+    listLFTags_nextToken,
+    listLFTags_resourceShareType,
+    listLFTagsResponse_lFTags,
+    listLFTagsResponse_nextToken,
+    listLFTagsResponse_httpStatus,
+
+    -- ** ListPermissions
+    listPermissions_catalogId,
+    listPermissions_includeRelated,
+    listPermissions_maxResults,
+    listPermissions_nextToken,
+    listPermissions_principal,
+    listPermissions_resource,
+    listPermissions_resourceType,
+    listPermissionsResponse_nextToken,
+    listPermissionsResponse_principalResourcePermissions,
+    listPermissionsResponse_httpStatus,
+
+    -- ** ListResources
+    listResources_filterConditionList,
+    listResources_maxResults,
+    listResources_nextToken,
+    listResourcesResponse_nextToken,
+    listResourcesResponse_resourceInfoList,
+    listResourcesResponse_httpStatus,
+
+    -- ** ListTableStorageOptimizers
+    listTableStorageOptimizers_catalogId,
+    listTableStorageOptimizers_maxResults,
+    listTableStorageOptimizers_nextToken,
+    listTableStorageOptimizers_storageOptimizerType,
+    listTableStorageOptimizers_databaseName,
+    listTableStorageOptimizers_tableName,
+    listTableStorageOptimizersResponse_nextToken,
+    listTableStorageOptimizersResponse_storageOptimizerList,
+    listTableStorageOptimizersResponse_httpStatus,
+
+    -- ** ListTransactions
+    listTransactions_catalogId,
+    listTransactions_maxResults,
+    listTransactions_nextToken,
+    listTransactions_statusFilter,
+    listTransactionsResponse_nextToken,
+    listTransactionsResponse_transactions,
+    listTransactionsResponse_httpStatus,
+
+    -- ** PutDataLakeSettings
+    putDataLakeSettings_catalogId,
+    putDataLakeSettings_dataLakeSettings,
+    putDataLakeSettingsResponse_httpStatus,
+
+    -- ** RegisterResource
+    registerResource_roleArn,
+    registerResource_useServiceLinkedRole,
+    registerResource_resourceArn,
+    registerResourceResponse_httpStatus,
+
+    -- ** RemoveLFTagsFromResource
+    removeLFTagsFromResource_catalogId,
+    removeLFTagsFromResource_resource,
+    removeLFTagsFromResource_lFTags,
+    removeLFTagsFromResourceResponse_failures,
+    removeLFTagsFromResourceResponse_httpStatus,
+
+    -- ** RevokePermissions
+    revokePermissions_catalogId,
+    revokePermissions_permissionsWithGrantOption,
+    revokePermissions_principal,
+    revokePermissions_resource,
+    revokePermissions_permissions,
+    revokePermissionsResponse_httpStatus,
+
+    -- ** SearchDatabasesByLFTags
+    searchDatabasesByLFTags_catalogId,
+    searchDatabasesByLFTags_maxResults,
+    searchDatabasesByLFTags_nextToken,
+    searchDatabasesByLFTags_expression,
+    searchDatabasesByLFTagsResponse_databaseList,
+    searchDatabasesByLFTagsResponse_nextToken,
+    searchDatabasesByLFTagsResponse_httpStatus,
+
+    -- ** SearchTablesByLFTags
+    searchTablesByLFTags_catalogId,
+    searchTablesByLFTags_maxResults,
+    searchTablesByLFTags_nextToken,
+    searchTablesByLFTags_expression,
+    searchTablesByLFTagsResponse_nextToken,
+    searchTablesByLFTagsResponse_tableList,
+    searchTablesByLFTagsResponse_httpStatus,
+
+    -- ** StartQueryPlanning
+    startQueryPlanning_queryPlanningContext,
+    startQueryPlanning_queryString,
+    startQueryPlanningResponse_httpStatus,
+    startQueryPlanningResponse_queryId,
+
+    -- ** StartTransaction
+    startTransaction_transactionType,
+    startTransactionResponse_transactionId,
+    startTransactionResponse_httpStatus,
+
+    -- ** UpdateLFTag
+    updateLFTag_catalogId,
+    updateLFTag_tagValuesToAdd,
+    updateLFTag_tagValuesToDelete,
+    updateLFTag_tagKey,
+    updateLFTagResponse_httpStatus,
+
+    -- ** UpdateResource
+    updateResource_roleArn,
+    updateResource_resourceArn,
+    updateResourceResponse_httpStatus,
+
+    -- ** UpdateTableObjects
+    updateTableObjects_catalogId,
+    updateTableObjects_transactionId,
+    updateTableObjects_databaseName,
+    updateTableObjects_tableName,
+    updateTableObjects_writeOperations,
+    updateTableObjectsResponse_httpStatus,
+
+    -- ** UpdateTableStorageOptimizer
+    updateTableStorageOptimizer_catalogId,
+    updateTableStorageOptimizer_databaseName,
+    updateTableStorageOptimizer_tableName,
+    updateTableStorageOptimizer_storageOptimizerConfig,
+    updateTableStorageOptimizerResponse_result,
+    updateTableStorageOptimizerResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AddObjectInput
+    addObjectInput_partitionValues,
+    addObjectInput_uri,
+    addObjectInput_eTag,
+    addObjectInput_size,
+
+    -- ** AllRowsWildcard
+
+    -- ** AuditContext
+    auditContext_additionalAuditContext,
+
+    -- ** BatchPermissionsFailureEntry
+    batchPermissionsFailureEntry_error,
+    batchPermissionsFailureEntry_requestEntry,
+
+    -- ** BatchPermissionsRequestEntry
+    batchPermissionsRequestEntry_permissions,
+    batchPermissionsRequestEntry_permissionsWithGrantOption,
+    batchPermissionsRequestEntry_principal,
+    batchPermissionsRequestEntry_resource,
+    batchPermissionsRequestEntry_id,
+
+    -- ** CatalogResource
+
+    -- ** ColumnLFTag
+    columnLFTag_lFTags,
+    columnLFTag_name,
+
+    -- ** ColumnWildcard
+    columnWildcard_excludedColumnNames,
+
+    -- ** DataCellsFilter
+    dataCellsFilter_columnNames,
+    dataCellsFilter_columnWildcard,
+    dataCellsFilter_rowFilter,
+    dataCellsFilter_tableCatalogId,
+    dataCellsFilter_databaseName,
+    dataCellsFilter_tableName,
+    dataCellsFilter_name,
+
+    -- ** DataCellsFilterResource
+    dataCellsFilterResource_databaseName,
+    dataCellsFilterResource_name,
+    dataCellsFilterResource_tableCatalogId,
+    dataCellsFilterResource_tableName,
+
+    -- ** DataLakePrincipal
+    dataLakePrincipal_dataLakePrincipalIdentifier,
+
+    -- ** DataLakeSettings
+    dataLakeSettings_allowExternalDataFiltering,
+    dataLakeSettings_authorizedSessionTagValueList,
+    dataLakeSettings_createDatabaseDefaultPermissions,
+    dataLakeSettings_createTableDefaultPermissions,
+    dataLakeSettings_dataLakeAdmins,
+    dataLakeSettings_externalDataFilteringAllowList,
+    dataLakeSettings_parameters,
+    dataLakeSettings_trustedResourceOwners,
+
+    -- ** DataLocationResource
+    dataLocationResource_catalogId,
+    dataLocationResource_resourceArn,
+
+    -- ** DatabaseResource
+    databaseResource_catalogId,
+    databaseResource_name,
+
+    -- ** DeleteObjectInput
+    deleteObjectInput_eTag,
+    deleteObjectInput_partitionValues,
+    deleteObjectInput_uri,
+
+    -- ** DetailsMap
+    detailsMap_resourceShare,
+
+    -- ** ErrorDetail
+    errorDetail_errorCode,
+    errorDetail_errorMessage,
+
+    -- ** ExecutionStatistics
+    executionStatistics_averageExecutionTimeMillis,
+    executionStatistics_dataScannedBytes,
+    executionStatistics_workUnitsExecutedCount,
+
+    -- ** FilterCondition
+    filterCondition_comparisonOperator,
+    filterCondition_field,
+    filterCondition_stringValueList,
+
+    -- ** LFTag
+    lFTag_tagKey,
+    lFTag_tagValues,
+
+    -- ** LFTagError
+    lFTagError_error,
+    lFTagError_lFTag,
+
+    -- ** LFTagKeyResource
+    lFTagKeyResource_catalogId,
+    lFTagKeyResource_tagKey,
+    lFTagKeyResource_tagValues,
+
+    -- ** LFTagPair
+    lFTagPair_catalogId,
+    lFTagPair_tagKey,
+    lFTagPair_tagValues,
+
+    -- ** LFTagPolicyResource
+    lFTagPolicyResource_catalogId,
+    lFTagPolicyResource_resourceType,
+    lFTagPolicyResource_expression,
+
+    -- ** PartitionObjects
+    partitionObjects_objects,
+    partitionObjects_partitionValues,
+
+    -- ** PartitionValueList
+    partitionValueList_values,
+
+    -- ** PlanningStatistics
+    planningStatistics_estimatedDataToScanBytes,
+    planningStatistics_planningTimeMillis,
+    planningStatistics_queueTimeMillis,
+    planningStatistics_workUnitsGeneratedCount,
+
+    -- ** PrincipalPermissions
+    principalPermissions_permissions,
+    principalPermissions_principal,
+
+    -- ** PrincipalResourcePermissions
+    principalResourcePermissions_additionalDetails,
+    principalResourcePermissions_permissions,
+    principalResourcePermissions_permissionsWithGrantOption,
+    principalResourcePermissions_principal,
+    principalResourcePermissions_resource,
+
+    -- ** QueryPlanningContext
+    queryPlanningContext_catalogId,
+    queryPlanningContext_queryAsOfTime,
+    queryPlanningContext_queryParameters,
+    queryPlanningContext_transactionId,
+    queryPlanningContext_databaseName,
+
+    -- ** Resource
+    resource_catalog,
+    resource_dataCellsFilter,
+    resource_dataLocation,
+    resource_database,
+    resource_lFTag,
+    resource_lFTagPolicy,
+    resource_table,
+    resource_tableWithColumns,
+
+    -- ** ResourceInfo
+    resourceInfo_lastModified,
+    resourceInfo_resourceArn,
+    resourceInfo_roleArn,
+
+    -- ** RowFilter
+    rowFilter_allRowsWildcard,
+    rowFilter_filterExpression,
+
+    -- ** StorageOptimizer
+    storageOptimizer_config,
+    storageOptimizer_errorMessage,
+    storageOptimizer_lastRunDetails,
+    storageOptimizer_storageOptimizerType,
+    storageOptimizer_warnings,
+
+    -- ** TableObject
+    tableObject_eTag,
+    tableObject_size,
+    tableObject_uri,
+
+    -- ** TableResource
+    tableResource_catalogId,
+    tableResource_name,
+    tableResource_tableWildcard,
+    tableResource_databaseName,
+
+    -- ** TableWildcard
+
+    -- ** TableWithColumnsResource
+    tableWithColumnsResource_catalogId,
+    tableWithColumnsResource_columnNames,
+    tableWithColumnsResource_columnWildcard,
+    tableWithColumnsResource_databaseName,
+    tableWithColumnsResource_name,
+
+    -- ** TaggedDatabase
+    taggedDatabase_database,
+    taggedDatabase_lFTags,
+
+    -- ** TaggedTable
+    taggedTable_lFTagOnDatabase,
+    taggedTable_lFTagsOnColumns,
+    taggedTable_lFTagsOnTable,
+    taggedTable_table,
+
+    -- ** TransactionDescription
+    transactionDescription_transactionEndTime,
+    transactionDescription_transactionId,
+    transactionDescription_transactionStartTime,
+    transactionDescription_transactionStatus,
+
+    -- ** VirtualObject
+    virtualObject_eTag,
+    virtualObject_uri,
+
+    -- ** WorkUnitRange
+    workUnitRange_workUnitIdMax,
+    workUnitRange_workUnitIdMin,
+    workUnitRange_workUnitToken,
+
+    -- ** WriteOperation
+    writeOperation_addObject,
+    writeOperation_deleteObject,
+  )
+where
+
+import Amazonka.LakeFormation.AddLFTagsToResource
+import Amazonka.LakeFormation.AssumeDecoratedRoleWithSAML
+import Amazonka.LakeFormation.BatchGrantPermissions
+import Amazonka.LakeFormation.BatchRevokePermissions
+import Amazonka.LakeFormation.CancelTransaction
+import Amazonka.LakeFormation.CommitTransaction
+import Amazonka.LakeFormation.CreateDataCellsFilter
+import Amazonka.LakeFormation.CreateLFTag
+import Amazonka.LakeFormation.DeleteDataCellsFilter
+import Amazonka.LakeFormation.DeleteLFTag
+import Amazonka.LakeFormation.DeleteObjectsOnCancel
+import Amazonka.LakeFormation.DeregisterResource
+import Amazonka.LakeFormation.DescribeResource
+import Amazonka.LakeFormation.DescribeTransaction
+import Amazonka.LakeFormation.ExtendTransaction
+import Amazonka.LakeFormation.GetDataLakeSettings
+import Amazonka.LakeFormation.GetEffectivePermissionsForPath
+import Amazonka.LakeFormation.GetLFTag
+import Amazonka.LakeFormation.GetQueryState
+import Amazonka.LakeFormation.GetQueryStatistics
+import Amazonka.LakeFormation.GetResourceLFTags
+import Amazonka.LakeFormation.GetTableObjects
+import Amazonka.LakeFormation.GetTemporaryGluePartitionCredentials
+import Amazonka.LakeFormation.GetTemporaryGlueTableCredentials
+import Amazonka.LakeFormation.GetWorkUnitResults
+import Amazonka.LakeFormation.GetWorkUnits
+import Amazonka.LakeFormation.GrantPermissions
+import Amazonka.LakeFormation.ListDataCellsFilter
+import Amazonka.LakeFormation.ListLFTags
+import Amazonka.LakeFormation.ListPermissions
+import Amazonka.LakeFormation.ListResources
+import Amazonka.LakeFormation.ListTableStorageOptimizers
+import Amazonka.LakeFormation.ListTransactions
+import Amazonka.LakeFormation.PutDataLakeSettings
+import Amazonka.LakeFormation.RegisterResource
+import Amazonka.LakeFormation.RemoveLFTagsFromResource
+import Amazonka.LakeFormation.RevokePermissions
+import Amazonka.LakeFormation.SearchDatabasesByLFTags
+import Amazonka.LakeFormation.SearchTablesByLFTags
+import Amazonka.LakeFormation.StartQueryPlanning
+import Amazonka.LakeFormation.StartTransaction
+import Amazonka.LakeFormation.Types.AddObjectInput
+import Amazonka.LakeFormation.Types.AllRowsWildcard
+import Amazonka.LakeFormation.Types.AuditContext
+import Amazonka.LakeFormation.Types.BatchPermissionsFailureEntry
+import Amazonka.LakeFormation.Types.BatchPermissionsRequestEntry
+import Amazonka.LakeFormation.Types.CatalogResource
+import Amazonka.LakeFormation.Types.ColumnLFTag
+import Amazonka.LakeFormation.Types.ColumnWildcard
+import Amazonka.LakeFormation.Types.DataCellsFilter
+import Amazonka.LakeFormation.Types.DataCellsFilterResource
+import Amazonka.LakeFormation.Types.DataLakePrincipal
+import Amazonka.LakeFormation.Types.DataLakeSettings
+import Amazonka.LakeFormation.Types.DataLocationResource
+import Amazonka.LakeFormation.Types.DatabaseResource
+import Amazonka.LakeFormation.Types.DeleteObjectInput
+import Amazonka.LakeFormation.Types.DetailsMap
+import Amazonka.LakeFormation.Types.ErrorDetail
+import Amazonka.LakeFormation.Types.ExecutionStatistics
+import Amazonka.LakeFormation.Types.FilterCondition
+import Amazonka.LakeFormation.Types.LFTag
+import Amazonka.LakeFormation.Types.LFTagError
+import Amazonka.LakeFormation.Types.LFTagKeyResource
+import Amazonka.LakeFormation.Types.LFTagPair
+import Amazonka.LakeFormation.Types.LFTagPolicyResource
+import Amazonka.LakeFormation.Types.PartitionObjects
+import Amazonka.LakeFormation.Types.PartitionValueList
+import Amazonka.LakeFormation.Types.PlanningStatistics
+import Amazonka.LakeFormation.Types.PrincipalPermissions
+import Amazonka.LakeFormation.Types.PrincipalResourcePermissions
+import Amazonka.LakeFormation.Types.QueryPlanningContext
+import Amazonka.LakeFormation.Types.Resource
+import Amazonka.LakeFormation.Types.ResourceInfo
+import Amazonka.LakeFormation.Types.RowFilter
+import Amazonka.LakeFormation.Types.StorageOptimizer
+import Amazonka.LakeFormation.Types.TableObject
+import Amazonka.LakeFormation.Types.TableResource
+import Amazonka.LakeFormation.Types.TableWildcard
+import Amazonka.LakeFormation.Types.TableWithColumnsResource
+import Amazonka.LakeFormation.Types.TaggedDatabase
+import Amazonka.LakeFormation.Types.TaggedTable
+import Amazonka.LakeFormation.Types.TransactionDescription
+import Amazonka.LakeFormation.Types.VirtualObject
+import Amazonka.LakeFormation.Types.WorkUnitRange
+import Amazonka.LakeFormation.Types.WriteOperation
+import Amazonka.LakeFormation.UpdateLFTag
+import Amazonka.LakeFormation.UpdateResource
+import Amazonka.LakeFormation.UpdateTableObjects
+import Amazonka.LakeFormation.UpdateTableStorageOptimizer
diff --git a/gen/Amazonka/LakeFormation/ListDataCellsFilter.hs b/gen/Amazonka/LakeFormation/ListDataCellsFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/ListDataCellsFilter.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.LakeFormation.ListDataCellsFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all the data cell filters on a table.
+--
+-- This operation returns paginated results.
+module Amazonka.LakeFormation.ListDataCellsFilter
+  ( -- * Creating a Request
+    ListDataCellsFilter (..),
+    newListDataCellsFilter,
+
+    -- * Request Lenses
+    listDataCellsFilter_maxResults,
+    listDataCellsFilter_nextToken,
+    listDataCellsFilter_table,
+
+    -- * Destructuring the Response
+    ListDataCellsFilterResponse (..),
+    newListDataCellsFilterResponse,
+
+    -- * Response Lenses
+    listDataCellsFilterResponse_dataCellsFilters,
+    listDataCellsFilterResponse_nextToken,
+    listDataCellsFilterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListDataCellsFilter' smart constructor.
+data ListDataCellsFilter = ListDataCellsFilter'
+  { -- | The maximum size of the response.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A continuation token, if this is a continuation call.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A table in the Glue Data Catalog.
+    table :: Prelude.Maybe TableResource
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDataCellsFilter' 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', 'listDataCellsFilter_maxResults' - The maximum size of the response.
+--
+-- 'nextToken', 'listDataCellsFilter_nextToken' - A continuation token, if this is a continuation call.
+--
+-- 'table', 'listDataCellsFilter_table' - A table in the Glue Data Catalog.
+newListDataCellsFilter ::
+  ListDataCellsFilter
+newListDataCellsFilter =
+  ListDataCellsFilter'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      table = Prelude.Nothing
+    }
+
+-- | The maximum size of the response.
+listDataCellsFilter_maxResults :: Lens.Lens' ListDataCellsFilter (Prelude.Maybe Prelude.Natural)
+listDataCellsFilter_maxResults = Lens.lens (\ListDataCellsFilter' {maxResults} -> maxResults) (\s@ListDataCellsFilter' {} a -> s {maxResults = a} :: ListDataCellsFilter)
+
+-- | A continuation token, if this is a continuation call.
+listDataCellsFilter_nextToken :: Lens.Lens' ListDataCellsFilter (Prelude.Maybe Prelude.Text)
+listDataCellsFilter_nextToken = Lens.lens (\ListDataCellsFilter' {nextToken} -> nextToken) (\s@ListDataCellsFilter' {} a -> s {nextToken = a} :: ListDataCellsFilter)
+
+-- | A table in the Glue Data Catalog.
+listDataCellsFilter_table :: Lens.Lens' ListDataCellsFilter (Prelude.Maybe TableResource)
+listDataCellsFilter_table = Lens.lens (\ListDataCellsFilter' {table} -> table) (\s@ListDataCellsFilter' {} a -> s {table = a} :: ListDataCellsFilter)
+
+instance Core.AWSPager ListDataCellsFilter where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDataCellsFilterResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDataCellsFilterResponse_dataCellsFilters
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDataCellsFilter_nextToken
+          Lens..~ rs
+          Lens.^? listDataCellsFilterResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDataCellsFilter where
+  type
+    AWSResponse ListDataCellsFilter =
+      ListDataCellsFilterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDataCellsFilterResponse'
+            Prelude.<$> ( x
+                            Data..?> "DataCellsFilters"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDataCellsFilter where
+  hashWithSalt _salt ListDataCellsFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` table
+
+instance Prelude.NFData ListDataCellsFilter where
+  rnf ListDataCellsFilter' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf table
+
+instance Data.ToHeaders ListDataCellsFilter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListDataCellsFilter where
+  toJSON ListDataCellsFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("Table" Data..=) Prelude.<$> table
+          ]
+      )
+
+instance Data.ToPath ListDataCellsFilter where
+  toPath = Prelude.const "/ListDataCellsFilter"
+
+instance Data.ToQuery ListDataCellsFilter where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListDataCellsFilterResponse' smart constructor.
+data ListDataCellsFilterResponse = ListDataCellsFilterResponse'
+  { -- | A list of @DataCellFilter@ structures.
+    dataCellsFilters :: Prelude.Maybe [DataCellsFilter],
+    -- | A continuation token, if not all requested data cell filters have been
+    -- returned.
+    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 'ListDataCellsFilterResponse' 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:
+--
+-- 'dataCellsFilters', 'listDataCellsFilterResponse_dataCellsFilters' - A list of @DataCellFilter@ structures.
+--
+-- 'nextToken', 'listDataCellsFilterResponse_nextToken' - A continuation token, if not all requested data cell filters have been
+-- returned.
+--
+-- 'httpStatus', 'listDataCellsFilterResponse_httpStatus' - The response's http status code.
+newListDataCellsFilterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDataCellsFilterResponse
+newListDataCellsFilterResponse pHttpStatus_ =
+  ListDataCellsFilterResponse'
+    { dataCellsFilters =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of @DataCellFilter@ structures.
+listDataCellsFilterResponse_dataCellsFilters :: Lens.Lens' ListDataCellsFilterResponse (Prelude.Maybe [DataCellsFilter])
+listDataCellsFilterResponse_dataCellsFilters = Lens.lens (\ListDataCellsFilterResponse' {dataCellsFilters} -> dataCellsFilters) (\s@ListDataCellsFilterResponse' {} a -> s {dataCellsFilters = a} :: ListDataCellsFilterResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A continuation token, if not all requested data cell filters have been
+-- returned.
+listDataCellsFilterResponse_nextToken :: Lens.Lens' ListDataCellsFilterResponse (Prelude.Maybe Prelude.Text)
+listDataCellsFilterResponse_nextToken = Lens.lens (\ListDataCellsFilterResponse' {nextToken} -> nextToken) (\s@ListDataCellsFilterResponse' {} a -> s {nextToken = a} :: ListDataCellsFilterResponse)
+
+-- | The response's http status code.
+listDataCellsFilterResponse_httpStatus :: Lens.Lens' ListDataCellsFilterResponse Prelude.Int
+listDataCellsFilterResponse_httpStatus = Lens.lens (\ListDataCellsFilterResponse' {httpStatus} -> httpStatus) (\s@ListDataCellsFilterResponse' {} a -> s {httpStatus = a} :: ListDataCellsFilterResponse)
+
+instance Prelude.NFData ListDataCellsFilterResponse where
+  rnf ListDataCellsFilterResponse' {..} =
+    Prelude.rnf dataCellsFilters
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/ListLFTags.hs b/gen/Amazonka/LakeFormation/ListLFTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/ListLFTags.hs
@@ -0,0 +1,268 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.ListLFTags
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists LF-tags that the requester has permission to view.
+--
+-- This operation returns paginated results.
+module Amazonka.LakeFormation.ListLFTags
+  ( -- * Creating a Request
+    ListLFTags (..),
+    newListLFTags,
+
+    -- * Request Lenses
+    listLFTags_catalogId,
+    listLFTags_maxResults,
+    listLFTags_nextToken,
+    listLFTags_resourceShareType,
+
+    -- * Destructuring the Response
+    ListLFTagsResponse (..),
+    newListLFTagsResponse,
+
+    -- * Response Lenses
+    listLFTagsResponse_lFTags,
+    listLFTagsResponse_nextToken,
+    listLFTagsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListLFTags' smart constructor.
+data ListLFTags = ListLFTags'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A continuation token, if this is not the first call to retrieve this
+    -- list.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | If resource share type is @ALL@, returns both in-account LF-tags and
+    -- shared LF-tags that the requester has permission to view. If resource
+    -- share type is @FOREIGN@, returns all share LF-tags that the requester
+    -- can view. If no resource share type is passed, lists LF-tags in the
+    -- given catalog ID that the requester has permission to view.
+    resourceShareType :: Prelude.Maybe ResourceShareType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListLFTags' 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:
+--
+-- 'catalogId', 'listLFTags_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'maxResults', 'listLFTags_maxResults' - The maximum number of results to return.
+--
+-- 'nextToken', 'listLFTags_nextToken' - A continuation token, if this is not the first call to retrieve this
+-- list.
+--
+-- 'resourceShareType', 'listLFTags_resourceShareType' - If resource share type is @ALL@, returns both in-account LF-tags and
+-- shared LF-tags that the requester has permission to view. If resource
+-- share type is @FOREIGN@, returns all share LF-tags that the requester
+-- can view. If no resource share type is passed, lists LF-tags in the
+-- given catalog ID that the requester has permission to view.
+newListLFTags ::
+  ListLFTags
+newListLFTags =
+  ListLFTags'
+    { catalogId = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      resourceShareType = Prelude.Nothing
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+listLFTags_catalogId :: Lens.Lens' ListLFTags (Prelude.Maybe Prelude.Text)
+listLFTags_catalogId = Lens.lens (\ListLFTags' {catalogId} -> catalogId) (\s@ListLFTags' {} a -> s {catalogId = a} :: ListLFTags)
+
+-- | The maximum number of results to return.
+listLFTags_maxResults :: Lens.Lens' ListLFTags (Prelude.Maybe Prelude.Natural)
+listLFTags_maxResults = Lens.lens (\ListLFTags' {maxResults} -> maxResults) (\s@ListLFTags' {} a -> s {maxResults = a} :: ListLFTags)
+
+-- | A continuation token, if this is not the first call to retrieve this
+-- list.
+listLFTags_nextToken :: Lens.Lens' ListLFTags (Prelude.Maybe Prelude.Text)
+listLFTags_nextToken = Lens.lens (\ListLFTags' {nextToken} -> nextToken) (\s@ListLFTags' {} a -> s {nextToken = a} :: ListLFTags)
+
+-- | If resource share type is @ALL@, returns both in-account LF-tags and
+-- shared LF-tags that the requester has permission to view. If resource
+-- share type is @FOREIGN@, returns all share LF-tags that the requester
+-- can view. If no resource share type is passed, lists LF-tags in the
+-- given catalog ID that the requester has permission to view.
+listLFTags_resourceShareType :: Lens.Lens' ListLFTags (Prelude.Maybe ResourceShareType)
+listLFTags_resourceShareType = Lens.lens (\ListLFTags' {resourceShareType} -> resourceShareType) (\s@ListLFTags' {} a -> s {resourceShareType = a} :: ListLFTags)
+
+instance Core.AWSPager ListLFTags where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listLFTagsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listLFTagsResponse_lFTags
+            Prelude.. Lens._Just
+            Prelude.. Lens.to Prelude.toList
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listLFTags_nextToken
+          Lens..~ rs
+          Lens.^? listLFTagsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListLFTags where
+  type AWSResponse ListLFTags = ListLFTagsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListLFTagsResponse'
+            Prelude.<$> (x Data..?> "LFTags")
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListLFTags where
+  hashWithSalt _salt ListLFTags' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` resourceShareType
+
+instance Prelude.NFData ListLFTags where
+  rnf ListLFTags' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf resourceShareType
+
+instance Data.ToHeaders ListLFTags where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListLFTags where
+  toJSON ListLFTags' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("ResourceShareType" Data..=)
+              Prelude.<$> resourceShareType
+          ]
+      )
+
+instance Data.ToPath ListLFTags where
+  toPath = Prelude.const "/ListLFTags"
+
+instance Data.ToQuery ListLFTags where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListLFTagsResponse' smart constructor.
+data ListLFTagsResponse = ListLFTagsResponse'
+  { -- | A list of LF-tags that the requested has permission to view.
+    lFTags :: Prelude.Maybe (Prelude.NonEmpty LFTagPair),
+    -- | A continuation token, present if the current list segment is not the
+    -- last.
+    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 'ListLFTagsResponse' 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:
+--
+-- 'lFTags', 'listLFTagsResponse_lFTags' - A list of LF-tags that the requested has permission to view.
+--
+-- 'nextToken', 'listLFTagsResponse_nextToken' - A continuation token, present if the current list segment is not the
+-- last.
+--
+-- 'httpStatus', 'listLFTagsResponse_httpStatus' - The response's http status code.
+newListLFTagsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListLFTagsResponse
+newListLFTagsResponse pHttpStatus_ =
+  ListLFTagsResponse'
+    { lFTags = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of LF-tags that the requested has permission to view.
+listLFTagsResponse_lFTags :: Lens.Lens' ListLFTagsResponse (Prelude.Maybe (Prelude.NonEmpty LFTagPair))
+listLFTagsResponse_lFTags = Lens.lens (\ListLFTagsResponse' {lFTags} -> lFTags) (\s@ListLFTagsResponse' {} a -> s {lFTags = a} :: ListLFTagsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A continuation token, present if the current list segment is not the
+-- last.
+listLFTagsResponse_nextToken :: Lens.Lens' ListLFTagsResponse (Prelude.Maybe Prelude.Text)
+listLFTagsResponse_nextToken = Lens.lens (\ListLFTagsResponse' {nextToken} -> nextToken) (\s@ListLFTagsResponse' {} a -> s {nextToken = a} :: ListLFTagsResponse)
+
+-- | The response's http status code.
+listLFTagsResponse_httpStatus :: Lens.Lens' ListLFTagsResponse Prelude.Int
+listLFTagsResponse_httpStatus = Lens.lens (\ListLFTagsResponse' {httpStatus} -> httpStatus) (\s@ListLFTagsResponse' {} a -> s {httpStatus = a} :: ListLFTagsResponse)
+
+instance Prelude.NFData ListLFTagsResponse where
+  rnf ListLFTagsResponse' {..} =
+    Prelude.rnf lFTags
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/ListPermissions.hs b/gen/Amazonka/LakeFormation/ListPermissions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/ListPermissions.hs
@@ -0,0 +1,300 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.ListPermissions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of the principal permissions on the resource, filtered by
+-- the permissions of the caller. For example, if you are granted an ALTER
+-- permission, you are able to see only the principal permissions for
+-- ALTER.
+--
+-- This operation returns only those permissions that have been explicitly
+-- granted.
+--
+-- For information about permissions, see
+-- <https://docs-aws.amazon.com/lake-formation/latest/dg/security-data-access.html Security and Access Control to Metadata and Data>.
+module Amazonka.LakeFormation.ListPermissions
+  ( -- * Creating a Request
+    ListPermissions (..),
+    newListPermissions,
+
+    -- * Request Lenses
+    listPermissions_catalogId,
+    listPermissions_includeRelated,
+    listPermissions_maxResults,
+    listPermissions_nextToken,
+    listPermissions_principal,
+    listPermissions_resource,
+    listPermissions_resourceType,
+
+    -- * Destructuring the Response
+    ListPermissionsResponse (..),
+    newListPermissionsResponse,
+
+    -- * Response Lenses
+    listPermissionsResponse_nextToken,
+    listPermissionsResponse_principalResourcePermissions,
+    listPermissionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListPermissions' smart constructor.
+data ListPermissions = ListPermissions'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | Indicates that related permissions should be included in the results.
+    includeRelated :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A continuation token, if this is not the first call to retrieve this
+    -- list.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Specifies a principal to filter the permissions returned.
+    principal :: Prelude.Maybe DataLakePrincipal,
+    -- | A resource where you will get a list of the principal permissions.
+    --
+    -- This operation does not support getting privileges on a table with
+    -- columns. Instead, call this operation on the table, and the operation
+    -- returns the table and the table w columns.
+    resource :: Prelude.Maybe Resource,
+    -- | Specifies a resource type to filter the permissions returned.
+    resourceType :: Prelude.Maybe DataLakeResourceType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPermissions' 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:
+--
+-- 'catalogId', 'listPermissions_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'includeRelated', 'listPermissions_includeRelated' - Indicates that related permissions should be included in the results.
+--
+-- 'maxResults', 'listPermissions_maxResults' - The maximum number of results to return.
+--
+-- 'nextToken', 'listPermissions_nextToken' - A continuation token, if this is not the first call to retrieve this
+-- list.
+--
+-- 'principal', 'listPermissions_principal' - Specifies a principal to filter the permissions returned.
+--
+-- 'resource', 'listPermissions_resource' - A resource where you will get a list of the principal permissions.
+--
+-- This operation does not support getting privileges on a table with
+-- columns. Instead, call this operation on the table, and the operation
+-- returns the table and the table w columns.
+--
+-- 'resourceType', 'listPermissions_resourceType' - Specifies a resource type to filter the permissions returned.
+newListPermissions ::
+  ListPermissions
+newListPermissions =
+  ListPermissions'
+    { catalogId = Prelude.Nothing,
+      includeRelated = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      principal = Prelude.Nothing,
+      resource = Prelude.Nothing,
+      resourceType = Prelude.Nothing
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+listPermissions_catalogId :: Lens.Lens' ListPermissions (Prelude.Maybe Prelude.Text)
+listPermissions_catalogId = Lens.lens (\ListPermissions' {catalogId} -> catalogId) (\s@ListPermissions' {} a -> s {catalogId = a} :: ListPermissions)
+
+-- | Indicates that related permissions should be included in the results.
+listPermissions_includeRelated :: Lens.Lens' ListPermissions (Prelude.Maybe Prelude.Text)
+listPermissions_includeRelated = Lens.lens (\ListPermissions' {includeRelated} -> includeRelated) (\s@ListPermissions' {} a -> s {includeRelated = a} :: ListPermissions)
+
+-- | The maximum number of results to return.
+listPermissions_maxResults :: Lens.Lens' ListPermissions (Prelude.Maybe Prelude.Natural)
+listPermissions_maxResults = Lens.lens (\ListPermissions' {maxResults} -> maxResults) (\s@ListPermissions' {} a -> s {maxResults = a} :: ListPermissions)
+
+-- | A continuation token, if this is not the first call to retrieve this
+-- list.
+listPermissions_nextToken :: Lens.Lens' ListPermissions (Prelude.Maybe Prelude.Text)
+listPermissions_nextToken = Lens.lens (\ListPermissions' {nextToken} -> nextToken) (\s@ListPermissions' {} a -> s {nextToken = a} :: ListPermissions)
+
+-- | Specifies a principal to filter the permissions returned.
+listPermissions_principal :: Lens.Lens' ListPermissions (Prelude.Maybe DataLakePrincipal)
+listPermissions_principal = Lens.lens (\ListPermissions' {principal} -> principal) (\s@ListPermissions' {} a -> s {principal = a} :: ListPermissions)
+
+-- | A resource where you will get a list of the principal permissions.
+--
+-- This operation does not support getting privileges on a table with
+-- columns. Instead, call this operation on the table, and the operation
+-- returns the table and the table w columns.
+listPermissions_resource :: Lens.Lens' ListPermissions (Prelude.Maybe Resource)
+listPermissions_resource = Lens.lens (\ListPermissions' {resource} -> resource) (\s@ListPermissions' {} a -> s {resource = a} :: ListPermissions)
+
+-- | Specifies a resource type to filter the permissions returned.
+listPermissions_resourceType :: Lens.Lens' ListPermissions (Prelude.Maybe DataLakeResourceType)
+listPermissions_resourceType = Lens.lens (\ListPermissions' {resourceType} -> resourceType) (\s@ListPermissions' {} a -> s {resourceType = a} :: ListPermissions)
+
+instance Core.AWSRequest ListPermissions where
+  type
+    AWSResponse ListPermissions =
+      ListPermissionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPermissionsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "PrincipalResourcePermissions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListPermissions where
+  hashWithSalt _salt ListPermissions' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` includeRelated
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` principal
+      `Prelude.hashWithSalt` resource
+      `Prelude.hashWithSalt` resourceType
+
+instance Prelude.NFData ListPermissions where
+  rnf ListPermissions' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf includeRelated
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf principal
+      `Prelude.seq` Prelude.rnf resource
+      `Prelude.seq` Prelude.rnf resourceType
+
+instance Data.ToHeaders ListPermissions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListPermissions where
+  toJSON ListPermissions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("IncludeRelated" Data..=)
+              Prelude.<$> includeRelated,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("Principal" Data..=) Prelude.<$> principal,
+            ("Resource" Data..=) Prelude.<$> resource,
+            ("ResourceType" Data..=) Prelude.<$> resourceType
+          ]
+      )
+
+instance Data.ToPath ListPermissions where
+  toPath = Prelude.const "/ListPermissions"
+
+instance Data.ToQuery ListPermissions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListPermissionsResponse' smart constructor.
+data ListPermissionsResponse = ListPermissionsResponse'
+  { -- | A continuation token, if this is not the first call to retrieve this
+    -- list.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of principals and their permissions on the resource for the
+    -- specified principal and resource types.
+    principalResourcePermissions :: Prelude.Maybe [PrincipalResourcePermissions],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPermissionsResponse' 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', 'listPermissionsResponse_nextToken' - A continuation token, if this is not the first call to retrieve this
+-- list.
+--
+-- 'principalResourcePermissions', 'listPermissionsResponse_principalResourcePermissions' - A list of principals and their permissions on the resource for the
+-- specified principal and resource types.
+--
+-- 'httpStatus', 'listPermissionsResponse_httpStatus' - The response's http status code.
+newListPermissionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPermissionsResponse
+newListPermissionsResponse pHttpStatus_ =
+  ListPermissionsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      principalResourcePermissions = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A continuation token, if this is not the first call to retrieve this
+-- list.
+listPermissionsResponse_nextToken :: Lens.Lens' ListPermissionsResponse (Prelude.Maybe Prelude.Text)
+listPermissionsResponse_nextToken = Lens.lens (\ListPermissionsResponse' {nextToken} -> nextToken) (\s@ListPermissionsResponse' {} a -> s {nextToken = a} :: ListPermissionsResponse)
+
+-- | A list of principals and their permissions on the resource for the
+-- specified principal and resource types.
+listPermissionsResponse_principalResourcePermissions :: Lens.Lens' ListPermissionsResponse (Prelude.Maybe [PrincipalResourcePermissions])
+listPermissionsResponse_principalResourcePermissions = Lens.lens (\ListPermissionsResponse' {principalResourcePermissions} -> principalResourcePermissions) (\s@ListPermissionsResponse' {} a -> s {principalResourcePermissions = a} :: ListPermissionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listPermissionsResponse_httpStatus :: Lens.Lens' ListPermissionsResponse Prelude.Int
+listPermissionsResponse_httpStatus = Lens.lens (\ListPermissionsResponse' {httpStatus} -> httpStatus) (\s@ListPermissionsResponse' {} a -> s {httpStatus = a} :: ListPermissionsResponse)
+
+instance Prelude.NFData ListPermissionsResponse where
+  rnf ListPermissionsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf principalResourcePermissions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/ListResources.hs b/gen/Amazonka/LakeFormation/ListResources.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/ListResources.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.LakeFormation.ListResources
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the resources registered to be managed by the Data Catalog.
+module Amazonka.LakeFormation.ListResources
+  ( -- * Creating a Request
+    ListResources (..),
+    newListResources,
+
+    -- * Request Lenses
+    listResources_filterConditionList,
+    listResources_maxResults,
+    listResources_nextToken,
+
+    -- * Destructuring the Response
+    ListResourcesResponse (..),
+    newListResourcesResponse,
+
+    -- * Response Lenses
+    listResourcesResponse_nextToken,
+    listResourcesResponse_resourceInfoList,
+    listResourcesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListResources' smart constructor.
+data ListResources = ListResources'
+  { -- | Any applicable row-level and\/or column-level filtering conditions for
+    -- the resources.
+    filterConditionList :: Prelude.Maybe (Prelude.NonEmpty FilterCondition),
+    -- | The maximum number of resource results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A continuation token, if this is not the first call to retrieve these
+    -- resources.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListResources' 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:
+--
+-- 'filterConditionList', 'listResources_filterConditionList' - Any applicable row-level and\/or column-level filtering conditions for
+-- the resources.
+--
+-- 'maxResults', 'listResources_maxResults' - The maximum number of resource results.
+--
+-- 'nextToken', 'listResources_nextToken' - A continuation token, if this is not the first call to retrieve these
+-- resources.
+newListResources ::
+  ListResources
+newListResources =
+  ListResources'
+    { filterConditionList =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Any applicable row-level and\/or column-level filtering conditions for
+-- the resources.
+listResources_filterConditionList :: Lens.Lens' ListResources (Prelude.Maybe (Prelude.NonEmpty FilterCondition))
+listResources_filterConditionList = Lens.lens (\ListResources' {filterConditionList} -> filterConditionList) (\s@ListResources' {} a -> s {filterConditionList = a} :: ListResources) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of resource results.
+listResources_maxResults :: Lens.Lens' ListResources (Prelude.Maybe Prelude.Natural)
+listResources_maxResults = Lens.lens (\ListResources' {maxResults} -> maxResults) (\s@ListResources' {} a -> s {maxResults = a} :: ListResources)
+
+-- | A continuation token, if this is not the first call to retrieve these
+-- resources.
+listResources_nextToken :: Lens.Lens' ListResources (Prelude.Maybe Prelude.Text)
+listResources_nextToken = Lens.lens (\ListResources' {nextToken} -> nextToken) (\s@ListResources' {} a -> s {nextToken = a} :: ListResources)
+
+instance Core.AWSRequest ListResources where
+  type
+    AWSResponse ListResources =
+      ListResourcesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListResourcesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "ResourceInfoList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListResources where
+  hashWithSalt _salt ListResources' {..} =
+    _salt
+      `Prelude.hashWithSalt` filterConditionList
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListResources where
+  rnf ListResources' {..} =
+    Prelude.rnf filterConditionList
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListResources where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListResources where
+  toJSON ListResources' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("FilterConditionList" Data..=)
+              Prelude.<$> filterConditionList,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListResources where
+  toPath = Prelude.const "/ListResources"
+
+instance Data.ToQuery ListResources where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListResourcesResponse' smart constructor.
+data ListResourcesResponse = ListResourcesResponse'
+  { -- | A continuation token, if this is not the first call to retrieve these
+    -- resources.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A summary of the data lake resources.
+    resourceInfoList :: Prelude.Maybe [ResourceInfo],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListResourcesResponse' 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', 'listResourcesResponse_nextToken' - A continuation token, if this is not the first call to retrieve these
+-- resources.
+--
+-- 'resourceInfoList', 'listResourcesResponse_resourceInfoList' - A summary of the data lake resources.
+--
+-- 'httpStatus', 'listResourcesResponse_httpStatus' - The response's http status code.
+newListResourcesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListResourcesResponse
+newListResourcesResponse pHttpStatus_ =
+  ListResourcesResponse'
+    { nextToken = Prelude.Nothing,
+      resourceInfoList = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A continuation token, if this is not the first call to retrieve these
+-- resources.
+listResourcesResponse_nextToken :: Lens.Lens' ListResourcesResponse (Prelude.Maybe Prelude.Text)
+listResourcesResponse_nextToken = Lens.lens (\ListResourcesResponse' {nextToken} -> nextToken) (\s@ListResourcesResponse' {} a -> s {nextToken = a} :: ListResourcesResponse)
+
+-- | A summary of the data lake resources.
+listResourcesResponse_resourceInfoList :: Lens.Lens' ListResourcesResponse (Prelude.Maybe [ResourceInfo])
+listResourcesResponse_resourceInfoList = Lens.lens (\ListResourcesResponse' {resourceInfoList} -> resourceInfoList) (\s@ListResourcesResponse' {} a -> s {resourceInfoList = a} :: ListResourcesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listResourcesResponse_httpStatus :: Lens.Lens' ListResourcesResponse Prelude.Int
+listResourcesResponse_httpStatus = Lens.lens (\ListResourcesResponse' {httpStatus} -> httpStatus) (\s@ListResourcesResponse' {} a -> s {httpStatus = a} :: ListResourcesResponse)
+
+instance Prelude.NFData ListResourcesResponse where
+  rnf ListResourcesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf resourceInfoList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/ListTableStorageOptimizers.hs b/gen/Amazonka/LakeFormation/ListTableStorageOptimizers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/ListTableStorageOptimizers.hs
@@ -0,0 +1,265 @@
+{-# 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.LakeFormation.ListTableStorageOptimizers
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the configuration of all storage optimizers associated with a
+-- specified table.
+module Amazonka.LakeFormation.ListTableStorageOptimizers
+  ( -- * Creating a Request
+    ListTableStorageOptimizers (..),
+    newListTableStorageOptimizers,
+
+    -- * Request Lenses
+    listTableStorageOptimizers_catalogId,
+    listTableStorageOptimizers_maxResults,
+    listTableStorageOptimizers_nextToken,
+    listTableStorageOptimizers_storageOptimizerType,
+    listTableStorageOptimizers_databaseName,
+    listTableStorageOptimizers_tableName,
+
+    -- * Destructuring the Response
+    ListTableStorageOptimizersResponse (..),
+    newListTableStorageOptimizersResponse,
+
+    -- * Response Lenses
+    listTableStorageOptimizersResponse_nextToken,
+    listTableStorageOptimizersResponse_storageOptimizerList,
+    listTableStorageOptimizersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTableStorageOptimizers' smart constructor.
+data ListTableStorageOptimizers = ListTableStorageOptimizers'
+  { -- | The Catalog ID of the table.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The number of storage optimizers to return on each call.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A continuation token, if this is a continuation call.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The specific type of storage optimizers to list. The supported value is
+    -- @compaction@.
+    storageOptimizerType :: Prelude.Maybe OptimizerType,
+    -- | Name of the database where the table is present.
+    databaseName :: Prelude.Text,
+    -- | Name of the table.
+    tableName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTableStorageOptimizers' 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:
+--
+-- 'catalogId', 'listTableStorageOptimizers_catalogId' - The Catalog ID of the table.
+--
+-- 'maxResults', 'listTableStorageOptimizers_maxResults' - The number of storage optimizers to return on each call.
+--
+-- 'nextToken', 'listTableStorageOptimizers_nextToken' - A continuation token, if this is a continuation call.
+--
+-- 'storageOptimizerType', 'listTableStorageOptimizers_storageOptimizerType' - The specific type of storage optimizers to list. The supported value is
+-- @compaction@.
+--
+-- 'databaseName', 'listTableStorageOptimizers_databaseName' - Name of the database where the table is present.
+--
+-- 'tableName', 'listTableStorageOptimizers_tableName' - Name of the table.
+newListTableStorageOptimizers ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  ListTableStorageOptimizers
+newListTableStorageOptimizers
+  pDatabaseName_
+  pTableName_ =
+    ListTableStorageOptimizers'
+      { catalogId =
+          Prelude.Nothing,
+        maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        storageOptimizerType = Prelude.Nothing,
+        databaseName = pDatabaseName_,
+        tableName = pTableName_
+      }
+
+-- | The Catalog ID of the table.
+listTableStorageOptimizers_catalogId :: Lens.Lens' ListTableStorageOptimizers (Prelude.Maybe Prelude.Text)
+listTableStorageOptimizers_catalogId = Lens.lens (\ListTableStorageOptimizers' {catalogId} -> catalogId) (\s@ListTableStorageOptimizers' {} a -> s {catalogId = a} :: ListTableStorageOptimizers)
+
+-- | The number of storage optimizers to return on each call.
+listTableStorageOptimizers_maxResults :: Lens.Lens' ListTableStorageOptimizers (Prelude.Maybe Prelude.Natural)
+listTableStorageOptimizers_maxResults = Lens.lens (\ListTableStorageOptimizers' {maxResults} -> maxResults) (\s@ListTableStorageOptimizers' {} a -> s {maxResults = a} :: ListTableStorageOptimizers)
+
+-- | A continuation token, if this is a continuation call.
+listTableStorageOptimizers_nextToken :: Lens.Lens' ListTableStorageOptimizers (Prelude.Maybe Prelude.Text)
+listTableStorageOptimizers_nextToken = Lens.lens (\ListTableStorageOptimizers' {nextToken} -> nextToken) (\s@ListTableStorageOptimizers' {} a -> s {nextToken = a} :: ListTableStorageOptimizers)
+
+-- | The specific type of storage optimizers to list. The supported value is
+-- @compaction@.
+listTableStorageOptimizers_storageOptimizerType :: Lens.Lens' ListTableStorageOptimizers (Prelude.Maybe OptimizerType)
+listTableStorageOptimizers_storageOptimizerType = Lens.lens (\ListTableStorageOptimizers' {storageOptimizerType} -> storageOptimizerType) (\s@ListTableStorageOptimizers' {} a -> s {storageOptimizerType = a} :: ListTableStorageOptimizers)
+
+-- | Name of the database where the table is present.
+listTableStorageOptimizers_databaseName :: Lens.Lens' ListTableStorageOptimizers Prelude.Text
+listTableStorageOptimizers_databaseName = Lens.lens (\ListTableStorageOptimizers' {databaseName} -> databaseName) (\s@ListTableStorageOptimizers' {} a -> s {databaseName = a} :: ListTableStorageOptimizers)
+
+-- | Name of the table.
+listTableStorageOptimizers_tableName :: Lens.Lens' ListTableStorageOptimizers Prelude.Text
+listTableStorageOptimizers_tableName = Lens.lens (\ListTableStorageOptimizers' {tableName} -> tableName) (\s@ListTableStorageOptimizers' {} a -> s {tableName = a} :: ListTableStorageOptimizers)
+
+instance Core.AWSRequest ListTableStorageOptimizers where
+  type
+    AWSResponse ListTableStorageOptimizers =
+      ListTableStorageOptimizersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTableStorageOptimizersResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "StorageOptimizerList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTableStorageOptimizers where
+  hashWithSalt _salt ListTableStorageOptimizers' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` storageOptimizerType
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData ListTableStorageOptimizers where
+  rnf ListTableStorageOptimizers' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf storageOptimizerType
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders ListTableStorageOptimizers where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTableStorageOptimizers where
+  toJSON ListTableStorageOptimizers' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("StorageOptimizerType" Data..=)
+              Prelude.<$> storageOptimizerType,
+            Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("TableName" Data..= tableName)
+          ]
+      )
+
+instance Data.ToPath ListTableStorageOptimizers where
+  toPath = Prelude.const "/ListTableStorageOptimizers"
+
+instance Data.ToQuery ListTableStorageOptimizers where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTableStorageOptimizersResponse' smart constructor.
+data ListTableStorageOptimizersResponse = ListTableStorageOptimizersResponse'
+  { -- | A continuation token for paginating the returned list of tokens,
+    -- returned if the current segment of the list is not the last.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of the storage optimizers associated with a table.
+    storageOptimizerList :: Prelude.Maybe [StorageOptimizer],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTableStorageOptimizersResponse' 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', 'listTableStorageOptimizersResponse_nextToken' - A continuation token for paginating the returned list of tokens,
+-- returned if the current segment of the list is not the last.
+--
+-- 'storageOptimizerList', 'listTableStorageOptimizersResponse_storageOptimizerList' - A list of the storage optimizers associated with a table.
+--
+-- 'httpStatus', 'listTableStorageOptimizersResponse_httpStatus' - The response's http status code.
+newListTableStorageOptimizersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTableStorageOptimizersResponse
+newListTableStorageOptimizersResponse pHttpStatus_ =
+  ListTableStorageOptimizersResponse'
+    { nextToken =
+        Prelude.Nothing,
+      storageOptimizerList = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A continuation token for paginating the returned list of tokens,
+-- returned if the current segment of the list is not the last.
+listTableStorageOptimizersResponse_nextToken :: Lens.Lens' ListTableStorageOptimizersResponse (Prelude.Maybe Prelude.Text)
+listTableStorageOptimizersResponse_nextToken = Lens.lens (\ListTableStorageOptimizersResponse' {nextToken} -> nextToken) (\s@ListTableStorageOptimizersResponse' {} a -> s {nextToken = a} :: ListTableStorageOptimizersResponse)
+
+-- | A list of the storage optimizers associated with a table.
+listTableStorageOptimizersResponse_storageOptimizerList :: Lens.Lens' ListTableStorageOptimizersResponse (Prelude.Maybe [StorageOptimizer])
+listTableStorageOptimizersResponse_storageOptimizerList = Lens.lens (\ListTableStorageOptimizersResponse' {storageOptimizerList} -> storageOptimizerList) (\s@ListTableStorageOptimizersResponse' {} a -> s {storageOptimizerList = a} :: ListTableStorageOptimizersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTableStorageOptimizersResponse_httpStatus :: Lens.Lens' ListTableStorageOptimizersResponse Prelude.Int
+listTableStorageOptimizersResponse_httpStatus = Lens.lens (\ListTableStorageOptimizersResponse' {httpStatus} -> httpStatus) (\s@ListTableStorageOptimizersResponse' {} a -> s {httpStatus = a} :: ListTableStorageOptimizersResponse)
+
+instance
+  Prelude.NFData
+    ListTableStorageOptimizersResponse
+  where
+  rnf ListTableStorageOptimizersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf storageOptimizerList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/ListTransactions.hs b/gen/Amazonka/LakeFormation/ListTransactions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/ListTransactions.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.LakeFormation.ListTransactions
+-- 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 metadata about transactions and their status. To prevent the
+-- response from growing indefinitely, only uncommitted transactions and
+-- those available for time-travel queries are returned.
+--
+-- This operation can help you identify uncommitted transactions or to get
+-- information about transactions.
+module Amazonka.LakeFormation.ListTransactions
+  ( -- * Creating a Request
+    ListTransactions (..),
+    newListTransactions,
+
+    -- * Request Lenses
+    listTransactions_catalogId,
+    listTransactions_maxResults,
+    listTransactions_nextToken,
+    listTransactions_statusFilter,
+
+    -- * Destructuring the Response
+    ListTransactionsResponse (..),
+    newListTransactionsResponse,
+
+    -- * Response Lenses
+    listTransactionsResponse_nextToken,
+    listTransactionsResponse_transactions,
+    listTransactionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTransactions' smart constructor.
+data ListTransactions = ListTransactions'
+  { -- | The catalog for which to list transactions. Defaults to the account ID
+    -- of the caller.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of transactions to return in a single call.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A continuation token if this is not the first call to retrieve
+    -- transactions.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A filter indicating the status of transactions to return. Options are
+    -- ALL | COMPLETED | COMMITTED | ABORTED | ACTIVE. The default is @ALL@.
+    statusFilter :: Prelude.Maybe TransactionStatusFilter
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTransactions' 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:
+--
+-- 'catalogId', 'listTransactions_catalogId' - The catalog for which to list transactions. Defaults to the account ID
+-- of the caller.
+--
+-- 'maxResults', 'listTransactions_maxResults' - The maximum number of transactions to return in a single call.
+--
+-- 'nextToken', 'listTransactions_nextToken' - A continuation token if this is not the first call to retrieve
+-- transactions.
+--
+-- 'statusFilter', 'listTransactions_statusFilter' - A filter indicating the status of transactions to return. Options are
+-- ALL | COMPLETED | COMMITTED | ABORTED | ACTIVE. The default is @ALL@.
+newListTransactions ::
+  ListTransactions
+newListTransactions =
+  ListTransactions'
+    { catalogId = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      statusFilter = Prelude.Nothing
+    }
+
+-- | The catalog for which to list transactions. Defaults to the account ID
+-- of the caller.
+listTransactions_catalogId :: Lens.Lens' ListTransactions (Prelude.Maybe Prelude.Text)
+listTransactions_catalogId = Lens.lens (\ListTransactions' {catalogId} -> catalogId) (\s@ListTransactions' {} a -> s {catalogId = a} :: ListTransactions)
+
+-- | The maximum number of transactions to return in a single call.
+listTransactions_maxResults :: Lens.Lens' ListTransactions (Prelude.Maybe Prelude.Natural)
+listTransactions_maxResults = Lens.lens (\ListTransactions' {maxResults} -> maxResults) (\s@ListTransactions' {} a -> s {maxResults = a} :: ListTransactions)
+
+-- | A continuation token if this is not the first call to retrieve
+-- transactions.
+listTransactions_nextToken :: Lens.Lens' ListTransactions (Prelude.Maybe Prelude.Text)
+listTransactions_nextToken = Lens.lens (\ListTransactions' {nextToken} -> nextToken) (\s@ListTransactions' {} a -> s {nextToken = a} :: ListTransactions)
+
+-- | A filter indicating the status of transactions to return. Options are
+-- ALL | COMPLETED | COMMITTED | ABORTED | ACTIVE. The default is @ALL@.
+listTransactions_statusFilter :: Lens.Lens' ListTransactions (Prelude.Maybe TransactionStatusFilter)
+listTransactions_statusFilter = Lens.lens (\ListTransactions' {statusFilter} -> statusFilter) (\s@ListTransactions' {} a -> s {statusFilter = a} :: ListTransactions)
+
+instance Core.AWSRequest ListTransactions where
+  type
+    AWSResponse ListTransactions =
+      ListTransactionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTransactionsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Transactions" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTransactions where
+  hashWithSalt _salt ListTransactions' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` statusFilter
+
+instance Prelude.NFData ListTransactions where
+  rnf ListTransactions' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf statusFilter
+
+instance Data.ToHeaders ListTransactions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTransactions where
+  toJSON ListTransactions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("StatusFilter" Data..=) Prelude.<$> statusFilter
+          ]
+      )
+
+instance Data.ToPath ListTransactions where
+  toPath = Prelude.const "/ListTransactions"
+
+instance Data.ToQuery ListTransactions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTransactionsResponse' smart constructor.
+data ListTransactionsResponse = ListTransactionsResponse'
+  { -- | A continuation token indicating whether additional data is available.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of transactions. The record for each transaction is a
+    -- @TransactionDescription@ object.
+    transactions :: Prelude.Maybe [TransactionDescription],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTransactionsResponse' 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', 'listTransactionsResponse_nextToken' - A continuation token indicating whether additional data is available.
+--
+-- 'transactions', 'listTransactionsResponse_transactions' - A list of transactions. The record for each transaction is a
+-- @TransactionDescription@ object.
+--
+-- 'httpStatus', 'listTransactionsResponse_httpStatus' - The response's http status code.
+newListTransactionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTransactionsResponse
+newListTransactionsResponse pHttpStatus_ =
+  ListTransactionsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      transactions = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A continuation token indicating whether additional data is available.
+listTransactionsResponse_nextToken :: Lens.Lens' ListTransactionsResponse (Prelude.Maybe Prelude.Text)
+listTransactionsResponse_nextToken = Lens.lens (\ListTransactionsResponse' {nextToken} -> nextToken) (\s@ListTransactionsResponse' {} a -> s {nextToken = a} :: ListTransactionsResponse)
+
+-- | A list of transactions. The record for each transaction is a
+-- @TransactionDescription@ object.
+listTransactionsResponse_transactions :: Lens.Lens' ListTransactionsResponse (Prelude.Maybe [TransactionDescription])
+listTransactionsResponse_transactions = Lens.lens (\ListTransactionsResponse' {transactions} -> transactions) (\s@ListTransactionsResponse' {} a -> s {transactions = a} :: ListTransactionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTransactionsResponse_httpStatus :: Lens.Lens' ListTransactionsResponse Prelude.Int
+listTransactionsResponse_httpStatus = Lens.lens (\ListTransactionsResponse' {httpStatus} -> httpStatus) (\s@ListTransactionsResponse' {} a -> s {httpStatus = a} :: ListTransactionsResponse)
+
+instance Prelude.NFData ListTransactionsResponse where
+  rnf ListTransactionsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf transactions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/PutDataLakeSettings.hs b/gen/Amazonka/LakeFormation/PutDataLakeSettings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/PutDataLakeSettings.hs
@@ -0,0 +1,190 @@
+{-# 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.LakeFormation.PutDataLakeSettings
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets the list of data lake administrators who have admin privileges on
+-- all resources managed by Lake Formation. For more information on admin
+-- privileges, see
+-- <https://docs.aws.amazon.com/lake-formation/latest/dg/lake-formation-permissions.html Granting Lake Formation Permissions>.
+--
+-- This API replaces the current list of data lake admins with the new list
+-- being passed. To add an admin, fetch the current list and add the new
+-- admin to that list and pass that list in this API.
+module Amazonka.LakeFormation.PutDataLakeSettings
+  ( -- * Creating a Request
+    PutDataLakeSettings (..),
+    newPutDataLakeSettings,
+
+    -- * Request Lenses
+    putDataLakeSettings_catalogId,
+    putDataLakeSettings_dataLakeSettings,
+
+    -- * Destructuring the Response
+    PutDataLakeSettingsResponse (..),
+    newPutDataLakeSettingsResponse,
+
+    -- * Response Lenses
+    putDataLakeSettingsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutDataLakeSettings' smart constructor.
+data PutDataLakeSettings = PutDataLakeSettings'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | A structure representing a list of Lake Formation principals designated
+    -- as data lake administrators.
+    dataLakeSettings :: DataLakeSettings
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutDataLakeSettings' 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:
+--
+-- 'catalogId', 'putDataLakeSettings_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'dataLakeSettings', 'putDataLakeSettings_dataLakeSettings' - A structure representing a list of Lake Formation principals designated
+-- as data lake administrators.
+newPutDataLakeSettings ::
+  -- | 'dataLakeSettings'
+  DataLakeSettings ->
+  PutDataLakeSettings
+newPutDataLakeSettings pDataLakeSettings_ =
+  PutDataLakeSettings'
+    { catalogId = Prelude.Nothing,
+      dataLakeSettings = pDataLakeSettings_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+putDataLakeSettings_catalogId :: Lens.Lens' PutDataLakeSettings (Prelude.Maybe Prelude.Text)
+putDataLakeSettings_catalogId = Lens.lens (\PutDataLakeSettings' {catalogId} -> catalogId) (\s@PutDataLakeSettings' {} a -> s {catalogId = a} :: PutDataLakeSettings)
+
+-- | A structure representing a list of Lake Formation principals designated
+-- as data lake administrators.
+putDataLakeSettings_dataLakeSettings :: Lens.Lens' PutDataLakeSettings DataLakeSettings
+putDataLakeSettings_dataLakeSettings = Lens.lens (\PutDataLakeSettings' {dataLakeSettings} -> dataLakeSettings) (\s@PutDataLakeSettings' {} a -> s {dataLakeSettings = a} :: PutDataLakeSettings)
+
+instance Core.AWSRequest PutDataLakeSettings where
+  type
+    AWSResponse PutDataLakeSettings =
+      PutDataLakeSettingsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          PutDataLakeSettingsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutDataLakeSettings where
+  hashWithSalt _salt PutDataLakeSettings' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` dataLakeSettings
+
+instance Prelude.NFData PutDataLakeSettings where
+  rnf PutDataLakeSettings' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf dataLakeSettings
+
+instance Data.ToHeaders PutDataLakeSettings where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutDataLakeSettings where
+  toJSON PutDataLakeSettings' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just
+              ("DataLakeSettings" Data..= dataLakeSettings)
+          ]
+      )
+
+instance Data.ToPath PutDataLakeSettings where
+  toPath = Prelude.const "/PutDataLakeSettings"
+
+instance Data.ToQuery PutDataLakeSettings where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutDataLakeSettingsResponse' smart constructor.
+data PutDataLakeSettingsResponse = PutDataLakeSettingsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutDataLakeSettingsResponse' 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', 'putDataLakeSettingsResponse_httpStatus' - The response's http status code.
+newPutDataLakeSettingsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutDataLakeSettingsResponse
+newPutDataLakeSettingsResponse pHttpStatus_ =
+  PutDataLakeSettingsResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+putDataLakeSettingsResponse_httpStatus :: Lens.Lens' PutDataLakeSettingsResponse Prelude.Int
+putDataLakeSettingsResponse_httpStatus = Lens.lens (\PutDataLakeSettingsResponse' {httpStatus} -> httpStatus) (\s@PutDataLakeSettingsResponse' {} a -> s {httpStatus = a} :: PutDataLakeSettingsResponse)
+
+instance Prelude.NFData PutDataLakeSettingsResponse where
+  rnf PutDataLakeSettingsResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/RegisterResource.hs b/gen/Amazonka/LakeFormation/RegisterResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/RegisterResource.hs
@@ -0,0 +1,221 @@
+{-# 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.LakeFormation.RegisterResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Registers the resource as managed by the Data Catalog.
+--
+-- To add or update data, Lake Formation needs read\/write access to the
+-- chosen Amazon S3 path. Choose a role that you know has permission to do
+-- this, or choose the AWSServiceRoleForLakeFormationDataAccess
+-- service-linked role. When you register the first Amazon S3 path, the
+-- service-linked role and a new inline policy are created on your behalf.
+-- Lake Formation adds the first path to the inline policy and attaches it
+-- to the service-linked role. When you register subsequent paths, Lake
+-- Formation adds the path to the existing policy.
+--
+-- The following request registers a new location and gives Lake Formation
+-- permission to use the service-linked role to access that location.
+--
+-- @ResourceArn = arn:aws:s3:::my-bucket UseServiceLinkedRole = true@
+--
+-- If @UseServiceLinkedRole@ is not set to true, you must provide or set
+-- the @RoleArn@:
+--
+-- @arn:aws:iam::12345:role\/my-data-access-role@
+module Amazonka.LakeFormation.RegisterResource
+  ( -- * Creating a Request
+    RegisterResource (..),
+    newRegisterResource,
+
+    -- * Request Lenses
+    registerResource_roleArn,
+    registerResource_useServiceLinkedRole,
+    registerResource_resourceArn,
+
+    -- * Destructuring the Response
+    RegisterResourceResponse (..),
+    newRegisterResourceResponse,
+
+    -- * Response Lenses
+    registerResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newRegisterResource' smart constructor.
+data RegisterResource = RegisterResource'
+  { -- | The identifier for the role that registers the resource.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | Designates an Identity and Access Management (IAM) service-linked role
+    -- by registering this role with the Data Catalog. A service-linked role is
+    -- a unique type of IAM role that is linked directly to Lake Formation.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/lake-formation/latest/dg/service-linked-roles.html Using Service-Linked Roles for Lake Formation>.
+    useServiceLinkedRole :: Prelude.Maybe Prelude.Bool,
+    -- | The Amazon Resource Name (ARN) of the resource that you want to
+    -- register.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RegisterResource' 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:
+--
+-- 'roleArn', 'registerResource_roleArn' - The identifier for the role that registers the resource.
+--
+-- 'useServiceLinkedRole', 'registerResource_useServiceLinkedRole' - Designates an Identity and Access Management (IAM) service-linked role
+-- by registering this role with the Data Catalog. A service-linked role is
+-- a unique type of IAM role that is linked directly to Lake Formation.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/lake-formation/latest/dg/service-linked-roles.html Using Service-Linked Roles for Lake Formation>.
+--
+-- 'resourceArn', 'registerResource_resourceArn' - The Amazon Resource Name (ARN) of the resource that you want to
+-- register.
+newRegisterResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  RegisterResource
+newRegisterResource pResourceArn_ =
+  RegisterResource'
+    { roleArn = Prelude.Nothing,
+      useServiceLinkedRole = Prelude.Nothing,
+      resourceArn = pResourceArn_
+    }
+
+-- | The identifier for the role that registers the resource.
+registerResource_roleArn :: Lens.Lens' RegisterResource (Prelude.Maybe Prelude.Text)
+registerResource_roleArn = Lens.lens (\RegisterResource' {roleArn} -> roleArn) (\s@RegisterResource' {} a -> s {roleArn = a} :: RegisterResource)
+
+-- | Designates an Identity and Access Management (IAM) service-linked role
+-- by registering this role with the Data Catalog. A service-linked role is
+-- a unique type of IAM role that is linked directly to Lake Formation.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/lake-formation/latest/dg/service-linked-roles.html Using Service-Linked Roles for Lake Formation>.
+registerResource_useServiceLinkedRole :: Lens.Lens' RegisterResource (Prelude.Maybe Prelude.Bool)
+registerResource_useServiceLinkedRole = Lens.lens (\RegisterResource' {useServiceLinkedRole} -> useServiceLinkedRole) (\s@RegisterResource' {} a -> s {useServiceLinkedRole = a} :: RegisterResource)
+
+-- | The Amazon Resource Name (ARN) of the resource that you want to
+-- register.
+registerResource_resourceArn :: Lens.Lens' RegisterResource Prelude.Text
+registerResource_resourceArn = Lens.lens (\RegisterResource' {resourceArn} -> resourceArn) (\s@RegisterResource' {} a -> s {resourceArn = a} :: RegisterResource)
+
+instance Core.AWSRequest RegisterResource where
+  type
+    AWSResponse RegisterResource =
+      RegisterResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          RegisterResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable RegisterResource where
+  hashWithSalt _salt RegisterResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` useServiceLinkedRole
+      `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData RegisterResource where
+  rnf RegisterResource' {..} =
+    Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf useServiceLinkedRole
+      `Prelude.seq` Prelude.rnf resourceArn
+
+instance Data.ToHeaders RegisterResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON RegisterResource where
+  toJSON RegisterResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("RoleArn" Data..=) Prelude.<$> roleArn,
+            ("UseServiceLinkedRole" Data..=)
+              Prelude.<$> useServiceLinkedRole,
+            Prelude.Just ("ResourceArn" Data..= resourceArn)
+          ]
+      )
+
+instance Data.ToPath RegisterResource where
+  toPath = Prelude.const "/RegisterResource"
+
+instance Data.ToQuery RegisterResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newRegisterResourceResponse' smart constructor.
+data RegisterResourceResponse = RegisterResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RegisterResourceResponse' 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', 'registerResourceResponse_httpStatus' - The response's http status code.
+newRegisterResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  RegisterResourceResponse
+newRegisterResourceResponse pHttpStatus_ =
+  RegisterResourceResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+registerResourceResponse_httpStatus :: Lens.Lens' RegisterResourceResponse Prelude.Int
+registerResourceResponse_httpStatus = Lens.lens (\RegisterResourceResponse' {httpStatus} -> httpStatus) (\s@RegisterResourceResponse' {} a -> s {httpStatus = a} :: RegisterResourceResponse)
+
+instance Prelude.NFData RegisterResourceResponse where
+  rnf RegisterResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/RemoveLFTagsFromResource.hs b/gen/Amazonka/LakeFormation/RemoveLFTagsFromResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/RemoveLFTagsFromResource.hs
@@ -0,0 +1,215 @@
+{-# 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.LakeFormation.RemoveLFTagsFromResource
+-- 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 an LF-tag from the resource. Only database, table, or
+-- tableWithColumns resource are allowed. To tag columns, use the column
+-- inclusion list in @tableWithColumns@ to specify column input.
+module Amazonka.LakeFormation.RemoveLFTagsFromResource
+  ( -- * Creating a Request
+    RemoveLFTagsFromResource (..),
+    newRemoveLFTagsFromResource,
+
+    -- * Request Lenses
+    removeLFTagsFromResource_catalogId,
+    removeLFTagsFromResource_resource,
+    removeLFTagsFromResource_lFTags,
+
+    -- * Destructuring the Response
+    RemoveLFTagsFromResourceResponse (..),
+    newRemoveLFTagsFromResourceResponse,
+
+    -- * Response Lenses
+    removeLFTagsFromResourceResponse_failures,
+    removeLFTagsFromResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newRemoveLFTagsFromResource' smart constructor.
+data RemoveLFTagsFromResource = RemoveLFTagsFromResource'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The database, table, or column resource where you want to remove an
+    -- LF-tag.
+    resource :: Resource,
+    -- | The LF-tags to be removed from the resource.
+    lFTags :: Prelude.NonEmpty LFTagPair
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RemoveLFTagsFromResource' 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:
+--
+-- 'catalogId', 'removeLFTagsFromResource_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'resource', 'removeLFTagsFromResource_resource' - The database, table, or column resource where you want to remove an
+-- LF-tag.
+--
+-- 'lFTags', 'removeLFTagsFromResource_lFTags' - The LF-tags to be removed from the resource.
+newRemoveLFTagsFromResource ::
+  -- | 'resource'
+  Resource ->
+  -- | 'lFTags'
+  Prelude.NonEmpty LFTagPair ->
+  RemoveLFTagsFromResource
+newRemoveLFTagsFromResource pResource_ pLFTags_ =
+  RemoveLFTagsFromResource'
+    { catalogId =
+        Prelude.Nothing,
+      resource = pResource_,
+      lFTags = Lens.coerced Lens.# pLFTags_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+removeLFTagsFromResource_catalogId :: Lens.Lens' RemoveLFTagsFromResource (Prelude.Maybe Prelude.Text)
+removeLFTagsFromResource_catalogId = Lens.lens (\RemoveLFTagsFromResource' {catalogId} -> catalogId) (\s@RemoveLFTagsFromResource' {} a -> s {catalogId = a} :: RemoveLFTagsFromResource)
+
+-- | The database, table, or column resource where you want to remove an
+-- LF-tag.
+removeLFTagsFromResource_resource :: Lens.Lens' RemoveLFTagsFromResource Resource
+removeLFTagsFromResource_resource = Lens.lens (\RemoveLFTagsFromResource' {resource} -> resource) (\s@RemoveLFTagsFromResource' {} a -> s {resource = a} :: RemoveLFTagsFromResource)
+
+-- | The LF-tags to be removed from the resource.
+removeLFTagsFromResource_lFTags :: Lens.Lens' RemoveLFTagsFromResource (Prelude.NonEmpty LFTagPair)
+removeLFTagsFromResource_lFTags = Lens.lens (\RemoveLFTagsFromResource' {lFTags} -> lFTags) (\s@RemoveLFTagsFromResource' {} a -> s {lFTags = a} :: RemoveLFTagsFromResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest RemoveLFTagsFromResource where
+  type
+    AWSResponse RemoveLFTagsFromResource =
+      RemoveLFTagsFromResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          RemoveLFTagsFromResourceResponse'
+            Prelude.<$> (x Data..?> "Failures" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable RemoveLFTagsFromResource where
+  hashWithSalt _salt RemoveLFTagsFromResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` resource
+      `Prelude.hashWithSalt` lFTags
+
+instance Prelude.NFData RemoveLFTagsFromResource where
+  rnf RemoveLFTagsFromResource' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf resource
+      `Prelude.seq` Prelude.rnf lFTags
+
+instance Data.ToHeaders RemoveLFTagsFromResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON RemoveLFTagsFromResource where
+  toJSON RemoveLFTagsFromResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("Resource" Data..= resource),
+            Prelude.Just ("LFTags" Data..= lFTags)
+          ]
+      )
+
+instance Data.ToPath RemoveLFTagsFromResource where
+  toPath = Prelude.const "/RemoveLFTagsFromResource"
+
+instance Data.ToQuery RemoveLFTagsFromResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newRemoveLFTagsFromResourceResponse' smart constructor.
+data RemoveLFTagsFromResourceResponse = RemoveLFTagsFromResourceResponse'
+  { -- | A list of failures to untag a resource.
+    failures :: Prelude.Maybe [LFTagError],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RemoveLFTagsFromResourceResponse' 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:
+--
+-- 'failures', 'removeLFTagsFromResourceResponse_failures' - A list of failures to untag a resource.
+--
+-- 'httpStatus', 'removeLFTagsFromResourceResponse_httpStatus' - The response's http status code.
+newRemoveLFTagsFromResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  RemoveLFTagsFromResourceResponse
+newRemoveLFTagsFromResourceResponse pHttpStatus_ =
+  RemoveLFTagsFromResourceResponse'
+    { failures =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of failures to untag a resource.
+removeLFTagsFromResourceResponse_failures :: Lens.Lens' RemoveLFTagsFromResourceResponse (Prelude.Maybe [LFTagError])
+removeLFTagsFromResourceResponse_failures = Lens.lens (\RemoveLFTagsFromResourceResponse' {failures} -> failures) (\s@RemoveLFTagsFromResourceResponse' {} a -> s {failures = a} :: RemoveLFTagsFromResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+removeLFTagsFromResourceResponse_httpStatus :: Lens.Lens' RemoveLFTagsFromResourceResponse Prelude.Int
+removeLFTagsFromResourceResponse_httpStatus = Lens.lens (\RemoveLFTagsFromResourceResponse' {httpStatus} -> httpStatus) (\s@RemoveLFTagsFromResourceResponse' {} a -> s {httpStatus = a} :: RemoveLFTagsFromResourceResponse)
+
+instance
+  Prelude.NFData
+    RemoveLFTagsFromResourceResponse
+  where
+  rnf RemoveLFTagsFromResourceResponse' {..} =
+    Prelude.rnf failures
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/RevokePermissions.hs b/gen/Amazonka/LakeFormation/RevokePermissions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/RevokePermissions.hs
@@ -0,0 +1,231 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.RevokePermissions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Revokes permissions to the principal to access metadata in the Data
+-- Catalog and data organized in underlying data storage such as Amazon S3.
+module Amazonka.LakeFormation.RevokePermissions
+  ( -- * Creating a Request
+    RevokePermissions (..),
+    newRevokePermissions,
+
+    -- * Request Lenses
+    revokePermissions_catalogId,
+    revokePermissions_permissionsWithGrantOption,
+    revokePermissions_principal,
+    revokePermissions_resource,
+    revokePermissions_permissions,
+
+    -- * Destructuring the Response
+    RevokePermissionsResponse (..),
+    newRevokePermissionsResponse,
+
+    -- * Response Lenses
+    revokePermissionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newRevokePermissions' smart constructor.
+data RevokePermissions = RevokePermissions'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | Indicates a list of permissions for which to revoke the grant option
+    -- allowing the principal to pass permissions to other principals.
+    permissionsWithGrantOption :: Prelude.Maybe [Permission],
+    -- | The principal to be revoked permissions on the resource.
+    principal :: DataLakePrincipal,
+    -- | The resource to which permissions are to be revoked.
+    resource :: Resource,
+    -- | The permissions revoked to the principal on the resource. For
+    -- information about permissions, see
+    -- <https://docs-aws.amazon.com/lake-formation/latest/dg/security-data-access.html Security and Access Control to Metadata and Data>.
+    permissions :: [Permission]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RevokePermissions' 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:
+--
+-- 'catalogId', 'revokePermissions_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'permissionsWithGrantOption', 'revokePermissions_permissionsWithGrantOption' - Indicates a list of permissions for which to revoke the grant option
+-- allowing the principal to pass permissions to other principals.
+--
+-- 'principal', 'revokePermissions_principal' - The principal to be revoked permissions on the resource.
+--
+-- 'resource', 'revokePermissions_resource' - The resource to which permissions are to be revoked.
+--
+-- 'permissions', 'revokePermissions_permissions' - The permissions revoked to the principal on the resource. For
+-- information about permissions, see
+-- <https://docs-aws.amazon.com/lake-formation/latest/dg/security-data-access.html Security and Access Control to Metadata and Data>.
+newRevokePermissions ::
+  -- | 'principal'
+  DataLakePrincipal ->
+  -- | 'resource'
+  Resource ->
+  RevokePermissions
+newRevokePermissions pPrincipal_ pResource_ =
+  RevokePermissions'
+    { catalogId = Prelude.Nothing,
+      permissionsWithGrantOption = Prelude.Nothing,
+      principal = pPrincipal_,
+      resource = pResource_,
+      permissions = Prelude.mempty
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+revokePermissions_catalogId :: Lens.Lens' RevokePermissions (Prelude.Maybe Prelude.Text)
+revokePermissions_catalogId = Lens.lens (\RevokePermissions' {catalogId} -> catalogId) (\s@RevokePermissions' {} a -> s {catalogId = a} :: RevokePermissions)
+
+-- | Indicates a list of permissions for which to revoke the grant option
+-- allowing the principal to pass permissions to other principals.
+revokePermissions_permissionsWithGrantOption :: Lens.Lens' RevokePermissions (Prelude.Maybe [Permission])
+revokePermissions_permissionsWithGrantOption = Lens.lens (\RevokePermissions' {permissionsWithGrantOption} -> permissionsWithGrantOption) (\s@RevokePermissions' {} a -> s {permissionsWithGrantOption = a} :: RevokePermissions) Prelude.. Lens.mapping Lens.coerced
+
+-- | The principal to be revoked permissions on the resource.
+revokePermissions_principal :: Lens.Lens' RevokePermissions DataLakePrincipal
+revokePermissions_principal = Lens.lens (\RevokePermissions' {principal} -> principal) (\s@RevokePermissions' {} a -> s {principal = a} :: RevokePermissions)
+
+-- | The resource to which permissions are to be revoked.
+revokePermissions_resource :: Lens.Lens' RevokePermissions Resource
+revokePermissions_resource = Lens.lens (\RevokePermissions' {resource} -> resource) (\s@RevokePermissions' {} a -> s {resource = a} :: RevokePermissions)
+
+-- | The permissions revoked to the principal on the resource. For
+-- information about permissions, see
+-- <https://docs-aws.amazon.com/lake-formation/latest/dg/security-data-access.html Security and Access Control to Metadata and Data>.
+revokePermissions_permissions :: Lens.Lens' RevokePermissions [Permission]
+revokePermissions_permissions = Lens.lens (\RevokePermissions' {permissions} -> permissions) (\s@RevokePermissions' {} a -> s {permissions = a} :: RevokePermissions) Prelude.. Lens.coerced
+
+instance Core.AWSRequest RevokePermissions where
+  type
+    AWSResponse RevokePermissions =
+      RevokePermissionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          RevokePermissionsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable RevokePermissions where
+  hashWithSalt _salt RevokePermissions' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` permissionsWithGrantOption
+      `Prelude.hashWithSalt` principal
+      `Prelude.hashWithSalt` resource
+      `Prelude.hashWithSalt` permissions
+
+instance Prelude.NFData RevokePermissions where
+  rnf RevokePermissions' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf permissionsWithGrantOption
+      `Prelude.seq` Prelude.rnf principal
+      `Prelude.seq` Prelude.rnf resource
+      `Prelude.seq` Prelude.rnf permissions
+
+instance Data.ToHeaders RevokePermissions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON RevokePermissions where
+  toJSON RevokePermissions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("PermissionsWithGrantOption" Data..=)
+              Prelude.<$> permissionsWithGrantOption,
+            Prelude.Just ("Principal" Data..= principal),
+            Prelude.Just ("Resource" Data..= resource),
+            Prelude.Just ("Permissions" Data..= permissions)
+          ]
+      )
+
+instance Data.ToPath RevokePermissions where
+  toPath = Prelude.const "/RevokePermissions"
+
+instance Data.ToQuery RevokePermissions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newRevokePermissionsResponse' smart constructor.
+data RevokePermissionsResponse = RevokePermissionsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RevokePermissionsResponse' 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', 'revokePermissionsResponse_httpStatus' - The response's http status code.
+newRevokePermissionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  RevokePermissionsResponse
+newRevokePermissionsResponse pHttpStatus_ =
+  RevokePermissionsResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+revokePermissionsResponse_httpStatus :: Lens.Lens' RevokePermissionsResponse Prelude.Int
+revokePermissionsResponse_httpStatus = Lens.lens (\RevokePermissionsResponse' {httpStatus} -> httpStatus) (\s@RevokePermissionsResponse' {} a -> s {httpStatus = a} :: RevokePermissionsResponse)
+
+instance Prelude.NFData RevokePermissionsResponse where
+  rnf RevokePermissionsResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/SearchDatabasesByLFTags.hs b/gen/Amazonka/LakeFormation/SearchDatabasesByLFTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/SearchDatabasesByLFTags.hs
@@ -0,0 +1,271 @@
+{-# 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.LakeFormation.SearchDatabasesByLFTags
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- This operation allows a search on @DATABASE@ resources by
+-- @TagCondition@. This operation is used by admins who want to grant user
+-- permissions on certain @TagConditions@. Before making a grant, the admin
+-- can use @SearchDatabasesByTags@ to find all resources where the given
+-- @TagConditions@ are valid to verify whether the returned resources can
+-- be shared.
+--
+-- This operation returns paginated results.
+module Amazonka.LakeFormation.SearchDatabasesByLFTags
+  ( -- * Creating a Request
+    SearchDatabasesByLFTags (..),
+    newSearchDatabasesByLFTags,
+
+    -- * Request Lenses
+    searchDatabasesByLFTags_catalogId,
+    searchDatabasesByLFTags_maxResults,
+    searchDatabasesByLFTags_nextToken,
+    searchDatabasesByLFTags_expression,
+
+    -- * Destructuring the Response
+    SearchDatabasesByLFTagsResponse (..),
+    newSearchDatabasesByLFTagsResponse,
+
+    -- * Response Lenses
+    searchDatabasesByLFTagsResponse_databaseList,
+    searchDatabasesByLFTagsResponse_nextToken,
+    searchDatabasesByLFTagsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSearchDatabasesByLFTags' smart constructor.
+data SearchDatabasesByLFTags = SearchDatabasesByLFTags'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A continuation token, if this is not the first call to retrieve this
+    -- list.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of conditions (@LFTag@ structures) to search for in database
+    -- resources.
+    expression :: Prelude.NonEmpty LFTag
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SearchDatabasesByLFTags' 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:
+--
+-- 'catalogId', 'searchDatabasesByLFTags_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'maxResults', 'searchDatabasesByLFTags_maxResults' - The maximum number of results to return.
+--
+-- 'nextToken', 'searchDatabasesByLFTags_nextToken' - A continuation token, if this is not the first call to retrieve this
+-- list.
+--
+-- 'expression', 'searchDatabasesByLFTags_expression' - A list of conditions (@LFTag@ structures) to search for in database
+-- resources.
+newSearchDatabasesByLFTags ::
+  -- | 'expression'
+  Prelude.NonEmpty LFTag ->
+  SearchDatabasesByLFTags
+newSearchDatabasesByLFTags pExpression_ =
+  SearchDatabasesByLFTags'
+    { catalogId =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      expression = Lens.coerced Lens.# pExpression_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+searchDatabasesByLFTags_catalogId :: Lens.Lens' SearchDatabasesByLFTags (Prelude.Maybe Prelude.Text)
+searchDatabasesByLFTags_catalogId = Lens.lens (\SearchDatabasesByLFTags' {catalogId} -> catalogId) (\s@SearchDatabasesByLFTags' {} a -> s {catalogId = a} :: SearchDatabasesByLFTags)
+
+-- | The maximum number of results to return.
+searchDatabasesByLFTags_maxResults :: Lens.Lens' SearchDatabasesByLFTags (Prelude.Maybe Prelude.Natural)
+searchDatabasesByLFTags_maxResults = Lens.lens (\SearchDatabasesByLFTags' {maxResults} -> maxResults) (\s@SearchDatabasesByLFTags' {} a -> s {maxResults = a} :: SearchDatabasesByLFTags)
+
+-- | A continuation token, if this is not the first call to retrieve this
+-- list.
+searchDatabasesByLFTags_nextToken :: Lens.Lens' SearchDatabasesByLFTags (Prelude.Maybe Prelude.Text)
+searchDatabasesByLFTags_nextToken = Lens.lens (\SearchDatabasesByLFTags' {nextToken} -> nextToken) (\s@SearchDatabasesByLFTags' {} a -> s {nextToken = a} :: SearchDatabasesByLFTags)
+
+-- | A list of conditions (@LFTag@ structures) to search for in database
+-- resources.
+searchDatabasesByLFTags_expression :: Lens.Lens' SearchDatabasesByLFTags (Prelude.NonEmpty LFTag)
+searchDatabasesByLFTags_expression = Lens.lens (\SearchDatabasesByLFTags' {expression} -> expression) (\s@SearchDatabasesByLFTags' {} a -> s {expression = a} :: SearchDatabasesByLFTags) Prelude.. Lens.coerced
+
+instance Core.AWSPager SearchDatabasesByLFTags where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? searchDatabasesByLFTagsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? searchDatabasesByLFTagsResponse_databaseList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& searchDatabasesByLFTags_nextToken
+          Lens..~ rs
+          Lens.^? searchDatabasesByLFTagsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest SearchDatabasesByLFTags where
+  type
+    AWSResponse SearchDatabasesByLFTags =
+      SearchDatabasesByLFTagsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SearchDatabasesByLFTagsResponse'
+            Prelude.<$> (x Data..?> "DatabaseList" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable SearchDatabasesByLFTags where
+  hashWithSalt _salt SearchDatabasesByLFTags' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` expression
+
+instance Prelude.NFData SearchDatabasesByLFTags where
+  rnf SearchDatabasesByLFTags' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf expression
+
+instance Data.ToHeaders SearchDatabasesByLFTags where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SearchDatabasesByLFTags where
+  toJSON SearchDatabasesByLFTags' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("Expression" Data..= expression)
+          ]
+      )
+
+instance Data.ToPath SearchDatabasesByLFTags where
+  toPath = Prelude.const "/SearchDatabasesByLFTags"
+
+instance Data.ToQuery SearchDatabasesByLFTags where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSearchDatabasesByLFTagsResponse' smart constructor.
+data SearchDatabasesByLFTagsResponse = SearchDatabasesByLFTagsResponse'
+  { -- | A list of databases that meet the LF-tag conditions.
+    databaseList :: Prelude.Maybe [TaggedDatabase],
+    -- | A continuation token, present if the current list segment is not the
+    -- last.
+    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 'SearchDatabasesByLFTagsResponse' 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:
+--
+-- 'databaseList', 'searchDatabasesByLFTagsResponse_databaseList' - A list of databases that meet the LF-tag conditions.
+--
+-- 'nextToken', 'searchDatabasesByLFTagsResponse_nextToken' - A continuation token, present if the current list segment is not the
+-- last.
+--
+-- 'httpStatus', 'searchDatabasesByLFTagsResponse_httpStatus' - The response's http status code.
+newSearchDatabasesByLFTagsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SearchDatabasesByLFTagsResponse
+newSearchDatabasesByLFTagsResponse pHttpStatus_ =
+  SearchDatabasesByLFTagsResponse'
+    { databaseList =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of databases that meet the LF-tag conditions.
+searchDatabasesByLFTagsResponse_databaseList :: Lens.Lens' SearchDatabasesByLFTagsResponse (Prelude.Maybe [TaggedDatabase])
+searchDatabasesByLFTagsResponse_databaseList = Lens.lens (\SearchDatabasesByLFTagsResponse' {databaseList} -> databaseList) (\s@SearchDatabasesByLFTagsResponse' {} a -> s {databaseList = a} :: SearchDatabasesByLFTagsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A continuation token, present if the current list segment is not the
+-- last.
+searchDatabasesByLFTagsResponse_nextToken :: Lens.Lens' SearchDatabasesByLFTagsResponse (Prelude.Maybe Prelude.Text)
+searchDatabasesByLFTagsResponse_nextToken = Lens.lens (\SearchDatabasesByLFTagsResponse' {nextToken} -> nextToken) (\s@SearchDatabasesByLFTagsResponse' {} a -> s {nextToken = a} :: SearchDatabasesByLFTagsResponse)
+
+-- | The response's http status code.
+searchDatabasesByLFTagsResponse_httpStatus :: Lens.Lens' SearchDatabasesByLFTagsResponse Prelude.Int
+searchDatabasesByLFTagsResponse_httpStatus = Lens.lens (\SearchDatabasesByLFTagsResponse' {httpStatus} -> httpStatus) (\s@SearchDatabasesByLFTagsResponse' {} a -> s {httpStatus = a} :: SearchDatabasesByLFTagsResponse)
+
+instance
+  Prelude.NFData
+    SearchDatabasesByLFTagsResponse
+  where
+  rnf SearchDatabasesByLFTagsResponse' {..} =
+    Prelude.rnf databaseList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/SearchTablesByLFTags.hs b/gen/Amazonka/LakeFormation/SearchTablesByLFTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/SearchTablesByLFTags.hs
@@ -0,0 +1,266 @@
+{-# 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.LakeFormation.SearchTablesByLFTags
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- This operation allows a search on @TABLE@ resources by @LFTag@s. This
+-- will be used by admins who want to grant user permissions on certain
+-- LF-tags. Before making a grant, the admin can use @SearchTablesByLFTags@
+-- to find all resources where the given @LFTag@s are valid to verify
+-- whether the returned resources can be shared.
+--
+-- This operation returns paginated results.
+module Amazonka.LakeFormation.SearchTablesByLFTags
+  ( -- * Creating a Request
+    SearchTablesByLFTags (..),
+    newSearchTablesByLFTags,
+
+    -- * Request Lenses
+    searchTablesByLFTags_catalogId,
+    searchTablesByLFTags_maxResults,
+    searchTablesByLFTags_nextToken,
+    searchTablesByLFTags_expression,
+
+    -- * Destructuring the Response
+    SearchTablesByLFTagsResponse (..),
+    newSearchTablesByLFTagsResponse,
+
+    -- * Response Lenses
+    searchTablesByLFTagsResponse_nextToken,
+    searchTablesByLFTagsResponse_tableList,
+    searchTablesByLFTagsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSearchTablesByLFTags' smart constructor.
+data SearchTablesByLFTags = SearchTablesByLFTags'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A continuation token, if this is not the first call to retrieve this
+    -- list.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of conditions (@LFTag@ structures) to search for in table
+    -- resources.
+    expression :: Prelude.NonEmpty LFTag
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SearchTablesByLFTags' 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:
+--
+-- 'catalogId', 'searchTablesByLFTags_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'maxResults', 'searchTablesByLFTags_maxResults' - The maximum number of results to return.
+--
+-- 'nextToken', 'searchTablesByLFTags_nextToken' - A continuation token, if this is not the first call to retrieve this
+-- list.
+--
+-- 'expression', 'searchTablesByLFTags_expression' - A list of conditions (@LFTag@ structures) to search for in table
+-- resources.
+newSearchTablesByLFTags ::
+  -- | 'expression'
+  Prelude.NonEmpty LFTag ->
+  SearchTablesByLFTags
+newSearchTablesByLFTags pExpression_ =
+  SearchTablesByLFTags'
+    { catalogId = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      expression = Lens.coerced Lens.# pExpression_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+searchTablesByLFTags_catalogId :: Lens.Lens' SearchTablesByLFTags (Prelude.Maybe Prelude.Text)
+searchTablesByLFTags_catalogId = Lens.lens (\SearchTablesByLFTags' {catalogId} -> catalogId) (\s@SearchTablesByLFTags' {} a -> s {catalogId = a} :: SearchTablesByLFTags)
+
+-- | The maximum number of results to return.
+searchTablesByLFTags_maxResults :: Lens.Lens' SearchTablesByLFTags (Prelude.Maybe Prelude.Natural)
+searchTablesByLFTags_maxResults = Lens.lens (\SearchTablesByLFTags' {maxResults} -> maxResults) (\s@SearchTablesByLFTags' {} a -> s {maxResults = a} :: SearchTablesByLFTags)
+
+-- | A continuation token, if this is not the first call to retrieve this
+-- list.
+searchTablesByLFTags_nextToken :: Lens.Lens' SearchTablesByLFTags (Prelude.Maybe Prelude.Text)
+searchTablesByLFTags_nextToken = Lens.lens (\SearchTablesByLFTags' {nextToken} -> nextToken) (\s@SearchTablesByLFTags' {} a -> s {nextToken = a} :: SearchTablesByLFTags)
+
+-- | A list of conditions (@LFTag@ structures) to search for in table
+-- resources.
+searchTablesByLFTags_expression :: Lens.Lens' SearchTablesByLFTags (Prelude.NonEmpty LFTag)
+searchTablesByLFTags_expression = Lens.lens (\SearchTablesByLFTags' {expression} -> expression) (\s@SearchTablesByLFTags' {} a -> s {expression = a} :: SearchTablesByLFTags) Prelude.. Lens.coerced
+
+instance Core.AWSPager SearchTablesByLFTags where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? searchTablesByLFTagsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? searchTablesByLFTagsResponse_tableList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& searchTablesByLFTags_nextToken
+          Lens..~ rs
+          Lens.^? searchTablesByLFTagsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest SearchTablesByLFTags where
+  type
+    AWSResponse SearchTablesByLFTags =
+      SearchTablesByLFTagsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SearchTablesByLFTagsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "TableList" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable SearchTablesByLFTags where
+  hashWithSalt _salt SearchTablesByLFTags' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` expression
+
+instance Prelude.NFData SearchTablesByLFTags where
+  rnf SearchTablesByLFTags' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf expression
+
+instance Data.ToHeaders SearchTablesByLFTags where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SearchTablesByLFTags where
+  toJSON SearchTablesByLFTags' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("Expression" Data..= expression)
+          ]
+      )
+
+instance Data.ToPath SearchTablesByLFTags where
+  toPath = Prelude.const "/SearchTablesByLFTags"
+
+instance Data.ToQuery SearchTablesByLFTags where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSearchTablesByLFTagsResponse' smart constructor.
+data SearchTablesByLFTagsResponse = SearchTablesByLFTagsResponse'
+  { -- | A continuation token, present if the current list segment is not the
+    -- last.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of tables that meet the LF-tag conditions.
+    tableList :: Prelude.Maybe [TaggedTable],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SearchTablesByLFTagsResponse' 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', 'searchTablesByLFTagsResponse_nextToken' - A continuation token, present if the current list segment is not the
+-- last.
+--
+-- 'tableList', 'searchTablesByLFTagsResponse_tableList' - A list of tables that meet the LF-tag conditions.
+--
+-- 'httpStatus', 'searchTablesByLFTagsResponse_httpStatus' - The response's http status code.
+newSearchTablesByLFTagsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SearchTablesByLFTagsResponse
+newSearchTablesByLFTagsResponse pHttpStatus_ =
+  SearchTablesByLFTagsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      tableList = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A continuation token, present if the current list segment is not the
+-- last.
+searchTablesByLFTagsResponse_nextToken :: Lens.Lens' SearchTablesByLFTagsResponse (Prelude.Maybe Prelude.Text)
+searchTablesByLFTagsResponse_nextToken = Lens.lens (\SearchTablesByLFTagsResponse' {nextToken} -> nextToken) (\s@SearchTablesByLFTagsResponse' {} a -> s {nextToken = a} :: SearchTablesByLFTagsResponse)
+
+-- | A list of tables that meet the LF-tag conditions.
+searchTablesByLFTagsResponse_tableList :: Lens.Lens' SearchTablesByLFTagsResponse (Prelude.Maybe [TaggedTable])
+searchTablesByLFTagsResponse_tableList = Lens.lens (\SearchTablesByLFTagsResponse' {tableList} -> tableList) (\s@SearchTablesByLFTagsResponse' {} a -> s {tableList = a} :: SearchTablesByLFTagsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+searchTablesByLFTagsResponse_httpStatus :: Lens.Lens' SearchTablesByLFTagsResponse Prelude.Int
+searchTablesByLFTagsResponse_httpStatus = Lens.lens (\SearchTablesByLFTagsResponse' {httpStatus} -> httpStatus) (\s@SearchTablesByLFTagsResponse' {} a -> s {httpStatus = a} :: SearchTablesByLFTagsResponse)
+
+instance Prelude.NFData SearchTablesByLFTagsResponse where
+  rnf SearchTablesByLFTagsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf tableList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/StartQueryPlanning.hs b/gen/Amazonka/LakeFormation/StartQueryPlanning.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/StartQueryPlanning.hs
@@ -0,0 +1,207 @@
+{-# 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.LakeFormation.StartQueryPlanning
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Submits a request to process a query statement.
+--
+-- This operation generates work units that can be retrieved with the
+-- @GetWorkUnits@ operation as soon as the query state is
+-- WORKUNITS_AVAILABLE or FINISHED.
+module Amazonka.LakeFormation.StartQueryPlanning
+  ( -- * Creating a Request
+    StartQueryPlanning (..),
+    newStartQueryPlanning,
+
+    -- * Request Lenses
+    startQueryPlanning_queryPlanningContext,
+    startQueryPlanning_queryString,
+
+    -- * Destructuring the Response
+    StartQueryPlanningResponse (..),
+    newStartQueryPlanningResponse,
+
+    -- * Response Lenses
+    startQueryPlanningResponse_httpStatus,
+    startQueryPlanningResponse_queryId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStartQueryPlanning' smart constructor.
+data StartQueryPlanning = StartQueryPlanning'
+  { -- | A structure containing information about the query plan.
+    queryPlanningContext :: QueryPlanningContext,
+    -- | A PartiQL query statement used as an input to the planner service.
+    queryString :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartQueryPlanning' 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:
+--
+-- 'queryPlanningContext', 'startQueryPlanning_queryPlanningContext' - A structure containing information about the query plan.
+--
+-- 'queryString', 'startQueryPlanning_queryString' - A PartiQL query statement used as an input to the planner service.
+newStartQueryPlanning ::
+  -- | 'queryPlanningContext'
+  QueryPlanningContext ->
+  -- | 'queryString'
+  Prelude.Text ->
+  StartQueryPlanning
+newStartQueryPlanning
+  pQueryPlanningContext_
+  pQueryString_ =
+    StartQueryPlanning'
+      { queryPlanningContext =
+          pQueryPlanningContext_,
+        queryString = Data._Sensitive Lens.# pQueryString_
+      }
+
+-- | A structure containing information about the query plan.
+startQueryPlanning_queryPlanningContext :: Lens.Lens' StartQueryPlanning QueryPlanningContext
+startQueryPlanning_queryPlanningContext = Lens.lens (\StartQueryPlanning' {queryPlanningContext} -> queryPlanningContext) (\s@StartQueryPlanning' {} a -> s {queryPlanningContext = a} :: StartQueryPlanning)
+
+-- | A PartiQL query statement used as an input to the planner service.
+startQueryPlanning_queryString :: Lens.Lens' StartQueryPlanning Prelude.Text
+startQueryPlanning_queryString = Lens.lens (\StartQueryPlanning' {queryString} -> queryString) (\s@StartQueryPlanning' {} a -> s {queryString = a} :: StartQueryPlanning) Prelude.. Data._Sensitive
+
+instance Core.AWSRequest StartQueryPlanning where
+  type
+    AWSResponse StartQueryPlanning =
+      StartQueryPlanningResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartQueryPlanningResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "QueryId")
+      )
+
+instance Prelude.Hashable StartQueryPlanning where
+  hashWithSalt _salt StartQueryPlanning' {..} =
+    _salt
+      `Prelude.hashWithSalt` queryPlanningContext
+      `Prelude.hashWithSalt` queryString
+
+instance Prelude.NFData StartQueryPlanning where
+  rnf StartQueryPlanning' {..} =
+    Prelude.rnf queryPlanningContext
+      `Prelude.seq` Prelude.rnf queryString
+
+instance Data.ToHeaders StartQueryPlanning where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartQueryPlanning where
+  toJSON StartQueryPlanning' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "QueryPlanningContext"
+                  Data..= queryPlanningContext
+              ),
+            Prelude.Just ("QueryString" Data..= queryString)
+          ]
+      )
+
+instance Data.ToPath StartQueryPlanning where
+  toPath = Prelude.const "/StartQueryPlanning"
+
+instance Data.ToQuery StartQueryPlanning where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | A structure for the output.
+--
+-- /See:/ 'newStartQueryPlanningResponse' smart constructor.
+data StartQueryPlanningResponse = StartQueryPlanningResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the plan query operation can be used to fetch the actual work
+    -- unit descriptors that are produced as the result of the operation. The
+    -- ID is also used to get the query state and as an input to the @Execute@
+    -- operation.
+    queryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartQueryPlanningResponse' 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', 'startQueryPlanningResponse_httpStatus' - The response's http status code.
+--
+-- 'queryId', 'startQueryPlanningResponse_queryId' - The ID of the plan query operation can be used to fetch the actual work
+-- unit descriptors that are produced as the result of the operation. The
+-- ID is also used to get the query state and as an input to the @Execute@
+-- operation.
+newStartQueryPlanningResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'queryId'
+  Prelude.Text ->
+  StartQueryPlanningResponse
+newStartQueryPlanningResponse pHttpStatus_ pQueryId_ =
+  StartQueryPlanningResponse'
+    { httpStatus =
+        pHttpStatus_,
+      queryId = pQueryId_
+    }
+
+-- | The response's http status code.
+startQueryPlanningResponse_httpStatus :: Lens.Lens' StartQueryPlanningResponse Prelude.Int
+startQueryPlanningResponse_httpStatus = Lens.lens (\StartQueryPlanningResponse' {httpStatus} -> httpStatus) (\s@StartQueryPlanningResponse' {} a -> s {httpStatus = a} :: StartQueryPlanningResponse)
+
+-- | The ID of the plan query operation can be used to fetch the actual work
+-- unit descriptors that are produced as the result of the operation. The
+-- ID is also used to get the query state and as an input to the @Execute@
+-- operation.
+startQueryPlanningResponse_queryId :: Lens.Lens' StartQueryPlanningResponse Prelude.Text
+startQueryPlanningResponse_queryId = Lens.lens (\StartQueryPlanningResponse' {queryId} -> queryId) (\s@StartQueryPlanningResponse' {} a -> s {queryId = a} :: StartQueryPlanningResponse)
+
+instance Prelude.NFData StartQueryPlanningResponse where
+  rnf StartQueryPlanningResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf queryId
diff --git a/gen/Amazonka/LakeFormation/StartTransaction.hs b/gen/Amazonka/LakeFormation/StartTransaction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/StartTransaction.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.StartTransaction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts a new transaction and returns its transaction ID. Transaction IDs
+-- are opaque objects that you can use to identify a transaction.
+module Amazonka.LakeFormation.StartTransaction
+  ( -- * Creating a Request
+    StartTransaction (..),
+    newStartTransaction,
+
+    -- * Request Lenses
+    startTransaction_transactionType,
+
+    -- * Destructuring the Response
+    StartTransactionResponse (..),
+    newStartTransactionResponse,
+
+    -- * Response Lenses
+    startTransactionResponse_transactionId,
+    startTransactionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStartTransaction' smart constructor.
+data StartTransaction = StartTransaction'
+  { -- | Indicates whether this transaction should be read only or read and
+    -- write. Writes made using a read-only transaction ID will be rejected.
+    -- Read-only transactions do not need to be committed.
+    transactionType :: Prelude.Maybe TransactionType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartTransaction' 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:
+--
+-- 'transactionType', 'startTransaction_transactionType' - Indicates whether this transaction should be read only or read and
+-- write. Writes made using a read-only transaction ID will be rejected.
+-- Read-only transactions do not need to be committed.
+newStartTransaction ::
+  StartTransaction
+newStartTransaction =
+  StartTransaction'
+    { transactionType =
+        Prelude.Nothing
+    }
+
+-- | Indicates whether this transaction should be read only or read and
+-- write. Writes made using a read-only transaction ID will be rejected.
+-- Read-only transactions do not need to be committed.
+startTransaction_transactionType :: Lens.Lens' StartTransaction (Prelude.Maybe TransactionType)
+startTransaction_transactionType = Lens.lens (\StartTransaction' {transactionType} -> transactionType) (\s@StartTransaction' {} a -> s {transactionType = a} :: StartTransaction)
+
+instance Core.AWSRequest StartTransaction where
+  type
+    AWSResponse StartTransaction =
+      StartTransactionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartTransactionResponse'
+            Prelude.<$> (x Data..?> "TransactionId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartTransaction where
+  hashWithSalt _salt StartTransaction' {..} =
+    _salt `Prelude.hashWithSalt` transactionType
+
+instance Prelude.NFData StartTransaction where
+  rnf StartTransaction' {..} =
+    Prelude.rnf transactionType
+
+instance Data.ToHeaders StartTransaction where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartTransaction where
+  toJSON StartTransaction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("TransactionType" Data..=)
+              Prelude.<$> transactionType
+          ]
+      )
+
+instance Data.ToPath StartTransaction where
+  toPath = Prelude.const "/StartTransaction"
+
+instance Data.ToQuery StartTransaction where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartTransactionResponse' smart constructor.
+data StartTransactionResponse = StartTransactionResponse'
+  { -- | An opaque identifier for the transaction.
+    transactionId :: 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 'StartTransactionResponse' 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:
+--
+-- 'transactionId', 'startTransactionResponse_transactionId' - An opaque identifier for the transaction.
+--
+-- 'httpStatus', 'startTransactionResponse_httpStatus' - The response's http status code.
+newStartTransactionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartTransactionResponse
+newStartTransactionResponse pHttpStatus_ =
+  StartTransactionResponse'
+    { transactionId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An opaque identifier for the transaction.
+startTransactionResponse_transactionId :: Lens.Lens' StartTransactionResponse (Prelude.Maybe Prelude.Text)
+startTransactionResponse_transactionId = Lens.lens (\StartTransactionResponse' {transactionId} -> transactionId) (\s@StartTransactionResponse' {} a -> s {transactionId = a} :: StartTransactionResponse)
+
+-- | The response's http status code.
+startTransactionResponse_httpStatus :: Lens.Lens' StartTransactionResponse Prelude.Int
+startTransactionResponse_httpStatus = Lens.lens (\StartTransactionResponse' {httpStatus} -> httpStatus) (\s@StartTransactionResponse' {} a -> s {httpStatus = a} :: StartTransactionResponse)
+
+instance Prelude.NFData StartTransactionResponse where
+  rnf StartTransactionResponse' {..} =
+    Prelude.rnf transactionId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/Types.hs b/gen/Amazonka/LakeFormation/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types.hs
@@ -0,0 +1,658 @@
+{-# 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.LakeFormation.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.LakeFormation.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _AlreadyExistsException,
+    _ConcurrentModificationException,
+    _EntityNotFoundException,
+    _ExpiredException,
+    _GlueEncryptionException,
+    _InternalServiceException,
+    _InvalidInputException,
+    _OperationTimeoutException,
+    _PermissionTypeMismatchException,
+    _ResourceNotReadyException,
+    _ResourceNumberLimitExceededException,
+    _StatisticsNotReadyYetException,
+    _ThrottledException,
+    _TransactionCanceledException,
+    _TransactionCommitInProgressException,
+    _TransactionCommittedException,
+    _WorkUnitsNotReadyYetException,
+
+    -- * ComparisonOperator
+    ComparisonOperator (..),
+
+    -- * DataLakeResourceType
+    DataLakeResourceType (..),
+
+    -- * FieldNameString
+    FieldNameString (..),
+
+    -- * OptimizerType
+    OptimizerType (..),
+
+    -- * Permission
+    Permission (..),
+
+    -- * PermissionType
+    PermissionType (..),
+
+    -- * QueryStateString
+    QueryStateString (..),
+
+    -- * ResourceShareType
+    ResourceShareType (..),
+
+    -- * ResourceType
+    ResourceType (..),
+
+    -- * TransactionStatus
+    TransactionStatus (..),
+
+    -- * TransactionStatusFilter
+    TransactionStatusFilter (..),
+
+    -- * TransactionType
+    TransactionType (..),
+
+    -- * AddObjectInput
+    AddObjectInput (..),
+    newAddObjectInput,
+    addObjectInput_partitionValues,
+    addObjectInput_uri,
+    addObjectInput_eTag,
+    addObjectInput_size,
+
+    -- * AllRowsWildcard
+    AllRowsWildcard (..),
+    newAllRowsWildcard,
+
+    -- * AuditContext
+    AuditContext (..),
+    newAuditContext,
+    auditContext_additionalAuditContext,
+
+    -- * BatchPermissionsFailureEntry
+    BatchPermissionsFailureEntry (..),
+    newBatchPermissionsFailureEntry,
+    batchPermissionsFailureEntry_error,
+    batchPermissionsFailureEntry_requestEntry,
+
+    -- * BatchPermissionsRequestEntry
+    BatchPermissionsRequestEntry (..),
+    newBatchPermissionsRequestEntry,
+    batchPermissionsRequestEntry_permissions,
+    batchPermissionsRequestEntry_permissionsWithGrantOption,
+    batchPermissionsRequestEntry_principal,
+    batchPermissionsRequestEntry_resource,
+    batchPermissionsRequestEntry_id,
+
+    -- * CatalogResource
+    CatalogResource (..),
+    newCatalogResource,
+
+    -- * ColumnLFTag
+    ColumnLFTag (..),
+    newColumnLFTag,
+    columnLFTag_lFTags,
+    columnLFTag_name,
+
+    -- * ColumnWildcard
+    ColumnWildcard (..),
+    newColumnWildcard,
+    columnWildcard_excludedColumnNames,
+
+    -- * DataCellsFilter
+    DataCellsFilter (..),
+    newDataCellsFilter,
+    dataCellsFilter_columnNames,
+    dataCellsFilter_columnWildcard,
+    dataCellsFilter_rowFilter,
+    dataCellsFilter_tableCatalogId,
+    dataCellsFilter_databaseName,
+    dataCellsFilter_tableName,
+    dataCellsFilter_name,
+
+    -- * DataCellsFilterResource
+    DataCellsFilterResource (..),
+    newDataCellsFilterResource,
+    dataCellsFilterResource_databaseName,
+    dataCellsFilterResource_name,
+    dataCellsFilterResource_tableCatalogId,
+    dataCellsFilterResource_tableName,
+
+    -- * DataLakePrincipal
+    DataLakePrincipal (..),
+    newDataLakePrincipal,
+    dataLakePrincipal_dataLakePrincipalIdentifier,
+
+    -- * DataLakeSettings
+    DataLakeSettings (..),
+    newDataLakeSettings,
+    dataLakeSettings_allowExternalDataFiltering,
+    dataLakeSettings_authorizedSessionTagValueList,
+    dataLakeSettings_createDatabaseDefaultPermissions,
+    dataLakeSettings_createTableDefaultPermissions,
+    dataLakeSettings_dataLakeAdmins,
+    dataLakeSettings_externalDataFilteringAllowList,
+    dataLakeSettings_parameters,
+    dataLakeSettings_trustedResourceOwners,
+
+    -- * DataLocationResource
+    DataLocationResource (..),
+    newDataLocationResource,
+    dataLocationResource_catalogId,
+    dataLocationResource_resourceArn,
+
+    -- * DatabaseResource
+    DatabaseResource (..),
+    newDatabaseResource,
+    databaseResource_catalogId,
+    databaseResource_name,
+
+    -- * DeleteObjectInput
+    DeleteObjectInput (..),
+    newDeleteObjectInput,
+    deleteObjectInput_eTag,
+    deleteObjectInput_partitionValues,
+    deleteObjectInput_uri,
+
+    -- * DetailsMap
+    DetailsMap (..),
+    newDetailsMap,
+    detailsMap_resourceShare,
+
+    -- * ErrorDetail
+    ErrorDetail (..),
+    newErrorDetail,
+    errorDetail_errorCode,
+    errorDetail_errorMessage,
+
+    -- * ExecutionStatistics
+    ExecutionStatistics (..),
+    newExecutionStatistics,
+    executionStatistics_averageExecutionTimeMillis,
+    executionStatistics_dataScannedBytes,
+    executionStatistics_workUnitsExecutedCount,
+
+    -- * FilterCondition
+    FilterCondition (..),
+    newFilterCondition,
+    filterCondition_comparisonOperator,
+    filterCondition_field,
+    filterCondition_stringValueList,
+
+    -- * LFTag
+    LFTag (..),
+    newLFTag,
+    lFTag_tagKey,
+    lFTag_tagValues,
+
+    -- * LFTagError
+    LFTagError (..),
+    newLFTagError,
+    lFTagError_error,
+    lFTagError_lFTag,
+
+    -- * LFTagKeyResource
+    LFTagKeyResource (..),
+    newLFTagKeyResource,
+    lFTagKeyResource_catalogId,
+    lFTagKeyResource_tagKey,
+    lFTagKeyResource_tagValues,
+
+    -- * LFTagPair
+    LFTagPair (..),
+    newLFTagPair,
+    lFTagPair_catalogId,
+    lFTagPair_tagKey,
+    lFTagPair_tagValues,
+
+    -- * LFTagPolicyResource
+    LFTagPolicyResource (..),
+    newLFTagPolicyResource,
+    lFTagPolicyResource_catalogId,
+    lFTagPolicyResource_resourceType,
+    lFTagPolicyResource_expression,
+
+    -- * PartitionObjects
+    PartitionObjects (..),
+    newPartitionObjects,
+    partitionObjects_objects,
+    partitionObjects_partitionValues,
+
+    -- * PartitionValueList
+    PartitionValueList (..),
+    newPartitionValueList,
+    partitionValueList_values,
+
+    -- * PlanningStatistics
+    PlanningStatistics (..),
+    newPlanningStatistics,
+    planningStatistics_estimatedDataToScanBytes,
+    planningStatistics_planningTimeMillis,
+    planningStatistics_queueTimeMillis,
+    planningStatistics_workUnitsGeneratedCount,
+
+    -- * PrincipalPermissions
+    PrincipalPermissions (..),
+    newPrincipalPermissions,
+    principalPermissions_permissions,
+    principalPermissions_principal,
+
+    -- * PrincipalResourcePermissions
+    PrincipalResourcePermissions (..),
+    newPrincipalResourcePermissions,
+    principalResourcePermissions_additionalDetails,
+    principalResourcePermissions_permissions,
+    principalResourcePermissions_permissionsWithGrantOption,
+    principalResourcePermissions_principal,
+    principalResourcePermissions_resource,
+
+    -- * QueryPlanningContext
+    QueryPlanningContext (..),
+    newQueryPlanningContext,
+    queryPlanningContext_catalogId,
+    queryPlanningContext_queryAsOfTime,
+    queryPlanningContext_queryParameters,
+    queryPlanningContext_transactionId,
+    queryPlanningContext_databaseName,
+
+    -- * Resource
+    Resource (..),
+    newResource,
+    resource_catalog,
+    resource_dataCellsFilter,
+    resource_dataLocation,
+    resource_database,
+    resource_lFTag,
+    resource_lFTagPolicy,
+    resource_table,
+    resource_tableWithColumns,
+
+    -- * ResourceInfo
+    ResourceInfo (..),
+    newResourceInfo,
+    resourceInfo_lastModified,
+    resourceInfo_resourceArn,
+    resourceInfo_roleArn,
+
+    -- * RowFilter
+    RowFilter (..),
+    newRowFilter,
+    rowFilter_allRowsWildcard,
+    rowFilter_filterExpression,
+
+    -- * StorageOptimizer
+    StorageOptimizer (..),
+    newStorageOptimizer,
+    storageOptimizer_config,
+    storageOptimizer_errorMessage,
+    storageOptimizer_lastRunDetails,
+    storageOptimizer_storageOptimizerType,
+    storageOptimizer_warnings,
+
+    -- * TableObject
+    TableObject (..),
+    newTableObject,
+    tableObject_eTag,
+    tableObject_size,
+    tableObject_uri,
+
+    -- * TableResource
+    TableResource (..),
+    newTableResource,
+    tableResource_catalogId,
+    tableResource_name,
+    tableResource_tableWildcard,
+    tableResource_databaseName,
+
+    -- * TableWildcard
+    TableWildcard (..),
+    newTableWildcard,
+
+    -- * TableWithColumnsResource
+    TableWithColumnsResource (..),
+    newTableWithColumnsResource,
+    tableWithColumnsResource_catalogId,
+    tableWithColumnsResource_columnNames,
+    tableWithColumnsResource_columnWildcard,
+    tableWithColumnsResource_databaseName,
+    tableWithColumnsResource_name,
+
+    -- * TaggedDatabase
+    TaggedDatabase (..),
+    newTaggedDatabase,
+    taggedDatabase_database,
+    taggedDatabase_lFTags,
+
+    -- * TaggedTable
+    TaggedTable (..),
+    newTaggedTable,
+    taggedTable_lFTagOnDatabase,
+    taggedTable_lFTagsOnColumns,
+    taggedTable_lFTagsOnTable,
+    taggedTable_table,
+
+    -- * TransactionDescription
+    TransactionDescription (..),
+    newTransactionDescription,
+    transactionDescription_transactionEndTime,
+    transactionDescription_transactionId,
+    transactionDescription_transactionStartTime,
+    transactionDescription_transactionStatus,
+
+    -- * VirtualObject
+    VirtualObject (..),
+    newVirtualObject,
+    virtualObject_eTag,
+    virtualObject_uri,
+
+    -- * WorkUnitRange
+    WorkUnitRange (..),
+    newWorkUnitRange,
+    workUnitRange_workUnitIdMax,
+    workUnitRange_workUnitIdMin,
+    workUnitRange_workUnitToken,
+
+    -- * WriteOperation
+    WriteOperation (..),
+    newWriteOperation,
+    writeOperation_addObject,
+    writeOperation_deleteObject,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.LakeFormation.Types.AddObjectInput
+import Amazonka.LakeFormation.Types.AllRowsWildcard
+import Amazonka.LakeFormation.Types.AuditContext
+import Amazonka.LakeFormation.Types.BatchPermissionsFailureEntry
+import Amazonka.LakeFormation.Types.BatchPermissionsRequestEntry
+import Amazonka.LakeFormation.Types.CatalogResource
+import Amazonka.LakeFormation.Types.ColumnLFTag
+import Amazonka.LakeFormation.Types.ColumnWildcard
+import Amazonka.LakeFormation.Types.ComparisonOperator
+import Amazonka.LakeFormation.Types.DataCellsFilter
+import Amazonka.LakeFormation.Types.DataCellsFilterResource
+import Amazonka.LakeFormation.Types.DataLakePrincipal
+import Amazonka.LakeFormation.Types.DataLakeResourceType
+import Amazonka.LakeFormation.Types.DataLakeSettings
+import Amazonka.LakeFormation.Types.DataLocationResource
+import Amazonka.LakeFormation.Types.DatabaseResource
+import Amazonka.LakeFormation.Types.DeleteObjectInput
+import Amazonka.LakeFormation.Types.DetailsMap
+import Amazonka.LakeFormation.Types.ErrorDetail
+import Amazonka.LakeFormation.Types.ExecutionStatistics
+import Amazonka.LakeFormation.Types.FieldNameString
+import Amazonka.LakeFormation.Types.FilterCondition
+import Amazonka.LakeFormation.Types.LFTag
+import Amazonka.LakeFormation.Types.LFTagError
+import Amazonka.LakeFormation.Types.LFTagKeyResource
+import Amazonka.LakeFormation.Types.LFTagPair
+import Amazonka.LakeFormation.Types.LFTagPolicyResource
+import Amazonka.LakeFormation.Types.OptimizerType
+import Amazonka.LakeFormation.Types.PartitionObjects
+import Amazonka.LakeFormation.Types.PartitionValueList
+import Amazonka.LakeFormation.Types.Permission
+import Amazonka.LakeFormation.Types.PermissionType
+import Amazonka.LakeFormation.Types.PlanningStatistics
+import Amazonka.LakeFormation.Types.PrincipalPermissions
+import Amazonka.LakeFormation.Types.PrincipalResourcePermissions
+import Amazonka.LakeFormation.Types.QueryPlanningContext
+import Amazonka.LakeFormation.Types.QueryStateString
+import Amazonka.LakeFormation.Types.Resource
+import Amazonka.LakeFormation.Types.ResourceInfo
+import Amazonka.LakeFormation.Types.ResourceShareType
+import Amazonka.LakeFormation.Types.ResourceType
+import Amazonka.LakeFormation.Types.RowFilter
+import Amazonka.LakeFormation.Types.StorageOptimizer
+import Amazonka.LakeFormation.Types.TableObject
+import Amazonka.LakeFormation.Types.TableResource
+import Amazonka.LakeFormation.Types.TableWildcard
+import Amazonka.LakeFormation.Types.TableWithColumnsResource
+import Amazonka.LakeFormation.Types.TaggedDatabase
+import Amazonka.LakeFormation.Types.TaggedTable
+import Amazonka.LakeFormation.Types.TransactionDescription
+import Amazonka.LakeFormation.Types.TransactionStatus
+import Amazonka.LakeFormation.Types.TransactionStatusFilter
+import Amazonka.LakeFormation.Types.TransactionType
+import Amazonka.LakeFormation.Types.VirtualObject
+import Amazonka.LakeFormation.Types.WorkUnitRange
+import Amazonka.LakeFormation.Types.WriteOperation
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2017-03-31@ of the Amazon Lake Formation SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "LakeFormation",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "lakeformation",
+      Core.signingName = "lakeformation",
+      Core.version = "2017-03-31",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "LakeFormation",
+      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
+
+-- | Access to a resource was denied.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | A resource to be created or added already exists.
+_AlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "AlreadyExistsException"
+
+-- | Two processes are trying to modify a resource simultaneously.
+_ConcurrentModificationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConcurrentModificationException =
+  Core._MatchServiceError
+    defaultService
+    "ConcurrentModificationException"
+
+-- | A specified entity does not exist
+_EntityNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_EntityNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "EntityNotFoundException"
+
+-- | Contains details about an error where the query request expired.
+_ExpiredException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ExpiredException =
+  Core._MatchServiceError
+    defaultService
+    "ExpiredException"
+    Prelude.. Core.hasStatus 410
+
+-- | An encryption operation failed.
+_GlueEncryptionException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_GlueEncryptionException =
+  Core._MatchServiceError
+    defaultService
+    "GlueEncryptionException"
+
+-- | An internal service error occurred.
+_InternalServiceException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServiceException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServiceException"
+    Prelude.. Core.hasStatus 500
+
+-- | The input provided was not valid.
+_InvalidInputException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidInputException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidInputException"
+    Prelude.. Core.hasStatus 400
+
+-- | The operation timed out.
+_OperationTimeoutException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_OperationTimeoutException =
+  Core._MatchServiceError
+    defaultService
+    "OperationTimeoutException"
+
+-- | The engine does not support filtering data based on the enforced
+-- permissions. For example, if you call the
+-- @GetTemporaryGlueTableCredentials@ operation with
+-- @SupportedPermissionType@ equal to @ColumnPermission@, but cell-level
+-- permissions exist on the table, this exception is thrown.
+_PermissionTypeMismatchException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_PermissionTypeMismatchException =
+  Core._MatchServiceError
+    defaultService
+    "PermissionTypeMismatchException"
+
+-- | Contains details about an error related to a resource which is not ready
+-- for a transaction.
+_ResourceNotReadyException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotReadyException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotReadyException"
+    Prelude.. Core.hasStatus 400
+
+-- | A resource numerical limit was exceeded.
+_ResourceNumberLimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNumberLimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNumberLimitExceededException"
+
+-- | Contains details about an error related to statistics not being ready.
+_StatisticsNotReadyYetException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_StatisticsNotReadyYetException =
+  Core._MatchServiceError
+    defaultService
+    "StatisticsNotReadyYetException"
+    Prelude.. Core.hasStatus 420
+
+-- | Contains details about an error where the query request was throttled.
+_ThrottledException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottledException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottledException"
+    Prelude.. Core.hasStatus 429
+
+-- | Contains details about an error related to a transaction that was
+-- cancelled.
+_TransactionCanceledException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TransactionCanceledException =
+  Core._MatchServiceError
+    defaultService
+    "TransactionCanceledException"
+    Prelude.. Core.hasStatus 400
+
+-- | Contains details about an error related to a transaction commit that was
+-- in progress.
+_TransactionCommitInProgressException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TransactionCommitInProgressException =
+  Core._MatchServiceError
+    defaultService
+    "TransactionCommitInProgressException"
+    Prelude.. Core.hasStatus 400
+
+-- | Contains details about an error where the specified transaction has
+-- already been committed and cannot be used for @UpdateTableObjects@.
+_TransactionCommittedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TransactionCommittedException =
+  Core._MatchServiceError
+    defaultService
+    "TransactionCommittedException"
+    Prelude.. Core.hasStatus 400
+
+-- | Contains details about an error related to work units not being ready.
+_WorkUnitsNotReadyYetException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_WorkUnitsNotReadyYetException =
+  Core._MatchServiceError
+    defaultService
+    "WorkUnitsNotReadyYetException"
+    Prelude.. Core.hasStatus 420
diff --git a/gen/Amazonka/LakeFormation/Types/AddObjectInput.hs b/gen/Amazonka/LakeFormation/Types/AddObjectInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/AddObjectInput.hs
@@ -0,0 +1,132 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.AddObjectInput
+-- 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.LakeFormation.Types.AddObjectInput 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 new object to add to the governed table.
+--
+-- /See:/ 'newAddObjectInput' smart constructor.
+data AddObjectInput = AddObjectInput'
+  { -- | A list of partition values for the object. A value must be specified for
+    -- each partition key associated with the table.
+    --
+    -- The supported data types are integer, long, date(yyyy-MM-dd),
+    -- timestamp(yyyy-MM-dd HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss\"), string and
+    -- decimal.
+    partitionValues :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The Amazon S3 location of the object.
+    uri :: Prelude.Text,
+    -- | The Amazon S3 ETag of the object. Returned by @GetTableObjects@ for
+    -- validation and used to identify changes to the underlying data.
+    eTag :: Prelude.Text,
+    -- | The size of the Amazon S3 object in bytes.
+    size :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AddObjectInput' 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:
+--
+-- 'partitionValues', 'addObjectInput_partitionValues' - A list of partition values for the object. A value must be specified for
+-- each partition key associated with the table.
+--
+-- The supported data types are integer, long, date(yyyy-MM-dd),
+-- timestamp(yyyy-MM-dd HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss\"), string and
+-- decimal.
+--
+-- 'uri', 'addObjectInput_uri' - The Amazon S3 location of the object.
+--
+-- 'eTag', 'addObjectInput_eTag' - The Amazon S3 ETag of the object. Returned by @GetTableObjects@ for
+-- validation and used to identify changes to the underlying data.
+--
+-- 'size', 'addObjectInput_size' - The size of the Amazon S3 object in bytes.
+newAddObjectInput ::
+  -- | 'uri'
+  Prelude.Text ->
+  -- | 'eTag'
+  Prelude.Text ->
+  -- | 'size'
+  Prelude.Integer ->
+  AddObjectInput
+newAddObjectInput pUri_ pETag_ pSize_ =
+  AddObjectInput'
+    { partitionValues = Prelude.Nothing,
+      uri = pUri_,
+      eTag = pETag_,
+      size = pSize_
+    }
+
+-- | A list of partition values for the object. A value must be specified for
+-- each partition key associated with the table.
+--
+-- The supported data types are integer, long, date(yyyy-MM-dd),
+-- timestamp(yyyy-MM-dd HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss\"), string and
+-- decimal.
+addObjectInput_partitionValues :: Lens.Lens' AddObjectInput (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+addObjectInput_partitionValues = Lens.lens (\AddObjectInput' {partitionValues} -> partitionValues) (\s@AddObjectInput' {} a -> s {partitionValues = a} :: AddObjectInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon S3 location of the object.
+addObjectInput_uri :: Lens.Lens' AddObjectInput Prelude.Text
+addObjectInput_uri = Lens.lens (\AddObjectInput' {uri} -> uri) (\s@AddObjectInput' {} a -> s {uri = a} :: AddObjectInput)
+
+-- | The Amazon S3 ETag of the object. Returned by @GetTableObjects@ for
+-- validation and used to identify changes to the underlying data.
+addObjectInput_eTag :: Lens.Lens' AddObjectInput Prelude.Text
+addObjectInput_eTag = Lens.lens (\AddObjectInput' {eTag} -> eTag) (\s@AddObjectInput' {} a -> s {eTag = a} :: AddObjectInput)
+
+-- | The size of the Amazon S3 object in bytes.
+addObjectInput_size :: Lens.Lens' AddObjectInput Prelude.Integer
+addObjectInput_size = Lens.lens (\AddObjectInput' {size} -> size) (\s@AddObjectInput' {} a -> s {size = a} :: AddObjectInput)
+
+instance Prelude.Hashable AddObjectInput where
+  hashWithSalt _salt AddObjectInput' {..} =
+    _salt
+      `Prelude.hashWithSalt` partitionValues
+      `Prelude.hashWithSalt` uri
+      `Prelude.hashWithSalt` eTag
+      `Prelude.hashWithSalt` size
+
+instance Prelude.NFData AddObjectInput where
+  rnf AddObjectInput' {..} =
+    Prelude.rnf partitionValues
+      `Prelude.seq` Prelude.rnf uri
+      `Prelude.seq` Prelude.rnf eTag
+      `Prelude.seq` Prelude.rnf size
+
+instance Data.ToJSON AddObjectInput where
+  toJSON AddObjectInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("PartitionValues" Data..=)
+              Prelude.<$> partitionValues,
+            Prelude.Just ("Uri" Data..= uri),
+            Prelude.Just ("ETag" Data..= eTag),
+            Prelude.Just ("Size" Data..= size)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/AllRowsWildcard.hs b/gen/Amazonka/LakeFormation/Types/AllRowsWildcard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/AllRowsWildcard.hs
@@ -0,0 +1,57 @@
+{-# 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.LakeFormation.Types.AllRowsWildcard
+-- 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.LakeFormation.Types.AllRowsWildcard 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 structure that you pass to indicate you want all rows in a filter.
+--
+-- /See:/ 'newAllRowsWildcard' smart constructor.
+data AllRowsWildcard = AllRowsWildcard'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AllRowsWildcard' 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.
+newAllRowsWildcard ::
+  AllRowsWildcard
+newAllRowsWildcard = AllRowsWildcard'
+
+instance Data.FromJSON AllRowsWildcard where
+  parseJSON =
+    Data.withObject
+      "AllRowsWildcard"
+      (\x -> Prelude.pure AllRowsWildcard')
+
+instance Prelude.Hashable AllRowsWildcard where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData AllRowsWildcard where
+  rnf _ = ()
+
+instance Data.ToJSON AllRowsWildcard where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
diff --git a/gen/Amazonka/LakeFormation/Types/AuditContext.hs b/gen/Amazonka/LakeFormation/Types/AuditContext.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/AuditContext.hs
@@ -0,0 +1,78 @@
+{-# 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.LakeFormation.Types.AuditContext
+-- 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.LakeFormation.Types.AuditContext 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 structure used to include auditing information on the privileged API.
+--
+-- /See:/ 'newAuditContext' smart constructor.
+data AuditContext = AuditContext'
+  { -- | The filter engine can populate the \'AdditionalAuditContext\'
+    -- information with the request ID for you to track. This information will
+    -- be displayed in CloudTrail log in your account.
+    additionalAuditContext :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AuditContext' 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:
+--
+-- 'additionalAuditContext', 'auditContext_additionalAuditContext' - The filter engine can populate the \'AdditionalAuditContext\'
+-- information with the request ID for you to track. This information will
+-- be displayed in CloudTrail log in your account.
+newAuditContext ::
+  AuditContext
+newAuditContext =
+  AuditContext'
+    { additionalAuditContext =
+        Prelude.Nothing
+    }
+
+-- | The filter engine can populate the \'AdditionalAuditContext\'
+-- information with the request ID for you to track. This information will
+-- be displayed in CloudTrail log in your account.
+auditContext_additionalAuditContext :: Lens.Lens' AuditContext (Prelude.Maybe Prelude.Text)
+auditContext_additionalAuditContext = Lens.lens (\AuditContext' {additionalAuditContext} -> additionalAuditContext) (\s@AuditContext' {} a -> s {additionalAuditContext = a} :: AuditContext)
+
+instance Prelude.Hashable AuditContext where
+  hashWithSalt _salt AuditContext' {..} =
+    _salt `Prelude.hashWithSalt` additionalAuditContext
+
+instance Prelude.NFData AuditContext where
+  rnf AuditContext' {..} =
+    Prelude.rnf additionalAuditContext
+
+instance Data.ToJSON AuditContext where
+  toJSON AuditContext' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AdditionalAuditContext" Data..=)
+              Prelude.<$> additionalAuditContext
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/BatchPermissionsFailureEntry.hs b/gen/Amazonka/LakeFormation/Types/BatchPermissionsFailureEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/BatchPermissionsFailureEntry.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.BatchPermissionsFailureEntry
+-- 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.LakeFormation.Types.BatchPermissionsFailureEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.BatchPermissionsRequestEntry
+import Amazonka.LakeFormation.Types.ErrorDetail
+import qualified Amazonka.Prelude as Prelude
+
+-- | A list of failures when performing a batch grant or batch revoke
+-- operation.
+--
+-- /See:/ 'newBatchPermissionsFailureEntry' smart constructor.
+data BatchPermissionsFailureEntry = BatchPermissionsFailureEntry'
+  { -- | An error message that applies to the failure of the entry.
+    error :: Prelude.Maybe ErrorDetail,
+    -- | An identifier for an entry of the batch request.
+    requestEntry :: Prelude.Maybe BatchPermissionsRequestEntry
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchPermissionsFailureEntry' 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:
+--
+-- 'error', 'batchPermissionsFailureEntry_error' - An error message that applies to the failure of the entry.
+--
+-- 'requestEntry', 'batchPermissionsFailureEntry_requestEntry' - An identifier for an entry of the batch request.
+newBatchPermissionsFailureEntry ::
+  BatchPermissionsFailureEntry
+newBatchPermissionsFailureEntry =
+  BatchPermissionsFailureEntry'
+    { error =
+        Prelude.Nothing,
+      requestEntry = Prelude.Nothing
+    }
+
+-- | An error message that applies to the failure of the entry.
+batchPermissionsFailureEntry_error :: Lens.Lens' BatchPermissionsFailureEntry (Prelude.Maybe ErrorDetail)
+batchPermissionsFailureEntry_error = Lens.lens (\BatchPermissionsFailureEntry' {error} -> error) (\s@BatchPermissionsFailureEntry' {} a -> s {error = a} :: BatchPermissionsFailureEntry)
+
+-- | An identifier for an entry of the batch request.
+batchPermissionsFailureEntry_requestEntry :: Lens.Lens' BatchPermissionsFailureEntry (Prelude.Maybe BatchPermissionsRequestEntry)
+batchPermissionsFailureEntry_requestEntry = Lens.lens (\BatchPermissionsFailureEntry' {requestEntry} -> requestEntry) (\s@BatchPermissionsFailureEntry' {} a -> s {requestEntry = a} :: BatchPermissionsFailureEntry)
+
+instance Data.FromJSON BatchPermissionsFailureEntry where
+  parseJSON =
+    Data.withObject
+      "BatchPermissionsFailureEntry"
+      ( \x ->
+          BatchPermissionsFailureEntry'
+            Prelude.<$> (x Data..:? "Error")
+            Prelude.<*> (x Data..:? "RequestEntry")
+      )
+
+instance
+  Prelude.Hashable
+    BatchPermissionsFailureEntry
+  where
+  hashWithSalt _salt BatchPermissionsFailureEntry' {..} =
+    _salt
+      `Prelude.hashWithSalt` error
+      `Prelude.hashWithSalt` requestEntry
+
+instance Prelude.NFData BatchPermissionsFailureEntry where
+  rnf BatchPermissionsFailureEntry' {..} =
+    Prelude.rnf error
+      `Prelude.seq` Prelude.rnf requestEntry
diff --git a/gen/Amazonka/LakeFormation/Types/BatchPermissionsRequestEntry.hs b/gen/Amazonka/LakeFormation/Types/BatchPermissionsRequestEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/BatchPermissionsRequestEntry.hs
@@ -0,0 +1,145 @@
+{-# 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.LakeFormation.Types.BatchPermissionsRequestEntry
+-- 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.LakeFormation.Types.BatchPermissionsRequestEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.DataLakePrincipal
+import Amazonka.LakeFormation.Types.Permission
+import Amazonka.LakeFormation.Types.Resource
+import qualified Amazonka.Prelude as Prelude
+
+-- | A permission to a resource granted by batch operation to the principal.
+--
+-- /See:/ 'newBatchPermissionsRequestEntry' smart constructor.
+data BatchPermissionsRequestEntry = BatchPermissionsRequestEntry'
+  { -- | The permissions to be granted.
+    permissions :: Prelude.Maybe [Permission],
+    -- | Indicates if the option to pass permissions is granted.
+    permissionsWithGrantOption :: Prelude.Maybe [Permission],
+    -- | The principal to be granted a permission.
+    principal :: Prelude.Maybe DataLakePrincipal,
+    -- | The resource to which the principal is to be granted a permission.
+    resource :: Prelude.Maybe Resource,
+    -- | A unique identifier for the batch permissions request entry.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchPermissionsRequestEntry' 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:
+--
+-- 'permissions', 'batchPermissionsRequestEntry_permissions' - The permissions to be granted.
+--
+-- 'permissionsWithGrantOption', 'batchPermissionsRequestEntry_permissionsWithGrantOption' - Indicates if the option to pass permissions is granted.
+--
+-- 'principal', 'batchPermissionsRequestEntry_principal' - The principal to be granted a permission.
+--
+-- 'resource', 'batchPermissionsRequestEntry_resource' - The resource to which the principal is to be granted a permission.
+--
+-- 'id', 'batchPermissionsRequestEntry_id' - A unique identifier for the batch permissions request entry.
+newBatchPermissionsRequestEntry ::
+  -- | 'id'
+  Prelude.Text ->
+  BatchPermissionsRequestEntry
+newBatchPermissionsRequestEntry pId_ =
+  BatchPermissionsRequestEntry'
+    { permissions =
+        Prelude.Nothing,
+      permissionsWithGrantOption = Prelude.Nothing,
+      principal = Prelude.Nothing,
+      resource = Prelude.Nothing,
+      id = pId_
+    }
+
+-- | The permissions to be granted.
+batchPermissionsRequestEntry_permissions :: Lens.Lens' BatchPermissionsRequestEntry (Prelude.Maybe [Permission])
+batchPermissionsRequestEntry_permissions = Lens.lens (\BatchPermissionsRequestEntry' {permissions} -> permissions) (\s@BatchPermissionsRequestEntry' {} a -> s {permissions = a} :: BatchPermissionsRequestEntry) Prelude.. Lens.mapping Lens.coerced
+
+-- | Indicates if the option to pass permissions is granted.
+batchPermissionsRequestEntry_permissionsWithGrantOption :: Lens.Lens' BatchPermissionsRequestEntry (Prelude.Maybe [Permission])
+batchPermissionsRequestEntry_permissionsWithGrantOption = Lens.lens (\BatchPermissionsRequestEntry' {permissionsWithGrantOption} -> permissionsWithGrantOption) (\s@BatchPermissionsRequestEntry' {} a -> s {permissionsWithGrantOption = a} :: BatchPermissionsRequestEntry) Prelude.. Lens.mapping Lens.coerced
+
+-- | The principal to be granted a permission.
+batchPermissionsRequestEntry_principal :: Lens.Lens' BatchPermissionsRequestEntry (Prelude.Maybe DataLakePrincipal)
+batchPermissionsRequestEntry_principal = Lens.lens (\BatchPermissionsRequestEntry' {principal} -> principal) (\s@BatchPermissionsRequestEntry' {} a -> s {principal = a} :: BatchPermissionsRequestEntry)
+
+-- | The resource to which the principal is to be granted a permission.
+batchPermissionsRequestEntry_resource :: Lens.Lens' BatchPermissionsRequestEntry (Prelude.Maybe Resource)
+batchPermissionsRequestEntry_resource = Lens.lens (\BatchPermissionsRequestEntry' {resource} -> resource) (\s@BatchPermissionsRequestEntry' {} a -> s {resource = a} :: BatchPermissionsRequestEntry)
+
+-- | A unique identifier for the batch permissions request entry.
+batchPermissionsRequestEntry_id :: Lens.Lens' BatchPermissionsRequestEntry Prelude.Text
+batchPermissionsRequestEntry_id = Lens.lens (\BatchPermissionsRequestEntry' {id} -> id) (\s@BatchPermissionsRequestEntry' {} a -> s {id = a} :: BatchPermissionsRequestEntry)
+
+instance Data.FromJSON BatchPermissionsRequestEntry where
+  parseJSON =
+    Data.withObject
+      "BatchPermissionsRequestEntry"
+      ( \x ->
+          BatchPermissionsRequestEntry'
+            Prelude.<$> (x Data..:? "Permissions" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "PermissionsWithGrantOption"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "Principal")
+            Prelude.<*> (x Data..:? "Resource")
+            Prelude.<*> (x Data..: "Id")
+      )
+
+instance
+  Prelude.Hashable
+    BatchPermissionsRequestEntry
+  where
+  hashWithSalt _salt BatchPermissionsRequestEntry' {..} =
+    _salt
+      `Prelude.hashWithSalt` permissions
+      `Prelude.hashWithSalt` permissionsWithGrantOption
+      `Prelude.hashWithSalt` principal
+      `Prelude.hashWithSalt` resource
+      `Prelude.hashWithSalt` id
+
+instance Prelude.NFData BatchPermissionsRequestEntry where
+  rnf BatchPermissionsRequestEntry' {..} =
+    Prelude.rnf permissions
+      `Prelude.seq` Prelude.rnf permissionsWithGrantOption
+      `Prelude.seq` Prelude.rnf principal
+      `Prelude.seq` Prelude.rnf resource
+      `Prelude.seq` Prelude.rnf id
+
+instance Data.ToJSON BatchPermissionsRequestEntry where
+  toJSON BatchPermissionsRequestEntry' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Permissions" Data..=) Prelude.<$> permissions,
+            ("PermissionsWithGrantOption" Data..=)
+              Prelude.<$> permissionsWithGrantOption,
+            ("Principal" Data..=) Prelude.<$> principal,
+            ("Resource" Data..=) Prelude.<$> resource,
+            Prelude.Just ("Id" Data..= id)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/CatalogResource.hs b/gen/Amazonka/LakeFormation/Types/CatalogResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/CatalogResource.hs
@@ -0,0 +1,57 @@
+{-# 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.LakeFormation.Types.CatalogResource
+-- 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.LakeFormation.Types.CatalogResource 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 structure for the catalog object.
+--
+-- /See:/ 'newCatalogResource' smart constructor.
+data CatalogResource = CatalogResource'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CatalogResource' 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.
+newCatalogResource ::
+  CatalogResource
+newCatalogResource = CatalogResource'
+
+instance Data.FromJSON CatalogResource where
+  parseJSON =
+    Data.withObject
+      "CatalogResource"
+      (\x -> Prelude.pure CatalogResource')
+
+instance Prelude.Hashable CatalogResource where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData CatalogResource where
+  rnf _ = ()
+
+instance Data.ToJSON CatalogResource where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
diff --git a/gen/Amazonka/LakeFormation/Types/ColumnLFTag.hs b/gen/Amazonka/LakeFormation/Types/ColumnLFTag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/ColumnLFTag.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.ColumnLFTag
+-- 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.LakeFormation.Types.ColumnLFTag where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.LFTagPair
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure containing the name of a column resource and the LF-tags
+-- attached to it.
+--
+-- /See:/ 'newColumnLFTag' smart constructor.
+data ColumnLFTag = ColumnLFTag'
+  { -- | The LF-tags attached to a column resource.
+    lFTags :: Prelude.Maybe (Prelude.NonEmpty LFTagPair),
+    -- | The name of a column resource.
+    name :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ColumnLFTag' 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:
+--
+-- 'lFTags', 'columnLFTag_lFTags' - The LF-tags attached to a column resource.
+--
+-- 'name', 'columnLFTag_name' - The name of a column resource.
+newColumnLFTag ::
+  ColumnLFTag
+newColumnLFTag =
+  ColumnLFTag'
+    { lFTags = Prelude.Nothing,
+      name = Prelude.Nothing
+    }
+
+-- | The LF-tags attached to a column resource.
+columnLFTag_lFTags :: Lens.Lens' ColumnLFTag (Prelude.Maybe (Prelude.NonEmpty LFTagPair))
+columnLFTag_lFTags = Lens.lens (\ColumnLFTag' {lFTags} -> lFTags) (\s@ColumnLFTag' {} a -> s {lFTags = a} :: ColumnLFTag) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of a column resource.
+columnLFTag_name :: Lens.Lens' ColumnLFTag (Prelude.Maybe Prelude.Text)
+columnLFTag_name = Lens.lens (\ColumnLFTag' {name} -> name) (\s@ColumnLFTag' {} a -> s {name = a} :: ColumnLFTag)
+
+instance Data.FromJSON ColumnLFTag where
+  parseJSON =
+    Data.withObject
+      "ColumnLFTag"
+      ( \x ->
+          ColumnLFTag'
+            Prelude.<$> (x Data..:? "LFTags")
+            Prelude.<*> (x Data..:? "Name")
+      )
+
+instance Prelude.Hashable ColumnLFTag where
+  hashWithSalt _salt ColumnLFTag' {..} =
+    _salt
+      `Prelude.hashWithSalt` lFTags
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData ColumnLFTag where
+  rnf ColumnLFTag' {..} =
+    Prelude.rnf lFTags `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/LakeFormation/Types/ColumnWildcard.hs b/gen/Amazonka/LakeFormation/Types/ColumnWildcard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/ColumnWildcard.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.ColumnWildcard
+-- 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.LakeFormation.Types.ColumnWildcard 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 wildcard object, consisting of an optional list of excluded column
+-- names or indexes.
+--
+-- /See:/ 'newColumnWildcard' smart constructor.
+data ColumnWildcard = ColumnWildcard'
+  { -- | Excludes column names. Any column with this name will be excluded.
+    excludedColumnNames :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ColumnWildcard' 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:
+--
+-- 'excludedColumnNames', 'columnWildcard_excludedColumnNames' - Excludes column names. Any column with this name will be excluded.
+newColumnWildcard ::
+  ColumnWildcard
+newColumnWildcard =
+  ColumnWildcard'
+    { excludedColumnNames =
+        Prelude.Nothing
+    }
+
+-- | Excludes column names. Any column with this name will be excluded.
+columnWildcard_excludedColumnNames :: Lens.Lens' ColumnWildcard (Prelude.Maybe [Prelude.Text])
+columnWildcard_excludedColumnNames = Lens.lens (\ColumnWildcard' {excludedColumnNames} -> excludedColumnNames) (\s@ColumnWildcard' {} a -> s {excludedColumnNames = a} :: ColumnWildcard) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ColumnWildcard where
+  parseJSON =
+    Data.withObject
+      "ColumnWildcard"
+      ( \x ->
+          ColumnWildcard'
+            Prelude.<$> ( x
+                            Data..:? "ExcludedColumnNames"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ColumnWildcard where
+  hashWithSalt _salt ColumnWildcard' {..} =
+    _salt `Prelude.hashWithSalt` excludedColumnNames
+
+instance Prelude.NFData ColumnWildcard where
+  rnf ColumnWildcard' {..} =
+    Prelude.rnf excludedColumnNames
+
+instance Data.ToJSON ColumnWildcard where
+  toJSON ColumnWildcard' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ExcludedColumnNames" Data..=)
+              Prelude.<$> excludedColumnNames
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/ComparisonOperator.hs b/gen/Amazonka/LakeFormation/Types/ComparisonOperator.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/ComparisonOperator.hs
@@ -0,0 +1,116 @@
+{-# 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.LakeFormation.Types.ComparisonOperator
+-- 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.LakeFormation.Types.ComparisonOperator
+  ( ComparisonOperator
+      ( ..,
+        ComparisonOperator_BEGINS_WITH,
+        ComparisonOperator_BETWEEN,
+        ComparisonOperator_CONTAINS,
+        ComparisonOperator_EQ,
+        ComparisonOperator_GE,
+        ComparisonOperator_GT,
+        ComparisonOperator_IN,
+        ComparisonOperator_LE,
+        ComparisonOperator_LT,
+        ComparisonOperator_NE,
+        ComparisonOperator_NOT_CONTAINS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ComparisonOperator = ComparisonOperator'
+  { fromComparisonOperator ::
+      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 ComparisonOperator_BEGINS_WITH :: ComparisonOperator
+pattern ComparisonOperator_BEGINS_WITH = ComparisonOperator' "BEGINS_WITH"
+
+pattern ComparisonOperator_BETWEEN :: ComparisonOperator
+pattern ComparisonOperator_BETWEEN = ComparisonOperator' "BETWEEN"
+
+pattern ComparisonOperator_CONTAINS :: ComparisonOperator
+pattern ComparisonOperator_CONTAINS = ComparisonOperator' "CONTAINS"
+
+pattern ComparisonOperator_EQ :: ComparisonOperator
+pattern ComparisonOperator_EQ = ComparisonOperator' "EQ"
+
+pattern ComparisonOperator_GE :: ComparisonOperator
+pattern ComparisonOperator_GE = ComparisonOperator' "GE"
+
+pattern ComparisonOperator_GT :: ComparisonOperator
+pattern ComparisonOperator_GT = ComparisonOperator' "GT"
+
+pattern ComparisonOperator_IN :: ComparisonOperator
+pattern ComparisonOperator_IN = ComparisonOperator' "IN"
+
+pattern ComparisonOperator_LE :: ComparisonOperator
+pattern ComparisonOperator_LE = ComparisonOperator' "LE"
+
+pattern ComparisonOperator_LT :: ComparisonOperator
+pattern ComparisonOperator_LT = ComparisonOperator' "LT"
+
+pattern ComparisonOperator_NE :: ComparisonOperator
+pattern ComparisonOperator_NE = ComparisonOperator' "NE"
+
+pattern ComparisonOperator_NOT_CONTAINS :: ComparisonOperator
+pattern ComparisonOperator_NOT_CONTAINS = ComparisonOperator' "NOT_CONTAINS"
+
+{-# COMPLETE
+  ComparisonOperator_BEGINS_WITH,
+  ComparisonOperator_BETWEEN,
+  ComparisonOperator_CONTAINS,
+  ComparisonOperator_EQ,
+  ComparisonOperator_GE,
+  ComparisonOperator_GT,
+  ComparisonOperator_IN,
+  ComparisonOperator_LE,
+  ComparisonOperator_LT,
+  ComparisonOperator_NE,
+  ComparisonOperator_NOT_CONTAINS,
+  ComparisonOperator'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/DataCellsFilter.hs b/gen/Amazonka/LakeFormation/Types/DataCellsFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/DataCellsFilter.hs
@@ -0,0 +1,180 @@
+{-# 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.LakeFormation.Types.DataCellsFilter
+-- 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.LakeFormation.Types.DataCellsFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.ColumnWildcard
+import Amazonka.LakeFormation.Types.RowFilter
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure that describes certain columns on certain rows.
+--
+-- /See:/ 'newDataCellsFilter' smart constructor.
+data DataCellsFilter = DataCellsFilter'
+  { -- | A list of column names.
+    columnNames :: Prelude.Maybe [Prelude.Text],
+    -- | A wildcard with exclusions.
+    --
+    -- You must specify either a @ColumnNames@ list or the @ColumnWildCard@.
+    columnWildcard :: Prelude.Maybe ColumnWildcard,
+    -- | A PartiQL predicate.
+    rowFilter :: Prelude.Maybe RowFilter,
+    -- | The ID of the catalog to which the table belongs.
+    tableCatalogId :: Prelude.Text,
+    -- | A database in the Glue Data Catalog.
+    databaseName :: Prelude.Text,
+    -- | A table in the database.
+    tableName :: Prelude.Text,
+    -- | The name given by the user to the data filter cell.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataCellsFilter' 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:
+--
+-- 'columnNames', 'dataCellsFilter_columnNames' - A list of column names.
+--
+-- 'columnWildcard', 'dataCellsFilter_columnWildcard' - A wildcard with exclusions.
+--
+-- You must specify either a @ColumnNames@ list or the @ColumnWildCard@.
+--
+-- 'rowFilter', 'dataCellsFilter_rowFilter' - A PartiQL predicate.
+--
+-- 'tableCatalogId', 'dataCellsFilter_tableCatalogId' - The ID of the catalog to which the table belongs.
+--
+-- 'databaseName', 'dataCellsFilter_databaseName' - A database in the Glue Data Catalog.
+--
+-- 'tableName', 'dataCellsFilter_tableName' - A table in the database.
+--
+-- 'name', 'dataCellsFilter_name' - The name given by the user to the data filter cell.
+newDataCellsFilter ::
+  -- | 'tableCatalogId'
+  Prelude.Text ->
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  DataCellsFilter
+newDataCellsFilter
+  pTableCatalogId_
+  pDatabaseName_
+  pTableName_
+  pName_ =
+    DataCellsFilter'
+      { columnNames = Prelude.Nothing,
+        columnWildcard = Prelude.Nothing,
+        rowFilter = Prelude.Nothing,
+        tableCatalogId = pTableCatalogId_,
+        databaseName = pDatabaseName_,
+        tableName = pTableName_,
+        name = pName_
+      }
+
+-- | A list of column names.
+dataCellsFilter_columnNames :: Lens.Lens' DataCellsFilter (Prelude.Maybe [Prelude.Text])
+dataCellsFilter_columnNames = Lens.lens (\DataCellsFilter' {columnNames} -> columnNames) (\s@DataCellsFilter' {} a -> s {columnNames = a} :: DataCellsFilter) Prelude.. Lens.mapping Lens.coerced
+
+-- | A wildcard with exclusions.
+--
+-- You must specify either a @ColumnNames@ list or the @ColumnWildCard@.
+dataCellsFilter_columnWildcard :: Lens.Lens' DataCellsFilter (Prelude.Maybe ColumnWildcard)
+dataCellsFilter_columnWildcard = Lens.lens (\DataCellsFilter' {columnWildcard} -> columnWildcard) (\s@DataCellsFilter' {} a -> s {columnWildcard = a} :: DataCellsFilter)
+
+-- | A PartiQL predicate.
+dataCellsFilter_rowFilter :: Lens.Lens' DataCellsFilter (Prelude.Maybe RowFilter)
+dataCellsFilter_rowFilter = Lens.lens (\DataCellsFilter' {rowFilter} -> rowFilter) (\s@DataCellsFilter' {} a -> s {rowFilter = a} :: DataCellsFilter)
+
+-- | The ID of the catalog to which the table belongs.
+dataCellsFilter_tableCatalogId :: Lens.Lens' DataCellsFilter Prelude.Text
+dataCellsFilter_tableCatalogId = Lens.lens (\DataCellsFilter' {tableCatalogId} -> tableCatalogId) (\s@DataCellsFilter' {} a -> s {tableCatalogId = a} :: DataCellsFilter)
+
+-- | A database in the Glue Data Catalog.
+dataCellsFilter_databaseName :: Lens.Lens' DataCellsFilter Prelude.Text
+dataCellsFilter_databaseName = Lens.lens (\DataCellsFilter' {databaseName} -> databaseName) (\s@DataCellsFilter' {} a -> s {databaseName = a} :: DataCellsFilter)
+
+-- | A table in the database.
+dataCellsFilter_tableName :: Lens.Lens' DataCellsFilter Prelude.Text
+dataCellsFilter_tableName = Lens.lens (\DataCellsFilter' {tableName} -> tableName) (\s@DataCellsFilter' {} a -> s {tableName = a} :: DataCellsFilter)
+
+-- | The name given by the user to the data filter cell.
+dataCellsFilter_name :: Lens.Lens' DataCellsFilter Prelude.Text
+dataCellsFilter_name = Lens.lens (\DataCellsFilter' {name} -> name) (\s@DataCellsFilter' {} a -> s {name = a} :: DataCellsFilter)
+
+instance Data.FromJSON DataCellsFilter where
+  parseJSON =
+    Data.withObject
+      "DataCellsFilter"
+      ( \x ->
+          DataCellsFilter'
+            Prelude.<$> (x Data..:? "ColumnNames" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "ColumnWildcard")
+            Prelude.<*> (x Data..:? "RowFilter")
+            Prelude.<*> (x Data..: "TableCatalogId")
+            Prelude.<*> (x Data..: "DatabaseName")
+            Prelude.<*> (x Data..: "TableName")
+            Prelude.<*> (x Data..: "Name")
+      )
+
+instance Prelude.Hashable DataCellsFilter where
+  hashWithSalt _salt DataCellsFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` columnNames
+      `Prelude.hashWithSalt` columnWildcard
+      `Prelude.hashWithSalt` rowFilter
+      `Prelude.hashWithSalt` tableCatalogId
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData DataCellsFilter where
+  rnf DataCellsFilter' {..} =
+    Prelude.rnf columnNames
+      `Prelude.seq` Prelude.rnf columnWildcard
+      `Prelude.seq` Prelude.rnf rowFilter
+      `Prelude.seq` Prelude.rnf tableCatalogId
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON DataCellsFilter where
+  toJSON DataCellsFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ColumnNames" Data..=) Prelude.<$> columnNames,
+            ("ColumnWildcard" Data..=)
+              Prelude.<$> columnWildcard,
+            ("RowFilter" Data..=) Prelude.<$> rowFilter,
+            Prelude.Just
+              ("TableCatalogId" Data..= tableCatalogId),
+            Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("TableName" Data..= tableName),
+            Prelude.Just ("Name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/DataCellsFilterResource.hs b/gen/Amazonka/LakeFormation/Types/DataCellsFilterResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/DataCellsFilterResource.hs
@@ -0,0 +1,121 @@
+{-# 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.LakeFormation.Types.DataCellsFilterResource
+-- 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.LakeFormation.Types.DataCellsFilterResource 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 structure for a data cells filter resource.
+--
+-- /See:/ 'newDataCellsFilterResource' smart constructor.
+data DataCellsFilterResource = DataCellsFilterResource'
+  { -- | A database in the Glue Data Catalog.
+    databaseName :: Prelude.Maybe Prelude.Text,
+    -- | The name of the data cells filter.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the catalog to which the table belongs.
+    tableCatalogId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the table.
+    tableName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataCellsFilterResource' 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', 'dataCellsFilterResource_databaseName' - A database in the Glue Data Catalog.
+--
+-- 'name', 'dataCellsFilterResource_name' - The name of the data cells filter.
+--
+-- 'tableCatalogId', 'dataCellsFilterResource_tableCatalogId' - The ID of the catalog to which the table belongs.
+--
+-- 'tableName', 'dataCellsFilterResource_tableName' - The name of the table.
+newDataCellsFilterResource ::
+  DataCellsFilterResource
+newDataCellsFilterResource =
+  DataCellsFilterResource'
+    { databaseName =
+        Prelude.Nothing,
+      name = Prelude.Nothing,
+      tableCatalogId = Prelude.Nothing,
+      tableName = Prelude.Nothing
+    }
+
+-- | A database in the Glue Data Catalog.
+dataCellsFilterResource_databaseName :: Lens.Lens' DataCellsFilterResource (Prelude.Maybe Prelude.Text)
+dataCellsFilterResource_databaseName = Lens.lens (\DataCellsFilterResource' {databaseName} -> databaseName) (\s@DataCellsFilterResource' {} a -> s {databaseName = a} :: DataCellsFilterResource)
+
+-- | The name of the data cells filter.
+dataCellsFilterResource_name :: Lens.Lens' DataCellsFilterResource (Prelude.Maybe Prelude.Text)
+dataCellsFilterResource_name = Lens.lens (\DataCellsFilterResource' {name} -> name) (\s@DataCellsFilterResource' {} a -> s {name = a} :: DataCellsFilterResource)
+
+-- | The ID of the catalog to which the table belongs.
+dataCellsFilterResource_tableCatalogId :: Lens.Lens' DataCellsFilterResource (Prelude.Maybe Prelude.Text)
+dataCellsFilterResource_tableCatalogId = Lens.lens (\DataCellsFilterResource' {tableCatalogId} -> tableCatalogId) (\s@DataCellsFilterResource' {} a -> s {tableCatalogId = a} :: DataCellsFilterResource)
+
+-- | The name of the table.
+dataCellsFilterResource_tableName :: Lens.Lens' DataCellsFilterResource (Prelude.Maybe Prelude.Text)
+dataCellsFilterResource_tableName = Lens.lens (\DataCellsFilterResource' {tableName} -> tableName) (\s@DataCellsFilterResource' {} a -> s {tableName = a} :: DataCellsFilterResource)
+
+instance Data.FromJSON DataCellsFilterResource where
+  parseJSON =
+    Data.withObject
+      "DataCellsFilterResource"
+      ( \x ->
+          DataCellsFilterResource'
+            Prelude.<$> (x Data..:? "DatabaseName")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "TableCatalogId")
+            Prelude.<*> (x Data..:? "TableName")
+      )
+
+instance Prelude.Hashable DataCellsFilterResource where
+  hashWithSalt _salt DataCellsFilterResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` tableCatalogId
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData DataCellsFilterResource where
+  rnf DataCellsFilterResource' {..} =
+    Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf tableCatalogId
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToJSON DataCellsFilterResource where
+  toJSON DataCellsFilterResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DatabaseName" Data..=) Prelude.<$> databaseName,
+            ("Name" Data..=) Prelude.<$> name,
+            ("TableCatalogId" Data..=)
+              Prelude.<$> tableCatalogId,
+            ("TableName" Data..=) Prelude.<$> tableName
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/DataLakePrincipal.hs b/gen/Amazonka/LakeFormation/Types/DataLakePrincipal.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/DataLakePrincipal.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.DataLakePrincipal
+-- 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.LakeFormation.Types.DataLakePrincipal where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The Lake Formation principal. Supported principals are IAM users or IAM
+-- roles.
+--
+-- /See:/ 'newDataLakePrincipal' smart constructor.
+data DataLakePrincipal = DataLakePrincipal'
+  { -- | An identifier for the Lake Formation principal.
+    dataLakePrincipalIdentifier :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataLakePrincipal' 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:
+--
+-- 'dataLakePrincipalIdentifier', 'dataLakePrincipal_dataLakePrincipalIdentifier' - An identifier for the Lake Formation principal.
+newDataLakePrincipal ::
+  DataLakePrincipal
+newDataLakePrincipal =
+  DataLakePrincipal'
+    { dataLakePrincipalIdentifier =
+        Prelude.Nothing
+    }
+
+-- | An identifier for the Lake Formation principal.
+dataLakePrincipal_dataLakePrincipalIdentifier :: Lens.Lens' DataLakePrincipal (Prelude.Maybe Prelude.Text)
+dataLakePrincipal_dataLakePrincipalIdentifier = Lens.lens (\DataLakePrincipal' {dataLakePrincipalIdentifier} -> dataLakePrincipalIdentifier) (\s@DataLakePrincipal' {} a -> s {dataLakePrincipalIdentifier = a} :: DataLakePrincipal)
+
+instance Data.FromJSON DataLakePrincipal where
+  parseJSON =
+    Data.withObject
+      "DataLakePrincipal"
+      ( \x ->
+          DataLakePrincipal'
+            Prelude.<$> (x Data..:? "DataLakePrincipalIdentifier")
+      )
+
+instance Prelude.Hashable DataLakePrincipal where
+  hashWithSalt _salt DataLakePrincipal' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataLakePrincipalIdentifier
+
+instance Prelude.NFData DataLakePrincipal where
+  rnf DataLakePrincipal' {..} =
+    Prelude.rnf dataLakePrincipalIdentifier
+
+instance Data.ToJSON DataLakePrincipal where
+  toJSON DataLakePrincipal' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DataLakePrincipalIdentifier" Data..=)
+              Prelude.<$> dataLakePrincipalIdentifier
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/DataLakeResourceType.hs b/gen/Amazonka/LakeFormation/Types/DataLakeResourceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/DataLakeResourceType.hs
@@ -0,0 +1,101 @@
+{-# 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.LakeFormation.Types.DataLakeResourceType
+-- 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.LakeFormation.Types.DataLakeResourceType
+  ( DataLakeResourceType
+      ( ..,
+        DataLakeResourceType_CATALOG,
+        DataLakeResourceType_DATABASE,
+        DataLakeResourceType_DATA_LOCATION,
+        DataLakeResourceType_LF_TAG,
+        DataLakeResourceType_LF_TAG_POLICY,
+        DataLakeResourceType_LF_TAG_POLICY_DATABASE,
+        DataLakeResourceType_LF_TAG_POLICY_TABLE,
+        DataLakeResourceType_TABLE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DataLakeResourceType = DataLakeResourceType'
+  { fromDataLakeResourceType ::
+      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 DataLakeResourceType_CATALOG :: DataLakeResourceType
+pattern DataLakeResourceType_CATALOG = DataLakeResourceType' "CATALOG"
+
+pattern DataLakeResourceType_DATABASE :: DataLakeResourceType
+pattern DataLakeResourceType_DATABASE = DataLakeResourceType' "DATABASE"
+
+pattern DataLakeResourceType_DATA_LOCATION :: DataLakeResourceType
+pattern DataLakeResourceType_DATA_LOCATION = DataLakeResourceType' "DATA_LOCATION"
+
+pattern DataLakeResourceType_LF_TAG :: DataLakeResourceType
+pattern DataLakeResourceType_LF_TAG = DataLakeResourceType' "LF_TAG"
+
+pattern DataLakeResourceType_LF_TAG_POLICY :: DataLakeResourceType
+pattern DataLakeResourceType_LF_TAG_POLICY = DataLakeResourceType' "LF_TAG_POLICY"
+
+pattern DataLakeResourceType_LF_TAG_POLICY_DATABASE :: DataLakeResourceType
+pattern DataLakeResourceType_LF_TAG_POLICY_DATABASE = DataLakeResourceType' "LF_TAG_POLICY_DATABASE"
+
+pattern DataLakeResourceType_LF_TAG_POLICY_TABLE :: DataLakeResourceType
+pattern DataLakeResourceType_LF_TAG_POLICY_TABLE = DataLakeResourceType' "LF_TAG_POLICY_TABLE"
+
+pattern DataLakeResourceType_TABLE :: DataLakeResourceType
+pattern DataLakeResourceType_TABLE = DataLakeResourceType' "TABLE"
+
+{-# COMPLETE
+  DataLakeResourceType_CATALOG,
+  DataLakeResourceType_DATABASE,
+  DataLakeResourceType_DATA_LOCATION,
+  DataLakeResourceType_LF_TAG,
+  DataLakeResourceType_LF_TAG_POLICY,
+  DataLakeResourceType_LF_TAG_POLICY_DATABASE,
+  DataLakeResourceType_LF_TAG_POLICY_TABLE,
+  DataLakeResourceType_TABLE,
+  DataLakeResourceType'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/DataLakeSettings.hs b/gen/Amazonka/LakeFormation/Types/DataLakeSettings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/DataLakeSettings.hs
@@ -0,0 +1,348 @@
+{-# 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.LakeFormation.Types.DataLakeSettings
+-- 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.LakeFormation.Types.DataLakeSettings where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.DataLakePrincipal
+import Amazonka.LakeFormation.Types.PrincipalPermissions
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure representing a list of Lake Formation principals designated
+-- as data lake administrators and lists of principal permission entries
+-- for default create database and default create table permissions.
+--
+-- /See:/ 'newDataLakeSettings' smart constructor.
+data DataLakeSettings = DataLakeSettings'
+  { -- | Whether to allow Amazon EMR clusters to access data managed by Lake
+    -- Formation.
+    --
+    -- If true, you allow Amazon EMR clusters to access data in Amazon S3
+    -- locations that are registered with Lake Formation.
+    --
+    -- If false or null, no Amazon EMR clusters will be able to access data in
+    -- Amazon S3 locations that are registered with Lake Formation.
+    --
+    -- For more information, see
+    -- <https://docs-aws.amazon.com/lake-formation/latest/dg/getting-started-setup.html#emr-switch (Optional) Allow Data Filtering on Amazon EMR>.
+    allowExternalDataFiltering :: Prelude.Maybe Prelude.Bool,
+    -- | Lake Formation relies on a privileged process secured by Amazon EMR or
+    -- the third party integrator to tag the user\'s role while assuming it.
+    -- Lake Formation will publish the acceptable key-value pair, for example
+    -- key = \"LakeFormationTrustedCaller\" and value = \"TRUE\" and the third
+    -- party integrator must properly tag the temporary security credentials
+    -- that will be used to call Lake Formation\'s administrative APIs.
+    authorizedSessionTagValueList :: Prelude.Maybe [Prelude.Text],
+    -- | Specifies whether access control on newly created database is managed by
+    -- Lake Formation permissions or exclusively by IAM permissions.
+    --
+    -- A null value indicates access control by Lake Formation permissions. A
+    -- value that assigns ALL to IAM_ALLOWED_PRINCIPALS indicates access
+    -- control by IAM permissions. This is referred to as the setting \"Use
+    -- only IAM access control,\" and is for backward compatibility with the
+    -- Glue permission model implemented by IAM permissions.
+    --
+    -- The only permitted values are an empty array or an array that contains a
+    -- single JSON object that grants ALL to IAM_ALLOWED_PRINCIPALS.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/lake-formation/latest/dg/change-settings.html Changing the Default Security Settings for Your Data Lake>.
+    createDatabaseDefaultPermissions :: Prelude.Maybe [PrincipalPermissions],
+    -- | Specifies whether access control on newly created table is managed by
+    -- Lake Formation permissions or exclusively by IAM permissions.
+    --
+    -- A null value indicates access control by Lake Formation permissions. A
+    -- value that assigns ALL to IAM_ALLOWED_PRINCIPALS indicates access
+    -- control by IAM permissions. This is referred to as the setting \"Use
+    -- only IAM access control,\" and is for backward compatibility with the
+    -- Glue permission model implemented by IAM permissions.
+    --
+    -- The only permitted values are an empty array or an array that contains a
+    -- single JSON object that grants ALL to IAM_ALLOWED_PRINCIPALS.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/lake-formation/latest/dg/change-settings.html Changing the Default Security Settings for Your Data Lake>.
+    createTableDefaultPermissions :: Prelude.Maybe [PrincipalPermissions],
+    -- | A list of Lake Formation principals. Supported principals are IAM users
+    -- or IAM roles.
+    dataLakeAdmins :: Prelude.Maybe [DataLakePrincipal],
+    -- | A list of the account IDs of Amazon Web Services accounts with Amazon
+    -- EMR clusters that are to perform data filtering.>
+    externalDataFilteringAllowList :: Prelude.Maybe [DataLakePrincipal],
+    -- | A key-value map that provides an additional configuration on your data
+    -- lake. CrossAccountVersion is the key you can configure in the Parameters
+    -- field. Accepted values for the CrossAccountVersion key are 1, 2, and 3.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A list of the resource-owning account IDs that the caller\'s account can
+    -- use to share their user access details (user ARNs). The user ARNs can be
+    -- logged in the resource owner\'s CloudTrail log.
+    --
+    -- You may want to specify this property when you are in a high-trust
+    -- boundary, such as the same team or company.
+    trustedResourceOwners :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataLakeSettings' 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:
+--
+-- 'allowExternalDataFiltering', 'dataLakeSettings_allowExternalDataFiltering' - Whether to allow Amazon EMR clusters to access data managed by Lake
+-- Formation.
+--
+-- If true, you allow Amazon EMR clusters to access data in Amazon S3
+-- locations that are registered with Lake Formation.
+--
+-- If false or null, no Amazon EMR clusters will be able to access data in
+-- Amazon S3 locations that are registered with Lake Formation.
+--
+-- For more information, see
+-- <https://docs-aws.amazon.com/lake-formation/latest/dg/getting-started-setup.html#emr-switch (Optional) Allow Data Filtering on Amazon EMR>.
+--
+-- 'authorizedSessionTagValueList', 'dataLakeSettings_authorizedSessionTagValueList' - Lake Formation relies on a privileged process secured by Amazon EMR or
+-- the third party integrator to tag the user\'s role while assuming it.
+-- Lake Formation will publish the acceptable key-value pair, for example
+-- key = \"LakeFormationTrustedCaller\" and value = \"TRUE\" and the third
+-- party integrator must properly tag the temporary security credentials
+-- that will be used to call Lake Formation\'s administrative APIs.
+--
+-- 'createDatabaseDefaultPermissions', 'dataLakeSettings_createDatabaseDefaultPermissions' - Specifies whether access control on newly created database is managed by
+-- Lake Formation permissions or exclusively by IAM permissions.
+--
+-- A null value indicates access control by Lake Formation permissions. A
+-- value that assigns ALL to IAM_ALLOWED_PRINCIPALS indicates access
+-- control by IAM permissions. This is referred to as the setting \"Use
+-- only IAM access control,\" and is for backward compatibility with the
+-- Glue permission model implemented by IAM permissions.
+--
+-- The only permitted values are an empty array or an array that contains a
+-- single JSON object that grants ALL to IAM_ALLOWED_PRINCIPALS.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/lake-formation/latest/dg/change-settings.html Changing the Default Security Settings for Your Data Lake>.
+--
+-- 'createTableDefaultPermissions', 'dataLakeSettings_createTableDefaultPermissions' - Specifies whether access control on newly created table is managed by
+-- Lake Formation permissions or exclusively by IAM permissions.
+--
+-- A null value indicates access control by Lake Formation permissions. A
+-- value that assigns ALL to IAM_ALLOWED_PRINCIPALS indicates access
+-- control by IAM permissions. This is referred to as the setting \"Use
+-- only IAM access control,\" and is for backward compatibility with the
+-- Glue permission model implemented by IAM permissions.
+--
+-- The only permitted values are an empty array or an array that contains a
+-- single JSON object that grants ALL to IAM_ALLOWED_PRINCIPALS.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/lake-formation/latest/dg/change-settings.html Changing the Default Security Settings for Your Data Lake>.
+--
+-- 'dataLakeAdmins', 'dataLakeSettings_dataLakeAdmins' - A list of Lake Formation principals. Supported principals are IAM users
+-- or IAM roles.
+--
+-- 'externalDataFilteringAllowList', 'dataLakeSettings_externalDataFilteringAllowList' - A list of the account IDs of Amazon Web Services accounts with Amazon
+-- EMR clusters that are to perform data filtering.>
+--
+-- 'parameters', 'dataLakeSettings_parameters' - A key-value map that provides an additional configuration on your data
+-- lake. CrossAccountVersion is the key you can configure in the Parameters
+-- field. Accepted values for the CrossAccountVersion key are 1, 2, and 3.
+--
+-- 'trustedResourceOwners', 'dataLakeSettings_trustedResourceOwners' - A list of the resource-owning account IDs that the caller\'s account can
+-- use to share their user access details (user ARNs). The user ARNs can be
+-- logged in the resource owner\'s CloudTrail log.
+--
+-- You may want to specify this property when you are in a high-trust
+-- boundary, such as the same team or company.
+newDataLakeSettings ::
+  DataLakeSettings
+newDataLakeSettings =
+  DataLakeSettings'
+    { allowExternalDataFiltering =
+        Prelude.Nothing,
+      authorizedSessionTagValueList = Prelude.Nothing,
+      createDatabaseDefaultPermissions = Prelude.Nothing,
+      createTableDefaultPermissions = Prelude.Nothing,
+      dataLakeAdmins = Prelude.Nothing,
+      externalDataFilteringAllowList = Prelude.Nothing,
+      parameters = Prelude.Nothing,
+      trustedResourceOwners = Prelude.Nothing
+    }
+
+-- | Whether to allow Amazon EMR clusters to access data managed by Lake
+-- Formation.
+--
+-- If true, you allow Amazon EMR clusters to access data in Amazon S3
+-- locations that are registered with Lake Formation.
+--
+-- If false or null, no Amazon EMR clusters will be able to access data in
+-- Amazon S3 locations that are registered with Lake Formation.
+--
+-- For more information, see
+-- <https://docs-aws.amazon.com/lake-formation/latest/dg/getting-started-setup.html#emr-switch (Optional) Allow Data Filtering on Amazon EMR>.
+dataLakeSettings_allowExternalDataFiltering :: Lens.Lens' DataLakeSettings (Prelude.Maybe Prelude.Bool)
+dataLakeSettings_allowExternalDataFiltering = Lens.lens (\DataLakeSettings' {allowExternalDataFiltering} -> allowExternalDataFiltering) (\s@DataLakeSettings' {} a -> s {allowExternalDataFiltering = a} :: DataLakeSettings)
+
+-- | Lake Formation relies on a privileged process secured by Amazon EMR or
+-- the third party integrator to tag the user\'s role while assuming it.
+-- Lake Formation will publish the acceptable key-value pair, for example
+-- key = \"LakeFormationTrustedCaller\" and value = \"TRUE\" and the third
+-- party integrator must properly tag the temporary security credentials
+-- that will be used to call Lake Formation\'s administrative APIs.
+dataLakeSettings_authorizedSessionTagValueList :: Lens.Lens' DataLakeSettings (Prelude.Maybe [Prelude.Text])
+dataLakeSettings_authorizedSessionTagValueList = Lens.lens (\DataLakeSettings' {authorizedSessionTagValueList} -> authorizedSessionTagValueList) (\s@DataLakeSettings' {} a -> s {authorizedSessionTagValueList = a} :: DataLakeSettings) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specifies whether access control on newly created database is managed by
+-- Lake Formation permissions or exclusively by IAM permissions.
+--
+-- A null value indicates access control by Lake Formation permissions. A
+-- value that assigns ALL to IAM_ALLOWED_PRINCIPALS indicates access
+-- control by IAM permissions. This is referred to as the setting \"Use
+-- only IAM access control,\" and is for backward compatibility with the
+-- Glue permission model implemented by IAM permissions.
+--
+-- The only permitted values are an empty array or an array that contains a
+-- single JSON object that grants ALL to IAM_ALLOWED_PRINCIPALS.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/lake-formation/latest/dg/change-settings.html Changing the Default Security Settings for Your Data Lake>.
+dataLakeSettings_createDatabaseDefaultPermissions :: Lens.Lens' DataLakeSettings (Prelude.Maybe [PrincipalPermissions])
+dataLakeSettings_createDatabaseDefaultPermissions = Lens.lens (\DataLakeSettings' {createDatabaseDefaultPermissions} -> createDatabaseDefaultPermissions) (\s@DataLakeSettings' {} a -> s {createDatabaseDefaultPermissions = a} :: DataLakeSettings) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specifies whether access control on newly created table is managed by
+-- Lake Formation permissions or exclusively by IAM permissions.
+--
+-- A null value indicates access control by Lake Formation permissions. A
+-- value that assigns ALL to IAM_ALLOWED_PRINCIPALS indicates access
+-- control by IAM permissions. This is referred to as the setting \"Use
+-- only IAM access control,\" and is for backward compatibility with the
+-- Glue permission model implemented by IAM permissions.
+--
+-- The only permitted values are an empty array or an array that contains a
+-- single JSON object that grants ALL to IAM_ALLOWED_PRINCIPALS.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/lake-formation/latest/dg/change-settings.html Changing the Default Security Settings for Your Data Lake>.
+dataLakeSettings_createTableDefaultPermissions :: Lens.Lens' DataLakeSettings (Prelude.Maybe [PrincipalPermissions])
+dataLakeSettings_createTableDefaultPermissions = Lens.lens (\DataLakeSettings' {createTableDefaultPermissions} -> createTableDefaultPermissions) (\s@DataLakeSettings' {} a -> s {createTableDefaultPermissions = a} :: DataLakeSettings) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of Lake Formation principals. Supported principals are IAM users
+-- or IAM roles.
+dataLakeSettings_dataLakeAdmins :: Lens.Lens' DataLakeSettings (Prelude.Maybe [DataLakePrincipal])
+dataLakeSettings_dataLakeAdmins = Lens.lens (\DataLakeSettings' {dataLakeAdmins} -> dataLakeAdmins) (\s@DataLakeSettings' {} a -> s {dataLakeAdmins = a} :: DataLakeSettings) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of the account IDs of Amazon Web Services accounts with Amazon
+-- EMR clusters that are to perform data filtering.>
+dataLakeSettings_externalDataFilteringAllowList :: Lens.Lens' DataLakeSettings (Prelude.Maybe [DataLakePrincipal])
+dataLakeSettings_externalDataFilteringAllowList = Lens.lens (\DataLakeSettings' {externalDataFilteringAllowList} -> externalDataFilteringAllowList) (\s@DataLakeSettings' {} a -> s {externalDataFilteringAllowList = a} :: DataLakeSettings) Prelude.. Lens.mapping Lens.coerced
+
+-- | A key-value map that provides an additional configuration on your data
+-- lake. CrossAccountVersion is the key you can configure in the Parameters
+-- field. Accepted values for the CrossAccountVersion key are 1, 2, and 3.
+dataLakeSettings_parameters :: Lens.Lens' DataLakeSettings (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+dataLakeSettings_parameters = Lens.lens (\DataLakeSettings' {parameters} -> parameters) (\s@DataLakeSettings' {} a -> s {parameters = a} :: DataLakeSettings) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of the resource-owning account IDs that the caller\'s account can
+-- use to share their user access details (user ARNs). The user ARNs can be
+-- logged in the resource owner\'s CloudTrail log.
+--
+-- You may want to specify this property when you are in a high-trust
+-- boundary, such as the same team or company.
+dataLakeSettings_trustedResourceOwners :: Lens.Lens' DataLakeSettings (Prelude.Maybe [Prelude.Text])
+dataLakeSettings_trustedResourceOwners = Lens.lens (\DataLakeSettings' {trustedResourceOwners} -> trustedResourceOwners) (\s@DataLakeSettings' {} a -> s {trustedResourceOwners = a} :: DataLakeSettings) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON DataLakeSettings where
+  parseJSON =
+    Data.withObject
+      "DataLakeSettings"
+      ( \x ->
+          DataLakeSettings'
+            Prelude.<$> (x Data..:? "AllowExternalDataFiltering")
+            Prelude.<*> ( x
+                            Data..:? "AuthorizedSessionTagValueList"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "CreateDatabaseDefaultPermissions"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "CreateTableDefaultPermissions"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "DataLakeAdmins" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "ExternalDataFilteringAllowList"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "Parameters" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "TrustedResourceOwners"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable DataLakeSettings where
+  hashWithSalt _salt DataLakeSettings' {..} =
+    _salt
+      `Prelude.hashWithSalt` allowExternalDataFiltering
+      `Prelude.hashWithSalt` authorizedSessionTagValueList
+      `Prelude.hashWithSalt` createDatabaseDefaultPermissions
+      `Prelude.hashWithSalt` createTableDefaultPermissions
+      `Prelude.hashWithSalt` dataLakeAdmins
+      `Prelude.hashWithSalt` externalDataFilteringAllowList
+      `Prelude.hashWithSalt` parameters
+      `Prelude.hashWithSalt` trustedResourceOwners
+
+instance Prelude.NFData DataLakeSettings where
+  rnf DataLakeSettings' {..} =
+    Prelude.rnf allowExternalDataFiltering
+      `Prelude.seq` Prelude.rnf authorizedSessionTagValueList
+      `Prelude.seq` Prelude.rnf createDatabaseDefaultPermissions
+      `Prelude.seq` Prelude.rnf createTableDefaultPermissions
+      `Prelude.seq` Prelude.rnf dataLakeAdmins
+      `Prelude.seq` Prelude.rnf externalDataFilteringAllowList
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf trustedResourceOwners
+
+instance Data.ToJSON DataLakeSettings where
+  toJSON DataLakeSettings' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AllowExternalDataFiltering" Data..=)
+              Prelude.<$> allowExternalDataFiltering,
+            ("AuthorizedSessionTagValueList" Data..=)
+              Prelude.<$> authorizedSessionTagValueList,
+            ("CreateDatabaseDefaultPermissions" Data..=)
+              Prelude.<$> createDatabaseDefaultPermissions,
+            ("CreateTableDefaultPermissions" Data..=)
+              Prelude.<$> createTableDefaultPermissions,
+            ("DataLakeAdmins" Data..=)
+              Prelude.<$> dataLakeAdmins,
+            ("ExternalDataFilteringAllowList" Data..=)
+              Prelude.<$> externalDataFilteringAllowList,
+            ("Parameters" Data..=) Prelude.<$> parameters,
+            ("TrustedResourceOwners" Data..=)
+              Prelude.<$> trustedResourceOwners
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/DataLocationResource.hs b/gen/Amazonka/LakeFormation/Types/DataLocationResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/DataLocationResource.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.DataLocationResource
+-- 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.LakeFormation.Types.DataLocationResource 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 structure for a data location object where permissions are granted or
+-- revoked.
+--
+-- /See:/ 'newDataLocationResource' smart constructor.
+data DataLocationResource = DataLocationResource'
+  { -- | The identifier for the Data Catalog where the location is registered
+    -- with Lake Formation. By default, it is the account ID of the caller.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) that uniquely identifies the data
+    -- location resource.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataLocationResource' 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:
+--
+-- 'catalogId', 'dataLocationResource_catalogId' - The identifier for the Data Catalog where the location is registered
+-- with Lake Formation. By default, it is the account ID of the caller.
+--
+-- 'resourceArn', 'dataLocationResource_resourceArn' - The Amazon Resource Name (ARN) that uniquely identifies the data
+-- location resource.
+newDataLocationResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  DataLocationResource
+newDataLocationResource pResourceArn_ =
+  DataLocationResource'
+    { catalogId = Prelude.Nothing,
+      resourceArn = pResourceArn_
+    }
+
+-- | The identifier for the Data Catalog where the location is registered
+-- with Lake Formation. By default, it is the account ID of the caller.
+dataLocationResource_catalogId :: Lens.Lens' DataLocationResource (Prelude.Maybe Prelude.Text)
+dataLocationResource_catalogId = Lens.lens (\DataLocationResource' {catalogId} -> catalogId) (\s@DataLocationResource' {} a -> s {catalogId = a} :: DataLocationResource)
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the data
+-- location resource.
+dataLocationResource_resourceArn :: Lens.Lens' DataLocationResource Prelude.Text
+dataLocationResource_resourceArn = Lens.lens (\DataLocationResource' {resourceArn} -> resourceArn) (\s@DataLocationResource' {} a -> s {resourceArn = a} :: DataLocationResource)
+
+instance Data.FromJSON DataLocationResource where
+  parseJSON =
+    Data.withObject
+      "DataLocationResource"
+      ( \x ->
+          DataLocationResource'
+            Prelude.<$> (x Data..:? "CatalogId")
+            Prelude.<*> (x Data..: "ResourceArn")
+      )
+
+instance Prelude.Hashable DataLocationResource where
+  hashWithSalt _salt DataLocationResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData DataLocationResource where
+  rnf DataLocationResource' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf resourceArn
+
+instance Data.ToJSON DataLocationResource where
+  toJSON DataLocationResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("ResourceArn" Data..= resourceArn)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/DatabaseResource.hs b/gen/Amazonka/LakeFormation/Types/DatabaseResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/DatabaseResource.hs
@@ -0,0 +1,98 @@
+{-# 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.LakeFormation.Types.DatabaseResource
+-- 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.LakeFormation.Types.DatabaseResource 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 structure for the database object.
+--
+-- /See:/ 'newDatabaseResource' smart constructor.
+data DatabaseResource = DatabaseResource'
+  { -- | The identifier for the Data Catalog. By default, it is the account ID of
+    -- the caller.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the database resource. Unique to the Data Catalog.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatabaseResource' 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:
+--
+-- 'catalogId', 'databaseResource_catalogId' - The identifier for the Data Catalog. By default, it is the account ID of
+-- the caller.
+--
+-- 'name', 'databaseResource_name' - The name of the database resource. Unique to the Data Catalog.
+newDatabaseResource ::
+  -- | 'name'
+  Prelude.Text ->
+  DatabaseResource
+newDatabaseResource pName_ =
+  DatabaseResource'
+    { catalogId = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | The identifier for the Data Catalog. By default, it is the account ID of
+-- the caller.
+databaseResource_catalogId :: Lens.Lens' DatabaseResource (Prelude.Maybe Prelude.Text)
+databaseResource_catalogId = Lens.lens (\DatabaseResource' {catalogId} -> catalogId) (\s@DatabaseResource' {} a -> s {catalogId = a} :: DatabaseResource)
+
+-- | The name of the database resource. Unique to the Data Catalog.
+databaseResource_name :: Lens.Lens' DatabaseResource Prelude.Text
+databaseResource_name = Lens.lens (\DatabaseResource' {name} -> name) (\s@DatabaseResource' {} a -> s {name = a} :: DatabaseResource)
+
+instance Data.FromJSON DatabaseResource where
+  parseJSON =
+    Data.withObject
+      "DatabaseResource"
+      ( \x ->
+          DatabaseResource'
+            Prelude.<$> (x Data..:? "CatalogId")
+            Prelude.<*> (x Data..: "Name")
+      )
+
+instance Prelude.Hashable DatabaseResource where
+  hashWithSalt _salt DatabaseResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData DatabaseResource where
+  rnf DatabaseResource' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON DatabaseResource where
+  toJSON DatabaseResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("Name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/DeleteObjectInput.hs b/gen/Amazonka/LakeFormation/Types/DeleteObjectInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/DeleteObjectInput.hs
@@ -0,0 +1,104 @@
+{-# 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.LakeFormation.Types.DeleteObjectInput
+-- 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.LakeFormation.Types.DeleteObjectInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object to delete from the governed table.
+--
+-- /See:/ 'newDeleteObjectInput' smart constructor.
+data DeleteObjectInput = DeleteObjectInput'
+  { -- | The Amazon S3 ETag of the object. Returned by @GetTableObjects@ for
+    -- validation and used to identify changes to the underlying data.
+    eTag :: Prelude.Maybe Prelude.Text,
+    -- | A list of partition values for the object. A value must be specified for
+    -- each partition key associated with the governed table.
+    partitionValues :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The Amazon S3 location of the object to delete.
+    uri :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteObjectInput' 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:
+--
+-- 'eTag', 'deleteObjectInput_eTag' - The Amazon S3 ETag of the object. Returned by @GetTableObjects@ for
+-- validation and used to identify changes to the underlying data.
+--
+-- 'partitionValues', 'deleteObjectInput_partitionValues' - A list of partition values for the object. A value must be specified for
+-- each partition key associated with the governed table.
+--
+-- 'uri', 'deleteObjectInput_uri' - The Amazon S3 location of the object to delete.
+newDeleteObjectInput ::
+  -- | 'uri'
+  Prelude.Text ->
+  DeleteObjectInput
+newDeleteObjectInput pUri_ =
+  DeleteObjectInput'
+    { eTag = Prelude.Nothing,
+      partitionValues = Prelude.Nothing,
+      uri = pUri_
+    }
+
+-- | The Amazon S3 ETag of the object. Returned by @GetTableObjects@ for
+-- validation and used to identify changes to the underlying data.
+deleteObjectInput_eTag :: Lens.Lens' DeleteObjectInput (Prelude.Maybe Prelude.Text)
+deleteObjectInput_eTag = Lens.lens (\DeleteObjectInput' {eTag} -> eTag) (\s@DeleteObjectInput' {} a -> s {eTag = a} :: DeleteObjectInput)
+
+-- | A list of partition values for the object. A value must be specified for
+-- each partition key associated with the governed table.
+deleteObjectInput_partitionValues :: Lens.Lens' DeleteObjectInput (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+deleteObjectInput_partitionValues = Lens.lens (\DeleteObjectInput' {partitionValues} -> partitionValues) (\s@DeleteObjectInput' {} a -> s {partitionValues = a} :: DeleteObjectInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon S3 location of the object to delete.
+deleteObjectInput_uri :: Lens.Lens' DeleteObjectInput Prelude.Text
+deleteObjectInput_uri = Lens.lens (\DeleteObjectInput' {uri} -> uri) (\s@DeleteObjectInput' {} a -> s {uri = a} :: DeleteObjectInput)
+
+instance Prelude.Hashable DeleteObjectInput where
+  hashWithSalt _salt DeleteObjectInput' {..} =
+    _salt
+      `Prelude.hashWithSalt` eTag
+      `Prelude.hashWithSalt` partitionValues
+      `Prelude.hashWithSalt` uri
+
+instance Prelude.NFData DeleteObjectInput where
+  rnf DeleteObjectInput' {..} =
+    Prelude.rnf eTag
+      `Prelude.seq` Prelude.rnf partitionValues
+      `Prelude.seq` Prelude.rnf uri
+
+instance Data.ToJSON DeleteObjectInput where
+  toJSON DeleteObjectInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ETag" Data..=) Prelude.<$> eTag,
+            ("PartitionValues" Data..=)
+              Prelude.<$> partitionValues,
+            Prelude.Just ("Uri" Data..= uri)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/DetailsMap.hs b/gen/Amazonka/LakeFormation/Types/DetailsMap.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/DetailsMap.hs
@@ -0,0 +1,72 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.DetailsMap
+-- 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.LakeFormation.Types.DetailsMap 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 structure containing the additional details to be returned in the
+-- @AdditionalDetails@ attribute of @PrincipalResourcePermissions@.
+--
+-- If a catalog resource is shared through Resource Access Manager (RAM),
+-- then there will exist a corresponding RAM resource share ARN.
+--
+-- /See:/ 'newDetailsMap' smart constructor.
+data DetailsMap = DetailsMap'
+  { -- | A resource share ARN for a catalog resource shared through RAM.
+    resourceShare :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DetailsMap' 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:
+--
+-- 'resourceShare', 'detailsMap_resourceShare' - A resource share ARN for a catalog resource shared through RAM.
+newDetailsMap ::
+  DetailsMap
+newDetailsMap =
+  DetailsMap' {resourceShare = Prelude.Nothing}
+
+-- | A resource share ARN for a catalog resource shared through RAM.
+detailsMap_resourceShare :: Lens.Lens' DetailsMap (Prelude.Maybe [Prelude.Text])
+detailsMap_resourceShare = Lens.lens (\DetailsMap' {resourceShare} -> resourceShare) (\s@DetailsMap' {} a -> s {resourceShare = a} :: DetailsMap) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON DetailsMap where
+  parseJSON =
+    Data.withObject
+      "DetailsMap"
+      ( \x ->
+          DetailsMap'
+            Prelude.<$> (x Data..:? "ResourceShare" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable DetailsMap where
+  hashWithSalt _salt DetailsMap' {..} =
+    _salt `Prelude.hashWithSalt` resourceShare
+
+instance Prelude.NFData DetailsMap where
+  rnf DetailsMap' {..} = Prelude.rnf resourceShare
diff --git a/gen/Amazonka/LakeFormation/Types/ErrorDetail.hs b/gen/Amazonka/LakeFormation/Types/ErrorDetail.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/ErrorDetail.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.ErrorDetail
+-- 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.LakeFormation.Types.ErrorDetail 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
+
+-- | Contains details about an error.
+--
+-- /See:/ 'newErrorDetail' smart constructor.
+data ErrorDetail = ErrorDetail'
+  { -- | The code associated with this error.
+    errorCode :: Prelude.Maybe Prelude.Text,
+    -- | A message describing the error.
+    errorMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ErrorDetail' 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:
+--
+-- 'errorCode', 'errorDetail_errorCode' - The code associated with this error.
+--
+-- 'errorMessage', 'errorDetail_errorMessage' - A message describing the error.
+newErrorDetail ::
+  ErrorDetail
+newErrorDetail =
+  ErrorDetail'
+    { errorCode = Prelude.Nothing,
+      errorMessage = Prelude.Nothing
+    }
+
+-- | The code associated with this error.
+errorDetail_errorCode :: Lens.Lens' ErrorDetail (Prelude.Maybe Prelude.Text)
+errorDetail_errorCode = Lens.lens (\ErrorDetail' {errorCode} -> errorCode) (\s@ErrorDetail' {} a -> s {errorCode = a} :: ErrorDetail)
+
+-- | A message describing the error.
+errorDetail_errorMessage :: Lens.Lens' ErrorDetail (Prelude.Maybe Prelude.Text)
+errorDetail_errorMessage = Lens.lens (\ErrorDetail' {errorMessage} -> errorMessage) (\s@ErrorDetail' {} a -> s {errorMessage = a} :: ErrorDetail)
+
+instance Data.FromJSON ErrorDetail where
+  parseJSON =
+    Data.withObject
+      "ErrorDetail"
+      ( \x ->
+          ErrorDetail'
+            Prelude.<$> (x Data..:? "ErrorCode")
+            Prelude.<*> (x Data..:? "ErrorMessage")
+      )
+
+instance Prelude.Hashable ErrorDetail where
+  hashWithSalt _salt ErrorDetail' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorCode
+      `Prelude.hashWithSalt` errorMessage
+
+instance Prelude.NFData ErrorDetail where
+  rnf ErrorDetail' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorMessage
diff --git a/gen/Amazonka/LakeFormation/Types/ExecutionStatistics.hs b/gen/Amazonka/LakeFormation/Types/ExecutionStatistics.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/ExecutionStatistics.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.ExecutionStatistics
+-- 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.LakeFormation.Types.ExecutionStatistics 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
+
+-- | Statistics related to the processing of a query statement.
+--
+-- /See:/ 'newExecutionStatistics' smart constructor.
+data ExecutionStatistics = ExecutionStatistics'
+  { -- | The average time the request took to be executed.
+    averageExecutionTimeMillis :: Prelude.Maybe Prelude.Integer,
+    -- | The amount of data that was scanned in bytes.
+    dataScannedBytes :: Prelude.Maybe Prelude.Integer,
+    -- | The number of work units executed.
+    workUnitsExecutedCount :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExecutionStatistics' 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:
+--
+-- 'averageExecutionTimeMillis', 'executionStatistics_averageExecutionTimeMillis' - The average time the request took to be executed.
+--
+-- 'dataScannedBytes', 'executionStatistics_dataScannedBytes' - The amount of data that was scanned in bytes.
+--
+-- 'workUnitsExecutedCount', 'executionStatistics_workUnitsExecutedCount' - The number of work units executed.
+newExecutionStatistics ::
+  ExecutionStatistics
+newExecutionStatistics =
+  ExecutionStatistics'
+    { averageExecutionTimeMillis =
+        Prelude.Nothing,
+      dataScannedBytes = Prelude.Nothing,
+      workUnitsExecutedCount = Prelude.Nothing
+    }
+
+-- | The average time the request took to be executed.
+executionStatistics_averageExecutionTimeMillis :: Lens.Lens' ExecutionStatistics (Prelude.Maybe Prelude.Integer)
+executionStatistics_averageExecutionTimeMillis = Lens.lens (\ExecutionStatistics' {averageExecutionTimeMillis} -> averageExecutionTimeMillis) (\s@ExecutionStatistics' {} a -> s {averageExecutionTimeMillis = a} :: ExecutionStatistics)
+
+-- | The amount of data that was scanned in bytes.
+executionStatistics_dataScannedBytes :: Lens.Lens' ExecutionStatistics (Prelude.Maybe Prelude.Integer)
+executionStatistics_dataScannedBytes = Lens.lens (\ExecutionStatistics' {dataScannedBytes} -> dataScannedBytes) (\s@ExecutionStatistics' {} a -> s {dataScannedBytes = a} :: ExecutionStatistics)
+
+-- | The number of work units executed.
+executionStatistics_workUnitsExecutedCount :: Lens.Lens' ExecutionStatistics (Prelude.Maybe Prelude.Integer)
+executionStatistics_workUnitsExecutedCount = Lens.lens (\ExecutionStatistics' {workUnitsExecutedCount} -> workUnitsExecutedCount) (\s@ExecutionStatistics' {} a -> s {workUnitsExecutedCount = a} :: ExecutionStatistics)
+
+instance Data.FromJSON ExecutionStatistics where
+  parseJSON =
+    Data.withObject
+      "ExecutionStatistics"
+      ( \x ->
+          ExecutionStatistics'
+            Prelude.<$> (x Data..:? "AverageExecutionTimeMillis")
+            Prelude.<*> (x Data..:? "DataScannedBytes")
+            Prelude.<*> (x Data..:? "WorkUnitsExecutedCount")
+      )
+
+instance Prelude.Hashable ExecutionStatistics where
+  hashWithSalt _salt ExecutionStatistics' {..} =
+    _salt
+      `Prelude.hashWithSalt` averageExecutionTimeMillis
+      `Prelude.hashWithSalt` dataScannedBytes
+      `Prelude.hashWithSalt` workUnitsExecutedCount
+
+instance Prelude.NFData ExecutionStatistics where
+  rnf ExecutionStatistics' {..} =
+    Prelude.rnf averageExecutionTimeMillis
+      `Prelude.seq` Prelude.rnf dataScannedBytes
+      `Prelude.seq` Prelude.rnf workUnitsExecutedCount
diff --git a/gen/Amazonka/LakeFormation/Types/FieldNameString.hs b/gen/Amazonka/LakeFormation/Types/FieldNameString.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/FieldNameString.hs
@@ -0,0 +1,76 @@
+{-# 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.LakeFormation.Types.FieldNameString
+-- 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.LakeFormation.Types.FieldNameString
+  ( FieldNameString
+      ( ..,
+        FieldNameString_LAST_MODIFIED,
+        FieldNameString_RESOURCE_ARN,
+        FieldNameString_ROLE_ARN
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FieldNameString = FieldNameString'
+  { fromFieldNameString ::
+      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 FieldNameString_LAST_MODIFIED :: FieldNameString
+pattern FieldNameString_LAST_MODIFIED = FieldNameString' "LAST_MODIFIED"
+
+pattern FieldNameString_RESOURCE_ARN :: FieldNameString
+pattern FieldNameString_RESOURCE_ARN = FieldNameString' "RESOURCE_ARN"
+
+pattern FieldNameString_ROLE_ARN :: FieldNameString
+pattern FieldNameString_ROLE_ARN = FieldNameString' "ROLE_ARN"
+
+{-# COMPLETE
+  FieldNameString_LAST_MODIFIED,
+  FieldNameString_RESOURCE_ARN,
+  FieldNameString_ROLE_ARN,
+  FieldNameString'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/FilterCondition.hs b/gen/Amazonka/LakeFormation/Types/FilterCondition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/FilterCondition.hs
@@ -0,0 +1,101 @@
+{-# 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.LakeFormation.Types.FilterCondition
+-- 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.LakeFormation.Types.FilterCondition where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.ComparisonOperator
+import Amazonka.LakeFormation.Types.FieldNameString
+import qualified Amazonka.Prelude as Prelude
+
+-- | This structure describes the filtering of columns in a table based on a
+-- filter condition.
+--
+-- /See:/ 'newFilterCondition' smart constructor.
+data FilterCondition = FilterCondition'
+  { -- | The comparison operator used in the filter condition.
+    comparisonOperator :: Prelude.Maybe ComparisonOperator,
+    -- | The field to filter in the filter condition.
+    field :: Prelude.Maybe FieldNameString,
+    -- | A string with values used in evaluating the filter condition.
+    stringValueList :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FilterCondition' 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:
+--
+-- 'comparisonOperator', 'filterCondition_comparisonOperator' - The comparison operator used in the filter condition.
+--
+-- 'field', 'filterCondition_field' - The field to filter in the filter condition.
+--
+-- 'stringValueList', 'filterCondition_stringValueList' - A string with values used in evaluating the filter condition.
+newFilterCondition ::
+  FilterCondition
+newFilterCondition =
+  FilterCondition'
+    { comparisonOperator =
+        Prelude.Nothing,
+      field = Prelude.Nothing,
+      stringValueList = Prelude.Nothing
+    }
+
+-- | The comparison operator used in the filter condition.
+filterCondition_comparisonOperator :: Lens.Lens' FilterCondition (Prelude.Maybe ComparisonOperator)
+filterCondition_comparisonOperator = Lens.lens (\FilterCondition' {comparisonOperator} -> comparisonOperator) (\s@FilterCondition' {} a -> s {comparisonOperator = a} :: FilterCondition)
+
+-- | The field to filter in the filter condition.
+filterCondition_field :: Lens.Lens' FilterCondition (Prelude.Maybe FieldNameString)
+filterCondition_field = Lens.lens (\FilterCondition' {field} -> field) (\s@FilterCondition' {} a -> s {field = a} :: FilterCondition)
+
+-- | A string with values used in evaluating the filter condition.
+filterCondition_stringValueList :: Lens.Lens' FilterCondition (Prelude.Maybe [Prelude.Text])
+filterCondition_stringValueList = Lens.lens (\FilterCondition' {stringValueList} -> stringValueList) (\s@FilterCondition' {} a -> s {stringValueList = a} :: FilterCondition) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable FilterCondition where
+  hashWithSalt _salt FilterCondition' {..} =
+    _salt
+      `Prelude.hashWithSalt` comparisonOperator
+      `Prelude.hashWithSalt` field
+      `Prelude.hashWithSalt` stringValueList
+
+instance Prelude.NFData FilterCondition where
+  rnf FilterCondition' {..} =
+    Prelude.rnf comparisonOperator
+      `Prelude.seq` Prelude.rnf field
+      `Prelude.seq` Prelude.rnf stringValueList
+
+instance Data.ToJSON FilterCondition where
+  toJSON FilterCondition' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ComparisonOperator" Data..=)
+              Prelude.<$> comparisonOperator,
+            ("Field" Data..=) Prelude.<$> field,
+            ("StringValueList" Data..=)
+              Prelude.<$> stringValueList
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/LFTag.hs b/gen/Amazonka/LakeFormation/Types/LFTag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/LFTag.hs
@@ -0,0 +1,99 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.LFTag
+-- 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.LakeFormation.Types.LFTag 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 structure that allows an admin to grant user permissions on certain
+-- conditions. For example, granting a role access to all columns that do
+-- not have the LF-tag \'PII\' in tables that have the LF-tag \'Prod\'.
+--
+-- /See:/ 'newLFTag' smart constructor.
+data LFTag = LFTag'
+  { -- | The key-name for the LF-tag.
+    tagKey :: Prelude.Text,
+    -- | A list of possible values an attribute can take.
+    tagValues :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LFTag' 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:
+--
+-- 'tagKey', 'lFTag_tagKey' - The key-name for the LF-tag.
+--
+-- 'tagValues', 'lFTag_tagValues' - A list of possible values an attribute can take.
+newLFTag ::
+  -- | 'tagKey'
+  Prelude.Text ->
+  -- | 'tagValues'
+  Prelude.NonEmpty Prelude.Text ->
+  LFTag
+newLFTag pTagKey_ pTagValues_ =
+  LFTag'
+    { tagKey = pTagKey_,
+      tagValues = Lens.coerced Lens.# pTagValues_
+    }
+
+-- | The key-name for the LF-tag.
+lFTag_tagKey :: Lens.Lens' LFTag Prelude.Text
+lFTag_tagKey = Lens.lens (\LFTag' {tagKey} -> tagKey) (\s@LFTag' {} a -> s {tagKey = a} :: LFTag)
+
+-- | A list of possible values an attribute can take.
+lFTag_tagValues :: Lens.Lens' LFTag (Prelude.NonEmpty Prelude.Text)
+lFTag_tagValues = Lens.lens (\LFTag' {tagValues} -> tagValues) (\s@LFTag' {} a -> s {tagValues = a} :: LFTag) Prelude.. Lens.coerced
+
+instance Data.FromJSON LFTag where
+  parseJSON =
+    Data.withObject
+      "LFTag"
+      ( \x ->
+          LFTag'
+            Prelude.<$> (x Data..: "TagKey")
+            Prelude.<*> (x Data..: "TagValues")
+      )
+
+instance Prelude.Hashable LFTag where
+  hashWithSalt _salt LFTag' {..} =
+    _salt
+      `Prelude.hashWithSalt` tagKey
+      `Prelude.hashWithSalt` tagValues
+
+instance Prelude.NFData LFTag where
+  rnf LFTag' {..} =
+    Prelude.rnf tagKey
+      `Prelude.seq` Prelude.rnf tagValues
+
+instance Data.ToJSON LFTag where
+  toJSON LFTag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("TagKey" Data..= tagKey),
+            Prelude.Just ("TagValues" Data..= tagValues)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/LFTagError.hs b/gen/Amazonka/LakeFormation/Types/LFTagError.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/LFTagError.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.LFTagError
+-- 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.LakeFormation.Types.LFTagError where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.ErrorDetail
+import Amazonka.LakeFormation.Types.LFTagPair
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure containing an error related to a @TagResource@ or
+-- @UnTagResource@ operation.
+--
+-- /See:/ 'newLFTagError' smart constructor.
+data LFTagError = LFTagError'
+  { -- | An error that occurred with the attachment or detachment of the LF-tag.
+    error :: Prelude.Maybe ErrorDetail,
+    -- | The key-name of the LF-tag.
+    lFTag :: Prelude.Maybe LFTagPair
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LFTagError' 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:
+--
+-- 'error', 'lFTagError_error' - An error that occurred with the attachment or detachment of the LF-tag.
+--
+-- 'lFTag', 'lFTagError_lFTag' - The key-name of the LF-tag.
+newLFTagError ::
+  LFTagError
+newLFTagError =
+  LFTagError'
+    { error = Prelude.Nothing,
+      lFTag = Prelude.Nothing
+    }
+
+-- | An error that occurred with the attachment or detachment of the LF-tag.
+lFTagError_error :: Lens.Lens' LFTagError (Prelude.Maybe ErrorDetail)
+lFTagError_error = Lens.lens (\LFTagError' {error} -> error) (\s@LFTagError' {} a -> s {error = a} :: LFTagError)
+
+-- | The key-name of the LF-tag.
+lFTagError_lFTag :: Lens.Lens' LFTagError (Prelude.Maybe LFTagPair)
+lFTagError_lFTag = Lens.lens (\LFTagError' {lFTag} -> lFTag) (\s@LFTagError' {} a -> s {lFTag = a} :: LFTagError)
+
+instance Data.FromJSON LFTagError where
+  parseJSON =
+    Data.withObject
+      "LFTagError"
+      ( \x ->
+          LFTagError'
+            Prelude.<$> (x Data..:? "Error")
+            Prelude.<*> (x Data..:? "LFTag")
+      )
+
+instance Prelude.Hashable LFTagError where
+  hashWithSalt _salt LFTagError' {..} =
+    _salt
+      `Prelude.hashWithSalt` error
+      `Prelude.hashWithSalt` lFTag
+
+instance Prelude.NFData LFTagError where
+  rnf LFTagError' {..} =
+    Prelude.rnf error `Prelude.seq` Prelude.rnf lFTag
diff --git a/gen/Amazonka/LakeFormation/Types/LFTagKeyResource.hs b/gen/Amazonka/LakeFormation/Types/LFTagKeyResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/LFTagKeyResource.hs
@@ -0,0 +1,119 @@
+{-# 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.LakeFormation.Types.LFTagKeyResource
+-- 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.LakeFormation.Types.LFTagKeyResource 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 structure containing an LF-tag key and values for a resource.
+--
+-- /See:/ 'newLFTagKeyResource' smart constructor.
+data LFTagKeyResource = LFTagKeyResource'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The key-name for the LF-tag.
+    tagKey :: Prelude.Text,
+    -- | A list of possible values an attribute can take.
+    tagValues :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LFTagKeyResource' 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:
+--
+-- 'catalogId', 'lFTagKeyResource_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'tagKey', 'lFTagKeyResource_tagKey' - The key-name for the LF-tag.
+--
+-- 'tagValues', 'lFTagKeyResource_tagValues' - A list of possible values an attribute can take.
+newLFTagKeyResource ::
+  -- | 'tagKey'
+  Prelude.Text ->
+  -- | 'tagValues'
+  Prelude.NonEmpty Prelude.Text ->
+  LFTagKeyResource
+newLFTagKeyResource pTagKey_ pTagValues_ =
+  LFTagKeyResource'
+    { catalogId = Prelude.Nothing,
+      tagKey = pTagKey_,
+      tagValues = Lens.coerced Lens.# pTagValues_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+lFTagKeyResource_catalogId :: Lens.Lens' LFTagKeyResource (Prelude.Maybe Prelude.Text)
+lFTagKeyResource_catalogId = Lens.lens (\LFTagKeyResource' {catalogId} -> catalogId) (\s@LFTagKeyResource' {} a -> s {catalogId = a} :: LFTagKeyResource)
+
+-- | The key-name for the LF-tag.
+lFTagKeyResource_tagKey :: Lens.Lens' LFTagKeyResource Prelude.Text
+lFTagKeyResource_tagKey = Lens.lens (\LFTagKeyResource' {tagKey} -> tagKey) (\s@LFTagKeyResource' {} a -> s {tagKey = a} :: LFTagKeyResource)
+
+-- | A list of possible values an attribute can take.
+lFTagKeyResource_tagValues :: Lens.Lens' LFTagKeyResource (Prelude.NonEmpty Prelude.Text)
+lFTagKeyResource_tagValues = Lens.lens (\LFTagKeyResource' {tagValues} -> tagValues) (\s@LFTagKeyResource' {} a -> s {tagValues = a} :: LFTagKeyResource) Prelude.. Lens.coerced
+
+instance Data.FromJSON LFTagKeyResource where
+  parseJSON =
+    Data.withObject
+      "LFTagKeyResource"
+      ( \x ->
+          LFTagKeyResource'
+            Prelude.<$> (x Data..:? "CatalogId")
+            Prelude.<*> (x Data..: "TagKey")
+            Prelude.<*> (x Data..: "TagValues")
+      )
+
+instance Prelude.Hashable LFTagKeyResource where
+  hashWithSalt _salt LFTagKeyResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` tagKey
+      `Prelude.hashWithSalt` tagValues
+
+instance Prelude.NFData LFTagKeyResource where
+  rnf LFTagKeyResource' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf tagKey
+      `Prelude.seq` Prelude.rnf tagValues
+
+instance Data.ToJSON LFTagKeyResource where
+  toJSON LFTagKeyResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("TagKey" Data..= tagKey),
+            Prelude.Just ("TagValues" Data..= tagValues)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/LFTagPair.hs b/gen/Amazonka/LakeFormation/Types/LFTagPair.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/LFTagPair.hs
@@ -0,0 +1,119 @@
+{-# 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.LakeFormation.Types.LFTagPair
+-- 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.LakeFormation.Types.LFTagPair 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 structure containing an LF-tag key-value pair.
+--
+-- /See:/ 'newLFTagPair' smart constructor.
+data LFTagPair = LFTagPair'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The key-name for the LF-tag.
+    tagKey :: Prelude.Text,
+    -- | A list of possible values an attribute can take.
+    tagValues :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LFTagPair' 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:
+--
+-- 'catalogId', 'lFTagPair_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'tagKey', 'lFTagPair_tagKey' - The key-name for the LF-tag.
+--
+-- 'tagValues', 'lFTagPair_tagValues' - A list of possible values an attribute can take.
+newLFTagPair ::
+  -- | 'tagKey'
+  Prelude.Text ->
+  -- | 'tagValues'
+  Prelude.NonEmpty Prelude.Text ->
+  LFTagPair
+newLFTagPair pTagKey_ pTagValues_ =
+  LFTagPair'
+    { catalogId = Prelude.Nothing,
+      tagKey = pTagKey_,
+      tagValues = Lens.coerced Lens.# pTagValues_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+lFTagPair_catalogId :: Lens.Lens' LFTagPair (Prelude.Maybe Prelude.Text)
+lFTagPair_catalogId = Lens.lens (\LFTagPair' {catalogId} -> catalogId) (\s@LFTagPair' {} a -> s {catalogId = a} :: LFTagPair)
+
+-- | The key-name for the LF-tag.
+lFTagPair_tagKey :: Lens.Lens' LFTagPair Prelude.Text
+lFTagPair_tagKey = Lens.lens (\LFTagPair' {tagKey} -> tagKey) (\s@LFTagPair' {} a -> s {tagKey = a} :: LFTagPair)
+
+-- | A list of possible values an attribute can take.
+lFTagPair_tagValues :: Lens.Lens' LFTagPair (Prelude.NonEmpty Prelude.Text)
+lFTagPair_tagValues = Lens.lens (\LFTagPair' {tagValues} -> tagValues) (\s@LFTagPair' {} a -> s {tagValues = a} :: LFTagPair) Prelude.. Lens.coerced
+
+instance Data.FromJSON LFTagPair where
+  parseJSON =
+    Data.withObject
+      "LFTagPair"
+      ( \x ->
+          LFTagPair'
+            Prelude.<$> (x Data..:? "CatalogId")
+            Prelude.<*> (x Data..: "TagKey")
+            Prelude.<*> (x Data..: "TagValues")
+      )
+
+instance Prelude.Hashable LFTagPair where
+  hashWithSalt _salt LFTagPair' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` tagKey
+      `Prelude.hashWithSalt` tagValues
+
+instance Prelude.NFData LFTagPair where
+  rnf LFTagPair' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf tagKey
+      `Prelude.seq` Prelude.rnf tagValues
+
+instance Data.ToJSON LFTagPair where
+  toJSON LFTagPair' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("TagKey" Data..= tagKey),
+            Prelude.Just ("TagValues" Data..= tagValues)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/LFTagPolicyResource.hs b/gen/Amazonka/LakeFormation/Types/LFTagPolicyResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/LFTagPolicyResource.hs
@@ -0,0 +1,122 @@
+{-# 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.LakeFormation.Types.LFTagPolicyResource
+-- 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.LakeFormation.Types.LFTagPolicyResource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.LFTag
+import Amazonka.LakeFormation.Types.ResourceType
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure containing a list of LF-tag conditions that apply to a
+-- resource\'s LF-tag policy.
+--
+-- /See:/ 'newLFTagPolicyResource' smart constructor.
+data LFTagPolicyResource = LFTagPolicyResource'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The resource type for which the LF-tag policy applies.
+    resourceType :: ResourceType,
+    -- | A list of LF-tag conditions that apply to the resource\'s LF-tag policy.
+    expression :: Prelude.NonEmpty LFTag
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LFTagPolicyResource' 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:
+--
+-- 'catalogId', 'lFTagPolicyResource_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'resourceType', 'lFTagPolicyResource_resourceType' - The resource type for which the LF-tag policy applies.
+--
+-- 'expression', 'lFTagPolicyResource_expression' - A list of LF-tag conditions that apply to the resource\'s LF-tag policy.
+newLFTagPolicyResource ::
+  -- | 'resourceType'
+  ResourceType ->
+  -- | 'expression'
+  Prelude.NonEmpty LFTag ->
+  LFTagPolicyResource
+newLFTagPolicyResource pResourceType_ pExpression_ =
+  LFTagPolicyResource'
+    { catalogId = Prelude.Nothing,
+      resourceType = pResourceType_,
+      expression = Lens.coerced Lens.# pExpression_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+lFTagPolicyResource_catalogId :: Lens.Lens' LFTagPolicyResource (Prelude.Maybe Prelude.Text)
+lFTagPolicyResource_catalogId = Lens.lens (\LFTagPolicyResource' {catalogId} -> catalogId) (\s@LFTagPolicyResource' {} a -> s {catalogId = a} :: LFTagPolicyResource)
+
+-- | The resource type for which the LF-tag policy applies.
+lFTagPolicyResource_resourceType :: Lens.Lens' LFTagPolicyResource ResourceType
+lFTagPolicyResource_resourceType = Lens.lens (\LFTagPolicyResource' {resourceType} -> resourceType) (\s@LFTagPolicyResource' {} a -> s {resourceType = a} :: LFTagPolicyResource)
+
+-- | A list of LF-tag conditions that apply to the resource\'s LF-tag policy.
+lFTagPolicyResource_expression :: Lens.Lens' LFTagPolicyResource (Prelude.NonEmpty LFTag)
+lFTagPolicyResource_expression = Lens.lens (\LFTagPolicyResource' {expression} -> expression) (\s@LFTagPolicyResource' {} a -> s {expression = a} :: LFTagPolicyResource) Prelude.. Lens.coerced
+
+instance Data.FromJSON LFTagPolicyResource where
+  parseJSON =
+    Data.withObject
+      "LFTagPolicyResource"
+      ( \x ->
+          LFTagPolicyResource'
+            Prelude.<$> (x Data..:? "CatalogId")
+            Prelude.<*> (x Data..: "ResourceType")
+            Prelude.<*> (x Data..: "Expression")
+      )
+
+instance Prelude.Hashable LFTagPolicyResource where
+  hashWithSalt _salt LFTagPolicyResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` resourceType
+      `Prelude.hashWithSalt` expression
+
+instance Prelude.NFData LFTagPolicyResource where
+  rnf LFTagPolicyResource' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf resourceType
+      `Prelude.seq` Prelude.rnf expression
+
+instance Data.ToJSON LFTagPolicyResource where
+  toJSON LFTagPolicyResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("ResourceType" Data..= resourceType),
+            Prelude.Just ("Expression" Data..= expression)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/OptimizerType.hs b/gen/Amazonka/LakeFormation/Types/OptimizerType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/OptimizerType.hs
@@ -0,0 +1,76 @@
+{-# 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.LakeFormation.Types.OptimizerType
+-- 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.LakeFormation.Types.OptimizerType
+  ( OptimizerType
+      ( ..,
+        OptimizerType_ALL,
+        OptimizerType_COMPACTION,
+        OptimizerType_GARBAGE_COLLECTION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype OptimizerType = OptimizerType'
+  { fromOptimizerType ::
+      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 OptimizerType_ALL :: OptimizerType
+pattern OptimizerType_ALL = OptimizerType' "ALL"
+
+pattern OptimizerType_COMPACTION :: OptimizerType
+pattern OptimizerType_COMPACTION = OptimizerType' "COMPACTION"
+
+pattern OptimizerType_GARBAGE_COLLECTION :: OptimizerType
+pattern OptimizerType_GARBAGE_COLLECTION = OptimizerType' "GARBAGE_COLLECTION"
+
+{-# COMPLETE
+  OptimizerType_ALL,
+  OptimizerType_COMPACTION,
+  OptimizerType_GARBAGE_COLLECTION,
+  OptimizerType'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/PartitionObjects.hs b/gen/Amazonka/LakeFormation/Types/PartitionObjects.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/PartitionObjects.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.PartitionObjects
+-- 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.LakeFormation.Types.PartitionObjects where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.TableObject
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure containing a list of partition values and table objects.
+--
+-- /See:/ 'newPartitionObjects' smart constructor.
+data PartitionObjects = PartitionObjects'
+  { -- | A list of table objects
+    objects :: Prelude.Maybe [TableObject],
+    -- | A list of partition values.
+    partitionValues :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PartitionObjects' 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:
+--
+-- 'objects', 'partitionObjects_objects' - A list of table objects
+--
+-- 'partitionValues', 'partitionObjects_partitionValues' - A list of partition values.
+newPartitionObjects ::
+  PartitionObjects
+newPartitionObjects =
+  PartitionObjects'
+    { objects = Prelude.Nothing,
+      partitionValues = Prelude.Nothing
+    }
+
+-- | A list of table objects
+partitionObjects_objects :: Lens.Lens' PartitionObjects (Prelude.Maybe [TableObject])
+partitionObjects_objects = Lens.lens (\PartitionObjects' {objects} -> objects) (\s@PartitionObjects' {} a -> s {objects = a} :: PartitionObjects) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of partition values.
+partitionObjects_partitionValues :: Lens.Lens' PartitionObjects (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+partitionObjects_partitionValues = Lens.lens (\PartitionObjects' {partitionValues} -> partitionValues) (\s@PartitionObjects' {} a -> s {partitionValues = a} :: PartitionObjects) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON PartitionObjects where
+  parseJSON =
+    Data.withObject
+      "PartitionObjects"
+      ( \x ->
+          PartitionObjects'
+            Prelude.<$> (x Data..:? "Objects" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "PartitionValues")
+      )
+
+instance Prelude.Hashable PartitionObjects where
+  hashWithSalt _salt PartitionObjects' {..} =
+    _salt
+      `Prelude.hashWithSalt` objects
+      `Prelude.hashWithSalt` partitionValues
+
+instance Prelude.NFData PartitionObjects where
+  rnf PartitionObjects' {..} =
+    Prelude.rnf objects
+      `Prelude.seq` Prelude.rnf partitionValues
diff --git a/gen/Amazonka/LakeFormation/Types/PartitionValueList.hs b/gen/Amazonka/LakeFormation/Types/PartitionValueList.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/PartitionValueList.hs
@@ -0,0 +1,71 @@
+{-# 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.LakeFormation.Types.PartitionValueList
+-- 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.LakeFormation.Types.PartitionValueList 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
+
+-- | Contains a list of values defining partitions.
+--
+-- /See:/ 'newPartitionValueList' smart constructor.
+data PartitionValueList = PartitionValueList'
+  { -- | The list of partition values.
+    values :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PartitionValueList' 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:
+--
+-- 'values', 'partitionValueList_values' - The list of partition values.
+newPartitionValueList ::
+  -- | 'values'
+  Prelude.NonEmpty Prelude.Text ->
+  PartitionValueList
+newPartitionValueList pValues_ =
+  PartitionValueList'
+    { values =
+        Lens.coerced Lens.# pValues_
+    }
+
+-- | The list of partition values.
+partitionValueList_values :: Lens.Lens' PartitionValueList (Prelude.NonEmpty Prelude.Text)
+partitionValueList_values = Lens.lens (\PartitionValueList' {values} -> values) (\s@PartitionValueList' {} a -> s {values = a} :: PartitionValueList) Prelude.. Lens.coerced
+
+instance Prelude.Hashable PartitionValueList where
+  hashWithSalt _salt PartitionValueList' {..} =
+    _salt `Prelude.hashWithSalt` values
+
+instance Prelude.NFData PartitionValueList where
+  rnf PartitionValueList' {..} = Prelude.rnf values
+
+instance Data.ToJSON PartitionValueList where
+  toJSON PartitionValueList' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Values" Data..= values)]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/Permission.hs b/gen/Amazonka/LakeFormation/Types/Permission.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/Permission.hs
@@ -0,0 +1,121 @@
+{-# 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.LakeFormation.Types.Permission
+-- 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.LakeFormation.Types.Permission
+  ( Permission
+      ( ..,
+        Permission_ALL,
+        Permission_ALTER,
+        Permission_ASSOCIATE,
+        Permission_CREATE_DATABASE,
+        Permission_CREATE_TABLE,
+        Permission_CREATE_TAG,
+        Permission_DATA_LOCATION_ACCESS,
+        Permission_DELETE,
+        Permission_DESCRIBE,
+        Permission_DROP,
+        Permission_INSERT,
+        Permission_SELECT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Permission = Permission'
+  { fromPermission ::
+      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 Permission_ALL :: Permission
+pattern Permission_ALL = Permission' "ALL"
+
+pattern Permission_ALTER :: Permission
+pattern Permission_ALTER = Permission' "ALTER"
+
+pattern Permission_ASSOCIATE :: Permission
+pattern Permission_ASSOCIATE = Permission' "ASSOCIATE"
+
+pattern Permission_CREATE_DATABASE :: Permission
+pattern Permission_CREATE_DATABASE = Permission' "CREATE_DATABASE"
+
+pattern Permission_CREATE_TABLE :: Permission
+pattern Permission_CREATE_TABLE = Permission' "CREATE_TABLE"
+
+pattern Permission_CREATE_TAG :: Permission
+pattern Permission_CREATE_TAG = Permission' "CREATE_TAG"
+
+pattern Permission_DATA_LOCATION_ACCESS :: Permission
+pattern Permission_DATA_LOCATION_ACCESS = Permission' "DATA_LOCATION_ACCESS"
+
+pattern Permission_DELETE :: Permission
+pattern Permission_DELETE = Permission' "DELETE"
+
+pattern Permission_DESCRIBE :: Permission
+pattern Permission_DESCRIBE = Permission' "DESCRIBE"
+
+pattern Permission_DROP :: Permission
+pattern Permission_DROP = Permission' "DROP"
+
+pattern Permission_INSERT :: Permission
+pattern Permission_INSERT = Permission' "INSERT"
+
+pattern Permission_SELECT :: Permission
+pattern Permission_SELECT = Permission' "SELECT"
+
+{-# COMPLETE
+  Permission_ALL,
+  Permission_ALTER,
+  Permission_ASSOCIATE,
+  Permission_CREATE_DATABASE,
+  Permission_CREATE_TABLE,
+  Permission_CREATE_TAG,
+  Permission_DATA_LOCATION_ACCESS,
+  Permission_DELETE,
+  Permission_DESCRIBE,
+  Permission_DROP,
+  Permission_INSERT,
+  Permission_SELECT,
+  Permission'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/PermissionType.hs b/gen/Amazonka/LakeFormation/Types/PermissionType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/PermissionType.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.LakeFormation.Types.PermissionType
+-- 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.LakeFormation.Types.PermissionType
+  ( PermissionType
+      ( ..,
+        PermissionType_CELL_FILTER_PERMISSION,
+        PermissionType_COLUMN_PERMISSION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PermissionType = PermissionType'
+  { fromPermissionType ::
+      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 PermissionType_CELL_FILTER_PERMISSION :: PermissionType
+pattern PermissionType_CELL_FILTER_PERMISSION = PermissionType' "CELL_FILTER_PERMISSION"
+
+pattern PermissionType_COLUMN_PERMISSION :: PermissionType
+pattern PermissionType_COLUMN_PERMISSION = PermissionType' "COLUMN_PERMISSION"
+
+{-# COMPLETE
+  PermissionType_CELL_FILTER_PERMISSION,
+  PermissionType_COLUMN_PERMISSION,
+  PermissionType'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/PlanningStatistics.hs b/gen/Amazonka/LakeFormation/Types/PlanningStatistics.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/PlanningStatistics.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.LakeFormation.Types.PlanningStatistics
+-- 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.LakeFormation.Types.PlanningStatistics 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
+
+-- | Statistics related to the processing of a query statement.
+--
+-- /See:/ 'newPlanningStatistics' smart constructor.
+data PlanningStatistics = PlanningStatistics'
+  { -- | An estimate of the data that was scanned in bytes.
+    estimatedDataToScanBytes :: Prelude.Maybe Prelude.Integer,
+    -- | The time that it took to process the request.
+    planningTimeMillis :: Prelude.Maybe Prelude.Integer,
+    -- | The time the request was in queue to be processed.
+    queueTimeMillis :: Prelude.Maybe Prelude.Integer,
+    -- | The number of work units generated.
+    workUnitsGeneratedCount :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PlanningStatistics' 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:
+--
+-- 'estimatedDataToScanBytes', 'planningStatistics_estimatedDataToScanBytes' - An estimate of the data that was scanned in bytes.
+--
+-- 'planningTimeMillis', 'planningStatistics_planningTimeMillis' - The time that it took to process the request.
+--
+-- 'queueTimeMillis', 'planningStatistics_queueTimeMillis' - The time the request was in queue to be processed.
+--
+-- 'workUnitsGeneratedCount', 'planningStatistics_workUnitsGeneratedCount' - The number of work units generated.
+newPlanningStatistics ::
+  PlanningStatistics
+newPlanningStatistics =
+  PlanningStatistics'
+    { estimatedDataToScanBytes =
+        Prelude.Nothing,
+      planningTimeMillis = Prelude.Nothing,
+      queueTimeMillis = Prelude.Nothing,
+      workUnitsGeneratedCount = Prelude.Nothing
+    }
+
+-- | An estimate of the data that was scanned in bytes.
+planningStatistics_estimatedDataToScanBytes :: Lens.Lens' PlanningStatistics (Prelude.Maybe Prelude.Integer)
+planningStatistics_estimatedDataToScanBytes = Lens.lens (\PlanningStatistics' {estimatedDataToScanBytes} -> estimatedDataToScanBytes) (\s@PlanningStatistics' {} a -> s {estimatedDataToScanBytes = a} :: PlanningStatistics)
+
+-- | The time that it took to process the request.
+planningStatistics_planningTimeMillis :: Lens.Lens' PlanningStatistics (Prelude.Maybe Prelude.Integer)
+planningStatistics_planningTimeMillis = Lens.lens (\PlanningStatistics' {planningTimeMillis} -> planningTimeMillis) (\s@PlanningStatistics' {} a -> s {planningTimeMillis = a} :: PlanningStatistics)
+
+-- | The time the request was in queue to be processed.
+planningStatistics_queueTimeMillis :: Lens.Lens' PlanningStatistics (Prelude.Maybe Prelude.Integer)
+planningStatistics_queueTimeMillis = Lens.lens (\PlanningStatistics' {queueTimeMillis} -> queueTimeMillis) (\s@PlanningStatistics' {} a -> s {queueTimeMillis = a} :: PlanningStatistics)
+
+-- | The number of work units generated.
+planningStatistics_workUnitsGeneratedCount :: Lens.Lens' PlanningStatistics (Prelude.Maybe Prelude.Integer)
+planningStatistics_workUnitsGeneratedCount = Lens.lens (\PlanningStatistics' {workUnitsGeneratedCount} -> workUnitsGeneratedCount) (\s@PlanningStatistics' {} a -> s {workUnitsGeneratedCount = a} :: PlanningStatistics)
+
+instance Data.FromJSON PlanningStatistics where
+  parseJSON =
+    Data.withObject
+      "PlanningStatistics"
+      ( \x ->
+          PlanningStatistics'
+            Prelude.<$> (x Data..:? "EstimatedDataToScanBytes")
+            Prelude.<*> (x Data..:? "PlanningTimeMillis")
+            Prelude.<*> (x Data..:? "QueueTimeMillis")
+            Prelude.<*> (x Data..:? "WorkUnitsGeneratedCount")
+      )
+
+instance Prelude.Hashable PlanningStatistics where
+  hashWithSalt _salt PlanningStatistics' {..} =
+    _salt
+      `Prelude.hashWithSalt` estimatedDataToScanBytes
+      `Prelude.hashWithSalt` planningTimeMillis
+      `Prelude.hashWithSalt` queueTimeMillis
+      `Prelude.hashWithSalt` workUnitsGeneratedCount
+
+instance Prelude.NFData PlanningStatistics where
+  rnf PlanningStatistics' {..} =
+    Prelude.rnf estimatedDataToScanBytes
+      `Prelude.seq` Prelude.rnf planningTimeMillis
+      `Prelude.seq` Prelude.rnf queueTimeMillis
+      `Prelude.seq` Prelude.rnf workUnitsGeneratedCount
diff --git a/gen/Amazonka/LakeFormation/Types/PrincipalPermissions.hs b/gen/Amazonka/LakeFormation/Types/PrincipalPermissions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/PrincipalPermissions.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.LakeFormation.Types.PrincipalPermissions
+-- 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.LakeFormation.Types.PrincipalPermissions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.DataLakePrincipal
+import Amazonka.LakeFormation.Types.Permission
+import qualified Amazonka.Prelude as Prelude
+
+-- | Permissions granted to a principal.
+--
+-- /See:/ 'newPrincipalPermissions' smart constructor.
+data PrincipalPermissions = PrincipalPermissions'
+  { -- | The permissions that are granted to the principal.
+    permissions :: Prelude.Maybe [Permission],
+    -- | The principal who is granted permissions.
+    principal :: Prelude.Maybe DataLakePrincipal
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PrincipalPermissions' 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:
+--
+-- 'permissions', 'principalPermissions_permissions' - The permissions that are granted to the principal.
+--
+-- 'principal', 'principalPermissions_principal' - The principal who is granted permissions.
+newPrincipalPermissions ::
+  PrincipalPermissions
+newPrincipalPermissions =
+  PrincipalPermissions'
+    { permissions =
+        Prelude.Nothing,
+      principal = Prelude.Nothing
+    }
+
+-- | The permissions that are granted to the principal.
+principalPermissions_permissions :: Lens.Lens' PrincipalPermissions (Prelude.Maybe [Permission])
+principalPermissions_permissions = Lens.lens (\PrincipalPermissions' {permissions} -> permissions) (\s@PrincipalPermissions' {} a -> s {permissions = a} :: PrincipalPermissions) Prelude.. Lens.mapping Lens.coerced
+
+-- | The principal who is granted permissions.
+principalPermissions_principal :: Lens.Lens' PrincipalPermissions (Prelude.Maybe DataLakePrincipal)
+principalPermissions_principal = Lens.lens (\PrincipalPermissions' {principal} -> principal) (\s@PrincipalPermissions' {} a -> s {principal = a} :: PrincipalPermissions)
+
+instance Data.FromJSON PrincipalPermissions where
+  parseJSON =
+    Data.withObject
+      "PrincipalPermissions"
+      ( \x ->
+          PrincipalPermissions'
+            Prelude.<$> (x Data..:? "Permissions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Principal")
+      )
+
+instance Prelude.Hashable PrincipalPermissions where
+  hashWithSalt _salt PrincipalPermissions' {..} =
+    _salt
+      `Prelude.hashWithSalt` permissions
+      `Prelude.hashWithSalt` principal
+
+instance Prelude.NFData PrincipalPermissions where
+  rnf PrincipalPermissions' {..} =
+    Prelude.rnf permissions
+      `Prelude.seq` Prelude.rnf principal
+
+instance Data.ToJSON PrincipalPermissions where
+  toJSON PrincipalPermissions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Permissions" Data..=) Prelude.<$> permissions,
+            ("Principal" Data..=) Prelude.<$> principal
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/PrincipalResourcePermissions.hs b/gen/Amazonka/LakeFormation/Types/PrincipalResourcePermissions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/PrincipalResourcePermissions.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.LakeFormation.Types.PrincipalResourcePermissions
+-- 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.LakeFormation.Types.PrincipalResourcePermissions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.DataLakePrincipal
+import Amazonka.LakeFormation.Types.DetailsMap
+import Amazonka.LakeFormation.Types.Permission
+import Amazonka.LakeFormation.Types.Resource
+import qualified Amazonka.Prelude as Prelude
+
+-- | The permissions granted or revoked on a resource.
+--
+-- /See:/ 'newPrincipalResourcePermissions' smart constructor.
+data PrincipalResourcePermissions = PrincipalResourcePermissions'
+  { -- | This attribute can be used to return any additional details of
+    -- @PrincipalResourcePermissions@. Currently returns only as a RAM resource
+    -- share ARN.
+    additionalDetails :: Prelude.Maybe DetailsMap,
+    -- | The permissions to be granted or revoked on the resource.
+    permissions :: Prelude.Maybe [Permission],
+    -- | Indicates whether to grant the ability to grant permissions (as a subset
+    -- of permissions granted).
+    permissionsWithGrantOption :: Prelude.Maybe [Permission],
+    -- | The Data Lake principal to be granted or revoked permissions.
+    principal :: Prelude.Maybe DataLakePrincipal,
+    -- | The resource where permissions are to be granted or revoked.
+    resource :: Prelude.Maybe Resource
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PrincipalResourcePermissions' 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:
+--
+-- 'additionalDetails', 'principalResourcePermissions_additionalDetails' - This attribute can be used to return any additional details of
+-- @PrincipalResourcePermissions@. Currently returns only as a RAM resource
+-- share ARN.
+--
+-- 'permissions', 'principalResourcePermissions_permissions' - The permissions to be granted or revoked on the resource.
+--
+-- 'permissionsWithGrantOption', 'principalResourcePermissions_permissionsWithGrantOption' - Indicates whether to grant the ability to grant permissions (as a subset
+-- of permissions granted).
+--
+-- 'principal', 'principalResourcePermissions_principal' - The Data Lake principal to be granted or revoked permissions.
+--
+-- 'resource', 'principalResourcePermissions_resource' - The resource where permissions are to be granted or revoked.
+newPrincipalResourcePermissions ::
+  PrincipalResourcePermissions
+newPrincipalResourcePermissions =
+  PrincipalResourcePermissions'
+    { additionalDetails =
+        Prelude.Nothing,
+      permissions = Prelude.Nothing,
+      permissionsWithGrantOption = Prelude.Nothing,
+      principal = Prelude.Nothing,
+      resource = Prelude.Nothing
+    }
+
+-- | This attribute can be used to return any additional details of
+-- @PrincipalResourcePermissions@. Currently returns only as a RAM resource
+-- share ARN.
+principalResourcePermissions_additionalDetails :: Lens.Lens' PrincipalResourcePermissions (Prelude.Maybe DetailsMap)
+principalResourcePermissions_additionalDetails = Lens.lens (\PrincipalResourcePermissions' {additionalDetails} -> additionalDetails) (\s@PrincipalResourcePermissions' {} a -> s {additionalDetails = a} :: PrincipalResourcePermissions)
+
+-- | The permissions to be granted or revoked on the resource.
+principalResourcePermissions_permissions :: Lens.Lens' PrincipalResourcePermissions (Prelude.Maybe [Permission])
+principalResourcePermissions_permissions = Lens.lens (\PrincipalResourcePermissions' {permissions} -> permissions) (\s@PrincipalResourcePermissions' {} a -> s {permissions = a} :: PrincipalResourcePermissions) Prelude.. Lens.mapping Lens.coerced
+
+-- | Indicates whether to grant the ability to grant permissions (as a subset
+-- of permissions granted).
+principalResourcePermissions_permissionsWithGrantOption :: Lens.Lens' PrincipalResourcePermissions (Prelude.Maybe [Permission])
+principalResourcePermissions_permissionsWithGrantOption = Lens.lens (\PrincipalResourcePermissions' {permissionsWithGrantOption} -> permissionsWithGrantOption) (\s@PrincipalResourcePermissions' {} a -> s {permissionsWithGrantOption = a} :: PrincipalResourcePermissions) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Data Lake principal to be granted or revoked permissions.
+principalResourcePermissions_principal :: Lens.Lens' PrincipalResourcePermissions (Prelude.Maybe DataLakePrincipal)
+principalResourcePermissions_principal = Lens.lens (\PrincipalResourcePermissions' {principal} -> principal) (\s@PrincipalResourcePermissions' {} a -> s {principal = a} :: PrincipalResourcePermissions)
+
+-- | The resource where permissions are to be granted or revoked.
+principalResourcePermissions_resource :: Lens.Lens' PrincipalResourcePermissions (Prelude.Maybe Resource)
+principalResourcePermissions_resource = Lens.lens (\PrincipalResourcePermissions' {resource} -> resource) (\s@PrincipalResourcePermissions' {} a -> s {resource = a} :: PrincipalResourcePermissions)
+
+instance Data.FromJSON PrincipalResourcePermissions where
+  parseJSON =
+    Data.withObject
+      "PrincipalResourcePermissions"
+      ( \x ->
+          PrincipalResourcePermissions'
+            Prelude.<$> (x Data..:? "AdditionalDetails")
+            Prelude.<*> (x Data..:? "Permissions" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "PermissionsWithGrantOption"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "Principal")
+            Prelude.<*> (x Data..:? "Resource")
+      )
+
+instance
+  Prelude.Hashable
+    PrincipalResourcePermissions
+  where
+  hashWithSalt _salt PrincipalResourcePermissions' {..} =
+    _salt
+      `Prelude.hashWithSalt` additionalDetails
+      `Prelude.hashWithSalt` permissions
+      `Prelude.hashWithSalt` permissionsWithGrantOption
+      `Prelude.hashWithSalt` principal
+      `Prelude.hashWithSalt` resource
+
+instance Prelude.NFData PrincipalResourcePermissions where
+  rnf PrincipalResourcePermissions' {..} =
+    Prelude.rnf additionalDetails
+      `Prelude.seq` Prelude.rnf permissions
+      `Prelude.seq` Prelude.rnf permissionsWithGrantOption
+      `Prelude.seq` Prelude.rnf principal
+      `Prelude.seq` Prelude.rnf resource
diff --git a/gen/Amazonka/LakeFormation/Types/QueryPlanningContext.hs b/gen/Amazonka/LakeFormation/Types/QueryPlanningContext.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/QueryPlanningContext.hs
@@ -0,0 +1,143 @@
+{-# 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.LakeFormation.Types.QueryPlanningContext
+-- 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.LakeFormation.Types.QueryPlanningContext 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 structure containing information about the query plan.
+--
+-- /See:/ 'newQueryPlanningContext' smart constructor.
+data QueryPlanningContext = QueryPlanningContext'
+  { -- | The ID of the Data Catalog where the partition in question resides. If
+    -- none is provided, the Amazon Web Services account ID is used by default.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The time as of when to read the table contents. If not set, the most
+    -- recent transaction commit time will be used. Cannot be specified along
+    -- with @TransactionId@.
+    queryAsOfTime :: Prelude.Maybe Data.POSIX,
+    -- | A map consisting of key-value pairs.
+    queryParameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The transaction ID at which to read the table contents. If this
+    -- transaction is not committed, the read will be treated as part of that
+    -- transaction and will see its writes. If this transaction has aborted, an
+    -- error will be returned. If not set, defaults to the most recent
+    -- committed transaction. Cannot be specified along with @QueryAsOfTime@.
+    transactionId :: Prelude.Maybe Prelude.Text,
+    -- | The database containing the table.
+    databaseName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'QueryPlanningContext' 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:
+--
+-- 'catalogId', 'queryPlanningContext_catalogId' - The ID of the Data Catalog where the partition in question resides. If
+-- none is provided, the Amazon Web Services account ID is used by default.
+--
+-- 'queryAsOfTime', 'queryPlanningContext_queryAsOfTime' - The time as of when to read the table contents. If not set, the most
+-- recent transaction commit time will be used. Cannot be specified along
+-- with @TransactionId@.
+--
+-- 'queryParameters', 'queryPlanningContext_queryParameters' - A map consisting of key-value pairs.
+--
+-- 'transactionId', 'queryPlanningContext_transactionId' - The transaction ID at which to read the table contents. If this
+-- transaction is not committed, the read will be treated as part of that
+-- transaction and will see its writes. If this transaction has aborted, an
+-- error will be returned. If not set, defaults to the most recent
+-- committed transaction. Cannot be specified along with @QueryAsOfTime@.
+--
+-- 'databaseName', 'queryPlanningContext_databaseName' - The database containing the table.
+newQueryPlanningContext ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  QueryPlanningContext
+newQueryPlanningContext pDatabaseName_ =
+  QueryPlanningContext'
+    { catalogId = Prelude.Nothing,
+      queryAsOfTime = Prelude.Nothing,
+      queryParameters = Prelude.Nothing,
+      transactionId = Prelude.Nothing,
+      databaseName = pDatabaseName_
+    }
+
+-- | The ID of the Data Catalog where the partition in question resides. If
+-- none is provided, the Amazon Web Services account ID is used by default.
+queryPlanningContext_catalogId :: Lens.Lens' QueryPlanningContext (Prelude.Maybe Prelude.Text)
+queryPlanningContext_catalogId = Lens.lens (\QueryPlanningContext' {catalogId} -> catalogId) (\s@QueryPlanningContext' {} a -> s {catalogId = a} :: QueryPlanningContext)
+
+-- | The time as of when to read the table contents. If not set, the most
+-- recent transaction commit time will be used. Cannot be specified along
+-- with @TransactionId@.
+queryPlanningContext_queryAsOfTime :: Lens.Lens' QueryPlanningContext (Prelude.Maybe Prelude.UTCTime)
+queryPlanningContext_queryAsOfTime = Lens.lens (\QueryPlanningContext' {queryAsOfTime} -> queryAsOfTime) (\s@QueryPlanningContext' {} a -> s {queryAsOfTime = a} :: QueryPlanningContext) Prelude.. Lens.mapping Data._Time
+
+-- | A map consisting of key-value pairs.
+queryPlanningContext_queryParameters :: Lens.Lens' QueryPlanningContext (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+queryPlanningContext_queryParameters = Lens.lens (\QueryPlanningContext' {queryParameters} -> queryParameters) (\s@QueryPlanningContext' {} a -> s {queryParameters = a} :: QueryPlanningContext) Prelude.. Lens.mapping Lens.coerced
+
+-- | The transaction ID at which to read the table contents. If this
+-- transaction is not committed, the read will be treated as part of that
+-- transaction and will see its writes. If this transaction has aborted, an
+-- error will be returned. If not set, defaults to the most recent
+-- committed transaction. Cannot be specified along with @QueryAsOfTime@.
+queryPlanningContext_transactionId :: Lens.Lens' QueryPlanningContext (Prelude.Maybe Prelude.Text)
+queryPlanningContext_transactionId = Lens.lens (\QueryPlanningContext' {transactionId} -> transactionId) (\s@QueryPlanningContext' {} a -> s {transactionId = a} :: QueryPlanningContext)
+
+-- | The database containing the table.
+queryPlanningContext_databaseName :: Lens.Lens' QueryPlanningContext Prelude.Text
+queryPlanningContext_databaseName = Lens.lens (\QueryPlanningContext' {databaseName} -> databaseName) (\s@QueryPlanningContext' {} a -> s {databaseName = a} :: QueryPlanningContext)
+
+instance Prelude.Hashable QueryPlanningContext where
+  hashWithSalt _salt QueryPlanningContext' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` queryAsOfTime
+      `Prelude.hashWithSalt` queryParameters
+      `Prelude.hashWithSalt` transactionId
+      `Prelude.hashWithSalt` databaseName
+
+instance Prelude.NFData QueryPlanningContext where
+  rnf QueryPlanningContext' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf queryAsOfTime
+      `Prelude.seq` Prelude.rnf queryParameters
+      `Prelude.seq` Prelude.rnf transactionId
+      `Prelude.seq` Prelude.rnf databaseName
+
+instance Data.ToJSON QueryPlanningContext where
+  toJSON QueryPlanningContext' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("QueryAsOfTime" Data..=) Prelude.<$> queryAsOfTime,
+            ("QueryParameters" Data..=)
+              Prelude.<$> queryParameters,
+            ("TransactionId" Data..=) Prelude.<$> transactionId,
+            Prelude.Just ("DatabaseName" Data..= databaseName)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/QueryStateString.hs b/gen/Amazonka/LakeFormation/Types/QueryStateString.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/QueryStateString.hs
@@ -0,0 +1,86 @@
+{-# 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.LakeFormation.Types.QueryStateString
+-- 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.LakeFormation.Types.QueryStateString
+  ( QueryStateString
+      ( ..,
+        QueryStateString_ERROR,
+        QueryStateString_EXPIRED,
+        QueryStateString_FINISHED,
+        QueryStateString_PENDING,
+        QueryStateString_WORKUNITS_AVAILABLE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype QueryStateString = QueryStateString'
+  { fromQueryStateString ::
+      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 QueryStateString_ERROR :: QueryStateString
+pattern QueryStateString_ERROR = QueryStateString' "ERROR"
+
+pattern QueryStateString_EXPIRED :: QueryStateString
+pattern QueryStateString_EXPIRED = QueryStateString' "EXPIRED"
+
+pattern QueryStateString_FINISHED :: QueryStateString
+pattern QueryStateString_FINISHED = QueryStateString' "FINISHED"
+
+pattern QueryStateString_PENDING :: QueryStateString
+pattern QueryStateString_PENDING = QueryStateString' "PENDING"
+
+pattern QueryStateString_WORKUNITS_AVAILABLE :: QueryStateString
+pattern QueryStateString_WORKUNITS_AVAILABLE = QueryStateString' "WORKUNITS_AVAILABLE"
+
+{-# COMPLETE
+  QueryStateString_ERROR,
+  QueryStateString_EXPIRED,
+  QueryStateString_FINISHED,
+  QueryStateString_PENDING,
+  QueryStateString_WORKUNITS_AVAILABLE,
+  QueryStateString'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/Resource.hs b/gen/Amazonka/LakeFormation/Types/Resource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/Resource.hs
@@ -0,0 +1,211 @@
+{-# 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.LakeFormation.Types.Resource
+-- 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.LakeFormation.Types.Resource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.CatalogResource
+import Amazonka.LakeFormation.Types.DataCellsFilterResource
+import Amazonka.LakeFormation.Types.DataLocationResource
+import Amazonka.LakeFormation.Types.DatabaseResource
+import Amazonka.LakeFormation.Types.LFTagKeyResource
+import Amazonka.LakeFormation.Types.LFTagPolicyResource
+import Amazonka.LakeFormation.Types.TableResource
+import Amazonka.LakeFormation.Types.TableWithColumnsResource
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure for the resource.
+--
+-- /See:/ 'newResource' smart constructor.
+data Resource = Resource'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalog :: Prelude.Maybe CatalogResource,
+    -- | A data cell filter.
+    dataCellsFilter :: Prelude.Maybe DataCellsFilterResource,
+    -- | The location of an Amazon S3 path where permissions are granted or
+    -- revoked.
+    dataLocation :: Prelude.Maybe DataLocationResource,
+    -- | The database for the resource. Unique to the Data Catalog. A database is
+    -- a set of associated table definitions organized into a logical group.
+    -- You can Grant and Revoke database permissions to a principal.
+    database :: Prelude.Maybe DatabaseResource,
+    -- | The LF-tag key and values attached to a resource.
+    lFTag :: Prelude.Maybe LFTagKeyResource,
+    -- | A list of LF-tag conditions that define a resource\'s LF-tag policy.
+    lFTagPolicy :: Prelude.Maybe LFTagPolicyResource,
+    -- | The table for the resource. A table is a metadata definition that
+    -- represents your data. You can Grant and Revoke table privileges to a
+    -- principal.
+    table :: Prelude.Maybe TableResource,
+    -- | The table with columns for the resource. A principal with permissions to
+    -- this resource can select metadata from the columns of a table in the
+    -- Data Catalog and the underlying data in Amazon S3.
+    tableWithColumns :: Prelude.Maybe TableWithColumnsResource
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Resource' 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:
+--
+-- 'catalog', 'resource_catalog' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'dataCellsFilter', 'resource_dataCellsFilter' - A data cell filter.
+--
+-- 'dataLocation', 'resource_dataLocation' - The location of an Amazon S3 path where permissions are granted or
+-- revoked.
+--
+-- 'database', 'resource_database' - The database for the resource. Unique to the Data Catalog. A database is
+-- a set of associated table definitions organized into a logical group.
+-- You can Grant and Revoke database permissions to a principal.
+--
+-- 'lFTag', 'resource_lFTag' - The LF-tag key and values attached to a resource.
+--
+-- 'lFTagPolicy', 'resource_lFTagPolicy' - A list of LF-tag conditions that define a resource\'s LF-tag policy.
+--
+-- 'table', 'resource_table' - The table for the resource. A table is a metadata definition that
+-- represents your data. You can Grant and Revoke table privileges to a
+-- principal.
+--
+-- 'tableWithColumns', 'resource_tableWithColumns' - The table with columns for the resource. A principal with permissions to
+-- this resource can select metadata from the columns of a table in the
+-- Data Catalog and the underlying data in Amazon S3.
+newResource ::
+  Resource
+newResource =
+  Resource'
+    { catalog = Prelude.Nothing,
+      dataCellsFilter = Prelude.Nothing,
+      dataLocation = Prelude.Nothing,
+      database = Prelude.Nothing,
+      lFTag = Prelude.Nothing,
+      lFTagPolicy = Prelude.Nothing,
+      table = Prelude.Nothing,
+      tableWithColumns = Prelude.Nothing
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+resource_catalog :: Lens.Lens' Resource (Prelude.Maybe CatalogResource)
+resource_catalog = Lens.lens (\Resource' {catalog} -> catalog) (\s@Resource' {} a -> s {catalog = a} :: Resource)
+
+-- | A data cell filter.
+resource_dataCellsFilter :: Lens.Lens' Resource (Prelude.Maybe DataCellsFilterResource)
+resource_dataCellsFilter = Lens.lens (\Resource' {dataCellsFilter} -> dataCellsFilter) (\s@Resource' {} a -> s {dataCellsFilter = a} :: Resource)
+
+-- | The location of an Amazon S3 path where permissions are granted or
+-- revoked.
+resource_dataLocation :: Lens.Lens' Resource (Prelude.Maybe DataLocationResource)
+resource_dataLocation = Lens.lens (\Resource' {dataLocation} -> dataLocation) (\s@Resource' {} a -> s {dataLocation = a} :: Resource)
+
+-- | The database for the resource. Unique to the Data Catalog. A database is
+-- a set of associated table definitions organized into a logical group.
+-- You can Grant and Revoke database permissions to a principal.
+resource_database :: Lens.Lens' Resource (Prelude.Maybe DatabaseResource)
+resource_database = Lens.lens (\Resource' {database} -> database) (\s@Resource' {} a -> s {database = a} :: Resource)
+
+-- | The LF-tag key and values attached to a resource.
+resource_lFTag :: Lens.Lens' Resource (Prelude.Maybe LFTagKeyResource)
+resource_lFTag = Lens.lens (\Resource' {lFTag} -> lFTag) (\s@Resource' {} a -> s {lFTag = a} :: Resource)
+
+-- | A list of LF-tag conditions that define a resource\'s LF-tag policy.
+resource_lFTagPolicy :: Lens.Lens' Resource (Prelude.Maybe LFTagPolicyResource)
+resource_lFTagPolicy = Lens.lens (\Resource' {lFTagPolicy} -> lFTagPolicy) (\s@Resource' {} a -> s {lFTagPolicy = a} :: Resource)
+
+-- | The table for the resource. A table is a metadata definition that
+-- represents your data. You can Grant and Revoke table privileges to a
+-- principal.
+resource_table :: Lens.Lens' Resource (Prelude.Maybe TableResource)
+resource_table = Lens.lens (\Resource' {table} -> table) (\s@Resource' {} a -> s {table = a} :: Resource)
+
+-- | The table with columns for the resource. A principal with permissions to
+-- this resource can select metadata from the columns of a table in the
+-- Data Catalog and the underlying data in Amazon S3.
+resource_tableWithColumns :: Lens.Lens' Resource (Prelude.Maybe TableWithColumnsResource)
+resource_tableWithColumns = Lens.lens (\Resource' {tableWithColumns} -> tableWithColumns) (\s@Resource' {} a -> s {tableWithColumns = a} :: Resource)
+
+instance Data.FromJSON Resource where
+  parseJSON =
+    Data.withObject
+      "Resource"
+      ( \x ->
+          Resource'
+            Prelude.<$> (x Data..:? "Catalog")
+            Prelude.<*> (x Data..:? "DataCellsFilter")
+            Prelude.<*> (x Data..:? "DataLocation")
+            Prelude.<*> (x Data..:? "Database")
+            Prelude.<*> (x Data..:? "LFTag")
+            Prelude.<*> (x Data..:? "LFTagPolicy")
+            Prelude.<*> (x Data..:? "Table")
+            Prelude.<*> (x Data..:? "TableWithColumns")
+      )
+
+instance Prelude.Hashable Resource where
+  hashWithSalt _salt Resource' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalog
+      `Prelude.hashWithSalt` dataCellsFilter
+      `Prelude.hashWithSalt` dataLocation
+      `Prelude.hashWithSalt` database
+      `Prelude.hashWithSalt` lFTag
+      `Prelude.hashWithSalt` lFTagPolicy
+      `Prelude.hashWithSalt` table
+      `Prelude.hashWithSalt` tableWithColumns
+
+instance Prelude.NFData Resource where
+  rnf Resource' {..} =
+    Prelude.rnf catalog
+      `Prelude.seq` Prelude.rnf dataCellsFilter
+      `Prelude.seq` Prelude.rnf dataLocation
+      `Prelude.seq` Prelude.rnf database
+      `Prelude.seq` Prelude.rnf lFTag
+      `Prelude.seq` Prelude.rnf lFTagPolicy
+      `Prelude.seq` Prelude.rnf table
+      `Prelude.seq` Prelude.rnf tableWithColumns
+
+instance Data.ToJSON Resource where
+  toJSON Resource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Catalog" Data..=) Prelude.<$> catalog,
+            ("DataCellsFilter" Data..=)
+              Prelude.<$> dataCellsFilter,
+            ("DataLocation" Data..=) Prelude.<$> dataLocation,
+            ("Database" Data..=) Prelude.<$> database,
+            ("LFTag" Data..=) Prelude.<$> lFTag,
+            ("LFTagPolicy" Data..=) Prelude.<$> lFTagPolicy,
+            ("Table" Data..=) Prelude.<$> table,
+            ("TableWithColumns" Data..=)
+              Prelude.<$> tableWithColumns
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/ResourceInfo.hs b/gen/Amazonka/LakeFormation/Types/ResourceInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/ResourceInfo.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.LakeFormation.Types.ResourceInfo
+-- 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.LakeFormation.Types.ResourceInfo 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 structure containing information about an Lake Formation resource.
+--
+-- /See:/ 'newResourceInfo' smart constructor.
+data ResourceInfo = ResourceInfo'
+  { -- | The date and time the resource was last modified.
+    lastModified :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the resource.
+    resourceArn :: Prelude.Maybe Prelude.Text,
+    -- | The IAM role that registered a resource.
+    roleArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResourceInfo' 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:
+--
+-- 'lastModified', 'resourceInfo_lastModified' - The date and time the resource was last modified.
+--
+-- 'resourceArn', 'resourceInfo_resourceArn' - The Amazon Resource Name (ARN) of the resource.
+--
+-- 'roleArn', 'resourceInfo_roleArn' - The IAM role that registered a resource.
+newResourceInfo ::
+  ResourceInfo
+newResourceInfo =
+  ResourceInfo'
+    { lastModified = Prelude.Nothing,
+      resourceArn = Prelude.Nothing,
+      roleArn = Prelude.Nothing
+    }
+
+-- | The date and time the resource was last modified.
+resourceInfo_lastModified :: Lens.Lens' ResourceInfo (Prelude.Maybe Prelude.UTCTime)
+resourceInfo_lastModified = Lens.lens (\ResourceInfo' {lastModified} -> lastModified) (\s@ResourceInfo' {} a -> s {lastModified = a} :: ResourceInfo) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the resource.
+resourceInfo_resourceArn :: Lens.Lens' ResourceInfo (Prelude.Maybe Prelude.Text)
+resourceInfo_resourceArn = Lens.lens (\ResourceInfo' {resourceArn} -> resourceArn) (\s@ResourceInfo' {} a -> s {resourceArn = a} :: ResourceInfo)
+
+-- | The IAM role that registered a resource.
+resourceInfo_roleArn :: Lens.Lens' ResourceInfo (Prelude.Maybe Prelude.Text)
+resourceInfo_roleArn = Lens.lens (\ResourceInfo' {roleArn} -> roleArn) (\s@ResourceInfo' {} a -> s {roleArn = a} :: ResourceInfo)
+
+instance Data.FromJSON ResourceInfo where
+  parseJSON =
+    Data.withObject
+      "ResourceInfo"
+      ( \x ->
+          ResourceInfo'
+            Prelude.<$> (x Data..:? "LastModified")
+            Prelude.<*> (x Data..:? "ResourceArn")
+            Prelude.<*> (x Data..:? "RoleArn")
+      )
+
+instance Prelude.Hashable ResourceInfo where
+  hashWithSalt _salt ResourceInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` lastModified
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData ResourceInfo where
+  rnf ResourceInfo' {..} =
+    Prelude.rnf lastModified
+      `Prelude.seq` Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf roleArn
diff --git a/gen/Amazonka/LakeFormation/Types/ResourceShareType.hs b/gen/Amazonka/LakeFormation/Types/ResourceShareType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/ResourceShareType.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.LakeFormation.Types.ResourceShareType
+-- 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.LakeFormation.Types.ResourceShareType
+  ( ResourceShareType
+      ( ..,
+        ResourceShareType_ALL,
+        ResourceShareType_FOREIGN
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ResourceShareType = ResourceShareType'
+  { fromResourceShareType ::
+      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 ResourceShareType_ALL :: ResourceShareType
+pattern ResourceShareType_ALL = ResourceShareType' "ALL"
+
+pattern ResourceShareType_FOREIGN :: ResourceShareType
+pattern ResourceShareType_FOREIGN = ResourceShareType' "FOREIGN"
+
+{-# COMPLETE
+  ResourceShareType_ALL,
+  ResourceShareType_FOREIGN,
+  ResourceShareType'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/ResourceType.hs b/gen/Amazonka/LakeFormation/Types/ResourceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/ResourceType.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.LakeFormation.Types.ResourceType
+-- 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.LakeFormation.Types.ResourceType
+  ( ResourceType
+      ( ..,
+        ResourceType_DATABASE,
+        ResourceType_TABLE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ResourceType = ResourceType'
+  { fromResourceType ::
+      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 ResourceType_DATABASE :: ResourceType
+pattern ResourceType_DATABASE = ResourceType' "DATABASE"
+
+pattern ResourceType_TABLE :: ResourceType
+pattern ResourceType_TABLE = ResourceType' "TABLE"
+
+{-# COMPLETE
+  ResourceType_DATABASE,
+  ResourceType_TABLE,
+  ResourceType'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/RowFilter.hs b/gen/Amazonka/LakeFormation/Types/RowFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/RowFilter.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.LakeFormation.Types.RowFilter
+-- 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.LakeFormation.Types.RowFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.AllRowsWildcard
+import qualified Amazonka.Prelude as Prelude
+
+-- | A PartiQL predicate.
+--
+-- /See:/ 'newRowFilter' smart constructor.
+data RowFilter = RowFilter'
+  { -- | A wildcard for all rows.
+    allRowsWildcard :: Prelude.Maybe AllRowsWildcard,
+    -- | A filter expression.
+    filterExpression :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RowFilter' 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:
+--
+-- 'allRowsWildcard', 'rowFilter_allRowsWildcard' - A wildcard for all rows.
+--
+-- 'filterExpression', 'rowFilter_filterExpression' - A filter expression.
+newRowFilter ::
+  RowFilter
+newRowFilter =
+  RowFilter'
+    { allRowsWildcard = Prelude.Nothing,
+      filterExpression = Prelude.Nothing
+    }
+
+-- | A wildcard for all rows.
+rowFilter_allRowsWildcard :: Lens.Lens' RowFilter (Prelude.Maybe AllRowsWildcard)
+rowFilter_allRowsWildcard = Lens.lens (\RowFilter' {allRowsWildcard} -> allRowsWildcard) (\s@RowFilter' {} a -> s {allRowsWildcard = a} :: RowFilter)
+
+-- | A filter expression.
+rowFilter_filterExpression :: Lens.Lens' RowFilter (Prelude.Maybe Prelude.Text)
+rowFilter_filterExpression = Lens.lens (\RowFilter' {filterExpression} -> filterExpression) (\s@RowFilter' {} a -> s {filterExpression = a} :: RowFilter)
+
+instance Data.FromJSON RowFilter where
+  parseJSON =
+    Data.withObject
+      "RowFilter"
+      ( \x ->
+          RowFilter'
+            Prelude.<$> (x Data..:? "AllRowsWildcard")
+            Prelude.<*> (x Data..:? "FilterExpression")
+      )
+
+instance Prelude.Hashable RowFilter where
+  hashWithSalt _salt RowFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` allRowsWildcard
+      `Prelude.hashWithSalt` filterExpression
+
+instance Prelude.NFData RowFilter where
+  rnf RowFilter' {..} =
+    Prelude.rnf allRowsWildcard
+      `Prelude.seq` Prelude.rnf filterExpression
+
+instance Data.ToJSON RowFilter where
+  toJSON RowFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AllRowsWildcard" Data..=)
+              Prelude.<$> allRowsWildcard,
+            ("FilterExpression" Data..=)
+              Prelude.<$> filterExpression
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/StorageOptimizer.hs b/gen/Amazonka/LakeFormation/Types/StorageOptimizer.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/StorageOptimizer.hs
@@ -0,0 +1,152 @@
+{-# 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.LakeFormation.Types.StorageOptimizer
+-- 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.LakeFormation.Types.StorageOptimizer where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.OptimizerType
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure describing the configuration and details of a storage
+-- optimizer.
+--
+-- /See:/ 'newStorageOptimizer' smart constructor.
+data StorageOptimizer = StorageOptimizer'
+  { -- | A map of the storage optimizer configuration. Currently contains only
+    -- one key-value pair: @is_enabled@ indicates true or false for
+    -- acceleration.
+    config :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A message that contains information about any error (if present).
+    --
+    -- When an acceleration result has an enabled status, the error message is
+    -- empty.
+    --
+    -- When an acceleration result has a disabled status, the message describes
+    -- an error or simply indicates \"disabled by the user\".
+    errorMessage :: Prelude.Maybe Prelude.Text,
+    -- | When an acceleration result has an enabled status, contains the details
+    -- of the last job run.
+    lastRunDetails :: Prelude.Maybe Prelude.Text,
+    -- | The specific type of storage optimizer. The supported value is
+    -- @compaction@.
+    storageOptimizerType :: Prelude.Maybe OptimizerType,
+    -- | A message that contains information about any warnings (if present).
+    warnings :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StorageOptimizer' 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:
+--
+-- 'config', 'storageOptimizer_config' - A map of the storage optimizer configuration. Currently contains only
+-- one key-value pair: @is_enabled@ indicates true or false for
+-- acceleration.
+--
+-- 'errorMessage', 'storageOptimizer_errorMessage' - A message that contains information about any error (if present).
+--
+-- When an acceleration result has an enabled status, the error message is
+-- empty.
+--
+-- When an acceleration result has a disabled status, the message describes
+-- an error or simply indicates \"disabled by the user\".
+--
+-- 'lastRunDetails', 'storageOptimizer_lastRunDetails' - When an acceleration result has an enabled status, contains the details
+-- of the last job run.
+--
+-- 'storageOptimizerType', 'storageOptimizer_storageOptimizerType' - The specific type of storage optimizer. The supported value is
+-- @compaction@.
+--
+-- 'warnings', 'storageOptimizer_warnings' - A message that contains information about any warnings (if present).
+newStorageOptimizer ::
+  StorageOptimizer
+newStorageOptimizer =
+  StorageOptimizer'
+    { config = Prelude.Nothing,
+      errorMessage = Prelude.Nothing,
+      lastRunDetails = Prelude.Nothing,
+      storageOptimizerType = Prelude.Nothing,
+      warnings = Prelude.Nothing
+    }
+
+-- | A map of the storage optimizer configuration. Currently contains only
+-- one key-value pair: @is_enabled@ indicates true or false for
+-- acceleration.
+storageOptimizer_config :: Lens.Lens' StorageOptimizer (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+storageOptimizer_config = Lens.lens (\StorageOptimizer' {config} -> config) (\s@StorageOptimizer' {} a -> s {config = a} :: StorageOptimizer) Prelude.. Lens.mapping Lens.coerced
+
+-- | A message that contains information about any error (if present).
+--
+-- When an acceleration result has an enabled status, the error message is
+-- empty.
+--
+-- When an acceleration result has a disabled status, the message describes
+-- an error or simply indicates \"disabled by the user\".
+storageOptimizer_errorMessage :: Lens.Lens' StorageOptimizer (Prelude.Maybe Prelude.Text)
+storageOptimizer_errorMessage = Lens.lens (\StorageOptimizer' {errorMessage} -> errorMessage) (\s@StorageOptimizer' {} a -> s {errorMessage = a} :: StorageOptimizer)
+
+-- | When an acceleration result has an enabled status, contains the details
+-- of the last job run.
+storageOptimizer_lastRunDetails :: Lens.Lens' StorageOptimizer (Prelude.Maybe Prelude.Text)
+storageOptimizer_lastRunDetails = Lens.lens (\StorageOptimizer' {lastRunDetails} -> lastRunDetails) (\s@StorageOptimizer' {} a -> s {lastRunDetails = a} :: StorageOptimizer)
+
+-- | The specific type of storage optimizer. The supported value is
+-- @compaction@.
+storageOptimizer_storageOptimizerType :: Lens.Lens' StorageOptimizer (Prelude.Maybe OptimizerType)
+storageOptimizer_storageOptimizerType = Lens.lens (\StorageOptimizer' {storageOptimizerType} -> storageOptimizerType) (\s@StorageOptimizer' {} a -> s {storageOptimizerType = a} :: StorageOptimizer)
+
+-- | A message that contains information about any warnings (if present).
+storageOptimizer_warnings :: Lens.Lens' StorageOptimizer (Prelude.Maybe Prelude.Text)
+storageOptimizer_warnings = Lens.lens (\StorageOptimizer' {warnings} -> warnings) (\s@StorageOptimizer' {} a -> s {warnings = a} :: StorageOptimizer)
+
+instance Data.FromJSON StorageOptimizer where
+  parseJSON =
+    Data.withObject
+      "StorageOptimizer"
+      ( \x ->
+          StorageOptimizer'
+            Prelude.<$> (x Data..:? "Config" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "ErrorMessage")
+            Prelude.<*> (x Data..:? "LastRunDetails")
+            Prelude.<*> (x Data..:? "StorageOptimizerType")
+            Prelude.<*> (x Data..:? "Warnings")
+      )
+
+instance Prelude.Hashable StorageOptimizer where
+  hashWithSalt _salt StorageOptimizer' {..} =
+    _salt
+      `Prelude.hashWithSalt` config
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` lastRunDetails
+      `Prelude.hashWithSalt` storageOptimizerType
+      `Prelude.hashWithSalt` warnings
+
+instance Prelude.NFData StorageOptimizer where
+  rnf StorageOptimizer' {..} =
+    Prelude.rnf config
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf lastRunDetails
+      `Prelude.seq` Prelude.rnf storageOptimizerType
+      `Prelude.seq` Prelude.rnf warnings
diff --git a/gen/Amazonka/LakeFormation/Types/TableObject.hs b/gen/Amazonka/LakeFormation/Types/TableObject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/TableObject.hs
@@ -0,0 +1,99 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.TableObject
+-- 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.LakeFormation.Types.TableObject 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
+
+-- | Specifies the details of a governed table.
+--
+-- /See:/ 'newTableObject' smart constructor.
+data TableObject = TableObject'
+  { -- | The Amazon S3 ETag of the object. Returned by @GetTableObjects@ for
+    -- validation and used to identify changes to the underlying data.
+    eTag :: Prelude.Maybe Prelude.Text,
+    -- | The size of the Amazon S3 object in bytes.
+    size :: Prelude.Maybe Prelude.Integer,
+    -- | The Amazon S3 location of the object.
+    uri :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TableObject' 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:
+--
+-- 'eTag', 'tableObject_eTag' - The Amazon S3 ETag of the object. Returned by @GetTableObjects@ for
+-- validation and used to identify changes to the underlying data.
+--
+-- 'size', 'tableObject_size' - The size of the Amazon S3 object in bytes.
+--
+-- 'uri', 'tableObject_uri' - The Amazon S3 location of the object.
+newTableObject ::
+  TableObject
+newTableObject =
+  TableObject'
+    { eTag = Prelude.Nothing,
+      size = Prelude.Nothing,
+      uri = Prelude.Nothing
+    }
+
+-- | The Amazon S3 ETag of the object. Returned by @GetTableObjects@ for
+-- validation and used to identify changes to the underlying data.
+tableObject_eTag :: Lens.Lens' TableObject (Prelude.Maybe Prelude.Text)
+tableObject_eTag = Lens.lens (\TableObject' {eTag} -> eTag) (\s@TableObject' {} a -> s {eTag = a} :: TableObject)
+
+-- | The size of the Amazon S3 object in bytes.
+tableObject_size :: Lens.Lens' TableObject (Prelude.Maybe Prelude.Integer)
+tableObject_size = Lens.lens (\TableObject' {size} -> size) (\s@TableObject' {} a -> s {size = a} :: TableObject)
+
+-- | The Amazon S3 location of the object.
+tableObject_uri :: Lens.Lens' TableObject (Prelude.Maybe Prelude.Text)
+tableObject_uri = Lens.lens (\TableObject' {uri} -> uri) (\s@TableObject' {} a -> s {uri = a} :: TableObject)
+
+instance Data.FromJSON TableObject where
+  parseJSON =
+    Data.withObject
+      "TableObject"
+      ( \x ->
+          TableObject'
+            Prelude.<$> (x Data..:? "ETag")
+            Prelude.<*> (x Data..:? "Size")
+            Prelude.<*> (x Data..:? "Uri")
+      )
+
+instance Prelude.Hashable TableObject where
+  hashWithSalt _salt TableObject' {..} =
+    _salt
+      `Prelude.hashWithSalt` eTag
+      `Prelude.hashWithSalt` size
+      `Prelude.hashWithSalt` uri
+
+instance Prelude.NFData TableObject where
+  rnf TableObject' {..} =
+    Prelude.rnf eTag
+      `Prelude.seq` Prelude.rnf size
+      `Prelude.seq` Prelude.rnf uri
diff --git a/gen/Amazonka/LakeFormation/Types/TableResource.hs b/gen/Amazonka/LakeFormation/Types/TableResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/TableResource.hs
@@ -0,0 +1,145 @@
+{-# 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.LakeFormation.Types.TableResource
+-- 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.LakeFormation.Types.TableResource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.TableWildcard
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure for the table object. A table is a metadata definition that
+-- represents your data. You can Grant and Revoke table privileges to a
+-- principal.
+--
+-- /See:/ 'newTableResource' smart constructor.
+data TableResource = TableResource'
+  { -- | The identifier for the Data Catalog. By default, it is the account ID of
+    -- the caller.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the table.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | A wildcard object representing every table under a database.
+    --
+    -- At least one of @TableResource$Name@ or @TableResource$TableWildcard@ is
+    -- required.
+    tableWildcard :: Prelude.Maybe TableWildcard,
+    -- | The name of the database for the table. Unique to a Data Catalog. A
+    -- database is a set of associated table definitions organized into a
+    -- logical group. You can Grant and Revoke database privileges to a
+    -- principal.
+    databaseName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TableResource' 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:
+--
+-- 'catalogId', 'tableResource_catalogId' - The identifier for the Data Catalog. By default, it is the account ID of
+-- the caller.
+--
+-- 'name', 'tableResource_name' - The name of the table.
+--
+-- 'tableWildcard', 'tableResource_tableWildcard' - A wildcard object representing every table under a database.
+--
+-- At least one of @TableResource$Name@ or @TableResource$TableWildcard@ is
+-- required.
+--
+-- 'databaseName', 'tableResource_databaseName' - The name of the database for the table. Unique to a Data Catalog. A
+-- database is a set of associated table definitions organized into a
+-- logical group. You can Grant and Revoke database privileges to a
+-- principal.
+newTableResource ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  TableResource
+newTableResource pDatabaseName_ =
+  TableResource'
+    { catalogId = Prelude.Nothing,
+      name = Prelude.Nothing,
+      tableWildcard = Prelude.Nothing,
+      databaseName = pDatabaseName_
+    }
+
+-- | The identifier for the Data Catalog. By default, it is the account ID of
+-- the caller.
+tableResource_catalogId :: Lens.Lens' TableResource (Prelude.Maybe Prelude.Text)
+tableResource_catalogId = Lens.lens (\TableResource' {catalogId} -> catalogId) (\s@TableResource' {} a -> s {catalogId = a} :: TableResource)
+
+-- | The name of the table.
+tableResource_name :: Lens.Lens' TableResource (Prelude.Maybe Prelude.Text)
+tableResource_name = Lens.lens (\TableResource' {name} -> name) (\s@TableResource' {} a -> s {name = a} :: TableResource)
+
+-- | A wildcard object representing every table under a database.
+--
+-- At least one of @TableResource$Name@ or @TableResource$TableWildcard@ is
+-- required.
+tableResource_tableWildcard :: Lens.Lens' TableResource (Prelude.Maybe TableWildcard)
+tableResource_tableWildcard = Lens.lens (\TableResource' {tableWildcard} -> tableWildcard) (\s@TableResource' {} a -> s {tableWildcard = a} :: TableResource)
+
+-- | The name of the database for the table. Unique to a Data Catalog. A
+-- database is a set of associated table definitions organized into a
+-- logical group. You can Grant and Revoke database privileges to a
+-- principal.
+tableResource_databaseName :: Lens.Lens' TableResource Prelude.Text
+tableResource_databaseName = Lens.lens (\TableResource' {databaseName} -> databaseName) (\s@TableResource' {} a -> s {databaseName = a} :: TableResource)
+
+instance Data.FromJSON TableResource where
+  parseJSON =
+    Data.withObject
+      "TableResource"
+      ( \x ->
+          TableResource'
+            Prelude.<$> (x Data..:? "CatalogId")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "TableWildcard")
+            Prelude.<*> (x Data..: "DatabaseName")
+      )
+
+instance Prelude.Hashable TableResource where
+  hashWithSalt _salt TableResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` tableWildcard
+      `Prelude.hashWithSalt` databaseName
+
+instance Prelude.NFData TableResource where
+  rnf TableResource' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf tableWildcard
+      `Prelude.seq` Prelude.rnf databaseName
+
+instance Data.ToJSON TableResource where
+  toJSON TableResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("Name" Data..=) Prelude.<$> name,
+            ("TableWildcard" Data..=) Prelude.<$> tableWildcard,
+            Prelude.Just ("DatabaseName" Data..= databaseName)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/TableWildcard.hs b/gen/Amazonka/LakeFormation/Types/TableWildcard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/TableWildcard.hs
@@ -0,0 +1,57 @@
+{-# 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.LakeFormation.Types.TableWildcard
+-- 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.LakeFormation.Types.TableWildcard 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 wildcard object representing every table under a database.
+--
+-- /See:/ 'newTableWildcard' smart constructor.
+data TableWildcard = TableWildcard'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TableWildcard' 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.
+newTableWildcard ::
+  TableWildcard
+newTableWildcard = TableWildcard'
+
+instance Data.FromJSON TableWildcard where
+  parseJSON =
+    Data.withObject
+      "TableWildcard"
+      (\x -> Prelude.pure TableWildcard')
+
+instance Prelude.Hashable TableWildcard where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData TableWildcard where
+  rnf _ = ()
+
+instance Data.ToJSON TableWildcard where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
diff --git a/gen/Amazonka/LakeFormation/Types/TableWithColumnsResource.hs b/gen/Amazonka/LakeFormation/Types/TableWithColumnsResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/TableWithColumnsResource.hs
@@ -0,0 +1,167 @@
+{-# 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.LakeFormation.Types.TableWithColumnsResource
+-- 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.LakeFormation.Types.TableWithColumnsResource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.ColumnWildcard
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure for a table with columns object. This object is only used
+-- when granting a SELECT permission.
+--
+-- This object must take a value for at least one of @ColumnsNames@,
+-- @ColumnsIndexes@, or @ColumnsWildcard@.
+--
+-- /See:/ 'newTableWithColumnsResource' smart constructor.
+data TableWithColumnsResource = TableWithColumnsResource'
+  { -- | The identifier for the Data Catalog. By default, it is the account ID of
+    -- the caller.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The list of column names for the table. At least one of @ColumnNames@ or
+    -- @ColumnWildcard@ is required.
+    columnNames :: Prelude.Maybe [Prelude.Text],
+    -- | A wildcard specified by a @ColumnWildcard@ object. At least one of
+    -- @ColumnNames@ or @ColumnWildcard@ is required.
+    columnWildcard :: Prelude.Maybe ColumnWildcard,
+    -- | The name of the database for the table with columns resource. Unique to
+    -- the Data Catalog. A database is a set of associated table definitions
+    -- organized into a logical group. You can Grant and Revoke database
+    -- privileges to a principal.
+    databaseName :: Prelude.Text,
+    -- | The name of the table resource. A table is a metadata definition that
+    -- represents your data. You can Grant and Revoke table privileges to a
+    -- principal.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TableWithColumnsResource' 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:
+--
+-- 'catalogId', 'tableWithColumnsResource_catalogId' - The identifier for the Data Catalog. By default, it is the account ID of
+-- the caller.
+--
+-- 'columnNames', 'tableWithColumnsResource_columnNames' - The list of column names for the table. At least one of @ColumnNames@ or
+-- @ColumnWildcard@ is required.
+--
+-- 'columnWildcard', 'tableWithColumnsResource_columnWildcard' - A wildcard specified by a @ColumnWildcard@ object. At least one of
+-- @ColumnNames@ or @ColumnWildcard@ is required.
+--
+-- 'databaseName', 'tableWithColumnsResource_databaseName' - The name of the database for the table with columns resource. Unique to
+-- the Data Catalog. A database is a set of associated table definitions
+-- organized into a logical group. You can Grant and Revoke database
+-- privileges to a principal.
+--
+-- 'name', 'tableWithColumnsResource_name' - The name of the table resource. A table is a metadata definition that
+-- represents your data. You can Grant and Revoke table privileges to a
+-- principal.
+newTableWithColumnsResource ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  TableWithColumnsResource
+newTableWithColumnsResource pDatabaseName_ pName_ =
+  TableWithColumnsResource'
+    { catalogId =
+        Prelude.Nothing,
+      columnNames = Prelude.Nothing,
+      columnWildcard = Prelude.Nothing,
+      databaseName = pDatabaseName_,
+      name = pName_
+    }
+
+-- | The identifier for the Data Catalog. By default, it is the account ID of
+-- the caller.
+tableWithColumnsResource_catalogId :: Lens.Lens' TableWithColumnsResource (Prelude.Maybe Prelude.Text)
+tableWithColumnsResource_catalogId = Lens.lens (\TableWithColumnsResource' {catalogId} -> catalogId) (\s@TableWithColumnsResource' {} a -> s {catalogId = a} :: TableWithColumnsResource)
+
+-- | The list of column names for the table. At least one of @ColumnNames@ or
+-- @ColumnWildcard@ is required.
+tableWithColumnsResource_columnNames :: Lens.Lens' TableWithColumnsResource (Prelude.Maybe [Prelude.Text])
+tableWithColumnsResource_columnNames = Lens.lens (\TableWithColumnsResource' {columnNames} -> columnNames) (\s@TableWithColumnsResource' {} a -> s {columnNames = a} :: TableWithColumnsResource) Prelude.. Lens.mapping Lens.coerced
+
+-- | A wildcard specified by a @ColumnWildcard@ object. At least one of
+-- @ColumnNames@ or @ColumnWildcard@ is required.
+tableWithColumnsResource_columnWildcard :: Lens.Lens' TableWithColumnsResource (Prelude.Maybe ColumnWildcard)
+tableWithColumnsResource_columnWildcard = Lens.lens (\TableWithColumnsResource' {columnWildcard} -> columnWildcard) (\s@TableWithColumnsResource' {} a -> s {columnWildcard = a} :: TableWithColumnsResource)
+
+-- | The name of the database for the table with columns resource. Unique to
+-- the Data Catalog. A database is a set of associated table definitions
+-- organized into a logical group. You can Grant and Revoke database
+-- privileges to a principal.
+tableWithColumnsResource_databaseName :: Lens.Lens' TableWithColumnsResource Prelude.Text
+tableWithColumnsResource_databaseName = Lens.lens (\TableWithColumnsResource' {databaseName} -> databaseName) (\s@TableWithColumnsResource' {} a -> s {databaseName = a} :: TableWithColumnsResource)
+
+-- | The name of the table resource. A table is a metadata definition that
+-- represents your data. You can Grant and Revoke table privileges to a
+-- principal.
+tableWithColumnsResource_name :: Lens.Lens' TableWithColumnsResource Prelude.Text
+tableWithColumnsResource_name = Lens.lens (\TableWithColumnsResource' {name} -> name) (\s@TableWithColumnsResource' {} a -> s {name = a} :: TableWithColumnsResource)
+
+instance Data.FromJSON TableWithColumnsResource where
+  parseJSON =
+    Data.withObject
+      "TableWithColumnsResource"
+      ( \x ->
+          TableWithColumnsResource'
+            Prelude.<$> (x Data..:? "CatalogId")
+            Prelude.<*> (x Data..:? "ColumnNames" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "ColumnWildcard")
+            Prelude.<*> (x Data..: "DatabaseName")
+            Prelude.<*> (x Data..: "Name")
+      )
+
+instance Prelude.Hashable TableWithColumnsResource where
+  hashWithSalt _salt TableWithColumnsResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` columnNames
+      `Prelude.hashWithSalt` columnWildcard
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData TableWithColumnsResource where
+  rnf TableWithColumnsResource' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf columnNames
+      `Prelude.seq` Prelude.rnf columnWildcard
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON TableWithColumnsResource where
+  toJSON TableWithColumnsResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("ColumnNames" Data..=) Prelude.<$> columnNames,
+            ("ColumnWildcard" Data..=)
+              Prelude.<$> columnWildcard,
+            Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("Name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/TaggedDatabase.hs b/gen/Amazonka/LakeFormation/Types/TaggedDatabase.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/TaggedDatabase.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.TaggedDatabase
+-- 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.LakeFormation.Types.TaggedDatabase where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.DatabaseResource
+import Amazonka.LakeFormation.Types.LFTagPair
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure describing a database resource with LF-tags.
+--
+-- /See:/ 'newTaggedDatabase' smart constructor.
+data TaggedDatabase = TaggedDatabase'
+  { -- | A database that has LF-tags attached to it.
+    database :: Prelude.Maybe DatabaseResource,
+    -- | A list of LF-tags attached to the database.
+    lFTags :: Prelude.Maybe (Prelude.NonEmpty LFTagPair)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TaggedDatabase' 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', 'taggedDatabase_database' - A database that has LF-tags attached to it.
+--
+-- 'lFTags', 'taggedDatabase_lFTags' - A list of LF-tags attached to the database.
+newTaggedDatabase ::
+  TaggedDatabase
+newTaggedDatabase =
+  TaggedDatabase'
+    { database = Prelude.Nothing,
+      lFTags = Prelude.Nothing
+    }
+
+-- | A database that has LF-tags attached to it.
+taggedDatabase_database :: Lens.Lens' TaggedDatabase (Prelude.Maybe DatabaseResource)
+taggedDatabase_database = Lens.lens (\TaggedDatabase' {database} -> database) (\s@TaggedDatabase' {} a -> s {database = a} :: TaggedDatabase)
+
+-- | A list of LF-tags attached to the database.
+taggedDatabase_lFTags :: Lens.Lens' TaggedDatabase (Prelude.Maybe (Prelude.NonEmpty LFTagPair))
+taggedDatabase_lFTags = Lens.lens (\TaggedDatabase' {lFTags} -> lFTags) (\s@TaggedDatabase' {} a -> s {lFTags = a} :: TaggedDatabase) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON TaggedDatabase where
+  parseJSON =
+    Data.withObject
+      "TaggedDatabase"
+      ( \x ->
+          TaggedDatabase'
+            Prelude.<$> (x Data..:? "Database")
+            Prelude.<*> (x Data..:? "LFTags")
+      )
+
+instance Prelude.Hashable TaggedDatabase where
+  hashWithSalt _salt TaggedDatabase' {..} =
+    _salt
+      `Prelude.hashWithSalt` database
+      `Prelude.hashWithSalt` lFTags
+
+instance Prelude.NFData TaggedDatabase where
+  rnf TaggedDatabase' {..} =
+    Prelude.rnf database
+      `Prelude.seq` Prelude.rnf lFTags
diff --git a/gen/Amazonka/LakeFormation/Types/TaggedTable.hs b/gen/Amazonka/LakeFormation/Types/TaggedTable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/TaggedTable.hs
@@ -0,0 +1,114 @@
+{-# 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.LakeFormation.Types.TaggedTable
+-- 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.LakeFormation.Types.TaggedTable where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.ColumnLFTag
+import Amazonka.LakeFormation.Types.LFTagPair
+import Amazonka.LakeFormation.Types.TableResource
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure describing a table resource with LF-tags.
+--
+-- /See:/ 'newTaggedTable' smart constructor.
+data TaggedTable = TaggedTable'
+  { -- | A list of LF-tags attached to the database where the table resides.
+    lFTagOnDatabase :: Prelude.Maybe (Prelude.NonEmpty LFTagPair),
+    -- | A list of LF-tags attached to columns in the table.
+    lFTagsOnColumns :: Prelude.Maybe [ColumnLFTag],
+    -- | A list of LF-tags attached to the table.
+    lFTagsOnTable :: Prelude.Maybe (Prelude.NonEmpty LFTagPair),
+    -- | A table that has LF-tags attached to it.
+    table :: Prelude.Maybe TableResource
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TaggedTable' 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:
+--
+-- 'lFTagOnDatabase', 'taggedTable_lFTagOnDatabase' - A list of LF-tags attached to the database where the table resides.
+--
+-- 'lFTagsOnColumns', 'taggedTable_lFTagsOnColumns' - A list of LF-tags attached to columns in the table.
+--
+-- 'lFTagsOnTable', 'taggedTable_lFTagsOnTable' - A list of LF-tags attached to the table.
+--
+-- 'table', 'taggedTable_table' - A table that has LF-tags attached to it.
+newTaggedTable ::
+  TaggedTable
+newTaggedTable =
+  TaggedTable'
+    { lFTagOnDatabase = Prelude.Nothing,
+      lFTagsOnColumns = Prelude.Nothing,
+      lFTagsOnTable = Prelude.Nothing,
+      table = Prelude.Nothing
+    }
+
+-- | A list of LF-tags attached to the database where the table resides.
+taggedTable_lFTagOnDatabase :: Lens.Lens' TaggedTable (Prelude.Maybe (Prelude.NonEmpty LFTagPair))
+taggedTable_lFTagOnDatabase = Lens.lens (\TaggedTable' {lFTagOnDatabase} -> lFTagOnDatabase) (\s@TaggedTable' {} a -> s {lFTagOnDatabase = a} :: TaggedTable) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of LF-tags attached to columns in the table.
+taggedTable_lFTagsOnColumns :: Lens.Lens' TaggedTable (Prelude.Maybe [ColumnLFTag])
+taggedTable_lFTagsOnColumns = Lens.lens (\TaggedTable' {lFTagsOnColumns} -> lFTagsOnColumns) (\s@TaggedTable' {} a -> s {lFTagsOnColumns = a} :: TaggedTable) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of LF-tags attached to the table.
+taggedTable_lFTagsOnTable :: Lens.Lens' TaggedTable (Prelude.Maybe (Prelude.NonEmpty LFTagPair))
+taggedTable_lFTagsOnTable = Lens.lens (\TaggedTable' {lFTagsOnTable} -> lFTagsOnTable) (\s@TaggedTable' {} a -> s {lFTagsOnTable = a} :: TaggedTable) Prelude.. Lens.mapping Lens.coerced
+
+-- | A table that has LF-tags attached to it.
+taggedTable_table :: Lens.Lens' TaggedTable (Prelude.Maybe TableResource)
+taggedTable_table = Lens.lens (\TaggedTable' {table} -> table) (\s@TaggedTable' {} a -> s {table = a} :: TaggedTable)
+
+instance Data.FromJSON TaggedTable where
+  parseJSON =
+    Data.withObject
+      "TaggedTable"
+      ( \x ->
+          TaggedTable'
+            Prelude.<$> (x Data..:? "LFTagOnDatabase")
+            Prelude.<*> ( x
+                            Data..:? "LFTagsOnColumns"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "LFTagsOnTable")
+            Prelude.<*> (x Data..:? "Table")
+      )
+
+instance Prelude.Hashable TaggedTable where
+  hashWithSalt _salt TaggedTable' {..} =
+    _salt
+      `Prelude.hashWithSalt` lFTagOnDatabase
+      `Prelude.hashWithSalt` lFTagsOnColumns
+      `Prelude.hashWithSalt` lFTagsOnTable
+      `Prelude.hashWithSalt` table
+
+instance Prelude.NFData TaggedTable where
+  rnf TaggedTable' {..} =
+    Prelude.rnf lFTagOnDatabase
+      `Prelude.seq` Prelude.rnf lFTagsOnColumns
+      `Prelude.seq` Prelude.rnf lFTagsOnTable
+      `Prelude.seq` Prelude.rnf table
diff --git a/gen/Amazonka/LakeFormation/Types/TransactionDescription.hs b/gen/Amazonka/LakeFormation/Types/TransactionDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/TransactionDescription.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.TransactionDescription
+-- 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.LakeFormation.Types.TransactionDescription where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.TransactionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | A structure that contains information about a transaction.
+--
+-- /See:/ 'newTransactionDescription' smart constructor.
+data TransactionDescription = TransactionDescription'
+  { -- | The time when the transaction committed or aborted, if it is not
+    -- currently active.
+    transactionEndTime :: Prelude.Maybe Data.POSIX,
+    -- | The ID of the transaction.
+    transactionId :: Prelude.Maybe Prelude.Text,
+    -- | The time when the transaction started.
+    transactionStartTime :: Prelude.Maybe Data.POSIX,
+    -- | A status of ACTIVE, COMMITTED, or ABORTED.
+    transactionStatus :: Prelude.Maybe TransactionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TransactionDescription' 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:
+--
+-- 'transactionEndTime', 'transactionDescription_transactionEndTime' - The time when the transaction committed or aborted, if it is not
+-- currently active.
+--
+-- 'transactionId', 'transactionDescription_transactionId' - The ID of the transaction.
+--
+-- 'transactionStartTime', 'transactionDescription_transactionStartTime' - The time when the transaction started.
+--
+-- 'transactionStatus', 'transactionDescription_transactionStatus' - A status of ACTIVE, COMMITTED, or ABORTED.
+newTransactionDescription ::
+  TransactionDescription
+newTransactionDescription =
+  TransactionDescription'
+    { transactionEndTime =
+        Prelude.Nothing,
+      transactionId = Prelude.Nothing,
+      transactionStartTime = Prelude.Nothing,
+      transactionStatus = Prelude.Nothing
+    }
+
+-- | The time when the transaction committed or aborted, if it is not
+-- currently active.
+transactionDescription_transactionEndTime :: Lens.Lens' TransactionDescription (Prelude.Maybe Prelude.UTCTime)
+transactionDescription_transactionEndTime = Lens.lens (\TransactionDescription' {transactionEndTime} -> transactionEndTime) (\s@TransactionDescription' {} a -> s {transactionEndTime = a} :: TransactionDescription) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the transaction.
+transactionDescription_transactionId :: Lens.Lens' TransactionDescription (Prelude.Maybe Prelude.Text)
+transactionDescription_transactionId = Lens.lens (\TransactionDescription' {transactionId} -> transactionId) (\s@TransactionDescription' {} a -> s {transactionId = a} :: TransactionDescription)
+
+-- | The time when the transaction started.
+transactionDescription_transactionStartTime :: Lens.Lens' TransactionDescription (Prelude.Maybe Prelude.UTCTime)
+transactionDescription_transactionStartTime = Lens.lens (\TransactionDescription' {transactionStartTime} -> transactionStartTime) (\s@TransactionDescription' {} a -> s {transactionStartTime = a} :: TransactionDescription) Prelude.. Lens.mapping Data._Time
+
+-- | A status of ACTIVE, COMMITTED, or ABORTED.
+transactionDescription_transactionStatus :: Lens.Lens' TransactionDescription (Prelude.Maybe TransactionStatus)
+transactionDescription_transactionStatus = Lens.lens (\TransactionDescription' {transactionStatus} -> transactionStatus) (\s@TransactionDescription' {} a -> s {transactionStatus = a} :: TransactionDescription)
+
+instance Data.FromJSON TransactionDescription where
+  parseJSON =
+    Data.withObject
+      "TransactionDescription"
+      ( \x ->
+          TransactionDescription'
+            Prelude.<$> (x Data..:? "TransactionEndTime")
+            Prelude.<*> (x Data..:? "TransactionId")
+            Prelude.<*> (x Data..:? "TransactionStartTime")
+            Prelude.<*> (x Data..:? "TransactionStatus")
+      )
+
+instance Prelude.Hashable TransactionDescription where
+  hashWithSalt _salt TransactionDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` transactionEndTime
+      `Prelude.hashWithSalt` transactionId
+      `Prelude.hashWithSalt` transactionStartTime
+      `Prelude.hashWithSalt` transactionStatus
+
+instance Prelude.NFData TransactionDescription where
+  rnf TransactionDescription' {..} =
+    Prelude.rnf transactionEndTime
+      `Prelude.seq` Prelude.rnf transactionId
+      `Prelude.seq` Prelude.rnf transactionStartTime
+      `Prelude.seq` Prelude.rnf transactionStatus
diff --git a/gen/Amazonka/LakeFormation/Types/TransactionStatus.hs b/gen/Amazonka/LakeFormation/Types/TransactionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/TransactionStatus.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.LakeFormation.Types.TransactionStatus
+-- 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.LakeFormation.Types.TransactionStatus
+  ( TransactionStatus
+      ( ..,
+        TransactionStatus_ABORTED,
+        TransactionStatus_ACTIVE,
+        TransactionStatus_COMMITTED,
+        TransactionStatus_COMMIT_IN_PROGRESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TransactionStatus = TransactionStatus'
+  { fromTransactionStatus ::
+      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 TransactionStatus_ABORTED :: TransactionStatus
+pattern TransactionStatus_ABORTED = TransactionStatus' "ABORTED"
+
+pattern TransactionStatus_ACTIVE :: TransactionStatus
+pattern TransactionStatus_ACTIVE = TransactionStatus' "ACTIVE"
+
+pattern TransactionStatus_COMMITTED :: TransactionStatus
+pattern TransactionStatus_COMMITTED = TransactionStatus' "COMMITTED"
+
+pattern TransactionStatus_COMMIT_IN_PROGRESS :: TransactionStatus
+pattern TransactionStatus_COMMIT_IN_PROGRESS = TransactionStatus' "COMMIT_IN_PROGRESS"
+
+{-# COMPLETE
+  TransactionStatus_ABORTED,
+  TransactionStatus_ACTIVE,
+  TransactionStatus_COMMITTED,
+  TransactionStatus_COMMIT_IN_PROGRESS,
+  TransactionStatus'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/TransactionStatusFilter.hs b/gen/Amazonka/LakeFormation/Types/TransactionStatusFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/TransactionStatusFilter.hs
@@ -0,0 +1,86 @@
+{-# 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.LakeFormation.Types.TransactionStatusFilter
+-- 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.LakeFormation.Types.TransactionStatusFilter
+  ( TransactionStatusFilter
+      ( ..,
+        TransactionStatusFilter_ABORTED,
+        TransactionStatusFilter_ACTIVE,
+        TransactionStatusFilter_ALL,
+        TransactionStatusFilter_COMMITTED,
+        TransactionStatusFilter_COMPLETED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TransactionStatusFilter = TransactionStatusFilter'
+  { fromTransactionStatusFilter ::
+      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 TransactionStatusFilter_ABORTED :: TransactionStatusFilter
+pattern TransactionStatusFilter_ABORTED = TransactionStatusFilter' "ABORTED"
+
+pattern TransactionStatusFilter_ACTIVE :: TransactionStatusFilter
+pattern TransactionStatusFilter_ACTIVE = TransactionStatusFilter' "ACTIVE"
+
+pattern TransactionStatusFilter_ALL :: TransactionStatusFilter
+pattern TransactionStatusFilter_ALL = TransactionStatusFilter' "ALL"
+
+pattern TransactionStatusFilter_COMMITTED :: TransactionStatusFilter
+pattern TransactionStatusFilter_COMMITTED = TransactionStatusFilter' "COMMITTED"
+
+pattern TransactionStatusFilter_COMPLETED :: TransactionStatusFilter
+pattern TransactionStatusFilter_COMPLETED = TransactionStatusFilter' "COMPLETED"
+
+{-# COMPLETE
+  TransactionStatusFilter_ABORTED,
+  TransactionStatusFilter_ACTIVE,
+  TransactionStatusFilter_ALL,
+  TransactionStatusFilter_COMMITTED,
+  TransactionStatusFilter_COMPLETED,
+  TransactionStatusFilter'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/TransactionType.hs b/gen/Amazonka/LakeFormation/Types/TransactionType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/TransactionType.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.LakeFormation.Types.TransactionType
+-- 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.LakeFormation.Types.TransactionType
+  ( TransactionType
+      ( ..,
+        TransactionType_READ_AND_WRITE,
+        TransactionType_READ_ONLY
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TransactionType = TransactionType'
+  { fromTransactionType ::
+      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 TransactionType_READ_AND_WRITE :: TransactionType
+pattern TransactionType_READ_AND_WRITE = TransactionType' "READ_AND_WRITE"
+
+pattern TransactionType_READ_ONLY :: TransactionType
+pattern TransactionType_READ_ONLY = TransactionType' "READ_ONLY"
+
+{-# COMPLETE
+  TransactionType_READ_AND_WRITE,
+  TransactionType_READ_ONLY,
+  TransactionType'
+  #-}
diff --git a/gen/Amazonka/LakeFormation/Types/VirtualObject.hs b/gen/Amazonka/LakeFormation/Types/VirtualObject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/VirtualObject.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.VirtualObject
+-- 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.LakeFormation.Types.VirtualObject where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that defines an Amazon S3 object to be deleted if a
+-- transaction cancels, provided that @VirtualPut@ was called before
+-- writing the object.
+--
+-- /See:/ 'newVirtualObject' smart constructor.
+data VirtualObject = VirtualObject'
+  { -- | The ETag of the Amazon S3 object.
+    eTag :: Prelude.Maybe Prelude.Text,
+    -- | The path to the Amazon S3 object. Must start with s3:\/\/
+    uri :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualObject' 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:
+--
+-- 'eTag', 'virtualObject_eTag' - The ETag of the Amazon S3 object.
+--
+-- 'uri', 'virtualObject_uri' - The path to the Amazon S3 object. Must start with s3:\/\/
+newVirtualObject ::
+  -- | 'uri'
+  Prelude.Text ->
+  VirtualObject
+newVirtualObject pUri_ =
+  VirtualObject' {eTag = Prelude.Nothing, uri = pUri_}
+
+-- | The ETag of the Amazon S3 object.
+virtualObject_eTag :: Lens.Lens' VirtualObject (Prelude.Maybe Prelude.Text)
+virtualObject_eTag = Lens.lens (\VirtualObject' {eTag} -> eTag) (\s@VirtualObject' {} a -> s {eTag = a} :: VirtualObject)
+
+-- | The path to the Amazon S3 object. Must start with s3:\/\/
+virtualObject_uri :: Lens.Lens' VirtualObject Prelude.Text
+virtualObject_uri = Lens.lens (\VirtualObject' {uri} -> uri) (\s@VirtualObject' {} a -> s {uri = a} :: VirtualObject)
+
+instance Prelude.Hashable VirtualObject where
+  hashWithSalt _salt VirtualObject' {..} =
+    _salt
+      `Prelude.hashWithSalt` eTag
+      `Prelude.hashWithSalt` uri
+
+instance Prelude.NFData VirtualObject where
+  rnf VirtualObject' {..} =
+    Prelude.rnf eTag `Prelude.seq` Prelude.rnf uri
+
+instance Data.ToJSON VirtualObject where
+  toJSON VirtualObject' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ETag" Data..=) Prelude.<$> eTag,
+            Prelude.Just ("Uri" Data..= uri)
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/Types/WorkUnitRange.hs b/gen/Amazonka/LakeFormation/Types/WorkUnitRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/WorkUnitRange.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.LakeFormation.Types.WorkUnitRange
+-- 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.LakeFormation.Types.WorkUnitRange 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
+
+-- | Defines the valid range of work unit IDs for querying the execution
+-- service.
+--
+-- /See:/ 'newWorkUnitRange' smart constructor.
+data WorkUnitRange = WorkUnitRange'
+  { -- | Defines the maximum work unit ID in the range. The maximum value is
+    -- inclusive.
+    workUnitIdMax :: Prelude.Integer,
+    -- | Defines the minimum work unit ID in the range.
+    workUnitIdMin :: Prelude.Integer,
+    -- | A work token used to query the execution service.
+    workUnitToken :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'WorkUnitRange' 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:
+--
+-- 'workUnitIdMax', 'workUnitRange_workUnitIdMax' - Defines the maximum work unit ID in the range. The maximum value is
+-- inclusive.
+--
+-- 'workUnitIdMin', 'workUnitRange_workUnitIdMin' - Defines the minimum work unit ID in the range.
+--
+-- 'workUnitToken', 'workUnitRange_workUnitToken' - A work token used to query the execution service.
+newWorkUnitRange ::
+  -- | 'workUnitIdMax'
+  Prelude.Integer ->
+  -- | 'workUnitIdMin'
+  Prelude.Integer ->
+  -- | 'workUnitToken'
+  Prelude.Text ->
+  WorkUnitRange
+newWorkUnitRange
+  pWorkUnitIdMax_
+  pWorkUnitIdMin_
+  pWorkUnitToken_ =
+    WorkUnitRange'
+      { workUnitIdMax = pWorkUnitIdMax_,
+        workUnitIdMin = pWorkUnitIdMin_,
+        workUnitToken = pWorkUnitToken_
+      }
+
+-- | Defines the maximum work unit ID in the range. The maximum value is
+-- inclusive.
+workUnitRange_workUnitIdMax :: Lens.Lens' WorkUnitRange Prelude.Integer
+workUnitRange_workUnitIdMax = Lens.lens (\WorkUnitRange' {workUnitIdMax} -> workUnitIdMax) (\s@WorkUnitRange' {} a -> s {workUnitIdMax = a} :: WorkUnitRange)
+
+-- | Defines the minimum work unit ID in the range.
+workUnitRange_workUnitIdMin :: Lens.Lens' WorkUnitRange Prelude.Integer
+workUnitRange_workUnitIdMin = Lens.lens (\WorkUnitRange' {workUnitIdMin} -> workUnitIdMin) (\s@WorkUnitRange' {} a -> s {workUnitIdMin = a} :: WorkUnitRange)
+
+-- | A work token used to query the execution service.
+workUnitRange_workUnitToken :: Lens.Lens' WorkUnitRange Prelude.Text
+workUnitRange_workUnitToken = Lens.lens (\WorkUnitRange' {workUnitToken} -> workUnitToken) (\s@WorkUnitRange' {} a -> s {workUnitToken = a} :: WorkUnitRange)
+
+instance Data.FromJSON WorkUnitRange where
+  parseJSON =
+    Data.withObject
+      "WorkUnitRange"
+      ( \x ->
+          WorkUnitRange'
+            Prelude.<$> (x Data..: "WorkUnitIdMax")
+            Prelude.<*> (x Data..: "WorkUnitIdMin")
+            Prelude.<*> (x Data..: "WorkUnitToken")
+      )
+
+instance Prelude.Hashable WorkUnitRange where
+  hashWithSalt _salt WorkUnitRange' {..} =
+    _salt
+      `Prelude.hashWithSalt` workUnitIdMax
+      `Prelude.hashWithSalt` workUnitIdMin
+      `Prelude.hashWithSalt` workUnitToken
+
+instance Prelude.NFData WorkUnitRange where
+  rnf WorkUnitRange' {..} =
+    Prelude.rnf workUnitIdMax
+      `Prelude.seq` Prelude.rnf workUnitIdMin
+      `Prelude.seq` Prelude.rnf workUnitToken
diff --git a/gen/Amazonka/LakeFormation/Types/WriteOperation.hs b/gen/Amazonka/LakeFormation/Types/WriteOperation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/Types/WriteOperation.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.Types.WriteOperation
+-- 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.LakeFormation.Types.WriteOperation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types.AddObjectInput
+import Amazonka.LakeFormation.Types.DeleteObjectInput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Defines an object to add to or delete from a governed table.
+--
+-- /See:/ 'newWriteOperation' smart constructor.
+data WriteOperation = WriteOperation'
+  { -- | A new object to add to the governed table.
+    addObject :: Prelude.Maybe AddObjectInput,
+    -- | An object to delete from the governed table.
+    deleteObject :: Prelude.Maybe DeleteObjectInput
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'WriteOperation' 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:
+--
+-- 'addObject', 'writeOperation_addObject' - A new object to add to the governed table.
+--
+-- 'deleteObject', 'writeOperation_deleteObject' - An object to delete from the governed table.
+newWriteOperation ::
+  WriteOperation
+newWriteOperation =
+  WriteOperation'
+    { addObject = Prelude.Nothing,
+      deleteObject = Prelude.Nothing
+    }
+
+-- | A new object to add to the governed table.
+writeOperation_addObject :: Lens.Lens' WriteOperation (Prelude.Maybe AddObjectInput)
+writeOperation_addObject = Lens.lens (\WriteOperation' {addObject} -> addObject) (\s@WriteOperation' {} a -> s {addObject = a} :: WriteOperation)
+
+-- | An object to delete from the governed table.
+writeOperation_deleteObject :: Lens.Lens' WriteOperation (Prelude.Maybe DeleteObjectInput)
+writeOperation_deleteObject = Lens.lens (\WriteOperation' {deleteObject} -> deleteObject) (\s@WriteOperation' {} a -> s {deleteObject = a} :: WriteOperation)
+
+instance Prelude.Hashable WriteOperation where
+  hashWithSalt _salt WriteOperation' {..} =
+    _salt
+      `Prelude.hashWithSalt` addObject
+      `Prelude.hashWithSalt` deleteObject
+
+instance Prelude.NFData WriteOperation where
+  rnf WriteOperation' {..} =
+    Prelude.rnf addObject
+      `Prelude.seq` Prelude.rnf deleteObject
+
+instance Data.ToJSON WriteOperation where
+  toJSON WriteOperation' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AddObject" Data..=) Prelude.<$> addObject,
+            ("DeleteObject" Data..=) Prelude.<$> deleteObject
+          ]
+      )
diff --git a/gen/Amazonka/LakeFormation/UpdateLFTag.hs b/gen/Amazonka/LakeFormation/UpdateLFTag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/UpdateLFTag.hs
@@ -0,0 +1,206 @@
+{-# 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.LakeFormation.UpdateLFTag
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the list of possible values for the specified LF-tag key. If the
+-- LF-tag does not exist, the operation throws an EntityNotFoundException.
+-- The values in the delete key values will be deleted from list of
+-- possible values. If any value in the delete key values is attached to a
+-- resource, then API errors out with a 400 Exception - \"Update not
+-- allowed\". Untag the attribute before deleting the LF-tag key\'s value.
+module Amazonka.LakeFormation.UpdateLFTag
+  ( -- * Creating a Request
+    UpdateLFTag (..),
+    newUpdateLFTag,
+
+    -- * Request Lenses
+    updateLFTag_catalogId,
+    updateLFTag_tagValuesToAdd,
+    updateLFTag_tagValuesToDelete,
+    updateLFTag_tagKey,
+
+    -- * Destructuring the Response
+    UpdateLFTagResponse (..),
+    newUpdateLFTagResponse,
+
+    -- * Response Lenses
+    updateLFTagResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateLFTag' smart constructor.
+data UpdateLFTag = UpdateLFTag'
+  { -- | The identifier for the Data Catalog. By default, the account ID. The
+    -- Data Catalog is the persistent metadata store. It contains database
+    -- definitions, table definitions, and other control information to manage
+    -- your Lake Formation environment.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | A list of LF-tag values to add from the LF-tag.
+    tagValuesToAdd :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | A list of LF-tag values to delete from the LF-tag.
+    tagValuesToDelete :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The key-name for the LF-tag for which to add or delete values.
+    tagKey :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateLFTag' 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:
+--
+-- 'catalogId', 'updateLFTag_catalogId' - The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+--
+-- 'tagValuesToAdd', 'updateLFTag_tagValuesToAdd' - A list of LF-tag values to add from the LF-tag.
+--
+-- 'tagValuesToDelete', 'updateLFTag_tagValuesToDelete' - A list of LF-tag values to delete from the LF-tag.
+--
+-- 'tagKey', 'updateLFTag_tagKey' - The key-name for the LF-tag for which to add or delete values.
+newUpdateLFTag ::
+  -- | 'tagKey'
+  Prelude.Text ->
+  UpdateLFTag
+newUpdateLFTag pTagKey_ =
+  UpdateLFTag'
+    { catalogId = Prelude.Nothing,
+      tagValuesToAdd = Prelude.Nothing,
+      tagValuesToDelete = Prelude.Nothing,
+      tagKey = pTagKey_
+    }
+
+-- | The identifier for the Data Catalog. By default, the account ID. The
+-- Data Catalog is the persistent metadata store. It contains database
+-- definitions, table definitions, and other control information to manage
+-- your Lake Formation environment.
+updateLFTag_catalogId :: Lens.Lens' UpdateLFTag (Prelude.Maybe Prelude.Text)
+updateLFTag_catalogId = Lens.lens (\UpdateLFTag' {catalogId} -> catalogId) (\s@UpdateLFTag' {} a -> s {catalogId = a} :: UpdateLFTag)
+
+-- | A list of LF-tag values to add from the LF-tag.
+updateLFTag_tagValuesToAdd :: Lens.Lens' UpdateLFTag (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+updateLFTag_tagValuesToAdd = Lens.lens (\UpdateLFTag' {tagValuesToAdd} -> tagValuesToAdd) (\s@UpdateLFTag' {} a -> s {tagValuesToAdd = a} :: UpdateLFTag) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of LF-tag values to delete from the LF-tag.
+updateLFTag_tagValuesToDelete :: Lens.Lens' UpdateLFTag (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+updateLFTag_tagValuesToDelete = Lens.lens (\UpdateLFTag' {tagValuesToDelete} -> tagValuesToDelete) (\s@UpdateLFTag' {} a -> s {tagValuesToDelete = a} :: UpdateLFTag) Prelude.. Lens.mapping Lens.coerced
+
+-- | The key-name for the LF-tag for which to add or delete values.
+updateLFTag_tagKey :: Lens.Lens' UpdateLFTag Prelude.Text
+updateLFTag_tagKey = Lens.lens (\UpdateLFTag' {tagKey} -> tagKey) (\s@UpdateLFTag' {} a -> s {tagKey = a} :: UpdateLFTag)
+
+instance Core.AWSRequest UpdateLFTag where
+  type AWSResponse UpdateLFTag = UpdateLFTagResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateLFTagResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateLFTag where
+  hashWithSalt _salt UpdateLFTag' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` tagValuesToAdd
+      `Prelude.hashWithSalt` tagValuesToDelete
+      `Prelude.hashWithSalt` tagKey
+
+instance Prelude.NFData UpdateLFTag where
+  rnf UpdateLFTag' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf tagValuesToAdd
+      `Prelude.seq` Prelude.rnf tagValuesToDelete
+      `Prelude.seq` Prelude.rnf tagKey
+
+instance Data.ToHeaders UpdateLFTag where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateLFTag where
+  toJSON UpdateLFTag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("TagValuesToAdd" Data..=)
+              Prelude.<$> tagValuesToAdd,
+            ("TagValuesToDelete" Data..=)
+              Prelude.<$> tagValuesToDelete,
+            Prelude.Just ("TagKey" Data..= tagKey)
+          ]
+      )
+
+instance Data.ToPath UpdateLFTag where
+  toPath = Prelude.const "/UpdateLFTag"
+
+instance Data.ToQuery UpdateLFTag where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateLFTagResponse' smart constructor.
+data UpdateLFTagResponse = UpdateLFTagResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateLFTagResponse' 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', 'updateLFTagResponse_httpStatus' - The response's http status code.
+newUpdateLFTagResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateLFTagResponse
+newUpdateLFTagResponse pHttpStatus_ =
+  UpdateLFTagResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+updateLFTagResponse_httpStatus :: Lens.Lens' UpdateLFTagResponse Prelude.Int
+updateLFTagResponse_httpStatus = Lens.lens (\UpdateLFTagResponse' {httpStatus} -> httpStatus) (\s@UpdateLFTagResponse' {} a -> s {httpStatus = a} :: UpdateLFTagResponse)
+
+instance Prelude.NFData UpdateLFTagResponse where
+  rnf UpdateLFTagResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/UpdateResource.hs b/gen/Amazonka/LakeFormation/UpdateResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/UpdateResource.hs
@@ -0,0 +1,170 @@
+{-# 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.LakeFormation.UpdateResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the data access role used for vending access to the given
+-- (registered) resource in Lake Formation.
+module Amazonka.LakeFormation.UpdateResource
+  ( -- * Creating a Request
+    UpdateResource (..),
+    newUpdateResource,
+
+    -- * Request Lenses
+    updateResource_roleArn,
+    updateResource_resourceArn,
+
+    -- * Destructuring the Response
+    UpdateResourceResponse (..),
+    newUpdateResourceResponse,
+
+    -- * Response Lenses
+    updateResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateResource' smart constructor.
+data UpdateResource = UpdateResource'
+  { -- | The new role to use for the given resource registered in Lake Formation.
+    roleArn :: Prelude.Text,
+    -- | The resource ARN.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateResource' 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:
+--
+-- 'roleArn', 'updateResource_roleArn' - The new role to use for the given resource registered in Lake Formation.
+--
+-- 'resourceArn', 'updateResource_resourceArn' - The resource ARN.
+newUpdateResource ::
+  -- | 'roleArn'
+  Prelude.Text ->
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UpdateResource
+newUpdateResource pRoleArn_ pResourceArn_ =
+  UpdateResource'
+    { roleArn = pRoleArn_,
+      resourceArn = pResourceArn_
+    }
+
+-- | The new role to use for the given resource registered in Lake Formation.
+updateResource_roleArn :: Lens.Lens' UpdateResource Prelude.Text
+updateResource_roleArn = Lens.lens (\UpdateResource' {roleArn} -> roleArn) (\s@UpdateResource' {} a -> s {roleArn = a} :: UpdateResource)
+
+-- | The resource ARN.
+updateResource_resourceArn :: Lens.Lens' UpdateResource Prelude.Text
+updateResource_resourceArn = Lens.lens (\UpdateResource' {resourceArn} -> resourceArn) (\s@UpdateResource' {} a -> s {resourceArn = a} :: UpdateResource)
+
+instance Core.AWSRequest UpdateResource where
+  type
+    AWSResponse UpdateResource =
+      UpdateResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateResource where
+  hashWithSalt _salt UpdateResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData UpdateResource where
+  rnf UpdateResource' {..} =
+    Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf resourceArn
+
+instance Data.ToHeaders UpdateResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateResource where
+  toJSON UpdateResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("RoleArn" Data..= roleArn),
+            Prelude.Just ("ResourceArn" Data..= resourceArn)
+          ]
+      )
+
+instance Data.ToPath UpdateResource where
+  toPath = Prelude.const "/UpdateResource"
+
+instance Data.ToQuery UpdateResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateResourceResponse' smart constructor.
+data UpdateResourceResponse = UpdateResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateResourceResponse' 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', 'updateResourceResponse_httpStatus' - The response's http status code.
+newUpdateResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateResourceResponse
+newUpdateResourceResponse pHttpStatus_ =
+  UpdateResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+updateResourceResponse_httpStatus :: Lens.Lens' UpdateResourceResponse Prelude.Int
+updateResourceResponse_httpStatus = Lens.lens (\UpdateResourceResponse' {httpStatus} -> httpStatus) (\s@UpdateResourceResponse' {} a -> s {httpStatus = a} :: UpdateResourceResponse)
+
+instance Prelude.NFData UpdateResourceResponse where
+  rnf UpdateResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/UpdateTableObjects.hs b/gen/Amazonka/LakeFormation/UpdateTableObjects.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/UpdateTableObjects.hs
@@ -0,0 +1,225 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.LakeFormation.UpdateTableObjects
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the manifest of Amazon S3 objects that make up the specified
+-- governed table.
+module Amazonka.LakeFormation.UpdateTableObjects
+  ( -- * Creating a Request
+    UpdateTableObjects (..),
+    newUpdateTableObjects,
+
+    -- * Request Lenses
+    updateTableObjects_catalogId,
+    updateTableObjects_transactionId,
+    updateTableObjects_databaseName,
+    updateTableObjects_tableName,
+    updateTableObjects_writeOperations,
+
+    -- * Destructuring the Response
+    UpdateTableObjectsResponse (..),
+    newUpdateTableObjectsResponse,
+
+    -- * Response Lenses
+    updateTableObjectsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateTableObjects' smart constructor.
+data UpdateTableObjects = UpdateTableObjects'
+  { -- | The catalog containing the governed table to update. Defaults to the
+    -- caller’s account ID.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | The transaction at which to do the write.
+    transactionId :: Prelude.Maybe Prelude.Text,
+    -- | The database containing the governed table to update.
+    databaseName :: Prelude.Text,
+    -- | The governed table to update.
+    tableName :: Prelude.Text,
+    -- | A list of @WriteOperation@ objects that define an object to add to or
+    -- delete from the manifest for a governed table.
+    writeOperations :: Prelude.NonEmpty WriteOperation
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateTableObjects' 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:
+--
+-- 'catalogId', 'updateTableObjects_catalogId' - The catalog containing the governed table to update. Defaults to the
+-- caller’s account ID.
+--
+-- 'transactionId', 'updateTableObjects_transactionId' - The transaction at which to do the write.
+--
+-- 'databaseName', 'updateTableObjects_databaseName' - The database containing the governed table to update.
+--
+-- 'tableName', 'updateTableObjects_tableName' - The governed table to update.
+--
+-- 'writeOperations', 'updateTableObjects_writeOperations' - A list of @WriteOperation@ objects that define an object to add to or
+-- delete from the manifest for a governed table.
+newUpdateTableObjects ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  -- | 'writeOperations'
+  Prelude.NonEmpty WriteOperation ->
+  UpdateTableObjects
+newUpdateTableObjects
+  pDatabaseName_
+  pTableName_
+  pWriteOperations_ =
+    UpdateTableObjects'
+      { catalogId = Prelude.Nothing,
+        transactionId = Prelude.Nothing,
+        databaseName = pDatabaseName_,
+        tableName = pTableName_,
+        writeOperations =
+          Lens.coerced Lens.# pWriteOperations_
+      }
+
+-- | The catalog containing the governed table to update. Defaults to the
+-- caller’s account ID.
+updateTableObjects_catalogId :: Lens.Lens' UpdateTableObjects (Prelude.Maybe Prelude.Text)
+updateTableObjects_catalogId = Lens.lens (\UpdateTableObjects' {catalogId} -> catalogId) (\s@UpdateTableObjects' {} a -> s {catalogId = a} :: UpdateTableObjects)
+
+-- | The transaction at which to do the write.
+updateTableObjects_transactionId :: Lens.Lens' UpdateTableObjects (Prelude.Maybe Prelude.Text)
+updateTableObjects_transactionId = Lens.lens (\UpdateTableObjects' {transactionId} -> transactionId) (\s@UpdateTableObjects' {} a -> s {transactionId = a} :: UpdateTableObjects)
+
+-- | The database containing the governed table to update.
+updateTableObjects_databaseName :: Lens.Lens' UpdateTableObjects Prelude.Text
+updateTableObjects_databaseName = Lens.lens (\UpdateTableObjects' {databaseName} -> databaseName) (\s@UpdateTableObjects' {} a -> s {databaseName = a} :: UpdateTableObjects)
+
+-- | The governed table to update.
+updateTableObjects_tableName :: Lens.Lens' UpdateTableObjects Prelude.Text
+updateTableObjects_tableName = Lens.lens (\UpdateTableObjects' {tableName} -> tableName) (\s@UpdateTableObjects' {} a -> s {tableName = a} :: UpdateTableObjects)
+
+-- | A list of @WriteOperation@ objects that define an object to add to or
+-- delete from the manifest for a governed table.
+updateTableObjects_writeOperations :: Lens.Lens' UpdateTableObjects (Prelude.NonEmpty WriteOperation)
+updateTableObjects_writeOperations = Lens.lens (\UpdateTableObjects' {writeOperations} -> writeOperations) (\s@UpdateTableObjects' {} a -> s {writeOperations = a} :: UpdateTableObjects) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UpdateTableObjects where
+  type
+    AWSResponse UpdateTableObjects =
+      UpdateTableObjectsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateTableObjectsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateTableObjects where
+  hashWithSalt _salt UpdateTableObjects' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` transactionId
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+      `Prelude.hashWithSalt` writeOperations
+
+instance Prelude.NFData UpdateTableObjects where
+  rnf UpdateTableObjects' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf transactionId
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+      `Prelude.seq` Prelude.rnf writeOperations
+
+instance Data.ToHeaders UpdateTableObjects where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateTableObjects where
+  toJSON UpdateTableObjects' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            ("TransactionId" Data..=) Prelude.<$> transactionId,
+            Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("TableName" Data..= tableName),
+            Prelude.Just
+              ("WriteOperations" Data..= writeOperations)
+          ]
+      )
+
+instance Data.ToPath UpdateTableObjects where
+  toPath = Prelude.const "/UpdateTableObjects"
+
+instance Data.ToQuery UpdateTableObjects where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateTableObjectsResponse' smart constructor.
+data UpdateTableObjectsResponse = UpdateTableObjectsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateTableObjectsResponse' 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', 'updateTableObjectsResponse_httpStatus' - The response's http status code.
+newUpdateTableObjectsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateTableObjectsResponse
+newUpdateTableObjectsResponse pHttpStatus_ =
+  UpdateTableObjectsResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+updateTableObjectsResponse_httpStatus :: Lens.Lens' UpdateTableObjectsResponse Prelude.Int
+updateTableObjectsResponse_httpStatus = Lens.lens (\UpdateTableObjectsResponse' {httpStatus} -> httpStatus) (\s@UpdateTableObjectsResponse' {} a -> s {httpStatus = a} :: UpdateTableObjectsResponse)
+
+instance Prelude.NFData UpdateTableObjectsResponse where
+  rnf UpdateTableObjectsResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/UpdateTableStorageOptimizer.hs b/gen/Amazonka/LakeFormation/UpdateTableStorageOptimizer.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/UpdateTableStorageOptimizer.hs
@@ -0,0 +1,219 @@
+{-# 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.LakeFormation.UpdateTableStorageOptimizer
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the configuration of the storage optimizers for a table.
+module Amazonka.LakeFormation.UpdateTableStorageOptimizer
+  ( -- * Creating a Request
+    UpdateTableStorageOptimizer (..),
+    newUpdateTableStorageOptimizer,
+
+    -- * Request Lenses
+    updateTableStorageOptimizer_catalogId,
+    updateTableStorageOptimizer_databaseName,
+    updateTableStorageOptimizer_tableName,
+    updateTableStorageOptimizer_storageOptimizerConfig,
+
+    -- * Destructuring the Response
+    UpdateTableStorageOptimizerResponse (..),
+    newUpdateTableStorageOptimizerResponse,
+
+    -- * Response Lenses
+    updateTableStorageOptimizerResponse_result,
+    updateTableStorageOptimizerResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateTableStorageOptimizer' smart constructor.
+data UpdateTableStorageOptimizer = UpdateTableStorageOptimizer'
+  { -- | The Catalog ID of the table.
+    catalogId :: Prelude.Maybe Prelude.Text,
+    -- | Name of the database where the table is present.
+    databaseName :: Prelude.Text,
+    -- | Name of the table for which to enable the storage optimizer.
+    tableName :: Prelude.Text,
+    -- | Name of the table for which to enable the storage optimizer.
+    storageOptimizerConfig :: Prelude.HashMap OptimizerType (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateTableStorageOptimizer' 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:
+--
+-- 'catalogId', 'updateTableStorageOptimizer_catalogId' - The Catalog ID of the table.
+--
+-- 'databaseName', 'updateTableStorageOptimizer_databaseName' - Name of the database where the table is present.
+--
+-- 'tableName', 'updateTableStorageOptimizer_tableName' - Name of the table for which to enable the storage optimizer.
+--
+-- 'storageOptimizerConfig', 'updateTableStorageOptimizer_storageOptimizerConfig' - Name of the table for which to enable the storage optimizer.
+newUpdateTableStorageOptimizer ::
+  -- | 'databaseName'
+  Prelude.Text ->
+  -- | 'tableName'
+  Prelude.Text ->
+  UpdateTableStorageOptimizer
+newUpdateTableStorageOptimizer
+  pDatabaseName_
+  pTableName_ =
+    UpdateTableStorageOptimizer'
+      { catalogId =
+          Prelude.Nothing,
+        databaseName = pDatabaseName_,
+        tableName = pTableName_,
+        storageOptimizerConfig = Prelude.mempty
+      }
+
+-- | The Catalog ID of the table.
+updateTableStorageOptimizer_catalogId :: Lens.Lens' UpdateTableStorageOptimizer (Prelude.Maybe Prelude.Text)
+updateTableStorageOptimizer_catalogId = Lens.lens (\UpdateTableStorageOptimizer' {catalogId} -> catalogId) (\s@UpdateTableStorageOptimizer' {} a -> s {catalogId = a} :: UpdateTableStorageOptimizer)
+
+-- | Name of the database where the table is present.
+updateTableStorageOptimizer_databaseName :: Lens.Lens' UpdateTableStorageOptimizer Prelude.Text
+updateTableStorageOptimizer_databaseName = Lens.lens (\UpdateTableStorageOptimizer' {databaseName} -> databaseName) (\s@UpdateTableStorageOptimizer' {} a -> s {databaseName = a} :: UpdateTableStorageOptimizer)
+
+-- | Name of the table for which to enable the storage optimizer.
+updateTableStorageOptimizer_tableName :: Lens.Lens' UpdateTableStorageOptimizer Prelude.Text
+updateTableStorageOptimizer_tableName = Lens.lens (\UpdateTableStorageOptimizer' {tableName} -> tableName) (\s@UpdateTableStorageOptimizer' {} a -> s {tableName = a} :: UpdateTableStorageOptimizer)
+
+-- | Name of the table for which to enable the storage optimizer.
+updateTableStorageOptimizer_storageOptimizerConfig :: Lens.Lens' UpdateTableStorageOptimizer (Prelude.HashMap OptimizerType (Prelude.HashMap Prelude.Text Prelude.Text))
+updateTableStorageOptimizer_storageOptimizerConfig = Lens.lens (\UpdateTableStorageOptimizer' {storageOptimizerConfig} -> storageOptimizerConfig) (\s@UpdateTableStorageOptimizer' {} a -> s {storageOptimizerConfig = a} :: UpdateTableStorageOptimizer) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UpdateTableStorageOptimizer where
+  type
+    AWSResponse UpdateTableStorageOptimizer =
+      UpdateTableStorageOptimizerResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateTableStorageOptimizerResponse'
+            Prelude.<$> (x Data..?> "Result")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateTableStorageOptimizer where
+  hashWithSalt _salt UpdateTableStorageOptimizer' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogId
+      `Prelude.hashWithSalt` databaseName
+      `Prelude.hashWithSalt` tableName
+      `Prelude.hashWithSalt` storageOptimizerConfig
+
+instance Prelude.NFData UpdateTableStorageOptimizer where
+  rnf UpdateTableStorageOptimizer' {..} =
+    Prelude.rnf catalogId
+      `Prelude.seq` Prelude.rnf databaseName
+      `Prelude.seq` Prelude.rnf tableName
+      `Prelude.seq` Prelude.rnf storageOptimizerConfig
+
+instance Data.ToHeaders UpdateTableStorageOptimizer where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateTableStorageOptimizer where
+  toJSON UpdateTableStorageOptimizer' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CatalogId" Data..=) Prelude.<$> catalogId,
+            Prelude.Just ("DatabaseName" Data..= databaseName),
+            Prelude.Just ("TableName" Data..= tableName),
+            Prelude.Just
+              ( "StorageOptimizerConfig"
+                  Data..= storageOptimizerConfig
+              )
+          ]
+      )
+
+instance Data.ToPath UpdateTableStorageOptimizer where
+  toPath = Prelude.const "/UpdateTableStorageOptimizer"
+
+instance Data.ToQuery UpdateTableStorageOptimizer where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateTableStorageOptimizerResponse' smart constructor.
+data UpdateTableStorageOptimizerResponse = UpdateTableStorageOptimizerResponse'
+  { -- | A response indicating the success of failure of the operation.
+    result :: 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 'UpdateTableStorageOptimizerResponse' 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:
+--
+-- 'result', 'updateTableStorageOptimizerResponse_result' - A response indicating the success of failure of the operation.
+--
+-- 'httpStatus', 'updateTableStorageOptimizerResponse_httpStatus' - The response's http status code.
+newUpdateTableStorageOptimizerResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateTableStorageOptimizerResponse
+newUpdateTableStorageOptimizerResponse pHttpStatus_ =
+  UpdateTableStorageOptimizerResponse'
+    { result =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A response indicating the success of failure of the operation.
+updateTableStorageOptimizerResponse_result :: Lens.Lens' UpdateTableStorageOptimizerResponse (Prelude.Maybe Prelude.Text)
+updateTableStorageOptimizerResponse_result = Lens.lens (\UpdateTableStorageOptimizerResponse' {result} -> result) (\s@UpdateTableStorageOptimizerResponse' {} a -> s {result = a} :: UpdateTableStorageOptimizerResponse)
+
+-- | The response's http status code.
+updateTableStorageOptimizerResponse_httpStatus :: Lens.Lens' UpdateTableStorageOptimizerResponse Prelude.Int
+updateTableStorageOptimizerResponse_httpStatus = Lens.lens (\UpdateTableStorageOptimizerResponse' {httpStatus} -> httpStatus) (\s@UpdateTableStorageOptimizerResponse' {} a -> s {httpStatus = a} :: UpdateTableStorageOptimizerResponse)
+
+instance
+  Prelude.NFData
+    UpdateTableStorageOptimizerResponse
+  where
+  rnf UpdateTableStorageOptimizerResponse' {..} =
+    Prelude.rnf result
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LakeFormation/Waiters.hs b/gen/Amazonka/LakeFormation/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LakeFormation/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.LakeFormation.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.LakeFormation.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LakeFormation.Lens
+import Amazonka.LakeFormation.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.LakeFormation
+import Test.Amazonka.LakeFormation.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "LakeFormation"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/LakeFormation.hs b/test/Test/Amazonka/Gen/LakeFormation.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/LakeFormation.hs
@@ -0,0 +1,930 @@
+{-# 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.LakeFormation
+-- 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.LakeFormation where
+
+import Amazonka.LakeFormation
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.LakeFormation.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestAddLFTagsToResource $
+--             newAddLFTagsToResource
+--
+--         , requestAssumeDecoratedRoleWithSAML $
+--             newAssumeDecoratedRoleWithSAML
+--
+--         , requestBatchGrantPermissions $
+--             newBatchGrantPermissions
+--
+--         , requestBatchRevokePermissions $
+--             newBatchRevokePermissions
+--
+--         , requestCancelTransaction $
+--             newCancelTransaction
+--
+--         , requestCommitTransaction $
+--             newCommitTransaction
+--
+--         , requestCreateDataCellsFilter $
+--             newCreateDataCellsFilter
+--
+--         , requestCreateLFTag $
+--             newCreateLFTag
+--
+--         , requestDeleteDataCellsFilter $
+--             newDeleteDataCellsFilter
+--
+--         , requestDeleteLFTag $
+--             newDeleteLFTag
+--
+--         , requestDeleteObjectsOnCancel $
+--             newDeleteObjectsOnCancel
+--
+--         , requestDeregisterResource $
+--             newDeregisterResource
+--
+--         , requestDescribeResource $
+--             newDescribeResource
+--
+--         , requestDescribeTransaction $
+--             newDescribeTransaction
+--
+--         , requestExtendTransaction $
+--             newExtendTransaction
+--
+--         , requestGetDataLakeSettings $
+--             newGetDataLakeSettings
+--
+--         , requestGetEffectivePermissionsForPath $
+--             newGetEffectivePermissionsForPath
+--
+--         , requestGetLFTag $
+--             newGetLFTag
+--
+--         , requestGetQueryState $
+--             newGetQueryState
+--
+--         , requestGetQueryStatistics $
+--             newGetQueryStatistics
+--
+--         , requestGetResourceLFTags $
+--             newGetResourceLFTags
+--
+--         , requestGetTableObjects $
+--             newGetTableObjects
+--
+--         , requestGetTemporaryGluePartitionCredentials $
+--             newGetTemporaryGluePartitionCredentials
+--
+--         , requestGetTemporaryGlueTableCredentials $
+--             newGetTemporaryGlueTableCredentials
+--
+--         , requestGetWorkUnitResults $
+--             newGetWorkUnitResults
+--
+--         , requestGetWorkUnits $
+--             newGetWorkUnits
+--
+--         , requestGrantPermissions $
+--             newGrantPermissions
+--
+--         , requestListDataCellsFilter $
+--             newListDataCellsFilter
+--
+--         , requestListLFTags $
+--             newListLFTags
+--
+--         , requestListPermissions $
+--             newListPermissions
+--
+--         , requestListResources $
+--             newListResources
+--
+--         , requestListTableStorageOptimizers $
+--             newListTableStorageOptimizers
+--
+--         , requestListTransactions $
+--             newListTransactions
+--
+--         , requestPutDataLakeSettings $
+--             newPutDataLakeSettings
+--
+--         , requestRegisterResource $
+--             newRegisterResource
+--
+--         , requestRemoveLFTagsFromResource $
+--             newRemoveLFTagsFromResource
+--
+--         , requestRevokePermissions $
+--             newRevokePermissions
+--
+--         , requestSearchDatabasesByLFTags $
+--             newSearchDatabasesByLFTags
+--
+--         , requestSearchTablesByLFTags $
+--             newSearchTablesByLFTags
+--
+--         , requestStartQueryPlanning $
+--             newStartQueryPlanning
+--
+--         , requestStartTransaction $
+--             newStartTransaction
+--
+--         , requestUpdateLFTag $
+--             newUpdateLFTag
+--
+--         , requestUpdateResource $
+--             newUpdateResource
+--
+--         , requestUpdateTableObjects $
+--             newUpdateTableObjects
+--
+--         , requestUpdateTableStorageOptimizer $
+--             newUpdateTableStorageOptimizer
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseAddLFTagsToResource $
+--             newAddLFTagsToResourceResponse
+--
+--         , responseAssumeDecoratedRoleWithSAML $
+--             newAssumeDecoratedRoleWithSAMLResponse
+--
+--         , responseBatchGrantPermissions $
+--             newBatchGrantPermissionsResponse
+--
+--         , responseBatchRevokePermissions $
+--             newBatchRevokePermissionsResponse
+--
+--         , responseCancelTransaction $
+--             newCancelTransactionResponse
+--
+--         , responseCommitTransaction $
+--             newCommitTransactionResponse
+--
+--         , responseCreateDataCellsFilter $
+--             newCreateDataCellsFilterResponse
+--
+--         , responseCreateLFTag $
+--             newCreateLFTagResponse
+--
+--         , responseDeleteDataCellsFilter $
+--             newDeleteDataCellsFilterResponse
+--
+--         , responseDeleteLFTag $
+--             newDeleteLFTagResponse
+--
+--         , responseDeleteObjectsOnCancel $
+--             newDeleteObjectsOnCancelResponse
+--
+--         , responseDeregisterResource $
+--             newDeregisterResourceResponse
+--
+--         , responseDescribeResource $
+--             newDescribeResourceResponse
+--
+--         , responseDescribeTransaction $
+--             newDescribeTransactionResponse
+--
+--         , responseExtendTransaction $
+--             newExtendTransactionResponse
+--
+--         , responseGetDataLakeSettings $
+--             newGetDataLakeSettingsResponse
+--
+--         , responseGetEffectivePermissionsForPath $
+--             newGetEffectivePermissionsForPathResponse
+--
+--         , responseGetLFTag $
+--             newGetLFTagResponse
+--
+--         , responseGetQueryState $
+--             newGetQueryStateResponse
+--
+--         , responseGetQueryStatistics $
+--             newGetQueryStatisticsResponse
+--
+--         , responseGetResourceLFTags $
+--             newGetResourceLFTagsResponse
+--
+--         , responseGetTableObjects $
+--             newGetTableObjectsResponse
+--
+--         , responseGetTemporaryGluePartitionCredentials $
+--             newGetTemporaryGluePartitionCredentialsResponse
+--
+--         , responseGetTemporaryGlueTableCredentials $
+--             newGetTemporaryGlueTableCredentialsResponse
+--
+--         , responseGetWorkUnitResults $
+--             newGetWorkUnitResultsResponse
+--
+--         , responseGetWorkUnits $
+--             newGetWorkUnitsResponse
+--
+--         , responseGrantPermissions $
+--             newGrantPermissionsResponse
+--
+--         , responseListDataCellsFilter $
+--             newListDataCellsFilterResponse
+--
+--         , responseListLFTags $
+--             newListLFTagsResponse
+--
+--         , responseListPermissions $
+--             newListPermissionsResponse
+--
+--         , responseListResources $
+--             newListResourcesResponse
+--
+--         , responseListTableStorageOptimizers $
+--             newListTableStorageOptimizersResponse
+--
+--         , responseListTransactions $
+--             newListTransactionsResponse
+--
+--         , responsePutDataLakeSettings $
+--             newPutDataLakeSettingsResponse
+--
+--         , responseRegisterResource $
+--             newRegisterResourceResponse
+--
+--         , responseRemoveLFTagsFromResource $
+--             newRemoveLFTagsFromResourceResponse
+--
+--         , responseRevokePermissions $
+--             newRevokePermissionsResponse
+--
+--         , responseSearchDatabasesByLFTags $
+--             newSearchDatabasesByLFTagsResponse
+--
+--         , responseSearchTablesByLFTags $
+--             newSearchTablesByLFTagsResponse
+--
+--         , responseStartQueryPlanning $
+--             newStartQueryPlanningResponse
+--
+--         , responseStartTransaction $
+--             newStartTransactionResponse
+--
+--         , responseUpdateLFTag $
+--             newUpdateLFTagResponse
+--
+--         , responseUpdateResource $
+--             newUpdateResourceResponse
+--
+--         , responseUpdateTableObjects $
+--             newUpdateTableObjectsResponse
+--
+--         , responseUpdateTableStorageOptimizer $
+--             newUpdateTableStorageOptimizerResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestAddLFTagsToResource :: AddLFTagsToResource -> TestTree
+requestAddLFTagsToResource =
+  req
+    "AddLFTagsToResource"
+    "fixture/AddLFTagsToResource.yaml"
+
+requestAssumeDecoratedRoleWithSAML :: AssumeDecoratedRoleWithSAML -> TestTree
+requestAssumeDecoratedRoleWithSAML =
+  req
+    "AssumeDecoratedRoleWithSAML"
+    "fixture/AssumeDecoratedRoleWithSAML.yaml"
+
+requestBatchGrantPermissions :: BatchGrantPermissions -> TestTree
+requestBatchGrantPermissions =
+  req
+    "BatchGrantPermissions"
+    "fixture/BatchGrantPermissions.yaml"
+
+requestBatchRevokePermissions :: BatchRevokePermissions -> TestTree
+requestBatchRevokePermissions =
+  req
+    "BatchRevokePermissions"
+    "fixture/BatchRevokePermissions.yaml"
+
+requestCancelTransaction :: CancelTransaction -> TestTree
+requestCancelTransaction =
+  req
+    "CancelTransaction"
+    "fixture/CancelTransaction.yaml"
+
+requestCommitTransaction :: CommitTransaction -> TestTree
+requestCommitTransaction =
+  req
+    "CommitTransaction"
+    "fixture/CommitTransaction.yaml"
+
+requestCreateDataCellsFilter :: CreateDataCellsFilter -> TestTree
+requestCreateDataCellsFilter =
+  req
+    "CreateDataCellsFilter"
+    "fixture/CreateDataCellsFilter.yaml"
+
+requestCreateLFTag :: CreateLFTag -> TestTree
+requestCreateLFTag =
+  req
+    "CreateLFTag"
+    "fixture/CreateLFTag.yaml"
+
+requestDeleteDataCellsFilter :: DeleteDataCellsFilter -> TestTree
+requestDeleteDataCellsFilter =
+  req
+    "DeleteDataCellsFilter"
+    "fixture/DeleteDataCellsFilter.yaml"
+
+requestDeleteLFTag :: DeleteLFTag -> TestTree
+requestDeleteLFTag =
+  req
+    "DeleteLFTag"
+    "fixture/DeleteLFTag.yaml"
+
+requestDeleteObjectsOnCancel :: DeleteObjectsOnCancel -> TestTree
+requestDeleteObjectsOnCancel =
+  req
+    "DeleteObjectsOnCancel"
+    "fixture/DeleteObjectsOnCancel.yaml"
+
+requestDeregisterResource :: DeregisterResource -> TestTree
+requestDeregisterResource =
+  req
+    "DeregisterResource"
+    "fixture/DeregisterResource.yaml"
+
+requestDescribeResource :: DescribeResource -> TestTree
+requestDescribeResource =
+  req
+    "DescribeResource"
+    "fixture/DescribeResource.yaml"
+
+requestDescribeTransaction :: DescribeTransaction -> TestTree
+requestDescribeTransaction =
+  req
+    "DescribeTransaction"
+    "fixture/DescribeTransaction.yaml"
+
+requestExtendTransaction :: ExtendTransaction -> TestTree
+requestExtendTransaction =
+  req
+    "ExtendTransaction"
+    "fixture/ExtendTransaction.yaml"
+
+requestGetDataLakeSettings :: GetDataLakeSettings -> TestTree
+requestGetDataLakeSettings =
+  req
+    "GetDataLakeSettings"
+    "fixture/GetDataLakeSettings.yaml"
+
+requestGetEffectivePermissionsForPath :: GetEffectivePermissionsForPath -> TestTree
+requestGetEffectivePermissionsForPath =
+  req
+    "GetEffectivePermissionsForPath"
+    "fixture/GetEffectivePermissionsForPath.yaml"
+
+requestGetLFTag :: GetLFTag -> TestTree
+requestGetLFTag =
+  req
+    "GetLFTag"
+    "fixture/GetLFTag.yaml"
+
+requestGetQueryState :: GetQueryState -> TestTree
+requestGetQueryState =
+  req
+    "GetQueryState"
+    "fixture/GetQueryState.yaml"
+
+requestGetQueryStatistics :: GetQueryStatistics -> TestTree
+requestGetQueryStatistics =
+  req
+    "GetQueryStatistics"
+    "fixture/GetQueryStatistics.yaml"
+
+requestGetResourceLFTags :: GetResourceLFTags -> TestTree
+requestGetResourceLFTags =
+  req
+    "GetResourceLFTags"
+    "fixture/GetResourceLFTags.yaml"
+
+requestGetTableObjects :: GetTableObjects -> TestTree
+requestGetTableObjects =
+  req
+    "GetTableObjects"
+    "fixture/GetTableObjects.yaml"
+
+requestGetTemporaryGluePartitionCredentials :: GetTemporaryGluePartitionCredentials -> TestTree
+requestGetTemporaryGluePartitionCredentials =
+  req
+    "GetTemporaryGluePartitionCredentials"
+    "fixture/GetTemporaryGluePartitionCredentials.yaml"
+
+requestGetTemporaryGlueTableCredentials :: GetTemporaryGlueTableCredentials -> TestTree
+requestGetTemporaryGlueTableCredentials =
+  req
+    "GetTemporaryGlueTableCredentials"
+    "fixture/GetTemporaryGlueTableCredentials.yaml"
+
+requestGetWorkUnitResults :: GetWorkUnitResults -> TestTree
+requestGetWorkUnitResults =
+  req
+    "GetWorkUnitResults"
+    "fixture/GetWorkUnitResults.yaml"
+
+requestGetWorkUnits :: GetWorkUnits -> TestTree
+requestGetWorkUnits =
+  req
+    "GetWorkUnits"
+    "fixture/GetWorkUnits.yaml"
+
+requestGrantPermissions :: GrantPermissions -> TestTree
+requestGrantPermissions =
+  req
+    "GrantPermissions"
+    "fixture/GrantPermissions.yaml"
+
+requestListDataCellsFilter :: ListDataCellsFilter -> TestTree
+requestListDataCellsFilter =
+  req
+    "ListDataCellsFilter"
+    "fixture/ListDataCellsFilter.yaml"
+
+requestListLFTags :: ListLFTags -> TestTree
+requestListLFTags =
+  req
+    "ListLFTags"
+    "fixture/ListLFTags.yaml"
+
+requestListPermissions :: ListPermissions -> TestTree
+requestListPermissions =
+  req
+    "ListPermissions"
+    "fixture/ListPermissions.yaml"
+
+requestListResources :: ListResources -> TestTree
+requestListResources =
+  req
+    "ListResources"
+    "fixture/ListResources.yaml"
+
+requestListTableStorageOptimizers :: ListTableStorageOptimizers -> TestTree
+requestListTableStorageOptimizers =
+  req
+    "ListTableStorageOptimizers"
+    "fixture/ListTableStorageOptimizers.yaml"
+
+requestListTransactions :: ListTransactions -> TestTree
+requestListTransactions =
+  req
+    "ListTransactions"
+    "fixture/ListTransactions.yaml"
+
+requestPutDataLakeSettings :: PutDataLakeSettings -> TestTree
+requestPutDataLakeSettings =
+  req
+    "PutDataLakeSettings"
+    "fixture/PutDataLakeSettings.yaml"
+
+requestRegisterResource :: RegisterResource -> TestTree
+requestRegisterResource =
+  req
+    "RegisterResource"
+    "fixture/RegisterResource.yaml"
+
+requestRemoveLFTagsFromResource :: RemoveLFTagsFromResource -> TestTree
+requestRemoveLFTagsFromResource =
+  req
+    "RemoveLFTagsFromResource"
+    "fixture/RemoveLFTagsFromResource.yaml"
+
+requestRevokePermissions :: RevokePermissions -> TestTree
+requestRevokePermissions =
+  req
+    "RevokePermissions"
+    "fixture/RevokePermissions.yaml"
+
+requestSearchDatabasesByLFTags :: SearchDatabasesByLFTags -> TestTree
+requestSearchDatabasesByLFTags =
+  req
+    "SearchDatabasesByLFTags"
+    "fixture/SearchDatabasesByLFTags.yaml"
+
+requestSearchTablesByLFTags :: SearchTablesByLFTags -> TestTree
+requestSearchTablesByLFTags =
+  req
+    "SearchTablesByLFTags"
+    "fixture/SearchTablesByLFTags.yaml"
+
+requestStartQueryPlanning :: StartQueryPlanning -> TestTree
+requestStartQueryPlanning =
+  req
+    "StartQueryPlanning"
+    "fixture/StartQueryPlanning.yaml"
+
+requestStartTransaction :: StartTransaction -> TestTree
+requestStartTransaction =
+  req
+    "StartTransaction"
+    "fixture/StartTransaction.yaml"
+
+requestUpdateLFTag :: UpdateLFTag -> TestTree
+requestUpdateLFTag =
+  req
+    "UpdateLFTag"
+    "fixture/UpdateLFTag.yaml"
+
+requestUpdateResource :: UpdateResource -> TestTree
+requestUpdateResource =
+  req
+    "UpdateResource"
+    "fixture/UpdateResource.yaml"
+
+requestUpdateTableObjects :: UpdateTableObjects -> TestTree
+requestUpdateTableObjects =
+  req
+    "UpdateTableObjects"
+    "fixture/UpdateTableObjects.yaml"
+
+requestUpdateTableStorageOptimizer :: UpdateTableStorageOptimizer -> TestTree
+requestUpdateTableStorageOptimizer =
+  req
+    "UpdateTableStorageOptimizer"
+    "fixture/UpdateTableStorageOptimizer.yaml"
+
+-- Responses
+
+responseAddLFTagsToResource :: AddLFTagsToResourceResponse -> TestTree
+responseAddLFTagsToResource =
+  res
+    "AddLFTagsToResourceResponse"
+    "fixture/AddLFTagsToResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AddLFTagsToResource)
+
+responseAssumeDecoratedRoleWithSAML :: AssumeDecoratedRoleWithSAMLResponse -> TestTree
+responseAssumeDecoratedRoleWithSAML =
+  res
+    "AssumeDecoratedRoleWithSAMLResponse"
+    "fixture/AssumeDecoratedRoleWithSAMLResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AssumeDecoratedRoleWithSAML)
+
+responseBatchGrantPermissions :: BatchGrantPermissionsResponse -> TestTree
+responseBatchGrantPermissions =
+  res
+    "BatchGrantPermissionsResponse"
+    "fixture/BatchGrantPermissionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchGrantPermissions)
+
+responseBatchRevokePermissions :: BatchRevokePermissionsResponse -> TestTree
+responseBatchRevokePermissions =
+  res
+    "BatchRevokePermissionsResponse"
+    "fixture/BatchRevokePermissionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchRevokePermissions)
+
+responseCancelTransaction :: CancelTransactionResponse -> TestTree
+responseCancelTransaction =
+  res
+    "CancelTransactionResponse"
+    "fixture/CancelTransactionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CancelTransaction)
+
+responseCommitTransaction :: CommitTransactionResponse -> TestTree
+responseCommitTransaction =
+  res
+    "CommitTransactionResponse"
+    "fixture/CommitTransactionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CommitTransaction)
+
+responseCreateDataCellsFilter :: CreateDataCellsFilterResponse -> TestTree
+responseCreateDataCellsFilter =
+  res
+    "CreateDataCellsFilterResponse"
+    "fixture/CreateDataCellsFilterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDataCellsFilter)
+
+responseCreateLFTag :: CreateLFTagResponse -> TestTree
+responseCreateLFTag =
+  res
+    "CreateLFTagResponse"
+    "fixture/CreateLFTagResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateLFTag)
+
+responseDeleteDataCellsFilter :: DeleteDataCellsFilterResponse -> TestTree
+responseDeleteDataCellsFilter =
+  res
+    "DeleteDataCellsFilterResponse"
+    "fixture/DeleteDataCellsFilterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDataCellsFilter)
+
+responseDeleteLFTag :: DeleteLFTagResponse -> TestTree
+responseDeleteLFTag =
+  res
+    "DeleteLFTagResponse"
+    "fixture/DeleteLFTagResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteLFTag)
+
+responseDeleteObjectsOnCancel :: DeleteObjectsOnCancelResponse -> TestTree
+responseDeleteObjectsOnCancel =
+  res
+    "DeleteObjectsOnCancelResponse"
+    "fixture/DeleteObjectsOnCancelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteObjectsOnCancel)
+
+responseDeregisterResource :: DeregisterResourceResponse -> TestTree
+responseDeregisterResource =
+  res
+    "DeregisterResourceResponse"
+    "fixture/DeregisterResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeregisterResource)
+
+responseDescribeResource :: DescribeResourceResponse -> TestTree
+responseDescribeResource =
+  res
+    "DescribeResourceResponse"
+    "fixture/DescribeResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeResource)
+
+responseDescribeTransaction :: DescribeTransactionResponse -> TestTree
+responseDescribeTransaction =
+  res
+    "DescribeTransactionResponse"
+    "fixture/DescribeTransactionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeTransaction)
+
+responseExtendTransaction :: ExtendTransactionResponse -> TestTree
+responseExtendTransaction =
+  res
+    "ExtendTransactionResponse"
+    "fixture/ExtendTransactionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ExtendTransaction)
+
+responseGetDataLakeSettings :: GetDataLakeSettingsResponse -> TestTree
+responseGetDataLakeSettings =
+  res
+    "GetDataLakeSettingsResponse"
+    "fixture/GetDataLakeSettingsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetDataLakeSettings)
+
+responseGetEffectivePermissionsForPath :: GetEffectivePermissionsForPathResponse -> TestTree
+responseGetEffectivePermissionsForPath =
+  res
+    "GetEffectivePermissionsForPathResponse"
+    "fixture/GetEffectivePermissionsForPathResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetEffectivePermissionsForPath)
+
+responseGetLFTag :: GetLFTagResponse -> TestTree
+responseGetLFTag =
+  res
+    "GetLFTagResponse"
+    "fixture/GetLFTagResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetLFTag)
+
+responseGetQueryState :: GetQueryStateResponse -> TestTree
+responseGetQueryState =
+  res
+    "GetQueryStateResponse"
+    "fixture/GetQueryStateResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetQueryState)
+
+responseGetQueryStatistics :: GetQueryStatisticsResponse -> TestTree
+responseGetQueryStatistics =
+  res
+    "GetQueryStatisticsResponse"
+    "fixture/GetQueryStatisticsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetQueryStatistics)
+
+responseGetResourceLFTags :: GetResourceLFTagsResponse -> TestTree
+responseGetResourceLFTags =
+  res
+    "GetResourceLFTagsResponse"
+    "fixture/GetResourceLFTagsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetResourceLFTags)
+
+responseGetTableObjects :: GetTableObjectsResponse -> TestTree
+responseGetTableObjects =
+  res
+    "GetTableObjectsResponse"
+    "fixture/GetTableObjectsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetTableObjects)
+
+responseGetTemporaryGluePartitionCredentials :: GetTemporaryGluePartitionCredentialsResponse -> TestTree
+responseGetTemporaryGluePartitionCredentials =
+  res
+    "GetTemporaryGluePartitionCredentialsResponse"
+    "fixture/GetTemporaryGluePartitionCredentialsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetTemporaryGluePartitionCredentials)
+
+responseGetTemporaryGlueTableCredentials :: GetTemporaryGlueTableCredentialsResponse -> TestTree
+responseGetTemporaryGlueTableCredentials =
+  res
+    "GetTemporaryGlueTableCredentialsResponse"
+    "fixture/GetTemporaryGlueTableCredentialsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetTemporaryGlueTableCredentials)
+
+responseGetWorkUnits :: GetWorkUnitsResponse -> TestTree
+responseGetWorkUnits =
+  res
+    "GetWorkUnitsResponse"
+    "fixture/GetWorkUnitsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetWorkUnits)
+
+responseGrantPermissions :: GrantPermissionsResponse -> TestTree
+responseGrantPermissions =
+  res
+    "GrantPermissionsResponse"
+    "fixture/GrantPermissionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GrantPermissions)
+
+responseListDataCellsFilter :: ListDataCellsFilterResponse -> TestTree
+responseListDataCellsFilter =
+  res
+    "ListDataCellsFilterResponse"
+    "fixture/ListDataCellsFilterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDataCellsFilter)
+
+responseListLFTags :: ListLFTagsResponse -> TestTree
+responseListLFTags =
+  res
+    "ListLFTagsResponse"
+    "fixture/ListLFTagsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListLFTags)
+
+responseListPermissions :: ListPermissionsResponse -> TestTree
+responseListPermissions =
+  res
+    "ListPermissionsResponse"
+    "fixture/ListPermissionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPermissions)
+
+responseListResources :: ListResourcesResponse -> TestTree
+responseListResources =
+  res
+    "ListResourcesResponse"
+    "fixture/ListResourcesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListResources)
+
+responseListTableStorageOptimizers :: ListTableStorageOptimizersResponse -> TestTree
+responseListTableStorageOptimizers =
+  res
+    "ListTableStorageOptimizersResponse"
+    "fixture/ListTableStorageOptimizersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTableStorageOptimizers)
+
+responseListTransactions :: ListTransactionsResponse -> TestTree
+responseListTransactions =
+  res
+    "ListTransactionsResponse"
+    "fixture/ListTransactionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTransactions)
+
+responsePutDataLakeSettings :: PutDataLakeSettingsResponse -> TestTree
+responsePutDataLakeSettings =
+  res
+    "PutDataLakeSettingsResponse"
+    "fixture/PutDataLakeSettingsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutDataLakeSettings)
+
+responseRegisterResource :: RegisterResourceResponse -> TestTree
+responseRegisterResource =
+  res
+    "RegisterResourceResponse"
+    "fixture/RegisterResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RegisterResource)
+
+responseRemoveLFTagsFromResource :: RemoveLFTagsFromResourceResponse -> TestTree
+responseRemoveLFTagsFromResource =
+  res
+    "RemoveLFTagsFromResourceResponse"
+    "fixture/RemoveLFTagsFromResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RemoveLFTagsFromResource)
+
+responseRevokePermissions :: RevokePermissionsResponse -> TestTree
+responseRevokePermissions =
+  res
+    "RevokePermissionsResponse"
+    "fixture/RevokePermissionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RevokePermissions)
+
+responseSearchDatabasesByLFTags :: SearchDatabasesByLFTagsResponse -> TestTree
+responseSearchDatabasesByLFTags =
+  res
+    "SearchDatabasesByLFTagsResponse"
+    "fixture/SearchDatabasesByLFTagsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SearchDatabasesByLFTags)
+
+responseSearchTablesByLFTags :: SearchTablesByLFTagsResponse -> TestTree
+responseSearchTablesByLFTags =
+  res
+    "SearchTablesByLFTagsResponse"
+    "fixture/SearchTablesByLFTagsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SearchTablesByLFTags)
+
+responseStartQueryPlanning :: StartQueryPlanningResponse -> TestTree
+responseStartQueryPlanning =
+  res
+    "StartQueryPlanningResponse"
+    "fixture/StartQueryPlanningResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartQueryPlanning)
+
+responseStartTransaction :: StartTransactionResponse -> TestTree
+responseStartTransaction =
+  res
+    "StartTransactionResponse"
+    "fixture/StartTransactionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartTransaction)
+
+responseUpdateLFTag :: UpdateLFTagResponse -> TestTree
+responseUpdateLFTag =
+  res
+    "UpdateLFTagResponse"
+    "fixture/UpdateLFTagResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateLFTag)
+
+responseUpdateResource :: UpdateResourceResponse -> TestTree
+responseUpdateResource =
+  res
+    "UpdateResourceResponse"
+    "fixture/UpdateResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateResource)
+
+responseUpdateTableObjects :: UpdateTableObjectsResponse -> TestTree
+responseUpdateTableObjects =
+  res
+    "UpdateTableObjectsResponse"
+    "fixture/UpdateTableObjectsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateTableObjects)
+
+responseUpdateTableStorageOptimizer :: UpdateTableStorageOptimizerResponse -> TestTree
+responseUpdateTableStorageOptimizer =
+  res
+    "UpdateTableStorageOptimizerResponse"
+    "fixture/UpdateTableStorageOptimizerResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateTableStorageOptimizer)
diff --git a/test/Test/Amazonka/LakeFormation.hs b/test/Test/Amazonka/LakeFormation.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/LakeFormation.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.LakeFormation
+-- 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.LakeFormation
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/LakeFormation/Internal.hs b/test/Test/Amazonka/LakeFormation/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/LakeFormation/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.LakeFormation.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.LakeFormation.Internal where
