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 FinSpace User Environment Management service SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2021-03-12@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-finspace)
+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.FinSpace](http://hackage.haskell.org/package/amazonka-finspace/docs/Amazonka-FinSpace.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-finspace` 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-finspace.cabal b/amazonka-finspace.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-finspace.cabal
@@ -0,0 +1,96 @@
+cabal-version:      2.2
+name:               amazonka-finspace
+version:            2.0
+synopsis:           Amazon FinSpace User Environment Management service SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2021-03-12@ 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.FinSpace.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.FinSpace" 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-finspace
+
+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.FinSpace
+    Amazonka.FinSpace.CreateEnvironment
+    Amazonka.FinSpace.DeleteEnvironment
+    Amazonka.FinSpace.GetEnvironment
+    Amazonka.FinSpace.Lens
+    Amazonka.FinSpace.ListEnvironments
+    Amazonka.FinSpace.ListTagsForResource
+    Amazonka.FinSpace.TagResource
+    Amazonka.FinSpace.Types
+    Amazonka.FinSpace.Types.Environment
+    Amazonka.FinSpace.Types.EnvironmentStatus
+    Amazonka.FinSpace.Types.FederationMode
+    Amazonka.FinSpace.Types.FederationParameters
+    Amazonka.FinSpace.Types.SuperuserParameters
+    Amazonka.FinSpace.UntagResource
+    Amazonka.FinSpace.UpdateEnvironment
+    Amazonka.FinSpace.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-finspace-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.FinSpace
+    Test.Amazonka.FinSpace.Internal
+    Test.Amazonka.Gen.FinSpace
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-finspace
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateEnvironment.yaml b/fixture/CreateEnvironment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateEnvironment.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace.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/CreateEnvironmentResponse.proto b/fixture/CreateEnvironmentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateEnvironmentResponse.proto
diff --git a/fixture/DeleteEnvironment.yaml b/fixture/DeleteEnvironment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteEnvironment.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace.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/DeleteEnvironmentResponse.proto b/fixture/DeleteEnvironmentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteEnvironmentResponse.proto
diff --git a/fixture/GetEnvironment.yaml b/fixture/GetEnvironment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetEnvironment.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace.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/GetEnvironmentResponse.proto b/fixture/GetEnvironmentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetEnvironmentResponse.proto
diff --git a/fixture/ListEnvironments.yaml b/fixture/ListEnvironments.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListEnvironments.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace.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/ListEnvironmentsResponse.proto b/fixture/ListEnvironmentsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListEnvironmentsResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateEnvironment.yaml b/fixture/UpdateEnvironment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEnvironment.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/finspace/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  finspace.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/UpdateEnvironmentResponse.proto b/fixture/UpdateEnvironmentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEnvironmentResponse.proto
diff --git a/gen/Amazonka/FinSpace.hs b/gen/Amazonka/FinSpace.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace.hs
@@ -0,0 +1,160 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.FinSpace
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2021-03-12@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- The FinSpace management service provides the APIs for managing FinSpace
+-- environments.
+module Amazonka.FinSpace
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** InvalidRequestException
+    _InvalidRequestException,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateEnvironment
+    CreateEnvironment (CreateEnvironment'),
+    newCreateEnvironment,
+    CreateEnvironmentResponse (CreateEnvironmentResponse'),
+    newCreateEnvironmentResponse,
+
+    -- ** DeleteEnvironment
+    DeleteEnvironment (DeleteEnvironment'),
+    newDeleteEnvironment,
+    DeleteEnvironmentResponse (DeleteEnvironmentResponse'),
+    newDeleteEnvironmentResponse,
+
+    -- ** GetEnvironment
+    GetEnvironment (GetEnvironment'),
+    newGetEnvironment,
+    GetEnvironmentResponse (GetEnvironmentResponse'),
+    newGetEnvironmentResponse,
+
+    -- ** ListEnvironments
+    ListEnvironments (ListEnvironments'),
+    newListEnvironments,
+    ListEnvironmentsResponse (ListEnvironmentsResponse'),
+    newListEnvironmentsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateEnvironment
+    UpdateEnvironment (UpdateEnvironment'),
+    newUpdateEnvironment,
+    UpdateEnvironmentResponse (UpdateEnvironmentResponse'),
+    newUpdateEnvironmentResponse,
+
+    -- * Types
+
+    -- ** EnvironmentStatus
+    EnvironmentStatus (..),
+
+    -- ** FederationMode
+    FederationMode (..),
+
+    -- ** Environment
+    Environment (Environment'),
+    newEnvironment,
+
+    -- ** FederationParameters
+    FederationParameters (FederationParameters'),
+    newFederationParameters,
+
+    -- ** SuperuserParameters
+    SuperuserParameters (SuperuserParameters'),
+    newSuperuserParameters,
+  )
+where
+
+import Amazonka.FinSpace.CreateEnvironment
+import Amazonka.FinSpace.DeleteEnvironment
+import Amazonka.FinSpace.GetEnvironment
+import Amazonka.FinSpace.Lens
+import Amazonka.FinSpace.ListEnvironments
+import Amazonka.FinSpace.ListTagsForResource
+import Amazonka.FinSpace.TagResource
+import Amazonka.FinSpace.Types
+import Amazonka.FinSpace.UntagResource
+import Amazonka.FinSpace.UpdateEnvironment
+import Amazonka.FinSpace.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 'FinSpace'.
+
+-- $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/FinSpace/CreateEnvironment.hs b/gen/Amazonka/FinSpace/CreateEnvironment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/CreateEnvironment.hs
@@ -0,0 +1,335 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpace.CreateEnvironment
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Create a new FinSpace environment.
+module Amazonka.FinSpace.CreateEnvironment
+  ( -- * Creating a Request
+    CreateEnvironment (..),
+    newCreateEnvironment,
+
+    -- * Request Lenses
+    createEnvironment_dataBundles,
+    createEnvironment_description,
+    createEnvironment_federationMode,
+    createEnvironment_federationParameters,
+    createEnvironment_kmsKeyId,
+    createEnvironment_superuserParameters,
+    createEnvironment_tags,
+    createEnvironment_name,
+
+    -- * Destructuring the Response
+    CreateEnvironmentResponse (..),
+    newCreateEnvironmentResponse,
+
+    -- * Response Lenses
+    createEnvironmentResponse_environmentArn,
+    createEnvironmentResponse_environmentId,
+    createEnvironmentResponse_environmentUrl,
+    createEnvironmentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpace.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateEnvironment' smart constructor.
+data CreateEnvironment = CreateEnvironment'
+  { -- | The list of Amazon Resource Names (ARN) of the data bundles to install.
+    -- Currently supported data bundle ARNs:
+    --
+    -- -   @arn:aws:finspace:${Region}::data-bundle\/capital-markets-sample@ -
+    --     Contains sample Capital Markets datasets, categories and controlled
+    --     vocabularies.
+    --
+    -- -   @arn:aws:finspace:${Region}::data-bundle\/taq@ (default) - Contains
+    --     trades and quotes data in addition to sample Capital Markets data.
+    dataBundles :: Prelude.Maybe [Prelude.Text],
+    -- | The description of the FinSpace environment to be created.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | Authentication mode for the environment.
+    --
+    -- -   @FEDERATED@ - Users access FinSpace through Single Sign On (SSO) via
+    --     your Identity provider.
+    --
+    -- -   @LOCAL@ - Users access FinSpace via email and password managed
+    --     within the FinSpace environment.
+    federationMode :: Prelude.Maybe FederationMode,
+    -- | Configuration information when authentication mode is FEDERATED.
+    federationParameters :: Prelude.Maybe FederationParameters,
+    -- | The KMS key id to encrypt your data in the FinSpace environment.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | Configuration information for the superuser.
+    superuserParameters :: Prelude.Maybe SuperuserParameters,
+    -- | Add tags to your FinSpace environment.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of the FinSpace environment to be created.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateEnvironment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataBundles', 'createEnvironment_dataBundles' - The list of Amazon Resource Names (ARN) of the data bundles to install.
+-- Currently supported data bundle ARNs:
+--
+-- -   @arn:aws:finspace:${Region}::data-bundle\/capital-markets-sample@ -
+--     Contains sample Capital Markets datasets, categories and controlled
+--     vocabularies.
+--
+-- -   @arn:aws:finspace:${Region}::data-bundle\/taq@ (default) - Contains
+--     trades and quotes data in addition to sample Capital Markets data.
+--
+-- 'description', 'createEnvironment_description' - The description of the FinSpace environment to be created.
+--
+-- 'federationMode', 'createEnvironment_federationMode' - Authentication mode for the environment.
+--
+-- -   @FEDERATED@ - Users access FinSpace through Single Sign On (SSO) via
+--     your Identity provider.
+--
+-- -   @LOCAL@ - Users access FinSpace via email and password managed
+--     within the FinSpace environment.
+--
+-- 'federationParameters', 'createEnvironment_federationParameters' - Configuration information when authentication mode is FEDERATED.
+--
+-- 'kmsKeyId', 'createEnvironment_kmsKeyId' - The KMS key id to encrypt your data in the FinSpace environment.
+--
+-- 'superuserParameters', 'createEnvironment_superuserParameters' - Configuration information for the superuser.
+--
+-- 'tags', 'createEnvironment_tags' - Add tags to your FinSpace environment.
+--
+-- 'name', 'createEnvironment_name' - The name of the FinSpace environment to be created.
+newCreateEnvironment ::
+  -- | 'name'
+  Prelude.Text ->
+  CreateEnvironment
+newCreateEnvironment pName_ =
+  CreateEnvironment'
+    { dataBundles = Prelude.Nothing,
+      description = Prelude.Nothing,
+      federationMode = Prelude.Nothing,
+      federationParameters = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      superuserParameters = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | The list of Amazon Resource Names (ARN) of the data bundles to install.
+-- Currently supported data bundle ARNs:
+--
+-- -   @arn:aws:finspace:${Region}::data-bundle\/capital-markets-sample@ -
+--     Contains sample Capital Markets datasets, categories and controlled
+--     vocabularies.
+--
+-- -   @arn:aws:finspace:${Region}::data-bundle\/taq@ (default) - Contains
+--     trades and quotes data in addition to sample Capital Markets data.
+createEnvironment_dataBundles :: Lens.Lens' CreateEnvironment (Prelude.Maybe [Prelude.Text])
+createEnvironment_dataBundles = Lens.lens (\CreateEnvironment' {dataBundles} -> dataBundles) (\s@CreateEnvironment' {} a -> s {dataBundles = a} :: CreateEnvironment) Prelude.. Lens.mapping Lens.coerced
+
+-- | The description of the FinSpace environment to be created.
+createEnvironment_description :: Lens.Lens' CreateEnvironment (Prelude.Maybe Prelude.Text)
+createEnvironment_description = Lens.lens (\CreateEnvironment' {description} -> description) (\s@CreateEnvironment' {} a -> s {description = a} :: CreateEnvironment)
+
+-- | Authentication mode for the environment.
+--
+-- -   @FEDERATED@ - Users access FinSpace through Single Sign On (SSO) via
+--     your Identity provider.
+--
+-- -   @LOCAL@ - Users access FinSpace via email and password managed
+--     within the FinSpace environment.
+createEnvironment_federationMode :: Lens.Lens' CreateEnvironment (Prelude.Maybe FederationMode)
+createEnvironment_federationMode = Lens.lens (\CreateEnvironment' {federationMode} -> federationMode) (\s@CreateEnvironment' {} a -> s {federationMode = a} :: CreateEnvironment)
+
+-- | Configuration information when authentication mode is FEDERATED.
+createEnvironment_federationParameters :: Lens.Lens' CreateEnvironment (Prelude.Maybe FederationParameters)
+createEnvironment_federationParameters = Lens.lens (\CreateEnvironment' {federationParameters} -> federationParameters) (\s@CreateEnvironment' {} a -> s {federationParameters = a} :: CreateEnvironment)
+
+-- | The KMS key id to encrypt your data in the FinSpace environment.
+createEnvironment_kmsKeyId :: Lens.Lens' CreateEnvironment (Prelude.Maybe Prelude.Text)
+createEnvironment_kmsKeyId = Lens.lens (\CreateEnvironment' {kmsKeyId} -> kmsKeyId) (\s@CreateEnvironment' {} a -> s {kmsKeyId = a} :: CreateEnvironment)
+
+-- | Configuration information for the superuser.
+createEnvironment_superuserParameters :: Lens.Lens' CreateEnvironment (Prelude.Maybe SuperuserParameters)
+createEnvironment_superuserParameters = Lens.lens (\CreateEnvironment' {superuserParameters} -> superuserParameters) (\s@CreateEnvironment' {} a -> s {superuserParameters = a} :: CreateEnvironment)
+
+-- | Add tags to your FinSpace environment.
+createEnvironment_tags :: Lens.Lens' CreateEnvironment (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createEnvironment_tags = Lens.lens (\CreateEnvironment' {tags} -> tags) (\s@CreateEnvironment' {} a -> s {tags = a} :: CreateEnvironment) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the FinSpace environment to be created.
+createEnvironment_name :: Lens.Lens' CreateEnvironment Prelude.Text
+createEnvironment_name = Lens.lens (\CreateEnvironment' {name} -> name) (\s@CreateEnvironment' {} a -> s {name = a} :: CreateEnvironment)
+
+instance Core.AWSRequest CreateEnvironment where
+  type
+    AWSResponse CreateEnvironment =
+      CreateEnvironmentResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateEnvironmentResponse'
+            Prelude.<$> (x Data..?> "environmentArn")
+            Prelude.<*> (x Data..?> "environmentId")
+            Prelude.<*> (x Data..?> "environmentUrl")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateEnvironment where
+  hashWithSalt _salt CreateEnvironment' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataBundles
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` federationMode
+      `Prelude.hashWithSalt` federationParameters
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` superuserParameters
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData CreateEnvironment where
+  rnf CreateEnvironment' {..} =
+    Prelude.rnf dataBundles
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf federationMode
+      `Prelude.seq` Prelude.rnf federationParameters
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf superuserParameters
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToHeaders CreateEnvironment where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateEnvironment where
+  toJSON CreateEnvironment' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("dataBundles" Data..=) Prelude.<$> dataBundles,
+            ("description" Data..=) Prelude.<$> description,
+            ("federationMode" Data..=)
+              Prelude.<$> federationMode,
+            ("federationParameters" Data..=)
+              Prelude.<$> federationParameters,
+            ("kmsKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("superuserParameters" Data..=)
+              Prelude.<$> superuserParameters,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name)
+          ]
+      )
+
+instance Data.ToPath CreateEnvironment where
+  toPath = Prelude.const "/environment"
+
+instance Data.ToQuery CreateEnvironment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateEnvironmentResponse' smart constructor.
+data CreateEnvironmentResponse = CreateEnvironmentResponse'
+  { -- | The Amazon Resource Name (ARN) of the FinSpace environment that you
+    -- created.
+    environmentArn :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for FinSpace environment that you created.
+    environmentId :: Prelude.Maybe Prelude.Text,
+    -- | The sign-in url for the web application of the FinSpace environment you
+    -- created.
+    environmentUrl :: 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 'CreateEnvironmentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'environmentArn', 'createEnvironmentResponse_environmentArn' - The Amazon Resource Name (ARN) of the FinSpace environment that you
+-- created.
+--
+-- 'environmentId', 'createEnvironmentResponse_environmentId' - The unique identifier for FinSpace environment that you created.
+--
+-- 'environmentUrl', 'createEnvironmentResponse_environmentUrl' - The sign-in url for the web application of the FinSpace environment you
+-- created.
+--
+-- 'httpStatus', 'createEnvironmentResponse_httpStatus' - The response's http status code.
+newCreateEnvironmentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateEnvironmentResponse
+newCreateEnvironmentResponse pHttpStatus_ =
+  CreateEnvironmentResponse'
+    { environmentArn =
+        Prelude.Nothing,
+      environmentId = Prelude.Nothing,
+      environmentUrl = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the FinSpace environment that you
+-- created.
+createEnvironmentResponse_environmentArn :: Lens.Lens' CreateEnvironmentResponse (Prelude.Maybe Prelude.Text)
+createEnvironmentResponse_environmentArn = Lens.lens (\CreateEnvironmentResponse' {environmentArn} -> environmentArn) (\s@CreateEnvironmentResponse' {} a -> s {environmentArn = a} :: CreateEnvironmentResponse)
+
+-- | The unique identifier for FinSpace environment that you created.
+createEnvironmentResponse_environmentId :: Lens.Lens' CreateEnvironmentResponse (Prelude.Maybe Prelude.Text)
+createEnvironmentResponse_environmentId = Lens.lens (\CreateEnvironmentResponse' {environmentId} -> environmentId) (\s@CreateEnvironmentResponse' {} a -> s {environmentId = a} :: CreateEnvironmentResponse)
+
+-- | The sign-in url for the web application of the FinSpace environment you
+-- created.
+createEnvironmentResponse_environmentUrl :: Lens.Lens' CreateEnvironmentResponse (Prelude.Maybe Prelude.Text)
+createEnvironmentResponse_environmentUrl = Lens.lens (\CreateEnvironmentResponse' {environmentUrl} -> environmentUrl) (\s@CreateEnvironmentResponse' {} a -> s {environmentUrl = a} :: CreateEnvironmentResponse)
+
+-- | The response's http status code.
+createEnvironmentResponse_httpStatus :: Lens.Lens' CreateEnvironmentResponse Prelude.Int
+createEnvironmentResponse_httpStatus = Lens.lens (\CreateEnvironmentResponse' {httpStatus} -> httpStatus) (\s@CreateEnvironmentResponse' {} a -> s {httpStatus = a} :: CreateEnvironmentResponse)
+
+instance Prelude.NFData CreateEnvironmentResponse where
+  rnf CreateEnvironmentResponse' {..} =
+    Prelude.rnf environmentArn
+      `Prelude.seq` Prelude.rnf environmentId
+      `Prelude.seq` Prelude.rnf environmentUrl
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpace/DeleteEnvironment.hs b/gen/Amazonka/FinSpace/DeleteEnvironment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/DeleteEnvironment.hs
@@ -0,0 +1,148 @@
+{-# 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.FinSpace.DeleteEnvironment
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Delete an FinSpace environment.
+module Amazonka.FinSpace.DeleteEnvironment
+  ( -- * Creating a Request
+    DeleteEnvironment (..),
+    newDeleteEnvironment,
+
+    -- * Request Lenses
+    deleteEnvironment_environmentId,
+
+    -- * Destructuring the Response
+    DeleteEnvironmentResponse (..),
+    newDeleteEnvironmentResponse,
+
+    -- * Response Lenses
+    deleteEnvironmentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpace.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteEnvironment' smart constructor.
+data DeleteEnvironment = DeleteEnvironment'
+  { -- | The identifier for the FinSpace environment.
+    environmentId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteEnvironment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'environmentId', 'deleteEnvironment_environmentId' - The identifier for the FinSpace environment.
+newDeleteEnvironment ::
+  -- | 'environmentId'
+  Prelude.Text ->
+  DeleteEnvironment
+newDeleteEnvironment pEnvironmentId_ =
+  DeleteEnvironment' {environmentId = pEnvironmentId_}
+
+-- | The identifier for the FinSpace environment.
+deleteEnvironment_environmentId :: Lens.Lens' DeleteEnvironment Prelude.Text
+deleteEnvironment_environmentId = Lens.lens (\DeleteEnvironment' {environmentId} -> environmentId) (\s@DeleteEnvironment' {} a -> s {environmentId = a} :: DeleteEnvironment)
+
+instance Core.AWSRequest DeleteEnvironment where
+  type
+    AWSResponse DeleteEnvironment =
+      DeleteEnvironmentResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteEnvironmentResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteEnvironment where
+  hashWithSalt _salt DeleteEnvironment' {..} =
+    _salt `Prelude.hashWithSalt` environmentId
+
+instance Prelude.NFData DeleteEnvironment where
+  rnf DeleteEnvironment' {..} =
+    Prelude.rnf environmentId
+
+instance Data.ToHeaders DeleteEnvironment where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteEnvironment where
+  toPath DeleteEnvironment' {..} =
+    Prelude.mconcat
+      ["/environment/", Data.toBS environmentId]
+
+instance Data.ToQuery DeleteEnvironment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteEnvironmentResponse' smart constructor.
+data DeleteEnvironmentResponse = DeleteEnvironmentResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteEnvironmentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'deleteEnvironmentResponse_httpStatus' - The response's http status code.
+newDeleteEnvironmentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteEnvironmentResponse
+newDeleteEnvironmentResponse pHttpStatus_ =
+  DeleteEnvironmentResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteEnvironmentResponse_httpStatus :: Lens.Lens' DeleteEnvironmentResponse Prelude.Int
+deleteEnvironmentResponse_httpStatus = Lens.lens (\DeleteEnvironmentResponse' {httpStatus} -> httpStatus) (\s@DeleteEnvironmentResponse' {} a -> s {httpStatus = a} :: DeleteEnvironmentResponse)
+
+instance Prelude.NFData DeleteEnvironmentResponse where
+  rnf DeleteEnvironmentResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpace/GetEnvironment.hs b/gen/Amazonka/FinSpace/GetEnvironment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/GetEnvironment.hs
@@ -0,0 +1,159 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpace.GetEnvironment
+-- 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 FinSpace environment object.
+module Amazonka.FinSpace.GetEnvironment
+  ( -- * Creating a Request
+    GetEnvironment (..),
+    newGetEnvironment,
+
+    -- * Request Lenses
+    getEnvironment_environmentId,
+
+    -- * Destructuring the Response
+    GetEnvironmentResponse (..),
+    newGetEnvironmentResponse,
+
+    -- * Response Lenses
+    getEnvironmentResponse_environment,
+    getEnvironmentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpace.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetEnvironment' smart constructor.
+data GetEnvironment = GetEnvironment'
+  { -- | The identifier of the FinSpace environment.
+    environmentId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetEnvironment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'environmentId', 'getEnvironment_environmentId' - The identifier of the FinSpace environment.
+newGetEnvironment ::
+  -- | 'environmentId'
+  Prelude.Text ->
+  GetEnvironment
+newGetEnvironment pEnvironmentId_ =
+  GetEnvironment' {environmentId = pEnvironmentId_}
+
+-- | The identifier of the FinSpace environment.
+getEnvironment_environmentId :: Lens.Lens' GetEnvironment Prelude.Text
+getEnvironment_environmentId = Lens.lens (\GetEnvironment' {environmentId} -> environmentId) (\s@GetEnvironment' {} a -> s {environmentId = a} :: GetEnvironment)
+
+instance Core.AWSRequest GetEnvironment where
+  type
+    AWSResponse GetEnvironment =
+      GetEnvironmentResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetEnvironmentResponse'
+            Prelude.<$> (x Data..?> "environment")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetEnvironment where
+  hashWithSalt _salt GetEnvironment' {..} =
+    _salt `Prelude.hashWithSalt` environmentId
+
+instance Prelude.NFData GetEnvironment where
+  rnf GetEnvironment' {..} = Prelude.rnf environmentId
+
+instance Data.ToHeaders GetEnvironment where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetEnvironment where
+  toPath GetEnvironment' {..} =
+    Prelude.mconcat
+      ["/environment/", Data.toBS environmentId]
+
+instance Data.ToQuery GetEnvironment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetEnvironmentResponse' smart constructor.
+data GetEnvironmentResponse = GetEnvironmentResponse'
+  { -- | The name of the FinSpace environment.
+    environment :: Prelude.Maybe Environment,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetEnvironmentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'environment', 'getEnvironmentResponse_environment' - The name of the FinSpace environment.
+--
+-- 'httpStatus', 'getEnvironmentResponse_httpStatus' - The response's http status code.
+newGetEnvironmentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetEnvironmentResponse
+newGetEnvironmentResponse pHttpStatus_ =
+  GetEnvironmentResponse'
+    { environment =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The name of the FinSpace environment.
+getEnvironmentResponse_environment :: Lens.Lens' GetEnvironmentResponse (Prelude.Maybe Environment)
+getEnvironmentResponse_environment = Lens.lens (\GetEnvironmentResponse' {environment} -> environment) (\s@GetEnvironmentResponse' {} a -> s {environment = a} :: GetEnvironmentResponse)
+
+-- | The response's http status code.
+getEnvironmentResponse_httpStatus :: Lens.Lens' GetEnvironmentResponse Prelude.Int
+getEnvironmentResponse_httpStatus = Lens.lens (\GetEnvironmentResponse' {httpStatus} -> httpStatus) (\s@GetEnvironmentResponse' {} a -> s {httpStatus = a} :: GetEnvironmentResponse)
+
+instance Prelude.NFData GetEnvironmentResponse where
+  rnf GetEnvironmentResponse' {..} =
+    Prelude.rnf environment
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpace/Lens.hs b/gen/Amazonka/FinSpace/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/Lens.hs
@@ -0,0 +1,112 @@
+{-# 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.FinSpace.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.FinSpace.Lens
+  ( -- * Operations
+
+    -- ** CreateEnvironment
+    createEnvironment_dataBundles,
+    createEnvironment_description,
+    createEnvironment_federationMode,
+    createEnvironment_federationParameters,
+    createEnvironment_kmsKeyId,
+    createEnvironment_superuserParameters,
+    createEnvironment_tags,
+    createEnvironment_name,
+    createEnvironmentResponse_environmentArn,
+    createEnvironmentResponse_environmentId,
+    createEnvironmentResponse_environmentUrl,
+    createEnvironmentResponse_httpStatus,
+
+    -- ** DeleteEnvironment
+    deleteEnvironment_environmentId,
+    deleteEnvironmentResponse_httpStatus,
+
+    -- ** GetEnvironment
+    getEnvironment_environmentId,
+    getEnvironmentResponse_environment,
+    getEnvironmentResponse_httpStatus,
+
+    -- ** ListEnvironments
+    listEnvironments_maxResults,
+    listEnvironments_nextToken,
+    listEnvironmentsResponse_environments,
+    listEnvironmentsResponse_nextToken,
+    listEnvironmentsResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateEnvironment
+    updateEnvironment_description,
+    updateEnvironment_federationMode,
+    updateEnvironment_federationParameters,
+    updateEnvironment_name,
+    updateEnvironment_environmentId,
+    updateEnvironmentResponse_environment,
+    updateEnvironmentResponse_httpStatus,
+
+    -- * Types
+
+    -- ** Environment
+    environment_awsAccountId,
+    environment_dedicatedServiceAccountId,
+    environment_description,
+    environment_environmentArn,
+    environment_environmentId,
+    environment_environmentUrl,
+    environment_federationMode,
+    environment_federationParameters,
+    environment_kmsKeyId,
+    environment_name,
+    environment_sageMakerStudioDomainUrl,
+    environment_status,
+
+    -- ** FederationParameters
+    federationParameters_applicationCallBackURL,
+    federationParameters_attributeMap,
+    federationParameters_federationProviderName,
+    federationParameters_federationURN,
+    federationParameters_samlMetadataDocument,
+    federationParameters_samlMetadataURL,
+
+    -- ** SuperuserParameters
+    superuserParameters_emailAddress,
+    superuserParameters_firstName,
+    superuserParameters_lastName,
+  )
+where
+
+import Amazonka.FinSpace.CreateEnvironment
+import Amazonka.FinSpace.DeleteEnvironment
+import Amazonka.FinSpace.GetEnvironment
+import Amazonka.FinSpace.ListEnvironments
+import Amazonka.FinSpace.ListTagsForResource
+import Amazonka.FinSpace.TagResource
+import Amazonka.FinSpace.Types.Environment
+import Amazonka.FinSpace.Types.FederationParameters
+import Amazonka.FinSpace.Types.SuperuserParameters
+import Amazonka.FinSpace.UntagResource
+import Amazonka.FinSpace.UpdateEnvironment
diff --git a/gen/Amazonka/FinSpace/ListEnvironments.hs b/gen/Amazonka/FinSpace/ListEnvironments.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/ListEnvironments.hs
@@ -0,0 +1,199 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpace.ListEnvironments
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- A list of all of your FinSpace environments.
+module Amazonka.FinSpace.ListEnvironments
+  ( -- * Creating a Request
+    ListEnvironments (..),
+    newListEnvironments,
+
+    -- * Request Lenses
+    listEnvironments_maxResults,
+    listEnvironments_nextToken,
+
+    -- * Destructuring the Response
+    ListEnvironmentsResponse (..),
+    newListEnvironmentsResponse,
+
+    -- * Response Lenses
+    listEnvironmentsResponse_environments,
+    listEnvironmentsResponse_nextToken,
+    listEnvironmentsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpace.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListEnvironments' smart constructor.
+data ListEnvironments = ListEnvironments'
+  { -- | The maximum number of results to return in this request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token generated by FinSpace that specifies where to continue
+    -- pagination if a previous request was truncated. To get the next set of
+    -- pages, pass in the nextToken value from the response object of the
+    -- previous page call.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListEnvironments' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listEnvironments_maxResults' - The maximum number of results to return in this request.
+--
+-- 'nextToken', 'listEnvironments_nextToken' - A token generated by FinSpace that specifies where to continue
+-- pagination if a previous request was truncated. To get the next set of
+-- pages, pass in the nextToken value from the response object of the
+-- previous page call.
+newListEnvironments ::
+  ListEnvironments
+newListEnvironments =
+  ListEnvironments'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return in this request.
+listEnvironments_maxResults :: Lens.Lens' ListEnvironments (Prelude.Maybe Prelude.Natural)
+listEnvironments_maxResults = Lens.lens (\ListEnvironments' {maxResults} -> maxResults) (\s@ListEnvironments' {} a -> s {maxResults = a} :: ListEnvironments)
+
+-- | A token generated by FinSpace that specifies where to continue
+-- pagination if a previous request was truncated. To get the next set of
+-- pages, pass in the nextToken value from the response object of the
+-- previous page call.
+listEnvironments_nextToken :: Lens.Lens' ListEnvironments (Prelude.Maybe Prelude.Text)
+listEnvironments_nextToken = Lens.lens (\ListEnvironments' {nextToken} -> nextToken) (\s@ListEnvironments' {} a -> s {nextToken = a} :: ListEnvironments)
+
+instance Core.AWSRequest ListEnvironments where
+  type
+    AWSResponse ListEnvironments =
+      ListEnvironmentsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListEnvironmentsResponse'
+            Prelude.<$> (x Data..?> "environments" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListEnvironments where
+  hashWithSalt _salt ListEnvironments' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListEnvironments where
+  rnf ListEnvironments' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListEnvironments where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListEnvironments where
+  toPath = Prelude.const "/environment"
+
+instance Data.ToQuery ListEnvironments where
+  toQuery ListEnvironments' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListEnvironmentsResponse' smart constructor.
+data ListEnvironmentsResponse = ListEnvironmentsResponse'
+  { -- | A list of all of your FinSpace environments.
+    environments :: Prelude.Maybe [Environment],
+    -- | A token that you can use in a subsequent call to retrieve the next set
+    -- of results.
+    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 'ListEnvironmentsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'environments', 'listEnvironmentsResponse_environments' - A list of all of your FinSpace environments.
+--
+-- 'nextToken', 'listEnvironmentsResponse_nextToken' - A token that you can use in a subsequent call to retrieve the next set
+-- of results.
+--
+-- 'httpStatus', 'listEnvironmentsResponse_httpStatus' - The response's http status code.
+newListEnvironmentsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListEnvironmentsResponse
+newListEnvironmentsResponse pHttpStatus_ =
+  ListEnvironmentsResponse'
+    { environments =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of all of your FinSpace environments.
+listEnvironmentsResponse_environments :: Lens.Lens' ListEnvironmentsResponse (Prelude.Maybe [Environment])
+listEnvironmentsResponse_environments = Lens.lens (\ListEnvironmentsResponse' {environments} -> environments) (\s@ListEnvironmentsResponse' {} a -> s {environments = a} :: ListEnvironmentsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token that you can use in a subsequent call to retrieve the next set
+-- of results.
+listEnvironmentsResponse_nextToken :: Lens.Lens' ListEnvironmentsResponse (Prelude.Maybe Prelude.Text)
+listEnvironmentsResponse_nextToken = Lens.lens (\ListEnvironmentsResponse' {nextToken} -> nextToken) (\s@ListEnvironmentsResponse' {} a -> s {nextToken = a} :: ListEnvironmentsResponse)
+
+-- | The response's http status code.
+listEnvironmentsResponse_httpStatus :: Lens.Lens' ListEnvironmentsResponse Prelude.Int
+listEnvironmentsResponse_httpStatus = Lens.lens (\ListEnvironmentsResponse' {httpStatus} -> httpStatus) (\s@ListEnvironmentsResponse' {} a -> s {httpStatus = a} :: ListEnvironmentsResponse)
+
+instance Prelude.NFData ListEnvironmentsResponse where
+  rnf ListEnvironmentsResponse' {..} =
+    Prelude.rnf environments
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpace/ListTagsForResource.hs b/gen/Amazonka/FinSpace/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/ListTagsForResource.hs
@@ -0,0 +1,159 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FinSpace.ListTagsForResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- A list of all tags for a resource.
+module Amazonka.FinSpace.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpace.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The Amazon Resource Name of the resource.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The Amazon Resource Name of the resource.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name of the resource.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath ListTagsForResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | A list of all tags for a resource.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - A list of all tags for a resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of all tags for a resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpace/TagResource.hs b/gen/Amazonka/FinSpace/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/TagResource.hs
@@ -0,0 +1,163 @@
+{-# 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.FinSpace.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds metadata tags to a FinSpace resource.
+module Amazonka.FinSpace.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpace.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) for the resource.
+    resourceArn :: Prelude.Text,
+    -- | One or more tags to be assigned to the resource.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The Amazon Resource Name (ARN) for the resource.
+--
+-- 'tags', 'tagResource_tags' - One or more tags to be assigned to the resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) for the resource.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | One or more tags to be assigned to the resource.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.HashMap Prelude.Text Prelude.Text)
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("tags" Data..= tags)]
+      )
+
+instance Data.ToPath TagResource where
+  toPath TagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpace/Types.hs b/gen/Amazonka/FinSpace/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/Types.hs
@@ -0,0 +1,217 @@
+{-# 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.FinSpace.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.FinSpace.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _InternalServerException,
+    _InvalidRequestException,
+    _LimitExceededException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * EnvironmentStatus
+    EnvironmentStatus (..),
+
+    -- * FederationMode
+    FederationMode (..),
+
+    -- * Environment
+    Environment (..),
+    newEnvironment,
+    environment_awsAccountId,
+    environment_dedicatedServiceAccountId,
+    environment_description,
+    environment_environmentArn,
+    environment_environmentId,
+    environment_environmentUrl,
+    environment_federationMode,
+    environment_federationParameters,
+    environment_kmsKeyId,
+    environment_name,
+    environment_sageMakerStudioDomainUrl,
+    environment_status,
+
+    -- * FederationParameters
+    FederationParameters (..),
+    newFederationParameters,
+    federationParameters_applicationCallBackURL,
+    federationParameters_attributeMap,
+    federationParameters_federationProviderName,
+    federationParameters_federationURN,
+    federationParameters_samlMetadataDocument,
+    federationParameters_samlMetadataURL,
+
+    -- * SuperuserParameters
+    SuperuserParameters (..),
+    newSuperuserParameters,
+    superuserParameters_emailAddress,
+    superuserParameters_firstName,
+    superuserParameters_lastName,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.FinSpace.Types.Environment
+import Amazonka.FinSpace.Types.EnvironmentStatus
+import Amazonka.FinSpace.Types.FederationMode
+import Amazonka.FinSpace.Types.FederationParameters
+import Amazonka.FinSpace.Types.SuperuserParameters
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2021-03-12@ of the Amazon FinSpace User Environment Management service SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "FinSpace",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "finspace",
+      Core.signingName = "finspace",
+      Core.version = "2021-03-12",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "FinSpace",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | You do not have sufficient access to perform this action.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | The request processing has failed because of an unknown error, exception
+-- or failure.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | The request is invalid. Something is wrong with the input to the
+-- request.
+_InvalidRequestException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidRequestException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidRequestException"
+    Prelude.. Core.hasStatus 400
+
+-- | A service limit or quota is exceeded.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+    Prelude.. Core.hasStatus 400
+
+-- | One or more resources can\'t be found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 400
+
+-- | You have exceeded your service quota. To perform the requested action,
+-- remove some of the relevant resources, or use Service Quotas to request
+-- a service quota increase.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+-- | The request was denied due to request throttling.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | The input fails to satisfy the constraints specified by an AWS service.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/FinSpace/Types/Environment.hs b/gen/Amazonka/FinSpace/Types/Environment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/Types/Environment.hs
@@ -0,0 +1,213 @@
+{-# 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.FinSpace.Types.Environment
+-- 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.FinSpace.Types.Environment where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpace.Types.EnvironmentStatus
+import Amazonka.FinSpace.Types.FederationMode
+import Amazonka.FinSpace.Types.FederationParameters
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents an FinSpace environment.
+--
+-- /See:/ 'newEnvironment' smart constructor.
+data Environment = Environment'
+  { -- | The ID of the AWS account in which the FinSpace environment is created.
+    awsAccountId :: Prelude.Maybe Prelude.Text,
+    -- | The AWS account ID of the dedicated service account associated with your
+    -- FinSpace environment.
+    dedicatedServiceAccountId :: Prelude.Maybe Prelude.Text,
+    -- | The description of the FinSpace environment.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of your FinSpace environment.
+    environmentArn :: Prelude.Maybe Prelude.Text,
+    -- | The identifier of the FinSpace environment.
+    environmentId :: Prelude.Maybe Prelude.Text,
+    -- | The sign-in url for the web application of your FinSpace environment.
+    environmentUrl :: Prelude.Maybe Prelude.Text,
+    -- | The authentication mode for the environment.
+    federationMode :: Prelude.Maybe FederationMode,
+    -- | Configuration information when authentication mode is FEDERATED.
+    federationParameters :: Prelude.Maybe FederationParameters,
+    -- | The KMS key id used to encrypt in the FinSpace environment.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the FinSpace environment.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The url of the integrated FinSpace notebook environment in your web
+    -- application.
+    sageMakerStudioDomainUrl :: Prelude.Maybe Prelude.Text,
+    -- | The current status of creation of the FinSpace environment.
+    status :: Prelude.Maybe EnvironmentStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Environment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'awsAccountId', 'environment_awsAccountId' - The ID of the AWS account in which the FinSpace environment is created.
+--
+-- 'dedicatedServiceAccountId', 'environment_dedicatedServiceAccountId' - The AWS account ID of the dedicated service account associated with your
+-- FinSpace environment.
+--
+-- 'description', 'environment_description' - The description of the FinSpace environment.
+--
+-- 'environmentArn', 'environment_environmentArn' - The Amazon Resource Name (ARN) of your FinSpace environment.
+--
+-- 'environmentId', 'environment_environmentId' - The identifier of the FinSpace environment.
+--
+-- 'environmentUrl', 'environment_environmentUrl' - The sign-in url for the web application of your FinSpace environment.
+--
+-- 'federationMode', 'environment_federationMode' - The authentication mode for the environment.
+--
+-- 'federationParameters', 'environment_federationParameters' - Configuration information when authentication mode is FEDERATED.
+--
+-- 'kmsKeyId', 'environment_kmsKeyId' - The KMS key id used to encrypt in the FinSpace environment.
+--
+-- 'name', 'environment_name' - The name of the FinSpace environment.
+--
+-- 'sageMakerStudioDomainUrl', 'environment_sageMakerStudioDomainUrl' - The url of the integrated FinSpace notebook environment in your web
+-- application.
+--
+-- 'status', 'environment_status' - The current status of creation of the FinSpace environment.
+newEnvironment ::
+  Environment
+newEnvironment =
+  Environment'
+    { awsAccountId = Prelude.Nothing,
+      dedicatedServiceAccountId = Prelude.Nothing,
+      description = Prelude.Nothing,
+      environmentArn = Prelude.Nothing,
+      environmentId = Prelude.Nothing,
+      environmentUrl = Prelude.Nothing,
+      federationMode = Prelude.Nothing,
+      federationParameters = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      name = Prelude.Nothing,
+      sageMakerStudioDomainUrl = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The ID of the AWS account in which the FinSpace environment is created.
+environment_awsAccountId :: Lens.Lens' Environment (Prelude.Maybe Prelude.Text)
+environment_awsAccountId = Lens.lens (\Environment' {awsAccountId} -> awsAccountId) (\s@Environment' {} a -> s {awsAccountId = a} :: Environment)
+
+-- | The AWS account ID of the dedicated service account associated with your
+-- FinSpace environment.
+environment_dedicatedServiceAccountId :: Lens.Lens' Environment (Prelude.Maybe Prelude.Text)
+environment_dedicatedServiceAccountId = Lens.lens (\Environment' {dedicatedServiceAccountId} -> dedicatedServiceAccountId) (\s@Environment' {} a -> s {dedicatedServiceAccountId = a} :: Environment)
+
+-- | The description of the FinSpace environment.
+environment_description :: Lens.Lens' Environment (Prelude.Maybe Prelude.Text)
+environment_description = Lens.lens (\Environment' {description} -> description) (\s@Environment' {} a -> s {description = a} :: Environment)
+
+-- | The Amazon Resource Name (ARN) of your FinSpace environment.
+environment_environmentArn :: Lens.Lens' Environment (Prelude.Maybe Prelude.Text)
+environment_environmentArn = Lens.lens (\Environment' {environmentArn} -> environmentArn) (\s@Environment' {} a -> s {environmentArn = a} :: Environment)
+
+-- | The identifier of the FinSpace environment.
+environment_environmentId :: Lens.Lens' Environment (Prelude.Maybe Prelude.Text)
+environment_environmentId = Lens.lens (\Environment' {environmentId} -> environmentId) (\s@Environment' {} a -> s {environmentId = a} :: Environment)
+
+-- | The sign-in url for the web application of your FinSpace environment.
+environment_environmentUrl :: Lens.Lens' Environment (Prelude.Maybe Prelude.Text)
+environment_environmentUrl = Lens.lens (\Environment' {environmentUrl} -> environmentUrl) (\s@Environment' {} a -> s {environmentUrl = a} :: Environment)
+
+-- | The authentication mode for the environment.
+environment_federationMode :: Lens.Lens' Environment (Prelude.Maybe FederationMode)
+environment_federationMode = Lens.lens (\Environment' {federationMode} -> federationMode) (\s@Environment' {} a -> s {federationMode = a} :: Environment)
+
+-- | Configuration information when authentication mode is FEDERATED.
+environment_federationParameters :: Lens.Lens' Environment (Prelude.Maybe FederationParameters)
+environment_federationParameters = Lens.lens (\Environment' {federationParameters} -> federationParameters) (\s@Environment' {} a -> s {federationParameters = a} :: Environment)
+
+-- | The KMS key id used to encrypt in the FinSpace environment.
+environment_kmsKeyId :: Lens.Lens' Environment (Prelude.Maybe Prelude.Text)
+environment_kmsKeyId = Lens.lens (\Environment' {kmsKeyId} -> kmsKeyId) (\s@Environment' {} a -> s {kmsKeyId = a} :: Environment)
+
+-- | The name of the FinSpace environment.
+environment_name :: Lens.Lens' Environment (Prelude.Maybe Prelude.Text)
+environment_name = Lens.lens (\Environment' {name} -> name) (\s@Environment' {} a -> s {name = a} :: Environment)
+
+-- | The url of the integrated FinSpace notebook environment in your web
+-- application.
+environment_sageMakerStudioDomainUrl :: Lens.Lens' Environment (Prelude.Maybe Prelude.Text)
+environment_sageMakerStudioDomainUrl = Lens.lens (\Environment' {sageMakerStudioDomainUrl} -> sageMakerStudioDomainUrl) (\s@Environment' {} a -> s {sageMakerStudioDomainUrl = a} :: Environment)
+
+-- | The current status of creation of the FinSpace environment.
+environment_status :: Lens.Lens' Environment (Prelude.Maybe EnvironmentStatus)
+environment_status = Lens.lens (\Environment' {status} -> status) (\s@Environment' {} a -> s {status = a} :: Environment)
+
+instance Data.FromJSON Environment where
+  parseJSON =
+    Data.withObject
+      "Environment"
+      ( \x ->
+          Environment'
+            Prelude.<$> (x Data..:? "awsAccountId")
+            Prelude.<*> (x Data..:? "dedicatedServiceAccountId")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "environmentArn")
+            Prelude.<*> (x Data..:? "environmentId")
+            Prelude.<*> (x Data..:? "environmentUrl")
+            Prelude.<*> (x Data..:? "federationMode")
+            Prelude.<*> (x Data..:? "federationParameters")
+            Prelude.<*> (x Data..:? "kmsKeyId")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "sageMakerStudioDomainUrl")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable Environment where
+  hashWithSalt _salt Environment' {..} =
+    _salt
+      `Prelude.hashWithSalt` awsAccountId
+      `Prelude.hashWithSalt` dedicatedServiceAccountId
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` environmentArn
+      `Prelude.hashWithSalt` environmentId
+      `Prelude.hashWithSalt` environmentUrl
+      `Prelude.hashWithSalt` federationMode
+      `Prelude.hashWithSalt` federationParameters
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` sageMakerStudioDomainUrl
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Environment where
+  rnf Environment' {..} =
+    Prelude.rnf awsAccountId
+      `Prelude.seq` Prelude.rnf dedicatedServiceAccountId
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf environmentArn
+      `Prelude.seq` Prelude.rnf environmentId
+      `Prelude.seq` Prelude.rnf environmentUrl
+      `Prelude.seq` Prelude.rnf federationMode
+      `Prelude.seq` Prelude.rnf federationParameters
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf sageMakerStudioDomainUrl
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/FinSpace/Types/EnvironmentStatus.hs b/gen/Amazonka/FinSpace/Types/EnvironmentStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/Types/EnvironmentStatus.hs
@@ -0,0 +1,111 @@
+{-# 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.FinSpace.Types.EnvironmentStatus
+-- 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.FinSpace.Types.EnvironmentStatus
+  ( EnvironmentStatus
+      ( ..,
+        EnvironmentStatus_CREATED,
+        EnvironmentStatus_CREATE_REQUESTED,
+        EnvironmentStatus_CREATING,
+        EnvironmentStatus_DELETED,
+        EnvironmentStatus_DELETE_REQUESTED,
+        EnvironmentStatus_DELETING,
+        EnvironmentStatus_FAILED_CREATION,
+        EnvironmentStatus_FAILED_DELETION,
+        EnvironmentStatus_RETRY_DELETION,
+        EnvironmentStatus_SUSPENDED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EnvironmentStatus = EnvironmentStatus'
+  { fromEnvironmentStatus ::
+      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 EnvironmentStatus_CREATED :: EnvironmentStatus
+pattern EnvironmentStatus_CREATED = EnvironmentStatus' "CREATED"
+
+pattern EnvironmentStatus_CREATE_REQUESTED :: EnvironmentStatus
+pattern EnvironmentStatus_CREATE_REQUESTED = EnvironmentStatus' "CREATE_REQUESTED"
+
+pattern EnvironmentStatus_CREATING :: EnvironmentStatus
+pattern EnvironmentStatus_CREATING = EnvironmentStatus' "CREATING"
+
+pattern EnvironmentStatus_DELETED :: EnvironmentStatus
+pattern EnvironmentStatus_DELETED = EnvironmentStatus' "DELETED"
+
+pattern EnvironmentStatus_DELETE_REQUESTED :: EnvironmentStatus
+pattern EnvironmentStatus_DELETE_REQUESTED = EnvironmentStatus' "DELETE_REQUESTED"
+
+pattern EnvironmentStatus_DELETING :: EnvironmentStatus
+pattern EnvironmentStatus_DELETING = EnvironmentStatus' "DELETING"
+
+pattern EnvironmentStatus_FAILED_CREATION :: EnvironmentStatus
+pattern EnvironmentStatus_FAILED_CREATION = EnvironmentStatus' "FAILED_CREATION"
+
+pattern EnvironmentStatus_FAILED_DELETION :: EnvironmentStatus
+pattern EnvironmentStatus_FAILED_DELETION = EnvironmentStatus' "FAILED_DELETION"
+
+pattern EnvironmentStatus_RETRY_DELETION :: EnvironmentStatus
+pattern EnvironmentStatus_RETRY_DELETION = EnvironmentStatus' "RETRY_DELETION"
+
+pattern EnvironmentStatus_SUSPENDED :: EnvironmentStatus
+pattern EnvironmentStatus_SUSPENDED = EnvironmentStatus' "SUSPENDED"
+
+{-# COMPLETE
+  EnvironmentStatus_CREATED,
+  EnvironmentStatus_CREATE_REQUESTED,
+  EnvironmentStatus_CREATING,
+  EnvironmentStatus_DELETED,
+  EnvironmentStatus_DELETE_REQUESTED,
+  EnvironmentStatus_DELETING,
+  EnvironmentStatus_FAILED_CREATION,
+  EnvironmentStatus_FAILED_DELETION,
+  EnvironmentStatus_RETRY_DELETION,
+  EnvironmentStatus_SUSPENDED,
+  EnvironmentStatus'
+  #-}
diff --git a/gen/Amazonka/FinSpace/Types/FederationMode.hs b/gen/Amazonka/FinSpace/Types/FederationMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/Types/FederationMode.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.FinSpace.Types.FederationMode
+-- 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.FinSpace.Types.FederationMode
+  ( FederationMode
+      ( ..,
+        FederationMode_FEDERATED,
+        FederationMode_LOCAL
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FederationMode = FederationMode'
+  { fromFederationMode ::
+      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 FederationMode_FEDERATED :: FederationMode
+pattern FederationMode_FEDERATED = FederationMode' "FEDERATED"
+
+pattern FederationMode_LOCAL :: FederationMode
+pattern FederationMode_LOCAL = FederationMode' "LOCAL"
+
+{-# COMPLETE
+  FederationMode_FEDERATED,
+  FederationMode_LOCAL,
+  FederationMode'
+  #-}
diff --git a/gen/Amazonka/FinSpace/Types/FederationParameters.hs b/gen/Amazonka/FinSpace/Types/FederationParameters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/Types/FederationParameters.hs
@@ -0,0 +1,174 @@
+{-# 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.FinSpace.Types.FederationParameters
+-- 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.FinSpace.Types.FederationParameters 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
+
+-- | Configuration information when authentication mode is FEDERATED.
+--
+-- /See:/ 'newFederationParameters' smart constructor.
+data FederationParameters = FederationParameters'
+  { -- | The redirect or sign-in URL that should be entered into the SAML 2.0
+    -- compliant identity provider configuration (IdP).
+    applicationCallBackURL :: Prelude.Maybe Prelude.Text,
+    -- | SAML attribute name and value. The name must always be @Email@ and the
+    -- value should be set to the attribute definition in which user email is
+    -- set. For example, name would be @Email@ and value
+    -- @http:\/\/schemas.xmlsoap.org\/ws\/2005\/05\/identity\/claims\/emailaddress@.
+    -- Please check your SAML 2.0 compliant identity provider (IdP)
+    -- documentation for details.
+    attributeMap :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Name of the identity provider (IdP).
+    federationProviderName :: Prelude.Maybe Prelude.Text,
+    -- | The Uniform Resource Name (URN). Also referred as Service Provider URN
+    -- or Audience URI or Service Provider Entity ID.
+    federationURN :: Prelude.Maybe Prelude.Text,
+    -- | SAML 2.0 Metadata document from identity provider (IdP).
+    samlMetadataDocument :: Prelude.Maybe Prelude.Text,
+    -- | Provide the metadata URL from your SAML 2.0 compliant identity provider
+    -- (IdP).
+    samlMetadataURL :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FederationParameters' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'applicationCallBackURL', 'federationParameters_applicationCallBackURL' - The redirect or sign-in URL that should be entered into the SAML 2.0
+-- compliant identity provider configuration (IdP).
+--
+-- 'attributeMap', 'federationParameters_attributeMap' - SAML attribute name and value. The name must always be @Email@ and the
+-- value should be set to the attribute definition in which user email is
+-- set. For example, name would be @Email@ and value
+-- @http:\/\/schemas.xmlsoap.org\/ws\/2005\/05\/identity\/claims\/emailaddress@.
+-- Please check your SAML 2.0 compliant identity provider (IdP)
+-- documentation for details.
+--
+-- 'federationProviderName', 'federationParameters_federationProviderName' - Name of the identity provider (IdP).
+--
+-- 'federationURN', 'federationParameters_federationURN' - The Uniform Resource Name (URN). Also referred as Service Provider URN
+-- or Audience URI or Service Provider Entity ID.
+--
+-- 'samlMetadataDocument', 'federationParameters_samlMetadataDocument' - SAML 2.0 Metadata document from identity provider (IdP).
+--
+-- 'samlMetadataURL', 'federationParameters_samlMetadataURL' - Provide the metadata URL from your SAML 2.0 compliant identity provider
+-- (IdP).
+newFederationParameters ::
+  FederationParameters
+newFederationParameters =
+  FederationParameters'
+    { applicationCallBackURL =
+        Prelude.Nothing,
+      attributeMap = Prelude.Nothing,
+      federationProviderName = Prelude.Nothing,
+      federationURN = Prelude.Nothing,
+      samlMetadataDocument = Prelude.Nothing,
+      samlMetadataURL = Prelude.Nothing
+    }
+
+-- | The redirect or sign-in URL that should be entered into the SAML 2.0
+-- compliant identity provider configuration (IdP).
+federationParameters_applicationCallBackURL :: Lens.Lens' FederationParameters (Prelude.Maybe Prelude.Text)
+federationParameters_applicationCallBackURL = Lens.lens (\FederationParameters' {applicationCallBackURL} -> applicationCallBackURL) (\s@FederationParameters' {} a -> s {applicationCallBackURL = a} :: FederationParameters)
+
+-- | SAML attribute name and value. The name must always be @Email@ and the
+-- value should be set to the attribute definition in which user email is
+-- set. For example, name would be @Email@ and value
+-- @http:\/\/schemas.xmlsoap.org\/ws\/2005\/05\/identity\/claims\/emailaddress@.
+-- Please check your SAML 2.0 compliant identity provider (IdP)
+-- documentation for details.
+federationParameters_attributeMap :: Lens.Lens' FederationParameters (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+federationParameters_attributeMap = Lens.lens (\FederationParameters' {attributeMap} -> attributeMap) (\s@FederationParameters' {} a -> s {attributeMap = a} :: FederationParameters) Prelude.. Lens.mapping Lens.coerced
+
+-- | Name of the identity provider (IdP).
+federationParameters_federationProviderName :: Lens.Lens' FederationParameters (Prelude.Maybe Prelude.Text)
+federationParameters_federationProviderName = Lens.lens (\FederationParameters' {federationProviderName} -> federationProviderName) (\s@FederationParameters' {} a -> s {federationProviderName = a} :: FederationParameters)
+
+-- | The Uniform Resource Name (URN). Also referred as Service Provider URN
+-- or Audience URI or Service Provider Entity ID.
+federationParameters_federationURN :: Lens.Lens' FederationParameters (Prelude.Maybe Prelude.Text)
+federationParameters_federationURN = Lens.lens (\FederationParameters' {federationURN} -> federationURN) (\s@FederationParameters' {} a -> s {federationURN = a} :: FederationParameters)
+
+-- | SAML 2.0 Metadata document from identity provider (IdP).
+federationParameters_samlMetadataDocument :: Lens.Lens' FederationParameters (Prelude.Maybe Prelude.Text)
+federationParameters_samlMetadataDocument = Lens.lens (\FederationParameters' {samlMetadataDocument} -> samlMetadataDocument) (\s@FederationParameters' {} a -> s {samlMetadataDocument = a} :: FederationParameters)
+
+-- | Provide the metadata URL from your SAML 2.0 compliant identity provider
+-- (IdP).
+federationParameters_samlMetadataURL :: Lens.Lens' FederationParameters (Prelude.Maybe Prelude.Text)
+federationParameters_samlMetadataURL = Lens.lens (\FederationParameters' {samlMetadataURL} -> samlMetadataURL) (\s@FederationParameters' {} a -> s {samlMetadataURL = a} :: FederationParameters)
+
+instance Data.FromJSON FederationParameters where
+  parseJSON =
+    Data.withObject
+      "FederationParameters"
+      ( \x ->
+          FederationParameters'
+            Prelude.<$> (x Data..:? "applicationCallBackURL")
+            Prelude.<*> (x Data..:? "attributeMap" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "federationProviderName")
+            Prelude.<*> (x Data..:? "federationURN")
+            Prelude.<*> (x Data..:? "samlMetadataDocument")
+            Prelude.<*> (x Data..:? "samlMetadataURL")
+      )
+
+instance Prelude.Hashable FederationParameters where
+  hashWithSalt _salt FederationParameters' {..} =
+    _salt
+      `Prelude.hashWithSalt` applicationCallBackURL
+      `Prelude.hashWithSalt` attributeMap
+      `Prelude.hashWithSalt` federationProviderName
+      `Prelude.hashWithSalt` federationURN
+      `Prelude.hashWithSalt` samlMetadataDocument
+      `Prelude.hashWithSalt` samlMetadataURL
+
+instance Prelude.NFData FederationParameters where
+  rnf FederationParameters' {..} =
+    Prelude.rnf applicationCallBackURL
+      `Prelude.seq` Prelude.rnf attributeMap
+      `Prelude.seq` Prelude.rnf federationProviderName
+      `Prelude.seq` Prelude.rnf federationURN
+      `Prelude.seq` Prelude.rnf samlMetadataDocument
+      `Prelude.seq` Prelude.rnf samlMetadataURL
+
+instance Data.ToJSON FederationParameters where
+  toJSON FederationParameters' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("applicationCallBackURL" Data..=)
+              Prelude.<$> applicationCallBackURL,
+            ("attributeMap" Data..=) Prelude.<$> attributeMap,
+            ("federationProviderName" Data..=)
+              Prelude.<$> federationProviderName,
+            ("federationURN" Data..=) Prelude.<$> federationURN,
+            ("samlMetadataDocument" Data..=)
+              Prelude.<$> samlMetadataDocument,
+            ("samlMetadataURL" Data..=)
+              Prelude.<$> samlMetadataURL
+          ]
+      )
diff --git a/gen/Amazonka/FinSpace/Types/SuperuserParameters.hs b/gen/Amazonka/FinSpace/Types/SuperuserParameters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/Types/SuperuserParameters.hs
@@ -0,0 +1,105 @@
+{-# 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.FinSpace.Types.SuperuserParameters
+-- 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.FinSpace.Types.SuperuserParameters 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
+
+-- | Configuration information for the superuser.
+--
+-- /See:/ 'newSuperuserParameters' smart constructor.
+data SuperuserParameters = SuperuserParameters'
+  { -- | The email address of the superuser.
+    emailAddress :: Data.Sensitive Prelude.Text,
+    -- | The first name of the superuser.
+    firstName :: Prelude.Text,
+    -- | The last name of the superuser.
+    lastName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SuperuserParameters' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'emailAddress', 'superuserParameters_emailAddress' - The email address of the superuser.
+--
+-- 'firstName', 'superuserParameters_firstName' - The first name of the superuser.
+--
+-- 'lastName', 'superuserParameters_lastName' - The last name of the superuser.
+newSuperuserParameters ::
+  -- | 'emailAddress'
+  Prelude.Text ->
+  -- | 'firstName'
+  Prelude.Text ->
+  -- | 'lastName'
+  Prelude.Text ->
+  SuperuserParameters
+newSuperuserParameters
+  pEmailAddress_
+  pFirstName_
+  pLastName_ =
+    SuperuserParameters'
+      { emailAddress =
+          Data._Sensitive Lens.# pEmailAddress_,
+        firstName = pFirstName_,
+        lastName = pLastName_
+      }
+
+-- | The email address of the superuser.
+superuserParameters_emailAddress :: Lens.Lens' SuperuserParameters Prelude.Text
+superuserParameters_emailAddress = Lens.lens (\SuperuserParameters' {emailAddress} -> emailAddress) (\s@SuperuserParameters' {} a -> s {emailAddress = a} :: SuperuserParameters) Prelude.. Data._Sensitive
+
+-- | The first name of the superuser.
+superuserParameters_firstName :: Lens.Lens' SuperuserParameters Prelude.Text
+superuserParameters_firstName = Lens.lens (\SuperuserParameters' {firstName} -> firstName) (\s@SuperuserParameters' {} a -> s {firstName = a} :: SuperuserParameters)
+
+-- | The last name of the superuser.
+superuserParameters_lastName :: Lens.Lens' SuperuserParameters Prelude.Text
+superuserParameters_lastName = Lens.lens (\SuperuserParameters' {lastName} -> lastName) (\s@SuperuserParameters' {} a -> s {lastName = a} :: SuperuserParameters)
+
+instance Prelude.Hashable SuperuserParameters where
+  hashWithSalt _salt SuperuserParameters' {..} =
+    _salt
+      `Prelude.hashWithSalt` emailAddress
+      `Prelude.hashWithSalt` firstName
+      `Prelude.hashWithSalt` lastName
+
+instance Prelude.NFData SuperuserParameters where
+  rnf SuperuserParameters' {..} =
+    Prelude.rnf emailAddress
+      `Prelude.seq` Prelude.rnf firstName
+      `Prelude.seq` Prelude.rnf lastName
+
+instance Data.ToJSON SuperuserParameters where
+  toJSON SuperuserParameters' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("emailAddress" Data..= emailAddress),
+            Prelude.Just ("firstName" Data..= firstName),
+            Prelude.Just ("lastName" Data..= lastName)
+          ]
+      )
diff --git a/gen/Amazonka/FinSpace/UntagResource.hs b/gen/Amazonka/FinSpace/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/UntagResource.hs
@@ -0,0 +1,166 @@
+{-# 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.FinSpace.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes metadata tags from a FinSpace resource.
+module Amazonka.FinSpace.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpace.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | A FinSpace resource from which you want to remove a tag or tags. The
+    -- value for this parameter is an Amazon Resource Name (ARN).
+    resourceArn :: Prelude.Text,
+    -- | The tag keys (names) of one or more tags to be removed.
+    tagKeys :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - A FinSpace resource from which you want to remove a tag or tags. The
+-- value for this parameter is an Amazon Resource Name (ARN).
+--
+-- 'tagKeys', 'untagResource_tagKeys' - The tag keys (names) of one or more tags to be removed.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  -- | 'tagKeys'
+  Prelude.NonEmpty Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ pTagKeys_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Lens.coerced Lens.# pTagKeys_
+    }
+
+-- | A FinSpace resource from which you want to remove a tag or tags. The
+-- value for this parameter is an Amazon Resource Name (ARN).
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | The tag keys (names) of one or more tags to be removed.
+untagResource_tagKeys :: Lens.Lens' UntagResource (Prelude.NonEmpty Prelude.Text)
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath UntagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      ["tagKeys" Data.=: Data.toQueryList "member" tagKeys]
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpace/UpdateEnvironment.hs b/gen/Amazonka/FinSpace/UpdateEnvironment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/UpdateEnvironment.hs
@@ -0,0 +1,241 @@
+{-# 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.FinSpace.UpdateEnvironment
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Update your FinSpace environment.
+module Amazonka.FinSpace.UpdateEnvironment
+  ( -- * Creating a Request
+    UpdateEnvironment (..),
+    newUpdateEnvironment,
+
+    -- * Request Lenses
+    updateEnvironment_description,
+    updateEnvironment_federationMode,
+    updateEnvironment_federationParameters,
+    updateEnvironment_name,
+    updateEnvironment_environmentId,
+
+    -- * Destructuring the Response
+    UpdateEnvironmentResponse (..),
+    newUpdateEnvironmentResponse,
+
+    -- * Response Lenses
+    updateEnvironmentResponse_environment,
+    updateEnvironmentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpace.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateEnvironment' smart constructor.
+data UpdateEnvironment = UpdateEnvironment'
+  { -- | The description of the environment.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | Authentication mode for the environment.
+    --
+    -- -   @FEDERATED@ - Users access FinSpace through Single Sign On (SSO) via
+    --     your Identity provider.
+    --
+    -- -   @LOCAL@ - Users access FinSpace via email and password managed
+    --     within the FinSpace environment.
+    federationMode :: Prelude.Maybe FederationMode,
+    federationParameters :: Prelude.Maybe FederationParameters,
+    -- | The name of the environment.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The identifier of the FinSpace environment.
+    environmentId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateEnvironment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'updateEnvironment_description' - The description of the environment.
+--
+-- 'federationMode', 'updateEnvironment_federationMode' - Authentication mode for the environment.
+--
+-- -   @FEDERATED@ - Users access FinSpace through Single Sign On (SSO) via
+--     your Identity provider.
+--
+-- -   @LOCAL@ - Users access FinSpace via email and password managed
+--     within the FinSpace environment.
+--
+-- 'federationParameters', 'updateEnvironment_federationParameters' - Undocumented member.
+--
+-- 'name', 'updateEnvironment_name' - The name of the environment.
+--
+-- 'environmentId', 'updateEnvironment_environmentId' - The identifier of the FinSpace environment.
+newUpdateEnvironment ::
+  -- | 'environmentId'
+  Prelude.Text ->
+  UpdateEnvironment
+newUpdateEnvironment pEnvironmentId_ =
+  UpdateEnvironment'
+    { description = Prelude.Nothing,
+      federationMode = Prelude.Nothing,
+      federationParameters = Prelude.Nothing,
+      name = Prelude.Nothing,
+      environmentId = pEnvironmentId_
+    }
+
+-- | The description of the environment.
+updateEnvironment_description :: Lens.Lens' UpdateEnvironment (Prelude.Maybe Prelude.Text)
+updateEnvironment_description = Lens.lens (\UpdateEnvironment' {description} -> description) (\s@UpdateEnvironment' {} a -> s {description = a} :: UpdateEnvironment)
+
+-- | Authentication mode for the environment.
+--
+-- -   @FEDERATED@ - Users access FinSpace through Single Sign On (SSO) via
+--     your Identity provider.
+--
+-- -   @LOCAL@ - Users access FinSpace via email and password managed
+--     within the FinSpace environment.
+updateEnvironment_federationMode :: Lens.Lens' UpdateEnvironment (Prelude.Maybe FederationMode)
+updateEnvironment_federationMode = Lens.lens (\UpdateEnvironment' {federationMode} -> federationMode) (\s@UpdateEnvironment' {} a -> s {federationMode = a} :: UpdateEnvironment)
+
+-- | Undocumented member.
+updateEnvironment_federationParameters :: Lens.Lens' UpdateEnvironment (Prelude.Maybe FederationParameters)
+updateEnvironment_federationParameters = Lens.lens (\UpdateEnvironment' {federationParameters} -> federationParameters) (\s@UpdateEnvironment' {} a -> s {federationParameters = a} :: UpdateEnvironment)
+
+-- | The name of the environment.
+updateEnvironment_name :: Lens.Lens' UpdateEnvironment (Prelude.Maybe Prelude.Text)
+updateEnvironment_name = Lens.lens (\UpdateEnvironment' {name} -> name) (\s@UpdateEnvironment' {} a -> s {name = a} :: UpdateEnvironment)
+
+-- | The identifier of the FinSpace environment.
+updateEnvironment_environmentId :: Lens.Lens' UpdateEnvironment Prelude.Text
+updateEnvironment_environmentId = Lens.lens (\UpdateEnvironment' {environmentId} -> environmentId) (\s@UpdateEnvironment' {} a -> s {environmentId = a} :: UpdateEnvironment)
+
+instance Core.AWSRequest UpdateEnvironment where
+  type
+    AWSResponse UpdateEnvironment =
+      UpdateEnvironmentResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateEnvironmentResponse'
+            Prelude.<$> (x Data..?> "environment")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateEnvironment where
+  hashWithSalt _salt UpdateEnvironment' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` federationMode
+      `Prelude.hashWithSalt` federationParameters
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` environmentId
+
+instance Prelude.NFData UpdateEnvironment where
+  rnf UpdateEnvironment' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf federationMode
+      `Prelude.seq` Prelude.rnf federationParameters
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf environmentId
+
+instance Data.ToHeaders UpdateEnvironment where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateEnvironment where
+  toJSON UpdateEnvironment' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("description" Data..=) Prelude.<$> description,
+            ("federationMode" Data..=)
+              Prelude.<$> federationMode,
+            ("federationParameters" Data..=)
+              Prelude.<$> federationParameters,
+            ("name" Data..=) Prelude.<$> name
+          ]
+      )
+
+instance Data.ToPath UpdateEnvironment where
+  toPath UpdateEnvironment' {..} =
+    Prelude.mconcat
+      ["/environment/", Data.toBS environmentId]
+
+instance Data.ToQuery UpdateEnvironment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateEnvironmentResponse' smart constructor.
+data UpdateEnvironmentResponse = UpdateEnvironmentResponse'
+  { -- | Returns the FinSpace environment object.
+    environment :: Prelude.Maybe Environment,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateEnvironmentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'environment', 'updateEnvironmentResponse_environment' - Returns the FinSpace environment object.
+--
+-- 'httpStatus', 'updateEnvironmentResponse_httpStatus' - The response's http status code.
+newUpdateEnvironmentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateEnvironmentResponse
+newUpdateEnvironmentResponse pHttpStatus_ =
+  UpdateEnvironmentResponse'
+    { environment =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Returns the FinSpace environment object.
+updateEnvironmentResponse_environment :: Lens.Lens' UpdateEnvironmentResponse (Prelude.Maybe Environment)
+updateEnvironmentResponse_environment = Lens.lens (\UpdateEnvironmentResponse' {environment} -> environment) (\s@UpdateEnvironmentResponse' {} a -> s {environment = a} :: UpdateEnvironmentResponse)
+
+-- | The response's http status code.
+updateEnvironmentResponse_httpStatus :: Lens.Lens' UpdateEnvironmentResponse Prelude.Int
+updateEnvironmentResponse_httpStatus = Lens.lens (\UpdateEnvironmentResponse' {httpStatus} -> httpStatus) (\s@UpdateEnvironmentResponse' {} a -> s {httpStatus = a} :: UpdateEnvironmentResponse)
+
+instance Prelude.NFData UpdateEnvironmentResponse where
+  rnf UpdateEnvironmentResponse' {..} =
+    Prelude.rnf environment
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FinSpace/Waiters.hs b/gen/Amazonka/FinSpace/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FinSpace/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.FinSpace.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.FinSpace.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FinSpace.Lens
+import Amazonka.FinSpace.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.FinSpace
+import Test.Amazonka.FinSpace.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "FinSpace"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/FinSpace.hs b/test/Test/Amazonka/FinSpace.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/FinSpace.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.FinSpace
+-- 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.FinSpace
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/FinSpace/Internal.hs b/test/Test/Amazonka/FinSpace/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/FinSpace/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.FinSpace.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.FinSpace.Internal where
diff --git a/test/Test/Amazonka/Gen/FinSpace.hs b/test/Test/Amazonka/Gen/FinSpace.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/FinSpace.hs
@@ -0,0 +1,198 @@
+{-# 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.FinSpace
+-- 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.FinSpace where
+
+import Amazonka.FinSpace
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.FinSpace.Internal
+import Test.Amazonka.Fixture
+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"
+--         [ requestCreateEnvironment $
+--             newCreateEnvironment
+--
+--         , requestDeleteEnvironment $
+--             newDeleteEnvironment
+--
+--         , requestGetEnvironment $
+--             newGetEnvironment
+--
+--         , requestListEnvironments $
+--             newListEnvironments
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateEnvironment $
+--             newUpdateEnvironment
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateEnvironment $
+--             newCreateEnvironmentResponse
+--
+--         , responseDeleteEnvironment $
+--             newDeleteEnvironmentResponse
+--
+--         , responseGetEnvironment $
+--             newGetEnvironmentResponse
+--
+--         , responseListEnvironments $
+--             newListEnvironmentsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateEnvironment $
+--             newUpdateEnvironmentResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateEnvironment :: CreateEnvironment -> TestTree
+requestCreateEnvironment =
+  req
+    "CreateEnvironment"
+    "fixture/CreateEnvironment.yaml"
+
+requestDeleteEnvironment :: DeleteEnvironment -> TestTree
+requestDeleteEnvironment =
+  req
+    "DeleteEnvironment"
+    "fixture/DeleteEnvironment.yaml"
+
+requestGetEnvironment :: GetEnvironment -> TestTree
+requestGetEnvironment =
+  req
+    "GetEnvironment"
+    "fixture/GetEnvironment.yaml"
+
+requestListEnvironments :: ListEnvironments -> TestTree
+requestListEnvironments =
+  req
+    "ListEnvironments"
+    "fixture/ListEnvironments.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateEnvironment :: UpdateEnvironment -> TestTree
+requestUpdateEnvironment =
+  req
+    "UpdateEnvironment"
+    "fixture/UpdateEnvironment.yaml"
+
+-- Responses
+
+responseCreateEnvironment :: CreateEnvironmentResponse -> TestTree
+responseCreateEnvironment =
+  res
+    "CreateEnvironmentResponse"
+    "fixture/CreateEnvironmentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateEnvironment)
+
+responseDeleteEnvironment :: DeleteEnvironmentResponse -> TestTree
+responseDeleteEnvironment =
+  res
+    "DeleteEnvironmentResponse"
+    "fixture/DeleteEnvironmentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteEnvironment)
+
+responseGetEnvironment :: GetEnvironmentResponse -> TestTree
+responseGetEnvironment =
+  res
+    "GetEnvironmentResponse"
+    "fixture/GetEnvironmentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetEnvironment)
+
+responseListEnvironments :: ListEnvironmentsResponse -> TestTree
+responseListEnvironments =
+  res
+    "ListEnvironmentsResponse"
+    "fixture/ListEnvironmentsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListEnvironments)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateEnvironment :: UpdateEnvironmentResponse -> TestTree
+responseUpdateEnvironment =
+  res
+    "UpdateEnvironmentResponse"
+    "fixture/UpdateEnvironmentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateEnvironment)
