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 Fault Injection Simulator SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2020-12-01@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-fis)
+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.FIS](http://hackage.haskell.org/package/amazonka-fis/docs/Amazonka-FIS.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-fis` 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-fis.cabal b/amazonka-fis.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-fis.cabal
@@ -0,0 +1,139 @@
+cabal-version:      2.2
+name:               amazonka-fis
+version:            2.0
+synopsis:           Amazon Fault Injection Simulator 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 @2020-12-01@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.FIS.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.FIS" 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-fis
+
+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.FIS
+    Amazonka.FIS.CreateExperimentTemplate
+    Amazonka.FIS.DeleteExperimentTemplate
+    Amazonka.FIS.GetAction
+    Amazonka.FIS.GetExperiment
+    Amazonka.FIS.GetExperimentTemplate
+    Amazonka.FIS.GetTargetResourceType
+    Amazonka.FIS.Lens
+    Amazonka.FIS.ListActions
+    Amazonka.FIS.ListExperiments
+    Amazonka.FIS.ListExperimentTemplates
+    Amazonka.FIS.ListTagsForResource
+    Amazonka.FIS.ListTargetResourceTypes
+    Amazonka.FIS.StartExperiment
+    Amazonka.FIS.StopExperiment
+    Amazonka.FIS.TagResource
+    Amazonka.FIS.Types
+    Amazonka.FIS.Types.Action
+    Amazonka.FIS.Types.ActionParameter
+    Amazonka.FIS.Types.ActionSummary
+    Amazonka.FIS.Types.ActionTarget
+    Amazonka.FIS.Types.CreateExperimentTemplateActionInput
+    Amazonka.FIS.Types.CreateExperimentTemplateLogConfigurationInput
+    Amazonka.FIS.Types.CreateExperimentTemplateStopConditionInput
+    Amazonka.FIS.Types.CreateExperimentTemplateTargetInput
+    Amazonka.FIS.Types.Experiment
+    Amazonka.FIS.Types.ExperimentAction
+    Amazonka.FIS.Types.ExperimentActionState
+    Amazonka.FIS.Types.ExperimentActionStatus
+    Amazonka.FIS.Types.ExperimentCloudWatchLogsLogConfiguration
+    Amazonka.FIS.Types.ExperimentLogConfiguration
+    Amazonka.FIS.Types.ExperimentS3LogConfiguration
+    Amazonka.FIS.Types.ExperimentState
+    Amazonka.FIS.Types.ExperimentStatus
+    Amazonka.FIS.Types.ExperimentStopCondition
+    Amazonka.FIS.Types.ExperimentSummary
+    Amazonka.FIS.Types.ExperimentTarget
+    Amazonka.FIS.Types.ExperimentTargetFilter
+    Amazonka.FIS.Types.ExperimentTemplate
+    Amazonka.FIS.Types.ExperimentTemplateAction
+    Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfiguration
+    Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfigurationInput
+    Amazonka.FIS.Types.ExperimentTemplateLogConfiguration
+    Amazonka.FIS.Types.ExperimentTemplateS3LogConfiguration
+    Amazonka.FIS.Types.ExperimentTemplateS3LogConfigurationInput
+    Amazonka.FIS.Types.ExperimentTemplateStopCondition
+    Amazonka.FIS.Types.ExperimentTemplateSummary
+    Amazonka.FIS.Types.ExperimentTemplateTarget
+    Amazonka.FIS.Types.ExperimentTemplateTargetFilter
+    Amazonka.FIS.Types.ExperimentTemplateTargetInputFilter
+    Amazonka.FIS.Types.TargetResourceType
+    Amazonka.FIS.Types.TargetResourceTypeParameter
+    Amazonka.FIS.Types.TargetResourceTypeSummary
+    Amazonka.FIS.Types.UpdateExperimentTemplateActionInputItem
+    Amazonka.FIS.Types.UpdateExperimentTemplateLogConfigurationInput
+    Amazonka.FIS.Types.UpdateExperimentTemplateStopConditionInput
+    Amazonka.FIS.Types.UpdateExperimentTemplateTargetInput
+    Amazonka.FIS.UntagResource
+    Amazonka.FIS.UpdateExperimentTemplate
+    Amazonka.FIS.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-fis-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.FIS
+    Test.Amazonka.FIS.Internal
+    Test.Amazonka.Gen.FIS
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-fis
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateExperimentTemplate.yaml b/fixture/CreateExperimentTemplate.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateExperimentTemplate.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/CreateExperimentTemplateResponse.proto b/fixture/CreateExperimentTemplateResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateExperimentTemplateResponse.proto
diff --git a/fixture/DeleteExperimentTemplate.yaml b/fixture/DeleteExperimentTemplate.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteExperimentTemplate.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/DeleteExperimentTemplateResponse.proto b/fixture/DeleteExperimentTemplateResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteExperimentTemplateResponse.proto
diff --git a/fixture/GetAction.yaml b/fixture/GetAction.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetAction.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/GetActionResponse.proto b/fixture/GetActionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetActionResponse.proto
diff --git a/fixture/GetExperiment.yaml b/fixture/GetExperiment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetExperiment.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/GetExperimentResponse.proto b/fixture/GetExperimentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetExperimentResponse.proto
diff --git a/fixture/GetExperimentTemplate.yaml b/fixture/GetExperimentTemplate.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetExperimentTemplate.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/GetExperimentTemplateResponse.proto b/fixture/GetExperimentTemplateResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetExperimentTemplateResponse.proto
diff --git a/fixture/GetTargetResourceType.yaml b/fixture/GetTargetResourceType.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetTargetResourceType.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/GetTargetResourceTypeResponse.proto b/fixture/GetTargetResourceTypeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetTargetResourceTypeResponse.proto
diff --git a/fixture/ListActions.yaml b/fixture/ListActions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListActions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/ListActionsResponse.proto b/fixture/ListActionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListActionsResponse.proto
diff --git a/fixture/ListExperimentTemplates.yaml b/fixture/ListExperimentTemplates.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListExperimentTemplates.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/ListExperimentTemplatesResponse.proto b/fixture/ListExperimentTemplatesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListExperimentTemplatesResponse.proto
diff --git a/fixture/ListExperiments.yaml b/fixture/ListExperiments.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListExperiments.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/ListExperimentsResponse.proto b/fixture/ListExperimentsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListExperimentsResponse.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/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/ListTargetResourceTypes.yaml b/fixture/ListTargetResourceTypes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTargetResourceTypes.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/ListTargetResourceTypesResponse.proto b/fixture/ListTargetResourceTypesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTargetResourceTypesResponse.proto
diff --git a/fixture/StartExperiment.yaml b/fixture/StartExperiment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartExperiment.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/StartExperimentResponse.proto b/fixture/StartExperimentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartExperimentResponse.proto
diff --git a/fixture/StopExperiment.yaml b/fixture/StopExperiment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StopExperiment.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/StopExperimentResponse.proto b/fixture/StopExperimentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StopExperimentResponse.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/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/UpdateExperimentTemplate.yaml b/fixture/UpdateExperimentTemplate.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateExperimentTemplate.yaml
@@ -0,0 +1,10 @@
+---
+method: PATCH
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/fis/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  fis.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/UpdateExperimentTemplateResponse.proto b/fixture/UpdateExperimentTemplateResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateExperimentTemplateResponse.proto
diff --git a/gen/Amazonka/FIS.hs b/gen/Amazonka/FIS.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS.hs
@@ -0,0 +1,346 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.FIS
+-- 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 @2020-12-01@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Fault Injection Simulator is a managed service that enables you to
+-- perform fault injection experiments on your Amazon Web Services
+-- workloads. For more information, see the
+-- <https://docs.aws.amazon.com/fis/latest/userguide/ Fault Injection Simulator User Guide>.
+module Amazonka.FIS
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateExperimentTemplate
+    CreateExperimentTemplate (CreateExperimentTemplate'),
+    newCreateExperimentTemplate,
+    CreateExperimentTemplateResponse (CreateExperimentTemplateResponse'),
+    newCreateExperimentTemplateResponse,
+
+    -- ** DeleteExperimentTemplate
+    DeleteExperimentTemplate (DeleteExperimentTemplate'),
+    newDeleteExperimentTemplate,
+    DeleteExperimentTemplateResponse (DeleteExperimentTemplateResponse'),
+    newDeleteExperimentTemplateResponse,
+
+    -- ** GetAction
+    GetAction (GetAction'),
+    newGetAction,
+    GetActionResponse (GetActionResponse'),
+    newGetActionResponse,
+
+    -- ** GetExperiment
+    GetExperiment (GetExperiment'),
+    newGetExperiment,
+    GetExperimentResponse (GetExperimentResponse'),
+    newGetExperimentResponse,
+
+    -- ** GetExperimentTemplate
+    GetExperimentTemplate (GetExperimentTemplate'),
+    newGetExperimentTemplate,
+    GetExperimentTemplateResponse (GetExperimentTemplateResponse'),
+    newGetExperimentTemplateResponse,
+
+    -- ** GetTargetResourceType
+    GetTargetResourceType (GetTargetResourceType'),
+    newGetTargetResourceType,
+    GetTargetResourceTypeResponse (GetTargetResourceTypeResponse'),
+    newGetTargetResourceTypeResponse,
+
+    -- ** ListActions
+    ListActions (ListActions'),
+    newListActions,
+    ListActionsResponse (ListActionsResponse'),
+    newListActionsResponse,
+
+    -- ** ListExperimentTemplates
+    ListExperimentTemplates (ListExperimentTemplates'),
+    newListExperimentTemplates,
+    ListExperimentTemplatesResponse (ListExperimentTemplatesResponse'),
+    newListExperimentTemplatesResponse,
+
+    -- ** ListExperiments
+    ListExperiments (ListExperiments'),
+    newListExperiments,
+    ListExperimentsResponse (ListExperimentsResponse'),
+    newListExperimentsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** ListTargetResourceTypes
+    ListTargetResourceTypes (ListTargetResourceTypes'),
+    newListTargetResourceTypes,
+    ListTargetResourceTypesResponse (ListTargetResourceTypesResponse'),
+    newListTargetResourceTypesResponse,
+
+    -- ** StartExperiment
+    StartExperiment (StartExperiment'),
+    newStartExperiment,
+    StartExperimentResponse (StartExperimentResponse'),
+    newStartExperimentResponse,
+
+    -- ** StopExperiment
+    StopExperiment (StopExperiment'),
+    newStopExperiment,
+    StopExperimentResponse (StopExperimentResponse'),
+    newStopExperimentResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateExperimentTemplate
+    UpdateExperimentTemplate (UpdateExperimentTemplate'),
+    newUpdateExperimentTemplate,
+    UpdateExperimentTemplateResponse (UpdateExperimentTemplateResponse'),
+    newUpdateExperimentTemplateResponse,
+
+    -- * Types
+
+    -- ** ExperimentActionStatus
+    ExperimentActionStatus (..),
+
+    -- ** ExperimentStatus
+    ExperimentStatus (..),
+
+    -- ** Action
+    Action (Action'),
+    newAction,
+
+    -- ** ActionParameter
+    ActionParameter (ActionParameter'),
+    newActionParameter,
+
+    -- ** ActionSummary
+    ActionSummary (ActionSummary'),
+    newActionSummary,
+
+    -- ** ActionTarget
+    ActionTarget (ActionTarget'),
+    newActionTarget,
+
+    -- ** CreateExperimentTemplateActionInput
+    CreateExperimentTemplateActionInput (CreateExperimentTemplateActionInput'),
+    newCreateExperimentTemplateActionInput,
+
+    -- ** CreateExperimentTemplateLogConfigurationInput
+    CreateExperimentTemplateLogConfigurationInput (CreateExperimentTemplateLogConfigurationInput'),
+    newCreateExperimentTemplateLogConfigurationInput,
+
+    -- ** CreateExperimentTemplateStopConditionInput
+    CreateExperimentTemplateStopConditionInput (CreateExperimentTemplateStopConditionInput'),
+    newCreateExperimentTemplateStopConditionInput,
+
+    -- ** CreateExperimentTemplateTargetInput
+    CreateExperimentTemplateTargetInput (CreateExperimentTemplateTargetInput'),
+    newCreateExperimentTemplateTargetInput,
+
+    -- ** Experiment
+    Experiment (Experiment'),
+    newExperiment,
+
+    -- ** ExperimentAction
+    ExperimentAction (ExperimentAction'),
+    newExperimentAction,
+
+    -- ** ExperimentActionState
+    ExperimentActionState (ExperimentActionState'),
+    newExperimentActionState,
+
+    -- ** ExperimentCloudWatchLogsLogConfiguration
+    ExperimentCloudWatchLogsLogConfiguration (ExperimentCloudWatchLogsLogConfiguration'),
+    newExperimentCloudWatchLogsLogConfiguration,
+
+    -- ** ExperimentLogConfiguration
+    ExperimentLogConfiguration (ExperimentLogConfiguration'),
+    newExperimentLogConfiguration,
+
+    -- ** ExperimentS3LogConfiguration
+    ExperimentS3LogConfiguration (ExperimentS3LogConfiguration'),
+    newExperimentS3LogConfiguration,
+
+    -- ** ExperimentState
+    ExperimentState (ExperimentState'),
+    newExperimentState,
+
+    -- ** ExperimentStopCondition
+    ExperimentStopCondition (ExperimentStopCondition'),
+    newExperimentStopCondition,
+
+    -- ** ExperimentSummary
+    ExperimentSummary (ExperimentSummary'),
+    newExperimentSummary,
+
+    -- ** ExperimentTarget
+    ExperimentTarget (ExperimentTarget'),
+    newExperimentTarget,
+
+    -- ** ExperimentTargetFilter
+    ExperimentTargetFilter (ExperimentTargetFilter'),
+    newExperimentTargetFilter,
+
+    -- ** ExperimentTemplate
+    ExperimentTemplate (ExperimentTemplate'),
+    newExperimentTemplate,
+
+    -- ** ExperimentTemplateAction
+    ExperimentTemplateAction (ExperimentTemplateAction'),
+    newExperimentTemplateAction,
+
+    -- ** ExperimentTemplateCloudWatchLogsLogConfiguration
+    ExperimentTemplateCloudWatchLogsLogConfiguration (ExperimentTemplateCloudWatchLogsLogConfiguration'),
+    newExperimentTemplateCloudWatchLogsLogConfiguration,
+
+    -- ** ExperimentTemplateCloudWatchLogsLogConfigurationInput
+    ExperimentTemplateCloudWatchLogsLogConfigurationInput (ExperimentTemplateCloudWatchLogsLogConfigurationInput'),
+    newExperimentTemplateCloudWatchLogsLogConfigurationInput,
+
+    -- ** ExperimentTemplateLogConfiguration
+    ExperimentTemplateLogConfiguration (ExperimentTemplateLogConfiguration'),
+    newExperimentTemplateLogConfiguration,
+
+    -- ** ExperimentTemplateS3LogConfiguration
+    ExperimentTemplateS3LogConfiguration (ExperimentTemplateS3LogConfiguration'),
+    newExperimentTemplateS3LogConfiguration,
+
+    -- ** ExperimentTemplateS3LogConfigurationInput
+    ExperimentTemplateS3LogConfigurationInput (ExperimentTemplateS3LogConfigurationInput'),
+    newExperimentTemplateS3LogConfigurationInput,
+
+    -- ** ExperimentTemplateStopCondition
+    ExperimentTemplateStopCondition (ExperimentTemplateStopCondition'),
+    newExperimentTemplateStopCondition,
+
+    -- ** ExperimentTemplateSummary
+    ExperimentTemplateSummary (ExperimentTemplateSummary'),
+    newExperimentTemplateSummary,
+
+    -- ** ExperimentTemplateTarget
+    ExperimentTemplateTarget (ExperimentTemplateTarget'),
+    newExperimentTemplateTarget,
+
+    -- ** ExperimentTemplateTargetFilter
+    ExperimentTemplateTargetFilter (ExperimentTemplateTargetFilter'),
+    newExperimentTemplateTargetFilter,
+
+    -- ** ExperimentTemplateTargetInputFilter
+    ExperimentTemplateTargetInputFilter (ExperimentTemplateTargetInputFilter'),
+    newExperimentTemplateTargetInputFilter,
+
+    -- ** TargetResourceType
+    TargetResourceType (TargetResourceType'),
+    newTargetResourceType,
+
+    -- ** TargetResourceTypeParameter
+    TargetResourceTypeParameter (TargetResourceTypeParameter'),
+    newTargetResourceTypeParameter,
+
+    -- ** TargetResourceTypeSummary
+    TargetResourceTypeSummary (TargetResourceTypeSummary'),
+    newTargetResourceTypeSummary,
+
+    -- ** UpdateExperimentTemplateActionInputItem
+    UpdateExperimentTemplateActionInputItem (UpdateExperimentTemplateActionInputItem'),
+    newUpdateExperimentTemplateActionInputItem,
+
+    -- ** UpdateExperimentTemplateLogConfigurationInput
+    UpdateExperimentTemplateLogConfigurationInput (UpdateExperimentTemplateLogConfigurationInput'),
+    newUpdateExperimentTemplateLogConfigurationInput,
+
+    -- ** UpdateExperimentTemplateStopConditionInput
+    UpdateExperimentTemplateStopConditionInput (UpdateExperimentTemplateStopConditionInput'),
+    newUpdateExperimentTemplateStopConditionInput,
+
+    -- ** UpdateExperimentTemplateTargetInput
+    UpdateExperimentTemplateTargetInput (UpdateExperimentTemplateTargetInput'),
+    newUpdateExperimentTemplateTargetInput,
+  )
+where
+
+import Amazonka.FIS.CreateExperimentTemplate
+import Amazonka.FIS.DeleteExperimentTemplate
+import Amazonka.FIS.GetAction
+import Amazonka.FIS.GetExperiment
+import Amazonka.FIS.GetExperimentTemplate
+import Amazonka.FIS.GetTargetResourceType
+import Amazonka.FIS.Lens
+import Amazonka.FIS.ListActions
+import Amazonka.FIS.ListExperimentTemplates
+import Amazonka.FIS.ListExperiments
+import Amazonka.FIS.ListTagsForResource
+import Amazonka.FIS.ListTargetResourceTypes
+import Amazonka.FIS.StartExperiment
+import Amazonka.FIS.StopExperiment
+import Amazonka.FIS.TagResource
+import Amazonka.FIS.Types
+import Amazonka.FIS.UntagResource
+import Amazonka.FIS.UpdateExperimentTemplate
+import Amazonka.FIS.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 'FIS'.
+
+-- $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/FIS/CreateExperimentTemplate.hs b/gen/Amazonka/FIS/CreateExperimentTemplate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/CreateExperimentTemplate.hs
@@ -0,0 +1,297 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.CreateExperimentTemplate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an experiment template.
+--
+-- An experiment template includes the following components:
+--
+-- -   __Targets__: A target can be a specific resource in your Amazon Web
+--     Services environment, or one or more resources that match criteria
+--     that you specify, for example, resources that have specific tags.
+--
+-- -   __Actions__: The actions to carry out on the target. You can specify
+--     multiple actions, the duration of each action, and when to start
+--     each action during an experiment.
+--
+-- -   __Stop conditions__: If a stop condition is triggered while an
+--     experiment is running, the experiment is automatically stopped. You
+--     can define a stop condition as a CloudWatch alarm.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/fis/latest/userguide/experiment-templates.html Experiment templates>
+-- in the /Fault Injection Simulator User Guide/.
+module Amazonka.FIS.CreateExperimentTemplate
+  ( -- * Creating a Request
+    CreateExperimentTemplate (..),
+    newCreateExperimentTemplate,
+
+    -- * Request Lenses
+    createExperimentTemplate_logConfiguration,
+    createExperimentTemplate_tags,
+    createExperimentTemplate_targets,
+    createExperimentTemplate_clientToken,
+    createExperimentTemplate_description,
+    createExperimentTemplate_stopConditions,
+    createExperimentTemplate_actions,
+    createExperimentTemplate_roleArn,
+
+    -- * Destructuring the Response
+    CreateExperimentTemplateResponse (..),
+    newCreateExperimentTemplateResponse,
+
+    -- * Response Lenses
+    createExperimentTemplateResponse_experimentTemplate,
+    createExperimentTemplateResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateExperimentTemplate' smart constructor.
+data CreateExperimentTemplate = CreateExperimentTemplate'
+  { -- | The configuration for experiment logging.
+    logConfiguration :: Prelude.Maybe CreateExperimentTemplateLogConfigurationInput,
+    -- | The tags to apply to the experiment template.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The targets for the experiment.
+    targets :: Prelude.Maybe (Prelude.HashMap Prelude.Text CreateExperimentTemplateTargetInput),
+    -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request.
+    clientToken :: Prelude.Text,
+    -- | A description for the experiment template.
+    description :: Prelude.Text,
+    -- | The stop conditions.
+    stopConditions :: [CreateExperimentTemplateStopConditionInput],
+    -- | The actions for the experiment.
+    actions :: Prelude.HashMap Prelude.Text CreateExperimentTemplateActionInput,
+    -- | The Amazon Resource Name (ARN) of an IAM role that grants the FIS
+    -- service permission to perform service actions on your behalf.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateExperimentTemplate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'logConfiguration', 'createExperimentTemplate_logConfiguration' - The configuration for experiment logging.
+--
+-- 'tags', 'createExperimentTemplate_tags' - The tags to apply to the experiment template.
+--
+-- 'targets', 'createExperimentTemplate_targets' - The targets for the experiment.
+--
+-- 'clientToken', 'createExperimentTemplate_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request.
+--
+-- 'description', 'createExperimentTemplate_description' - A description for the experiment template.
+--
+-- 'stopConditions', 'createExperimentTemplate_stopConditions' - The stop conditions.
+--
+-- 'actions', 'createExperimentTemplate_actions' - The actions for the experiment.
+--
+-- 'roleArn', 'createExperimentTemplate_roleArn' - The Amazon Resource Name (ARN) of an IAM role that grants the FIS
+-- service permission to perform service actions on your behalf.
+newCreateExperimentTemplate ::
+  -- | 'clientToken'
+  Prelude.Text ->
+  -- | 'description'
+  Prelude.Text ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  CreateExperimentTemplate
+newCreateExperimentTemplate
+  pClientToken_
+  pDescription_
+  pRoleArn_ =
+    CreateExperimentTemplate'
+      { logConfiguration =
+          Prelude.Nothing,
+        tags = Prelude.Nothing,
+        targets = Prelude.Nothing,
+        clientToken = pClientToken_,
+        description = pDescription_,
+        stopConditions = Prelude.mempty,
+        actions = Prelude.mempty,
+        roleArn = pRoleArn_
+      }
+
+-- | The configuration for experiment logging.
+createExperimentTemplate_logConfiguration :: Lens.Lens' CreateExperimentTemplate (Prelude.Maybe CreateExperimentTemplateLogConfigurationInput)
+createExperimentTemplate_logConfiguration = Lens.lens (\CreateExperimentTemplate' {logConfiguration} -> logConfiguration) (\s@CreateExperimentTemplate' {} a -> s {logConfiguration = a} :: CreateExperimentTemplate)
+
+-- | The tags to apply to the experiment template.
+createExperimentTemplate_tags :: Lens.Lens' CreateExperimentTemplate (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createExperimentTemplate_tags = Lens.lens (\CreateExperimentTemplate' {tags} -> tags) (\s@CreateExperimentTemplate' {} a -> s {tags = a} :: CreateExperimentTemplate) Prelude.. Lens.mapping Lens.coerced
+
+-- | The targets for the experiment.
+createExperimentTemplate_targets :: Lens.Lens' CreateExperimentTemplate (Prelude.Maybe (Prelude.HashMap Prelude.Text CreateExperimentTemplateTargetInput))
+createExperimentTemplate_targets = Lens.lens (\CreateExperimentTemplate' {targets} -> targets) (\s@CreateExperimentTemplate' {} a -> s {targets = a} :: CreateExperimentTemplate) Prelude.. Lens.mapping Lens.coerced
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request.
+createExperimentTemplate_clientToken :: Lens.Lens' CreateExperimentTemplate Prelude.Text
+createExperimentTemplate_clientToken = Lens.lens (\CreateExperimentTemplate' {clientToken} -> clientToken) (\s@CreateExperimentTemplate' {} a -> s {clientToken = a} :: CreateExperimentTemplate)
+
+-- | A description for the experiment template.
+createExperimentTemplate_description :: Lens.Lens' CreateExperimentTemplate Prelude.Text
+createExperimentTemplate_description = Lens.lens (\CreateExperimentTemplate' {description} -> description) (\s@CreateExperimentTemplate' {} a -> s {description = a} :: CreateExperimentTemplate)
+
+-- | The stop conditions.
+createExperimentTemplate_stopConditions :: Lens.Lens' CreateExperimentTemplate [CreateExperimentTemplateStopConditionInput]
+createExperimentTemplate_stopConditions = Lens.lens (\CreateExperimentTemplate' {stopConditions} -> stopConditions) (\s@CreateExperimentTemplate' {} a -> s {stopConditions = a} :: CreateExperimentTemplate) Prelude.. Lens.coerced
+
+-- | The actions for the experiment.
+createExperimentTemplate_actions :: Lens.Lens' CreateExperimentTemplate (Prelude.HashMap Prelude.Text CreateExperimentTemplateActionInput)
+createExperimentTemplate_actions = Lens.lens (\CreateExperimentTemplate' {actions} -> actions) (\s@CreateExperimentTemplate' {} a -> s {actions = a} :: CreateExperimentTemplate) Prelude.. Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of an IAM role that grants the FIS
+-- service permission to perform service actions on your behalf.
+createExperimentTemplate_roleArn :: Lens.Lens' CreateExperimentTemplate Prelude.Text
+createExperimentTemplate_roleArn = Lens.lens (\CreateExperimentTemplate' {roleArn} -> roleArn) (\s@CreateExperimentTemplate' {} a -> s {roleArn = a} :: CreateExperimentTemplate)
+
+instance Core.AWSRequest CreateExperimentTemplate where
+  type
+    AWSResponse CreateExperimentTemplate =
+      CreateExperimentTemplateResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateExperimentTemplateResponse'
+            Prelude.<$> (x Data..?> "experimentTemplate")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateExperimentTemplate where
+  hashWithSalt _salt CreateExperimentTemplate' {..} =
+    _salt
+      `Prelude.hashWithSalt` logConfiguration
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` targets
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` stopConditions
+      `Prelude.hashWithSalt` actions
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData CreateExperimentTemplate where
+  rnf CreateExperimentTemplate' {..} =
+    Prelude.rnf logConfiguration
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf targets
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf stopConditions
+      `Prelude.seq` Prelude.rnf actions
+      `Prelude.seq` Prelude.rnf roleArn
+
+instance Data.ToHeaders CreateExperimentTemplate where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateExperimentTemplate where
+  toJSON CreateExperimentTemplate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("logConfiguration" Data..=)
+              Prelude.<$> logConfiguration,
+            ("tags" Data..=) Prelude.<$> tags,
+            ("targets" Data..=) Prelude.<$> targets,
+            Prelude.Just ("clientToken" Data..= clientToken),
+            Prelude.Just ("description" Data..= description),
+            Prelude.Just
+              ("stopConditions" Data..= stopConditions),
+            Prelude.Just ("actions" Data..= actions),
+            Prelude.Just ("roleArn" Data..= roleArn)
+          ]
+      )
+
+instance Data.ToPath CreateExperimentTemplate where
+  toPath = Prelude.const "/experimentTemplates"
+
+instance Data.ToQuery CreateExperimentTemplate where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateExperimentTemplateResponse' smart constructor.
+data CreateExperimentTemplateResponse = CreateExperimentTemplateResponse'
+  { -- | Information about the experiment template.
+    experimentTemplate :: Prelude.Maybe ExperimentTemplate,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateExperimentTemplateResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'experimentTemplate', 'createExperimentTemplateResponse_experimentTemplate' - Information about the experiment template.
+--
+-- 'httpStatus', 'createExperimentTemplateResponse_httpStatus' - The response's http status code.
+newCreateExperimentTemplateResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateExperimentTemplateResponse
+newCreateExperimentTemplateResponse pHttpStatus_ =
+  CreateExperimentTemplateResponse'
+    { experimentTemplate =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the experiment template.
+createExperimentTemplateResponse_experimentTemplate :: Lens.Lens' CreateExperimentTemplateResponse (Prelude.Maybe ExperimentTemplate)
+createExperimentTemplateResponse_experimentTemplate = Lens.lens (\CreateExperimentTemplateResponse' {experimentTemplate} -> experimentTemplate) (\s@CreateExperimentTemplateResponse' {} a -> s {experimentTemplate = a} :: CreateExperimentTemplateResponse)
+
+-- | The response's http status code.
+createExperimentTemplateResponse_httpStatus :: Lens.Lens' CreateExperimentTemplateResponse Prelude.Int
+createExperimentTemplateResponse_httpStatus = Lens.lens (\CreateExperimentTemplateResponse' {httpStatus} -> httpStatus) (\s@CreateExperimentTemplateResponse' {} a -> s {httpStatus = a} :: CreateExperimentTemplateResponse)
+
+instance
+  Prelude.NFData
+    CreateExperimentTemplateResponse
+  where
+  rnf CreateExperimentTemplateResponse' {..} =
+    Prelude.rnf experimentTemplate
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/DeleteExperimentTemplate.hs b/gen/Amazonka/FIS/DeleteExperimentTemplate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/DeleteExperimentTemplate.hs
@@ -0,0 +1,162 @@
+{-# 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.FIS.DeleteExperimentTemplate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the specified experiment template.
+module Amazonka.FIS.DeleteExperimentTemplate
+  ( -- * Creating a Request
+    DeleteExperimentTemplate (..),
+    newDeleteExperimentTemplate,
+
+    -- * Request Lenses
+    deleteExperimentTemplate_id,
+
+    -- * Destructuring the Response
+    DeleteExperimentTemplateResponse (..),
+    newDeleteExperimentTemplateResponse,
+
+    -- * Response Lenses
+    deleteExperimentTemplateResponse_experimentTemplate,
+    deleteExperimentTemplateResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteExperimentTemplate' smart constructor.
+data DeleteExperimentTemplate = DeleteExperimentTemplate'
+  { -- | The ID of the experiment template.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteExperimentTemplate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'deleteExperimentTemplate_id' - The ID of the experiment template.
+newDeleteExperimentTemplate ::
+  -- | 'id'
+  Prelude.Text ->
+  DeleteExperimentTemplate
+newDeleteExperimentTemplate pId_ =
+  DeleteExperimentTemplate' {id = pId_}
+
+-- | The ID of the experiment template.
+deleteExperimentTemplate_id :: Lens.Lens' DeleteExperimentTemplate Prelude.Text
+deleteExperimentTemplate_id = Lens.lens (\DeleteExperimentTemplate' {id} -> id) (\s@DeleteExperimentTemplate' {} a -> s {id = a} :: DeleteExperimentTemplate)
+
+instance Core.AWSRequest DeleteExperimentTemplate where
+  type
+    AWSResponse DeleteExperimentTemplate =
+      DeleteExperimentTemplateResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteExperimentTemplateResponse'
+            Prelude.<$> (x Data..?> "experimentTemplate")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteExperimentTemplate where
+  hashWithSalt _salt DeleteExperimentTemplate' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData DeleteExperimentTemplate where
+  rnf DeleteExperimentTemplate' {..} = Prelude.rnf id
+
+instance Data.ToHeaders DeleteExperimentTemplate where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteExperimentTemplate where
+  toPath DeleteExperimentTemplate' {..} =
+    Prelude.mconcat
+      ["/experimentTemplates/", Data.toBS id]
+
+instance Data.ToQuery DeleteExperimentTemplate where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteExperimentTemplateResponse' smart constructor.
+data DeleteExperimentTemplateResponse = DeleteExperimentTemplateResponse'
+  { -- | Information about the experiment template.
+    experimentTemplate :: Prelude.Maybe ExperimentTemplate,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteExperimentTemplateResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'experimentTemplate', 'deleteExperimentTemplateResponse_experimentTemplate' - Information about the experiment template.
+--
+-- 'httpStatus', 'deleteExperimentTemplateResponse_httpStatus' - The response's http status code.
+newDeleteExperimentTemplateResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteExperimentTemplateResponse
+newDeleteExperimentTemplateResponse pHttpStatus_ =
+  DeleteExperimentTemplateResponse'
+    { experimentTemplate =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the experiment template.
+deleteExperimentTemplateResponse_experimentTemplate :: Lens.Lens' DeleteExperimentTemplateResponse (Prelude.Maybe ExperimentTemplate)
+deleteExperimentTemplateResponse_experimentTemplate = Lens.lens (\DeleteExperimentTemplateResponse' {experimentTemplate} -> experimentTemplate) (\s@DeleteExperimentTemplateResponse' {} a -> s {experimentTemplate = a} :: DeleteExperimentTemplateResponse)
+
+-- | The response's http status code.
+deleteExperimentTemplateResponse_httpStatus :: Lens.Lens' DeleteExperimentTemplateResponse Prelude.Int
+deleteExperimentTemplateResponse_httpStatus = Lens.lens (\DeleteExperimentTemplateResponse' {httpStatus} -> httpStatus) (\s@DeleteExperimentTemplateResponse' {} a -> s {httpStatus = a} :: DeleteExperimentTemplateResponse)
+
+instance
+  Prelude.NFData
+    DeleteExperimentTemplateResponse
+  where
+  rnf DeleteExperimentTemplateResponse' {..} =
+    Prelude.rnf experimentTemplate
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/GetAction.hs b/gen/Amazonka/FIS/GetAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/GetAction.hs
@@ -0,0 +1,154 @@
+{-# 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.FIS.GetAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets information about the specified FIS action.
+module Amazonka.FIS.GetAction
+  ( -- * Creating a Request
+    GetAction (..),
+    newGetAction,
+
+    -- * Request Lenses
+    getAction_id,
+
+    -- * Destructuring the Response
+    GetActionResponse (..),
+    newGetActionResponse,
+
+    -- * Response Lenses
+    getActionResponse_action,
+    getActionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetAction' smart constructor.
+data GetAction = GetAction'
+  { -- | The ID of the action.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'getAction_id' - The ID of the action.
+newGetAction ::
+  -- | 'id'
+  Prelude.Text ->
+  GetAction
+newGetAction pId_ = GetAction' {id = pId_}
+
+-- | The ID of the action.
+getAction_id :: Lens.Lens' GetAction Prelude.Text
+getAction_id = Lens.lens (\GetAction' {id} -> id) (\s@GetAction' {} a -> s {id = a} :: GetAction)
+
+instance Core.AWSRequest GetAction where
+  type AWSResponse GetAction = GetActionResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetActionResponse'
+            Prelude.<$> (x Data..?> "action")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetAction where
+  hashWithSalt _salt GetAction' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData GetAction where
+  rnf GetAction' {..} = Prelude.rnf id
+
+instance Data.ToHeaders GetAction where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetAction where
+  toPath GetAction' {..} =
+    Prelude.mconcat ["/actions/", Data.toBS id]
+
+instance Data.ToQuery GetAction where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetActionResponse' smart constructor.
+data GetActionResponse = GetActionResponse'
+  { -- | Information about the action.
+    action :: Prelude.Maybe Action,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetActionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'action', 'getActionResponse_action' - Information about the action.
+--
+-- 'httpStatus', 'getActionResponse_httpStatus' - The response's http status code.
+newGetActionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetActionResponse
+newGetActionResponse pHttpStatus_ =
+  GetActionResponse'
+    { action = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the action.
+getActionResponse_action :: Lens.Lens' GetActionResponse (Prelude.Maybe Action)
+getActionResponse_action = Lens.lens (\GetActionResponse' {action} -> action) (\s@GetActionResponse' {} a -> s {action = a} :: GetActionResponse)
+
+-- | The response's http status code.
+getActionResponse_httpStatus :: Lens.Lens' GetActionResponse Prelude.Int
+getActionResponse_httpStatus = Lens.lens (\GetActionResponse' {httpStatus} -> httpStatus) (\s@GetActionResponse' {} a -> s {httpStatus = a} :: GetActionResponse)
+
+instance Prelude.NFData GetActionResponse where
+  rnf GetActionResponse' {..} =
+    Prelude.rnf action
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/GetExperiment.hs b/gen/Amazonka/FIS/GetExperiment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/GetExperiment.hs
@@ -0,0 +1,157 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.GetExperiment
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets information about the specified experiment.
+module Amazonka.FIS.GetExperiment
+  ( -- * Creating a Request
+    GetExperiment (..),
+    newGetExperiment,
+
+    -- * Request Lenses
+    getExperiment_id,
+
+    -- * Destructuring the Response
+    GetExperimentResponse (..),
+    newGetExperimentResponse,
+
+    -- * Response Lenses
+    getExperimentResponse_experiment,
+    getExperimentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetExperiment' smart constructor.
+data GetExperiment = GetExperiment'
+  { -- | The ID of the experiment.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetExperiment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'getExperiment_id' - The ID of the experiment.
+newGetExperiment ::
+  -- | 'id'
+  Prelude.Text ->
+  GetExperiment
+newGetExperiment pId_ = GetExperiment' {id = pId_}
+
+-- | The ID of the experiment.
+getExperiment_id :: Lens.Lens' GetExperiment Prelude.Text
+getExperiment_id = Lens.lens (\GetExperiment' {id} -> id) (\s@GetExperiment' {} a -> s {id = a} :: GetExperiment)
+
+instance Core.AWSRequest GetExperiment where
+  type
+    AWSResponse GetExperiment =
+      GetExperimentResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetExperimentResponse'
+            Prelude.<$> (x Data..?> "experiment")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetExperiment where
+  hashWithSalt _salt GetExperiment' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData GetExperiment where
+  rnf GetExperiment' {..} = Prelude.rnf id
+
+instance Data.ToHeaders GetExperiment where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetExperiment where
+  toPath GetExperiment' {..} =
+    Prelude.mconcat ["/experiments/", Data.toBS id]
+
+instance Data.ToQuery GetExperiment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetExperimentResponse' smart constructor.
+data GetExperimentResponse = GetExperimentResponse'
+  { -- | Information about the experiment.
+    experiment :: Prelude.Maybe Experiment,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetExperimentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'experiment', 'getExperimentResponse_experiment' - Information about the experiment.
+--
+-- 'httpStatus', 'getExperimentResponse_httpStatus' - The response's http status code.
+newGetExperimentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetExperimentResponse
+newGetExperimentResponse pHttpStatus_ =
+  GetExperimentResponse'
+    { experiment =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the experiment.
+getExperimentResponse_experiment :: Lens.Lens' GetExperimentResponse (Prelude.Maybe Experiment)
+getExperimentResponse_experiment = Lens.lens (\GetExperimentResponse' {experiment} -> experiment) (\s@GetExperimentResponse' {} a -> s {experiment = a} :: GetExperimentResponse)
+
+-- | The response's http status code.
+getExperimentResponse_httpStatus :: Lens.Lens' GetExperimentResponse Prelude.Int
+getExperimentResponse_httpStatus = Lens.lens (\GetExperimentResponse' {httpStatus} -> httpStatus) (\s@GetExperimentResponse' {} a -> s {httpStatus = a} :: GetExperimentResponse)
+
+instance Prelude.NFData GetExperimentResponse where
+  rnf GetExperimentResponse' {..} =
+    Prelude.rnf experiment
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/GetExperimentTemplate.hs b/gen/Amazonka/FIS/GetExperimentTemplate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/GetExperimentTemplate.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.FIS.GetExperimentTemplate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets information about the specified experiment template.
+module Amazonka.FIS.GetExperimentTemplate
+  ( -- * Creating a Request
+    GetExperimentTemplate (..),
+    newGetExperimentTemplate,
+
+    -- * Request Lenses
+    getExperimentTemplate_id,
+
+    -- * Destructuring the Response
+    GetExperimentTemplateResponse (..),
+    newGetExperimentTemplateResponse,
+
+    -- * Response Lenses
+    getExperimentTemplateResponse_experimentTemplate,
+    getExperimentTemplateResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetExperimentTemplate' smart constructor.
+data GetExperimentTemplate = GetExperimentTemplate'
+  { -- | The ID of the experiment template.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetExperimentTemplate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'getExperimentTemplate_id' - The ID of the experiment template.
+newGetExperimentTemplate ::
+  -- | 'id'
+  Prelude.Text ->
+  GetExperimentTemplate
+newGetExperimentTemplate pId_ =
+  GetExperimentTemplate' {id = pId_}
+
+-- | The ID of the experiment template.
+getExperimentTemplate_id :: Lens.Lens' GetExperimentTemplate Prelude.Text
+getExperimentTemplate_id = Lens.lens (\GetExperimentTemplate' {id} -> id) (\s@GetExperimentTemplate' {} a -> s {id = a} :: GetExperimentTemplate)
+
+instance Core.AWSRequest GetExperimentTemplate where
+  type
+    AWSResponse GetExperimentTemplate =
+      GetExperimentTemplateResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetExperimentTemplateResponse'
+            Prelude.<$> (x Data..?> "experimentTemplate")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetExperimentTemplate where
+  hashWithSalt _salt GetExperimentTemplate' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData GetExperimentTemplate where
+  rnf GetExperimentTemplate' {..} = Prelude.rnf id
+
+instance Data.ToHeaders GetExperimentTemplate where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetExperimentTemplate where
+  toPath GetExperimentTemplate' {..} =
+    Prelude.mconcat
+      ["/experimentTemplates/", Data.toBS id]
+
+instance Data.ToQuery GetExperimentTemplate where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetExperimentTemplateResponse' smart constructor.
+data GetExperimentTemplateResponse = GetExperimentTemplateResponse'
+  { -- | Information about the experiment template.
+    experimentTemplate :: Prelude.Maybe ExperimentTemplate,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetExperimentTemplateResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'experimentTemplate', 'getExperimentTemplateResponse_experimentTemplate' - Information about the experiment template.
+--
+-- 'httpStatus', 'getExperimentTemplateResponse_httpStatus' - The response's http status code.
+newGetExperimentTemplateResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetExperimentTemplateResponse
+newGetExperimentTemplateResponse pHttpStatus_ =
+  GetExperimentTemplateResponse'
+    { experimentTemplate =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the experiment template.
+getExperimentTemplateResponse_experimentTemplate :: Lens.Lens' GetExperimentTemplateResponse (Prelude.Maybe ExperimentTemplate)
+getExperimentTemplateResponse_experimentTemplate = Lens.lens (\GetExperimentTemplateResponse' {experimentTemplate} -> experimentTemplate) (\s@GetExperimentTemplateResponse' {} a -> s {experimentTemplate = a} :: GetExperimentTemplateResponse)
+
+-- | The response's http status code.
+getExperimentTemplateResponse_httpStatus :: Lens.Lens' GetExperimentTemplateResponse Prelude.Int
+getExperimentTemplateResponse_httpStatus = Lens.lens (\GetExperimentTemplateResponse' {httpStatus} -> httpStatus) (\s@GetExperimentTemplateResponse' {} a -> s {httpStatus = a} :: GetExperimentTemplateResponse)
+
+instance Prelude.NFData GetExperimentTemplateResponse where
+  rnf GetExperimentTemplateResponse' {..} =
+    Prelude.rnf experimentTemplate
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/GetTargetResourceType.hs b/gen/Amazonka/FIS/GetTargetResourceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/GetTargetResourceType.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.FIS.GetTargetResourceType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets information about the specified resource type.
+module Amazonka.FIS.GetTargetResourceType
+  ( -- * Creating a Request
+    GetTargetResourceType (..),
+    newGetTargetResourceType,
+
+    -- * Request Lenses
+    getTargetResourceType_resourceType,
+
+    -- * Destructuring the Response
+    GetTargetResourceTypeResponse (..),
+    newGetTargetResourceTypeResponse,
+
+    -- * Response Lenses
+    getTargetResourceTypeResponse_targetResourceType,
+    getTargetResourceTypeResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetTargetResourceType' smart constructor.
+data GetTargetResourceType = GetTargetResourceType'
+  { -- | The resource type.
+    resourceType :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetTargetResourceType' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceType', 'getTargetResourceType_resourceType' - The resource type.
+newGetTargetResourceType ::
+  -- | 'resourceType'
+  Prelude.Text ->
+  GetTargetResourceType
+newGetTargetResourceType pResourceType_ =
+  GetTargetResourceType'
+    { resourceType =
+        pResourceType_
+    }
+
+-- | The resource type.
+getTargetResourceType_resourceType :: Lens.Lens' GetTargetResourceType Prelude.Text
+getTargetResourceType_resourceType = Lens.lens (\GetTargetResourceType' {resourceType} -> resourceType) (\s@GetTargetResourceType' {} a -> s {resourceType = a} :: GetTargetResourceType)
+
+instance Core.AWSRequest GetTargetResourceType where
+  type
+    AWSResponse GetTargetResourceType =
+      GetTargetResourceTypeResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetTargetResourceTypeResponse'
+            Prelude.<$> (x Data..?> "targetResourceType")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetTargetResourceType where
+  hashWithSalt _salt GetTargetResourceType' {..} =
+    _salt `Prelude.hashWithSalt` resourceType
+
+instance Prelude.NFData GetTargetResourceType where
+  rnf GetTargetResourceType' {..} =
+    Prelude.rnf resourceType
+
+instance Data.ToHeaders GetTargetResourceType where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetTargetResourceType where
+  toPath GetTargetResourceType' {..} =
+    Prelude.mconcat
+      ["/targetResourceTypes/", Data.toBS resourceType]
+
+instance Data.ToQuery GetTargetResourceType where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetTargetResourceTypeResponse' smart constructor.
+data GetTargetResourceTypeResponse = GetTargetResourceTypeResponse'
+  { -- | Information about the resource type.
+    targetResourceType :: Prelude.Maybe TargetResourceType,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetTargetResourceTypeResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'targetResourceType', 'getTargetResourceTypeResponse_targetResourceType' - Information about the resource type.
+--
+-- 'httpStatus', 'getTargetResourceTypeResponse_httpStatus' - The response's http status code.
+newGetTargetResourceTypeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetTargetResourceTypeResponse
+newGetTargetResourceTypeResponse pHttpStatus_ =
+  GetTargetResourceTypeResponse'
+    { targetResourceType =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the resource type.
+getTargetResourceTypeResponse_targetResourceType :: Lens.Lens' GetTargetResourceTypeResponse (Prelude.Maybe TargetResourceType)
+getTargetResourceTypeResponse_targetResourceType = Lens.lens (\GetTargetResourceTypeResponse' {targetResourceType} -> targetResourceType) (\s@GetTargetResourceTypeResponse' {} a -> s {targetResourceType = a} :: GetTargetResourceTypeResponse)
+
+-- | The response's http status code.
+getTargetResourceTypeResponse_httpStatus :: Lens.Lens' GetTargetResourceTypeResponse Prelude.Int
+getTargetResourceTypeResponse_httpStatus = Lens.lens (\GetTargetResourceTypeResponse' {httpStatus} -> httpStatus) (\s@GetTargetResourceTypeResponse' {} a -> s {httpStatus = a} :: GetTargetResourceTypeResponse)
+
+instance Prelude.NFData GetTargetResourceTypeResponse where
+  rnf GetTargetResourceTypeResponse' {..} =
+    Prelude.rnf targetResourceType
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/Lens.hs b/gen/Amazonka/FIS/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Lens.hs
@@ -0,0 +1,390 @@
+{-# 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.FIS.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.FIS.Lens
+  ( -- * Operations
+
+    -- ** CreateExperimentTemplate
+    createExperimentTemplate_logConfiguration,
+    createExperimentTemplate_tags,
+    createExperimentTemplate_targets,
+    createExperimentTemplate_clientToken,
+    createExperimentTemplate_description,
+    createExperimentTemplate_stopConditions,
+    createExperimentTemplate_actions,
+    createExperimentTemplate_roleArn,
+    createExperimentTemplateResponse_experimentTemplate,
+    createExperimentTemplateResponse_httpStatus,
+
+    -- ** DeleteExperimentTemplate
+    deleteExperimentTemplate_id,
+    deleteExperimentTemplateResponse_experimentTemplate,
+    deleteExperimentTemplateResponse_httpStatus,
+
+    -- ** GetAction
+    getAction_id,
+    getActionResponse_action,
+    getActionResponse_httpStatus,
+
+    -- ** GetExperiment
+    getExperiment_id,
+    getExperimentResponse_experiment,
+    getExperimentResponse_httpStatus,
+
+    -- ** GetExperimentTemplate
+    getExperimentTemplate_id,
+    getExperimentTemplateResponse_experimentTemplate,
+    getExperimentTemplateResponse_httpStatus,
+
+    -- ** GetTargetResourceType
+    getTargetResourceType_resourceType,
+    getTargetResourceTypeResponse_targetResourceType,
+    getTargetResourceTypeResponse_httpStatus,
+
+    -- ** ListActions
+    listActions_maxResults,
+    listActions_nextToken,
+    listActionsResponse_actions,
+    listActionsResponse_nextToken,
+    listActionsResponse_httpStatus,
+
+    -- ** ListExperimentTemplates
+    listExperimentTemplates_maxResults,
+    listExperimentTemplates_nextToken,
+    listExperimentTemplatesResponse_experimentTemplates,
+    listExperimentTemplatesResponse_nextToken,
+    listExperimentTemplatesResponse_httpStatus,
+
+    -- ** ListExperiments
+    listExperiments_maxResults,
+    listExperiments_nextToken,
+    listExperimentsResponse_experiments,
+    listExperimentsResponse_nextToken,
+    listExperimentsResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** ListTargetResourceTypes
+    listTargetResourceTypes_maxResults,
+    listTargetResourceTypes_nextToken,
+    listTargetResourceTypesResponse_nextToken,
+    listTargetResourceTypesResponse_targetResourceTypes,
+    listTargetResourceTypesResponse_httpStatus,
+
+    -- ** StartExperiment
+    startExperiment_tags,
+    startExperiment_clientToken,
+    startExperiment_experimentTemplateId,
+    startExperimentResponse_experiment,
+    startExperimentResponse_httpStatus,
+
+    -- ** StopExperiment
+    stopExperiment_id,
+    stopExperimentResponse_experiment,
+    stopExperimentResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_tagKeys,
+    untagResource_resourceArn,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateExperimentTemplate
+    updateExperimentTemplate_actions,
+    updateExperimentTemplate_description,
+    updateExperimentTemplate_logConfiguration,
+    updateExperimentTemplate_roleArn,
+    updateExperimentTemplate_stopConditions,
+    updateExperimentTemplate_targets,
+    updateExperimentTemplate_id,
+    updateExperimentTemplateResponse_experimentTemplate,
+    updateExperimentTemplateResponse_httpStatus,
+
+    -- * Types
+
+    -- ** Action
+    action_description,
+    action_id,
+    action_parameters,
+    action_tags,
+    action_targets,
+
+    -- ** ActionParameter
+    actionParameter_description,
+    actionParameter_required,
+
+    -- ** ActionSummary
+    actionSummary_description,
+    actionSummary_id,
+    actionSummary_tags,
+    actionSummary_targets,
+
+    -- ** ActionTarget
+    actionTarget_resourceType,
+
+    -- ** CreateExperimentTemplateActionInput
+    createExperimentTemplateActionInput_description,
+    createExperimentTemplateActionInput_parameters,
+    createExperimentTemplateActionInput_startAfter,
+    createExperimentTemplateActionInput_targets,
+    createExperimentTemplateActionInput_actionId,
+
+    -- ** CreateExperimentTemplateLogConfigurationInput
+    createExperimentTemplateLogConfigurationInput_cloudWatchLogsConfiguration,
+    createExperimentTemplateLogConfigurationInput_s3Configuration,
+    createExperimentTemplateLogConfigurationInput_logSchemaVersion,
+
+    -- ** CreateExperimentTemplateStopConditionInput
+    createExperimentTemplateStopConditionInput_value,
+    createExperimentTemplateStopConditionInput_source,
+
+    -- ** CreateExperimentTemplateTargetInput
+    createExperimentTemplateTargetInput_filters,
+    createExperimentTemplateTargetInput_parameters,
+    createExperimentTemplateTargetInput_resourceArns,
+    createExperimentTemplateTargetInput_resourceTags,
+    createExperimentTemplateTargetInput_resourceType,
+    createExperimentTemplateTargetInput_selectionMode,
+
+    -- ** Experiment
+    experiment_actions,
+    experiment_creationTime,
+    experiment_endTime,
+    experiment_experimentTemplateId,
+    experiment_id,
+    experiment_logConfiguration,
+    experiment_roleArn,
+    experiment_startTime,
+    experiment_state,
+    experiment_stopConditions,
+    experiment_tags,
+    experiment_targets,
+
+    -- ** ExperimentAction
+    experimentAction_actionId,
+    experimentAction_description,
+    experimentAction_endTime,
+    experimentAction_parameters,
+    experimentAction_startAfter,
+    experimentAction_startTime,
+    experimentAction_state,
+    experimentAction_targets,
+
+    -- ** ExperimentActionState
+    experimentActionState_reason,
+    experimentActionState_status,
+
+    -- ** ExperimentCloudWatchLogsLogConfiguration
+    experimentCloudWatchLogsLogConfiguration_logGroupArn,
+
+    -- ** ExperimentLogConfiguration
+    experimentLogConfiguration_cloudWatchLogsConfiguration,
+    experimentLogConfiguration_logSchemaVersion,
+    experimentLogConfiguration_s3Configuration,
+
+    -- ** ExperimentS3LogConfiguration
+    experimentS3LogConfiguration_bucketName,
+    experimentS3LogConfiguration_prefix,
+
+    -- ** ExperimentState
+    experimentState_reason,
+    experimentState_status,
+
+    -- ** ExperimentStopCondition
+    experimentStopCondition_source,
+    experimentStopCondition_value,
+
+    -- ** ExperimentSummary
+    experimentSummary_creationTime,
+    experimentSummary_experimentTemplateId,
+    experimentSummary_id,
+    experimentSummary_state,
+    experimentSummary_tags,
+
+    -- ** ExperimentTarget
+    experimentTarget_filters,
+    experimentTarget_parameters,
+    experimentTarget_resourceArns,
+    experimentTarget_resourceTags,
+    experimentTarget_resourceType,
+    experimentTarget_selectionMode,
+
+    -- ** ExperimentTargetFilter
+    experimentTargetFilter_path,
+    experimentTargetFilter_values,
+
+    -- ** ExperimentTemplate
+    experimentTemplate_actions,
+    experimentTemplate_creationTime,
+    experimentTemplate_description,
+    experimentTemplate_id,
+    experimentTemplate_lastUpdateTime,
+    experimentTemplate_logConfiguration,
+    experimentTemplate_roleArn,
+    experimentTemplate_stopConditions,
+    experimentTemplate_tags,
+    experimentTemplate_targets,
+
+    -- ** ExperimentTemplateAction
+    experimentTemplateAction_actionId,
+    experimentTemplateAction_description,
+    experimentTemplateAction_parameters,
+    experimentTemplateAction_startAfter,
+    experimentTemplateAction_targets,
+
+    -- ** ExperimentTemplateCloudWatchLogsLogConfiguration
+    experimentTemplateCloudWatchLogsLogConfiguration_logGroupArn,
+
+    -- ** ExperimentTemplateCloudWatchLogsLogConfigurationInput
+    experimentTemplateCloudWatchLogsLogConfigurationInput_logGroupArn,
+
+    -- ** ExperimentTemplateLogConfiguration
+    experimentTemplateLogConfiguration_cloudWatchLogsConfiguration,
+    experimentTemplateLogConfiguration_logSchemaVersion,
+    experimentTemplateLogConfiguration_s3Configuration,
+
+    -- ** ExperimentTemplateS3LogConfiguration
+    experimentTemplateS3LogConfiguration_bucketName,
+    experimentTemplateS3LogConfiguration_prefix,
+
+    -- ** ExperimentTemplateS3LogConfigurationInput
+    experimentTemplateS3LogConfigurationInput_prefix,
+    experimentTemplateS3LogConfigurationInput_bucketName,
+
+    -- ** ExperimentTemplateStopCondition
+    experimentTemplateStopCondition_source,
+    experimentTemplateStopCondition_value,
+
+    -- ** ExperimentTemplateSummary
+    experimentTemplateSummary_creationTime,
+    experimentTemplateSummary_description,
+    experimentTemplateSummary_id,
+    experimentTemplateSummary_lastUpdateTime,
+    experimentTemplateSummary_tags,
+
+    -- ** ExperimentTemplateTarget
+    experimentTemplateTarget_filters,
+    experimentTemplateTarget_parameters,
+    experimentTemplateTarget_resourceArns,
+    experimentTemplateTarget_resourceTags,
+    experimentTemplateTarget_resourceType,
+    experimentTemplateTarget_selectionMode,
+
+    -- ** ExperimentTemplateTargetFilter
+    experimentTemplateTargetFilter_path,
+    experimentTemplateTargetFilter_values,
+
+    -- ** ExperimentTemplateTargetInputFilter
+    experimentTemplateTargetInputFilter_path,
+    experimentTemplateTargetInputFilter_values,
+
+    -- ** TargetResourceType
+    targetResourceType_description,
+    targetResourceType_parameters,
+    targetResourceType_resourceType,
+
+    -- ** TargetResourceTypeParameter
+    targetResourceTypeParameter_description,
+    targetResourceTypeParameter_required,
+
+    -- ** TargetResourceTypeSummary
+    targetResourceTypeSummary_description,
+    targetResourceTypeSummary_resourceType,
+
+    -- ** UpdateExperimentTemplateActionInputItem
+    updateExperimentTemplateActionInputItem_actionId,
+    updateExperimentTemplateActionInputItem_description,
+    updateExperimentTemplateActionInputItem_parameters,
+    updateExperimentTemplateActionInputItem_startAfter,
+    updateExperimentTemplateActionInputItem_targets,
+
+    -- ** UpdateExperimentTemplateLogConfigurationInput
+    updateExperimentTemplateLogConfigurationInput_cloudWatchLogsConfiguration,
+    updateExperimentTemplateLogConfigurationInput_logSchemaVersion,
+    updateExperimentTemplateLogConfigurationInput_s3Configuration,
+
+    -- ** UpdateExperimentTemplateStopConditionInput
+    updateExperimentTemplateStopConditionInput_value,
+    updateExperimentTemplateStopConditionInput_source,
+
+    -- ** UpdateExperimentTemplateTargetInput
+    updateExperimentTemplateTargetInput_filters,
+    updateExperimentTemplateTargetInput_parameters,
+    updateExperimentTemplateTargetInput_resourceArns,
+    updateExperimentTemplateTargetInput_resourceTags,
+    updateExperimentTemplateTargetInput_resourceType,
+    updateExperimentTemplateTargetInput_selectionMode,
+  )
+where
+
+import Amazonka.FIS.CreateExperimentTemplate
+import Amazonka.FIS.DeleteExperimentTemplate
+import Amazonka.FIS.GetAction
+import Amazonka.FIS.GetExperiment
+import Amazonka.FIS.GetExperimentTemplate
+import Amazonka.FIS.GetTargetResourceType
+import Amazonka.FIS.ListActions
+import Amazonka.FIS.ListExperimentTemplates
+import Amazonka.FIS.ListExperiments
+import Amazonka.FIS.ListTagsForResource
+import Amazonka.FIS.ListTargetResourceTypes
+import Amazonka.FIS.StartExperiment
+import Amazonka.FIS.StopExperiment
+import Amazonka.FIS.TagResource
+import Amazonka.FIS.Types.Action
+import Amazonka.FIS.Types.ActionParameter
+import Amazonka.FIS.Types.ActionSummary
+import Amazonka.FIS.Types.ActionTarget
+import Amazonka.FIS.Types.CreateExperimentTemplateActionInput
+import Amazonka.FIS.Types.CreateExperimentTemplateLogConfigurationInput
+import Amazonka.FIS.Types.CreateExperimentTemplateStopConditionInput
+import Amazonka.FIS.Types.CreateExperimentTemplateTargetInput
+import Amazonka.FIS.Types.Experiment
+import Amazonka.FIS.Types.ExperimentAction
+import Amazonka.FIS.Types.ExperimentActionState
+import Amazonka.FIS.Types.ExperimentCloudWatchLogsLogConfiguration
+import Amazonka.FIS.Types.ExperimentLogConfiguration
+import Amazonka.FIS.Types.ExperimentS3LogConfiguration
+import Amazonka.FIS.Types.ExperimentState
+import Amazonka.FIS.Types.ExperimentStopCondition
+import Amazonka.FIS.Types.ExperimentSummary
+import Amazonka.FIS.Types.ExperimentTarget
+import Amazonka.FIS.Types.ExperimentTargetFilter
+import Amazonka.FIS.Types.ExperimentTemplate
+import Amazonka.FIS.Types.ExperimentTemplateAction
+import Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfiguration
+import Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfigurationInput
+import Amazonka.FIS.Types.ExperimentTemplateLogConfiguration
+import Amazonka.FIS.Types.ExperimentTemplateS3LogConfiguration
+import Amazonka.FIS.Types.ExperimentTemplateS3LogConfigurationInput
+import Amazonka.FIS.Types.ExperimentTemplateStopCondition
+import Amazonka.FIS.Types.ExperimentTemplateSummary
+import Amazonka.FIS.Types.ExperimentTemplateTarget
+import Amazonka.FIS.Types.ExperimentTemplateTargetFilter
+import Amazonka.FIS.Types.ExperimentTemplateTargetInputFilter
+import Amazonka.FIS.Types.TargetResourceType
+import Amazonka.FIS.Types.TargetResourceTypeParameter
+import Amazonka.FIS.Types.TargetResourceTypeSummary
+import Amazonka.FIS.Types.UpdateExperimentTemplateActionInputItem
+import Amazonka.FIS.Types.UpdateExperimentTemplateLogConfigurationInput
+import Amazonka.FIS.Types.UpdateExperimentTemplateStopConditionInput
+import Amazonka.FIS.Types.UpdateExperimentTemplateTargetInput
+import Amazonka.FIS.UntagResource
+import Amazonka.FIS.UpdateExperimentTemplate
diff --git a/gen/Amazonka/FIS/ListActions.hs b/gen/Amazonka/FIS/ListActions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/ListActions.hs
@@ -0,0 +1,193 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.ListActions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the available FIS actions.
+module Amazonka.FIS.ListActions
+  ( -- * Creating a Request
+    ListActions (..),
+    newListActions,
+
+    -- * Request Lenses
+    listActions_maxResults,
+    listActions_nextToken,
+
+    -- * Destructuring the Response
+    ListActionsResponse (..),
+    newListActionsResponse,
+
+    -- * Response Lenses
+    listActionsResponse_actions,
+    listActionsResponse_nextToken,
+    listActionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListActions' smart constructor.
+data ListActions = ListActions'
+  { -- | The maximum number of results to return with a single call. To retrieve
+    -- the remaining results, make another call with the returned @nextToken@
+    -- value.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token for the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListActions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listActions_maxResults' - The maximum number of results to return with a single call. To retrieve
+-- the remaining results, make another call with the returned @nextToken@
+-- value.
+--
+-- 'nextToken', 'listActions_nextToken' - The token for the next page of results.
+newListActions ::
+  ListActions
+newListActions =
+  ListActions'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return with a single call. To retrieve
+-- the remaining results, make another call with the returned @nextToken@
+-- value.
+listActions_maxResults :: Lens.Lens' ListActions (Prelude.Maybe Prelude.Natural)
+listActions_maxResults = Lens.lens (\ListActions' {maxResults} -> maxResults) (\s@ListActions' {} a -> s {maxResults = a} :: ListActions)
+
+-- | The token for the next page of results.
+listActions_nextToken :: Lens.Lens' ListActions (Prelude.Maybe Prelude.Text)
+listActions_nextToken = Lens.lens (\ListActions' {nextToken} -> nextToken) (\s@ListActions' {} a -> s {nextToken = a} :: ListActions)
+
+instance Core.AWSRequest ListActions where
+  type AWSResponse ListActions = ListActionsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListActionsResponse'
+            Prelude.<$> (x Data..?> "actions" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListActions where
+  hashWithSalt _salt ListActions' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListActions where
+  rnf ListActions' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListActions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListActions where
+  toPath = Prelude.const "/actions"
+
+instance Data.ToQuery ListActions where
+  toQuery ListActions' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListActionsResponse' smart constructor.
+data ListActionsResponse = ListActionsResponse'
+  { -- | The actions.
+    actions :: Prelude.Maybe [ActionSummary],
+    -- | The token to use to retrieve the next page of results. This value is
+    -- @null@ when there are no more results to return.
+    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 'ListActionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'actions', 'listActionsResponse_actions' - The actions.
+--
+-- 'nextToken', 'listActionsResponse_nextToken' - The token to use to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listActionsResponse_httpStatus' - The response's http status code.
+newListActionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListActionsResponse
+newListActionsResponse pHttpStatus_ =
+  ListActionsResponse'
+    { actions = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The actions.
+listActionsResponse_actions :: Lens.Lens' ListActionsResponse (Prelude.Maybe [ActionSummary])
+listActionsResponse_actions = Lens.lens (\ListActionsResponse' {actions} -> actions) (\s@ListActionsResponse' {} a -> s {actions = a} :: ListActionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token to use to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+listActionsResponse_nextToken :: Lens.Lens' ListActionsResponse (Prelude.Maybe Prelude.Text)
+listActionsResponse_nextToken = Lens.lens (\ListActionsResponse' {nextToken} -> nextToken) (\s@ListActionsResponse' {} a -> s {nextToken = a} :: ListActionsResponse)
+
+-- | The response's http status code.
+listActionsResponse_httpStatus :: Lens.Lens' ListActionsResponse Prelude.Int
+listActionsResponse_httpStatus = Lens.lens (\ListActionsResponse' {httpStatus} -> httpStatus) (\s@ListActionsResponse' {} a -> s {httpStatus = a} :: ListActionsResponse)
+
+instance Prelude.NFData ListActionsResponse where
+  rnf ListActionsResponse' {..} =
+    Prelude.rnf actions
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/ListExperimentTemplates.hs b/gen/Amazonka/FIS/ListExperimentTemplates.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/ListExperimentTemplates.hs
@@ -0,0 +1,203 @@
+{-# 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.FIS.ListExperimentTemplates
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists your experiment templates.
+module Amazonka.FIS.ListExperimentTemplates
+  ( -- * Creating a Request
+    ListExperimentTemplates (..),
+    newListExperimentTemplates,
+
+    -- * Request Lenses
+    listExperimentTemplates_maxResults,
+    listExperimentTemplates_nextToken,
+
+    -- * Destructuring the Response
+    ListExperimentTemplatesResponse (..),
+    newListExperimentTemplatesResponse,
+
+    -- * Response Lenses
+    listExperimentTemplatesResponse_experimentTemplates,
+    listExperimentTemplatesResponse_nextToken,
+    listExperimentTemplatesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListExperimentTemplates' smart constructor.
+data ListExperimentTemplates = ListExperimentTemplates'
+  { -- | The maximum number of results to return with a single call. To retrieve
+    -- the remaining results, make another call with the returned @nextToken@
+    -- value.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token for the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListExperimentTemplates' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listExperimentTemplates_maxResults' - The maximum number of results to return with a single call. To retrieve
+-- the remaining results, make another call with the returned @nextToken@
+-- value.
+--
+-- 'nextToken', 'listExperimentTemplates_nextToken' - The token for the next page of results.
+newListExperimentTemplates ::
+  ListExperimentTemplates
+newListExperimentTemplates =
+  ListExperimentTemplates'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return with a single call. To retrieve
+-- the remaining results, make another call with the returned @nextToken@
+-- value.
+listExperimentTemplates_maxResults :: Lens.Lens' ListExperimentTemplates (Prelude.Maybe Prelude.Natural)
+listExperimentTemplates_maxResults = Lens.lens (\ListExperimentTemplates' {maxResults} -> maxResults) (\s@ListExperimentTemplates' {} a -> s {maxResults = a} :: ListExperimentTemplates)
+
+-- | The token for the next page of results.
+listExperimentTemplates_nextToken :: Lens.Lens' ListExperimentTemplates (Prelude.Maybe Prelude.Text)
+listExperimentTemplates_nextToken = Lens.lens (\ListExperimentTemplates' {nextToken} -> nextToken) (\s@ListExperimentTemplates' {} a -> s {nextToken = a} :: ListExperimentTemplates)
+
+instance Core.AWSRequest ListExperimentTemplates where
+  type
+    AWSResponse ListExperimentTemplates =
+      ListExperimentTemplatesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListExperimentTemplatesResponse'
+            Prelude.<$> ( x
+                            Data..?> "experimentTemplates"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListExperimentTemplates where
+  hashWithSalt _salt ListExperimentTemplates' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListExperimentTemplates where
+  rnf ListExperimentTemplates' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListExperimentTemplates where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListExperimentTemplates where
+  toPath = Prelude.const "/experimentTemplates"
+
+instance Data.ToQuery ListExperimentTemplates where
+  toQuery ListExperimentTemplates' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListExperimentTemplatesResponse' smart constructor.
+data ListExperimentTemplatesResponse = ListExperimentTemplatesResponse'
+  { -- | The experiment templates.
+    experimentTemplates :: Prelude.Maybe [ExperimentTemplateSummary],
+    -- | The token to use to retrieve the next page of results. This value is
+    -- @null@ when there are no more results to return.
+    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 'ListExperimentTemplatesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'experimentTemplates', 'listExperimentTemplatesResponse_experimentTemplates' - The experiment templates.
+--
+-- 'nextToken', 'listExperimentTemplatesResponse_nextToken' - The token to use to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listExperimentTemplatesResponse_httpStatus' - The response's http status code.
+newListExperimentTemplatesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListExperimentTemplatesResponse
+newListExperimentTemplatesResponse pHttpStatus_ =
+  ListExperimentTemplatesResponse'
+    { experimentTemplates =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The experiment templates.
+listExperimentTemplatesResponse_experimentTemplates :: Lens.Lens' ListExperimentTemplatesResponse (Prelude.Maybe [ExperimentTemplateSummary])
+listExperimentTemplatesResponse_experimentTemplates = Lens.lens (\ListExperimentTemplatesResponse' {experimentTemplates} -> experimentTemplates) (\s@ListExperimentTemplatesResponse' {} a -> s {experimentTemplates = a} :: ListExperimentTemplatesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token to use to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+listExperimentTemplatesResponse_nextToken :: Lens.Lens' ListExperimentTemplatesResponse (Prelude.Maybe Prelude.Text)
+listExperimentTemplatesResponse_nextToken = Lens.lens (\ListExperimentTemplatesResponse' {nextToken} -> nextToken) (\s@ListExperimentTemplatesResponse' {} a -> s {nextToken = a} :: ListExperimentTemplatesResponse)
+
+-- | The response's http status code.
+listExperimentTemplatesResponse_httpStatus :: Lens.Lens' ListExperimentTemplatesResponse Prelude.Int
+listExperimentTemplatesResponse_httpStatus = Lens.lens (\ListExperimentTemplatesResponse' {httpStatus} -> httpStatus) (\s@ListExperimentTemplatesResponse' {} a -> s {httpStatus = a} :: ListExperimentTemplatesResponse)
+
+instance
+  Prelude.NFData
+    ListExperimentTemplatesResponse
+  where
+  rnf ListExperimentTemplatesResponse' {..} =
+    Prelude.rnf experimentTemplates
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/ListExperiments.hs b/gen/Amazonka/FIS/ListExperiments.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/ListExperiments.hs
@@ -0,0 +1,196 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.ListExperiments
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists your experiments.
+module Amazonka.FIS.ListExperiments
+  ( -- * Creating a Request
+    ListExperiments (..),
+    newListExperiments,
+
+    -- * Request Lenses
+    listExperiments_maxResults,
+    listExperiments_nextToken,
+
+    -- * Destructuring the Response
+    ListExperimentsResponse (..),
+    newListExperimentsResponse,
+
+    -- * Response Lenses
+    listExperimentsResponse_experiments,
+    listExperimentsResponse_nextToken,
+    listExperimentsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListExperiments' smart constructor.
+data ListExperiments = ListExperiments'
+  { -- | The maximum number of results to return with a single call. To retrieve
+    -- the remaining results, make another call with the returned @nextToken@
+    -- value.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token for the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListExperiments' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listExperiments_maxResults' - The maximum number of results to return with a single call. To retrieve
+-- the remaining results, make another call with the returned @nextToken@
+-- value.
+--
+-- 'nextToken', 'listExperiments_nextToken' - The token for the next page of results.
+newListExperiments ::
+  ListExperiments
+newListExperiments =
+  ListExperiments'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return with a single call. To retrieve
+-- the remaining results, make another call with the returned @nextToken@
+-- value.
+listExperiments_maxResults :: Lens.Lens' ListExperiments (Prelude.Maybe Prelude.Natural)
+listExperiments_maxResults = Lens.lens (\ListExperiments' {maxResults} -> maxResults) (\s@ListExperiments' {} a -> s {maxResults = a} :: ListExperiments)
+
+-- | The token for the next page of results.
+listExperiments_nextToken :: Lens.Lens' ListExperiments (Prelude.Maybe Prelude.Text)
+listExperiments_nextToken = Lens.lens (\ListExperiments' {nextToken} -> nextToken) (\s@ListExperiments' {} a -> s {nextToken = a} :: ListExperiments)
+
+instance Core.AWSRequest ListExperiments where
+  type
+    AWSResponse ListExperiments =
+      ListExperimentsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListExperimentsResponse'
+            Prelude.<$> (x Data..?> "experiments" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListExperiments where
+  hashWithSalt _salt ListExperiments' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListExperiments where
+  rnf ListExperiments' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListExperiments where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListExperiments where
+  toPath = Prelude.const "/experiments"
+
+instance Data.ToQuery ListExperiments where
+  toQuery ListExperiments' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListExperimentsResponse' smart constructor.
+data ListExperimentsResponse = ListExperimentsResponse'
+  { -- | The experiments.
+    experiments :: Prelude.Maybe [ExperimentSummary],
+    -- | The token to use to retrieve the next page of results. This value is
+    -- @null@ when there are no more results to return.
+    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 'ListExperimentsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'experiments', 'listExperimentsResponse_experiments' - The experiments.
+--
+-- 'nextToken', 'listExperimentsResponse_nextToken' - The token to use to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listExperimentsResponse_httpStatus' - The response's http status code.
+newListExperimentsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListExperimentsResponse
+newListExperimentsResponse pHttpStatus_ =
+  ListExperimentsResponse'
+    { experiments =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The experiments.
+listExperimentsResponse_experiments :: Lens.Lens' ListExperimentsResponse (Prelude.Maybe [ExperimentSummary])
+listExperimentsResponse_experiments = Lens.lens (\ListExperimentsResponse' {experiments} -> experiments) (\s@ListExperimentsResponse' {} a -> s {experiments = a} :: ListExperimentsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token to use to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+listExperimentsResponse_nextToken :: Lens.Lens' ListExperimentsResponse (Prelude.Maybe Prelude.Text)
+listExperimentsResponse_nextToken = Lens.lens (\ListExperimentsResponse' {nextToken} -> nextToken) (\s@ListExperimentsResponse' {} a -> s {nextToken = a} :: ListExperimentsResponse)
+
+-- | The response's http status code.
+listExperimentsResponse_httpStatus :: Lens.Lens' ListExperimentsResponse Prelude.Int
+listExperimentsResponse_httpStatus = Lens.lens (\ListExperimentsResponse' {httpStatus} -> httpStatus) (\s@ListExperimentsResponse' {} a -> s {httpStatus = a} :: ListExperimentsResponse)
+
+instance Prelude.NFData ListExperimentsResponse where
+  rnf ListExperimentsResponse' {..} =
+    Prelude.rnf experiments
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/ListTagsForResource.hs b/gen/Amazonka/FIS/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/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.FIS.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)
+--
+-- Lists the tags for the specified resource.
+module Amazonka.FIS.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.FIS.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 (ARN) 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 (ARN) of the resource.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) 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'
+  { -- | The tags for the 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' - The tags for the resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The tags for the 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/FIS/ListTargetResourceTypes.hs b/gen/Amazonka/FIS/ListTargetResourceTypes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/ListTargetResourceTypes.hs
@@ -0,0 +1,203 @@
+{-# 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.FIS.ListTargetResourceTypes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the target resource types.
+module Amazonka.FIS.ListTargetResourceTypes
+  ( -- * Creating a Request
+    ListTargetResourceTypes (..),
+    newListTargetResourceTypes,
+
+    -- * Request Lenses
+    listTargetResourceTypes_maxResults,
+    listTargetResourceTypes_nextToken,
+
+    -- * Destructuring the Response
+    ListTargetResourceTypesResponse (..),
+    newListTargetResourceTypesResponse,
+
+    -- * Response Lenses
+    listTargetResourceTypesResponse_nextToken,
+    listTargetResourceTypesResponse_targetResourceTypes,
+    listTargetResourceTypesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTargetResourceTypes' smart constructor.
+data ListTargetResourceTypes = ListTargetResourceTypes'
+  { -- | The maximum number of results to return with a single call. To retrieve
+    -- the remaining results, make another call with the returned @nextToken@
+    -- value.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token for the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTargetResourceTypes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listTargetResourceTypes_maxResults' - The maximum number of results to return with a single call. To retrieve
+-- the remaining results, make another call with the returned @nextToken@
+-- value.
+--
+-- 'nextToken', 'listTargetResourceTypes_nextToken' - The token for the next page of results.
+newListTargetResourceTypes ::
+  ListTargetResourceTypes
+newListTargetResourceTypes =
+  ListTargetResourceTypes'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return with a single call. To retrieve
+-- the remaining results, make another call with the returned @nextToken@
+-- value.
+listTargetResourceTypes_maxResults :: Lens.Lens' ListTargetResourceTypes (Prelude.Maybe Prelude.Natural)
+listTargetResourceTypes_maxResults = Lens.lens (\ListTargetResourceTypes' {maxResults} -> maxResults) (\s@ListTargetResourceTypes' {} a -> s {maxResults = a} :: ListTargetResourceTypes)
+
+-- | The token for the next page of results.
+listTargetResourceTypes_nextToken :: Lens.Lens' ListTargetResourceTypes (Prelude.Maybe Prelude.Text)
+listTargetResourceTypes_nextToken = Lens.lens (\ListTargetResourceTypes' {nextToken} -> nextToken) (\s@ListTargetResourceTypes' {} a -> s {nextToken = a} :: ListTargetResourceTypes)
+
+instance Core.AWSRequest ListTargetResourceTypes where
+  type
+    AWSResponse ListTargetResourceTypes =
+      ListTargetResourceTypesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTargetResourceTypesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> ( x
+                            Data..?> "targetResourceTypes"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTargetResourceTypes where
+  hashWithSalt _salt ListTargetResourceTypes' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListTargetResourceTypes where
+  rnf ListTargetResourceTypes' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListTargetResourceTypes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTargetResourceTypes where
+  toPath = Prelude.const "/targetResourceTypes"
+
+instance Data.ToQuery ListTargetResourceTypes where
+  toQuery ListTargetResourceTypes' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListTargetResourceTypesResponse' smart constructor.
+data ListTargetResourceTypesResponse = ListTargetResourceTypesResponse'
+  { -- | The token to use to retrieve the next page of results. This value is
+    -- @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The target resource types.
+    targetResourceTypes :: Prelude.Maybe [TargetResourceTypeSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTargetResourceTypesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listTargetResourceTypesResponse_nextToken' - The token to use to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+--
+-- 'targetResourceTypes', 'listTargetResourceTypesResponse_targetResourceTypes' - The target resource types.
+--
+-- 'httpStatus', 'listTargetResourceTypesResponse_httpStatus' - The response's http status code.
+newListTargetResourceTypesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTargetResourceTypesResponse
+newListTargetResourceTypesResponse pHttpStatus_ =
+  ListTargetResourceTypesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      targetResourceTypes = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token to use to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+listTargetResourceTypesResponse_nextToken :: Lens.Lens' ListTargetResourceTypesResponse (Prelude.Maybe Prelude.Text)
+listTargetResourceTypesResponse_nextToken = Lens.lens (\ListTargetResourceTypesResponse' {nextToken} -> nextToken) (\s@ListTargetResourceTypesResponse' {} a -> s {nextToken = a} :: ListTargetResourceTypesResponse)
+
+-- | The target resource types.
+listTargetResourceTypesResponse_targetResourceTypes :: Lens.Lens' ListTargetResourceTypesResponse (Prelude.Maybe [TargetResourceTypeSummary])
+listTargetResourceTypesResponse_targetResourceTypes = Lens.lens (\ListTargetResourceTypesResponse' {targetResourceTypes} -> targetResourceTypes) (\s@ListTargetResourceTypesResponse' {} a -> s {targetResourceTypes = a} :: ListTargetResourceTypesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTargetResourceTypesResponse_httpStatus :: Lens.Lens' ListTargetResourceTypesResponse Prelude.Int
+listTargetResourceTypesResponse_httpStatus = Lens.lens (\ListTargetResourceTypesResponse' {httpStatus} -> httpStatus) (\s@ListTargetResourceTypesResponse' {} a -> s {httpStatus = a} :: ListTargetResourceTypesResponse)
+
+instance
+  Prelude.NFData
+    ListTargetResourceTypesResponse
+  where
+  rnf ListTargetResourceTypesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf targetResourceTypes
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/StartExperiment.hs b/gen/Amazonka/FIS/StartExperiment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/StartExperiment.hs
@@ -0,0 +1,205 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.StartExperiment
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts running an experiment from the specified experiment template.
+module Amazonka.FIS.StartExperiment
+  ( -- * Creating a Request
+    StartExperiment (..),
+    newStartExperiment,
+
+    -- * Request Lenses
+    startExperiment_tags,
+    startExperiment_clientToken,
+    startExperiment_experimentTemplateId,
+
+    -- * Destructuring the Response
+    StartExperimentResponse (..),
+    newStartExperimentResponse,
+
+    -- * Response Lenses
+    startExperimentResponse_experiment,
+    startExperimentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStartExperiment' smart constructor.
+data StartExperiment = StartExperiment'
+  { -- | The tags to apply to the experiment.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request.
+    clientToken :: Prelude.Text,
+    -- | The ID of the experiment template.
+    experimentTemplateId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartExperiment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'startExperiment_tags' - The tags to apply to the experiment.
+--
+-- 'clientToken', 'startExperiment_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request.
+--
+-- 'experimentTemplateId', 'startExperiment_experimentTemplateId' - The ID of the experiment template.
+newStartExperiment ::
+  -- | 'clientToken'
+  Prelude.Text ->
+  -- | 'experimentTemplateId'
+  Prelude.Text ->
+  StartExperiment
+newStartExperiment
+  pClientToken_
+  pExperimentTemplateId_ =
+    StartExperiment'
+      { tags = Prelude.Nothing,
+        clientToken = pClientToken_,
+        experimentTemplateId = pExperimentTemplateId_
+      }
+
+-- | The tags to apply to the experiment.
+startExperiment_tags :: Lens.Lens' StartExperiment (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+startExperiment_tags = Lens.lens (\StartExperiment' {tags} -> tags) (\s@StartExperiment' {} a -> s {tags = a} :: StartExperiment) Prelude.. Lens.mapping Lens.coerced
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request.
+startExperiment_clientToken :: Lens.Lens' StartExperiment Prelude.Text
+startExperiment_clientToken = Lens.lens (\StartExperiment' {clientToken} -> clientToken) (\s@StartExperiment' {} a -> s {clientToken = a} :: StartExperiment)
+
+-- | The ID of the experiment template.
+startExperiment_experimentTemplateId :: Lens.Lens' StartExperiment Prelude.Text
+startExperiment_experimentTemplateId = Lens.lens (\StartExperiment' {experimentTemplateId} -> experimentTemplateId) (\s@StartExperiment' {} a -> s {experimentTemplateId = a} :: StartExperiment)
+
+instance Core.AWSRequest StartExperiment where
+  type
+    AWSResponse StartExperiment =
+      StartExperimentResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartExperimentResponse'
+            Prelude.<$> (x Data..?> "experiment")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartExperiment where
+  hashWithSalt _salt StartExperiment' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` experimentTemplateId
+
+instance Prelude.NFData StartExperiment where
+  rnf StartExperiment' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf experimentTemplateId
+
+instance Data.ToHeaders StartExperiment where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartExperiment where
+  toJSON StartExperiment' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("clientToken" Data..= clientToken),
+            Prelude.Just
+              ( "experimentTemplateId"
+                  Data..= experimentTemplateId
+              )
+          ]
+      )
+
+instance Data.ToPath StartExperiment where
+  toPath = Prelude.const "/experiments"
+
+instance Data.ToQuery StartExperiment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartExperimentResponse' smart constructor.
+data StartExperimentResponse = StartExperimentResponse'
+  { -- | Information about the experiment.
+    experiment :: Prelude.Maybe Experiment,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartExperimentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'experiment', 'startExperimentResponse_experiment' - Information about the experiment.
+--
+-- 'httpStatus', 'startExperimentResponse_httpStatus' - The response's http status code.
+newStartExperimentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartExperimentResponse
+newStartExperimentResponse pHttpStatus_ =
+  StartExperimentResponse'
+    { experiment =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the experiment.
+startExperimentResponse_experiment :: Lens.Lens' StartExperimentResponse (Prelude.Maybe Experiment)
+startExperimentResponse_experiment = Lens.lens (\StartExperimentResponse' {experiment} -> experiment) (\s@StartExperimentResponse' {} a -> s {experiment = a} :: StartExperimentResponse)
+
+-- | The response's http status code.
+startExperimentResponse_httpStatus :: Lens.Lens' StartExperimentResponse Prelude.Int
+startExperimentResponse_httpStatus = Lens.lens (\StartExperimentResponse' {httpStatus} -> httpStatus) (\s@StartExperimentResponse' {} a -> s {httpStatus = a} :: StartExperimentResponse)
+
+instance Prelude.NFData StartExperimentResponse where
+  rnf StartExperimentResponse' {..} =
+    Prelude.rnf experiment
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/StopExperiment.hs b/gen/Amazonka/FIS/StopExperiment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/StopExperiment.hs
@@ -0,0 +1,157 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.StopExperiment
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Stops the specified experiment.
+module Amazonka.FIS.StopExperiment
+  ( -- * Creating a Request
+    StopExperiment (..),
+    newStopExperiment,
+
+    -- * Request Lenses
+    stopExperiment_id,
+
+    -- * Destructuring the Response
+    StopExperimentResponse (..),
+    newStopExperimentResponse,
+
+    -- * Response Lenses
+    stopExperimentResponse_experiment,
+    stopExperimentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStopExperiment' smart constructor.
+data StopExperiment = StopExperiment'
+  { -- | The ID of the experiment.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopExperiment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'stopExperiment_id' - The ID of the experiment.
+newStopExperiment ::
+  -- | 'id'
+  Prelude.Text ->
+  StopExperiment
+newStopExperiment pId_ = StopExperiment' {id = pId_}
+
+-- | The ID of the experiment.
+stopExperiment_id :: Lens.Lens' StopExperiment Prelude.Text
+stopExperiment_id = Lens.lens (\StopExperiment' {id} -> id) (\s@StopExperiment' {} a -> s {id = a} :: StopExperiment)
+
+instance Core.AWSRequest StopExperiment where
+  type
+    AWSResponse StopExperiment =
+      StopExperimentResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StopExperimentResponse'
+            Prelude.<$> (x Data..?> "experiment")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StopExperiment where
+  hashWithSalt _salt StopExperiment' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData StopExperiment where
+  rnf StopExperiment' {..} = Prelude.rnf id
+
+instance Data.ToHeaders StopExperiment where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath StopExperiment where
+  toPath StopExperiment' {..} =
+    Prelude.mconcat ["/experiments/", Data.toBS id]
+
+instance Data.ToQuery StopExperiment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStopExperimentResponse' smart constructor.
+data StopExperimentResponse = StopExperimentResponse'
+  { -- | Information about the experiment.
+    experiment :: Prelude.Maybe Experiment,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopExperimentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'experiment', 'stopExperimentResponse_experiment' - Information about the experiment.
+--
+-- 'httpStatus', 'stopExperimentResponse_httpStatus' - The response's http status code.
+newStopExperimentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StopExperimentResponse
+newStopExperimentResponse pHttpStatus_ =
+  StopExperimentResponse'
+    { experiment =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the experiment.
+stopExperimentResponse_experiment :: Lens.Lens' StopExperimentResponse (Prelude.Maybe Experiment)
+stopExperimentResponse_experiment = Lens.lens (\StopExperimentResponse' {experiment} -> experiment) (\s@StopExperimentResponse' {} a -> s {experiment = a} :: StopExperimentResponse)
+
+-- | The response's http status code.
+stopExperimentResponse_httpStatus :: Lens.Lens' StopExperimentResponse Prelude.Int
+stopExperimentResponse_httpStatus = Lens.lens (\StopExperimentResponse' {httpStatus} -> httpStatus) (\s@StopExperimentResponse' {} a -> s {httpStatus = a} :: StopExperimentResponse)
+
+instance Prelude.NFData StopExperimentResponse where
+  rnf StopExperimentResponse' {..} =
+    Prelude.rnf experiment
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/TagResource.hs b/gen/Amazonka/FIS/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/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.FIS.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)
+--
+-- Applies the specified tags to the specified resource.
+module Amazonka.FIS.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.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource.
+    resourceArn :: Prelude.Text,
+    -- | The tags for 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) of the resource.
+--
+-- 'tags', 'tagResource_tags' - The tags for the resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The tags for 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/FIS/Types.hs b/gen/Amazonka/FIS/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types.hs
@@ -0,0 +1,469 @@
+{-# 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.FIS.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.FIS.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _ConflictException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ValidationException,
+
+    -- * ExperimentActionStatus
+    ExperimentActionStatus (..),
+
+    -- * ExperimentStatus
+    ExperimentStatus (..),
+
+    -- * Action
+    Action (..),
+    newAction,
+    action_description,
+    action_id,
+    action_parameters,
+    action_tags,
+    action_targets,
+
+    -- * ActionParameter
+    ActionParameter (..),
+    newActionParameter,
+    actionParameter_description,
+    actionParameter_required,
+
+    -- * ActionSummary
+    ActionSummary (..),
+    newActionSummary,
+    actionSummary_description,
+    actionSummary_id,
+    actionSummary_tags,
+    actionSummary_targets,
+
+    -- * ActionTarget
+    ActionTarget (..),
+    newActionTarget,
+    actionTarget_resourceType,
+
+    -- * CreateExperimentTemplateActionInput
+    CreateExperimentTemplateActionInput (..),
+    newCreateExperimentTemplateActionInput,
+    createExperimentTemplateActionInput_description,
+    createExperimentTemplateActionInput_parameters,
+    createExperimentTemplateActionInput_startAfter,
+    createExperimentTemplateActionInput_targets,
+    createExperimentTemplateActionInput_actionId,
+
+    -- * CreateExperimentTemplateLogConfigurationInput
+    CreateExperimentTemplateLogConfigurationInput (..),
+    newCreateExperimentTemplateLogConfigurationInput,
+    createExperimentTemplateLogConfigurationInput_cloudWatchLogsConfiguration,
+    createExperimentTemplateLogConfigurationInput_s3Configuration,
+    createExperimentTemplateLogConfigurationInput_logSchemaVersion,
+
+    -- * CreateExperimentTemplateStopConditionInput
+    CreateExperimentTemplateStopConditionInput (..),
+    newCreateExperimentTemplateStopConditionInput,
+    createExperimentTemplateStopConditionInput_value,
+    createExperimentTemplateStopConditionInput_source,
+
+    -- * CreateExperimentTemplateTargetInput
+    CreateExperimentTemplateTargetInput (..),
+    newCreateExperimentTemplateTargetInput,
+    createExperimentTemplateTargetInput_filters,
+    createExperimentTemplateTargetInput_parameters,
+    createExperimentTemplateTargetInput_resourceArns,
+    createExperimentTemplateTargetInput_resourceTags,
+    createExperimentTemplateTargetInput_resourceType,
+    createExperimentTemplateTargetInput_selectionMode,
+
+    -- * Experiment
+    Experiment (..),
+    newExperiment,
+    experiment_actions,
+    experiment_creationTime,
+    experiment_endTime,
+    experiment_experimentTemplateId,
+    experiment_id,
+    experiment_logConfiguration,
+    experiment_roleArn,
+    experiment_startTime,
+    experiment_state,
+    experiment_stopConditions,
+    experiment_tags,
+    experiment_targets,
+
+    -- * ExperimentAction
+    ExperimentAction (..),
+    newExperimentAction,
+    experimentAction_actionId,
+    experimentAction_description,
+    experimentAction_endTime,
+    experimentAction_parameters,
+    experimentAction_startAfter,
+    experimentAction_startTime,
+    experimentAction_state,
+    experimentAction_targets,
+
+    -- * ExperimentActionState
+    ExperimentActionState (..),
+    newExperimentActionState,
+    experimentActionState_reason,
+    experimentActionState_status,
+
+    -- * ExperimentCloudWatchLogsLogConfiguration
+    ExperimentCloudWatchLogsLogConfiguration (..),
+    newExperimentCloudWatchLogsLogConfiguration,
+    experimentCloudWatchLogsLogConfiguration_logGroupArn,
+
+    -- * ExperimentLogConfiguration
+    ExperimentLogConfiguration (..),
+    newExperimentLogConfiguration,
+    experimentLogConfiguration_cloudWatchLogsConfiguration,
+    experimentLogConfiguration_logSchemaVersion,
+    experimentLogConfiguration_s3Configuration,
+
+    -- * ExperimentS3LogConfiguration
+    ExperimentS3LogConfiguration (..),
+    newExperimentS3LogConfiguration,
+    experimentS3LogConfiguration_bucketName,
+    experimentS3LogConfiguration_prefix,
+
+    -- * ExperimentState
+    ExperimentState (..),
+    newExperimentState,
+    experimentState_reason,
+    experimentState_status,
+
+    -- * ExperimentStopCondition
+    ExperimentStopCondition (..),
+    newExperimentStopCondition,
+    experimentStopCondition_source,
+    experimentStopCondition_value,
+
+    -- * ExperimentSummary
+    ExperimentSummary (..),
+    newExperimentSummary,
+    experimentSummary_creationTime,
+    experimentSummary_experimentTemplateId,
+    experimentSummary_id,
+    experimentSummary_state,
+    experimentSummary_tags,
+
+    -- * ExperimentTarget
+    ExperimentTarget (..),
+    newExperimentTarget,
+    experimentTarget_filters,
+    experimentTarget_parameters,
+    experimentTarget_resourceArns,
+    experimentTarget_resourceTags,
+    experimentTarget_resourceType,
+    experimentTarget_selectionMode,
+
+    -- * ExperimentTargetFilter
+    ExperimentTargetFilter (..),
+    newExperimentTargetFilter,
+    experimentTargetFilter_path,
+    experimentTargetFilter_values,
+
+    -- * ExperimentTemplate
+    ExperimentTemplate (..),
+    newExperimentTemplate,
+    experimentTemplate_actions,
+    experimentTemplate_creationTime,
+    experimentTemplate_description,
+    experimentTemplate_id,
+    experimentTemplate_lastUpdateTime,
+    experimentTemplate_logConfiguration,
+    experimentTemplate_roleArn,
+    experimentTemplate_stopConditions,
+    experimentTemplate_tags,
+    experimentTemplate_targets,
+
+    -- * ExperimentTemplateAction
+    ExperimentTemplateAction (..),
+    newExperimentTemplateAction,
+    experimentTemplateAction_actionId,
+    experimentTemplateAction_description,
+    experimentTemplateAction_parameters,
+    experimentTemplateAction_startAfter,
+    experimentTemplateAction_targets,
+
+    -- * ExperimentTemplateCloudWatchLogsLogConfiguration
+    ExperimentTemplateCloudWatchLogsLogConfiguration (..),
+    newExperimentTemplateCloudWatchLogsLogConfiguration,
+    experimentTemplateCloudWatchLogsLogConfiguration_logGroupArn,
+
+    -- * ExperimentTemplateCloudWatchLogsLogConfigurationInput
+    ExperimentTemplateCloudWatchLogsLogConfigurationInput (..),
+    newExperimentTemplateCloudWatchLogsLogConfigurationInput,
+    experimentTemplateCloudWatchLogsLogConfigurationInput_logGroupArn,
+
+    -- * ExperimentTemplateLogConfiguration
+    ExperimentTemplateLogConfiguration (..),
+    newExperimentTemplateLogConfiguration,
+    experimentTemplateLogConfiguration_cloudWatchLogsConfiguration,
+    experimentTemplateLogConfiguration_logSchemaVersion,
+    experimentTemplateLogConfiguration_s3Configuration,
+
+    -- * ExperimentTemplateS3LogConfiguration
+    ExperimentTemplateS3LogConfiguration (..),
+    newExperimentTemplateS3LogConfiguration,
+    experimentTemplateS3LogConfiguration_bucketName,
+    experimentTemplateS3LogConfiguration_prefix,
+
+    -- * ExperimentTemplateS3LogConfigurationInput
+    ExperimentTemplateS3LogConfigurationInput (..),
+    newExperimentTemplateS3LogConfigurationInput,
+    experimentTemplateS3LogConfigurationInput_prefix,
+    experimentTemplateS3LogConfigurationInput_bucketName,
+
+    -- * ExperimentTemplateStopCondition
+    ExperimentTemplateStopCondition (..),
+    newExperimentTemplateStopCondition,
+    experimentTemplateStopCondition_source,
+    experimentTemplateStopCondition_value,
+
+    -- * ExperimentTemplateSummary
+    ExperimentTemplateSummary (..),
+    newExperimentTemplateSummary,
+    experimentTemplateSummary_creationTime,
+    experimentTemplateSummary_description,
+    experimentTemplateSummary_id,
+    experimentTemplateSummary_lastUpdateTime,
+    experimentTemplateSummary_tags,
+
+    -- * ExperimentTemplateTarget
+    ExperimentTemplateTarget (..),
+    newExperimentTemplateTarget,
+    experimentTemplateTarget_filters,
+    experimentTemplateTarget_parameters,
+    experimentTemplateTarget_resourceArns,
+    experimentTemplateTarget_resourceTags,
+    experimentTemplateTarget_resourceType,
+    experimentTemplateTarget_selectionMode,
+
+    -- * ExperimentTemplateTargetFilter
+    ExperimentTemplateTargetFilter (..),
+    newExperimentTemplateTargetFilter,
+    experimentTemplateTargetFilter_path,
+    experimentTemplateTargetFilter_values,
+
+    -- * ExperimentTemplateTargetInputFilter
+    ExperimentTemplateTargetInputFilter (..),
+    newExperimentTemplateTargetInputFilter,
+    experimentTemplateTargetInputFilter_path,
+    experimentTemplateTargetInputFilter_values,
+
+    -- * TargetResourceType
+    TargetResourceType (..),
+    newTargetResourceType,
+    targetResourceType_description,
+    targetResourceType_parameters,
+    targetResourceType_resourceType,
+
+    -- * TargetResourceTypeParameter
+    TargetResourceTypeParameter (..),
+    newTargetResourceTypeParameter,
+    targetResourceTypeParameter_description,
+    targetResourceTypeParameter_required,
+
+    -- * TargetResourceTypeSummary
+    TargetResourceTypeSummary (..),
+    newTargetResourceTypeSummary,
+    targetResourceTypeSummary_description,
+    targetResourceTypeSummary_resourceType,
+
+    -- * UpdateExperimentTemplateActionInputItem
+    UpdateExperimentTemplateActionInputItem (..),
+    newUpdateExperimentTemplateActionInputItem,
+    updateExperimentTemplateActionInputItem_actionId,
+    updateExperimentTemplateActionInputItem_description,
+    updateExperimentTemplateActionInputItem_parameters,
+    updateExperimentTemplateActionInputItem_startAfter,
+    updateExperimentTemplateActionInputItem_targets,
+
+    -- * UpdateExperimentTemplateLogConfigurationInput
+    UpdateExperimentTemplateLogConfigurationInput (..),
+    newUpdateExperimentTemplateLogConfigurationInput,
+    updateExperimentTemplateLogConfigurationInput_cloudWatchLogsConfiguration,
+    updateExperimentTemplateLogConfigurationInput_logSchemaVersion,
+    updateExperimentTemplateLogConfigurationInput_s3Configuration,
+
+    -- * UpdateExperimentTemplateStopConditionInput
+    UpdateExperimentTemplateStopConditionInput (..),
+    newUpdateExperimentTemplateStopConditionInput,
+    updateExperimentTemplateStopConditionInput_value,
+    updateExperimentTemplateStopConditionInput_source,
+
+    -- * UpdateExperimentTemplateTargetInput
+    UpdateExperimentTemplateTargetInput (..),
+    newUpdateExperimentTemplateTargetInput,
+    updateExperimentTemplateTargetInput_filters,
+    updateExperimentTemplateTargetInput_parameters,
+    updateExperimentTemplateTargetInput_resourceArns,
+    updateExperimentTemplateTargetInput_resourceTags,
+    updateExperimentTemplateTargetInput_resourceType,
+    updateExperimentTemplateTargetInput_selectionMode,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.FIS.Types.Action
+import Amazonka.FIS.Types.ActionParameter
+import Amazonka.FIS.Types.ActionSummary
+import Amazonka.FIS.Types.ActionTarget
+import Amazonka.FIS.Types.CreateExperimentTemplateActionInput
+import Amazonka.FIS.Types.CreateExperimentTemplateLogConfigurationInput
+import Amazonka.FIS.Types.CreateExperimentTemplateStopConditionInput
+import Amazonka.FIS.Types.CreateExperimentTemplateTargetInput
+import Amazonka.FIS.Types.Experiment
+import Amazonka.FIS.Types.ExperimentAction
+import Amazonka.FIS.Types.ExperimentActionState
+import Amazonka.FIS.Types.ExperimentActionStatus
+import Amazonka.FIS.Types.ExperimentCloudWatchLogsLogConfiguration
+import Amazonka.FIS.Types.ExperimentLogConfiguration
+import Amazonka.FIS.Types.ExperimentS3LogConfiguration
+import Amazonka.FIS.Types.ExperimentState
+import Amazonka.FIS.Types.ExperimentStatus
+import Amazonka.FIS.Types.ExperimentStopCondition
+import Amazonka.FIS.Types.ExperimentSummary
+import Amazonka.FIS.Types.ExperimentTarget
+import Amazonka.FIS.Types.ExperimentTargetFilter
+import Amazonka.FIS.Types.ExperimentTemplate
+import Amazonka.FIS.Types.ExperimentTemplateAction
+import Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfiguration
+import Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfigurationInput
+import Amazonka.FIS.Types.ExperimentTemplateLogConfiguration
+import Amazonka.FIS.Types.ExperimentTemplateS3LogConfiguration
+import Amazonka.FIS.Types.ExperimentTemplateS3LogConfigurationInput
+import Amazonka.FIS.Types.ExperimentTemplateStopCondition
+import Amazonka.FIS.Types.ExperimentTemplateSummary
+import Amazonka.FIS.Types.ExperimentTemplateTarget
+import Amazonka.FIS.Types.ExperimentTemplateTargetFilter
+import Amazonka.FIS.Types.ExperimentTemplateTargetInputFilter
+import Amazonka.FIS.Types.TargetResourceType
+import Amazonka.FIS.Types.TargetResourceTypeParameter
+import Amazonka.FIS.Types.TargetResourceTypeSummary
+import Amazonka.FIS.Types.UpdateExperimentTemplateActionInputItem
+import Amazonka.FIS.Types.UpdateExperimentTemplateLogConfigurationInput
+import Amazonka.FIS.Types.UpdateExperimentTemplateStopConditionInput
+import Amazonka.FIS.Types.UpdateExperimentTemplateTargetInput
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2020-12-01@ of the Amazon Fault Injection Simulator SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "FIS",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "fis",
+      Core.signingName = "fis",
+      Core.version = "2020-12-01",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "FIS",
+      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
+
+-- | The request could not be processed because of a conflict.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | The specified resource cannot be found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | You have exceeded your service quota.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+-- | The specified input is not valid, or fails to satisfy the constraints
+-- for the request.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/FIS/Types/Action.hs b/gen/Amazonka/FIS/Types/Action.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/Action.hs
@@ -0,0 +1,124 @@
+{-# 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.FIS.Types.Action
+-- 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.FIS.Types.Action where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ActionParameter
+import Amazonka.FIS.Types.ActionTarget
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an action. For more information, see
+-- <https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html FIS actions>
+-- in the /Fault Injection Simulator User Guide/.
+--
+-- /See:/ 'newAction' smart constructor.
+data Action = Action'
+  { -- | The description for the action.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the action.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The action parameters, if applicable.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text ActionParameter),
+    -- | The tags for the action.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The supported targets for the action.
+    targets :: Prelude.Maybe (Prelude.HashMap Prelude.Text ActionTarget)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Action' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'action_description' - The description for the action.
+--
+-- 'id', 'action_id' - The ID of the action.
+--
+-- 'parameters', 'action_parameters' - The action parameters, if applicable.
+--
+-- 'tags', 'action_tags' - The tags for the action.
+--
+-- 'targets', 'action_targets' - The supported targets for the action.
+newAction ::
+  Action
+newAction =
+  Action'
+    { description = Prelude.Nothing,
+      id = Prelude.Nothing,
+      parameters = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      targets = Prelude.Nothing
+    }
+
+-- | The description for the action.
+action_description :: Lens.Lens' Action (Prelude.Maybe Prelude.Text)
+action_description = Lens.lens (\Action' {description} -> description) (\s@Action' {} a -> s {description = a} :: Action)
+
+-- | The ID of the action.
+action_id :: Lens.Lens' Action (Prelude.Maybe Prelude.Text)
+action_id = Lens.lens (\Action' {id} -> id) (\s@Action' {} a -> s {id = a} :: Action)
+
+-- | The action parameters, if applicable.
+action_parameters :: Lens.Lens' Action (Prelude.Maybe (Prelude.HashMap Prelude.Text ActionParameter))
+action_parameters = Lens.lens (\Action' {parameters} -> parameters) (\s@Action' {} a -> s {parameters = a} :: Action) Prelude.. Lens.mapping Lens.coerced
+
+-- | The tags for the action.
+action_tags :: Lens.Lens' Action (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+action_tags = Lens.lens (\Action' {tags} -> tags) (\s@Action' {} a -> s {tags = a} :: Action) Prelude.. Lens.mapping Lens.coerced
+
+-- | The supported targets for the action.
+action_targets :: Lens.Lens' Action (Prelude.Maybe (Prelude.HashMap Prelude.Text ActionTarget))
+action_targets = Lens.lens (\Action' {targets} -> targets) (\s@Action' {} a -> s {targets = a} :: Action) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON Action where
+  parseJSON =
+    Data.withObject
+      "Action"
+      ( \x ->
+          Action'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "parameters" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "targets" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Action where
+  hashWithSalt _salt Action' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` parameters
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` targets
+
+instance Prelude.NFData Action where
+  rnf Action' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf targets
diff --git a/gen/Amazonka/FIS/Types/ActionParameter.hs b/gen/Amazonka/FIS/Types/ActionParameter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ActionParameter.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ActionParameter
+-- 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.FIS.Types.ActionParameter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a parameter for an action.
+--
+-- /See:/ 'newActionParameter' smart constructor.
+data ActionParameter = ActionParameter'
+  { -- | The parameter description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | Indicates whether the parameter is required.
+    required :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ActionParameter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'actionParameter_description' - The parameter description.
+--
+-- 'required', 'actionParameter_required' - Indicates whether the parameter is required.
+newActionParameter ::
+  ActionParameter
+newActionParameter =
+  ActionParameter'
+    { description = Prelude.Nothing,
+      required = Prelude.Nothing
+    }
+
+-- | The parameter description.
+actionParameter_description :: Lens.Lens' ActionParameter (Prelude.Maybe Prelude.Text)
+actionParameter_description = Lens.lens (\ActionParameter' {description} -> description) (\s@ActionParameter' {} a -> s {description = a} :: ActionParameter)
+
+-- | Indicates whether the parameter is required.
+actionParameter_required :: Lens.Lens' ActionParameter (Prelude.Maybe Prelude.Bool)
+actionParameter_required = Lens.lens (\ActionParameter' {required} -> required) (\s@ActionParameter' {} a -> s {required = a} :: ActionParameter)
+
+instance Data.FromJSON ActionParameter where
+  parseJSON =
+    Data.withObject
+      "ActionParameter"
+      ( \x ->
+          ActionParameter'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "required")
+      )
+
+instance Prelude.Hashable ActionParameter where
+  hashWithSalt _salt ActionParameter' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` required
+
+instance Prelude.NFData ActionParameter where
+  rnf ActionParameter' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf required
diff --git a/gen/Amazonka/FIS/Types/ActionSummary.hs b/gen/Amazonka/FIS/Types/ActionSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ActionSummary.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ActionSummary
+-- 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.FIS.Types.ActionSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ActionTarget
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of an action.
+--
+-- /See:/ 'newActionSummary' smart constructor.
+data ActionSummary = ActionSummary'
+  { -- | The description for the action.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the action.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The tags for the action.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The targets for the action.
+    targets :: Prelude.Maybe (Prelude.HashMap Prelude.Text ActionTarget)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ActionSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'actionSummary_description' - The description for the action.
+--
+-- 'id', 'actionSummary_id' - The ID of the action.
+--
+-- 'tags', 'actionSummary_tags' - The tags for the action.
+--
+-- 'targets', 'actionSummary_targets' - The targets for the action.
+newActionSummary ::
+  ActionSummary
+newActionSummary =
+  ActionSummary'
+    { description = Prelude.Nothing,
+      id = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      targets = Prelude.Nothing
+    }
+
+-- | The description for the action.
+actionSummary_description :: Lens.Lens' ActionSummary (Prelude.Maybe Prelude.Text)
+actionSummary_description = Lens.lens (\ActionSummary' {description} -> description) (\s@ActionSummary' {} a -> s {description = a} :: ActionSummary)
+
+-- | The ID of the action.
+actionSummary_id :: Lens.Lens' ActionSummary (Prelude.Maybe Prelude.Text)
+actionSummary_id = Lens.lens (\ActionSummary' {id} -> id) (\s@ActionSummary' {} a -> s {id = a} :: ActionSummary)
+
+-- | The tags for the action.
+actionSummary_tags :: Lens.Lens' ActionSummary (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+actionSummary_tags = Lens.lens (\ActionSummary' {tags} -> tags) (\s@ActionSummary' {} a -> s {tags = a} :: ActionSummary) Prelude.. Lens.mapping Lens.coerced
+
+-- | The targets for the action.
+actionSummary_targets :: Lens.Lens' ActionSummary (Prelude.Maybe (Prelude.HashMap Prelude.Text ActionTarget))
+actionSummary_targets = Lens.lens (\ActionSummary' {targets} -> targets) (\s@ActionSummary' {} a -> s {targets = a} :: ActionSummary) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ActionSummary where
+  parseJSON =
+    Data.withObject
+      "ActionSummary"
+      ( \x ->
+          ActionSummary'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "targets" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ActionSummary where
+  hashWithSalt _salt ActionSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` targets
+
+instance Prelude.NFData ActionSummary where
+  rnf ActionSummary' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf targets
diff --git a/gen/Amazonka/FIS/Types/ActionTarget.hs b/gen/Amazonka/FIS/Types/ActionTarget.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ActionTarget.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ActionTarget
+-- 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.FIS.Types.ActionTarget where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a target for an action.
+--
+-- /See:/ 'newActionTarget' smart constructor.
+data ActionTarget = ActionTarget'
+  { -- | The resource type of the target.
+    resourceType :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ActionTarget' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceType', 'actionTarget_resourceType' - The resource type of the target.
+newActionTarget ::
+  ActionTarget
+newActionTarget =
+  ActionTarget' {resourceType = Prelude.Nothing}
+
+-- | The resource type of the target.
+actionTarget_resourceType :: Lens.Lens' ActionTarget (Prelude.Maybe Prelude.Text)
+actionTarget_resourceType = Lens.lens (\ActionTarget' {resourceType} -> resourceType) (\s@ActionTarget' {} a -> s {resourceType = a} :: ActionTarget)
+
+instance Data.FromJSON ActionTarget where
+  parseJSON =
+    Data.withObject
+      "ActionTarget"
+      ( \x ->
+          ActionTarget'
+            Prelude.<$> (x Data..:? "resourceType")
+      )
+
+instance Prelude.Hashable ActionTarget where
+  hashWithSalt _salt ActionTarget' {..} =
+    _salt `Prelude.hashWithSalt` resourceType
+
+instance Prelude.NFData ActionTarget where
+  rnf ActionTarget' {..} = Prelude.rnf resourceType
diff --git a/gen/Amazonka/FIS/Types/CreateExperimentTemplateActionInput.hs b/gen/Amazonka/FIS/Types/CreateExperimentTemplateActionInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/CreateExperimentTemplateActionInput.hs
@@ -0,0 +1,146 @@
+{-# 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.FIS.Types.CreateExperimentTemplateActionInput
+-- 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.FIS.Types.CreateExperimentTemplateActionInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies an action for an experiment template.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/fis/latest/userguide/actions.html Actions>
+-- in the /Fault Injection Simulator User Guide/.
+--
+-- /See:/ 'newCreateExperimentTemplateActionInput' smart constructor.
+data CreateExperimentTemplateActionInput = CreateExperimentTemplateActionInput'
+  { -- | A description for the action.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The parameters for the action, if applicable.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of the action that must be completed before the current action
+    -- starts. Omit this parameter to run the action at the start of the
+    -- experiment.
+    startAfter :: Prelude.Maybe [Prelude.Text],
+    -- | The targets for the action.
+    targets :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The ID of the action. The format of the action ID is:
+    -- aws:/service-name/:/action-type/.
+    actionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateExperimentTemplateActionInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'createExperimentTemplateActionInput_description' - A description for the action.
+--
+-- 'parameters', 'createExperimentTemplateActionInput_parameters' - The parameters for the action, if applicable.
+--
+-- 'startAfter', 'createExperimentTemplateActionInput_startAfter' - The name of the action that must be completed before the current action
+-- starts. Omit this parameter to run the action at the start of the
+-- experiment.
+--
+-- 'targets', 'createExperimentTemplateActionInput_targets' - The targets for the action.
+--
+-- 'actionId', 'createExperimentTemplateActionInput_actionId' - The ID of the action. The format of the action ID is:
+-- aws:/service-name/:/action-type/.
+newCreateExperimentTemplateActionInput ::
+  -- | 'actionId'
+  Prelude.Text ->
+  CreateExperimentTemplateActionInput
+newCreateExperimentTemplateActionInput pActionId_ =
+  CreateExperimentTemplateActionInput'
+    { description =
+        Prelude.Nothing,
+      parameters = Prelude.Nothing,
+      startAfter = Prelude.Nothing,
+      targets = Prelude.Nothing,
+      actionId = pActionId_
+    }
+
+-- | A description for the action.
+createExperimentTemplateActionInput_description :: Lens.Lens' CreateExperimentTemplateActionInput (Prelude.Maybe Prelude.Text)
+createExperimentTemplateActionInput_description = Lens.lens (\CreateExperimentTemplateActionInput' {description} -> description) (\s@CreateExperimentTemplateActionInput' {} a -> s {description = a} :: CreateExperimentTemplateActionInput)
+
+-- | The parameters for the action, if applicable.
+createExperimentTemplateActionInput_parameters :: Lens.Lens' CreateExperimentTemplateActionInput (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createExperimentTemplateActionInput_parameters = Lens.lens (\CreateExperimentTemplateActionInput' {parameters} -> parameters) (\s@CreateExperimentTemplateActionInput' {} a -> s {parameters = a} :: CreateExperimentTemplateActionInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the action that must be completed before the current action
+-- starts. Omit this parameter to run the action at the start of the
+-- experiment.
+createExperimentTemplateActionInput_startAfter :: Lens.Lens' CreateExperimentTemplateActionInput (Prelude.Maybe [Prelude.Text])
+createExperimentTemplateActionInput_startAfter = Lens.lens (\CreateExperimentTemplateActionInput' {startAfter} -> startAfter) (\s@CreateExperimentTemplateActionInput' {} a -> s {startAfter = a} :: CreateExperimentTemplateActionInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The targets for the action.
+createExperimentTemplateActionInput_targets :: Lens.Lens' CreateExperimentTemplateActionInput (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createExperimentTemplateActionInput_targets = Lens.lens (\CreateExperimentTemplateActionInput' {targets} -> targets) (\s@CreateExperimentTemplateActionInput' {} a -> s {targets = a} :: CreateExperimentTemplateActionInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the action. The format of the action ID is:
+-- aws:/service-name/:/action-type/.
+createExperimentTemplateActionInput_actionId :: Lens.Lens' CreateExperimentTemplateActionInput Prelude.Text
+createExperimentTemplateActionInput_actionId = Lens.lens (\CreateExperimentTemplateActionInput' {actionId} -> actionId) (\s@CreateExperimentTemplateActionInput' {} a -> s {actionId = a} :: CreateExperimentTemplateActionInput)
+
+instance
+  Prelude.Hashable
+    CreateExperimentTemplateActionInput
+  where
+  hashWithSalt
+    _salt
+    CreateExperimentTemplateActionInput' {..} =
+      _salt
+        `Prelude.hashWithSalt` description
+        `Prelude.hashWithSalt` parameters
+        `Prelude.hashWithSalt` startAfter
+        `Prelude.hashWithSalt` targets
+        `Prelude.hashWithSalt` actionId
+
+instance
+  Prelude.NFData
+    CreateExperimentTemplateActionInput
+  where
+  rnf CreateExperimentTemplateActionInput' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf startAfter
+      `Prelude.seq` Prelude.rnf targets
+      `Prelude.seq` Prelude.rnf actionId
+
+instance
+  Data.ToJSON
+    CreateExperimentTemplateActionInput
+  where
+  toJSON CreateExperimentTemplateActionInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("description" Data..=) Prelude.<$> description,
+            ("parameters" Data..=) Prelude.<$> parameters,
+            ("startAfter" Data..=) Prelude.<$> startAfter,
+            ("targets" Data..=) Prelude.<$> targets,
+            Prelude.Just ("actionId" Data..= actionId)
+          ]
+      )
diff --git a/gen/Amazonka/FIS/Types/CreateExperimentTemplateLogConfigurationInput.hs b/gen/Amazonka/FIS/Types/CreateExperimentTemplateLogConfigurationInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/CreateExperimentTemplateLogConfigurationInput.hs
@@ -0,0 +1,119 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.CreateExperimentTemplateLogConfigurationInput
+-- 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.FIS.Types.CreateExperimentTemplateLogConfigurationInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfigurationInput
+import Amazonka.FIS.Types.ExperimentTemplateS3LogConfigurationInput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies the configuration for experiment logging.
+--
+-- /See:/ 'newCreateExperimentTemplateLogConfigurationInput' smart constructor.
+data CreateExperimentTemplateLogConfigurationInput = CreateExperimentTemplateLogConfigurationInput'
+  { -- | The configuration for experiment logging to Amazon CloudWatch Logs.
+    cloudWatchLogsConfiguration :: Prelude.Maybe ExperimentTemplateCloudWatchLogsLogConfigurationInput,
+    -- | The configuration for experiment logging to Amazon S3.
+    s3Configuration :: Prelude.Maybe ExperimentTemplateS3LogConfigurationInput,
+    -- | The schema version.
+    logSchemaVersion :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateExperimentTemplateLogConfigurationInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cloudWatchLogsConfiguration', 'createExperimentTemplateLogConfigurationInput_cloudWatchLogsConfiguration' - The configuration for experiment logging to Amazon CloudWatch Logs.
+--
+-- 's3Configuration', 'createExperimentTemplateLogConfigurationInput_s3Configuration' - The configuration for experiment logging to Amazon S3.
+--
+-- 'logSchemaVersion', 'createExperimentTemplateLogConfigurationInput_logSchemaVersion' - The schema version.
+newCreateExperimentTemplateLogConfigurationInput ::
+  -- | 'logSchemaVersion'
+  Prelude.Int ->
+  CreateExperimentTemplateLogConfigurationInput
+newCreateExperimentTemplateLogConfigurationInput
+  pLogSchemaVersion_ =
+    CreateExperimentTemplateLogConfigurationInput'
+      { cloudWatchLogsConfiguration =
+          Prelude.Nothing,
+        s3Configuration =
+          Prelude.Nothing,
+        logSchemaVersion =
+          pLogSchemaVersion_
+      }
+
+-- | The configuration for experiment logging to Amazon CloudWatch Logs.
+createExperimentTemplateLogConfigurationInput_cloudWatchLogsConfiguration :: Lens.Lens' CreateExperimentTemplateLogConfigurationInput (Prelude.Maybe ExperimentTemplateCloudWatchLogsLogConfigurationInput)
+createExperimentTemplateLogConfigurationInput_cloudWatchLogsConfiguration = Lens.lens (\CreateExperimentTemplateLogConfigurationInput' {cloudWatchLogsConfiguration} -> cloudWatchLogsConfiguration) (\s@CreateExperimentTemplateLogConfigurationInput' {} a -> s {cloudWatchLogsConfiguration = a} :: CreateExperimentTemplateLogConfigurationInput)
+
+-- | The configuration for experiment logging to Amazon S3.
+createExperimentTemplateLogConfigurationInput_s3Configuration :: Lens.Lens' CreateExperimentTemplateLogConfigurationInput (Prelude.Maybe ExperimentTemplateS3LogConfigurationInput)
+createExperimentTemplateLogConfigurationInput_s3Configuration = Lens.lens (\CreateExperimentTemplateLogConfigurationInput' {s3Configuration} -> s3Configuration) (\s@CreateExperimentTemplateLogConfigurationInput' {} a -> s {s3Configuration = a} :: CreateExperimentTemplateLogConfigurationInput)
+
+-- | The schema version.
+createExperimentTemplateLogConfigurationInput_logSchemaVersion :: Lens.Lens' CreateExperimentTemplateLogConfigurationInput Prelude.Int
+createExperimentTemplateLogConfigurationInput_logSchemaVersion = Lens.lens (\CreateExperimentTemplateLogConfigurationInput' {logSchemaVersion} -> logSchemaVersion) (\s@CreateExperimentTemplateLogConfigurationInput' {} a -> s {logSchemaVersion = a} :: CreateExperimentTemplateLogConfigurationInput)
+
+instance
+  Prelude.Hashable
+    CreateExperimentTemplateLogConfigurationInput
+  where
+  hashWithSalt
+    _salt
+    CreateExperimentTemplateLogConfigurationInput' {..} =
+      _salt
+        `Prelude.hashWithSalt` cloudWatchLogsConfiguration
+        `Prelude.hashWithSalt` s3Configuration
+        `Prelude.hashWithSalt` logSchemaVersion
+
+instance
+  Prelude.NFData
+    CreateExperimentTemplateLogConfigurationInput
+  where
+  rnf
+    CreateExperimentTemplateLogConfigurationInput' {..} =
+      Prelude.rnf cloudWatchLogsConfiguration
+        `Prelude.seq` Prelude.rnf s3Configuration
+        `Prelude.seq` Prelude.rnf logSchemaVersion
+
+instance
+  Data.ToJSON
+    CreateExperimentTemplateLogConfigurationInput
+  where
+  toJSON
+    CreateExperimentTemplateLogConfigurationInput' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [ ("cloudWatchLogsConfiguration" Data..=)
+                Prelude.<$> cloudWatchLogsConfiguration,
+              ("s3Configuration" Data..=)
+                Prelude.<$> s3Configuration,
+              Prelude.Just
+                ("logSchemaVersion" Data..= logSchemaVersion)
+            ]
+        )
diff --git a/gen/Amazonka/FIS/Types/CreateExperimentTemplateStopConditionInput.hs b/gen/Amazonka/FIS/Types/CreateExperimentTemplateStopConditionInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/CreateExperimentTemplateStopConditionInput.hs
@@ -0,0 +1,107 @@
+{-# 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.FIS.Types.CreateExperimentTemplateStopConditionInput
+-- 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.FIS.Types.CreateExperimentTemplateStopConditionInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies a stop condition for an experiment template.
+--
+-- /See:/ 'newCreateExperimentTemplateStopConditionInput' smart constructor.
+data CreateExperimentTemplateStopConditionInput = CreateExperimentTemplateStopConditionInput'
+  { -- | The Amazon Resource Name (ARN) of the CloudWatch alarm. This is required
+    -- if the source is a CloudWatch alarm.
+    value :: Prelude.Maybe Prelude.Text,
+    -- | The source for the stop condition. Specify @aws:cloudwatch:alarm@ if the
+    -- stop condition is defined by a CloudWatch alarm. Specify @none@ if there
+    -- is no stop condition.
+    source :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateExperimentTemplateStopConditionInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'value', 'createExperimentTemplateStopConditionInput_value' - The Amazon Resource Name (ARN) of the CloudWatch alarm. This is required
+-- if the source is a CloudWatch alarm.
+--
+-- 'source', 'createExperimentTemplateStopConditionInput_source' - The source for the stop condition. Specify @aws:cloudwatch:alarm@ if the
+-- stop condition is defined by a CloudWatch alarm. Specify @none@ if there
+-- is no stop condition.
+newCreateExperimentTemplateStopConditionInput ::
+  -- | 'source'
+  Prelude.Text ->
+  CreateExperimentTemplateStopConditionInput
+newCreateExperimentTemplateStopConditionInput
+  pSource_ =
+    CreateExperimentTemplateStopConditionInput'
+      { value =
+          Prelude.Nothing,
+        source = pSource_
+      }
+
+-- | The Amazon Resource Name (ARN) of the CloudWatch alarm. This is required
+-- if the source is a CloudWatch alarm.
+createExperimentTemplateStopConditionInput_value :: Lens.Lens' CreateExperimentTemplateStopConditionInput (Prelude.Maybe Prelude.Text)
+createExperimentTemplateStopConditionInput_value = Lens.lens (\CreateExperimentTemplateStopConditionInput' {value} -> value) (\s@CreateExperimentTemplateStopConditionInput' {} a -> s {value = a} :: CreateExperimentTemplateStopConditionInput)
+
+-- | The source for the stop condition. Specify @aws:cloudwatch:alarm@ if the
+-- stop condition is defined by a CloudWatch alarm. Specify @none@ if there
+-- is no stop condition.
+createExperimentTemplateStopConditionInput_source :: Lens.Lens' CreateExperimentTemplateStopConditionInput Prelude.Text
+createExperimentTemplateStopConditionInput_source = Lens.lens (\CreateExperimentTemplateStopConditionInput' {source} -> source) (\s@CreateExperimentTemplateStopConditionInput' {} a -> s {source = a} :: CreateExperimentTemplateStopConditionInput)
+
+instance
+  Prelude.Hashable
+    CreateExperimentTemplateStopConditionInput
+  where
+  hashWithSalt
+    _salt
+    CreateExperimentTemplateStopConditionInput' {..} =
+      _salt
+        `Prelude.hashWithSalt` value
+        `Prelude.hashWithSalt` source
+
+instance
+  Prelude.NFData
+    CreateExperimentTemplateStopConditionInput
+  where
+  rnf CreateExperimentTemplateStopConditionInput' {..} =
+    Prelude.rnf value `Prelude.seq` Prelude.rnf source
+
+instance
+  Data.ToJSON
+    CreateExperimentTemplateStopConditionInput
+  where
+  toJSON
+    CreateExperimentTemplateStopConditionInput' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [ ("value" Data..=) Prelude.<$> value,
+              Prelude.Just ("source" Data..= source)
+            ]
+        )
diff --git a/gen/Amazonka/FIS/Types/CreateExperimentTemplateTargetInput.hs b/gen/Amazonka/FIS/Types/CreateExperimentTemplateTargetInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/CreateExperimentTemplateTargetInput.hs
@@ -0,0 +1,199 @@
+{-# 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.FIS.Types.CreateExperimentTemplateTargetInput
+-- 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.FIS.Types.CreateExperimentTemplateTargetInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentTemplateTargetInputFilter
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies a target for an experiment. You must specify at least one
+-- Amazon Resource Name (ARN) or at least one resource tag. You cannot
+-- specify both ARNs and tags.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/fis/latest/userguide/targets.html Targets>
+-- in the /Fault Injection Simulator User Guide/.
+--
+-- /See:/ 'newCreateExperimentTemplateTargetInput' smart constructor.
+data CreateExperimentTemplateTargetInput = CreateExperimentTemplateTargetInput'
+  { -- | The filters to apply to identify target resources using specific
+    -- attributes.
+    filters :: Prelude.Maybe [ExperimentTemplateTargetInputFilter],
+    -- | The resource type parameters.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The Amazon Resource Names (ARNs) of the resources.
+    resourceArns :: Prelude.Maybe [Prelude.Text],
+    -- | The tags for the target resources.
+    resourceTags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The resource type. The resource type must be supported for the specified
+    -- action.
+    resourceType :: Prelude.Text,
+    -- | Scopes the identified resources to a specific count of the resources at
+    -- random, or a percentage of the resources. All identified resources are
+    -- included in the target.
+    --
+    -- -   ALL - Run the action on all identified targets. This is the default.
+    --
+    -- -   COUNT(n) - Run the action on the specified number of targets, chosen
+    --     from the identified targets at random. For example, COUNT(1) selects
+    --     one of the targets.
+    --
+    -- -   PERCENT(n) - Run the action on the specified percentage of targets,
+    --     chosen from the identified targets at random. For example,
+    --     PERCENT(25) selects 25% of the targets.
+    selectionMode :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateExperimentTemplateTargetInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'createExperimentTemplateTargetInput_filters' - The filters to apply to identify target resources using specific
+-- attributes.
+--
+-- 'parameters', 'createExperimentTemplateTargetInput_parameters' - The resource type parameters.
+--
+-- 'resourceArns', 'createExperimentTemplateTargetInput_resourceArns' - The Amazon Resource Names (ARNs) of the resources.
+--
+-- 'resourceTags', 'createExperimentTemplateTargetInput_resourceTags' - The tags for the target resources.
+--
+-- 'resourceType', 'createExperimentTemplateTargetInput_resourceType' - The resource type. The resource type must be supported for the specified
+-- action.
+--
+-- 'selectionMode', 'createExperimentTemplateTargetInput_selectionMode' - Scopes the identified resources to a specific count of the resources at
+-- random, or a percentage of the resources. All identified resources are
+-- included in the target.
+--
+-- -   ALL - Run the action on all identified targets. This is the default.
+--
+-- -   COUNT(n) - Run the action on the specified number of targets, chosen
+--     from the identified targets at random. For example, COUNT(1) selects
+--     one of the targets.
+--
+-- -   PERCENT(n) - Run the action on the specified percentage of targets,
+--     chosen from the identified targets at random. For example,
+--     PERCENT(25) selects 25% of the targets.
+newCreateExperimentTemplateTargetInput ::
+  -- | 'resourceType'
+  Prelude.Text ->
+  -- | 'selectionMode'
+  Prelude.Text ->
+  CreateExperimentTemplateTargetInput
+newCreateExperimentTemplateTargetInput
+  pResourceType_
+  pSelectionMode_ =
+    CreateExperimentTemplateTargetInput'
+      { filters =
+          Prelude.Nothing,
+        parameters = Prelude.Nothing,
+        resourceArns = Prelude.Nothing,
+        resourceTags = Prelude.Nothing,
+        resourceType = pResourceType_,
+        selectionMode = pSelectionMode_
+      }
+
+-- | The filters to apply to identify target resources using specific
+-- attributes.
+createExperimentTemplateTargetInput_filters :: Lens.Lens' CreateExperimentTemplateTargetInput (Prelude.Maybe [ExperimentTemplateTargetInputFilter])
+createExperimentTemplateTargetInput_filters = Lens.lens (\CreateExperimentTemplateTargetInput' {filters} -> filters) (\s@CreateExperimentTemplateTargetInput' {} a -> s {filters = a} :: CreateExperimentTemplateTargetInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The resource type parameters.
+createExperimentTemplateTargetInput_parameters :: Lens.Lens' CreateExperimentTemplateTargetInput (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createExperimentTemplateTargetInput_parameters = Lens.lens (\CreateExperimentTemplateTargetInput' {parameters} -> parameters) (\s@CreateExperimentTemplateTargetInput' {} a -> s {parameters = a} :: CreateExperimentTemplateTargetInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Names (ARNs) of the resources.
+createExperimentTemplateTargetInput_resourceArns :: Lens.Lens' CreateExperimentTemplateTargetInput (Prelude.Maybe [Prelude.Text])
+createExperimentTemplateTargetInput_resourceArns = Lens.lens (\CreateExperimentTemplateTargetInput' {resourceArns} -> resourceArns) (\s@CreateExperimentTemplateTargetInput' {} a -> s {resourceArns = a} :: CreateExperimentTemplateTargetInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The tags for the target resources.
+createExperimentTemplateTargetInput_resourceTags :: Lens.Lens' CreateExperimentTemplateTargetInput (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createExperimentTemplateTargetInput_resourceTags = Lens.lens (\CreateExperimentTemplateTargetInput' {resourceTags} -> resourceTags) (\s@CreateExperimentTemplateTargetInput' {} a -> s {resourceTags = a} :: CreateExperimentTemplateTargetInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The resource type. The resource type must be supported for the specified
+-- action.
+createExperimentTemplateTargetInput_resourceType :: Lens.Lens' CreateExperimentTemplateTargetInput Prelude.Text
+createExperimentTemplateTargetInput_resourceType = Lens.lens (\CreateExperimentTemplateTargetInput' {resourceType} -> resourceType) (\s@CreateExperimentTemplateTargetInput' {} a -> s {resourceType = a} :: CreateExperimentTemplateTargetInput)
+
+-- | Scopes the identified resources to a specific count of the resources at
+-- random, or a percentage of the resources. All identified resources are
+-- included in the target.
+--
+-- -   ALL - Run the action on all identified targets. This is the default.
+--
+-- -   COUNT(n) - Run the action on the specified number of targets, chosen
+--     from the identified targets at random. For example, COUNT(1) selects
+--     one of the targets.
+--
+-- -   PERCENT(n) - Run the action on the specified percentage of targets,
+--     chosen from the identified targets at random. For example,
+--     PERCENT(25) selects 25% of the targets.
+createExperimentTemplateTargetInput_selectionMode :: Lens.Lens' CreateExperimentTemplateTargetInput Prelude.Text
+createExperimentTemplateTargetInput_selectionMode = Lens.lens (\CreateExperimentTemplateTargetInput' {selectionMode} -> selectionMode) (\s@CreateExperimentTemplateTargetInput' {} a -> s {selectionMode = a} :: CreateExperimentTemplateTargetInput)
+
+instance
+  Prelude.Hashable
+    CreateExperimentTemplateTargetInput
+  where
+  hashWithSalt
+    _salt
+    CreateExperimentTemplateTargetInput' {..} =
+      _salt
+        `Prelude.hashWithSalt` filters
+        `Prelude.hashWithSalt` parameters
+        `Prelude.hashWithSalt` resourceArns
+        `Prelude.hashWithSalt` resourceTags
+        `Prelude.hashWithSalt` resourceType
+        `Prelude.hashWithSalt` selectionMode
+
+instance
+  Prelude.NFData
+    CreateExperimentTemplateTargetInput
+  where
+  rnf CreateExperimentTemplateTargetInput' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf resourceArns
+      `Prelude.seq` Prelude.rnf resourceTags
+      `Prelude.seq` Prelude.rnf resourceType
+      `Prelude.seq` Prelude.rnf selectionMode
+
+instance
+  Data.ToJSON
+    CreateExperimentTemplateTargetInput
+  where
+  toJSON CreateExperimentTemplateTargetInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filters" Data..=) Prelude.<$> filters,
+            ("parameters" Data..=) Prelude.<$> parameters,
+            ("resourceArns" Data..=) Prelude.<$> resourceArns,
+            ("resourceTags" Data..=) Prelude.<$> resourceTags,
+            Prelude.Just ("resourceType" Data..= resourceType),
+            Prelude.Just
+              ("selectionMode" Data..= selectionMode)
+          ]
+      )
diff --git a/gen/Amazonka/FIS/Types/Experiment.hs b/gen/Amazonka/FIS/Types/Experiment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/Experiment.hs
@@ -0,0 +1,212 @@
+{-# 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.FIS.Types.Experiment
+-- 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.FIS.Types.Experiment where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentAction
+import Amazonka.FIS.Types.ExperimentLogConfiguration
+import Amazonka.FIS.Types.ExperimentState
+import Amazonka.FIS.Types.ExperimentStopCondition
+import Amazonka.FIS.Types.ExperimentTarget
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an experiment.
+--
+-- /See:/ 'newExperiment' smart constructor.
+data Experiment = Experiment'
+  { -- | The actions for the experiment.
+    actions :: Prelude.Maybe (Prelude.HashMap Prelude.Text ExperimentAction),
+    -- | The time that the experiment was created.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | The time that the experiment ended.
+    endTime :: Prelude.Maybe Data.POSIX,
+    -- | The ID of the experiment template.
+    experimentTemplateId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the experiment.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The configuration for experiment logging.
+    logConfiguration :: Prelude.Maybe ExperimentLogConfiguration,
+    -- | The Amazon Resource Name (ARN) of an IAM role that grants the FIS
+    -- service permission to perform service actions on your behalf.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The time that the experiment started.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | The state of the experiment.
+    state :: Prelude.Maybe ExperimentState,
+    -- | The stop conditions for the experiment.
+    stopConditions :: Prelude.Maybe [ExperimentStopCondition],
+    -- | The tags for the experiment.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The targets for the experiment.
+    targets :: Prelude.Maybe (Prelude.HashMap Prelude.Text ExperimentTarget)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Experiment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'actions', 'experiment_actions' - The actions for the experiment.
+--
+-- 'creationTime', 'experiment_creationTime' - The time that the experiment was created.
+--
+-- 'endTime', 'experiment_endTime' - The time that the experiment ended.
+--
+-- 'experimentTemplateId', 'experiment_experimentTemplateId' - The ID of the experiment template.
+--
+-- 'id', 'experiment_id' - The ID of the experiment.
+--
+-- 'logConfiguration', 'experiment_logConfiguration' - The configuration for experiment logging.
+--
+-- 'roleArn', 'experiment_roleArn' - The Amazon Resource Name (ARN) of an IAM role that grants the FIS
+-- service permission to perform service actions on your behalf.
+--
+-- 'startTime', 'experiment_startTime' - The time that the experiment started.
+--
+-- 'state', 'experiment_state' - The state of the experiment.
+--
+-- 'stopConditions', 'experiment_stopConditions' - The stop conditions for the experiment.
+--
+-- 'tags', 'experiment_tags' - The tags for the experiment.
+--
+-- 'targets', 'experiment_targets' - The targets for the experiment.
+newExperiment ::
+  Experiment
+newExperiment =
+  Experiment'
+    { actions = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      endTime = Prelude.Nothing,
+      experimentTemplateId = Prelude.Nothing,
+      id = Prelude.Nothing,
+      logConfiguration = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      state = Prelude.Nothing,
+      stopConditions = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      targets = Prelude.Nothing
+    }
+
+-- | The actions for the experiment.
+experiment_actions :: Lens.Lens' Experiment (Prelude.Maybe (Prelude.HashMap Prelude.Text ExperimentAction))
+experiment_actions = Lens.lens (\Experiment' {actions} -> actions) (\s@Experiment' {} a -> s {actions = a} :: Experiment) Prelude.. Lens.mapping Lens.coerced
+
+-- | The time that the experiment was created.
+experiment_creationTime :: Lens.Lens' Experiment (Prelude.Maybe Prelude.UTCTime)
+experiment_creationTime = Lens.lens (\Experiment' {creationTime} -> creationTime) (\s@Experiment' {} a -> s {creationTime = a} :: Experiment) Prelude.. Lens.mapping Data._Time
+
+-- | The time that the experiment ended.
+experiment_endTime :: Lens.Lens' Experiment (Prelude.Maybe Prelude.UTCTime)
+experiment_endTime = Lens.lens (\Experiment' {endTime} -> endTime) (\s@Experiment' {} a -> s {endTime = a} :: Experiment) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the experiment template.
+experiment_experimentTemplateId :: Lens.Lens' Experiment (Prelude.Maybe Prelude.Text)
+experiment_experimentTemplateId = Lens.lens (\Experiment' {experimentTemplateId} -> experimentTemplateId) (\s@Experiment' {} a -> s {experimentTemplateId = a} :: Experiment)
+
+-- | The ID of the experiment.
+experiment_id :: Lens.Lens' Experiment (Prelude.Maybe Prelude.Text)
+experiment_id = Lens.lens (\Experiment' {id} -> id) (\s@Experiment' {} a -> s {id = a} :: Experiment)
+
+-- | The configuration for experiment logging.
+experiment_logConfiguration :: Lens.Lens' Experiment (Prelude.Maybe ExperimentLogConfiguration)
+experiment_logConfiguration = Lens.lens (\Experiment' {logConfiguration} -> logConfiguration) (\s@Experiment' {} a -> s {logConfiguration = a} :: Experiment)
+
+-- | The Amazon Resource Name (ARN) of an IAM role that grants the FIS
+-- service permission to perform service actions on your behalf.
+experiment_roleArn :: Lens.Lens' Experiment (Prelude.Maybe Prelude.Text)
+experiment_roleArn = Lens.lens (\Experiment' {roleArn} -> roleArn) (\s@Experiment' {} a -> s {roleArn = a} :: Experiment)
+
+-- | The time that the experiment started.
+experiment_startTime :: Lens.Lens' Experiment (Prelude.Maybe Prelude.UTCTime)
+experiment_startTime = Lens.lens (\Experiment' {startTime} -> startTime) (\s@Experiment' {} a -> s {startTime = a} :: Experiment) Prelude.. Lens.mapping Data._Time
+
+-- | The state of the experiment.
+experiment_state :: Lens.Lens' Experiment (Prelude.Maybe ExperimentState)
+experiment_state = Lens.lens (\Experiment' {state} -> state) (\s@Experiment' {} a -> s {state = a} :: Experiment)
+
+-- | The stop conditions for the experiment.
+experiment_stopConditions :: Lens.Lens' Experiment (Prelude.Maybe [ExperimentStopCondition])
+experiment_stopConditions = Lens.lens (\Experiment' {stopConditions} -> stopConditions) (\s@Experiment' {} a -> s {stopConditions = a} :: Experiment) Prelude.. Lens.mapping Lens.coerced
+
+-- | The tags for the experiment.
+experiment_tags :: Lens.Lens' Experiment (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experiment_tags = Lens.lens (\Experiment' {tags} -> tags) (\s@Experiment' {} a -> s {tags = a} :: Experiment) Prelude.. Lens.mapping Lens.coerced
+
+-- | The targets for the experiment.
+experiment_targets :: Lens.Lens' Experiment (Prelude.Maybe (Prelude.HashMap Prelude.Text ExperimentTarget))
+experiment_targets = Lens.lens (\Experiment' {targets} -> targets) (\s@Experiment' {} a -> s {targets = a} :: Experiment) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON Experiment where
+  parseJSON =
+    Data.withObject
+      "Experiment"
+      ( \x ->
+          Experiment'
+            Prelude.<$> (x Data..:? "actions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "creationTime")
+            Prelude.<*> (x Data..:? "endTime")
+            Prelude.<*> (x Data..:? "experimentTemplateId")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "logConfiguration")
+            Prelude.<*> (x Data..:? "roleArn")
+            Prelude.<*> (x Data..:? "startTime")
+            Prelude.<*> (x Data..:? "state")
+            Prelude.<*> (x Data..:? "stopConditions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "targets" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Experiment where
+  hashWithSalt _salt Experiment' {..} =
+    _salt
+      `Prelude.hashWithSalt` actions
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` experimentTemplateId
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` logConfiguration
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` stopConditions
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` targets
+
+instance Prelude.NFData Experiment where
+  rnf Experiment' {..} =
+    Prelude.rnf actions
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf experimentTemplateId
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf logConfiguration
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf stopConditions
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf targets
diff --git a/gen/Amazonka/FIS/Types/ExperimentAction.hs b/gen/Amazonka/FIS/Types/ExperimentAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentAction.hs
@@ -0,0 +1,157 @@
+{-# 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.FIS.Types.ExperimentAction
+-- 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.FIS.Types.ExperimentAction where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentActionState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the action for an experiment.
+--
+-- /See:/ 'newExperimentAction' smart constructor.
+data ExperimentAction = ExperimentAction'
+  { -- | The ID of the action.
+    actionId :: Prelude.Maybe Prelude.Text,
+    -- | The description for the action.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The time that the action ended.
+    endTime :: Prelude.Maybe Data.POSIX,
+    -- | The parameters for the action.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of the action that must be completed before this action starts.
+    startAfter :: Prelude.Maybe [Prelude.Text],
+    -- | The time that the action started.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | The state of the action.
+    state :: Prelude.Maybe ExperimentActionState,
+    -- | The targets for the action.
+    targets :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentAction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'actionId', 'experimentAction_actionId' - The ID of the action.
+--
+-- 'description', 'experimentAction_description' - The description for the action.
+--
+-- 'endTime', 'experimentAction_endTime' - The time that the action ended.
+--
+-- 'parameters', 'experimentAction_parameters' - The parameters for the action.
+--
+-- 'startAfter', 'experimentAction_startAfter' - The name of the action that must be completed before this action starts.
+--
+-- 'startTime', 'experimentAction_startTime' - The time that the action started.
+--
+-- 'state', 'experimentAction_state' - The state of the action.
+--
+-- 'targets', 'experimentAction_targets' - The targets for the action.
+newExperimentAction ::
+  ExperimentAction
+newExperimentAction =
+  ExperimentAction'
+    { actionId = Prelude.Nothing,
+      description = Prelude.Nothing,
+      endTime = Prelude.Nothing,
+      parameters = Prelude.Nothing,
+      startAfter = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      state = Prelude.Nothing,
+      targets = Prelude.Nothing
+    }
+
+-- | The ID of the action.
+experimentAction_actionId :: Lens.Lens' ExperimentAction (Prelude.Maybe Prelude.Text)
+experimentAction_actionId = Lens.lens (\ExperimentAction' {actionId} -> actionId) (\s@ExperimentAction' {} a -> s {actionId = a} :: ExperimentAction)
+
+-- | The description for the action.
+experimentAction_description :: Lens.Lens' ExperimentAction (Prelude.Maybe Prelude.Text)
+experimentAction_description = Lens.lens (\ExperimentAction' {description} -> description) (\s@ExperimentAction' {} a -> s {description = a} :: ExperimentAction)
+
+-- | The time that the action ended.
+experimentAction_endTime :: Lens.Lens' ExperimentAction (Prelude.Maybe Prelude.UTCTime)
+experimentAction_endTime = Lens.lens (\ExperimentAction' {endTime} -> endTime) (\s@ExperimentAction' {} a -> s {endTime = a} :: ExperimentAction) Prelude.. Lens.mapping Data._Time
+
+-- | The parameters for the action.
+experimentAction_parameters :: Lens.Lens' ExperimentAction (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentAction_parameters = Lens.lens (\ExperimentAction' {parameters} -> parameters) (\s@ExperimentAction' {} a -> s {parameters = a} :: ExperimentAction) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the action that must be completed before this action starts.
+experimentAction_startAfter :: Lens.Lens' ExperimentAction (Prelude.Maybe [Prelude.Text])
+experimentAction_startAfter = Lens.lens (\ExperimentAction' {startAfter} -> startAfter) (\s@ExperimentAction' {} a -> s {startAfter = a} :: ExperimentAction) Prelude.. Lens.mapping Lens.coerced
+
+-- | The time that the action started.
+experimentAction_startTime :: Lens.Lens' ExperimentAction (Prelude.Maybe Prelude.UTCTime)
+experimentAction_startTime = Lens.lens (\ExperimentAction' {startTime} -> startTime) (\s@ExperimentAction' {} a -> s {startTime = a} :: ExperimentAction) Prelude.. Lens.mapping Data._Time
+
+-- | The state of the action.
+experimentAction_state :: Lens.Lens' ExperimentAction (Prelude.Maybe ExperimentActionState)
+experimentAction_state = Lens.lens (\ExperimentAction' {state} -> state) (\s@ExperimentAction' {} a -> s {state = a} :: ExperimentAction)
+
+-- | The targets for the action.
+experimentAction_targets :: Lens.Lens' ExperimentAction (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentAction_targets = Lens.lens (\ExperimentAction' {targets} -> targets) (\s@ExperimentAction' {} a -> s {targets = a} :: ExperimentAction) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ExperimentAction where
+  parseJSON =
+    Data.withObject
+      "ExperimentAction"
+      ( \x ->
+          ExperimentAction'
+            Prelude.<$> (x Data..:? "actionId")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "endTime")
+            Prelude.<*> (x Data..:? "parameters" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "startAfter" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "startTime")
+            Prelude.<*> (x Data..:? "state")
+            Prelude.<*> (x Data..:? "targets" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ExperimentAction where
+  hashWithSalt _salt ExperimentAction' {..} =
+    _salt
+      `Prelude.hashWithSalt` actionId
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` parameters
+      `Prelude.hashWithSalt` startAfter
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` targets
+
+instance Prelude.NFData ExperimentAction where
+  rnf ExperimentAction' {..} =
+    Prelude.rnf actionId
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf startAfter
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf targets
diff --git a/gen/Amazonka/FIS/Types/ExperimentActionState.hs b/gen/Amazonka/FIS/Types/ExperimentActionState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentActionState.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentActionState
+-- 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.FIS.Types.ExperimentActionState where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentActionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the state of an action.
+--
+-- /See:/ 'newExperimentActionState' smart constructor.
+data ExperimentActionState = ExperimentActionState'
+  { -- | The reason for the state.
+    reason :: Prelude.Maybe Prelude.Text,
+    -- | The state of the action.
+    status :: Prelude.Maybe ExperimentActionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentActionState' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'reason', 'experimentActionState_reason' - The reason for the state.
+--
+-- 'status', 'experimentActionState_status' - The state of the action.
+newExperimentActionState ::
+  ExperimentActionState
+newExperimentActionState =
+  ExperimentActionState'
+    { reason = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The reason for the state.
+experimentActionState_reason :: Lens.Lens' ExperimentActionState (Prelude.Maybe Prelude.Text)
+experimentActionState_reason = Lens.lens (\ExperimentActionState' {reason} -> reason) (\s@ExperimentActionState' {} a -> s {reason = a} :: ExperimentActionState)
+
+-- | The state of the action.
+experimentActionState_status :: Lens.Lens' ExperimentActionState (Prelude.Maybe ExperimentActionStatus)
+experimentActionState_status = Lens.lens (\ExperimentActionState' {status} -> status) (\s@ExperimentActionState' {} a -> s {status = a} :: ExperimentActionState)
+
+instance Data.FromJSON ExperimentActionState where
+  parseJSON =
+    Data.withObject
+      "ExperimentActionState"
+      ( \x ->
+          ExperimentActionState'
+            Prelude.<$> (x Data..:? "reason")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable ExperimentActionState where
+  hashWithSalt _salt ExperimentActionState' {..} =
+    _salt
+      `Prelude.hashWithSalt` reason
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData ExperimentActionState where
+  rnf ExperimentActionState' {..} =
+    Prelude.rnf reason `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/FIS/Types/ExperimentActionStatus.hs b/gen/Amazonka/FIS/Types/ExperimentActionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentActionStatus.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentActionStatus
+-- 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.FIS.Types.ExperimentActionStatus
+  ( ExperimentActionStatus
+      ( ..,
+        ExperimentActionStatus_Cancelled,
+        ExperimentActionStatus_Completed,
+        ExperimentActionStatus_Failed,
+        ExperimentActionStatus_Initiating,
+        ExperimentActionStatus_Pending,
+        ExperimentActionStatus_Running,
+        ExperimentActionStatus_Stopped,
+        ExperimentActionStatus_Stopping
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ExperimentActionStatus = ExperimentActionStatus'
+  { fromExperimentActionStatus ::
+      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 ExperimentActionStatus_Cancelled :: ExperimentActionStatus
+pattern ExperimentActionStatus_Cancelled = ExperimentActionStatus' "cancelled"
+
+pattern ExperimentActionStatus_Completed :: ExperimentActionStatus
+pattern ExperimentActionStatus_Completed = ExperimentActionStatus' "completed"
+
+pattern ExperimentActionStatus_Failed :: ExperimentActionStatus
+pattern ExperimentActionStatus_Failed = ExperimentActionStatus' "failed"
+
+pattern ExperimentActionStatus_Initiating :: ExperimentActionStatus
+pattern ExperimentActionStatus_Initiating = ExperimentActionStatus' "initiating"
+
+pattern ExperimentActionStatus_Pending :: ExperimentActionStatus
+pattern ExperimentActionStatus_Pending = ExperimentActionStatus' "pending"
+
+pattern ExperimentActionStatus_Running :: ExperimentActionStatus
+pattern ExperimentActionStatus_Running = ExperimentActionStatus' "running"
+
+pattern ExperimentActionStatus_Stopped :: ExperimentActionStatus
+pattern ExperimentActionStatus_Stopped = ExperimentActionStatus' "stopped"
+
+pattern ExperimentActionStatus_Stopping :: ExperimentActionStatus
+pattern ExperimentActionStatus_Stopping = ExperimentActionStatus' "stopping"
+
+{-# COMPLETE
+  ExperimentActionStatus_Cancelled,
+  ExperimentActionStatus_Completed,
+  ExperimentActionStatus_Failed,
+  ExperimentActionStatus_Initiating,
+  ExperimentActionStatus_Pending,
+  ExperimentActionStatus_Running,
+  ExperimentActionStatus_Stopped,
+  ExperimentActionStatus_Stopping,
+  ExperimentActionStatus'
+  #-}
diff --git a/gen/Amazonka/FIS/Types/ExperimentCloudWatchLogsLogConfiguration.hs b/gen/Amazonka/FIS/Types/ExperimentCloudWatchLogsLogConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentCloudWatchLogsLogConfiguration.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentCloudWatchLogsLogConfiguration
+-- 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.FIS.Types.ExperimentCloudWatchLogsLogConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the configuration for experiment logging to Amazon CloudWatch
+-- Logs.
+--
+-- /See:/ 'newExperimentCloudWatchLogsLogConfiguration' smart constructor.
+data ExperimentCloudWatchLogsLogConfiguration = ExperimentCloudWatchLogsLogConfiguration'
+  { -- | The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs
+    -- log group.
+    logGroupArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentCloudWatchLogsLogConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'logGroupArn', 'experimentCloudWatchLogsLogConfiguration_logGroupArn' - The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs
+-- log group.
+newExperimentCloudWatchLogsLogConfiguration ::
+  ExperimentCloudWatchLogsLogConfiguration
+newExperimentCloudWatchLogsLogConfiguration =
+  ExperimentCloudWatchLogsLogConfiguration'
+    { logGroupArn =
+        Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs
+-- log group.
+experimentCloudWatchLogsLogConfiguration_logGroupArn :: Lens.Lens' ExperimentCloudWatchLogsLogConfiguration (Prelude.Maybe Prelude.Text)
+experimentCloudWatchLogsLogConfiguration_logGroupArn = Lens.lens (\ExperimentCloudWatchLogsLogConfiguration' {logGroupArn} -> logGroupArn) (\s@ExperimentCloudWatchLogsLogConfiguration' {} a -> s {logGroupArn = a} :: ExperimentCloudWatchLogsLogConfiguration)
+
+instance
+  Data.FromJSON
+    ExperimentCloudWatchLogsLogConfiguration
+  where
+  parseJSON =
+    Data.withObject
+      "ExperimentCloudWatchLogsLogConfiguration"
+      ( \x ->
+          ExperimentCloudWatchLogsLogConfiguration'
+            Prelude.<$> (x Data..:? "logGroupArn")
+      )
+
+instance
+  Prelude.Hashable
+    ExperimentCloudWatchLogsLogConfiguration
+  where
+  hashWithSalt
+    _salt
+    ExperimentCloudWatchLogsLogConfiguration' {..} =
+      _salt `Prelude.hashWithSalt` logGroupArn
+
+instance
+  Prelude.NFData
+    ExperimentCloudWatchLogsLogConfiguration
+  where
+  rnf ExperimentCloudWatchLogsLogConfiguration' {..} =
+    Prelude.rnf logGroupArn
diff --git a/gen/Amazonka/FIS/Types/ExperimentLogConfiguration.hs b/gen/Amazonka/FIS/Types/ExperimentLogConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentLogConfiguration.hs
@@ -0,0 +1,99 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentLogConfiguration
+-- 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.FIS.Types.ExperimentLogConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentCloudWatchLogsLogConfiguration
+import Amazonka.FIS.Types.ExperimentS3LogConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the configuration for experiment logging.
+--
+-- /See:/ 'newExperimentLogConfiguration' smart constructor.
+data ExperimentLogConfiguration = ExperimentLogConfiguration'
+  { -- | The configuration for experiment logging to Amazon CloudWatch Logs.
+    cloudWatchLogsConfiguration :: Prelude.Maybe ExperimentCloudWatchLogsLogConfiguration,
+    -- | The schema version.
+    logSchemaVersion :: Prelude.Maybe Prelude.Int,
+    -- | The configuration for experiment logging to Amazon S3.
+    s3Configuration :: Prelude.Maybe ExperimentS3LogConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentLogConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cloudWatchLogsConfiguration', 'experimentLogConfiguration_cloudWatchLogsConfiguration' - The configuration for experiment logging to Amazon CloudWatch Logs.
+--
+-- 'logSchemaVersion', 'experimentLogConfiguration_logSchemaVersion' - The schema version.
+--
+-- 's3Configuration', 'experimentLogConfiguration_s3Configuration' - The configuration for experiment logging to Amazon S3.
+newExperimentLogConfiguration ::
+  ExperimentLogConfiguration
+newExperimentLogConfiguration =
+  ExperimentLogConfiguration'
+    { cloudWatchLogsConfiguration =
+        Prelude.Nothing,
+      logSchemaVersion = Prelude.Nothing,
+      s3Configuration = Prelude.Nothing
+    }
+
+-- | The configuration for experiment logging to Amazon CloudWatch Logs.
+experimentLogConfiguration_cloudWatchLogsConfiguration :: Lens.Lens' ExperimentLogConfiguration (Prelude.Maybe ExperimentCloudWatchLogsLogConfiguration)
+experimentLogConfiguration_cloudWatchLogsConfiguration = Lens.lens (\ExperimentLogConfiguration' {cloudWatchLogsConfiguration} -> cloudWatchLogsConfiguration) (\s@ExperimentLogConfiguration' {} a -> s {cloudWatchLogsConfiguration = a} :: ExperimentLogConfiguration)
+
+-- | The schema version.
+experimentLogConfiguration_logSchemaVersion :: Lens.Lens' ExperimentLogConfiguration (Prelude.Maybe Prelude.Int)
+experimentLogConfiguration_logSchemaVersion = Lens.lens (\ExperimentLogConfiguration' {logSchemaVersion} -> logSchemaVersion) (\s@ExperimentLogConfiguration' {} a -> s {logSchemaVersion = a} :: ExperimentLogConfiguration)
+
+-- | The configuration for experiment logging to Amazon S3.
+experimentLogConfiguration_s3Configuration :: Lens.Lens' ExperimentLogConfiguration (Prelude.Maybe ExperimentS3LogConfiguration)
+experimentLogConfiguration_s3Configuration = Lens.lens (\ExperimentLogConfiguration' {s3Configuration} -> s3Configuration) (\s@ExperimentLogConfiguration' {} a -> s {s3Configuration = a} :: ExperimentLogConfiguration)
+
+instance Data.FromJSON ExperimentLogConfiguration where
+  parseJSON =
+    Data.withObject
+      "ExperimentLogConfiguration"
+      ( \x ->
+          ExperimentLogConfiguration'
+            Prelude.<$> (x Data..:? "cloudWatchLogsConfiguration")
+            Prelude.<*> (x Data..:? "logSchemaVersion")
+            Prelude.<*> (x Data..:? "s3Configuration")
+      )
+
+instance Prelude.Hashable ExperimentLogConfiguration where
+  hashWithSalt _salt ExperimentLogConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` cloudWatchLogsConfiguration
+      `Prelude.hashWithSalt` logSchemaVersion
+      `Prelude.hashWithSalt` s3Configuration
+
+instance Prelude.NFData ExperimentLogConfiguration where
+  rnf ExperimentLogConfiguration' {..} =
+    Prelude.rnf cloudWatchLogsConfiguration
+      `Prelude.seq` Prelude.rnf logSchemaVersion
+      `Prelude.seq` Prelude.rnf s3Configuration
diff --git a/gen/Amazonka/FIS/Types/ExperimentS3LogConfiguration.hs b/gen/Amazonka/FIS/Types/ExperimentS3LogConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentS3LogConfiguration.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentS3LogConfiguration
+-- 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.FIS.Types.ExperimentS3LogConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the configuration for experiment logging to Amazon S3.
+--
+-- /See:/ 'newExperimentS3LogConfiguration' smart constructor.
+data ExperimentS3LogConfiguration = ExperimentS3LogConfiguration'
+  { -- | The name of the destination bucket.
+    bucketName :: Prelude.Maybe Prelude.Text,
+    -- | The bucket prefix.
+    prefix :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentS3LogConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'bucketName', 'experimentS3LogConfiguration_bucketName' - The name of the destination bucket.
+--
+-- 'prefix', 'experimentS3LogConfiguration_prefix' - The bucket prefix.
+newExperimentS3LogConfiguration ::
+  ExperimentS3LogConfiguration
+newExperimentS3LogConfiguration =
+  ExperimentS3LogConfiguration'
+    { bucketName =
+        Prelude.Nothing,
+      prefix = Prelude.Nothing
+    }
+
+-- | The name of the destination bucket.
+experimentS3LogConfiguration_bucketName :: Lens.Lens' ExperimentS3LogConfiguration (Prelude.Maybe Prelude.Text)
+experimentS3LogConfiguration_bucketName = Lens.lens (\ExperimentS3LogConfiguration' {bucketName} -> bucketName) (\s@ExperimentS3LogConfiguration' {} a -> s {bucketName = a} :: ExperimentS3LogConfiguration)
+
+-- | The bucket prefix.
+experimentS3LogConfiguration_prefix :: Lens.Lens' ExperimentS3LogConfiguration (Prelude.Maybe Prelude.Text)
+experimentS3LogConfiguration_prefix = Lens.lens (\ExperimentS3LogConfiguration' {prefix} -> prefix) (\s@ExperimentS3LogConfiguration' {} a -> s {prefix = a} :: ExperimentS3LogConfiguration)
+
+instance Data.FromJSON ExperimentS3LogConfiguration where
+  parseJSON =
+    Data.withObject
+      "ExperimentS3LogConfiguration"
+      ( \x ->
+          ExperimentS3LogConfiguration'
+            Prelude.<$> (x Data..:? "bucketName")
+            Prelude.<*> (x Data..:? "prefix")
+      )
+
+instance
+  Prelude.Hashable
+    ExperimentS3LogConfiguration
+  where
+  hashWithSalt _salt ExperimentS3LogConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` bucketName
+      `Prelude.hashWithSalt` prefix
+
+instance Prelude.NFData ExperimentS3LogConfiguration where
+  rnf ExperimentS3LogConfiguration' {..} =
+    Prelude.rnf bucketName
+      `Prelude.seq` Prelude.rnf prefix
diff --git a/gen/Amazonka/FIS/Types/ExperimentState.hs b/gen/Amazonka/FIS/Types/ExperimentState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentState.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentState
+-- 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.FIS.Types.ExperimentState where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the state of an experiment.
+--
+-- /See:/ 'newExperimentState' smart constructor.
+data ExperimentState = ExperimentState'
+  { -- | The reason for the state.
+    reason :: Prelude.Maybe Prelude.Text,
+    -- | The state of the experiment.
+    status :: Prelude.Maybe ExperimentStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentState' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'reason', 'experimentState_reason' - The reason for the state.
+--
+-- 'status', 'experimentState_status' - The state of the experiment.
+newExperimentState ::
+  ExperimentState
+newExperimentState =
+  ExperimentState'
+    { reason = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The reason for the state.
+experimentState_reason :: Lens.Lens' ExperimentState (Prelude.Maybe Prelude.Text)
+experimentState_reason = Lens.lens (\ExperimentState' {reason} -> reason) (\s@ExperimentState' {} a -> s {reason = a} :: ExperimentState)
+
+-- | The state of the experiment.
+experimentState_status :: Lens.Lens' ExperimentState (Prelude.Maybe ExperimentStatus)
+experimentState_status = Lens.lens (\ExperimentState' {status} -> status) (\s@ExperimentState' {} a -> s {status = a} :: ExperimentState)
+
+instance Data.FromJSON ExperimentState where
+  parseJSON =
+    Data.withObject
+      "ExperimentState"
+      ( \x ->
+          ExperimentState'
+            Prelude.<$> (x Data..:? "reason")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable ExperimentState where
+  hashWithSalt _salt ExperimentState' {..} =
+    _salt
+      `Prelude.hashWithSalt` reason
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData ExperimentState where
+  rnf ExperimentState' {..} =
+    Prelude.rnf reason `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/FIS/Types/ExperimentStatus.hs b/gen/Amazonka/FIS/Types/ExperimentStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentStatus.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentStatus
+-- 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.FIS.Types.ExperimentStatus
+  ( ExperimentStatus
+      ( ..,
+        ExperimentStatus_Completed,
+        ExperimentStatus_Failed,
+        ExperimentStatus_Initiating,
+        ExperimentStatus_Pending,
+        ExperimentStatus_Running,
+        ExperimentStatus_Stopped,
+        ExperimentStatus_Stopping
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ExperimentStatus = ExperimentStatus'
+  { fromExperimentStatus ::
+      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 ExperimentStatus_Completed :: ExperimentStatus
+pattern ExperimentStatus_Completed = ExperimentStatus' "completed"
+
+pattern ExperimentStatus_Failed :: ExperimentStatus
+pattern ExperimentStatus_Failed = ExperimentStatus' "failed"
+
+pattern ExperimentStatus_Initiating :: ExperimentStatus
+pattern ExperimentStatus_Initiating = ExperimentStatus' "initiating"
+
+pattern ExperimentStatus_Pending :: ExperimentStatus
+pattern ExperimentStatus_Pending = ExperimentStatus' "pending"
+
+pattern ExperimentStatus_Running :: ExperimentStatus
+pattern ExperimentStatus_Running = ExperimentStatus' "running"
+
+pattern ExperimentStatus_Stopped :: ExperimentStatus
+pattern ExperimentStatus_Stopped = ExperimentStatus' "stopped"
+
+pattern ExperimentStatus_Stopping :: ExperimentStatus
+pattern ExperimentStatus_Stopping = ExperimentStatus' "stopping"
+
+{-# COMPLETE
+  ExperimentStatus_Completed,
+  ExperimentStatus_Failed,
+  ExperimentStatus_Initiating,
+  ExperimentStatus_Pending,
+  ExperimentStatus_Running,
+  ExperimentStatus_Stopped,
+  ExperimentStatus_Stopping,
+  ExperimentStatus'
+  #-}
diff --git a/gen/Amazonka/FIS/Types/ExperimentStopCondition.hs b/gen/Amazonka/FIS/Types/ExperimentStopCondition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentStopCondition.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentStopCondition
+-- 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.FIS.Types.ExperimentStopCondition where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the stop condition for an experiment.
+--
+-- /See:/ 'newExperimentStopCondition' smart constructor.
+data ExperimentStopCondition = ExperimentStopCondition'
+  { -- | The source for the stop condition.
+    source :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the CloudWatch alarm, if applicable.
+    value :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentStopCondition' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'source', 'experimentStopCondition_source' - The source for the stop condition.
+--
+-- 'value', 'experimentStopCondition_value' - The Amazon Resource Name (ARN) of the CloudWatch alarm, if applicable.
+newExperimentStopCondition ::
+  ExperimentStopCondition
+newExperimentStopCondition =
+  ExperimentStopCondition'
+    { source = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | The source for the stop condition.
+experimentStopCondition_source :: Lens.Lens' ExperimentStopCondition (Prelude.Maybe Prelude.Text)
+experimentStopCondition_source = Lens.lens (\ExperimentStopCondition' {source} -> source) (\s@ExperimentStopCondition' {} a -> s {source = a} :: ExperimentStopCondition)
+
+-- | The Amazon Resource Name (ARN) of the CloudWatch alarm, if applicable.
+experimentStopCondition_value :: Lens.Lens' ExperimentStopCondition (Prelude.Maybe Prelude.Text)
+experimentStopCondition_value = Lens.lens (\ExperimentStopCondition' {value} -> value) (\s@ExperimentStopCondition' {} a -> s {value = a} :: ExperimentStopCondition)
+
+instance Data.FromJSON ExperimentStopCondition where
+  parseJSON =
+    Data.withObject
+      "ExperimentStopCondition"
+      ( \x ->
+          ExperimentStopCondition'
+            Prelude.<$> (x Data..:? "source")
+            Prelude.<*> (x Data..:? "value")
+      )
+
+instance Prelude.Hashable ExperimentStopCondition where
+  hashWithSalt _salt ExperimentStopCondition' {..} =
+    _salt
+      `Prelude.hashWithSalt` source
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData ExperimentStopCondition where
+  rnf ExperimentStopCondition' {..} =
+    Prelude.rnf source `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/FIS/Types/ExperimentSummary.hs b/gen/Amazonka/FIS/Types/ExperimentSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentSummary.hs
@@ -0,0 +1,121 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentSummary
+-- 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.FIS.Types.ExperimentSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of an experiment.
+--
+-- /See:/ 'newExperimentSummary' smart constructor.
+data ExperimentSummary = ExperimentSummary'
+  { -- | The time that the experiment was created.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | The ID of the experiment template.
+    experimentTemplateId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the experiment.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The state of the experiment.
+    state :: Prelude.Maybe ExperimentState,
+    -- | The tags for the experiment.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationTime', 'experimentSummary_creationTime' - The time that the experiment was created.
+--
+-- 'experimentTemplateId', 'experimentSummary_experimentTemplateId' - The ID of the experiment template.
+--
+-- 'id', 'experimentSummary_id' - The ID of the experiment.
+--
+-- 'state', 'experimentSummary_state' - The state of the experiment.
+--
+-- 'tags', 'experimentSummary_tags' - The tags for the experiment.
+newExperimentSummary ::
+  ExperimentSummary
+newExperimentSummary =
+  ExperimentSummary'
+    { creationTime = Prelude.Nothing,
+      experimentTemplateId = Prelude.Nothing,
+      id = Prelude.Nothing,
+      state = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | The time that the experiment was created.
+experimentSummary_creationTime :: Lens.Lens' ExperimentSummary (Prelude.Maybe Prelude.UTCTime)
+experimentSummary_creationTime = Lens.lens (\ExperimentSummary' {creationTime} -> creationTime) (\s@ExperimentSummary' {} a -> s {creationTime = a} :: ExperimentSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the experiment template.
+experimentSummary_experimentTemplateId :: Lens.Lens' ExperimentSummary (Prelude.Maybe Prelude.Text)
+experimentSummary_experimentTemplateId = Lens.lens (\ExperimentSummary' {experimentTemplateId} -> experimentTemplateId) (\s@ExperimentSummary' {} a -> s {experimentTemplateId = a} :: ExperimentSummary)
+
+-- | The ID of the experiment.
+experimentSummary_id :: Lens.Lens' ExperimentSummary (Prelude.Maybe Prelude.Text)
+experimentSummary_id = Lens.lens (\ExperimentSummary' {id} -> id) (\s@ExperimentSummary' {} a -> s {id = a} :: ExperimentSummary)
+
+-- | The state of the experiment.
+experimentSummary_state :: Lens.Lens' ExperimentSummary (Prelude.Maybe ExperimentState)
+experimentSummary_state = Lens.lens (\ExperimentSummary' {state} -> state) (\s@ExperimentSummary' {} a -> s {state = a} :: ExperimentSummary)
+
+-- | The tags for the experiment.
+experimentSummary_tags :: Lens.Lens' ExperimentSummary (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentSummary_tags = Lens.lens (\ExperimentSummary' {tags} -> tags) (\s@ExperimentSummary' {} a -> s {tags = a} :: ExperimentSummary) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ExperimentSummary where
+  parseJSON =
+    Data.withObject
+      "ExperimentSummary"
+      ( \x ->
+          ExperimentSummary'
+            Prelude.<$> (x Data..:? "creationTime")
+            Prelude.<*> (x Data..:? "experimentTemplateId")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "state")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ExperimentSummary where
+  hashWithSalt _salt ExperimentSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` experimentTemplateId
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData ExperimentSummary where
+  rnf ExperimentSummary' {..} =
+    Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf experimentTemplateId
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/FIS/Types/ExperimentTarget.hs b/gen/Amazonka/FIS/Types/ExperimentTarget.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTarget.hs
@@ -0,0 +1,136 @@
+{-# 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.FIS.Types.ExperimentTarget
+-- 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.FIS.Types.ExperimentTarget where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentTargetFilter
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a target for an experiment.
+--
+-- /See:/ 'newExperimentTarget' smart constructor.
+data ExperimentTarget = ExperimentTarget'
+  { -- | The filters to apply to identify target resources using specific
+    -- attributes.
+    filters :: Prelude.Maybe [ExperimentTargetFilter],
+    -- | The resource type parameters.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The Amazon Resource Names (ARNs) of the resources.
+    resourceArns :: Prelude.Maybe [Prelude.Text],
+    -- | The tags for the target resources.
+    resourceTags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The resource type.
+    resourceType :: Prelude.Maybe Prelude.Text,
+    -- | Scopes the identified resources to a specific count or percentage.
+    selectionMode :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTarget' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'experimentTarget_filters' - The filters to apply to identify target resources using specific
+-- attributes.
+--
+-- 'parameters', 'experimentTarget_parameters' - The resource type parameters.
+--
+-- 'resourceArns', 'experimentTarget_resourceArns' - The Amazon Resource Names (ARNs) of the resources.
+--
+-- 'resourceTags', 'experimentTarget_resourceTags' - The tags for the target resources.
+--
+-- 'resourceType', 'experimentTarget_resourceType' - The resource type.
+--
+-- 'selectionMode', 'experimentTarget_selectionMode' - Scopes the identified resources to a specific count or percentage.
+newExperimentTarget ::
+  ExperimentTarget
+newExperimentTarget =
+  ExperimentTarget'
+    { filters = Prelude.Nothing,
+      parameters = Prelude.Nothing,
+      resourceArns = Prelude.Nothing,
+      resourceTags = Prelude.Nothing,
+      resourceType = Prelude.Nothing,
+      selectionMode = Prelude.Nothing
+    }
+
+-- | The filters to apply to identify target resources using specific
+-- attributes.
+experimentTarget_filters :: Lens.Lens' ExperimentTarget (Prelude.Maybe [ExperimentTargetFilter])
+experimentTarget_filters = Lens.lens (\ExperimentTarget' {filters} -> filters) (\s@ExperimentTarget' {} a -> s {filters = a} :: ExperimentTarget) Prelude.. Lens.mapping Lens.coerced
+
+-- | The resource type parameters.
+experimentTarget_parameters :: Lens.Lens' ExperimentTarget (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentTarget_parameters = Lens.lens (\ExperimentTarget' {parameters} -> parameters) (\s@ExperimentTarget' {} a -> s {parameters = a} :: ExperimentTarget) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Names (ARNs) of the resources.
+experimentTarget_resourceArns :: Lens.Lens' ExperimentTarget (Prelude.Maybe [Prelude.Text])
+experimentTarget_resourceArns = Lens.lens (\ExperimentTarget' {resourceArns} -> resourceArns) (\s@ExperimentTarget' {} a -> s {resourceArns = a} :: ExperimentTarget) Prelude.. Lens.mapping Lens.coerced
+
+-- | The tags for the target resources.
+experimentTarget_resourceTags :: Lens.Lens' ExperimentTarget (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentTarget_resourceTags = Lens.lens (\ExperimentTarget' {resourceTags} -> resourceTags) (\s@ExperimentTarget' {} a -> s {resourceTags = a} :: ExperimentTarget) Prelude.. Lens.mapping Lens.coerced
+
+-- | The resource type.
+experimentTarget_resourceType :: Lens.Lens' ExperimentTarget (Prelude.Maybe Prelude.Text)
+experimentTarget_resourceType = Lens.lens (\ExperimentTarget' {resourceType} -> resourceType) (\s@ExperimentTarget' {} a -> s {resourceType = a} :: ExperimentTarget)
+
+-- | Scopes the identified resources to a specific count or percentage.
+experimentTarget_selectionMode :: Lens.Lens' ExperimentTarget (Prelude.Maybe Prelude.Text)
+experimentTarget_selectionMode = Lens.lens (\ExperimentTarget' {selectionMode} -> selectionMode) (\s@ExperimentTarget' {} a -> s {selectionMode = a} :: ExperimentTarget)
+
+instance Data.FromJSON ExperimentTarget where
+  parseJSON =
+    Data.withObject
+      "ExperimentTarget"
+      ( \x ->
+          ExperimentTarget'
+            Prelude.<$> (x Data..:? "filters" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "parameters" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "resourceArns" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "resourceTags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "resourceType")
+            Prelude.<*> (x Data..:? "selectionMode")
+      )
+
+instance Prelude.Hashable ExperimentTarget where
+  hashWithSalt _salt ExperimentTarget' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` parameters
+      `Prelude.hashWithSalt` resourceArns
+      `Prelude.hashWithSalt` resourceTags
+      `Prelude.hashWithSalt` resourceType
+      `Prelude.hashWithSalt` selectionMode
+
+instance Prelude.NFData ExperimentTarget where
+  rnf ExperimentTarget' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf resourceArns
+      `Prelude.seq` Prelude.rnf resourceTags
+      `Prelude.seq` Prelude.rnf resourceType
+      `Prelude.seq` Prelude.rnf selectionMode
diff --git a/gen/Amazonka/FIS/Types/ExperimentTargetFilter.hs b/gen/Amazonka/FIS/Types/ExperimentTargetFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTargetFilter.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentTargetFilter
+-- 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.FIS.Types.ExperimentTargetFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a filter used for the target resources in an experiment.
+--
+-- /See:/ 'newExperimentTargetFilter' smart constructor.
+data ExperimentTargetFilter = ExperimentTargetFilter'
+  { -- | The attribute path for the filter.
+    path :: Prelude.Maybe Prelude.Text,
+    -- | The attribute values for the filter.
+    values :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTargetFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'path', 'experimentTargetFilter_path' - The attribute path for the filter.
+--
+-- 'values', 'experimentTargetFilter_values' - The attribute values for the filter.
+newExperimentTargetFilter ::
+  ExperimentTargetFilter
+newExperimentTargetFilter =
+  ExperimentTargetFilter'
+    { path = Prelude.Nothing,
+      values = Prelude.Nothing
+    }
+
+-- | The attribute path for the filter.
+experimentTargetFilter_path :: Lens.Lens' ExperimentTargetFilter (Prelude.Maybe Prelude.Text)
+experimentTargetFilter_path = Lens.lens (\ExperimentTargetFilter' {path} -> path) (\s@ExperimentTargetFilter' {} a -> s {path = a} :: ExperimentTargetFilter)
+
+-- | The attribute values for the filter.
+experimentTargetFilter_values :: Lens.Lens' ExperimentTargetFilter (Prelude.Maybe [Prelude.Text])
+experimentTargetFilter_values = Lens.lens (\ExperimentTargetFilter' {values} -> values) (\s@ExperimentTargetFilter' {} a -> s {values = a} :: ExperimentTargetFilter) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ExperimentTargetFilter where
+  parseJSON =
+    Data.withObject
+      "ExperimentTargetFilter"
+      ( \x ->
+          ExperimentTargetFilter'
+            Prelude.<$> (x Data..:? "path")
+            Prelude.<*> (x Data..:? "values" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ExperimentTargetFilter where
+  hashWithSalt _salt ExperimentTargetFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` path
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData ExperimentTargetFilter where
+  rnf ExperimentTargetFilter' {..} =
+    Prelude.rnf path `Prelude.seq` Prelude.rnf values
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplate.hs b/gen/Amazonka/FIS/Types/ExperimentTemplate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplate.hs
@@ -0,0 +1,184 @@
+{-# 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.FIS.Types.ExperimentTemplate
+-- 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.FIS.Types.ExperimentTemplate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentTemplateAction
+import Amazonka.FIS.Types.ExperimentTemplateLogConfiguration
+import Amazonka.FIS.Types.ExperimentTemplateStopCondition
+import Amazonka.FIS.Types.ExperimentTemplateTarget
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an experiment template.
+--
+-- /See:/ 'newExperimentTemplate' smart constructor.
+data ExperimentTemplate = ExperimentTemplate'
+  { -- | The actions for the experiment.
+    actions :: Prelude.Maybe (Prelude.HashMap Prelude.Text ExperimentTemplateAction),
+    -- | The time the experiment template was created.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | The description for the experiment template.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the experiment template.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The time the experiment template was last updated.
+    lastUpdateTime :: Prelude.Maybe Data.POSIX,
+    -- | The configuration for experiment logging.
+    logConfiguration :: Prelude.Maybe ExperimentTemplateLogConfiguration,
+    -- | The Amazon Resource Name (ARN) of an IAM role.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The stop conditions for the experiment.
+    stopConditions :: Prelude.Maybe [ExperimentTemplateStopCondition],
+    -- | The tags for the experiment template.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The targets for the experiment.
+    targets :: Prelude.Maybe (Prelude.HashMap Prelude.Text ExperimentTemplateTarget)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'actions', 'experimentTemplate_actions' - The actions for the experiment.
+--
+-- 'creationTime', 'experimentTemplate_creationTime' - The time the experiment template was created.
+--
+-- 'description', 'experimentTemplate_description' - The description for the experiment template.
+--
+-- 'id', 'experimentTemplate_id' - The ID of the experiment template.
+--
+-- 'lastUpdateTime', 'experimentTemplate_lastUpdateTime' - The time the experiment template was last updated.
+--
+-- 'logConfiguration', 'experimentTemplate_logConfiguration' - The configuration for experiment logging.
+--
+-- 'roleArn', 'experimentTemplate_roleArn' - The Amazon Resource Name (ARN) of an IAM role.
+--
+-- 'stopConditions', 'experimentTemplate_stopConditions' - The stop conditions for the experiment.
+--
+-- 'tags', 'experimentTemplate_tags' - The tags for the experiment template.
+--
+-- 'targets', 'experimentTemplate_targets' - The targets for the experiment.
+newExperimentTemplate ::
+  ExperimentTemplate
+newExperimentTemplate =
+  ExperimentTemplate'
+    { actions = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      description = Prelude.Nothing,
+      id = Prelude.Nothing,
+      lastUpdateTime = Prelude.Nothing,
+      logConfiguration = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      stopConditions = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      targets = Prelude.Nothing
+    }
+
+-- | The actions for the experiment.
+experimentTemplate_actions :: Lens.Lens' ExperimentTemplate (Prelude.Maybe (Prelude.HashMap Prelude.Text ExperimentTemplateAction))
+experimentTemplate_actions = Lens.lens (\ExperimentTemplate' {actions} -> actions) (\s@ExperimentTemplate' {} a -> s {actions = a} :: ExperimentTemplate) Prelude.. Lens.mapping Lens.coerced
+
+-- | The time the experiment template was created.
+experimentTemplate_creationTime :: Lens.Lens' ExperimentTemplate (Prelude.Maybe Prelude.UTCTime)
+experimentTemplate_creationTime = Lens.lens (\ExperimentTemplate' {creationTime} -> creationTime) (\s@ExperimentTemplate' {} a -> s {creationTime = a} :: ExperimentTemplate) Prelude.. Lens.mapping Data._Time
+
+-- | The description for the experiment template.
+experimentTemplate_description :: Lens.Lens' ExperimentTemplate (Prelude.Maybe Prelude.Text)
+experimentTemplate_description = Lens.lens (\ExperimentTemplate' {description} -> description) (\s@ExperimentTemplate' {} a -> s {description = a} :: ExperimentTemplate)
+
+-- | The ID of the experiment template.
+experimentTemplate_id :: Lens.Lens' ExperimentTemplate (Prelude.Maybe Prelude.Text)
+experimentTemplate_id = Lens.lens (\ExperimentTemplate' {id} -> id) (\s@ExperimentTemplate' {} a -> s {id = a} :: ExperimentTemplate)
+
+-- | The time the experiment template was last updated.
+experimentTemplate_lastUpdateTime :: Lens.Lens' ExperimentTemplate (Prelude.Maybe Prelude.UTCTime)
+experimentTemplate_lastUpdateTime = Lens.lens (\ExperimentTemplate' {lastUpdateTime} -> lastUpdateTime) (\s@ExperimentTemplate' {} a -> s {lastUpdateTime = a} :: ExperimentTemplate) Prelude.. Lens.mapping Data._Time
+
+-- | The configuration for experiment logging.
+experimentTemplate_logConfiguration :: Lens.Lens' ExperimentTemplate (Prelude.Maybe ExperimentTemplateLogConfiguration)
+experimentTemplate_logConfiguration = Lens.lens (\ExperimentTemplate' {logConfiguration} -> logConfiguration) (\s@ExperimentTemplate' {} a -> s {logConfiguration = a} :: ExperimentTemplate)
+
+-- | The Amazon Resource Name (ARN) of an IAM role.
+experimentTemplate_roleArn :: Lens.Lens' ExperimentTemplate (Prelude.Maybe Prelude.Text)
+experimentTemplate_roleArn = Lens.lens (\ExperimentTemplate' {roleArn} -> roleArn) (\s@ExperimentTemplate' {} a -> s {roleArn = a} :: ExperimentTemplate)
+
+-- | The stop conditions for the experiment.
+experimentTemplate_stopConditions :: Lens.Lens' ExperimentTemplate (Prelude.Maybe [ExperimentTemplateStopCondition])
+experimentTemplate_stopConditions = Lens.lens (\ExperimentTemplate' {stopConditions} -> stopConditions) (\s@ExperimentTemplate' {} a -> s {stopConditions = a} :: ExperimentTemplate) Prelude.. Lens.mapping Lens.coerced
+
+-- | The tags for the experiment template.
+experimentTemplate_tags :: Lens.Lens' ExperimentTemplate (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentTemplate_tags = Lens.lens (\ExperimentTemplate' {tags} -> tags) (\s@ExperimentTemplate' {} a -> s {tags = a} :: ExperimentTemplate) Prelude.. Lens.mapping Lens.coerced
+
+-- | The targets for the experiment.
+experimentTemplate_targets :: Lens.Lens' ExperimentTemplate (Prelude.Maybe (Prelude.HashMap Prelude.Text ExperimentTemplateTarget))
+experimentTemplate_targets = Lens.lens (\ExperimentTemplate' {targets} -> targets) (\s@ExperimentTemplate' {} a -> s {targets = a} :: ExperimentTemplate) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ExperimentTemplate where
+  parseJSON =
+    Data.withObject
+      "ExperimentTemplate"
+      ( \x ->
+          ExperimentTemplate'
+            Prelude.<$> (x Data..:? "actions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "creationTime")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "lastUpdateTime")
+            Prelude.<*> (x Data..:? "logConfiguration")
+            Prelude.<*> (x Data..:? "roleArn")
+            Prelude.<*> (x Data..:? "stopConditions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "targets" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ExperimentTemplate where
+  hashWithSalt _salt ExperimentTemplate' {..} =
+    _salt
+      `Prelude.hashWithSalt` actions
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` lastUpdateTime
+      `Prelude.hashWithSalt` logConfiguration
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` stopConditions
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` targets
+
+instance Prelude.NFData ExperimentTemplate where
+  rnf ExperimentTemplate' {..} =
+    Prelude.rnf actions
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf lastUpdateTime
+      `Prelude.seq` Prelude.rnf logConfiguration
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf stopConditions
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf targets
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateAction.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateAction.hs
@@ -0,0 +1,124 @@
+{-# 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.FIS.Types.ExperimentTemplateAction
+-- 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.FIS.Types.ExperimentTemplateAction where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an action for an experiment template.
+--
+-- /See:/ 'newExperimentTemplateAction' smart constructor.
+data ExperimentTemplateAction = ExperimentTemplateAction'
+  { -- | The ID of the action.
+    actionId :: Prelude.Maybe Prelude.Text,
+    -- | A description for the action.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The parameters for the action.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of the action that must be completed before the current action
+    -- starts.
+    startAfter :: Prelude.Maybe [Prelude.Text],
+    -- | The targets for the action.
+    targets :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateAction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'actionId', 'experimentTemplateAction_actionId' - The ID of the action.
+--
+-- 'description', 'experimentTemplateAction_description' - A description for the action.
+--
+-- 'parameters', 'experimentTemplateAction_parameters' - The parameters for the action.
+--
+-- 'startAfter', 'experimentTemplateAction_startAfter' - The name of the action that must be completed before the current action
+-- starts.
+--
+-- 'targets', 'experimentTemplateAction_targets' - The targets for the action.
+newExperimentTemplateAction ::
+  ExperimentTemplateAction
+newExperimentTemplateAction =
+  ExperimentTemplateAction'
+    { actionId =
+        Prelude.Nothing,
+      description = Prelude.Nothing,
+      parameters = Prelude.Nothing,
+      startAfter = Prelude.Nothing,
+      targets = Prelude.Nothing
+    }
+
+-- | The ID of the action.
+experimentTemplateAction_actionId :: Lens.Lens' ExperimentTemplateAction (Prelude.Maybe Prelude.Text)
+experimentTemplateAction_actionId = Lens.lens (\ExperimentTemplateAction' {actionId} -> actionId) (\s@ExperimentTemplateAction' {} a -> s {actionId = a} :: ExperimentTemplateAction)
+
+-- | A description for the action.
+experimentTemplateAction_description :: Lens.Lens' ExperimentTemplateAction (Prelude.Maybe Prelude.Text)
+experimentTemplateAction_description = Lens.lens (\ExperimentTemplateAction' {description} -> description) (\s@ExperimentTemplateAction' {} a -> s {description = a} :: ExperimentTemplateAction)
+
+-- | The parameters for the action.
+experimentTemplateAction_parameters :: Lens.Lens' ExperimentTemplateAction (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentTemplateAction_parameters = Lens.lens (\ExperimentTemplateAction' {parameters} -> parameters) (\s@ExperimentTemplateAction' {} a -> s {parameters = a} :: ExperimentTemplateAction) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the action that must be completed before the current action
+-- starts.
+experimentTemplateAction_startAfter :: Lens.Lens' ExperimentTemplateAction (Prelude.Maybe [Prelude.Text])
+experimentTemplateAction_startAfter = Lens.lens (\ExperimentTemplateAction' {startAfter} -> startAfter) (\s@ExperimentTemplateAction' {} a -> s {startAfter = a} :: ExperimentTemplateAction) Prelude.. Lens.mapping Lens.coerced
+
+-- | The targets for the action.
+experimentTemplateAction_targets :: Lens.Lens' ExperimentTemplateAction (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentTemplateAction_targets = Lens.lens (\ExperimentTemplateAction' {targets} -> targets) (\s@ExperimentTemplateAction' {} a -> s {targets = a} :: ExperimentTemplateAction) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ExperimentTemplateAction where
+  parseJSON =
+    Data.withObject
+      "ExperimentTemplateAction"
+      ( \x ->
+          ExperimentTemplateAction'
+            Prelude.<$> (x Data..:? "actionId")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "parameters" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "startAfter" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "targets" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ExperimentTemplateAction where
+  hashWithSalt _salt ExperimentTemplateAction' {..} =
+    _salt
+      `Prelude.hashWithSalt` actionId
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` parameters
+      `Prelude.hashWithSalt` startAfter
+      `Prelude.hashWithSalt` targets
+
+instance Prelude.NFData ExperimentTemplateAction where
+  rnf ExperimentTemplateAction' {..} =
+    Prelude.rnf actionId
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf startAfter
+      `Prelude.seq` Prelude.rnf targets
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateCloudWatchLogsLogConfiguration.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateCloudWatchLogsLogConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateCloudWatchLogsLogConfiguration.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfiguration
+-- 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.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the configuration for experiment logging to Amazon CloudWatch
+-- Logs.
+--
+-- /See:/ 'newExperimentTemplateCloudWatchLogsLogConfiguration' smart constructor.
+data ExperimentTemplateCloudWatchLogsLogConfiguration = ExperimentTemplateCloudWatchLogsLogConfiguration'
+  { -- | The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs
+    -- log group.
+    logGroupArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateCloudWatchLogsLogConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'logGroupArn', 'experimentTemplateCloudWatchLogsLogConfiguration_logGroupArn' - The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs
+-- log group.
+newExperimentTemplateCloudWatchLogsLogConfiguration ::
+  ExperimentTemplateCloudWatchLogsLogConfiguration
+newExperimentTemplateCloudWatchLogsLogConfiguration =
+  ExperimentTemplateCloudWatchLogsLogConfiguration'
+    { logGroupArn =
+        Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs
+-- log group.
+experimentTemplateCloudWatchLogsLogConfiguration_logGroupArn :: Lens.Lens' ExperimentTemplateCloudWatchLogsLogConfiguration (Prelude.Maybe Prelude.Text)
+experimentTemplateCloudWatchLogsLogConfiguration_logGroupArn = Lens.lens (\ExperimentTemplateCloudWatchLogsLogConfiguration' {logGroupArn} -> logGroupArn) (\s@ExperimentTemplateCloudWatchLogsLogConfiguration' {} a -> s {logGroupArn = a} :: ExperimentTemplateCloudWatchLogsLogConfiguration)
+
+instance
+  Data.FromJSON
+    ExperimentTemplateCloudWatchLogsLogConfiguration
+  where
+  parseJSON =
+    Data.withObject
+      "ExperimentTemplateCloudWatchLogsLogConfiguration"
+      ( \x ->
+          ExperimentTemplateCloudWatchLogsLogConfiguration'
+            Prelude.<$> (x Data..:? "logGroupArn")
+      )
+
+instance
+  Prelude.Hashable
+    ExperimentTemplateCloudWatchLogsLogConfiguration
+  where
+  hashWithSalt
+    _salt
+    ExperimentTemplateCloudWatchLogsLogConfiguration' {..} =
+      _salt `Prelude.hashWithSalt` logGroupArn
+
+instance
+  Prelude.NFData
+    ExperimentTemplateCloudWatchLogsLogConfiguration
+  where
+  rnf
+    ExperimentTemplateCloudWatchLogsLogConfiguration' {..} =
+      Prelude.rnf logGroupArn
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateCloudWatchLogsLogConfigurationInput.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateCloudWatchLogsLogConfigurationInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateCloudWatchLogsLogConfigurationInput.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfigurationInput
+-- 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.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfigurationInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies the configuration for experiment logging to Amazon CloudWatch
+-- Logs.
+--
+-- /See:/ 'newExperimentTemplateCloudWatchLogsLogConfigurationInput' smart constructor.
+data ExperimentTemplateCloudWatchLogsLogConfigurationInput = ExperimentTemplateCloudWatchLogsLogConfigurationInput'
+  { -- | The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs
+    -- log group.
+    logGroupArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateCloudWatchLogsLogConfigurationInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'logGroupArn', 'experimentTemplateCloudWatchLogsLogConfigurationInput_logGroupArn' - The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs
+-- log group.
+newExperimentTemplateCloudWatchLogsLogConfigurationInput ::
+  -- | 'logGroupArn'
+  Prelude.Text ->
+  ExperimentTemplateCloudWatchLogsLogConfigurationInput
+newExperimentTemplateCloudWatchLogsLogConfigurationInput
+  pLogGroupArn_ =
+    ExperimentTemplateCloudWatchLogsLogConfigurationInput'
+      { logGroupArn =
+          pLogGroupArn_
+      }
+
+-- | The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs
+-- log group.
+experimentTemplateCloudWatchLogsLogConfigurationInput_logGroupArn :: Lens.Lens' ExperimentTemplateCloudWatchLogsLogConfigurationInput Prelude.Text
+experimentTemplateCloudWatchLogsLogConfigurationInput_logGroupArn = Lens.lens (\ExperimentTemplateCloudWatchLogsLogConfigurationInput' {logGroupArn} -> logGroupArn) (\s@ExperimentTemplateCloudWatchLogsLogConfigurationInput' {} a -> s {logGroupArn = a} :: ExperimentTemplateCloudWatchLogsLogConfigurationInput)
+
+instance
+  Prelude.Hashable
+    ExperimentTemplateCloudWatchLogsLogConfigurationInput
+  where
+  hashWithSalt
+    _salt
+    ExperimentTemplateCloudWatchLogsLogConfigurationInput' {..} =
+      _salt `Prelude.hashWithSalt` logGroupArn
+
+instance
+  Prelude.NFData
+    ExperimentTemplateCloudWatchLogsLogConfigurationInput
+  where
+  rnf
+    ExperimentTemplateCloudWatchLogsLogConfigurationInput' {..} =
+      Prelude.rnf logGroupArn
+
+instance
+  Data.ToJSON
+    ExperimentTemplateCloudWatchLogsLogConfigurationInput
+  where
+  toJSON
+    ExperimentTemplateCloudWatchLogsLogConfigurationInput' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [Prelude.Just ("logGroupArn" Data..= logGroupArn)]
+        )
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateLogConfiguration.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateLogConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateLogConfiguration.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentTemplateLogConfiguration
+-- 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.FIS.Types.ExperimentTemplateLogConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfiguration
+import Amazonka.FIS.Types.ExperimentTemplateS3LogConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the configuration for experiment logging.
+--
+-- /See:/ 'newExperimentTemplateLogConfiguration' smart constructor.
+data ExperimentTemplateLogConfiguration = ExperimentTemplateLogConfiguration'
+  { -- | The configuration for experiment logging to Amazon CloudWatch Logs.
+    cloudWatchLogsConfiguration :: Prelude.Maybe ExperimentTemplateCloudWatchLogsLogConfiguration,
+    -- | The schema version.
+    logSchemaVersion :: Prelude.Maybe Prelude.Int,
+    -- | The configuration for experiment logging to Amazon S3.
+    s3Configuration :: Prelude.Maybe ExperimentTemplateS3LogConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateLogConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cloudWatchLogsConfiguration', 'experimentTemplateLogConfiguration_cloudWatchLogsConfiguration' - The configuration for experiment logging to Amazon CloudWatch Logs.
+--
+-- 'logSchemaVersion', 'experimentTemplateLogConfiguration_logSchemaVersion' - The schema version.
+--
+-- 's3Configuration', 'experimentTemplateLogConfiguration_s3Configuration' - The configuration for experiment logging to Amazon S3.
+newExperimentTemplateLogConfiguration ::
+  ExperimentTemplateLogConfiguration
+newExperimentTemplateLogConfiguration =
+  ExperimentTemplateLogConfiguration'
+    { cloudWatchLogsConfiguration =
+        Prelude.Nothing,
+      logSchemaVersion = Prelude.Nothing,
+      s3Configuration = Prelude.Nothing
+    }
+
+-- | The configuration for experiment logging to Amazon CloudWatch Logs.
+experimentTemplateLogConfiguration_cloudWatchLogsConfiguration :: Lens.Lens' ExperimentTemplateLogConfiguration (Prelude.Maybe ExperimentTemplateCloudWatchLogsLogConfiguration)
+experimentTemplateLogConfiguration_cloudWatchLogsConfiguration = Lens.lens (\ExperimentTemplateLogConfiguration' {cloudWatchLogsConfiguration} -> cloudWatchLogsConfiguration) (\s@ExperimentTemplateLogConfiguration' {} a -> s {cloudWatchLogsConfiguration = a} :: ExperimentTemplateLogConfiguration)
+
+-- | The schema version.
+experimentTemplateLogConfiguration_logSchemaVersion :: Lens.Lens' ExperimentTemplateLogConfiguration (Prelude.Maybe Prelude.Int)
+experimentTemplateLogConfiguration_logSchemaVersion = Lens.lens (\ExperimentTemplateLogConfiguration' {logSchemaVersion} -> logSchemaVersion) (\s@ExperimentTemplateLogConfiguration' {} a -> s {logSchemaVersion = a} :: ExperimentTemplateLogConfiguration)
+
+-- | The configuration for experiment logging to Amazon S3.
+experimentTemplateLogConfiguration_s3Configuration :: Lens.Lens' ExperimentTemplateLogConfiguration (Prelude.Maybe ExperimentTemplateS3LogConfiguration)
+experimentTemplateLogConfiguration_s3Configuration = Lens.lens (\ExperimentTemplateLogConfiguration' {s3Configuration} -> s3Configuration) (\s@ExperimentTemplateLogConfiguration' {} a -> s {s3Configuration = a} :: ExperimentTemplateLogConfiguration)
+
+instance
+  Data.FromJSON
+    ExperimentTemplateLogConfiguration
+  where
+  parseJSON =
+    Data.withObject
+      "ExperimentTemplateLogConfiguration"
+      ( \x ->
+          ExperimentTemplateLogConfiguration'
+            Prelude.<$> (x Data..:? "cloudWatchLogsConfiguration")
+            Prelude.<*> (x Data..:? "logSchemaVersion")
+            Prelude.<*> (x Data..:? "s3Configuration")
+      )
+
+instance
+  Prelude.Hashable
+    ExperimentTemplateLogConfiguration
+  where
+  hashWithSalt
+    _salt
+    ExperimentTemplateLogConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` cloudWatchLogsConfiguration
+        `Prelude.hashWithSalt` logSchemaVersion
+        `Prelude.hashWithSalt` s3Configuration
+
+instance
+  Prelude.NFData
+    ExperimentTemplateLogConfiguration
+  where
+  rnf ExperimentTemplateLogConfiguration' {..} =
+    Prelude.rnf cloudWatchLogsConfiguration
+      `Prelude.seq` Prelude.rnf logSchemaVersion
+      `Prelude.seq` Prelude.rnf s3Configuration
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateS3LogConfiguration.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateS3LogConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateS3LogConfiguration.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentTemplateS3LogConfiguration
+-- 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.FIS.Types.ExperimentTemplateS3LogConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the configuration for experiment logging to Amazon S3.
+--
+-- /See:/ 'newExperimentTemplateS3LogConfiguration' smart constructor.
+data ExperimentTemplateS3LogConfiguration = ExperimentTemplateS3LogConfiguration'
+  { -- | The name of the destination bucket.
+    bucketName :: Prelude.Maybe Prelude.Text,
+    -- | The bucket prefix.
+    prefix :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateS3LogConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'bucketName', 'experimentTemplateS3LogConfiguration_bucketName' - The name of the destination bucket.
+--
+-- 'prefix', 'experimentTemplateS3LogConfiguration_prefix' - The bucket prefix.
+newExperimentTemplateS3LogConfiguration ::
+  ExperimentTemplateS3LogConfiguration
+newExperimentTemplateS3LogConfiguration =
+  ExperimentTemplateS3LogConfiguration'
+    { bucketName =
+        Prelude.Nothing,
+      prefix = Prelude.Nothing
+    }
+
+-- | The name of the destination bucket.
+experimentTemplateS3LogConfiguration_bucketName :: Lens.Lens' ExperimentTemplateS3LogConfiguration (Prelude.Maybe Prelude.Text)
+experimentTemplateS3LogConfiguration_bucketName = Lens.lens (\ExperimentTemplateS3LogConfiguration' {bucketName} -> bucketName) (\s@ExperimentTemplateS3LogConfiguration' {} a -> s {bucketName = a} :: ExperimentTemplateS3LogConfiguration)
+
+-- | The bucket prefix.
+experimentTemplateS3LogConfiguration_prefix :: Lens.Lens' ExperimentTemplateS3LogConfiguration (Prelude.Maybe Prelude.Text)
+experimentTemplateS3LogConfiguration_prefix = Lens.lens (\ExperimentTemplateS3LogConfiguration' {prefix} -> prefix) (\s@ExperimentTemplateS3LogConfiguration' {} a -> s {prefix = a} :: ExperimentTemplateS3LogConfiguration)
+
+instance
+  Data.FromJSON
+    ExperimentTemplateS3LogConfiguration
+  where
+  parseJSON =
+    Data.withObject
+      "ExperimentTemplateS3LogConfiguration"
+      ( \x ->
+          ExperimentTemplateS3LogConfiguration'
+            Prelude.<$> (x Data..:? "bucketName")
+            Prelude.<*> (x Data..:? "prefix")
+      )
+
+instance
+  Prelude.Hashable
+    ExperimentTemplateS3LogConfiguration
+  where
+  hashWithSalt
+    _salt
+    ExperimentTemplateS3LogConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` bucketName
+        `Prelude.hashWithSalt` prefix
+
+instance
+  Prelude.NFData
+    ExperimentTemplateS3LogConfiguration
+  where
+  rnf ExperimentTemplateS3LogConfiguration' {..} =
+    Prelude.rnf bucketName
+      `Prelude.seq` Prelude.rnf prefix
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateS3LogConfigurationInput.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateS3LogConfigurationInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateS3LogConfigurationInput.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentTemplateS3LogConfigurationInput
+-- 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.FIS.Types.ExperimentTemplateS3LogConfigurationInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies the configuration for experiment logging to Amazon S3.
+--
+-- /See:/ 'newExperimentTemplateS3LogConfigurationInput' smart constructor.
+data ExperimentTemplateS3LogConfigurationInput = ExperimentTemplateS3LogConfigurationInput'
+  { -- | The bucket prefix.
+    prefix :: Prelude.Maybe Prelude.Text,
+    -- | The name of the destination bucket.
+    bucketName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateS3LogConfigurationInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'prefix', 'experimentTemplateS3LogConfigurationInput_prefix' - The bucket prefix.
+--
+-- 'bucketName', 'experimentTemplateS3LogConfigurationInput_bucketName' - The name of the destination bucket.
+newExperimentTemplateS3LogConfigurationInput ::
+  -- | 'bucketName'
+  Prelude.Text ->
+  ExperimentTemplateS3LogConfigurationInput
+newExperimentTemplateS3LogConfigurationInput
+  pBucketName_ =
+    ExperimentTemplateS3LogConfigurationInput'
+      { prefix =
+          Prelude.Nothing,
+        bucketName = pBucketName_
+      }
+
+-- | The bucket prefix.
+experimentTemplateS3LogConfigurationInput_prefix :: Lens.Lens' ExperimentTemplateS3LogConfigurationInput (Prelude.Maybe Prelude.Text)
+experimentTemplateS3LogConfigurationInput_prefix = Lens.lens (\ExperimentTemplateS3LogConfigurationInput' {prefix} -> prefix) (\s@ExperimentTemplateS3LogConfigurationInput' {} a -> s {prefix = a} :: ExperimentTemplateS3LogConfigurationInput)
+
+-- | The name of the destination bucket.
+experimentTemplateS3LogConfigurationInput_bucketName :: Lens.Lens' ExperimentTemplateS3LogConfigurationInput Prelude.Text
+experimentTemplateS3LogConfigurationInput_bucketName = Lens.lens (\ExperimentTemplateS3LogConfigurationInput' {bucketName} -> bucketName) (\s@ExperimentTemplateS3LogConfigurationInput' {} a -> s {bucketName = a} :: ExperimentTemplateS3LogConfigurationInput)
+
+instance
+  Prelude.Hashable
+    ExperimentTemplateS3LogConfigurationInput
+  where
+  hashWithSalt
+    _salt
+    ExperimentTemplateS3LogConfigurationInput' {..} =
+      _salt
+        `Prelude.hashWithSalt` prefix
+        `Prelude.hashWithSalt` bucketName
+
+instance
+  Prelude.NFData
+    ExperimentTemplateS3LogConfigurationInput
+  where
+  rnf ExperimentTemplateS3LogConfigurationInput' {..} =
+    Prelude.rnf prefix
+      `Prelude.seq` Prelude.rnf bucketName
+
+instance
+  Data.ToJSON
+    ExperimentTemplateS3LogConfigurationInput
+  where
+  toJSON ExperimentTemplateS3LogConfigurationInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("prefix" Data..=) Prelude.<$> prefix,
+            Prelude.Just ("bucketName" Data..= bucketName)
+          ]
+      )
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateStopCondition.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateStopCondition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateStopCondition.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentTemplateStopCondition
+-- 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.FIS.Types.ExperimentTemplateStopCondition where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a stop condition for an experiment template.
+--
+-- /See:/ 'newExperimentTemplateStopCondition' smart constructor.
+data ExperimentTemplateStopCondition = ExperimentTemplateStopCondition'
+  { -- | The source for the stop condition.
+    source :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the CloudWatch alarm, if applicable.
+    value :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateStopCondition' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'source', 'experimentTemplateStopCondition_source' - The source for the stop condition.
+--
+-- 'value', 'experimentTemplateStopCondition_value' - The Amazon Resource Name (ARN) of the CloudWatch alarm, if applicable.
+newExperimentTemplateStopCondition ::
+  ExperimentTemplateStopCondition
+newExperimentTemplateStopCondition =
+  ExperimentTemplateStopCondition'
+    { source =
+        Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | The source for the stop condition.
+experimentTemplateStopCondition_source :: Lens.Lens' ExperimentTemplateStopCondition (Prelude.Maybe Prelude.Text)
+experimentTemplateStopCondition_source = Lens.lens (\ExperimentTemplateStopCondition' {source} -> source) (\s@ExperimentTemplateStopCondition' {} a -> s {source = a} :: ExperimentTemplateStopCondition)
+
+-- | The Amazon Resource Name (ARN) of the CloudWatch alarm, if applicable.
+experimentTemplateStopCondition_value :: Lens.Lens' ExperimentTemplateStopCondition (Prelude.Maybe Prelude.Text)
+experimentTemplateStopCondition_value = Lens.lens (\ExperimentTemplateStopCondition' {value} -> value) (\s@ExperimentTemplateStopCondition' {} a -> s {value = a} :: ExperimentTemplateStopCondition)
+
+instance
+  Data.FromJSON
+    ExperimentTemplateStopCondition
+  where
+  parseJSON =
+    Data.withObject
+      "ExperimentTemplateStopCondition"
+      ( \x ->
+          ExperimentTemplateStopCondition'
+            Prelude.<$> (x Data..:? "source")
+            Prelude.<*> (x Data..:? "value")
+      )
+
+instance
+  Prelude.Hashable
+    ExperimentTemplateStopCondition
+  where
+  hashWithSalt
+    _salt
+    ExperimentTemplateStopCondition' {..} =
+      _salt
+        `Prelude.hashWithSalt` source
+        `Prelude.hashWithSalt` value
+
+instance
+  Prelude.NFData
+    ExperimentTemplateStopCondition
+  where
+  rnf ExperimentTemplateStopCondition' {..} =
+    Prelude.rnf source `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateSummary.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateSummary.hs
@@ -0,0 +1,121 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentTemplateSummary
+-- 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.FIS.Types.ExperimentTemplateSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of an experiment template.
+--
+-- /See:/ 'newExperimentTemplateSummary' smart constructor.
+data ExperimentTemplateSummary = ExperimentTemplateSummary'
+  { -- | The time that the experiment template was created.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | The description of the experiment template.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the experiment template.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The time that the experiment template was last updated.
+    lastUpdateTime :: Prelude.Maybe Data.POSIX,
+    -- | The tags for the experiment template.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationTime', 'experimentTemplateSummary_creationTime' - The time that the experiment template was created.
+--
+-- 'description', 'experimentTemplateSummary_description' - The description of the experiment template.
+--
+-- 'id', 'experimentTemplateSummary_id' - The ID of the experiment template.
+--
+-- 'lastUpdateTime', 'experimentTemplateSummary_lastUpdateTime' - The time that the experiment template was last updated.
+--
+-- 'tags', 'experimentTemplateSummary_tags' - The tags for the experiment template.
+newExperimentTemplateSummary ::
+  ExperimentTemplateSummary
+newExperimentTemplateSummary =
+  ExperimentTemplateSummary'
+    { creationTime =
+        Prelude.Nothing,
+      description = Prelude.Nothing,
+      id = Prelude.Nothing,
+      lastUpdateTime = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | The time that the experiment template was created.
+experimentTemplateSummary_creationTime :: Lens.Lens' ExperimentTemplateSummary (Prelude.Maybe Prelude.UTCTime)
+experimentTemplateSummary_creationTime = Lens.lens (\ExperimentTemplateSummary' {creationTime} -> creationTime) (\s@ExperimentTemplateSummary' {} a -> s {creationTime = a} :: ExperimentTemplateSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The description of the experiment template.
+experimentTemplateSummary_description :: Lens.Lens' ExperimentTemplateSummary (Prelude.Maybe Prelude.Text)
+experimentTemplateSummary_description = Lens.lens (\ExperimentTemplateSummary' {description} -> description) (\s@ExperimentTemplateSummary' {} a -> s {description = a} :: ExperimentTemplateSummary)
+
+-- | The ID of the experiment template.
+experimentTemplateSummary_id :: Lens.Lens' ExperimentTemplateSummary (Prelude.Maybe Prelude.Text)
+experimentTemplateSummary_id = Lens.lens (\ExperimentTemplateSummary' {id} -> id) (\s@ExperimentTemplateSummary' {} a -> s {id = a} :: ExperimentTemplateSummary)
+
+-- | The time that the experiment template was last updated.
+experimentTemplateSummary_lastUpdateTime :: Lens.Lens' ExperimentTemplateSummary (Prelude.Maybe Prelude.UTCTime)
+experimentTemplateSummary_lastUpdateTime = Lens.lens (\ExperimentTemplateSummary' {lastUpdateTime} -> lastUpdateTime) (\s@ExperimentTemplateSummary' {} a -> s {lastUpdateTime = a} :: ExperimentTemplateSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The tags for the experiment template.
+experimentTemplateSummary_tags :: Lens.Lens' ExperimentTemplateSummary (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentTemplateSummary_tags = Lens.lens (\ExperimentTemplateSummary' {tags} -> tags) (\s@ExperimentTemplateSummary' {} a -> s {tags = a} :: ExperimentTemplateSummary) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ExperimentTemplateSummary where
+  parseJSON =
+    Data.withObject
+      "ExperimentTemplateSummary"
+      ( \x ->
+          ExperimentTemplateSummary'
+            Prelude.<$> (x Data..:? "creationTime")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "lastUpdateTime")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ExperimentTemplateSummary where
+  hashWithSalt _salt ExperimentTemplateSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` lastUpdateTime
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData ExperimentTemplateSummary where
+  rnf ExperimentTemplateSummary' {..} =
+    Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf lastUpdateTime
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateTarget.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateTarget.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateTarget.hs
@@ -0,0 +1,137 @@
+{-# 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.FIS.Types.ExperimentTemplateTarget
+-- 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.FIS.Types.ExperimentTemplateTarget where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentTemplateTargetFilter
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a target for an experiment template.
+--
+-- /See:/ 'newExperimentTemplateTarget' smart constructor.
+data ExperimentTemplateTarget = ExperimentTemplateTarget'
+  { -- | The filters to apply to identify target resources using specific
+    -- attributes.
+    filters :: Prelude.Maybe [ExperimentTemplateTargetFilter],
+    -- | The resource type parameters.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The Amazon Resource Names (ARNs) of the targets.
+    resourceArns :: Prelude.Maybe [Prelude.Text],
+    -- | The tags for the target resources.
+    resourceTags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The resource type.
+    resourceType :: Prelude.Maybe Prelude.Text,
+    -- | Scopes the identified resources to a specific count or percentage.
+    selectionMode :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateTarget' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'experimentTemplateTarget_filters' - The filters to apply to identify target resources using specific
+-- attributes.
+--
+-- 'parameters', 'experimentTemplateTarget_parameters' - The resource type parameters.
+--
+-- 'resourceArns', 'experimentTemplateTarget_resourceArns' - The Amazon Resource Names (ARNs) of the targets.
+--
+-- 'resourceTags', 'experimentTemplateTarget_resourceTags' - The tags for the target resources.
+--
+-- 'resourceType', 'experimentTemplateTarget_resourceType' - The resource type.
+--
+-- 'selectionMode', 'experimentTemplateTarget_selectionMode' - Scopes the identified resources to a specific count or percentage.
+newExperimentTemplateTarget ::
+  ExperimentTemplateTarget
+newExperimentTemplateTarget =
+  ExperimentTemplateTarget'
+    { filters =
+        Prelude.Nothing,
+      parameters = Prelude.Nothing,
+      resourceArns = Prelude.Nothing,
+      resourceTags = Prelude.Nothing,
+      resourceType = Prelude.Nothing,
+      selectionMode = Prelude.Nothing
+    }
+
+-- | The filters to apply to identify target resources using specific
+-- attributes.
+experimentTemplateTarget_filters :: Lens.Lens' ExperimentTemplateTarget (Prelude.Maybe [ExperimentTemplateTargetFilter])
+experimentTemplateTarget_filters = Lens.lens (\ExperimentTemplateTarget' {filters} -> filters) (\s@ExperimentTemplateTarget' {} a -> s {filters = a} :: ExperimentTemplateTarget) Prelude.. Lens.mapping Lens.coerced
+
+-- | The resource type parameters.
+experimentTemplateTarget_parameters :: Lens.Lens' ExperimentTemplateTarget (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentTemplateTarget_parameters = Lens.lens (\ExperimentTemplateTarget' {parameters} -> parameters) (\s@ExperimentTemplateTarget' {} a -> s {parameters = a} :: ExperimentTemplateTarget) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Names (ARNs) of the targets.
+experimentTemplateTarget_resourceArns :: Lens.Lens' ExperimentTemplateTarget (Prelude.Maybe [Prelude.Text])
+experimentTemplateTarget_resourceArns = Lens.lens (\ExperimentTemplateTarget' {resourceArns} -> resourceArns) (\s@ExperimentTemplateTarget' {} a -> s {resourceArns = a} :: ExperimentTemplateTarget) Prelude.. Lens.mapping Lens.coerced
+
+-- | The tags for the target resources.
+experimentTemplateTarget_resourceTags :: Lens.Lens' ExperimentTemplateTarget (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+experimentTemplateTarget_resourceTags = Lens.lens (\ExperimentTemplateTarget' {resourceTags} -> resourceTags) (\s@ExperimentTemplateTarget' {} a -> s {resourceTags = a} :: ExperimentTemplateTarget) Prelude.. Lens.mapping Lens.coerced
+
+-- | The resource type.
+experimentTemplateTarget_resourceType :: Lens.Lens' ExperimentTemplateTarget (Prelude.Maybe Prelude.Text)
+experimentTemplateTarget_resourceType = Lens.lens (\ExperimentTemplateTarget' {resourceType} -> resourceType) (\s@ExperimentTemplateTarget' {} a -> s {resourceType = a} :: ExperimentTemplateTarget)
+
+-- | Scopes the identified resources to a specific count or percentage.
+experimentTemplateTarget_selectionMode :: Lens.Lens' ExperimentTemplateTarget (Prelude.Maybe Prelude.Text)
+experimentTemplateTarget_selectionMode = Lens.lens (\ExperimentTemplateTarget' {selectionMode} -> selectionMode) (\s@ExperimentTemplateTarget' {} a -> s {selectionMode = a} :: ExperimentTemplateTarget)
+
+instance Data.FromJSON ExperimentTemplateTarget where
+  parseJSON =
+    Data.withObject
+      "ExperimentTemplateTarget"
+      ( \x ->
+          ExperimentTemplateTarget'
+            Prelude.<$> (x Data..:? "filters" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "parameters" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "resourceArns" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "resourceTags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "resourceType")
+            Prelude.<*> (x Data..:? "selectionMode")
+      )
+
+instance Prelude.Hashable ExperimentTemplateTarget where
+  hashWithSalt _salt ExperimentTemplateTarget' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` parameters
+      `Prelude.hashWithSalt` resourceArns
+      `Prelude.hashWithSalt` resourceTags
+      `Prelude.hashWithSalt` resourceType
+      `Prelude.hashWithSalt` selectionMode
+
+instance Prelude.NFData ExperimentTemplateTarget where
+  rnf ExperimentTemplateTarget' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf resourceArns
+      `Prelude.seq` Prelude.rnf resourceTags
+      `Prelude.seq` Prelude.rnf resourceType
+      `Prelude.seq` Prelude.rnf selectionMode
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateTargetFilter.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateTargetFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateTargetFilter.hs
@@ -0,0 +1,93 @@
+{-# 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.FIS.Types.ExperimentTemplateTargetFilter
+-- 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.FIS.Types.ExperimentTemplateTargetFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a filter used for the target resources in an experiment
+-- template.
+--
+-- /See:/ 'newExperimentTemplateTargetFilter' smart constructor.
+data ExperimentTemplateTargetFilter = ExperimentTemplateTargetFilter'
+  { -- | The attribute path for the filter.
+    path :: Prelude.Maybe Prelude.Text,
+    -- | The attribute values for the filter.
+    values :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateTargetFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'path', 'experimentTemplateTargetFilter_path' - The attribute path for the filter.
+--
+-- 'values', 'experimentTemplateTargetFilter_values' - The attribute values for the filter.
+newExperimentTemplateTargetFilter ::
+  ExperimentTemplateTargetFilter
+newExperimentTemplateTargetFilter =
+  ExperimentTemplateTargetFilter'
+    { path =
+        Prelude.Nothing,
+      values = Prelude.Nothing
+    }
+
+-- | The attribute path for the filter.
+experimentTemplateTargetFilter_path :: Lens.Lens' ExperimentTemplateTargetFilter (Prelude.Maybe Prelude.Text)
+experimentTemplateTargetFilter_path = Lens.lens (\ExperimentTemplateTargetFilter' {path} -> path) (\s@ExperimentTemplateTargetFilter' {} a -> s {path = a} :: ExperimentTemplateTargetFilter)
+
+-- | The attribute values for the filter.
+experimentTemplateTargetFilter_values :: Lens.Lens' ExperimentTemplateTargetFilter (Prelude.Maybe [Prelude.Text])
+experimentTemplateTargetFilter_values = Lens.lens (\ExperimentTemplateTargetFilter' {values} -> values) (\s@ExperimentTemplateTargetFilter' {} a -> s {values = a} :: ExperimentTemplateTargetFilter) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ExperimentTemplateTargetFilter where
+  parseJSON =
+    Data.withObject
+      "ExperimentTemplateTargetFilter"
+      ( \x ->
+          ExperimentTemplateTargetFilter'
+            Prelude.<$> (x Data..:? "path")
+            Prelude.<*> (x Data..:? "values" Data..!= Prelude.mempty)
+      )
+
+instance
+  Prelude.Hashable
+    ExperimentTemplateTargetFilter
+  where
+  hashWithSalt
+    _salt
+    ExperimentTemplateTargetFilter' {..} =
+      _salt
+        `Prelude.hashWithSalt` path
+        `Prelude.hashWithSalt` values
+
+instance
+  Prelude.NFData
+    ExperimentTemplateTargetFilter
+  where
+  rnf ExperimentTemplateTargetFilter' {..} =
+    Prelude.rnf path `Prelude.seq` Prelude.rnf values
diff --git a/gen/Amazonka/FIS/Types/ExperimentTemplateTargetInputFilter.hs b/gen/Amazonka/FIS/Types/ExperimentTemplateTargetInputFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/ExperimentTemplateTargetInputFilter.hs
@@ -0,0 +1,100 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.ExperimentTemplateTargetInputFilter
+-- 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.FIS.Types.ExperimentTemplateTargetInputFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies a filter used for the target resource input in an experiment
+-- template.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/fis/latest/userguide/targets.html#target-filters Resource filters>
+-- in the /Fault Injection Simulator User Guide/.
+--
+-- /See:/ 'newExperimentTemplateTargetInputFilter' smart constructor.
+data ExperimentTemplateTargetInputFilter = ExperimentTemplateTargetInputFilter'
+  { -- | The attribute path for the filter.
+    path :: Prelude.Text,
+    -- | The attribute values for the filter.
+    values :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExperimentTemplateTargetInputFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'path', 'experimentTemplateTargetInputFilter_path' - The attribute path for the filter.
+--
+-- 'values', 'experimentTemplateTargetInputFilter_values' - The attribute values for the filter.
+newExperimentTemplateTargetInputFilter ::
+  -- | 'path'
+  Prelude.Text ->
+  ExperimentTemplateTargetInputFilter
+newExperimentTemplateTargetInputFilter pPath_ =
+  ExperimentTemplateTargetInputFilter'
+    { path = pPath_,
+      values = Prelude.mempty
+    }
+
+-- | The attribute path for the filter.
+experimentTemplateTargetInputFilter_path :: Lens.Lens' ExperimentTemplateTargetInputFilter Prelude.Text
+experimentTemplateTargetInputFilter_path = Lens.lens (\ExperimentTemplateTargetInputFilter' {path} -> path) (\s@ExperimentTemplateTargetInputFilter' {} a -> s {path = a} :: ExperimentTemplateTargetInputFilter)
+
+-- | The attribute values for the filter.
+experimentTemplateTargetInputFilter_values :: Lens.Lens' ExperimentTemplateTargetInputFilter [Prelude.Text]
+experimentTemplateTargetInputFilter_values = Lens.lens (\ExperimentTemplateTargetInputFilter' {values} -> values) (\s@ExperimentTemplateTargetInputFilter' {} a -> s {values = a} :: ExperimentTemplateTargetInputFilter) Prelude.. Lens.coerced
+
+instance
+  Prelude.Hashable
+    ExperimentTemplateTargetInputFilter
+  where
+  hashWithSalt
+    _salt
+    ExperimentTemplateTargetInputFilter' {..} =
+      _salt
+        `Prelude.hashWithSalt` path
+        `Prelude.hashWithSalt` values
+
+instance
+  Prelude.NFData
+    ExperimentTemplateTargetInputFilter
+  where
+  rnf ExperimentTemplateTargetInputFilter' {..} =
+    Prelude.rnf path `Prelude.seq` Prelude.rnf values
+
+instance
+  Data.ToJSON
+    ExperimentTemplateTargetInputFilter
+  where
+  toJSON ExperimentTemplateTargetInputFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("path" Data..= path),
+            Prelude.Just ("values" Data..= values)
+          ]
+      )
diff --git a/gen/Amazonka/FIS/Types/TargetResourceType.hs b/gen/Amazonka/FIS/Types/TargetResourceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/TargetResourceType.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.TargetResourceType
+-- 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.FIS.Types.TargetResourceType where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.TargetResourceTypeParameter
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a resource type.
+--
+-- /See:/ 'newTargetResourceType' smart constructor.
+data TargetResourceType = TargetResourceType'
+  { -- | A description of the resource type.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The parameters for the resource type.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text TargetResourceTypeParameter),
+    -- | The resource type.
+    resourceType :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TargetResourceType' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'targetResourceType_description' - A description of the resource type.
+--
+-- 'parameters', 'targetResourceType_parameters' - The parameters for the resource type.
+--
+-- 'resourceType', 'targetResourceType_resourceType' - The resource type.
+newTargetResourceType ::
+  TargetResourceType
+newTargetResourceType =
+  TargetResourceType'
+    { description = Prelude.Nothing,
+      parameters = Prelude.Nothing,
+      resourceType = Prelude.Nothing
+    }
+
+-- | A description of the resource type.
+targetResourceType_description :: Lens.Lens' TargetResourceType (Prelude.Maybe Prelude.Text)
+targetResourceType_description = Lens.lens (\TargetResourceType' {description} -> description) (\s@TargetResourceType' {} a -> s {description = a} :: TargetResourceType)
+
+-- | The parameters for the resource type.
+targetResourceType_parameters :: Lens.Lens' TargetResourceType (Prelude.Maybe (Prelude.HashMap Prelude.Text TargetResourceTypeParameter))
+targetResourceType_parameters = Lens.lens (\TargetResourceType' {parameters} -> parameters) (\s@TargetResourceType' {} a -> s {parameters = a} :: TargetResourceType) Prelude.. Lens.mapping Lens.coerced
+
+-- | The resource type.
+targetResourceType_resourceType :: Lens.Lens' TargetResourceType (Prelude.Maybe Prelude.Text)
+targetResourceType_resourceType = Lens.lens (\TargetResourceType' {resourceType} -> resourceType) (\s@TargetResourceType' {} a -> s {resourceType = a} :: TargetResourceType)
+
+instance Data.FromJSON TargetResourceType where
+  parseJSON =
+    Data.withObject
+      "TargetResourceType"
+      ( \x ->
+          TargetResourceType'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "parameters" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "resourceType")
+      )
+
+instance Prelude.Hashable TargetResourceType where
+  hashWithSalt _salt TargetResourceType' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` parameters
+      `Prelude.hashWithSalt` resourceType
+
+instance Prelude.NFData TargetResourceType where
+  rnf TargetResourceType' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf resourceType
diff --git a/gen/Amazonka/FIS/Types/TargetResourceTypeParameter.hs b/gen/Amazonka/FIS/Types/TargetResourceTypeParameter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/TargetResourceTypeParameter.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.TargetResourceTypeParameter
+-- 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.FIS.Types.TargetResourceTypeParameter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the parameters for a resource type. Use parameters to
+-- determine which tasks are identified during target resolution.
+--
+-- /See:/ 'newTargetResourceTypeParameter' smart constructor.
+data TargetResourceTypeParameter = TargetResourceTypeParameter'
+  { -- | A description of the parameter.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | Indicates whether the parameter is required.
+    required :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TargetResourceTypeParameter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'targetResourceTypeParameter_description' - A description of the parameter.
+--
+-- 'required', 'targetResourceTypeParameter_required' - Indicates whether the parameter is required.
+newTargetResourceTypeParameter ::
+  TargetResourceTypeParameter
+newTargetResourceTypeParameter =
+  TargetResourceTypeParameter'
+    { description =
+        Prelude.Nothing,
+      required = Prelude.Nothing
+    }
+
+-- | A description of the parameter.
+targetResourceTypeParameter_description :: Lens.Lens' TargetResourceTypeParameter (Prelude.Maybe Prelude.Text)
+targetResourceTypeParameter_description = Lens.lens (\TargetResourceTypeParameter' {description} -> description) (\s@TargetResourceTypeParameter' {} a -> s {description = a} :: TargetResourceTypeParameter)
+
+-- | Indicates whether the parameter is required.
+targetResourceTypeParameter_required :: Lens.Lens' TargetResourceTypeParameter (Prelude.Maybe Prelude.Bool)
+targetResourceTypeParameter_required = Lens.lens (\TargetResourceTypeParameter' {required} -> required) (\s@TargetResourceTypeParameter' {} a -> s {required = a} :: TargetResourceTypeParameter)
+
+instance Data.FromJSON TargetResourceTypeParameter where
+  parseJSON =
+    Data.withObject
+      "TargetResourceTypeParameter"
+      ( \x ->
+          TargetResourceTypeParameter'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "required")
+      )
+
+instance Prelude.Hashable TargetResourceTypeParameter where
+  hashWithSalt _salt TargetResourceTypeParameter' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` required
+
+instance Prelude.NFData TargetResourceTypeParameter where
+  rnf TargetResourceTypeParameter' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf required
diff --git a/gen/Amazonka/FIS/Types/TargetResourceTypeSummary.hs b/gen/Amazonka/FIS/Types/TargetResourceTypeSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/TargetResourceTypeSummary.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.TargetResourceTypeSummary
+-- 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.FIS.Types.TargetResourceTypeSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a resource type.
+--
+-- /See:/ 'newTargetResourceTypeSummary' smart constructor.
+data TargetResourceTypeSummary = TargetResourceTypeSummary'
+  { -- | A description of the resource type.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The resource type.
+    resourceType :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TargetResourceTypeSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'targetResourceTypeSummary_description' - A description of the resource type.
+--
+-- 'resourceType', 'targetResourceTypeSummary_resourceType' - The resource type.
+newTargetResourceTypeSummary ::
+  TargetResourceTypeSummary
+newTargetResourceTypeSummary =
+  TargetResourceTypeSummary'
+    { description =
+        Prelude.Nothing,
+      resourceType = Prelude.Nothing
+    }
+
+-- | A description of the resource type.
+targetResourceTypeSummary_description :: Lens.Lens' TargetResourceTypeSummary (Prelude.Maybe Prelude.Text)
+targetResourceTypeSummary_description = Lens.lens (\TargetResourceTypeSummary' {description} -> description) (\s@TargetResourceTypeSummary' {} a -> s {description = a} :: TargetResourceTypeSummary)
+
+-- | The resource type.
+targetResourceTypeSummary_resourceType :: Lens.Lens' TargetResourceTypeSummary (Prelude.Maybe Prelude.Text)
+targetResourceTypeSummary_resourceType = Lens.lens (\TargetResourceTypeSummary' {resourceType} -> resourceType) (\s@TargetResourceTypeSummary' {} a -> s {resourceType = a} :: TargetResourceTypeSummary)
+
+instance Data.FromJSON TargetResourceTypeSummary where
+  parseJSON =
+    Data.withObject
+      "TargetResourceTypeSummary"
+      ( \x ->
+          TargetResourceTypeSummary'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "resourceType")
+      )
+
+instance Prelude.Hashable TargetResourceTypeSummary where
+  hashWithSalt _salt TargetResourceTypeSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` resourceType
+
+instance Prelude.NFData TargetResourceTypeSummary where
+  rnf TargetResourceTypeSummary' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf resourceType
diff --git a/gen/Amazonka/FIS/Types/UpdateExperimentTemplateActionInputItem.hs b/gen/Amazonka/FIS/Types/UpdateExperimentTemplateActionInputItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/UpdateExperimentTemplateActionInputItem.hs
@@ -0,0 +1,137 @@
+{-# 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.FIS.Types.UpdateExperimentTemplateActionInputItem
+-- 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.FIS.Types.UpdateExperimentTemplateActionInputItem where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies an action for an experiment template.
+--
+-- /See:/ 'newUpdateExperimentTemplateActionInputItem' smart constructor.
+data UpdateExperimentTemplateActionInputItem = UpdateExperimentTemplateActionInputItem'
+  { -- | The ID of the action.
+    actionId :: Prelude.Maybe Prelude.Text,
+    -- | A description for the action.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The parameters for the action, if applicable.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of the action that must be completed before the current action
+    -- starts. Omit this parameter to run the action at the start of the
+    -- experiment.
+    startAfter :: Prelude.Maybe [Prelude.Text],
+    -- | The targets for the action.
+    targets :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateExperimentTemplateActionInputItem' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'actionId', 'updateExperimentTemplateActionInputItem_actionId' - The ID of the action.
+--
+-- 'description', 'updateExperimentTemplateActionInputItem_description' - A description for the action.
+--
+-- 'parameters', 'updateExperimentTemplateActionInputItem_parameters' - The parameters for the action, if applicable.
+--
+-- 'startAfter', 'updateExperimentTemplateActionInputItem_startAfter' - The name of the action that must be completed before the current action
+-- starts. Omit this parameter to run the action at the start of the
+-- experiment.
+--
+-- 'targets', 'updateExperimentTemplateActionInputItem_targets' - The targets for the action.
+newUpdateExperimentTemplateActionInputItem ::
+  UpdateExperimentTemplateActionInputItem
+newUpdateExperimentTemplateActionInputItem =
+  UpdateExperimentTemplateActionInputItem'
+    { actionId =
+        Prelude.Nothing,
+      description = Prelude.Nothing,
+      parameters = Prelude.Nothing,
+      startAfter = Prelude.Nothing,
+      targets = Prelude.Nothing
+    }
+
+-- | The ID of the action.
+updateExperimentTemplateActionInputItem_actionId :: Lens.Lens' UpdateExperimentTemplateActionInputItem (Prelude.Maybe Prelude.Text)
+updateExperimentTemplateActionInputItem_actionId = Lens.lens (\UpdateExperimentTemplateActionInputItem' {actionId} -> actionId) (\s@UpdateExperimentTemplateActionInputItem' {} a -> s {actionId = a} :: UpdateExperimentTemplateActionInputItem)
+
+-- | A description for the action.
+updateExperimentTemplateActionInputItem_description :: Lens.Lens' UpdateExperimentTemplateActionInputItem (Prelude.Maybe Prelude.Text)
+updateExperimentTemplateActionInputItem_description = Lens.lens (\UpdateExperimentTemplateActionInputItem' {description} -> description) (\s@UpdateExperimentTemplateActionInputItem' {} a -> s {description = a} :: UpdateExperimentTemplateActionInputItem)
+
+-- | The parameters for the action, if applicable.
+updateExperimentTemplateActionInputItem_parameters :: Lens.Lens' UpdateExperimentTemplateActionInputItem (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+updateExperimentTemplateActionInputItem_parameters = Lens.lens (\UpdateExperimentTemplateActionInputItem' {parameters} -> parameters) (\s@UpdateExperimentTemplateActionInputItem' {} a -> s {parameters = a} :: UpdateExperimentTemplateActionInputItem) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the action that must be completed before the current action
+-- starts. Omit this parameter to run the action at the start of the
+-- experiment.
+updateExperimentTemplateActionInputItem_startAfter :: Lens.Lens' UpdateExperimentTemplateActionInputItem (Prelude.Maybe [Prelude.Text])
+updateExperimentTemplateActionInputItem_startAfter = Lens.lens (\UpdateExperimentTemplateActionInputItem' {startAfter} -> startAfter) (\s@UpdateExperimentTemplateActionInputItem' {} a -> s {startAfter = a} :: UpdateExperimentTemplateActionInputItem) Prelude.. Lens.mapping Lens.coerced
+
+-- | The targets for the action.
+updateExperimentTemplateActionInputItem_targets :: Lens.Lens' UpdateExperimentTemplateActionInputItem (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+updateExperimentTemplateActionInputItem_targets = Lens.lens (\UpdateExperimentTemplateActionInputItem' {targets} -> targets) (\s@UpdateExperimentTemplateActionInputItem' {} a -> s {targets = a} :: UpdateExperimentTemplateActionInputItem) Prelude.. Lens.mapping Lens.coerced
+
+instance
+  Prelude.Hashable
+    UpdateExperimentTemplateActionInputItem
+  where
+  hashWithSalt
+    _salt
+    UpdateExperimentTemplateActionInputItem' {..} =
+      _salt
+        `Prelude.hashWithSalt` actionId
+        `Prelude.hashWithSalt` description
+        `Prelude.hashWithSalt` parameters
+        `Prelude.hashWithSalt` startAfter
+        `Prelude.hashWithSalt` targets
+
+instance
+  Prelude.NFData
+    UpdateExperimentTemplateActionInputItem
+  where
+  rnf UpdateExperimentTemplateActionInputItem' {..} =
+    Prelude.rnf actionId
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf startAfter
+      `Prelude.seq` Prelude.rnf targets
+
+instance
+  Data.ToJSON
+    UpdateExperimentTemplateActionInputItem
+  where
+  toJSON UpdateExperimentTemplateActionInputItem' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("actionId" Data..=) Prelude.<$> actionId,
+            ("description" Data..=) Prelude.<$> description,
+            ("parameters" Data..=) Prelude.<$> parameters,
+            ("startAfter" Data..=) Prelude.<$> startAfter,
+            ("targets" Data..=) Prelude.<$> targets
+          ]
+      )
diff --git a/gen/Amazonka/FIS/Types/UpdateExperimentTemplateLogConfigurationInput.hs b/gen/Amazonka/FIS/Types/UpdateExperimentTemplateLogConfigurationInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/UpdateExperimentTemplateLogConfigurationInput.hs
@@ -0,0 +1,116 @@
+{-# 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.FIS.Types.UpdateExperimentTemplateLogConfigurationInput
+-- 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.FIS.Types.UpdateExperimentTemplateLogConfigurationInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentTemplateCloudWatchLogsLogConfigurationInput
+import Amazonka.FIS.Types.ExperimentTemplateS3LogConfigurationInput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies the configuration for experiment logging.
+--
+-- /See:/ 'newUpdateExperimentTemplateLogConfigurationInput' smart constructor.
+data UpdateExperimentTemplateLogConfigurationInput = UpdateExperimentTemplateLogConfigurationInput'
+  { -- | The configuration for experiment logging to Amazon CloudWatch Logs.
+    cloudWatchLogsConfiguration :: Prelude.Maybe ExperimentTemplateCloudWatchLogsLogConfigurationInput,
+    -- | The schema version.
+    logSchemaVersion :: Prelude.Maybe Prelude.Int,
+    -- | The configuration for experiment logging to Amazon S3.
+    s3Configuration :: Prelude.Maybe ExperimentTemplateS3LogConfigurationInput
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateExperimentTemplateLogConfigurationInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cloudWatchLogsConfiguration', 'updateExperimentTemplateLogConfigurationInput_cloudWatchLogsConfiguration' - The configuration for experiment logging to Amazon CloudWatch Logs.
+--
+-- 'logSchemaVersion', 'updateExperimentTemplateLogConfigurationInput_logSchemaVersion' - The schema version.
+--
+-- 's3Configuration', 'updateExperimentTemplateLogConfigurationInput_s3Configuration' - The configuration for experiment logging to Amazon S3.
+newUpdateExperimentTemplateLogConfigurationInput ::
+  UpdateExperimentTemplateLogConfigurationInput
+newUpdateExperimentTemplateLogConfigurationInput =
+  UpdateExperimentTemplateLogConfigurationInput'
+    { cloudWatchLogsConfiguration =
+        Prelude.Nothing,
+      logSchemaVersion =
+        Prelude.Nothing,
+      s3Configuration =
+        Prelude.Nothing
+    }
+
+-- | The configuration for experiment logging to Amazon CloudWatch Logs.
+updateExperimentTemplateLogConfigurationInput_cloudWatchLogsConfiguration :: Lens.Lens' UpdateExperimentTemplateLogConfigurationInput (Prelude.Maybe ExperimentTemplateCloudWatchLogsLogConfigurationInput)
+updateExperimentTemplateLogConfigurationInput_cloudWatchLogsConfiguration = Lens.lens (\UpdateExperimentTemplateLogConfigurationInput' {cloudWatchLogsConfiguration} -> cloudWatchLogsConfiguration) (\s@UpdateExperimentTemplateLogConfigurationInput' {} a -> s {cloudWatchLogsConfiguration = a} :: UpdateExperimentTemplateLogConfigurationInput)
+
+-- | The schema version.
+updateExperimentTemplateLogConfigurationInput_logSchemaVersion :: Lens.Lens' UpdateExperimentTemplateLogConfigurationInput (Prelude.Maybe Prelude.Int)
+updateExperimentTemplateLogConfigurationInput_logSchemaVersion = Lens.lens (\UpdateExperimentTemplateLogConfigurationInput' {logSchemaVersion} -> logSchemaVersion) (\s@UpdateExperimentTemplateLogConfigurationInput' {} a -> s {logSchemaVersion = a} :: UpdateExperimentTemplateLogConfigurationInput)
+
+-- | The configuration for experiment logging to Amazon S3.
+updateExperimentTemplateLogConfigurationInput_s3Configuration :: Lens.Lens' UpdateExperimentTemplateLogConfigurationInput (Prelude.Maybe ExperimentTemplateS3LogConfigurationInput)
+updateExperimentTemplateLogConfigurationInput_s3Configuration = Lens.lens (\UpdateExperimentTemplateLogConfigurationInput' {s3Configuration} -> s3Configuration) (\s@UpdateExperimentTemplateLogConfigurationInput' {} a -> s {s3Configuration = a} :: UpdateExperimentTemplateLogConfigurationInput)
+
+instance
+  Prelude.Hashable
+    UpdateExperimentTemplateLogConfigurationInput
+  where
+  hashWithSalt
+    _salt
+    UpdateExperimentTemplateLogConfigurationInput' {..} =
+      _salt
+        `Prelude.hashWithSalt` cloudWatchLogsConfiguration
+        `Prelude.hashWithSalt` logSchemaVersion
+        `Prelude.hashWithSalt` s3Configuration
+
+instance
+  Prelude.NFData
+    UpdateExperimentTemplateLogConfigurationInput
+  where
+  rnf
+    UpdateExperimentTemplateLogConfigurationInput' {..} =
+      Prelude.rnf cloudWatchLogsConfiguration
+        `Prelude.seq` Prelude.rnf logSchemaVersion
+        `Prelude.seq` Prelude.rnf s3Configuration
+
+instance
+  Data.ToJSON
+    UpdateExperimentTemplateLogConfigurationInput
+  where
+  toJSON
+    UpdateExperimentTemplateLogConfigurationInput' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [ ("cloudWatchLogsConfiguration" Data..=)
+                Prelude.<$> cloudWatchLogsConfiguration,
+              ("logSchemaVersion" Data..=)
+                Prelude.<$> logSchemaVersion,
+              ("s3Configuration" Data..=)
+                Prelude.<$> s3Configuration
+            ]
+        )
diff --git a/gen/Amazonka/FIS/Types/UpdateExperimentTemplateStopConditionInput.hs b/gen/Amazonka/FIS/Types/UpdateExperimentTemplateStopConditionInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/UpdateExperimentTemplateStopConditionInput.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.FIS.Types.UpdateExperimentTemplateStopConditionInput
+-- 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.FIS.Types.UpdateExperimentTemplateStopConditionInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies a stop condition for an experiment. You can define a stop
+-- condition as a CloudWatch alarm.
+--
+-- /See:/ 'newUpdateExperimentTemplateStopConditionInput' smart constructor.
+data UpdateExperimentTemplateStopConditionInput = UpdateExperimentTemplateStopConditionInput'
+  { -- | The Amazon Resource Name (ARN) of the CloudWatch alarm.
+    value :: Prelude.Maybe Prelude.Text,
+    -- | The source for the stop condition. Specify @aws:cloudwatch:alarm@ if the
+    -- stop condition is defined by a CloudWatch alarm. Specify @none@ if there
+    -- is no stop condition.
+    source :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateExperimentTemplateStopConditionInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'value', 'updateExperimentTemplateStopConditionInput_value' - The Amazon Resource Name (ARN) of the CloudWatch alarm.
+--
+-- 'source', 'updateExperimentTemplateStopConditionInput_source' - The source for the stop condition. Specify @aws:cloudwatch:alarm@ if the
+-- stop condition is defined by a CloudWatch alarm. Specify @none@ if there
+-- is no stop condition.
+newUpdateExperimentTemplateStopConditionInput ::
+  -- | 'source'
+  Prelude.Text ->
+  UpdateExperimentTemplateStopConditionInput
+newUpdateExperimentTemplateStopConditionInput
+  pSource_ =
+    UpdateExperimentTemplateStopConditionInput'
+      { value =
+          Prelude.Nothing,
+        source = pSource_
+      }
+
+-- | The Amazon Resource Name (ARN) of the CloudWatch alarm.
+updateExperimentTemplateStopConditionInput_value :: Lens.Lens' UpdateExperimentTemplateStopConditionInput (Prelude.Maybe Prelude.Text)
+updateExperimentTemplateStopConditionInput_value = Lens.lens (\UpdateExperimentTemplateStopConditionInput' {value} -> value) (\s@UpdateExperimentTemplateStopConditionInput' {} a -> s {value = a} :: UpdateExperimentTemplateStopConditionInput)
+
+-- | The source for the stop condition. Specify @aws:cloudwatch:alarm@ if the
+-- stop condition is defined by a CloudWatch alarm. Specify @none@ if there
+-- is no stop condition.
+updateExperimentTemplateStopConditionInput_source :: Lens.Lens' UpdateExperimentTemplateStopConditionInput Prelude.Text
+updateExperimentTemplateStopConditionInput_source = Lens.lens (\UpdateExperimentTemplateStopConditionInput' {source} -> source) (\s@UpdateExperimentTemplateStopConditionInput' {} a -> s {source = a} :: UpdateExperimentTemplateStopConditionInput)
+
+instance
+  Prelude.Hashable
+    UpdateExperimentTemplateStopConditionInput
+  where
+  hashWithSalt
+    _salt
+    UpdateExperimentTemplateStopConditionInput' {..} =
+      _salt
+        `Prelude.hashWithSalt` value
+        `Prelude.hashWithSalt` source
+
+instance
+  Prelude.NFData
+    UpdateExperimentTemplateStopConditionInput
+  where
+  rnf UpdateExperimentTemplateStopConditionInput' {..} =
+    Prelude.rnf value `Prelude.seq` Prelude.rnf source
+
+instance
+  Data.ToJSON
+    UpdateExperimentTemplateStopConditionInput
+  where
+  toJSON
+    UpdateExperimentTemplateStopConditionInput' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [ ("value" Data..=) Prelude.<$> value,
+              Prelude.Just ("source" Data..= source)
+            ]
+        )
diff --git a/gen/Amazonka/FIS/Types/UpdateExperimentTemplateTargetInput.hs b/gen/Amazonka/FIS/Types/UpdateExperimentTemplateTargetInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/Types/UpdateExperimentTemplateTargetInput.hs
@@ -0,0 +1,159 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.Types.UpdateExperimentTemplateTargetInput
+-- 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.FIS.Types.UpdateExperimentTemplateTargetInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types.ExperimentTemplateTargetInputFilter
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies a target for an experiment. You must specify at least one
+-- Amazon Resource Name (ARN) or at least one resource tag. You cannot
+-- specify both.
+--
+-- /See:/ 'newUpdateExperimentTemplateTargetInput' smart constructor.
+data UpdateExperimentTemplateTargetInput = UpdateExperimentTemplateTargetInput'
+  { -- | The filters to apply to identify target resources using specific
+    -- attributes.
+    filters :: Prelude.Maybe [ExperimentTemplateTargetInputFilter],
+    -- | The resource type parameters.
+    parameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The Amazon Resource Names (ARNs) of the targets.
+    resourceArns :: Prelude.Maybe [Prelude.Text],
+    -- | The tags for the target resources.
+    resourceTags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The resource type. The resource type must be supported for the specified
+    -- action.
+    resourceType :: Prelude.Text,
+    -- | Scopes the identified resources to a specific count or percentage.
+    selectionMode :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateExperimentTemplateTargetInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'updateExperimentTemplateTargetInput_filters' - The filters to apply to identify target resources using specific
+-- attributes.
+--
+-- 'parameters', 'updateExperimentTemplateTargetInput_parameters' - The resource type parameters.
+--
+-- 'resourceArns', 'updateExperimentTemplateTargetInput_resourceArns' - The Amazon Resource Names (ARNs) of the targets.
+--
+-- 'resourceTags', 'updateExperimentTemplateTargetInput_resourceTags' - The tags for the target resources.
+--
+-- 'resourceType', 'updateExperimentTemplateTargetInput_resourceType' - The resource type. The resource type must be supported for the specified
+-- action.
+--
+-- 'selectionMode', 'updateExperimentTemplateTargetInput_selectionMode' - Scopes the identified resources to a specific count or percentage.
+newUpdateExperimentTemplateTargetInput ::
+  -- | 'resourceType'
+  Prelude.Text ->
+  -- | 'selectionMode'
+  Prelude.Text ->
+  UpdateExperimentTemplateTargetInput
+newUpdateExperimentTemplateTargetInput
+  pResourceType_
+  pSelectionMode_ =
+    UpdateExperimentTemplateTargetInput'
+      { filters =
+          Prelude.Nothing,
+        parameters = Prelude.Nothing,
+        resourceArns = Prelude.Nothing,
+        resourceTags = Prelude.Nothing,
+        resourceType = pResourceType_,
+        selectionMode = pSelectionMode_
+      }
+
+-- | The filters to apply to identify target resources using specific
+-- attributes.
+updateExperimentTemplateTargetInput_filters :: Lens.Lens' UpdateExperimentTemplateTargetInput (Prelude.Maybe [ExperimentTemplateTargetInputFilter])
+updateExperimentTemplateTargetInput_filters = Lens.lens (\UpdateExperimentTemplateTargetInput' {filters} -> filters) (\s@UpdateExperimentTemplateTargetInput' {} a -> s {filters = a} :: UpdateExperimentTemplateTargetInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The resource type parameters.
+updateExperimentTemplateTargetInput_parameters :: Lens.Lens' UpdateExperimentTemplateTargetInput (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+updateExperimentTemplateTargetInput_parameters = Lens.lens (\UpdateExperimentTemplateTargetInput' {parameters} -> parameters) (\s@UpdateExperimentTemplateTargetInput' {} a -> s {parameters = a} :: UpdateExperimentTemplateTargetInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Names (ARNs) of the targets.
+updateExperimentTemplateTargetInput_resourceArns :: Lens.Lens' UpdateExperimentTemplateTargetInput (Prelude.Maybe [Prelude.Text])
+updateExperimentTemplateTargetInput_resourceArns = Lens.lens (\UpdateExperimentTemplateTargetInput' {resourceArns} -> resourceArns) (\s@UpdateExperimentTemplateTargetInput' {} a -> s {resourceArns = a} :: UpdateExperimentTemplateTargetInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The tags for the target resources.
+updateExperimentTemplateTargetInput_resourceTags :: Lens.Lens' UpdateExperimentTemplateTargetInput (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+updateExperimentTemplateTargetInput_resourceTags = Lens.lens (\UpdateExperimentTemplateTargetInput' {resourceTags} -> resourceTags) (\s@UpdateExperimentTemplateTargetInput' {} a -> s {resourceTags = a} :: UpdateExperimentTemplateTargetInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | The resource type. The resource type must be supported for the specified
+-- action.
+updateExperimentTemplateTargetInput_resourceType :: Lens.Lens' UpdateExperimentTemplateTargetInput Prelude.Text
+updateExperimentTemplateTargetInput_resourceType = Lens.lens (\UpdateExperimentTemplateTargetInput' {resourceType} -> resourceType) (\s@UpdateExperimentTemplateTargetInput' {} a -> s {resourceType = a} :: UpdateExperimentTemplateTargetInput)
+
+-- | Scopes the identified resources to a specific count or percentage.
+updateExperimentTemplateTargetInput_selectionMode :: Lens.Lens' UpdateExperimentTemplateTargetInput Prelude.Text
+updateExperimentTemplateTargetInput_selectionMode = Lens.lens (\UpdateExperimentTemplateTargetInput' {selectionMode} -> selectionMode) (\s@UpdateExperimentTemplateTargetInput' {} a -> s {selectionMode = a} :: UpdateExperimentTemplateTargetInput)
+
+instance
+  Prelude.Hashable
+    UpdateExperimentTemplateTargetInput
+  where
+  hashWithSalt
+    _salt
+    UpdateExperimentTemplateTargetInput' {..} =
+      _salt
+        `Prelude.hashWithSalt` filters
+        `Prelude.hashWithSalt` parameters
+        `Prelude.hashWithSalt` resourceArns
+        `Prelude.hashWithSalt` resourceTags
+        `Prelude.hashWithSalt` resourceType
+        `Prelude.hashWithSalt` selectionMode
+
+instance
+  Prelude.NFData
+    UpdateExperimentTemplateTargetInput
+  where
+  rnf UpdateExperimentTemplateTargetInput' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf parameters
+      `Prelude.seq` Prelude.rnf resourceArns
+      `Prelude.seq` Prelude.rnf resourceTags
+      `Prelude.seq` Prelude.rnf resourceType
+      `Prelude.seq` Prelude.rnf selectionMode
+
+instance
+  Data.ToJSON
+    UpdateExperimentTemplateTargetInput
+  where
+  toJSON UpdateExperimentTemplateTargetInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filters" Data..=) Prelude.<$> filters,
+            ("parameters" Data..=) Prelude.<$> parameters,
+            ("resourceArns" Data..=) Prelude.<$> resourceArns,
+            ("resourceTags" Data..=) Prelude.<$> resourceTags,
+            Prelude.Just ("resourceType" Data..= resourceType),
+            Prelude.Just
+              ("selectionMode" Data..= selectionMode)
+          ]
+      )
diff --git a/gen/Amazonka/FIS/UntagResource.hs b/gen/Amazonka/FIS/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/UntagResource.hs
@@ -0,0 +1,164 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes the specified tags from the specified resource.
+module Amazonka.FIS.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_tagKeys,
+    untagResource_resourceArn,
+
+    -- * 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.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The tag keys to remove.
+    tagKeys :: Prelude.Maybe [Prelude.Text],
+    -- | The Amazon Resource Name (ARN) of the resource.
+    resourceArn :: 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:
+--
+-- 'tagKeys', 'untagResource_tagKeys' - The tag keys to remove.
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { tagKeys = Prelude.Nothing,
+      resourceArn = pResourceArn_
+    }
+
+-- | The tag keys to remove.
+untagResource_tagKeys :: Lens.Lens' UntagResource (Prelude.Maybe [Prelude.Text])
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of the resource.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+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` tagKeys
+      `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf tagKeys
+      `Prelude.seq` Prelude.rnf resourceArn
+
+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.toQuery
+            (Data.toQueryList "member" Prelude.<$> 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/FIS/UpdateExperimentTemplate.hs b/gen/Amazonka/FIS/UpdateExperimentTemplate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/UpdateExperimentTemplate.hs
@@ -0,0 +1,257 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.FIS.UpdateExperimentTemplate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the specified experiment template.
+module Amazonka.FIS.UpdateExperimentTemplate
+  ( -- * Creating a Request
+    UpdateExperimentTemplate (..),
+    newUpdateExperimentTemplate,
+
+    -- * Request Lenses
+    updateExperimentTemplate_actions,
+    updateExperimentTemplate_description,
+    updateExperimentTemplate_logConfiguration,
+    updateExperimentTemplate_roleArn,
+    updateExperimentTemplate_stopConditions,
+    updateExperimentTemplate_targets,
+    updateExperimentTemplate_id,
+
+    -- * Destructuring the Response
+    UpdateExperimentTemplateResponse (..),
+    newUpdateExperimentTemplateResponse,
+
+    -- * Response Lenses
+    updateExperimentTemplateResponse_experimentTemplate,
+    updateExperimentTemplateResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateExperimentTemplate' smart constructor.
+data UpdateExperimentTemplate = UpdateExperimentTemplate'
+  { -- | The actions for the experiment.
+    actions :: Prelude.Maybe (Prelude.HashMap Prelude.Text UpdateExperimentTemplateActionInputItem),
+    -- | A description for the template.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The configuration for experiment logging.
+    logConfiguration :: Prelude.Maybe UpdateExperimentTemplateLogConfigurationInput,
+    -- | The Amazon Resource Name (ARN) of an IAM role that grants the FIS
+    -- service permission to perform service actions on your behalf.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The stop conditions for the experiment.
+    stopConditions :: Prelude.Maybe [UpdateExperimentTemplateStopConditionInput],
+    -- | The targets for the experiment.
+    targets :: Prelude.Maybe (Prelude.HashMap Prelude.Text UpdateExperimentTemplateTargetInput),
+    -- | The ID of the experiment template.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateExperimentTemplate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'actions', 'updateExperimentTemplate_actions' - The actions for the experiment.
+--
+-- 'description', 'updateExperimentTemplate_description' - A description for the template.
+--
+-- 'logConfiguration', 'updateExperimentTemplate_logConfiguration' - The configuration for experiment logging.
+--
+-- 'roleArn', 'updateExperimentTemplate_roleArn' - The Amazon Resource Name (ARN) of an IAM role that grants the FIS
+-- service permission to perform service actions on your behalf.
+--
+-- 'stopConditions', 'updateExperimentTemplate_stopConditions' - The stop conditions for the experiment.
+--
+-- 'targets', 'updateExperimentTemplate_targets' - The targets for the experiment.
+--
+-- 'id', 'updateExperimentTemplate_id' - The ID of the experiment template.
+newUpdateExperimentTemplate ::
+  -- | 'id'
+  Prelude.Text ->
+  UpdateExperimentTemplate
+newUpdateExperimentTemplate pId_ =
+  UpdateExperimentTemplate'
+    { actions =
+        Prelude.Nothing,
+      description = Prelude.Nothing,
+      logConfiguration = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      stopConditions = Prelude.Nothing,
+      targets = Prelude.Nothing,
+      id = pId_
+    }
+
+-- | The actions for the experiment.
+updateExperimentTemplate_actions :: Lens.Lens' UpdateExperimentTemplate (Prelude.Maybe (Prelude.HashMap Prelude.Text UpdateExperimentTemplateActionInputItem))
+updateExperimentTemplate_actions = Lens.lens (\UpdateExperimentTemplate' {actions} -> actions) (\s@UpdateExperimentTemplate' {} a -> s {actions = a} :: UpdateExperimentTemplate) Prelude.. Lens.mapping Lens.coerced
+
+-- | A description for the template.
+updateExperimentTemplate_description :: Lens.Lens' UpdateExperimentTemplate (Prelude.Maybe Prelude.Text)
+updateExperimentTemplate_description = Lens.lens (\UpdateExperimentTemplate' {description} -> description) (\s@UpdateExperimentTemplate' {} a -> s {description = a} :: UpdateExperimentTemplate)
+
+-- | The configuration for experiment logging.
+updateExperimentTemplate_logConfiguration :: Lens.Lens' UpdateExperimentTemplate (Prelude.Maybe UpdateExperimentTemplateLogConfigurationInput)
+updateExperimentTemplate_logConfiguration = Lens.lens (\UpdateExperimentTemplate' {logConfiguration} -> logConfiguration) (\s@UpdateExperimentTemplate' {} a -> s {logConfiguration = a} :: UpdateExperimentTemplate)
+
+-- | The Amazon Resource Name (ARN) of an IAM role that grants the FIS
+-- service permission to perform service actions on your behalf.
+updateExperimentTemplate_roleArn :: Lens.Lens' UpdateExperimentTemplate (Prelude.Maybe Prelude.Text)
+updateExperimentTemplate_roleArn = Lens.lens (\UpdateExperimentTemplate' {roleArn} -> roleArn) (\s@UpdateExperimentTemplate' {} a -> s {roleArn = a} :: UpdateExperimentTemplate)
+
+-- | The stop conditions for the experiment.
+updateExperimentTemplate_stopConditions :: Lens.Lens' UpdateExperimentTemplate (Prelude.Maybe [UpdateExperimentTemplateStopConditionInput])
+updateExperimentTemplate_stopConditions = Lens.lens (\UpdateExperimentTemplate' {stopConditions} -> stopConditions) (\s@UpdateExperimentTemplate' {} a -> s {stopConditions = a} :: UpdateExperimentTemplate) Prelude.. Lens.mapping Lens.coerced
+
+-- | The targets for the experiment.
+updateExperimentTemplate_targets :: Lens.Lens' UpdateExperimentTemplate (Prelude.Maybe (Prelude.HashMap Prelude.Text UpdateExperimentTemplateTargetInput))
+updateExperimentTemplate_targets = Lens.lens (\UpdateExperimentTemplate' {targets} -> targets) (\s@UpdateExperimentTemplate' {} a -> s {targets = a} :: UpdateExperimentTemplate) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the experiment template.
+updateExperimentTemplate_id :: Lens.Lens' UpdateExperimentTemplate Prelude.Text
+updateExperimentTemplate_id = Lens.lens (\UpdateExperimentTemplate' {id} -> id) (\s@UpdateExperimentTemplate' {} a -> s {id = a} :: UpdateExperimentTemplate)
+
+instance Core.AWSRequest UpdateExperimentTemplate where
+  type
+    AWSResponse UpdateExperimentTemplate =
+      UpdateExperimentTemplateResponse
+  request overrides =
+    Request.patchJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateExperimentTemplateResponse'
+            Prelude.<$> (x Data..?> "experimentTemplate")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateExperimentTemplate where
+  hashWithSalt _salt UpdateExperimentTemplate' {..} =
+    _salt
+      `Prelude.hashWithSalt` actions
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` logConfiguration
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` stopConditions
+      `Prelude.hashWithSalt` targets
+      `Prelude.hashWithSalt` id
+
+instance Prelude.NFData UpdateExperimentTemplate where
+  rnf UpdateExperimentTemplate' {..} =
+    Prelude.rnf actions
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf logConfiguration
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf stopConditions
+      `Prelude.seq` Prelude.rnf targets
+      `Prelude.seq` Prelude.rnf id
+
+instance Data.ToHeaders UpdateExperimentTemplate where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateExperimentTemplate where
+  toJSON UpdateExperimentTemplate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("actions" Data..=) Prelude.<$> actions,
+            ("description" Data..=) Prelude.<$> description,
+            ("logConfiguration" Data..=)
+              Prelude.<$> logConfiguration,
+            ("roleArn" Data..=) Prelude.<$> roleArn,
+            ("stopConditions" Data..=)
+              Prelude.<$> stopConditions,
+            ("targets" Data..=) Prelude.<$> targets
+          ]
+      )
+
+instance Data.ToPath UpdateExperimentTemplate where
+  toPath UpdateExperimentTemplate' {..} =
+    Prelude.mconcat
+      ["/experimentTemplates/", Data.toBS id]
+
+instance Data.ToQuery UpdateExperimentTemplate where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateExperimentTemplateResponse' smart constructor.
+data UpdateExperimentTemplateResponse = UpdateExperimentTemplateResponse'
+  { -- | Information about the experiment template.
+    experimentTemplate :: Prelude.Maybe ExperimentTemplate,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateExperimentTemplateResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'experimentTemplate', 'updateExperimentTemplateResponse_experimentTemplate' - Information about the experiment template.
+--
+-- 'httpStatus', 'updateExperimentTemplateResponse_httpStatus' - The response's http status code.
+newUpdateExperimentTemplateResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateExperimentTemplateResponse
+newUpdateExperimentTemplateResponse pHttpStatus_ =
+  UpdateExperimentTemplateResponse'
+    { experimentTemplate =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the experiment template.
+updateExperimentTemplateResponse_experimentTemplate :: Lens.Lens' UpdateExperimentTemplateResponse (Prelude.Maybe ExperimentTemplate)
+updateExperimentTemplateResponse_experimentTemplate = Lens.lens (\UpdateExperimentTemplateResponse' {experimentTemplate} -> experimentTemplate) (\s@UpdateExperimentTemplateResponse' {} a -> s {experimentTemplate = a} :: UpdateExperimentTemplateResponse)
+
+-- | The response's http status code.
+updateExperimentTemplateResponse_httpStatus :: Lens.Lens' UpdateExperimentTemplateResponse Prelude.Int
+updateExperimentTemplateResponse_httpStatus = Lens.lens (\UpdateExperimentTemplateResponse' {httpStatus} -> httpStatus) (\s@UpdateExperimentTemplateResponse' {} a -> s {httpStatus = a} :: UpdateExperimentTemplateResponse)
+
+instance
+  Prelude.NFData
+    UpdateExperimentTemplateResponse
+  where
+  rnf UpdateExperimentTemplateResponse' {..} =
+    Prelude.rnf experimentTemplate
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/FIS/Waiters.hs b/gen/Amazonka/FIS/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/FIS/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.FIS.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.FIS.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.FIS.Lens
+import Amazonka.FIS.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.FIS
+import Test.Amazonka.FIS.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "FIS"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/FIS.hs b/test/Test/Amazonka/FIS.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/FIS.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.FIS
+-- 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.FIS
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/FIS/Internal.hs b/test/Test/Amazonka/FIS/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/FIS/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.FIS.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.FIS.Internal where
diff --git a/test/Test/Amazonka/Gen/FIS.hs b/test/Test/Amazonka/Gen/FIS.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/FIS.hs
@@ -0,0 +1,358 @@
+{-# 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.FIS
+-- 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.FIS where
+
+import Amazonka.FIS
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.FIS.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"
+--         [ requestCreateExperimentTemplate $
+--             newCreateExperimentTemplate
+--
+--         , requestDeleteExperimentTemplate $
+--             newDeleteExperimentTemplate
+--
+--         , requestGetAction $
+--             newGetAction
+--
+--         , requestGetExperiment $
+--             newGetExperiment
+--
+--         , requestGetExperimentTemplate $
+--             newGetExperimentTemplate
+--
+--         , requestGetTargetResourceType $
+--             newGetTargetResourceType
+--
+--         , requestListActions $
+--             newListActions
+--
+--         , requestListExperimentTemplates $
+--             newListExperimentTemplates
+--
+--         , requestListExperiments $
+--             newListExperiments
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestListTargetResourceTypes $
+--             newListTargetResourceTypes
+--
+--         , requestStartExperiment $
+--             newStartExperiment
+--
+--         , requestStopExperiment $
+--             newStopExperiment
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateExperimentTemplate $
+--             newUpdateExperimentTemplate
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateExperimentTemplate $
+--             newCreateExperimentTemplateResponse
+--
+--         , responseDeleteExperimentTemplate $
+--             newDeleteExperimentTemplateResponse
+--
+--         , responseGetAction $
+--             newGetActionResponse
+--
+--         , responseGetExperiment $
+--             newGetExperimentResponse
+--
+--         , responseGetExperimentTemplate $
+--             newGetExperimentTemplateResponse
+--
+--         , responseGetTargetResourceType $
+--             newGetTargetResourceTypeResponse
+--
+--         , responseListActions $
+--             newListActionsResponse
+--
+--         , responseListExperimentTemplates $
+--             newListExperimentTemplatesResponse
+--
+--         , responseListExperiments $
+--             newListExperimentsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseListTargetResourceTypes $
+--             newListTargetResourceTypesResponse
+--
+--         , responseStartExperiment $
+--             newStartExperimentResponse
+--
+--         , responseStopExperiment $
+--             newStopExperimentResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateExperimentTemplate $
+--             newUpdateExperimentTemplateResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateExperimentTemplate :: CreateExperimentTemplate -> TestTree
+requestCreateExperimentTemplate =
+  req
+    "CreateExperimentTemplate"
+    "fixture/CreateExperimentTemplate.yaml"
+
+requestDeleteExperimentTemplate :: DeleteExperimentTemplate -> TestTree
+requestDeleteExperimentTemplate =
+  req
+    "DeleteExperimentTemplate"
+    "fixture/DeleteExperimentTemplate.yaml"
+
+requestGetAction :: GetAction -> TestTree
+requestGetAction =
+  req
+    "GetAction"
+    "fixture/GetAction.yaml"
+
+requestGetExperiment :: GetExperiment -> TestTree
+requestGetExperiment =
+  req
+    "GetExperiment"
+    "fixture/GetExperiment.yaml"
+
+requestGetExperimentTemplate :: GetExperimentTemplate -> TestTree
+requestGetExperimentTemplate =
+  req
+    "GetExperimentTemplate"
+    "fixture/GetExperimentTemplate.yaml"
+
+requestGetTargetResourceType :: GetTargetResourceType -> TestTree
+requestGetTargetResourceType =
+  req
+    "GetTargetResourceType"
+    "fixture/GetTargetResourceType.yaml"
+
+requestListActions :: ListActions -> TestTree
+requestListActions =
+  req
+    "ListActions"
+    "fixture/ListActions.yaml"
+
+requestListExperimentTemplates :: ListExperimentTemplates -> TestTree
+requestListExperimentTemplates =
+  req
+    "ListExperimentTemplates"
+    "fixture/ListExperimentTemplates.yaml"
+
+requestListExperiments :: ListExperiments -> TestTree
+requestListExperiments =
+  req
+    "ListExperiments"
+    "fixture/ListExperiments.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestListTargetResourceTypes :: ListTargetResourceTypes -> TestTree
+requestListTargetResourceTypes =
+  req
+    "ListTargetResourceTypes"
+    "fixture/ListTargetResourceTypes.yaml"
+
+requestStartExperiment :: StartExperiment -> TestTree
+requestStartExperiment =
+  req
+    "StartExperiment"
+    "fixture/StartExperiment.yaml"
+
+requestStopExperiment :: StopExperiment -> TestTree
+requestStopExperiment =
+  req
+    "StopExperiment"
+    "fixture/StopExperiment.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateExperimentTemplate :: UpdateExperimentTemplate -> TestTree
+requestUpdateExperimentTemplate =
+  req
+    "UpdateExperimentTemplate"
+    "fixture/UpdateExperimentTemplate.yaml"
+
+-- Responses
+
+responseCreateExperimentTemplate :: CreateExperimentTemplateResponse -> TestTree
+responseCreateExperimentTemplate =
+  res
+    "CreateExperimentTemplateResponse"
+    "fixture/CreateExperimentTemplateResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateExperimentTemplate)
+
+responseDeleteExperimentTemplate :: DeleteExperimentTemplateResponse -> TestTree
+responseDeleteExperimentTemplate =
+  res
+    "DeleteExperimentTemplateResponse"
+    "fixture/DeleteExperimentTemplateResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteExperimentTemplate)
+
+responseGetAction :: GetActionResponse -> TestTree
+responseGetAction =
+  res
+    "GetActionResponse"
+    "fixture/GetActionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetAction)
+
+responseGetExperiment :: GetExperimentResponse -> TestTree
+responseGetExperiment =
+  res
+    "GetExperimentResponse"
+    "fixture/GetExperimentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetExperiment)
+
+responseGetExperimentTemplate :: GetExperimentTemplateResponse -> TestTree
+responseGetExperimentTemplate =
+  res
+    "GetExperimentTemplateResponse"
+    "fixture/GetExperimentTemplateResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetExperimentTemplate)
+
+responseGetTargetResourceType :: GetTargetResourceTypeResponse -> TestTree
+responseGetTargetResourceType =
+  res
+    "GetTargetResourceTypeResponse"
+    "fixture/GetTargetResourceTypeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetTargetResourceType)
+
+responseListActions :: ListActionsResponse -> TestTree
+responseListActions =
+  res
+    "ListActionsResponse"
+    "fixture/ListActionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListActions)
+
+responseListExperimentTemplates :: ListExperimentTemplatesResponse -> TestTree
+responseListExperimentTemplates =
+  res
+    "ListExperimentTemplatesResponse"
+    "fixture/ListExperimentTemplatesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListExperimentTemplates)
+
+responseListExperiments :: ListExperimentsResponse -> TestTree
+responseListExperiments =
+  res
+    "ListExperimentsResponse"
+    "fixture/ListExperimentsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListExperiments)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseListTargetResourceTypes :: ListTargetResourceTypesResponse -> TestTree
+responseListTargetResourceTypes =
+  res
+    "ListTargetResourceTypesResponse"
+    "fixture/ListTargetResourceTypesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTargetResourceTypes)
+
+responseStartExperiment :: StartExperimentResponse -> TestTree
+responseStartExperiment =
+  res
+    "StartExperimentResponse"
+    "fixture/StartExperimentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartExperiment)
+
+responseStopExperiment :: StopExperimentResponse -> TestTree
+responseStopExperiment =
+  res
+    "StopExperimentResponse"
+    "fixture/StopExperimentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StopExperiment)
+
+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)
+
+responseUpdateExperimentTemplate :: UpdateExperimentTemplateResponse -> TestTree
+responseUpdateExperimentTemplate =
+  res
+    "UpdateExperimentTemplateResponse"
+    "fixture/UpdateExperimentTemplateResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateExperimentTemplate)
