diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -7,9 +7,8 @@
 
 
 ## Version
-
-`1.6.1`
-
+ 
+`2.0` - Derived from API version @2012-08-10@ of the AWS service descriptions, licensed under Apache 2.0.
 
 ## Description
 
@@ -26,7 +25,7 @@
 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 [Network.AWS.DynamoDBStreams](http://hackage.haskell.org/package/amazonka-dynamodb-streams/docs/Network-AWS-DynamoDBStreams.html)
+See [Amazonka.DynamoDBStreams](http://hackage.haskell.org/package/amazonka-dynamodb-streams/docs/Amazonka-DynamoDBStreams.html)
 or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
 
 
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import           Distribution.Simple
-main = defaultMain
diff --git a/amazonka-dynamodb-streams.cabal b/amazonka-dynamodb-streams.cabal
--- a/amazonka-dynamodb-streams.cabal
+++ b/amazonka-dynamodb-streams.cabal
@@ -1,89 +1,106 @@
-name:                  amazonka-dynamodb-streams
-version:               1.6.1
-synopsis:              Amazon DynamoDB Streams 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>
-copyright:             Copyright (c) 2013-2018 Brendan Hay
-category:              Network, AWS, Cloud, Distributed Computing
-build-type:            Simple
-cabal-version:         >= 1.10
-extra-source-files:    README.md fixture/*.yaml fixture/*.proto src/.gitkeep
+cabal-version:      2.2
+name:               amazonka-dynamodb-streams
+version:            2.0
+synopsis:           Amazon DynamoDB Streams 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:
-    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.
-    .
-    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
-    such as <http://hackage.haskell.org/package/lens lens> or
-    <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
-    .
-    See "Network.AWS.DynamoDBStreams" or <https://aws.amazon.com/documentation/ the AWS documentation>
-    to get started.
+  Derived from API version @2012-08-10@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.DynamoDBStreams.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.DynamoDBStreams" 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-dynamodb-streams
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-dynamodb-streams
 
 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:
-          Network.AWS.DynamoDBStreams
-        , Network.AWS.DynamoDBStreams.DescribeStream
-        , Network.AWS.DynamoDBStreams.GetRecords
-        , Network.AWS.DynamoDBStreams.GetShardIterator
-        , Network.AWS.DynamoDBStreams.ListStreams
-        , Network.AWS.DynamoDBStreams.Types
-        , Network.AWS.DynamoDBStreams.Waiters
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
 
-    other-modules:
-          Network.AWS.DynamoDBStreams.Types.Product
-        , Network.AWS.DynamoDBStreams.Types.Sum
+  exposed-modules:
+    Amazonka.DynamoDBStreams
+    Amazonka.DynamoDBStreams.DescribeStream
+    Amazonka.DynamoDBStreams.GetRecords
+    Amazonka.DynamoDBStreams.GetShardIterator
+    Amazonka.DynamoDBStreams.Internal
+    Amazonka.DynamoDBStreams.Lens
+    Amazonka.DynamoDBStreams.ListStreams
+    Amazonka.DynamoDBStreams.Types
+    Amazonka.DynamoDBStreams.Types.Identity
+    Amazonka.DynamoDBStreams.Types.KeySchemaElement
+    Amazonka.DynamoDBStreams.Types.KeyType
+    Amazonka.DynamoDBStreams.Types.OperationType
+    Amazonka.DynamoDBStreams.Types.Record
+    Amazonka.DynamoDBStreams.Types.SequenceNumberRange
+    Amazonka.DynamoDBStreams.Types.Shard
+    Amazonka.DynamoDBStreams.Types.ShardIteratorType
+    Amazonka.DynamoDBStreams.Types.Stream
+    Amazonka.DynamoDBStreams.Types.StreamDescription
+    Amazonka.DynamoDBStreams.Types.StreamRecord
+    Amazonka.DynamoDBStreams.Types.StreamStatus
+    Amazonka.DynamoDBStreams.Types.StreamViewType
+    Amazonka.DynamoDBStreams.Waiters
 
-    build-depends:
-          amazonka-core == 1.6.1.*
-        , base          >= 4.7     && < 5
+  build-depends:
+    , aeson
+    , amazonka-core         >=2.0     && <2.1
+    , base                  >=4.12    && <5
+    , containers
+    , hashable              >=1.3.4.0 && <1.5
+    , unordered-containers
+    , vector
 
 test-suite amazonka-dynamodb-streams-test
-    type:              exitcode-stdio-1.0
-    default-language:  Haskell2010
-    hs-source-dirs:    test
-    main-is:           Main.hs
-
-    ghc-options:       -Wall -threaded
+  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.AWS.DynamoDBStreams
-        , Test.AWS.Gen.DynamoDBStreams
-        , Test.AWS.DynamoDBStreams.Internal
+  -- 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.DynamoDBStreams
+    Test.Amazonka.DynamoDBStreams.Internal
+    Test.Amazonka.Gen.DynamoDBStreams
 
-    build-depends:
-          amazonka-core == 1.6.1.*
-        , amazonka-test == 1.6.1.*
-        , amazonka-dynamodb-streams
-        , base
-        , bytestring
-        , tasty
-        , tasty-hunit
-        , text
-        , time
-        , unordered-containers
+  build-depends:
+    , amazonka-core              >=2.0 && <2.1
+    , amazonka-dynamodb-streams
+    , amazonka-test              >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/DescribeStream.yaml b/fixture/DescribeStream.yaml
--- a/fixture/DescribeStream.yaml
+++ b/fixture/DescribeStream.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/streams.dynamodb/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  streams.dynamodb.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/GetRecords.yaml b/fixture/GetRecords.yaml
--- a/fixture/GetRecords.yaml
+++ b/fixture/GetRecords.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/streams.dynamodb/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  streams.dynamodb.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/GetShardIterator.yaml b/fixture/GetShardIterator.yaml
--- a/fixture/GetShardIterator.yaml
+++ b/fixture/GetShardIterator.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/streams.dynamodb/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  streams.dynamodb.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/ListStreams.yaml b/fixture/ListStreams.yaml
--- a/fixture/ListStreams.yaml
+++ b/fixture/ListStreams.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/streams.dynamodb/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  streams.dynamodb.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/gen/Amazonka/DynamoDBStreams.hs b/gen/Amazonka/DynamoDBStreams.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams.hs
@@ -0,0 +1,161 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.DynamoDBStreams
+-- 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 @2012-08-10@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon DynamoDB
+--
+-- Amazon DynamoDB Streams provides API actions for accessing streams and
+-- processing stream records. To learn more about application development
+-- with Streams, see
+-- <https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html Capturing Table Activity with DynamoDB Streams>
+-- in the Amazon DynamoDB Developer Guide.
+module Amazonka.DynamoDBStreams
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** ExpiredIteratorException
+    _ExpiredIteratorException,
+
+    -- ** InternalServerError
+    _InternalServerError,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** TrimmedDataAccessException
+    _TrimmedDataAccessException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** DescribeStream
+    DescribeStream (DescribeStream'),
+    newDescribeStream,
+    DescribeStreamResponse (DescribeStreamResponse'),
+    newDescribeStreamResponse,
+
+    -- ** GetRecords
+    GetRecords (GetRecords'),
+    newGetRecords,
+    GetRecordsResponse (GetRecordsResponse'),
+    newGetRecordsResponse,
+
+    -- ** GetShardIterator
+    GetShardIterator (GetShardIterator'),
+    newGetShardIterator,
+    GetShardIteratorResponse (GetShardIteratorResponse'),
+    newGetShardIteratorResponse,
+
+    -- ** ListStreams
+    ListStreams (ListStreams'),
+    newListStreams,
+    ListStreamsResponse (ListStreamsResponse'),
+    newListStreamsResponse,
+
+    -- * Types
+
+    -- ** Common
+    module Amazonka.DynamoDBStreams.Internal,
+
+    -- ** KeyType
+    KeyType (..),
+
+    -- ** OperationType
+    OperationType (..),
+
+    -- ** ShardIteratorType
+    ShardIteratorType (..),
+
+    -- ** StreamStatus
+    StreamStatus (..),
+
+    -- ** StreamViewType
+    StreamViewType (..),
+
+    -- ** Identity
+    Identity (Identity'),
+    newIdentity,
+
+    -- ** KeySchemaElement
+    KeySchemaElement (KeySchemaElement'),
+    newKeySchemaElement,
+
+    -- ** Record
+    Record (Record'),
+    newRecord,
+
+    -- ** SequenceNumberRange
+    SequenceNumberRange (SequenceNumberRange'),
+    newSequenceNumberRange,
+
+    -- ** Shard
+    Shard (Shard'),
+    newShard,
+
+    -- ** Stream
+    Stream (Stream'),
+    newStream,
+
+    -- ** StreamDescription
+    StreamDescription (StreamDescription'),
+    newStreamDescription,
+
+    -- ** StreamRecord
+    StreamRecord (StreamRecord'),
+    newStreamRecord,
+  )
+where
+
+import Amazonka.DynamoDBStreams.DescribeStream
+import Amazonka.DynamoDBStreams.GetRecords
+import Amazonka.DynamoDBStreams.GetShardIterator
+import Amazonka.DynamoDBStreams.Internal
+import Amazonka.DynamoDBStreams.Lens
+import Amazonka.DynamoDBStreams.ListStreams
+import Amazonka.DynamoDBStreams.Types
+import Amazonka.DynamoDBStreams.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 'DynamoDBStreams'.
+
+-- $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/DynamoDBStreams/DescribeStream.hs b/gen/Amazonka/DynamoDBStreams/DescribeStream.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/DescribeStream.hs
@@ -0,0 +1,231 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.DynamoDBStreams.DescribeStream
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about a stream, including the current status of the
+-- stream, its Amazon Resource Name (ARN), the composition of its shards,
+-- and its corresponding DynamoDB table.
+--
+-- You can call @DescribeStream@ at a maximum rate of 10 times per second.
+--
+-- Each shard in the stream has a @SequenceNumberRange@ associated with it.
+-- If the @SequenceNumberRange@ has a @StartingSequenceNumber@ but no
+-- @EndingSequenceNumber@, then the shard is still open (able to receive
+-- more stream records). If both @StartingSequenceNumber@ and
+-- @EndingSequenceNumber@ are present, then that shard is closed and can no
+-- longer receive more data.
+module Amazonka.DynamoDBStreams.DescribeStream
+  ( -- * Creating a Request
+    DescribeStream (..),
+    newDescribeStream,
+
+    -- * Request Lenses
+    describeStream_exclusiveStartShardId,
+    describeStream_limit,
+    describeStream_streamArn,
+
+    -- * Destructuring the Response
+    DescribeStreamResponse (..),
+    newDescribeStreamResponse,
+
+    -- * Response Lenses
+    describeStreamResponse_streamDescription,
+    describeStreamResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Represents the input of a @DescribeStream@ operation.
+--
+-- /See:/ 'newDescribeStream' smart constructor.
+data DescribeStream = DescribeStream'
+  { -- | The shard ID of the first item that this operation will evaluate. Use
+    -- the value that was returned for @LastEvaluatedShardId@ in the previous
+    -- operation.
+    exclusiveStartShardId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of shard objects to return. The upper limit is 100.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Resource Name (ARN) for the stream.
+    streamArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeStream' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exclusiveStartShardId', 'describeStream_exclusiveStartShardId' - The shard ID of the first item that this operation will evaluate. Use
+-- the value that was returned for @LastEvaluatedShardId@ in the previous
+-- operation.
+--
+-- 'limit', 'describeStream_limit' - The maximum number of shard objects to return. The upper limit is 100.
+--
+-- 'streamArn', 'describeStream_streamArn' - The Amazon Resource Name (ARN) for the stream.
+newDescribeStream ::
+  -- | 'streamArn'
+  Prelude.Text ->
+  DescribeStream
+newDescribeStream pStreamArn_ =
+  DescribeStream'
+    { exclusiveStartShardId =
+        Prelude.Nothing,
+      limit = Prelude.Nothing,
+      streamArn = pStreamArn_
+    }
+
+-- | The shard ID of the first item that this operation will evaluate. Use
+-- the value that was returned for @LastEvaluatedShardId@ in the previous
+-- operation.
+describeStream_exclusiveStartShardId :: Lens.Lens' DescribeStream (Prelude.Maybe Prelude.Text)
+describeStream_exclusiveStartShardId = Lens.lens (\DescribeStream' {exclusiveStartShardId} -> exclusiveStartShardId) (\s@DescribeStream' {} a -> s {exclusiveStartShardId = a} :: DescribeStream)
+
+-- | The maximum number of shard objects to return. The upper limit is 100.
+describeStream_limit :: Lens.Lens' DescribeStream (Prelude.Maybe Prelude.Natural)
+describeStream_limit = Lens.lens (\DescribeStream' {limit} -> limit) (\s@DescribeStream' {} a -> s {limit = a} :: DescribeStream)
+
+-- | The Amazon Resource Name (ARN) for the stream.
+describeStream_streamArn :: Lens.Lens' DescribeStream Prelude.Text
+describeStream_streamArn = Lens.lens (\DescribeStream' {streamArn} -> streamArn) (\s@DescribeStream' {} a -> s {streamArn = a} :: DescribeStream)
+
+instance Core.AWSRequest DescribeStream where
+  type
+    AWSResponse DescribeStream =
+      DescribeStreamResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeStreamResponse'
+            Prelude.<$> (x Data..?> "StreamDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeStream where
+  hashWithSalt _salt DescribeStream' {..} =
+    _salt
+      `Prelude.hashWithSalt` exclusiveStartShardId
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` streamArn
+
+instance Prelude.NFData DescribeStream where
+  rnf DescribeStream' {..} =
+    Prelude.rnf exclusiveStartShardId
+      `Prelude.seq` Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf streamArn
+
+instance Data.ToHeaders DescribeStream where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "DynamoDBStreams_20120810.DescribeStream" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeStream where
+  toJSON DescribeStream' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ExclusiveStartShardId" Data..=)
+              Prelude.<$> exclusiveStartShardId,
+            ("Limit" Data..=) Prelude.<$> limit,
+            Prelude.Just ("StreamArn" Data..= streamArn)
+          ]
+      )
+
+instance Data.ToPath DescribeStream where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeStream where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Represents the output of a @DescribeStream@ operation.
+--
+-- /See:/ 'newDescribeStreamResponse' smart constructor.
+data DescribeStreamResponse = DescribeStreamResponse'
+  { -- | A complete description of the stream, including its creation date and
+    -- time, the DynamoDB table associated with the stream, the shard IDs
+    -- within the stream, and the beginning and ending sequence numbers of
+    -- stream records within the shards.
+    streamDescription :: Prelude.Maybe StreamDescription,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeStreamResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'streamDescription', 'describeStreamResponse_streamDescription' - A complete description of the stream, including its creation date and
+-- time, the DynamoDB table associated with the stream, the shard IDs
+-- within the stream, and the beginning and ending sequence numbers of
+-- stream records within the shards.
+--
+-- 'httpStatus', 'describeStreamResponse_httpStatus' - The response's http status code.
+newDescribeStreamResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeStreamResponse
+newDescribeStreamResponse pHttpStatus_ =
+  DescribeStreamResponse'
+    { streamDescription =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A complete description of the stream, including its creation date and
+-- time, the DynamoDB table associated with the stream, the shard IDs
+-- within the stream, and the beginning and ending sequence numbers of
+-- stream records within the shards.
+describeStreamResponse_streamDescription :: Lens.Lens' DescribeStreamResponse (Prelude.Maybe StreamDescription)
+describeStreamResponse_streamDescription = Lens.lens (\DescribeStreamResponse' {streamDescription} -> streamDescription) (\s@DescribeStreamResponse' {} a -> s {streamDescription = a} :: DescribeStreamResponse)
+
+-- | The response's http status code.
+describeStreamResponse_httpStatus :: Lens.Lens' DescribeStreamResponse Prelude.Int
+describeStreamResponse_httpStatus = Lens.lens (\DescribeStreamResponse' {httpStatus} -> httpStatus) (\s@DescribeStreamResponse' {} a -> s {httpStatus = a} :: DescribeStreamResponse)
+
+instance Prelude.NFData DescribeStreamResponse where
+  rnf DescribeStreamResponse' {..} =
+    Prelude.rnf streamDescription
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/DynamoDBStreams/GetRecords.hs b/gen/Amazonka/DynamoDBStreams/GetRecords.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/GetRecords.hs
@@ -0,0 +1,229 @@
+{-# 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.DynamoDBStreams.GetRecords
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the stream records from a given shard.
+--
+-- Specify a shard iterator using the @ShardIterator@ parameter. The shard
+-- iterator specifies the position in the shard from which you want to
+-- start reading stream records sequentially. If there are no stream
+-- records available in the portion of the shard that the iterator points
+-- to, @GetRecords@ returns an empty list. Note that it might take multiple
+-- calls to get to a portion of the shard that contains stream records.
+--
+-- @GetRecords@ can retrieve a maximum of 1 MB of data or 1000 stream
+-- records, whichever comes first.
+module Amazonka.DynamoDBStreams.GetRecords
+  ( -- * Creating a Request
+    GetRecords (..),
+    newGetRecords,
+
+    -- * Request Lenses
+    getRecords_limit,
+    getRecords_shardIterator,
+
+    -- * Destructuring the Response
+    GetRecordsResponse (..),
+    newGetRecordsResponse,
+
+    -- * Response Lenses
+    getRecordsResponse_nextShardIterator,
+    getRecordsResponse_records,
+    getRecordsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Represents the input of a @GetRecords@ operation.
+--
+-- /See:/ 'newGetRecords' smart constructor.
+data GetRecords = GetRecords'
+  { -- | The maximum number of records to return from the shard. The upper limit
+    -- is 1000.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | A shard iterator that was retrieved from a previous GetShardIterator
+    -- operation. This iterator can be used to access the stream records in
+    -- this shard.
+    shardIterator :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRecords' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limit', 'getRecords_limit' - The maximum number of records to return from the shard. The upper limit
+-- is 1000.
+--
+-- 'shardIterator', 'getRecords_shardIterator' - A shard iterator that was retrieved from a previous GetShardIterator
+-- operation. This iterator can be used to access the stream records in
+-- this shard.
+newGetRecords ::
+  -- | 'shardIterator'
+  Prelude.Text ->
+  GetRecords
+newGetRecords pShardIterator_ =
+  GetRecords'
+    { limit = Prelude.Nothing,
+      shardIterator = pShardIterator_
+    }
+
+-- | The maximum number of records to return from the shard. The upper limit
+-- is 1000.
+getRecords_limit :: Lens.Lens' GetRecords (Prelude.Maybe Prelude.Natural)
+getRecords_limit = Lens.lens (\GetRecords' {limit} -> limit) (\s@GetRecords' {} a -> s {limit = a} :: GetRecords)
+
+-- | A shard iterator that was retrieved from a previous GetShardIterator
+-- operation. This iterator can be used to access the stream records in
+-- this shard.
+getRecords_shardIterator :: Lens.Lens' GetRecords Prelude.Text
+getRecords_shardIterator = Lens.lens (\GetRecords' {shardIterator} -> shardIterator) (\s@GetRecords' {} a -> s {shardIterator = a} :: GetRecords)
+
+instance Core.AWSRequest GetRecords where
+  type AWSResponse GetRecords = GetRecordsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetRecordsResponse'
+            Prelude.<$> (x Data..?> "NextShardIterator")
+            Prelude.<*> (x Data..?> "Records" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetRecords where
+  hashWithSalt _salt GetRecords' {..} =
+    _salt
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` shardIterator
+
+instance Prelude.NFData GetRecords where
+  rnf GetRecords' {..} =
+    Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf shardIterator
+
+instance Data.ToHeaders GetRecords where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "DynamoDBStreams_20120810.GetRecords" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetRecords where
+  toJSON GetRecords' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Limit" Data..=) Prelude.<$> limit,
+            Prelude.Just
+              ("ShardIterator" Data..= shardIterator)
+          ]
+      )
+
+instance Data.ToPath GetRecords where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetRecords where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Represents the output of a @GetRecords@ operation.
+--
+-- /See:/ 'newGetRecordsResponse' smart constructor.
+data GetRecordsResponse = GetRecordsResponse'
+  { -- | The next position in the shard from which to start sequentially reading
+    -- stream records. If set to @null@, the shard has been closed and the
+    -- requested iterator will not return any more data.
+    nextShardIterator :: Prelude.Maybe Prelude.Text,
+    -- | The stream records from the shard, which were retrieved using the shard
+    -- iterator.
+    records :: Prelude.Maybe [Record],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRecordsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextShardIterator', 'getRecordsResponse_nextShardIterator' - The next position in the shard from which to start sequentially reading
+-- stream records. If set to @null@, the shard has been closed and the
+-- requested iterator will not return any more data.
+--
+-- 'records', 'getRecordsResponse_records' - The stream records from the shard, which were retrieved using the shard
+-- iterator.
+--
+-- 'httpStatus', 'getRecordsResponse_httpStatus' - The response's http status code.
+newGetRecordsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetRecordsResponse
+newGetRecordsResponse pHttpStatus_ =
+  GetRecordsResponse'
+    { nextShardIterator =
+        Prelude.Nothing,
+      records = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The next position in the shard from which to start sequentially reading
+-- stream records. If set to @null@, the shard has been closed and the
+-- requested iterator will not return any more data.
+getRecordsResponse_nextShardIterator :: Lens.Lens' GetRecordsResponse (Prelude.Maybe Prelude.Text)
+getRecordsResponse_nextShardIterator = Lens.lens (\GetRecordsResponse' {nextShardIterator} -> nextShardIterator) (\s@GetRecordsResponse' {} a -> s {nextShardIterator = a} :: GetRecordsResponse)
+
+-- | The stream records from the shard, which were retrieved using the shard
+-- iterator.
+getRecordsResponse_records :: Lens.Lens' GetRecordsResponse (Prelude.Maybe [Record])
+getRecordsResponse_records = Lens.lens (\GetRecordsResponse' {records} -> records) (\s@GetRecordsResponse' {} a -> s {records = a} :: GetRecordsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getRecordsResponse_httpStatus :: Lens.Lens' GetRecordsResponse Prelude.Int
+getRecordsResponse_httpStatus = Lens.lens (\GetRecordsResponse' {httpStatus} -> httpStatus) (\s@GetRecordsResponse' {} a -> s {httpStatus = a} :: GetRecordsResponse)
+
+instance Prelude.NFData GetRecordsResponse where
+  rnf GetRecordsResponse' {..} =
+    Prelude.rnf nextShardIterator
+      `Prelude.seq` Prelude.rnf records
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/DynamoDBStreams/GetShardIterator.hs b/gen/Amazonka/DynamoDBStreams/GetShardIterator.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/GetShardIterator.hs
@@ -0,0 +1,294 @@
+{-# 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.DynamoDBStreams.GetShardIterator
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a shard iterator. A shard iterator provides information about
+-- how to retrieve the stream records from within a shard. Use the shard
+-- iterator in a subsequent @GetRecords@ request to read the stream records
+-- from the shard.
+--
+-- A shard iterator expires 15 minutes after it is returned to the
+-- requester.
+module Amazonka.DynamoDBStreams.GetShardIterator
+  ( -- * Creating a Request
+    GetShardIterator (..),
+    newGetShardIterator,
+
+    -- * Request Lenses
+    getShardIterator_sequenceNumber,
+    getShardIterator_streamArn,
+    getShardIterator_shardId,
+    getShardIterator_shardIteratorType,
+
+    -- * Destructuring the Response
+    GetShardIteratorResponse (..),
+    newGetShardIteratorResponse,
+
+    -- * Response Lenses
+    getShardIteratorResponse_shardIterator,
+    getShardIteratorResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Represents the input of a @GetShardIterator@ operation.
+--
+-- /See:/ 'newGetShardIterator' smart constructor.
+data GetShardIterator = GetShardIterator'
+  { -- | The sequence number of a stream record in the shard from which to start
+    -- reading.
+    sequenceNumber :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) for the stream.
+    streamArn :: Prelude.Text,
+    -- | The identifier of the shard. The iterator will be returned for this
+    -- shard ID.
+    shardId :: Prelude.Text,
+    -- | Determines how the shard iterator is used to start reading stream
+    -- records from the shard:
+    --
+    -- -   @AT_SEQUENCE_NUMBER@ - Start reading exactly from the position
+    --     denoted by a specific sequence number.
+    --
+    -- -   @AFTER_SEQUENCE_NUMBER@ - Start reading right after the position
+    --     denoted by a specific sequence number.
+    --
+    -- -   @TRIM_HORIZON@ - Start reading at the last (untrimmed) stream
+    --     record, which is the oldest record in the shard. In DynamoDB
+    --     Streams, there is a 24 hour limit on data retention. Stream records
+    --     whose age exceeds this limit are subject to removal (trimming) from
+    --     the stream.
+    --
+    -- -   @LATEST@ - Start reading just after the most recent stream record in
+    --     the shard, so that you always read the most recent data in the
+    --     shard.
+    shardIteratorType :: ShardIteratorType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetShardIterator' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'sequenceNumber', 'getShardIterator_sequenceNumber' - The sequence number of a stream record in the shard from which to start
+-- reading.
+--
+-- 'streamArn', 'getShardIterator_streamArn' - The Amazon Resource Name (ARN) for the stream.
+--
+-- 'shardId', 'getShardIterator_shardId' - The identifier of the shard. The iterator will be returned for this
+-- shard ID.
+--
+-- 'shardIteratorType', 'getShardIterator_shardIteratorType' - Determines how the shard iterator is used to start reading stream
+-- records from the shard:
+--
+-- -   @AT_SEQUENCE_NUMBER@ - Start reading exactly from the position
+--     denoted by a specific sequence number.
+--
+-- -   @AFTER_SEQUENCE_NUMBER@ - Start reading right after the position
+--     denoted by a specific sequence number.
+--
+-- -   @TRIM_HORIZON@ - Start reading at the last (untrimmed) stream
+--     record, which is the oldest record in the shard. In DynamoDB
+--     Streams, there is a 24 hour limit on data retention. Stream records
+--     whose age exceeds this limit are subject to removal (trimming) from
+--     the stream.
+--
+-- -   @LATEST@ - Start reading just after the most recent stream record in
+--     the shard, so that you always read the most recent data in the
+--     shard.
+newGetShardIterator ::
+  -- | 'streamArn'
+  Prelude.Text ->
+  -- | 'shardId'
+  Prelude.Text ->
+  -- | 'shardIteratorType'
+  ShardIteratorType ->
+  GetShardIterator
+newGetShardIterator
+  pStreamArn_
+  pShardId_
+  pShardIteratorType_ =
+    GetShardIterator'
+      { sequenceNumber = Prelude.Nothing,
+        streamArn = pStreamArn_,
+        shardId = pShardId_,
+        shardIteratorType = pShardIteratorType_
+      }
+
+-- | The sequence number of a stream record in the shard from which to start
+-- reading.
+getShardIterator_sequenceNumber :: Lens.Lens' GetShardIterator (Prelude.Maybe Prelude.Text)
+getShardIterator_sequenceNumber = Lens.lens (\GetShardIterator' {sequenceNumber} -> sequenceNumber) (\s@GetShardIterator' {} a -> s {sequenceNumber = a} :: GetShardIterator)
+
+-- | The Amazon Resource Name (ARN) for the stream.
+getShardIterator_streamArn :: Lens.Lens' GetShardIterator Prelude.Text
+getShardIterator_streamArn = Lens.lens (\GetShardIterator' {streamArn} -> streamArn) (\s@GetShardIterator' {} a -> s {streamArn = a} :: GetShardIterator)
+
+-- | The identifier of the shard. The iterator will be returned for this
+-- shard ID.
+getShardIterator_shardId :: Lens.Lens' GetShardIterator Prelude.Text
+getShardIterator_shardId = Lens.lens (\GetShardIterator' {shardId} -> shardId) (\s@GetShardIterator' {} a -> s {shardId = a} :: GetShardIterator)
+
+-- | Determines how the shard iterator is used to start reading stream
+-- records from the shard:
+--
+-- -   @AT_SEQUENCE_NUMBER@ - Start reading exactly from the position
+--     denoted by a specific sequence number.
+--
+-- -   @AFTER_SEQUENCE_NUMBER@ - Start reading right after the position
+--     denoted by a specific sequence number.
+--
+-- -   @TRIM_HORIZON@ - Start reading at the last (untrimmed) stream
+--     record, which is the oldest record in the shard. In DynamoDB
+--     Streams, there is a 24 hour limit on data retention. Stream records
+--     whose age exceeds this limit are subject to removal (trimming) from
+--     the stream.
+--
+-- -   @LATEST@ - Start reading just after the most recent stream record in
+--     the shard, so that you always read the most recent data in the
+--     shard.
+getShardIterator_shardIteratorType :: Lens.Lens' GetShardIterator ShardIteratorType
+getShardIterator_shardIteratorType = Lens.lens (\GetShardIterator' {shardIteratorType} -> shardIteratorType) (\s@GetShardIterator' {} a -> s {shardIteratorType = a} :: GetShardIterator)
+
+instance Core.AWSRequest GetShardIterator where
+  type
+    AWSResponse GetShardIterator =
+      GetShardIteratorResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetShardIteratorResponse'
+            Prelude.<$> (x Data..?> "ShardIterator")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetShardIterator where
+  hashWithSalt _salt GetShardIterator' {..} =
+    _salt
+      `Prelude.hashWithSalt` sequenceNumber
+      `Prelude.hashWithSalt` streamArn
+      `Prelude.hashWithSalt` shardId
+      `Prelude.hashWithSalt` shardIteratorType
+
+instance Prelude.NFData GetShardIterator where
+  rnf GetShardIterator' {..} =
+    Prelude.rnf sequenceNumber
+      `Prelude.seq` Prelude.rnf streamArn
+      `Prelude.seq` Prelude.rnf shardId
+      `Prelude.seq` Prelude.rnf shardIteratorType
+
+instance Data.ToHeaders GetShardIterator where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "DynamoDBStreams_20120810.GetShardIterator" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetShardIterator where
+  toJSON GetShardIterator' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("SequenceNumber" Data..=)
+              Prelude.<$> sequenceNumber,
+            Prelude.Just ("StreamArn" Data..= streamArn),
+            Prelude.Just ("ShardId" Data..= shardId),
+            Prelude.Just
+              ("ShardIteratorType" Data..= shardIteratorType)
+          ]
+      )
+
+instance Data.ToPath GetShardIterator where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetShardIterator where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Represents the output of a @GetShardIterator@ operation.
+--
+-- /See:/ 'newGetShardIteratorResponse' smart constructor.
+data GetShardIteratorResponse = GetShardIteratorResponse'
+  { -- | The position in the shard from which to start reading stream records
+    -- sequentially. A shard iterator specifies this position using the
+    -- sequence number of a stream record in a shard.
+    shardIterator :: 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 'GetShardIteratorResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'shardIterator', 'getShardIteratorResponse_shardIterator' - The position in the shard from which to start reading stream records
+-- sequentially. A shard iterator specifies this position using the
+-- sequence number of a stream record in a shard.
+--
+-- 'httpStatus', 'getShardIteratorResponse_httpStatus' - The response's http status code.
+newGetShardIteratorResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetShardIteratorResponse
+newGetShardIteratorResponse pHttpStatus_ =
+  GetShardIteratorResponse'
+    { shardIterator =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The position in the shard from which to start reading stream records
+-- sequentially. A shard iterator specifies this position using the
+-- sequence number of a stream record in a shard.
+getShardIteratorResponse_shardIterator :: Lens.Lens' GetShardIteratorResponse (Prelude.Maybe Prelude.Text)
+getShardIteratorResponse_shardIterator = Lens.lens (\GetShardIteratorResponse' {shardIterator} -> shardIterator) (\s@GetShardIteratorResponse' {} a -> s {shardIterator = a} :: GetShardIteratorResponse)
+
+-- | The response's http status code.
+getShardIteratorResponse_httpStatus :: Lens.Lens' GetShardIteratorResponse Prelude.Int
+getShardIteratorResponse_httpStatus = Lens.lens (\GetShardIteratorResponse' {httpStatus} -> httpStatus) (\s@GetShardIteratorResponse' {} a -> s {httpStatus = a} :: GetShardIteratorResponse)
+
+instance Prelude.NFData GetShardIteratorResponse where
+  rnf GetShardIteratorResponse' {..} =
+    Prelude.rnf shardIterator
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/DynamoDBStreams/Lens.hs b/gen/Amazonka/DynamoDBStreams/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Lens.hs
@@ -0,0 +1,113 @@
+{-# 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.DynamoDBStreams.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.DynamoDBStreams.Lens
+  ( -- * Operations
+
+    -- ** DescribeStream
+    describeStream_exclusiveStartShardId,
+    describeStream_limit,
+    describeStream_streamArn,
+    describeStreamResponse_streamDescription,
+    describeStreamResponse_httpStatus,
+
+    -- ** GetRecords
+    getRecords_limit,
+    getRecords_shardIterator,
+    getRecordsResponse_nextShardIterator,
+    getRecordsResponse_records,
+    getRecordsResponse_httpStatus,
+
+    -- ** GetShardIterator
+    getShardIterator_sequenceNumber,
+    getShardIterator_streamArn,
+    getShardIterator_shardId,
+    getShardIterator_shardIteratorType,
+    getShardIteratorResponse_shardIterator,
+    getShardIteratorResponse_httpStatus,
+
+    -- ** ListStreams
+    listStreams_exclusiveStartStreamArn,
+    listStreams_limit,
+    listStreams_tableName,
+    listStreamsResponse_lastEvaluatedStreamArn,
+    listStreamsResponse_streams,
+    listStreamsResponse_httpStatus,
+
+    -- * Types
+
+    -- ** Identity
+    identity_principalId,
+    identity_type,
+
+    -- ** KeySchemaElement
+    keySchemaElement_attributeName,
+    keySchemaElement_keyType,
+
+    -- ** Record
+    record_awsRegion,
+    record_dynamodb,
+    record_eventID,
+    record_eventName,
+    record_eventSource,
+    record_eventVersion,
+    record_userIdentity,
+
+    -- ** SequenceNumberRange
+    sequenceNumberRange_endingSequenceNumber,
+    sequenceNumberRange_startingSequenceNumber,
+
+    -- ** Shard
+    shard_parentShardId,
+    shard_sequenceNumberRange,
+    shard_shardId,
+
+    -- ** Stream
+    stream_streamArn,
+    stream_streamLabel,
+    stream_tableName,
+
+    -- ** StreamDescription
+    streamDescription_creationRequestDateTime,
+    streamDescription_keySchema,
+    streamDescription_lastEvaluatedShardId,
+    streamDescription_shards,
+    streamDescription_streamArn,
+    streamDescription_streamLabel,
+    streamDescription_streamStatus,
+    streamDescription_streamViewType,
+    streamDescription_tableName,
+
+    -- ** StreamRecord
+    streamRecord_approximateCreationDateTime,
+    streamRecord_keys,
+    streamRecord_newImage,
+    streamRecord_oldImage,
+    streamRecord_sequenceNumber,
+    streamRecord_sizeBytes,
+    streamRecord_streamViewType,
+  )
+where
+
+import Amazonka.DynamoDBStreams.DescribeStream
+import Amazonka.DynamoDBStreams.GetRecords
+import Amazonka.DynamoDBStreams.GetShardIterator
+import Amazonka.DynamoDBStreams.ListStreams
+import Amazonka.DynamoDBStreams.Types.Identity
+import Amazonka.DynamoDBStreams.Types.KeySchemaElement
+import Amazonka.DynamoDBStreams.Types.Record
+import Amazonka.DynamoDBStreams.Types.SequenceNumberRange
+import Amazonka.DynamoDBStreams.Types.Shard
+import Amazonka.DynamoDBStreams.Types.Stream
+import Amazonka.DynamoDBStreams.Types.StreamDescription
+import Amazonka.DynamoDBStreams.Types.StreamRecord
diff --git a/gen/Amazonka/DynamoDBStreams/ListStreams.hs b/gen/Amazonka/DynamoDBStreams/ListStreams.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/ListStreams.hs
@@ -0,0 +1,259 @@
+{-# 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.DynamoDBStreams.ListStreams
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns an array of stream ARNs associated with the current account and
+-- endpoint. If the @TableName@ parameter is present, then @ListStreams@
+-- will return only the streams ARNs for that table.
+--
+-- You can call @ListStreams@ at a maximum rate of 5 times per second.
+module Amazonka.DynamoDBStreams.ListStreams
+  ( -- * Creating a Request
+    ListStreams (..),
+    newListStreams,
+
+    -- * Request Lenses
+    listStreams_exclusiveStartStreamArn,
+    listStreams_limit,
+    listStreams_tableName,
+
+    -- * Destructuring the Response
+    ListStreamsResponse (..),
+    newListStreamsResponse,
+
+    -- * Response Lenses
+    listStreamsResponse_lastEvaluatedStreamArn,
+    listStreamsResponse_streams,
+    listStreamsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Represents the input of a @ListStreams@ operation.
+--
+-- /See:/ 'newListStreams' smart constructor.
+data ListStreams = ListStreams'
+  { -- | The ARN (Amazon Resource Name) of the first item that this operation
+    -- will evaluate. Use the value that was returned for
+    -- @LastEvaluatedStreamArn@ in the previous operation.
+    exclusiveStartStreamArn :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of streams to return. The upper limit is 100.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | If this parameter is provided, then only the streams associated with
+    -- this table name are returned.
+    tableName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListStreams' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exclusiveStartStreamArn', 'listStreams_exclusiveStartStreamArn' - The ARN (Amazon Resource Name) of the first item that this operation
+-- will evaluate. Use the value that was returned for
+-- @LastEvaluatedStreamArn@ in the previous operation.
+--
+-- 'limit', 'listStreams_limit' - The maximum number of streams to return. The upper limit is 100.
+--
+-- 'tableName', 'listStreams_tableName' - If this parameter is provided, then only the streams associated with
+-- this table name are returned.
+newListStreams ::
+  ListStreams
+newListStreams =
+  ListStreams'
+    { exclusiveStartStreamArn =
+        Prelude.Nothing,
+      limit = Prelude.Nothing,
+      tableName = Prelude.Nothing
+    }
+
+-- | The ARN (Amazon Resource Name) of the first item that this operation
+-- will evaluate. Use the value that was returned for
+-- @LastEvaluatedStreamArn@ in the previous operation.
+listStreams_exclusiveStartStreamArn :: Lens.Lens' ListStreams (Prelude.Maybe Prelude.Text)
+listStreams_exclusiveStartStreamArn = Lens.lens (\ListStreams' {exclusiveStartStreamArn} -> exclusiveStartStreamArn) (\s@ListStreams' {} a -> s {exclusiveStartStreamArn = a} :: ListStreams)
+
+-- | The maximum number of streams to return. The upper limit is 100.
+listStreams_limit :: Lens.Lens' ListStreams (Prelude.Maybe Prelude.Natural)
+listStreams_limit = Lens.lens (\ListStreams' {limit} -> limit) (\s@ListStreams' {} a -> s {limit = a} :: ListStreams)
+
+-- | If this parameter is provided, then only the streams associated with
+-- this table name are returned.
+listStreams_tableName :: Lens.Lens' ListStreams (Prelude.Maybe Prelude.Text)
+listStreams_tableName = Lens.lens (\ListStreams' {tableName} -> tableName) (\s@ListStreams' {} a -> s {tableName = a} :: ListStreams)
+
+instance Core.AWSRequest ListStreams where
+  type AWSResponse ListStreams = ListStreamsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListStreamsResponse'
+            Prelude.<$> (x Data..?> "LastEvaluatedStreamArn")
+            Prelude.<*> (x Data..?> "Streams" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListStreams where
+  hashWithSalt _salt ListStreams' {..} =
+    _salt
+      `Prelude.hashWithSalt` exclusiveStartStreamArn
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData ListStreams where
+  rnf ListStreams' {..} =
+    Prelude.rnf exclusiveStartStreamArn
+      `Prelude.seq` Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf tableName
+
+instance Data.ToHeaders ListStreams where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "DynamoDBStreams_20120810.ListStreams" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListStreams where
+  toJSON ListStreams' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ExclusiveStartStreamArn" Data..=)
+              Prelude.<$> exclusiveStartStreamArn,
+            ("Limit" Data..=) Prelude.<$> limit,
+            ("TableName" Data..=) Prelude.<$> tableName
+          ]
+      )
+
+instance Data.ToPath ListStreams where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListStreams where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Represents the output of a @ListStreams@ operation.
+--
+-- /See:/ 'newListStreamsResponse' smart constructor.
+data ListStreamsResponse = ListStreamsResponse'
+  { -- | The stream ARN of the item where the operation stopped, inclusive of the
+    -- previous result set. Use this value to start a new operation, excluding
+    -- this value in the new request.
+    --
+    -- If @LastEvaluatedStreamArn@ is empty, then the \"last page\" of results
+    -- has been processed and there is no more data to be retrieved.
+    --
+    -- If @LastEvaluatedStreamArn@ is not empty, it does not necessarily mean
+    -- that there is more data in the result set. The only way to know when you
+    -- have reached the end of the result set is when @LastEvaluatedStreamArn@
+    -- is empty.
+    lastEvaluatedStreamArn :: Prelude.Maybe Prelude.Text,
+    -- | A list of stream descriptors associated with the current account and
+    -- endpoint.
+    streams :: Prelude.Maybe [Stream],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListStreamsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lastEvaluatedStreamArn', 'listStreamsResponse_lastEvaluatedStreamArn' - The stream ARN of the item where the operation stopped, inclusive of the
+-- previous result set. Use this value to start a new operation, excluding
+-- this value in the new request.
+--
+-- If @LastEvaluatedStreamArn@ is empty, then the \"last page\" of results
+-- has been processed and there is no more data to be retrieved.
+--
+-- If @LastEvaluatedStreamArn@ is not empty, it does not necessarily mean
+-- that there is more data in the result set. The only way to know when you
+-- have reached the end of the result set is when @LastEvaluatedStreamArn@
+-- is empty.
+--
+-- 'streams', 'listStreamsResponse_streams' - A list of stream descriptors associated with the current account and
+-- endpoint.
+--
+-- 'httpStatus', 'listStreamsResponse_httpStatus' - The response's http status code.
+newListStreamsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListStreamsResponse
+newListStreamsResponse pHttpStatus_ =
+  ListStreamsResponse'
+    { lastEvaluatedStreamArn =
+        Prelude.Nothing,
+      streams = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The stream ARN of the item where the operation stopped, inclusive of the
+-- previous result set. Use this value to start a new operation, excluding
+-- this value in the new request.
+--
+-- If @LastEvaluatedStreamArn@ is empty, then the \"last page\" of results
+-- has been processed and there is no more data to be retrieved.
+--
+-- If @LastEvaluatedStreamArn@ is not empty, it does not necessarily mean
+-- that there is more data in the result set. The only way to know when you
+-- have reached the end of the result set is when @LastEvaluatedStreamArn@
+-- is empty.
+listStreamsResponse_lastEvaluatedStreamArn :: Lens.Lens' ListStreamsResponse (Prelude.Maybe Prelude.Text)
+listStreamsResponse_lastEvaluatedStreamArn = Lens.lens (\ListStreamsResponse' {lastEvaluatedStreamArn} -> lastEvaluatedStreamArn) (\s@ListStreamsResponse' {} a -> s {lastEvaluatedStreamArn = a} :: ListStreamsResponse)
+
+-- | A list of stream descriptors associated with the current account and
+-- endpoint.
+listStreamsResponse_streams :: Lens.Lens' ListStreamsResponse (Prelude.Maybe [Stream])
+listStreamsResponse_streams = Lens.lens (\ListStreamsResponse' {streams} -> streams) (\s@ListStreamsResponse' {} a -> s {streams = a} :: ListStreamsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listStreamsResponse_httpStatus :: Lens.Lens' ListStreamsResponse Prelude.Int
+listStreamsResponse_httpStatus = Lens.lens (\ListStreamsResponse' {httpStatus} -> httpStatus) (\s@ListStreamsResponse' {} a -> s {httpStatus = a} :: ListStreamsResponse)
+
+instance Prelude.NFData ListStreamsResponse where
+  rnf ListStreamsResponse' {..} =
+    Prelude.rnf lastEvaluatedStreamArn
+      `Prelude.seq` Prelude.rnf streams
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/DynamoDBStreams/Types.hs b/gen/Amazonka/DynamoDBStreams/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types.hs
@@ -0,0 +1,268 @@
+{-# 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.DynamoDBStreams.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.DynamoDBStreams.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _ExpiredIteratorException,
+    _InternalServerError,
+    _LimitExceededException,
+    _ResourceNotFoundException,
+    _TrimmedDataAccessException,
+
+    -- * Re-exported Types
+    module Amazonka.DynamoDBStreams.Internal,
+
+    -- * KeyType
+    KeyType (..),
+
+    -- * OperationType
+    OperationType (..),
+
+    -- * ShardIteratorType
+    ShardIteratorType (..),
+
+    -- * StreamStatus
+    StreamStatus (..),
+
+    -- * StreamViewType
+    StreamViewType (..),
+
+    -- * Identity
+    Identity (..),
+    newIdentity,
+    identity_principalId,
+    identity_type,
+
+    -- * KeySchemaElement
+    KeySchemaElement (..),
+    newKeySchemaElement,
+    keySchemaElement_attributeName,
+    keySchemaElement_keyType,
+
+    -- * Record
+    Record (..),
+    newRecord,
+    record_awsRegion,
+    record_dynamodb,
+    record_eventID,
+    record_eventName,
+    record_eventSource,
+    record_eventVersion,
+    record_userIdentity,
+
+    -- * SequenceNumberRange
+    SequenceNumberRange (..),
+    newSequenceNumberRange,
+    sequenceNumberRange_endingSequenceNumber,
+    sequenceNumberRange_startingSequenceNumber,
+
+    -- * Shard
+    Shard (..),
+    newShard,
+    shard_parentShardId,
+    shard_sequenceNumberRange,
+    shard_shardId,
+
+    -- * Stream
+    Stream (..),
+    newStream,
+    stream_streamArn,
+    stream_streamLabel,
+    stream_tableName,
+
+    -- * StreamDescription
+    StreamDescription (..),
+    newStreamDescription,
+    streamDescription_creationRequestDateTime,
+    streamDescription_keySchema,
+    streamDescription_lastEvaluatedShardId,
+    streamDescription_shards,
+    streamDescription_streamArn,
+    streamDescription_streamLabel,
+    streamDescription_streamStatus,
+    streamDescription_streamViewType,
+    streamDescription_tableName,
+
+    -- * StreamRecord
+    StreamRecord (..),
+    newStreamRecord,
+    streamRecord_approximateCreationDateTime,
+    streamRecord_keys,
+    streamRecord_newImage,
+    streamRecord_oldImage,
+    streamRecord_sequenceNumber,
+    streamRecord_sizeBytes,
+    streamRecord_streamViewType,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.DynamoDBStreams.Internal
+import Amazonka.DynamoDBStreams.Types.Identity
+import Amazonka.DynamoDBStreams.Types.KeySchemaElement
+import Amazonka.DynamoDBStreams.Types.KeyType
+import Amazonka.DynamoDBStreams.Types.OperationType
+import Amazonka.DynamoDBStreams.Types.Record
+import Amazonka.DynamoDBStreams.Types.SequenceNumberRange
+import Amazonka.DynamoDBStreams.Types.Shard
+import Amazonka.DynamoDBStreams.Types.ShardIteratorType
+import Amazonka.DynamoDBStreams.Types.Stream
+import Amazonka.DynamoDBStreams.Types.StreamDescription
+import Amazonka.DynamoDBStreams.Types.StreamRecord
+import Amazonka.DynamoDBStreams.Types.StreamStatus
+import Amazonka.DynamoDBStreams.Types.StreamViewType
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2012-08-10@ of the Amazon DynamoDB Streams SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "DynamoDBStreams",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "streams.dynamodb",
+      Core.signingName = "dynamodb",
+      Core.version = "2012-08-10",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "DynamoDBStreams",
+      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 shard iterator has expired and can no longer be used to retrieve
+-- stream records. A shard iterator expires 15 minutes after it is
+-- retrieved using the @GetShardIterator@ action.
+_ExpiredIteratorException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ExpiredIteratorException =
+  Core._MatchServiceError
+    defaultService
+    "ExpiredIteratorException"
+
+-- | An error occurred on the server side.
+_InternalServerError :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerError =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerError"
+
+-- | There is no limit to the number of daily on-demand backups that can be
+-- taken.
+--
+-- For most purposes, up to 500 simultaneous table operations are allowed
+-- per account. These operations include @CreateTable@, @UpdateTable@,
+-- @DeleteTable@,@UpdateTimeToLive@, @RestoreTableFromBackup@, and
+-- @RestoreTableToPointInTime@.
+--
+-- When you are creating a table with one or more secondary indexes, you
+-- can have up to 250 such requests running at a time. However, if the
+-- table or index specifications are complex, then DynamoDB might
+-- temporarily reduce the number of concurrent operations.
+--
+-- When importing into DynamoDB, up to 50 simultaneous import table
+-- operations are allowed per account.
+--
+-- There is a soft account quota of 2,500 tables.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+
+-- | The operation tried to access a nonexistent table or index. The resource
+-- might not be specified correctly, or its status might not be @ACTIVE@.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+
+-- | The operation attempted to read past the oldest stream record in a
+-- shard.
+--
+-- In DynamoDB Streams, there is a 24 hour limit on data retention. Stream
+-- records whose age exceeds this limit are subject to removal (trimming)
+-- from the stream. You might receive a TrimmedDataAccessException if:
+--
+-- -   You request a shard iterator with a sequence number older than the
+--     trim point (24 hours).
+--
+-- -   You obtain a shard iterator, but before you use the iterator in a
+--     @GetRecords@ request, a stream record in the shard exceeds the 24
+--     hour period and is trimmed. This causes the iterator to access a
+--     record that no longer exists.
+_TrimmedDataAccessException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TrimmedDataAccessException =
+  Core._MatchServiceError
+    defaultService
+    "TrimmedDataAccessException"
diff --git a/gen/Amazonka/DynamoDBStreams/Types/Identity.hs b/gen/Amazonka/DynamoDBStreams/Types/Identity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/Identity.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.DynamoDBStreams.Types.Identity
+-- 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.DynamoDBStreams.Types.Identity where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains details about the type of identity that made the request.
+--
+-- /See:/ 'newIdentity' smart constructor.
+data Identity = Identity'
+  { -- | A unique identifier for the entity that made the call. For Time To Live,
+    -- the principalId is \"dynamodb.amazonaws.com\".
+    principalId :: Prelude.Maybe Prelude.Text,
+    -- | The type of the identity. For Time To Live, the type is \"Service\".
+    type' :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Identity' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'principalId', 'identity_principalId' - A unique identifier for the entity that made the call. For Time To Live,
+-- the principalId is \"dynamodb.amazonaws.com\".
+--
+-- 'type'', 'identity_type' - The type of the identity. For Time To Live, the type is \"Service\".
+newIdentity ::
+  Identity
+newIdentity =
+  Identity'
+    { principalId = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | A unique identifier for the entity that made the call. For Time To Live,
+-- the principalId is \"dynamodb.amazonaws.com\".
+identity_principalId :: Lens.Lens' Identity (Prelude.Maybe Prelude.Text)
+identity_principalId = Lens.lens (\Identity' {principalId} -> principalId) (\s@Identity' {} a -> s {principalId = a} :: Identity)
+
+-- | The type of the identity. For Time To Live, the type is \"Service\".
+identity_type :: Lens.Lens' Identity (Prelude.Maybe Prelude.Text)
+identity_type = Lens.lens (\Identity' {type'} -> type') (\s@Identity' {} a -> s {type' = a} :: Identity)
+
+instance Data.FromJSON Identity where
+  parseJSON =
+    Data.withObject
+      "Identity"
+      ( \x ->
+          Identity'
+            Prelude.<$> (x Data..:? "PrincipalId")
+            Prelude.<*> (x Data..:? "Type")
+      )
+
+instance Prelude.Hashable Identity where
+  hashWithSalt _salt Identity' {..} =
+    _salt
+      `Prelude.hashWithSalt` principalId
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData Identity where
+  rnf Identity' {..} =
+    Prelude.rnf principalId
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/DynamoDBStreams/Types/KeySchemaElement.hs b/gen/Amazonka/DynamoDBStreams/Types/KeySchemaElement.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/KeySchemaElement.hs
@@ -0,0 +1,144 @@
+{-# 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.DynamoDBStreams.Types.KeySchemaElement
+-- 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.DynamoDBStreams.Types.KeySchemaElement where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import Amazonka.DynamoDBStreams.Types.KeyType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents /a single element/ of a key schema. A key schema specifies
+-- the attributes that make up the primary key of a table, or the key
+-- attributes of an index.
+--
+-- A @KeySchemaElement@ represents exactly one attribute of the primary
+-- key. For example, a simple primary key would be represented by one
+-- @KeySchemaElement@ (for the partition key). A composite primary key
+-- would require one @KeySchemaElement@ for the partition key, and another
+-- @KeySchemaElement@ for the sort key.
+--
+-- A @KeySchemaElement@ must be a scalar, top-level attribute (not a nested
+-- attribute). The data type must be one of String, Number, or Binary. The
+-- attribute cannot be nested within a List or a Map.
+--
+-- /See:/ 'newKeySchemaElement' smart constructor.
+data KeySchemaElement = KeySchemaElement'
+  { -- | The name of a key attribute.
+    attributeName :: Prelude.Text,
+    -- | The role that this key attribute will assume:
+    --
+    -- -   @HASH@ - partition key
+    --
+    -- -   @RANGE@ - sort key
+    --
+    -- The partition key of an item is also known as its /hash attribute/. The
+    -- term \"hash attribute\" derives from DynamoDB\'s usage of an internal
+    -- hash function to evenly distribute data items across partitions, based
+    -- on their partition key values.
+    --
+    -- The sort key of an item is also known as its /range attribute/. The term
+    -- \"range attribute\" derives from the way DynamoDB stores items with the
+    -- same partition key physically close together, in sorted order by the
+    -- sort key value.
+    keyType :: KeyType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'KeySchemaElement' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'attributeName', 'keySchemaElement_attributeName' - The name of a key attribute.
+--
+-- 'keyType', 'keySchemaElement_keyType' - The role that this key attribute will assume:
+--
+-- -   @HASH@ - partition key
+--
+-- -   @RANGE@ - sort key
+--
+-- The partition key of an item is also known as its /hash attribute/. The
+-- term \"hash attribute\" derives from DynamoDB\'s usage of an internal
+-- hash function to evenly distribute data items across partitions, based
+-- on their partition key values.
+--
+-- The sort key of an item is also known as its /range attribute/. The term
+-- \"range attribute\" derives from the way DynamoDB stores items with the
+-- same partition key physically close together, in sorted order by the
+-- sort key value.
+newKeySchemaElement ::
+  -- | 'attributeName'
+  Prelude.Text ->
+  -- | 'keyType'
+  KeyType ->
+  KeySchemaElement
+newKeySchemaElement pAttributeName_ pKeyType_ =
+  KeySchemaElement'
+    { attributeName = pAttributeName_,
+      keyType = pKeyType_
+    }
+
+-- | The name of a key attribute.
+keySchemaElement_attributeName :: Lens.Lens' KeySchemaElement Prelude.Text
+keySchemaElement_attributeName = Lens.lens (\KeySchemaElement' {attributeName} -> attributeName) (\s@KeySchemaElement' {} a -> s {attributeName = a} :: KeySchemaElement)
+
+-- | The role that this key attribute will assume:
+--
+-- -   @HASH@ - partition key
+--
+-- -   @RANGE@ - sort key
+--
+-- The partition key of an item is also known as its /hash attribute/. The
+-- term \"hash attribute\" derives from DynamoDB\'s usage of an internal
+-- hash function to evenly distribute data items across partitions, based
+-- on their partition key values.
+--
+-- The sort key of an item is also known as its /range attribute/. The term
+-- \"range attribute\" derives from the way DynamoDB stores items with the
+-- same partition key physically close together, in sorted order by the
+-- sort key value.
+keySchemaElement_keyType :: Lens.Lens' KeySchemaElement KeyType
+keySchemaElement_keyType = Lens.lens (\KeySchemaElement' {keyType} -> keyType) (\s@KeySchemaElement' {} a -> s {keyType = a} :: KeySchemaElement)
+
+instance Data.FromJSON KeySchemaElement where
+  parseJSON =
+    Data.withObject
+      "KeySchemaElement"
+      ( \x ->
+          KeySchemaElement'
+            Prelude.<$> (x Data..: "AttributeName")
+            Prelude.<*> (x Data..: "KeyType")
+      )
+
+instance Prelude.Hashable KeySchemaElement where
+  hashWithSalt _salt KeySchemaElement' {..} =
+    _salt
+      `Prelude.hashWithSalt` attributeName
+      `Prelude.hashWithSalt` keyType
+
+instance Prelude.NFData KeySchemaElement where
+  rnf KeySchemaElement' {..} =
+    Prelude.rnf attributeName
+      `Prelude.seq` Prelude.rnf keyType
diff --git a/gen/Amazonka/DynamoDBStreams/Types/KeyType.hs b/gen/Amazonka/DynamoDBStreams/Types/KeyType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/KeyType.hs
@@ -0,0 +1,69 @@
+{-# 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.DynamoDBStreams.Types.KeyType
+-- 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.DynamoDBStreams.Types.KeyType
+  ( KeyType
+      ( ..,
+        KeyType_HASH,
+        KeyType_RANGE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import qualified Amazonka.Prelude as Prelude
+
+newtype KeyType = KeyType' {fromKeyType :: 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 KeyType_HASH :: KeyType
+pattern KeyType_HASH = KeyType' "HASH"
+
+pattern KeyType_RANGE :: KeyType
+pattern KeyType_RANGE = KeyType' "RANGE"
+
+{-# COMPLETE
+  KeyType_HASH,
+  KeyType_RANGE,
+  KeyType'
+  #-}
diff --git a/gen/Amazonka/DynamoDBStreams/Types/OperationType.hs b/gen/Amazonka/DynamoDBStreams/Types/OperationType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/OperationType.hs
@@ -0,0 +1,77 @@
+{-# 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.DynamoDBStreams.Types.OperationType
+-- 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.DynamoDBStreams.Types.OperationType
+  ( OperationType
+      ( ..,
+        OperationType_INSERT,
+        OperationType_MODIFY,
+        OperationType_REMOVE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import qualified Amazonka.Prelude as Prelude
+
+newtype OperationType = OperationType'
+  { fromOperationType ::
+      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 OperationType_INSERT :: OperationType
+pattern OperationType_INSERT = OperationType' "INSERT"
+
+pattern OperationType_MODIFY :: OperationType
+pattern OperationType_MODIFY = OperationType' "MODIFY"
+
+pattern OperationType_REMOVE :: OperationType
+pattern OperationType_REMOVE = OperationType' "REMOVE"
+
+{-# COMPLETE
+  OperationType_INSERT,
+  OperationType_MODIFY,
+  OperationType_REMOVE,
+  OperationType'
+  #-}
diff --git a/gen/Amazonka/DynamoDBStreams/Types/Record.hs b/gen/Amazonka/DynamoDBStreams/Types/Record.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/Record.hs
@@ -0,0 +1,223 @@
+{-# 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.DynamoDBStreams.Types.Record
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.DynamoDBStreams.Types.Record where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import Amazonka.DynamoDBStreams.Types.Identity
+import Amazonka.DynamoDBStreams.Types.OperationType
+import Amazonka.DynamoDBStreams.Types.StreamRecord
+import qualified Amazonka.Prelude as Prelude
+
+-- | A description of a unique event within a stream.
+--
+-- /See:/ 'newRecord' smart constructor.
+data Record = Record'
+  { -- | The region in which the @GetRecords@ request was received.
+    awsRegion :: Prelude.Maybe Prelude.Text,
+    -- | The main body of the stream record, containing all of the
+    -- DynamoDB-specific fields.
+    dynamodb :: Prelude.Maybe StreamRecord,
+    -- | A globally unique identifier for the event that was recorded in this
+    -- stream record.
+    eventID :: Prelude.Maybe Prelude.Text,
+    -- | The type of data modification that was performed on the DynamoDB table:
+    --
+    -- -   @INSERT@ - a new item was added to the table.
+    --
+    -- -   @MODIFY@ - one or more of an existing item\'s attributes were
+    --     modified.
+    --
+    -- -   @REMOVE@ - the item was deleted from the table
+    eventName :: Prelude.Maybe OperationType,
+    -- | The AWS service from which the stream record originated. For DynamoDB
+    -- Streams, this is @aws:dynamodb@.
+    eventSource :: Prelude.Maybe Prelude.Text,
+    -- | The version number of the stream record format. This number is updated
+    -- whenever the structure of @Record@ is modified.
+    --
+    -- Client applications must not assume that @eventVersion@ will remain at a
+    -- particular value, as this number is subject to change at any time. In
+    -- general, @eventVersion@ will only increase as the low-level DynamoDB
+    -- Streams API evolves.
+    eventVersion :: Prelude.Maybe Prelude.Text,
+    -- | Items that are deleted by the Time to Live process after expiration have
+    -- the following fields:
+    --
+    -- -   Records[].userIdentity.type
+    --
+    --     \"Service\"
+    --
+    -- -   Records[].userIdentity.principalId
+    --
+    --     \"dynamodb.amazonaws.com\"
+    userIdentity :: Prelude.Maybe Identity
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Record' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'awsRegion', 'record_awsRegion' - The region in which the @GetRecords@ request was received.
+--
+-- 'dynamodb', 'record_dynamodb' - The main body of the stream record, containing all of the
+-- DynamoDB-specific fields.
+--
+-- 'eventID', 'record_eventID' - A globally unique identifier for the event that was recorded in this
+-- stream record.
+--
+-- 'eventName', 'record_eventName' - The type of data modification that was performed on the DynamoDB table:
+--
+-- -   @INSERT@ - a new item was added to the table.
+--
+-- -   @MODIFY@ - one or more of an existing item\'s attributes were
+--     modified.
+--
+-- -   @REMOVE@ - the item was deleted from the table
+--
+-- 'eventSource', 'record_eventSource' - The AWS service from which the stream record originated. For DynamoDB
+-- Streams, this is @aws:dynamodb@.
+--
+-- 'eventVersion', 'record_eventVersion' - The version number of the stream record format. This number is updated
+-- whenever the structure of @Record@ is modified.
+--
+-- Client applications must not assume that @eventVersion@ will remain at a
+-- particular value, as this number is subject to change at any time. In
+-- general, @eventVersion@ will only increase as the low-level DynamoDB
+-- Streams API evolves.
+--
+-- 'userIdentity', 'record_userIdentity' - Items that are deleted by the Time to Live process after expiration have
+-- the following fields:
+--
+-- -   Records[].userIdentity.type
+--
+--     \"Service\"
+--
+-- -   Records[].userIdentity.principalId
+--
+--     \"dynamodb.amazonaws.com\"
+newRecord ::
+  Record
+newRecord =
+  Record'
+    { awsRegion = Prelude.Nothing,
+      dynamodb = Prelude.Nothing,
+      eventID = Prelude.Nothing,
+      eventName = Prelude.Nothing,
+      eventSource = Prelude.Nothing,
+      eventVersion = Prelude.Nothing,
+      userIdentity = Prelude.Nothing
+    }
+
+-- | The region in which the @GetRecords@ request was received.
+record_awsRegion :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
+record_awsRegion = Lens.lens (\Record' {awsRegion} -> awsRegion) (\s@Record' {} a -> s {awsRegion = a} :: Record)
+
+-- | The main body of the stream record, containing all of the
+-- DynamoDB-specific fields.
+record_dynamodb :: Lens.Lens' Record (Prelude.Maybe StreamRecord)
+record_dynamodb = Lens.lens (\Record' {dynamodb} -> dynamodb) (\s@Record' {} a -> s {dynamodb = a} :: Record)
+
+-- | A globally unique identifier for the event that was recorded in this
+-- stream record.
+record_eventID :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
+record_eventID = Lens.lens (\Record' {eventID} -> eventID) (\s@Record' {} a -> s {eventID = a} :: Record)
+
+-- | The type of data modification that was performed on the DynamoDB table:
+--
+-- -   @INSERT@ - a new item was added to the table.
+--
+-- -   @MODIFY@ - one or more of an existing item\'s attributes were
+--     modified.
+--
+-- -   @REMOVE@ - the item was deleted from the table
+record_eventName :: Lens.Lens' Record (Prelude.Maybe OperationType)
+record_eventName = Lens.lens (\Record' {eventName} -> eventName) (\s@Record' {} a -> s {eventName = a} :: Record)
+
+-- | The AWS service from which the stream record originated. For DynamoDB
+-- Streams, this is @aws:dynamodb@.
+record_eventSource :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
+record_eventSource = Lens.lens (\Record' {eventSource} -> eventSource) (\s@Record' {} a -> s {eventSource = a} :: Record)
+
+-- | The version number of the stream record format. This number is updated
+-- whenever the structure of @Record@ is modified.
+--
+-- Client applications must not assume that @eventVersion@ will remain at a
+-- particular value, as this number is subject to change at any time. In
+-- general, @eventVersion@ will only increase as the low-level DynamoDB
+-- Streams API evolves.
+record_eventVersion :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
+record_eventVersion = Lens.lens (\Record' {eventVersion} -> eventVersion) (\s@Record' {} a -> s {eventVersion = a} :: Record)
+
+-- | Items that are deleted by the Time to Live process after expiration have
+-- the following fields:
+--
+-- -   Records[].userIdentity.type
+--
+--     \"Service\"
+--
+-- -   Records[].userIdentity.principalId
+--
+--     \"dynamodb.amazonaws.com\"
+record_userIdentity :: Lens.Lens' Record (Prelude.Maybe Identity)
+record_userIdentity = Lens.lens (\Record' {userIdentity} -> userIdentity) (\s@Record' {} a -> s {userIdentity = a} :: Record)
+
+instance Data.FromJSON Record where
+  parseJSON =
+    Data.withObject
+      "Record"
+      ( \x ->
+          Record'
+            Prelude.<$> (x Data..:? "awsRegion")
+            Prelude.<*> (x Data..:? "dynamodb")
+            Prelude.<*> (x Data..:? "eventID")
+            Prelude.<*> (x Data..:? "eventName")
+            Prelude.<*> (x Data..:? "eventSource")
+            Prelude.<*> (x Data..:? "eventVersion")
+            Prelude.<*> (x Data..:? "userIdentity")
+      )
+
+instance Prelude.Hashable Record where
+  hashWithSalt _salt Record' {..} =
+    _salt
+      `Prelude.hashWithSalt` awsRegion
+      `Prelude.hashWithSalt` dynamodb
+      `Prelude.hashWithSalt` eventID
+      `Prelude.hashWithSalt` eventName
+      `Prelude.hashWithSalt` eventSource
+      `Prelude.hashWithSalt` eventVersion
+      `Prelude.hashWithSalt` userIdentity
+
+instance Prelude.NFData Record where
+  rnf Record' {..} =
+    Prelude.rnf awsRegion
+      `Prelude.seq` Prelude.rnf dynamodb
+      `Prelude.seq` Prelude.rnf eventID
+      `Prelude.seq` Prelude.rnf eventName
+      `Prelude.seq` Prelude.rnf eventSource
+      `Prelude.seq` Prelude.rnf eventVersion
+      `Prelude.seq` Prelude.rnf userIdentity
diff --git a/gen/Amazonka/DynamoDBStreams/Types/SequenceNumberRange.hs b/gen/Amazonka/DynamoDBStreams/Types/SequenceNumberRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/SequenceNumberRange.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.DynamoDBStreams.Types.SequenceNumberRange
+-- 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.DynamoDBStreams.Types.SequenceNumberRange where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import qualified Amazonka.Prelude as Prelude
+
+-- | The beginning and ending sequence numbers for the stream records
+-- contained within a shard.
+--
+-- /See:/ 'newSequenceNumberRange' smart constructor.
+data SequenceNumberRange = SequenceNumberRange'
+  { -- | The last sequence number for the stream records contained within a
+    -- shard. String contains numeric characters only.
+    endingSequenceNumber :: Prelude.Maybe Prelude.Text,
+    -- | The first sequence number for the stream records contained within a
+    -- shard. String contains numeric characters only.
+    startingSequenceNumber :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SequenceNumberRange' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'endingSequenceNumber', 'sequenceNumberRange_endingSequenceNumber' - The last sequence number for the stream records contained within a
+-- shard. String contains numeric characters only.
+--
+-- 'startingSequenceNumber', 'sequenceNumberRange_startingSequenceNumber' - The first sequence number for the stream records contained within a
+-- shard. String contains numeric characters only.
+newSequenceNumberRange ::
+  SequenceNumberRange
+newSequenceNumberRange =
+  SequenceNumberRange'
+    { endingSequenceNumber =
+        Prelude.Nothing,
+      startingSequenceNumber = Prelude.Nothing
+    }
+
+-- | The last sequence number for the stream records contained within a
+-- shard. String contains numeric characters only.
+sequenceNumberRange_endingSequenceNumber :: Lens.Lens' SequenceNumberRange (Prelude.Maybe Prelude.Text)
+sequenceNumberRange_endingSequenceNumber = Lens.lens (\SequenceNumberRange' {endingSequenceNumber} -> endingSequenceNumber) (\s@SequenceNumberRange' {} a -> s {endingSequenceNumber = a} :: SequenceNumberRange)
+
+-- | The first sequence number for the stream records contained within a
+-- shard. String contains numeric characters only.
+sequenceNumberRange_startingSequenceNumber :: Lens.Lens' SequenceNumberRange (Prelude.Maybe Prelude.Text)
+sequenceNumberRange_startingSequenceNumber = Lens.lens (\SequenceNumberRange' {startingSequenceNumber} -> startingSequenceNumber) (\s@SequenceNumberRange' {} a -> s {startingSequenceNumber = a} :: SequenceNumberRange)
+
+instance Data.FromJSON SequenceNumberRange where
+  parseJSON =
+    Data.withObject
+      "SequenceNumberRange"
+      ( \x ->
+          SequenceNumberRange'
+            Prelude.<$> (x Data..:? "EndingSequenceNumber")
+            Prelude.<*> (x Data..:? "StartingSequenceNumber")
+      )
+
+instance Prelude.Hashable SequenceNumberRange where
+  hashWithSalt _salt SequenceNumberRange' {..} =
+    _salt
+      `Prelude.hashWithSalt` endingSequenceNumber
+      `Prelude.hashWithSalt` startingSequenceNumber
+
+instance Prelude.NFData SequenceNumberRange where
+  rnf SequenceNumberRange' {..} =
+    Prelude.rnf endingSequenceNumber
+      `Prelude.seq` Prelude.rnf startingSequenceNumber
diff --git a/gen/Amazonka/DynamoDBStreams/Types/Shard.hs b/gen/Amazonka/DynamoDBStreams/Types/Shard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/Shard.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.DynamoDBStreams.Types.Shard
+-- 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.DynamoDBStreams.Types.Shard where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import Amazonka.DynamoDBStreams.Types.SequenceNumberRange
+import qualified Amazonka.Prelude as Prelude
+
+-- | A uniquely identified group of stream records within a stream.
+--
+-- /See:/ 'newShard' smart constructor.
+data Shard = Shard'
+  { -- | The shard ID of the current shard\'s parent.
+    parentShardId :: Prelude.Maybe Prelude.Text,
+    -- | The range of possible sequence numbers for the shard.
+    sequenceNumberRange :: Prelude.Maybe SequenceNumberRange,
+    -- | The system-generated identifier for this shard.
+    shardId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Shard' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'parentShardId', 'shard_parentShardId' - The shard ID of the current shard\'s parent.
+--
+-- 'sequenceNumberRange', 'shard_sequenceNumberRange' - The range of possible sequence numbers for the shard.
+--
+-- 'shardId', 'shard_shardId' - The system-generated identifier for this shard.
+newShard ::
+  Shard
+newShard =
+  Shard'
+    { parentShardId = Prelude.Nothing,
+      sequenceNumberRange = Prelude.Nothing,
+      shardId = Prelude.Nothing
+    }
+
+-- | The shard ID of the current shard\'s parent.
+shard_parentShardId :: Lens.Lens' Shard (Prelude.Maybe Prelude.Text)
+shard_parentShardId = Lens.lens (\Shard' {parentShardId} -> parentShardId) (\s@Shard' {} a -> s {parentShardId = a} :: Shard)
+
+-- | The range of possible sequence numbers for the shard.
+shard_sequenceNumberRange :: Lens.Lens' Shard (Prelude.Maybe SequenceNumberRange)
+shard_sequenceNumberRange = Lens.lens (\Shard' {sequenceNumberRange} -> sequenceNumberRange) (\s@Shard' {} a -> s {sequenceNumberRange = a} :: Shard)
+
+-- | The system-generated identifier for this shard.
+shard_shardId :: Lens.Lens' Shard (Prelude.Maybe Prelude.Text)
+shard_shardId = Lens.lens (\Shard' {shardId} -> shardId) (\s@Shard' {} a -> s {shardId = a} :: Shard)
+
+instance Data.FromJSON Shard where
+  parseJSON =
+    Data.withObject
+      "Shard"
+      ( \x ->
+          Shard'
+            Prelude.<$> (x Data..:? "ParentShardId")
+            Prelude.<*> (x Data..:? "SequenceNumberRange")
+            Prelude.<*> (x Data..:? "ShardId")
+      )
+
+instance Prelude.Hashable Shard where
+  hashWithSalt _salt Shard' {..} =
+    _salt
+      `Prelude.hashWithSalt` parentShardId
+      `Prelude.hashWithSalt` sequenceNumberRange
+      `Prelude.hashWithSalt` shardId
+
+instance Prelude.NFData Shard where
+  rnf Shard' {..} =
+    Prelude.rnf parentShardId
+      `Prelude.seq` Prelude.rnf sequenceNumberRange
+      `Prelude.seq` Prelude.rnf shardId
diff --git a/gen/Amazonka/DynamoDBStreams/Types/ShardIteratorType.hs b/gen/Amazonka/DynamoDBStreams/Types/ShardIteratorType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/ShardIteratorType.hs
@@ -0,0 +1,82 @@
+{-# 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.DynamoDBStreams.Types.ShardIteratorType
+-- 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.DynamoDBStreams.Types.ShardIteratorType
+  ( ShardIteratorType
+      ( ..,
+        ShardIteratorType_AFTER_SEQUENCE_NUMBER,
+        ShardIteratorType_AT_SEQUENCE_NUMBER,
+        ShardIteratorType_LATEST,
+        ShardIteratorType_TRIM_HORIZON
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import qualified Amazonka.Prelude as Prelude
+
+newtype ShardIteratorType = ShardIteratorType'
+  { fromShardIteratorType ::
+      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 ShardIteratorType_AFTER_SEQUENCE_NUMBER :: ShardIteratorType
+pattern ShardIteratorType_AFTER_SEQUENCE_NUMBER = ShardIteratorType' "AFTER_SEQUENCE_NUMBER"
+
+pattern ShardIteratorType_AT_SEQUENCE_NUMBER :: ShardIteratorType
+pattern ShardIteratorType_AT_SEQUENCE_NUMBER = ShardIteratorType' "AT_SEQUENCE_NUMBER"
+
+pattern ShardIteratorType_LATEST :: ShardIteratorType
+pattern ShardIteratorType_LATEST = ShardIteratorType' "LATEST"
+
+pattern ShardIteratorType_TRIM_HORIZON :: ShardIteratorType
+pattern ShardIteratorType_TRIM_HORIZON = ShardIteratorType' "TRIM_HORIZON"
+
+{-# COMPLETE
+  ShardIteratorType_AFTER_SEQUENCE_NUMBER,
+  ShardIteratorType_AT_SEQUENCE_NUMBER,
+  ShardIteratorType_LATEST,
+  ShardIteratorType_TRIM_HORIZON,
+  ShardIteratorType'
+  #-}
diff --git a/gen/Amazonka/DynamoDBStreams/Types/Stream.hs b/gen/Amazonka/DynamoDBStreams/Types/Stream.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/Stream.hs
@@ -0,0 +1,130 @@
+{-# 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.DynamoDBStreams.Types.Stream
+-- 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.DynamoDBStreams.Types.Stream where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents all of the data describing a particular stream.
+--
+-- /See:/ 'newStream' smart constructor.
+data Stream = Stream'
+  { -- | The Amazon Resource Name (ARN) for the stream.
+    streamArn :: Prelude.Maybe Prelude.Text,
+    -- | A timestamp, in ISO 8601 format, for this stream.
+    --
+    -- Note that @LatestStreamLabel@ is not a unique identifier for the stream,
+    -- because it is possible that a stream from another table might have the
+    -- same timestamp. However, the combination of the following three elements
+    -- is guaranteed to be unique:
+    --
+    -- -   the AWS customer ID.
+    --
+    -- -   the table name
+    --
+    -- -   the @StreamLabel@
+    streamLabel :: Prelude.Maybe Prelude.Text,
+    -- | The DynamoDB table with which the stream is associated.
+    tableName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Stream' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'streamArn', 'stream_streamArn' - The Amazon Resource Name (ARN) for the stream.
+--
+-- 'streamLabel', 'stream_streamLabel' - A timestamp, in ISO 8601 format, for this stream.
+--
+-- Note that @LatestStreamLabel@ is not a unique identifier for the stream,
+-- because it is possible that a stream from another table might have the
+-- same timestamp. However, the combination of the following three elements
+-- is guaranteed to be unique:
+--
+-- -   the AWS customer ID.
+--
+-- -   the table name
+--
+-- -   the @StreamLabel@
+--
+-- 'tableName', 'stream_tableName' - The DynamoDB table with which the stream is associated.
+newStream ::
+  Stream
+newStream =
+  Stream'
+    { streamArn = Prelude.Nothing,
+      streamLabel = Prelude.Nothing,
+      tableName = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) for the stream.
+stream_streamArn :: Lens.Lens' Stream (Prelude.Maybe Prelude.Text)
+stream_streamArn = Lens.lens (\Stream' {streamArn} -> streamArn) (\s@Stream' {} a -> s {streamArn = a} :: Stream)
+
+-- | A timestamp, in ISO 8601 format, for this stream.
+--
+-- Note that @LatestStreamLabel@ is not a unique identifier for the stream,
+-- because it is possible that a stream from another table might have the
+-- same timestamp. However, the combination of the following three elements
+-- is guaranteed to be unique:
+--
+-- -   the AWS customer ID.
+--
+-- -   the table name
+--
+-- -   the @StreamLabel@
+stream_streamLabel :: Lens.Lens' Stream (Prelude.Maybe Prelude.Text)
+stream_streamLabel = Lens.lens (\Stream' {streamLabel} -> streamLabel) (\s@Stream' {} a -> s {streamLabel = a} :: Stream)
+
+-- | The DynamoDB table with which the stream is associated.
+stream_tableName :: Lens.Lens' Stream (Prelude.Maybe Prelude.Text)
+stream_tableName = Lens.lens (\Stream' {tableName} -> tableName) (\s@Stream' {} a -> s {tableName = a} :: Stream)
+
+instance Data.FromJSON Stream where
+  parseJSON =
+    Data.withObject
+      "Stream"
+      ( \x ->
+          Stream'
+            Prelude.<$> (x Data..:? "StreamArn")
+            Prelude.<*> (x Data..:? "StreamLabel")
+            Prelude.<*> (x Data..:? "TableName")
+      )
+
+instance Prelude.Hashable Stream where
+  hashWithSalt _salt Stream' {..} =
+    _salt
+      `Prelude.hashWithSalt` streamArn
+      `Prelude.hashWithSalt` streamLabel
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData Stream where
+  rnf Stream' {..} =
+    Prelude.rnf streamArn
+      `Prelude.seq` Prelude.rnf streamLabel
+      `Prelude.seq` Prelude.rnf tableName
diff --git a/gen/Amazonka/DynamoDBStreams/Types/StreamDescription.hs b/gen/Amazonka/DynamoDBStreams/Types/StreamDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/StreamDescription.hs
@@ -0,0 +1,303 @@
+{-# 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.DynamoDBStreams.Types.StreamDescription
+-- 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.DynamoDBStreams.Types.StreamDescription where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import Amazonka.DynamoDBStreams.Types.KeySchemaElement
+import Amazonka.DynamoDBStreams.Types.Shard
+import Amazonka.DynamoDBStreams.Types.StreamStatus
+import Amazonka.DynamoDBStreams.Types.StreamViewType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents all of the data describing a particular stream.
+--
+-- /See:/ 'newStreamDescription' smart constructor.
+data StreamDescription = StreamDescription'
+  { -- | The date and time when the request to create this stream was issued.
+    creationRequestDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The key attribute(s) of the stream\'s DynamoDB table.
+    keySchema :: Prelude.Maybe (Prelude.NonEmpty KeySchemaElement),
+    -- | The shard ID of the item where the operation stopped, inclusive of the
+    -- previous result set. Use this value to start a new operation, excluding
+    -- this value in the new request.
+    --
+    -- If @LastEvaluatedShardId@ is empty, then the \"last page\" of results
+    -- has been processed and there is currently no more data to be retrieved.
+    --
+    -- If @LastEvaluatedShardId@ is not empty, it does not necessarily mean
+    -- that there is more data in the result set. The only way to know when you
+    -- have reached the end of the result set is when @LastEvaluatedShardId@ is
+    -- empty.
+    lastEvaluatedShardId :: Prelude.Maybe Prelude.Text,
+    -- | The shards that comprise the stream.
+    shards :: Prelude.Maybe [Shard],
+    -- | The Amazon Resource Name (ARN) for the stream.
+    streamArn :: Prelude.Maybe Prelude.Text,
+    -- | A timestamp, in ISO 8601 format, for this stream.
+    --
+    -- Note that @LatestStreamLabel@ is not a unique identifier for the stream,
+    -- because it is possible that a stream from another table might have the
+    -- same timestamp. However, the combination of the following three elements
+    -- is guaranteed to be unique:
+    --
+    -- -   the AWS customer ID.
+    --
+    -- -   the table name
+    --
+    -- -   the @StreamLabel@
+    streamLabel :: Prelude.Maybe Prelude.Text,
+    -- | Indicates the current status of the stream:
+    --
+    -- -   @ENABLING@ - Streams is currently being enabled on the DynamoDB
+    --     table.
+    --
+    -- -   @ENABLED@ - the stream is enabled.
+    --
+    -- -   @DISABLING@ - Streams is currently being disabled on the DynamoDB
+    --     table.
+    --
+    -- -   @DISABLED@ - the stream is disabled.
+    streamStatus :: Prelude.Maybe StreamStatus,
+    -- | Indicates the format of the records within this stream:
+    --
+    -- -   @KEYS_ONLY@ - only the key attributes of items that were modified in
+    --     the DynamoDB table.
+    --
+    -- -   @NEW_IMAGE@ - entire items from the table, as they appeared after
+    --     they were modified.
+    --
+    -- -   @OLD_IMAGE@ - entire items from the table, as they appeared before
+    --     they were modified.
+    --
+    -- -   @NEW_AND_OLD_IMAGES@ - both the new and the old images of the items
+    --     from the table.
+    streamViewType :: Prelude.Maybe StreamViewType,
+    -- | The DynamoDB table with which the stream is associated.
+    tableName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StreamDescription' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationRequestDateTime', 'streamDescription_creationRequestDateTime' - The date and time when the request to create this stream was issued.
+--
+-- 'keySchema', 'streamDescription_keySchema' - The key attribute(s) of the stream\'s DynamoDB table.
+--
+-- 'lastEvaluatedShardId', 'streamDescription_lastEvaluatedShardId' - The shard ID of the item where the operation stopped, inclusive of the
+-- previous result set. Use this value to start a new operation, excluding
+-- this value in the new request.
+--
+-- If @LastEvaluatedShardId@ is empty, then the \"last page\" of results
+-- has been processed and there is currently no more data to be retrieved.
+--
+-- If @LastEvaluatedShardId@ is not empty, it does not necessarily mean
+-- that there is more data in the result set. The only way to know when you
+-- have reached the end of the result set is when @LastEvaluatedShardId@ is
+-- empty.
+--
+-- 'shards', 'streamDescription_shards' - The shards that comprise the stream.
+--
+-- 'streamArn', 'streamDescription_streamArn' - The Amazon Resource Name (ARN) for the stream.
+--
+-- 'streamLabel', 'streamDescription_streamLabel' - A timestamp, in ISO 8601 format, for this stream.
+--
+-- Note that @LatestStreamLabel@ is not a unique identifier for the stream,
+-- because it is possible that a stream from another table might have the
+-- same timestamp. However, the combination of the following three elements
+-- is guaranteed to be unique:
+--
+-- -   the AWS customer ID.
+--
+-- -   the table name
+--
+-- -   the @StreamLabel@
+--
+-- 'streamStatus', 'streamDescription_streamStatus' - Indicates the current status of the stream:
+--
+-- -   @ENABLING@ - Streams is currently being enabled on the DynamoDB
+--     table.
+--
+-- -   @ENABLED@ - the stream is enabled.
+--
+-- -   @DISABLING@ - Streams is currently being disabled on the DynamoDB
+--     table.
+--
+-- -   @DISABLED@ - the stream is disabled.
+--
+-- 'streamViewType', 'streamDescription_streamViewType' - Indicates the format of the records within this stream:
+--
+-- -   @KEYS_ONLY@ - only the key attributes of items that were modified in
+--     the DynamoDB table.
+--
+-- -   @NEW_IMAGE@ - entire items from the table, as they appeared after
+--     they were modified.
+--
+-- -   @OLD_IMAGE@ - entire items from the table, as they appeared before
+--     they were modified.
+--
+-- -   @NEW_AND_OLD_IMAGES@ - both the new and the old images of the items
+--     from the table.
+--
+-- 'tableName', 'streamDescription_tableName' - The DynamoDB table with which the stream is associated.
+newStreamDescription ::
+  StreamDescription
+newStreamDescription =
+  StreamDescription'
+    { creationRequestDateTime =
+        Prelude.Nothing,
+      keySchema = Prelude.Nothing,
+      lastEvaluatedShardId = Prelude.Nothing,
+      shards = Prelude.Nothing,
+      streamArn = Prelude.Nothing,
+      streamLabel = Prelude.Nothing,
+      streamStatus = Prelude.Nothing,
+      streamViewType = Prelude.Nothing,
+      tableName = Prelude.Nothing
+    }
+
+-- | The date and time when the request to create this stream was issued.
+streamDescription_creationRequestDateTime :: Lens.Lens' StreamDescription (Prelude.Maybe Prelude.UTCTime)
+streamDescription_creationRequestDateTime = Lens.lens (\StreamDescription' {creationRequestDateTime} -> creationRequestDateTime) (\s@StreamDescription' {} a -> s {creationRequestDateTime = a} :: StreamDescription) Prelude.. Lens.mapping Data._Time
+
+-- | The key attribute(s) of the stream\'s DynamoDB table.
+streamDescription_keySchema :: Lens.Lens' StreamDescription (Prelude.Maybe (Prelude.NonEmpty KeySchemaElement))
+streamDescription_keySchema = Lens.lens (\StreamDescription' {keySchema} -> keySchema) (\s@StreamDescription' {} a -> s {keySchema = a} :: StreamDescription) Prelude.. Lens.mapping Lens.coerced
+
+-- | The shard ID of the item where the operation stopped, inclusive of the
+-- previous result set. Use this value to start a new operation, excluding
+-- this value in the new request.
+--
+-- If @LastEvaluatedShardId@ is empty, then the \"last page\" of results
+-- has been processed and there is currently no more data to be retrieved.
+--
+-- If @LastEvaluatedShardId@ is not empty, it does not necessarily mean
+-- that there is more data in the result set. The only way to know when you
+-- have reached the end of the result set is when @LastEvaluatedShardId@ is
+-- empty.
+streamDescription_lastEvaluatedShardId :: Lens.Lens' StreamDescription (Prelude.Maybe Prelude.Text)
+streamDescription_lastEvaluatedShardId = Lens.lens (\StreamDescription' {lastEvaluatedShardId} -> lastEvaluatedShardId) (\s@StreamDescription' {} a -> s {lastEvaluatedShardId = a} :: StreamDescription)
+
+-- | The shards that comprise the stream.
+streamDescription_shards :: Lens.Lens' StreamDescription (Prelude.Maybe [Shard])
+streamDescription_shards = Lens.lens (\StreamDescription' {shards} -> shards) (\s@StreamDescription' {} a -> s {shards = a} :: StreamDescription) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) for the stream.
+streamDescription_streamArn :: Lens.Lens' StreamDescription (Prelude.Maybe Prelude.Text)
+streamDescription_streamArn = Lens.lens (\StreamDescription' {streamArn} -> streamArn) (\s@StreamDescription' {} a -> s {streamArn = a} :: StreamDescription)
+
+-- | A timestamp, in ISO 8601 format, for this stream.
+--
+-- Note that @LatestStreamLabel@ is not a unique identifier for the stream,
+-- because it is possible that a stream from another table might have the
+-- same timestamp. However, the combination of the following three elements
+-- is guaranteed to be unique:
+--
+-- -   the AWS customer ID.
+--
+-- -   the table name
+--
+-- -   the @StreamLabel@
+streamDescription_streamLabel :: Lens.Lens' StreamDescription (Prelude.Maybe Prelude.Text)
+streamDescription_streamLabel = Lens.lens (\StreamDescription' {streamLabel} -> streamLabel) (\s@StreamDescription' {} a -> s {streamLabel = a} :: StreamDescription)
+
+-- | Indicates the current status of the stream:
+--
+-- -   @ENABLING@ - Streams is currently being enabled on the DynamoDB
+--     table.
+--
+-- -   @ENABLED@ - the stream is enabled.
+--
+-- -   @DISABLING@ - Streams is currently being disabled on the DynamoDB
+--     table.
+--
+-- -   @DISABLED@ - the stream is disabled.
+streamDescription_streamStatus :: Lens.Lens' StreamDescription (Prelude.Maybe StreamStatus)
+streamDescription_streamStatus = Lens.lens (\StreamDescription' {streamStatus} -> streamStatus) (\s@StreamDescription' {} a -> s {streamStatus = a} :: StreamDescription)
+
+-- | Indicates the format of the records within this stream:
+--
+-- -   @KEYS_ONLY@ - only the key attributes of items that were modified in
+--     the DynamoDB table.
+--
+-- -   @NEW_IMAGE@ - entire items from the table, as they appeared after
+--     they were modified.
+--
+-- -   @OLD_IMAGE@ - entire items from the table, as they appeared before
+--     they were modified.
+--
+-- -   @NEW_AND_OLD_IMAGES@ - both the new and the old images of the items
+--     from the table.
+streamDescription_streamViewType :: Lens.Lens' StreamDescription (Prelude.Maybe StreamViewType)
+streamDescription_streamViewType = Lens.lens (\StreamDescription' {streamViewType} -> streamViewType) (\s@StreamDescription' {} a -> s {streamViewType = a} :: StreamDescription)
+
+-- | The DynamoDB table with which the stream is associated.
+streamDescription_tableName :: Lens.Lens' StreamDescription (Prelude.Maybe Prelude.Text)
+streamDescription_tableName = Lens.lens (\StreamDescription' {tableName} -> tableName) (\s@StreamDescription' {} a -> s {tableName = a} :: StreamDescription)
+
+instance Data.FromJSON StreamDescription where
+  parseJSON =
+    Data.withObject
+      "StreamDescription"
+      ( \x ->
+          StreamDescription'
+            Prelude.<$> (x Data..:? "CreationRequestDateTime")
+            Prelude.<*> (x Data..:? "KeySchema")
+            Prelude.<*> (x Data..:? "LastEvaluatedShardId")
+            Prelude.<*> (x Data..:? "Shards" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "StreamArn")
+            Prelude.<*> (x Data..:? "StreamLabel")
+            Prelude.<*> (x Data..:? "StreamStatus")
+            Prelude.<*> (x Data..:? "StreamViewType")
+            Prelude.<*> (x Data..:? "TableName")
+      )
+
+instance Prelude.Hashable StreamDescription where
+  hashWithSalt _salt StreamDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationRequestDateTime
+      `Prelude.hashWithSalt` keySchema
+      `Prelude.hashWithSalt` lastEvaluatedShardId
+      `Prelude.hashWithSalt` shards
+      `Prelude.hashWithSalt` streamArn
+      `Prelude.hashWithSalt` streamLabel
+      `Prelude.hashWithSalt` streamStatus
+      `Prelude.hashWithSalt` streamViewType
+      `Prelude.hashWithSalt` tableName
+
+instance Prelude.NFData StreamDescription where
+  rnf StreamDescription' {..} =
+    Prelude.rnf creationRequestDateTime
+      `Prelude.seq` Prelude.rnf keySchema
+      `Prelude.seq` Prelude.rnf lastEvaluatedShardId
+      `Prelude.seq` Prelude.rnf shards
+      `Prelude.seq` Prelude.rnf streamArn
+      `Prelude.seq` Prelude.rnf streamLabel
+      `Prelude.seq` Prelude.rnf streamStatus
+      `Prelude.seq` Prelude.rnf streamViewType
+      `Prelude.seq` Prelude.rnf tableName
diff --git a/gen/Amazonka/DynamoDBStreams/Types/StreamRecord.hs b/gen/Amazonka/DynamoDBStreams/Types/StreamRecord.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/StreamRecord.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.DynamoDBStreams.Types.StreamRecord
+-- 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.DynamoDBStreams.Types.StreamRecord where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import Amazonka.DynamoDBStreams.Types.StreamViewType
+import qualified Amazonka.Prelude as Prelude
+
+-- | A description of a single data modification that was performed on an
+-- item in a DynamoDB table.
+--
+-- /See:/ 'newStreamRecord' smart constructor.
+data StreamRecord = StreamRecord'
+  { -- | The approximate date and time when the stream record was created, in
+    -- <http://www.epochconverter.com/ UNIX epoch time> format.
+    approximateCreationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The primary key attribute(s) for the DynamoDB item that was modified.
+    keys :: Prelude.Maybe (Prelude.HashMap Prelude.Text AttributeValue),
+    -- | The item in the DynamoDB table as it appeared after it was modified.
+    newImage' :: Prelude.Maybe (Prelude.HashMap Prelude.Text AttributeValue),
+    -- | The item in the DynamoDB table as it appeared before it was modified.
+    oldImage :: Prelude.Maybe (Prelude.HashMap Prelude.Text AttributeValue),
+    -- | The sequence number of the stream record.
+    sequenceNumber :: Prelude.Maybe Prelude.Text,
+    -- | The size of the stream record, in bytes.
+    sizeBytes :: Prelude.Maybe Prelude.Natural,
+    -- | The type of data from the modified DynamoDB item that was captured in
+    -- this stream record:
+    --
+    -- -   @KEYS_ONLY@ - only the key attributes of the modified item.
+    --
+    -- -   @NEW_IMAGE@ - the entire item, as it appeared after it was modified.
+    --
+    -- -   @OLD_IMAGE@ - the entire item, as it appeared before it was
+    --     modified.
+    --
+    -- -   @NEW_AND_OLD_IMAGES@ - both the new and the old item images of the
+    --     item.
+    streamViewType :: Prelude.Maybe StreamViewType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StreamRecord' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'approximateCreationDateTime', 'streamRecord_approximateCreationDateTime' - The approximate date and time when the stream record was created, in
+-- <http://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'keys', 'streamRecord_keys' - The primary key attribute(s) for the DynamoDB item that was modified.
+--
+-- 'newImage'', 'streamRecord_newImage' - The item in the DynamoDB table as it appeared after it was modified.
+--
+-- 'oldImage', 'streamRecord_oldImage' - The item in the DynamoDB table as it appeared before it was modified.
+--
+-- 'sequenceNumber', 'streamRecord_sequenceNumber' - The sequence number of the stream record.
+--
+-- 'sizeBytes', 'streamRecord_sizeBytes' - The size of the stream record, in bytes.
+--
+-- 'streamViewType', 'streamRecord_streamViewType' - The type of data from the modified DynamoDB item that was captured in
+-- this stream record:
+--
+-- -   @KEYS_ONLY@ - only the key attributes of the modified item.
+--
+-- -   @NEW_IMAGE@ - the entire item, as it appeared after it was modified.
+--
+-- -   @OLD_IMAGE@ - the entire item, as it appeared before it was
+--     modified.
+--
+-- -   @NEW_AND_OLD_IMAGES@ - both the new and the old item images of the
+--     item.
+newStreamRecord ::
+  StreamRecord
+newStreamRecord =
+  StreamRecord'
+    { approximateCreationDateTime =
+        Prelude.Nothing,
+      keys = Prelude.Nothing,
+      newImage' = Prelude.Nothing,
+      oldImage = Prelude.Nothing,
+      sequenceNumber = Prelude.Nothing,
+      sizeBytes = Prelude.Nothing,
+      streamViewType = Prelude.Nothing
+    }
+
+-- | The approximate date and time when the stream record was created, in
+-- <http://www.epochconverter.com/ UNIX epoch time> format.
+streamRecord_approximateCreationDateTime :: Lens.Lens' StreamRecord (Prelude.Maybe Prelude.UTCTime)
+streamRecord_approximateCreationDateTime = Lens.lens (\StreamRecord' {approximateCreationDateTime} -> approximateCreationDateTime) (\s@StreamRecord' {} a -> s {approximateCreationDateTime = a} :: StreamRecord) Prelude.. Lens.mapping Data._Time
+
+-- | The primary key attribute(s) for the DynamoDB item that was modified.
+streamRecord_keys :: Lens.Lens' StreamRecord (Prelude.Maybe (Prelude.HashMap Prelude.Text AttributeValue))
+streamRecord_keys = Lens.lens (\StreamRecord' {keys} -> keys) (\s@StreamRecord' {} a -> s {keys = a} :: StreamRecord) Prelude.. Lens.mapping Lens.coerced
+
+-- | The item in the DynamoDB table as it appeared after it was modified.
+streamRecord_newImage :: Lens.Lens' StreamRecord (Prelude.Maybe (Prelude.HashMap Prelude.Text AttributeValue))
+streamRecord_newImage = Lens.lens (\StreamRecord' {newImage'} -> newImage') (\s@StreamRecord' {} a -> s {newImage' = a} :: StreamRecord) Prelude.. Lens.mapping Lens.coerced
+
+-- | The item in the DynamoDB table as it appeared before it was modified.
+streamRecord_oldImage :: Lens.Lens' StreamRecord (Prelude.Maybe (Prelude.HashMap Prelude.Text AttributeValue))
+streamRecord_oldImage = Lens.lens (\StreamRecord' {oldImage} -> oldImage) (\s@StreamRecord' {} a -> s {oldImage = a} :: StreamRecord) Prelude.. Lens.mapping Lens.coerced
+
+-- | The sequence number of the stream record.
+streamRecord_sequenceNumber :: Lens.Lens' StreamRecord (Prelude.Maybe Prelude.Text)
+streamRecord_sequenceNumber = Lens.lens (\StreamRecord' {sequenceNumber} -> sequenceNumber) (\s@StreamRecord' {} a -> s {sequenceNumber = a} :: StreamRecord)
+
+-- | The size of the stream record, in bytes.
+streamRecord_sizeBytes :: Lens.Lens' StreamRecord (Prelude.Maybe Prelude.Natural)
+streamRecord_sizeBytes = Lens.lens (\StreamRecord' {sizeBytes} -> sizeBytes) (\s@StreamRecord' {} a -> s {sizeBytes = a} :: StreamRecord)
+
+-- | The type of data from the modified DynamoDB item that was captured in
+-- this stream record:
+--
+-- -   @KEYS_ONLY@ - only the key attributes of the modified item.
+--
+-- -   @NEW_IMAGE@ - the entire item, as it appeared after it was modified.
+--
+-- -   @OLD_IMAGE@ - the entire item, as it appeared before it was
+--     modified.
+--
+-- -   @NEW_AND_OLD_IMAGES@ - both the new and the old item images of the
+--     item.
+streamRecord_streamViewType :: Lens.Lens' StreamRecord (Prelude.Maybe StreamViewType)
+streamRecord_streamViewType = Lens.lens (\StreamRecord' {streamViewType} -> streamViewType) (\s@StreamRecord' {} a -> s {streamViewType = a} :: StreamRecord)
+
+instance Data.FromJSON StreamRecord where
+  parseJSON =
+    Data.withObject
+      "StreamRecord"
+      ( \x ->
+          StreamRecord'
+            Prelude.<$> (x Data..:? "ApproximateCreationDateTime")
+            Prelude.<*> (x Data..:? "Keys" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "NewImage" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "OldImage" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "SequenceNumber")
+            Prelude.<*> (x Data..:? "SizeBytes")
+            Prelude.<*> (x Data..:? "StreamViewType")
+      )
+
+instance Prelude.Hashable StreamRecord where
+  hashWithSalt _salt StreamRecord' {..} =
+    _salt
+      `Prelude.hashWithSalt` approximateCreationDateTime
+      `Prelude.hashWithSalt` keys
+      `Prelude.hashWithSalt` newImage'
+      `Prelude.hashWithSalt` oldImage
+      `Prelude.hashWithSalt` sequenceNumber
+      `Prelude.hashWithSalt` sizeBytes
+      `Prelude.hashWithSalt` streamViewType
+
+instance Prelude.NFData StreamRecord where
+  rnf StreamRecord' {..} =
+    Prelude.rnf approximateCreationDateTime
+      `Prelude.seq` Prelude.rnf keys
+      `Prelude.seq` Prelude.rnf newImage'
+      `Prelude.seq` Prelude.rnf oldImage
+      `Prelude.seq` Prelude.rnf sequenceNumber
+      `Prelude.seq` Prelude.rnf sizeBytes
+      `Prelude.seq` Prelude.rnf streamViewType
diff --git a/gen/Amazonka/DynamoDBStreams/Types/StreamStatus.hs b/gen/Amazonka/DynamoDBStreams/Types/StreamStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/StreamStatus.hs
@@ -0,0 +1,82 @@
+{-# 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.DynamoDBStreams.Types.StreamStatus
+-- 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.DynamoDBStreams.Types.StreamStatus
+  ( StreamStatus
+      ( ..,
+        StreamStatus_DISABLED,
+        StreamStatus_DISABLING,
+        StreamStatus_ENABLED,
+        StreamStatus_ENABLING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import qualified Amazonka.Prelude as Prelude
+
+newtype StreamStatus = StreamStatus'
+  { fromStreamStatus ::
+      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 StreamStatus_DISABLED :: StreamStatus
+pattern StreamStatus_DISABLED = StreamStatus' "DISABLED"
+
+pattern StreamStatus_DISABLING :: StreamStatus
+pattern StreamStatus_DISABLING = StreamStatus' "DISABLING"
+
+pattern StreamStatus_ENABLED :: StreamStatus
+pattern StreamStatus_ENABLED = StreamStatus' "ENABLED"
+
+pattern StreamStatus_ENABLING :: StreamStatus
+pattern StreamStatus_ENABLING = StreamStatus' "ENABLING"
+
+{-# COMPLETE
+  StreamStatus_DISABLED,
+  StreamStatus_DISABLING,
+  StreamStatus_ENABLED,
+  StreamStatus_ENABLING,
+  StreamStatus'
+  #-}
diff --git a/gen/Amazonka/DynamoDBStreams/Types/StreamViewType.hs b/gen/Amazonka/DynamoDBStreams/Types/StreamViewType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/Types/StreamViewType.hs
@@ -0,0 +1,82 @@
+{-# 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.DynamoDBStreams.Types.StreamViewType
+-- 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.DynamoDBStreams.Types.StreamViewType
+  ( StreamViewType
+      ( ..,
+        StreamViewType_KEYS_ONLY,
+        StreamViewType_NEW_AND_OLD_IMAGES,
+        StreamViewType_NEW_IMAGE,
+        StreamViewType_OLD_IMAGE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Internal
+import qualified Amazonka.Prelude as Prelude
+
+newtype StreamViewType = StreamViewType'
+  { fromStreamViewType ::
+      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 StreamViewType_KEYS_ONLY :: StreamViewType
+pattern StreamViewType_KEYS_ONLY = StreamViewType' "KEYS_ONLY"
+
+pattern StreamViewType_NEW_AND_OLD_IMAGES :: StreamViewType
+pattern StreamViewType_NEW_AND_OLD_IMAGES = StreamViewType' "NEW_AND_OLD_IMAGES"
+
+pattern StreamViewType_NEW_IMAGE :: StreamViewType
+pattern StreamViewType_NEW_IMAGE = StreamViewType' "NEW_IMAGE"
+
+pattern StreamViewType_OLD_IMAGE :: StreamViewType
+pattern StreamViewType_OLD_IMAGE = StreamViewType' "OLD_IMAGE"
+
+{-# COMPLETE
+  StreamViewType_KEYS_ONLY,
+  StreamViewType_NEW_AND_OLD_IMAGES,
+  StreamViewType_NEW_IMAGE,
+  StreamViewType_OLD_IMAGE,
+  StreamViewType'
+  #-}
diff --git a/gen/Amazonka/DynamoDBStreams/Waiters.hs b/gen/Amazonka/DynamoDBStreams/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/DynamoDBStreams/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.DynamoDBStreams.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.DynamoDBStreams.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.DynamoDBStreams.Lens
+import Amazonka.DynamoDBStreams.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/gen/Network/AWS/DynamoDBStreams.hs b/gen/Network/AWS/DynamoDBStreams.hs
deleted file mode 100644
--- a/gen/Network/AWS/DynamoDBStreams.hs
+++ /dev/null
@@ -1,193 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
-{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.DynamoDBStreams
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- __Amazon DynamoDB__
---
--- Amazon DynamoDB Streams provides API actions for accessing streams and processing stream records. To learn more about application development with Streams, see <http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html Capturing Table Activity with DynamoDB Streams> in the Amazon DynamoDB Developer Guide.
---
-module Network.AWS.DynamoDBStreams
-    (
-    -- * Service Configuration
-      dynamoDBStreams
-
-    -- * Errors
-    -- $errors
-
-    -- ** ExpiredIteratorException
-    , _ExpiredIteratorException
-
-    -- ** InternalServerError
-    , _InternalServerError
-
-    -- ** TrimmedDataAccessException
-    , _TrimmedDataAccessException
-
-    -- ** ResourceNotFoundException
-    , _ResourceNotFoundException
-
-    -- ** LimitExceededException
-    , _LimitExceededException
-
-    -- * Waiters
-    -- $waiters
-
-    -- * Operations
-    -- $operations
-
-    -- ** GetShardIterator
-    , module Network.AWS.DynamoDBStreams.GetShardIterator
-
-    -- ** GetRecords
-    , module Network.AWS.DynamoDBStreams.GetRecords
-
-    -- ** ListStreams
-    , module Network.AWS.DynamoDBStreams.ListStreams
-
-    -- ** DescribeStream
-    , module Network.AWS.DynamoDBStreams.DescribeStream
-
-    -- * Types
-
-    -- ** KeyType
-    , KeyType (..)
-
-    -- ** OperationType
-    , OperationType (..)
-
-    -- ** ShardIteratorType
-    , ShardIteratorType (..)
-
-    -- ** StreamStatus
-    , StreamStatus (..)
-
-    -- ** StreamViewType
-    , StreamViewType (..)
-
-    -- ** AttributeValue
-    , AttributeValue
-    , attributeValue
-    , avL
-    , avNS
-    , avM
-    , avNULL
-    , avN
-    , avBS
-    , avB
-    , avSS
-    , avS
-    , avBOOL
-
-    -- ** Identity
-    , Identity
-    , identity
-    , iPrincipalId
-    , iType
-
-    -- ** KeySchemaElement
-    , KeySchemaElement
-    , keySchemaElement
-    , kseAttributeName
-    , kseKeyType
-
-    -- ** Record
-    , Record
-    , record
-    , rUserIdentity
-    , rEventVersion
-    , rDynamodb
-    , rAwsRegion
-    , rEventName
-    , rEventSource
-    , rEventId
-
-    -- ** SequenceNumberRange
-    , SequenceNumberRange
-    , sequenceNumberRange
-    , snrStartingSequenceNumber
-    , snrEndingSequenceNumber
-
-    -- ** Shard
-    , Shard
-    , shard
-    , sParentShardId
-    , sSequenceNumberRange
-    , sShardId
-
-    -- ** Stream
-    , Stream
-    , stream
-    , sStreamLabel
-    , sStreamARN
-    , sTableName
-
-    -- ** StreamDescription
-    , StreamDescription
-    , streamDescription
-    , sdLastEvaluatedShardId
-    , sdStreamLabel
-    , sdStreamStatus
-    , sdKeySchema
-    , sdStreamViewType
-    , sdStreamARN
-    , sdShards
-    , sdTableName
-    , sdCreationRequestDateTime
-
-    -- ** StreamRecord
-    , StreamRecord
-    , streamRecord
-    , srSizeBytes
-    , srSequenceNumber
-    , srApproximateCreationDateTime
-    , srStreamViewType
-    , srKeys
-    , srOldImage
-    , srNewImage
-    ) where
-
-import Network.AWS.DynamoDBStreams.DescribeStream
-import Network.AWS.DynamoDBStreams.GetRecords
-import Network.AWS.DynamoDBStreams.GetShardIterator
-import Network.AWS.DynamoDBStreams.ListStreams
-import Network.AWS.DynamoDBStreams.Types
-import Network.AWS.DynamoDBStreams.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 'DynamoDBStreams'.
--}
-
-{- $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/Network/AWS/DynamoDBStreams/DescribeStream.hs b/gen/Network/AWS/DynamoDBStreams/DescribeStream.hs
deleted file mode 100644
--- a/gen/Network/AWS/DynamoDBStreams/DescribeStream.hs
+++ /dev/null
@@ -1,167 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.DynamoDBStreams.DescribeStream
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Returns information about a stream, including the current status of the stream, its Amazon Resource Name (ARN), the composition of its shards, and its corresponding DynamoDB table.
---
---
--- Each shard in the stream has a @SequenceNumberRange@ associated with it. If the @SequenceNumberRange@ has a @StartingSequenceNumber@ but no @EndingSequenceNumber@ , then the shard is still open (able to receive more stream records). If both @StartingSequenceNumber@ and @EndingSequenceNumber@ are present, then that shard is closed and can no longer receive more data.
---
-module Network.AWS.DynamoDBStreams.DescribeStream
-    (
-    -- * Creating a Request
-      describeStream
-    , DescribeStream
-    -- * Request Lenses
-    , dsExclusiveStartShardId
-    , dsLimit
-    , dsStreamARN
-
-    -- * Destructuring the Response
-    , describeStreamResponse
-    , DescribeStreamResponse
-    -- * Response Lenses
-    , dsrsStreamDescription
-    , dsrsResponseStatus
-    ) where
-
-import Network.AWS.DynamoDBStreams.Types
-import Network.AWS.DynamoDBStreams.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | Represents the input of a @DescribeStream@ operation.
---
---
---
--- /See:/ 'describeStream' smart constructor.
-data DescribeStream = DescribeStream'
-  { _dsExclusiveStartShardId :: !(Maybe Text)
-  , _dsLimit                 :: !(Maybe Nat)
-  , _dsStreamARN             :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DescribeStream' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'dsExclusiveStartShardId' - The shard ID of the first item that this operation will evaluate. Use the value that was returned for @LastEvaluatedShardId@ in the previous operation.
---
--- * 'dsLimit' - The maximum number of shard objects to return. The upper limit is 100.
---
--- * 'dsStreamARN' - The Amazon Resource Name (ARN) for the stream.
-describeStream
-    :: Text -- ^ 'dsStreamARN'
-    -> DescribeStream
-describeStream pStreamARN_ =
-  DescribeStream'
-    { _dsExclusiveStartShardId = Nothing
-    , _dsLimit = Nothing
-    , _dsStreamARN = pStreamARN_
-    }
-
-
--- | The shard ID of the first item that this operation will evaluate. Use the value that was returned for @LastEvaluatedShardId@ in the previous operation.
-dsExclusiveStartShardId :: Lens' DescribeStream (Maybe Text)
-dsExclusiveStartShardId = lens _dsExclusiveStartShardId (\ s a -> s{_dsExclusiveStartShardId = a})
-
--- | The maximum number of shard objects to return. The upper limit is 100.
-dsLimit :: Lens' DescribeStream (Maybe Natural)
-dsLimit = lens _dsLimit (\ s a -> s{_dsLimit = a}) . mapping _Nat
-
--- | The Amazon Resource Name (ARN) for the stream.
-dsStreamARN :: Lens' DescribeStream Text
-dsStreamARN = lens _dsStreamARN (\ s a -> s{_dsStreamARN = a})
-
-instance AWSRequest DescribeStream where
-        type Rs DescribeStream = DescribeStreamResponse
-        request = postJSON dynamoDBStreams
-        response
-          = receiveJSON
-              (\ s h x ->
-                 DescribeStreamResponse' <$>
-                   (x .?> "StreamDescription") <*> (pure (fromEnum s)))
-
-instance Hashable DescribeStream where
-
-instance NFData DescribeStream where
-
-instance ToHeaders DescribeStream where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("DynamoDBStreams_20120810.DescribeStream" ::
-                       ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.0" :: ByteString)])
-
-instance ToJSON DescribeStream where
-        toJSON DescribeStream'{..}
-          = object
-              (catMaybes
-                 [("ExclusiveStartShardId" .=) <$>
-                    _dsExclusiveStartShardId,
-                  ("Limit" .=) <$> _dsLimit,
-                  Just ("StreamArn" .= _dsStreamARN)])
-
-instance ToPath DescribeStream where
-        toPath = const "/"
-
-instance ToQuery DescribeStream where
-        toQuery = const mempty
-
--- | Represents the output of a @DescribeStream@ operation.
---
---
---
--- /See:/ 'describeStreamResponse' smart constructor.
-data DescribeStreamResponse = DescribeStreamResponse'
-  { _dsrsStreamDescription :: !(Maybe StreamDescription)
-  , _dsrsResponseStatus    :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DescribeStreamResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'dsrsStreamDescription' - A complete description of the stream, including its creation date and time, the DynamoDB table associated with the stream, the shard IDs within the stream, and the beginning and ending sequence numbers of stream records within the shards.
---
--- * 'dsrsResponseStatus' - -- | The response status code.
-describeStreamResponse
-    :: Int -- ^ 'dsrsResponseStatus'
-    -> DescribeStreamResponse
-describeStreamResponse pResponseStatus_ =
-  DescribeStreamResponse'
-    {_dsrsStreamDescription = Nothing, _dsrsResponseStatus = pResponseStatus_}
-
-
--- | A complete description of the stream, including its creation date and time, the DynamoDB table associated with the stream, the shard IDs within the stream, and the beginning and ending sequence numbers of stream records within the shards.
-dsrsStreamDescription :: Lens' DescribeStreamResponse (Maybe StreamDescription)
-dsrsStreamDescription = lens _dsrsStreamDescription (\ s a -> s{_dsrsStreamDescription = a})
-
--- | -- | The response status code.
-dsrsResponseStatus :: Lens' DescribeStreamResponse Int
-dsrsResponseStatus = lens _dsrsResponseStatus (\ s a -> s{_dsrsResponseStatus = a})
-
-instance NFData DescribeStreamResponse where
diff --git a/gen/Network/AWS/DynamoDBStreams/GetRecords.hs b/gen/Network/AWS/DynamoDBStreams/GetRecords.hs
deleted file mode 100644
--- a/gen/Network/AWS/DynamoDBStreams/GetRecords.hs
+++ /dev/null
@@ -1,166 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.DynamoDBStreams.GetRecords
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Retrieves the stream records from a given shard.
---
---
--- Specify a shard iterator using the @ShardIterator@ parameter. The shard iterator specifies the position in the shard from which you want to start reading stream records sequentially. If there are no stream records available in the portion of the shard that the iterator points to, @GetRecords@ returns an empty list. Note that it might take multiple calls to get to a portion of the shard that contains stream records.
---
-module Network.AWS.DynamoDBStreams.GetRecords
-    (
-    -- * Creating a Request
-      getRecords
-    , GetRecords
-    -- * Request Lenses
-    , grLimit
-    , grShardIterator
-
-    -- * Destructuring the Response
-    , getRecordsResponse
-    , GetRecordsResponse
-    -- * Response Lenses
-    , grrsRecords
-    , grrsNextShardIterator
-    , grrsResponseStatus
-    ) where
-
-import Network.AWS.DynamoDBStreams.Types
-import Network.AWS.DynamoDBStreams.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | Represents the input of a @GetRecords@ operation.
---
---
---
--- /See:/ 'getRecords' smart constructor.
-data GetRecords = GetRecords'
-  { _grLimit         :: !(Maybe Nat)
-  , _grShardIterator :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetRecords' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'grLimit' - The maximum number of records to return from the shard. The upper limit is 1000.
---
--- * 'grShardIterator' - A shard iterator that was retrieved from a previous GetShardIterator operation. This iterator can be used to access the stream records in this shard.
-getRecords
-    :: Text -- ^ 'grShardIterator'
-    -> GetRecords
-getRecords pShardIterator_ =
-  GetRecords' {_grLimit = Nothing, _grShardIterator = pShardIterator_}
-
-
--- | The maximum number of records to return from the shard. The upper limit is 1000.
-grLimit :: Lens' GetRecords (Maybe Natural)
-grLimit = lens _grLimit (\ s a -> s{_grLimit = a}) . mapping _Nat
-
--- | A shard iterator that was retrieved from a previous GetShardIterator operation. This iterator can be used to access the stream records in this shard.
-grShardIterator :: Lens' GetRecords Text
-grShardIterator = lens _grShardIterator (\ s a -> s{_grShardIterator = a})
-
-instance AWSRequest GetRecords where
-        type Rs GetRecords = GetRecordsResponse
-        request = postJSON dynamoDBStreams
-        response
-          = receiveJSON
-              (\ s h x ->
-                 GetRecordsResponse' <$>
-                   (x .?> "Records" .!@ mempty) <*>
-                     (x .?> "NextShardIterator")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable GetRecords where
-
-instance NFData GetRecords where
-
-instance ToHeaders GetRecords where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("DynamoDBStreams_20120810.GetRecords" ::
-                       ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.0" :: ByteString)])
-
-instance ToJSON GetRecords where
-        toJSON GetRecords'{..}
-          = object
-              (catMaybes
-                 [("Limit" .=) <$> _grLimit,
-                  Just ("ShardIterator" .= _grShardIterator)])
-
-instance ToPath GetRecords where
-        toPath = const "/"
-
-instance ToQuery GetRecords where
-        toQuery = const mempty
-
--- | Represents the output of a @GetRecords@ operation.
---
---
---
--- /See:/ 'getRecordsResponse' smart constructor.
-data GetRecordsResponse = GetRecordsResponse'
-  { _grrsRecords           :: !(Maybe [Record])
-  , _grrsNextShardIterator :: !(Maybe Text)
-  , _grrsResponseStatus    :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetRecordsResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'grrsRecords' - The stream records from the shard, which were retrieved using the shard iterator.
---
--- * 'grrsNextShardIterator' - The next position in the shard from which to start sequentially reading stream records. If set to @null@ , the shard has been closed and the requested iterator will not return any more data.
---
--- * 'grrsResponseStatus' - -- | The response status code.
-getRecordsResponse
-    :: Int -- ^ 'grrsResponseStatus'
-    -> GetRecordsResponse
-getRecordsResponse pResponseStatus_ =
-  GetRecordsResponse'
-    { _grrsRecords = Nothing
-    , _grrsNextShardIterator = Nothing
-    , _grrsResponseStatus = pResponseStatus_
-    }
-
-
--- | The stream records from the shard, which were retrieved using the shard iterator.
-grrsRecords :: Lens' GetRecordsResponse [Record]
-grrsRecords = lens _grrsRecords (\ s a -> s{_grrsRecords = a}) . _Default . _Coerce
-
--- | The next position in the shard from which to start sequentially reading stream records. If set to @null@ , the shard has been closed and the requested iterator will not return any more data.
-grrsNextShardIterator :: Lens' GetRecordsResponse (Maybe Text)
-grrsNextShardIterator = lens _grrsNextShardIterator (\ s a -> s{_grrsNextShardIterator = a})
-
--- | -- | The response status code.
-grrsResponseStatus :: Lens' GetRecordsResponse Int
-grrsResponseStatus = lens _grrsResponseStatus (\ s a -> s{_grrsResponseStatus = a})
-
-instance NFData GetRecordsResponse where
diff --git a/gen/Network/AWS/DynamoDBStreams/GetShardIterator.hs b/gen/Network/AWS/DynamoDBStreams/GetShardIterator.hs
deleted file mode 100644
--- a/gen/Network/AWS/DynamoDBStreams/GetShardIterator.hs
+++ /dev/null
@@ -1,176 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.DynamoDBStreams.GetShardIterator
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Returns a shard iterator. A shard iterator provides information about how to retrieve the stream records from within a shard. Use the shard iterator in a subsequent @GetRecords@ request to read the stream records from the shard.
---
---
-module Network.AWS.DynamoDBStreams.GetShardIterator
-    (
-    -- * Creating a Request
-      getShardIterator
-    , GetShardIterator
-    -- * Request Lenses
-    , gsiSequenceNumber
-    , gsiStreamARN
-    , gsiShardId
-    , gsiShardIteratorType
-
-    -- * Destructuring the Response
-    , getShardIteratorResponse
-    , GetShardIteratorResponse
-    -- * Response Lenses
-    , gsirsShardIterator
-    , gsirsResponseStatus
-    ) where
-
-import Network.AWS.DynamoDBStreams.Types
-import Network.AWS.DynamoDBStreams.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | Represents the input of a @GetShardIterator@ operation.
---
---
---
--- /See:/ 'getShardIterator' smart constructor.
-data GetShardIterator = GetShardIterator'
-  { _gsiSequenceNumber    :: !(Maybe Text)
-  , _gsiStreamARN         :: !Text
-  , _gsiShardId           :: !Text
-  , _gsiShardIteratorType :: !ShardIteratorType
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetShardIterator' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gsiSequenceNumber' - The sequence number of a stream record in the shard from which to start reading.
---
--- * 'gsiStreamARN' - The Amazon Resource Name (ARN) for the stream.
---
--- * 'gsiShardId' - The identifier of the shard. The iterator will be returned for this shard ID.
---
--- * 'gsiShardIteratorType' - Determines how the shard iterator is used to start reading stream records from the shard:     * @AT_SEQUENCE_NUMBER@ - Start reading exactly from the position denoted by a specific sequence number.     * @AFTER_SEQUENCE_NUMBER@ - Start reading right after the position denoted by a specific sequence number.     * @TRIM_HORIZON@ - Start reading at the last (untrimmed) stream record, which is the oldest record in the shard. In DynamoDB Streams, there is a 24 hour limit on data retention. Stream records whose age exceeds this limit are subject to removal (trimming) from the stream.     * @LATEST@ - Start reading just after the most recent stream record in the shard, so that you always read the most recent data in the shard.
-getShardIterator
-    :: Text -- ^ 'gsiStreamARN'
-    -> Text -- ^ 'gsiShardId'
-    -> ShardIteratorType -- ^ 'gsiShardIteratorType'
-    -> GetShardIterator
-getShardIterator pStreamARN_ pShardId_ pShardIteratorType_ =
-  GetShardIterator'
-    { _gsiSequenceNumber = Nothing
-    , _gsiStreamARN = pStreamARN_
-    , _gsiShardId = pShardId_
-    , _gsiShardIteratorType = pShardIteratorType_
-    }
-
-
--- | The sequence number of a stream record in the shard from which to start reading.
-gsiSequenceNumber :: Lens' GetShardIterator (Maybe Text)
-gsiSequenceNumber = lens _gsiSequenceNumber (\ s a -> s{_gsiSequenceNumber = a})
-
--- | The Amazon Resource Name (ARN) for the stream.
-gsiStreamARN :: Lens' GetShardIterator Text
-gsiStreamARN = lens _gsiStreamARN (\ s a -> s{_gsiStreamARN = a})
-
--- | The identifier of the shard. The iterator will be returned for this shard ID.
-gsiShardId :: Lens' GetShardIterator Text
-gsiShardId = lens _gsiShardId (\ s a -> s{_gsiShardId = a})
-
--- | Determines how the shard iterator is used to start reading stream records from the shard:     * @AT_SEQUENCE_NUMBER@ - Start reading exactly from the position denoted by a specific sequence number.     * @AFTER_SEQUENCE_NUMBER@ - Start reading right after the position denoted by a specific sequence number.     * @TRIM_HORIZON@ - Start reading at the last (untrimmed) stream record, which is the oldest record in the shard. In DynamoDB Streams, there is a 24 hour limit on data retention. Stream records whose age exceeds this limit are subject to removal (trimming) from the stream.     * @LATEST@ - Start reading just after the most recent stream record in the shard, so that you always read the most recent data in the shard.
-gsiShardIteratorType :: Lens' GetShardIterator ShardIteratorType
-gsiShardIteratorType = lens _gsiShardIteratorType (\ s a -> s{_gsiShardIteratorType = a})
-
-instance AWSRequest GetShardIterator where
-        type Rs GetShardIterator = GetShardIteratorResponse
-        request = postJSON dynamoDBStreams
-        response
-          = receiveJSON
-              (\ s h x ->
-                 GetShardIteratorResponse' <$>
-                   (x .?> "ShardIterator") <*> (pure (fromEnum s)))
-
-instance Hashable GetShardIterator where
-
-instance NFData GetShardIterator where
-
-instance ToHeaders GetShardIterator where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("DynamoDBStreams_20120810.GetShardIterator" ::
-                       ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.0" :: ByteString)])
-
-instance ToJSON GetShardIterator where
-        toJSON GetShardIterator'{..}
-          = object
-              (catMaybes
-                 [("SequenceNumber" .=) <$> _gsiSequenceNumber,
-                  Just ("StreamArn" .= _gsiStreamARN),
-                  Just ("ShardId" .= _gsiShardId),
-                  Just ("ShardIteratorType" .= _gsiShardIteratorType)])
-
-instance ToPath GetShardIterator where
-        toPath = const "/"
-
-instance ToQuery GetShardIterator where
-        toQuery = const mempty
-
--- | Represents the output of a @GetShardIterator@ operation.
---
---
---
--- /See:/ 'getShardIteratorResponse' smart constructor.
-data GetShardIteratorResponse = GetShardIteratorResponse'
-  { _gsirsShardIterator  :: !(Maybe Text)
-  , _gsirsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetShardIteratorResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gsirsShardIterator' - The position in the shard from which to start reading stream records sequentially. A shard iterator specifies this position using the sequence number of a stream record in a shard.
---
--- * 'gsirsResponseStatus' - -- | The response status code.
-getShardIteratorResponse
-    :: Int -- ^ 'gsirsResponseStatus'
-    -> GetShardIteratorResponse
-getShardIteratorResponse pResponseStatus_ =
-  GetShardIteratorResponse'
-    {_gsirsShardIterator = Nothing, _gsirsResponseStatus = pResponseStatus_}
-
-
--- | The position in the shard from which to start reading stream records sequentially. A shard iterator specifies this position using the sequence number of a stream record in a shard.
-gsirsShardIterator :: Lens' GetShardIteratorResponse (Maybe Text)
-gsirsShardIterator = lens _gsirsShardIterator (\ s a -> s{_gsirsShardIterator = a})
-
--- | -- | The response status code.
-gsirsResponseStatus :: Lens' GetShardIteratorResponse Int
-gsirsResponseStatus = lens _gsirsResponseStatus (\ s a -> s{_gsirsResponseStatus = a})
-
-instance NFData GetShardIteratorResponse where
diff --git a/gen/Network/AWS/DynamoDBStreams/ListStreams.hs b/gen/Network/AWS/DynamoDBStreams/ListStreams.hs
deleted file mode 100644
--- a/gen/Network/AWS/DynamoDBStreams/ListStreams.hs
+++ /dev/null
@@ -1,177 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.DynamoDBStreams.ListStreams
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Returns an array of stream ARNs associated with the current account and endpoint. If the @TableName@ parameter is present, then @ListStreams@ will return only the streams ARNs for that table.
---
---
-module Network.AWS.DynamoDBStreams.ListStreams
-    (
-    -- * Creating a Request
-      listStreams
-    , ListStreams
-    -- * Request Lenses
-    , lsExclusiveStartStreamARN
-    , lsLimit
-    , lsTableName
-
-    -- * Destructuring the Response
-    , listStreamsResponse
-    , ListStreamsResponse
-    -- * Response Lenses
-    , lsrsLastEvaluatedStreamARN
-    , lsrsStreams
-    , lsrsResponseStatus
-    ) where
-
-import Network.AWS.DynamoDBStreams.Types
-import Network.AWS.DynamoDBStreams.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | Represents the input of a @ListStreams@ operation.
---
---
---
--- /See:/ 'listStreams' smart constructor.
-data ListStreams = ListStreams'
-  { _lsExclusiveStartStreamARN :: !(Maybe Text)
-  , _lsLimit                   :: !(Maybe Nat)
-  , _lsTableName               :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ListStreams' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lsExclusiveStartStreamARN' - The ARN (Amazon Resource Name) of the first item that this operation will evaluate. Use the value that was returned for @LastEvaluatedStreamArn@ in the previous operation.
---
--- * 'lsLimit' - The maximum number of streams to return. The upper limit is 100.
---
--- * 'lsTableName' - If this parameter is provided, then only the streams associated with this table name are returned.
-listStreams
-    :: ListStreams
-listStreams =
-  ListStreams'
-    { _lsExclusiveStartStreamARN = Nothing
-    , _lsLimit = Nothing
-    , _lsTableName = Nothing
-    }
-
-
--- | The ARN (Amazon Resource Name) of the first item that this operation will evaluate. Use the value that was returned for @LastEvaluatedStreamArn@ in the previous operation.
-lsExclusiveStartStreamARN :: Lens' ListStreams (Maybe Text)
-lsExclusiveStartStreamARN = lens _lsExclusiveStartStreamARN (\ s a -> s{_lsExclusiveStartStreamARN = a})
-
--- | The maximum number of streams to return. The upper limit is 100.
-lsLimit :: Lens' ListStreams (Maybe Natural)
-lsLimit = lens _lsLimit (\ s a -> s{_lsLimit = a}) . mapping _Nat
-
--- | If this parameter is provided, then only the streams associated with this table name are returned.
-lsTableName :: Lens' ListStreams (Maybe Text)
-lsTableName = lens _lsTableName (\ s a -> s{_lsTableName = a})
-
-instance AWSRequest ListStreams where
-        type Rs ListStreams = ListStreamsResponse
-        request = postJSON dynamoDBStreams
-        response
-          = receiveJSON
-              (\ s h x ->
-                 ListStreamsResponse' <$>
-                   (x .?> "LastEvaluatedStreamArn") <*>
-                     (x .?> "Streams" .!@ mempty)
-                     <*> (pure (fromEnum s)))
-
-instance Hashable ListStreams where
-
-instance NFData ListStreams where
-
-instance ToHeaders ListStreams where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("DynamoDBStreams_20120810.ListStreams" ::
-                       ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.0" :: ByteString)])
-
-instance ToJSON ListStreams where
-        toJSON ListStreams'{..}
-          = object
-              (catMaybes
-                 [("ExclusiveStartStreamArn" .=) <$>
-                    _lsExclusiveStartStreamARN,
-                  ("Limit" .=) <$> _lsLimit,
-                  ("TableName" .=) <$> _lsTableName])
-
-instance ToPath ListStreams where
-        toPath = const "/"
-
-instance ToQuery ListStreams where
-        toQuery = const mempty
-
--- | Represents the output of a @ListStreams@ operation.
---
---
---
--- /See:/ 'listStreamsResponse' smart constructor.
-data ListStreamsResponse = ListStreamsResponse'
-  { _lsrsLastEvaluatedStreamARN :: !(Maybe Text)
-  , _lsrsStreams                :: !(Maybe [Stream])
-  , _lsrsResponseStatus         :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ListStreamsResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lsrsLastEvaluatedStreamARN' - The stream ARN of the item where the operation stopped, inclusive of the previous result set. Use this value to start a new operation, excluding this value in the new request. If @LastEvaluatedStreamArn@ is empty, then the "last page" of results has been processed and there is no more data to be retrieved. If @LastEvaluatedStreamArn@ is not empty, it does not necessarily mean that there is more data in the result set. The only way to know when you have reached the end of the result set is when @LastEvaluatedStreamArn@ is empty.
---
--- * 'lsrsStreams' - A list of stream descriptors associated with the current account and endpoint.
---
--- * 'lsrsResponseStatus' - -- | The response status code.
-listStreamsResponse
-    :: Int -- ^ 'lsrsResponseStatus'
-    -> ListStreamsResponse
-listStreamsResponse pResponseStatus_ =
-  ListStreamsResponse'
-    { _lsrsLastEvaluatedStreamARN = Nothing
-    , _lsrsStreams = Nothing
-    , _lsrsResponseStatus = pResponseStatus_
-    }
-
-
--- | The stream ARN of the item where the operation stopped, inclusive of the previous result set. Use this value to start a new operation, excluding this value in the new request. If @LastEvaluatedStreamArn@ is empty, then the "last page" of results has been processed and there is no more data to be retrieved. If @LastEvaluatedStreamArn@ is not empty, it does not necessarily mean that there is more data in the result set. The only way to know when you have reached the end of the result set is when @LastEvaluatedStreamArn@ is empty.
-lsrsLastEvaluatedStreamARN :: Lens' ListStreamsResponse (Maybe Text)
-lsrsLastEvaluatedStreamARN = lens _lsrsLastEvaluatedStreamARN (\ s a -> s{_lsrsLastEvaluatedStreamARN = a})
-
--- | A list of stream descriptors associated with the current account and endpoint.
-lsrsStreams :: Lens' ListStreamsResponse [Stream]
-lsrsStreams = lens _lsrsStreams (\ s a -> s{_lsrsStreams = a}) . _Default . _Coerce
-
--- | -- | The response status code.
-lsrsResponseStatus :: Lens' ListStreamsResponse Int
-lsrsResponseStatus = lens _lsrsResponseStatus (\ s a -> s{_lsrsResponseStatus = a})
-
-instance NFData ListStreamsResponse where
diff --git a/gen/Network/AWS/DynamoDBStreams/Types.hs b/gen/Network/AWS/DynamoDBStreams/Types.hs
deleted file mode 100644
--- a/gen/Network/AWS/DynamoDBStreams/Types.hs
+++ /dev/null
@@ -1,212 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.DynamoDBStreams.Types
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.DynamoDBStreams.Types
-    (
-    -- * Service Configuration
-      dynamoDBStreams
-
-    -- * Errors
-    , _ExpiredIteratorException
-    , _InternalServerError
-    , _TrimmedDataAccessException
-    , _ResourceNotFoundException
-    , _LimitExceededException
-
-    -- * KeyType
-    , KeyType (..)
-
-    -- * OperationType
-    , OperationType (..)
-
-    -- * ShardIteratorType
-    , ShardIteratorType (..)
-
-    -- * StreamStatus
-    , StreamStatus (..)
-
-    -- * StreamViewType
-    , StreamViewType (..)
-
-    -- * AttributeValue
-    , AttributeValue
-    , attributeValue
-    , avL
-    , avNS
-    , avM
-    , avNULL
-    , avN
-    , avBS
-    , avB
-    , avSS
-    , avS
-    , avBOOL
-
-    -- * Identity
-    , Identity
-    , identity
-    , iPrincipalId
-    , iType
-
-    -- * KeySchemaElement
-    , KeySchemaElement
-    , keySchemaElement
-    , kseAttributeName
-    , kseKeyType
-
-    -- * Record
-    , Record
-    , record
-    , rUserIdentity
-    , rEventVersion
-    , rDynamodb
-    , rAwsRegion
-    , rEventName
-    , rEventSource
-    , rEventId
-
-    -- * SequenceNumberRange
-    , SequenceNumberRange
-    , sequenceNumberRange
-    , snrStartingSequenceNumber
-    , snrEndingSequenceNumber
-
-    -- * Shard
-    , Shard
-    , shard
-    , sParentShardId
-    , sSequenceNumberRange
-    , sShardId
-
-    -- * Stream
-    , Stream
-    , stream
-    , sStreamLabel
-    , sStreamARN
-    , sTableName
-
-    -- * StreamDescription
-    , StreamDescription
-    , streamDescription
-    , sdLastEvaluatedShardId
-    , sdStreamLabel
-    , sdStreamStatus
-    , sdKeySchema
-    , sdStreamViewType
-    , sdStreamARN
-    , sdShards
-    , sdTableName
-    , sdCreationRequestDateTime
-
-    -- * StreamRecord
-    , StreamRecord
-    , streamRecord
-    , srSizeBytes
-    , srSequenceNumber
-    , srApproximateCreationDateTime
-    , srStreamViewType
-    , srKeys
-    , srOldImage
-    , srNewImage
-    ) where
-
-import Network.AWS.DynamoDBStreams.Types.Product
-import Network.AWS.DynamoDBStreams.Types.Sum
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Sign.V4
-
--- | API version @2012-08-10@ of the Amazon DynamoDB Streams SDK configuration.
-dynamoDBStreams :: Service
-dynamoDBStreams =
-  Service
-    { _svcAbbrev = "DynamoDBStreams"
-    , _svcSigner = v4
-    , _svcPrefix = "streams.dynamodb"
-    , _svcVersion = "2012-08-10"
-    , _svcEndpoint = defaultEndpoint dynamoDBStreams
-    , _svcTimeout = Just 70
-    , _svcCheck = statusSuccess
-    , _svcError = parseJSONError "DynamoDBStreams"
-    , _svcRetry = retry
-    }
-  where
-    retry =
-      Exponential
-        { _retryBase = 5.0e-2
-        , _retryGrowth = 2
-        , _retryAttempts = 5
-        , _retryCheck = check
-        }
-    check e
-      | has (hasCode "ThrottledException" . hasStatus 400) e =
-        Just "throttled_exception"
-      | has (hasStatus 429) e = Just "too_many_requests"
-      | has (hasCode "ThrottlingException" . hasStatus 400) e =
-        Just "throttling_exception"
-      | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
-      | has (hasStatus 504) e = Just "gateway_timeout"
-      | has (hasCode "RequestThrottledException" . hasStatus 400) e =
-        Just "request_throttled_exception"
-      | has (hasStatus 502) e = Just "bad_gateway"
-      | has (hasStatus 503) e = Just "service_unavailable"
-      | has (hasStatus 500) e = Just "general_server_error"
-      | has (hasStatus 509) e = Just "limit_exceeded"
-      | otherwise = Nothing
-
-
--- | The shard iterator has expired and can no longer be used to retrieve stream records. A shard iterator expires 15 minutes after it is retrieved using the @GetShardIterator@ action.
---
---
-_ExpiredIteratorException :: AsError a => Getting (First ServiceError) a ServiceError
-_ExpiredIteratorException =
-  _MatchServiceError dynamoDBStreams "ExpiredIteratorException"
-
-
--- | An error occurred on the server side.
---
---
-_InternalServerError :: AsError a => Getting (First ServiceError) a ServiceError
-_InternalServerError = _MatchServiceError dynamoDBStreams "InternalServerError"
-
-
--- | The operation attempted to read past the oldest stream record in a shard.
---
---
--- In DynamoDB Streams, there is a 24 hour limit on data retention. Stream records whose age exceeds this limit are subject to removal (trimming) from the stream. You might receive a TrimmedDataAccessException if:
---
---     * You request a shard iterator with a sequence number older than the trim point (24 hours).
---
---     * You obtain a shard iterator, but before you use the iterator in a @GetRecords@ request, a stream record in the shard exceeds the 24 hour period and is trimmed. This causes the iterator to access a record that no longer exists.
---
---
---
-_TrimmedDataAccessException :: AsError a => Getting (First ServiceError) a ServiceError
-_TrimmedDataAccessException =
-  _MatchServiceError dynamoDBStreams "TrimmedDataAccessException"
-
-
--- | The operation tried to access a nonexistent stream.
---
---
-_ResourceNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_ResourceNotFoundException =
-  _MatchServiceError dynamoDBStreams "ResourceNotFoundException"
-
-
--- | Your request rate is too high. The AWS SDKs for DynamoDB automatically retry requests that receive this exception. Your request is eventually successful, unless your retry queue is too large to finish. Reduce the frequency of requests and use exponential backoff. For more information, go to <http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ErrorHandling.html#APIRetries Error Retries and Exponential Backoff> in the /Amazon DynamoDB Developer Guide/ .
---
---
-_LimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
-_LimitExceededException =
-  _MatchServiceError dynamoDBStreams "LimitExceededException"
-
diff --git a/gen/Network/AWS/DynamoDBStreams/Types/Product.hs b/gen/Network/AWS/DynamoDBStreams/Types/Product.hs
deleted file mode 100644
--- a/gen/Network/AWS/DynamoDBStreams/Types/Product.hs
+++ /dev/null
@@ -1,677 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.DynamoDBStreams.Types.Product
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.DynamoDBStreams.Types.Product where
-
-import Network.AWS.DynamoDBStreams.Types.Sum
-import Network.AWS.Lens
-import Network.AWS.Prelude
-
--- | Represents the data for an attribute. You can set one, and only one, of the elements.
---
---
--- Each attribute in an item is a name-value pair. An attribute can be single-valued or multi-valued set. For example, a book item can have title and authors attributes. Each book has one title but can have many authors. The multi-valued attribute is a set; duplicate values are not allowed.
---
---
--- /See:/ 'attributeValue' smart constructor.
-data AttributeValue = AttributeValue'
-  { _avL    :: !(Maybe [AttributeValue])
-  , _avNS   :: !(Maybe [Text])
-  , _avM    :: !(Maybe (Map Text AttributeValue))
-  , _avNULL :: !(Maybe Bool)
-  , _avN    :: !(Maybe Text)
-  , _avBS   :: !(Maybe [Base64])
-  , _avB    :: !(Maybe Base64)
-  , _avSS   :: !(Maybe [Text])
-  , _avS    :: !(Maybe Text)
-  , _avBOOL :: !(Maybe Bool)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'AttributeValue' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'avL' - A List data type.
---
--- * 'avNS' - A Number Set data type.
---
--- * 'avM' - A Map data type.
---
--- * 'avNULL' - A Null data type.
---
--- * 'avN' - A Number data type.
---
--- * 'avBS' - A Binary Set data type.
---
--- * 'avB' - A Binary data type.-- /Note:/ This 'Lens' automatically encodes and decodes Base64 data. The underlying isomorphism will encode to Base64 representation during serialisation, and decode from Base64 representation during deserialisation. This 'Lens' accepts and returns only raw unencoded data.
---
--- * 'avSS' - A String Set data type.
---
--- * 'avS' - A String data type.
---
--- * 'avBOOL' - A Boolean data type.
-attributeValue
-    :: AttributeValue
-attributeValue =
-  AttributeValue'
-    { _avL = Nothing
-    , _avNS = Nothing
-    , _avM = Nothing
-    , _avNULL = Nothing
-    , _avN = Nothing
-    , _avBS = Nothing
-    , _avB = Nothing
-    , _avSS = Nothing
-    , _avS = Nothing
-    , _avBOOL = Nothing
-    }
-
-
--- | A List data type.
-avL :: Lens' AttributeValue [AttributeValue]
-avL = lens _avL (\ s a -> s{_avL = a}) . _Default . _Coerce
-
--- | A Number Set data type.
-avNS :: Lens' AttributeValue [Text]
-avNS = lens _avNS (\ s a -> s{_avNS = a}) . _Default . _Coerce
-
--- | A Map data type.
-avM :: Lens' AttributeValue (HashMap Text AttributeValue)
-avM = lens _avM (\ s a -> s{_avM = a}) . _Default . _Map
-
--- | A Null data type.
-avNULL :: Lens' AttributeValue (Maybe Bool)
-avNULL = lens _avNULL (\ s a -> s{_avNULL = a})
-
--- | A Number data type.
-avN :: Lens' AttributeValue (Maybe Text)
-avN = lens _avN (\ s a -> s{_avN = a})
-
--- | A Binary Set data type.
-avBS :: Lens' AttributeValue [ByteString]
-avBS = lens _avBS (\ s a -> s{_avBS = a}) . _Default . _Coerce
-
--- | A Binary data type.-- /Note:/ This 'Lens' automatically encodes and decodes Base64 data. The underlying isomorphism will encode to Base64 representation during serialisation, and decode from Base64 representation during deserialisation. This 'Lens' accepts and returns only raw unencoded data.
-avB :: Lens' AttributeValue (Maybe ByteString)
-avB = lens _avB (\ s a -> s{_avB = a}) . mapping _Base64
-
--- | A String Set data type.
-avSS :: Lens' AttributeValue [Text]
-avSS = lens _avSS (\ s a -> s{_avSS = a}) . _Default . _Coerce
-
--- | A String data type.
-avS :: Lens' AttributeValue (Maybe Text)
-avS = lens _avS (\ s a -> s{_avS = a})
-
--- | A Boolean data type.
-avBOOL :: Lens' AttributeValue (Maybe Bool)
-avBOOL = lens _avBOOL (\ s a -> s{_avBOOL = a})
-
-instance FromJSON AttributeValue where
-        parseJSON
-          = withObject "AttributeValue"
-              (\ x ->
-                 AttributeValue' <$>
-                   (x .:? "L" .!= mempty) <*> (x .:? "NS" .!= mempty)
-                     <*> (x .:? "M" .!= mempty)
-                     <*> (x .:? "NULL")
-                     <*> (x .:? "N")
-                     <*> (x .:? "BS" .!= mempty)
-                     <*> (x .:? "B")
-                     <*> (x .:? "SS" .!= mempty)
-                     <*> (x .:? "S")
-                     <*> (x .:? "BOOL"))
-
-instance Hashable AttributeValue where
-
-instance NFData AttributeValue where
-
--- | Contains details about the type of identity that made the request.
---
---
---
--- /See:/ 'identity' smart constructor.
-data Identity = Identity'
-  { _iPrincipalId :: !(Maybe Text)
-  , _iType        :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Identity' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'iPrincipalId' - A unique identifier for the entity that made the call. For Time To Live, the principalId is "dynamodb.amazonaws.com".
---
--- * 'iType' - The type of the identity. For Time To Live, the type is "Service".
-identity
-    :: Identity
-identity = Identity' {_iPrincipalId = Nothing, _iType = Nothing}
-
-
--- | A unique identifier for the entity that made the call. For Time To Live, the principalId is "dynamodb.amazonaws.com".
-iPrincipalId :: Lens' Identity (Maybe Text)
-iPrincipalId = lens _iPrincipalId (\ s a -> s{_iPrincipalId = a})
-
--- | The type of the identity. For Time To Live, the type is "Service".
-iType :: Lens' Identity (Maybe Text)
-iType = lens _iType (\ s a -> s{_iType = a})
-
-instance FromJSON Identity where
-        parseJSON
-          = withObject "Identity"
-              (\ x ->
-                 Identity' <$>
-                   (x .:? "PrincipalId") <*> (x .:? "Type"))
-
-instance Hashable Identity where
-
-instance NFData Identity where
-
--- | Represents /a single element/ of a key schema. A key schema specifies the attributes that make up the primary key of a table, or the key attributes of an index.
---
---
--- A @KeySchemaElement@ represents exactly one attribute of the primary key. For example, a simple primary key (partition key) would be represented by one @KeySchemaElement@ . A composite primary key (partition key and sort key) would require one @KeySchemaElement@ for the partition key, and another @KeySchemaElement@ for the sort key.
---
---
--- /See:/ 'keySchemaElement' smart constructor.
-data KeySchemaElement = KeySchemaElement'
-  { _kseAttributeName :: !Text
-  , _kseKeyType       :: !KeyType
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'KeySchemaElement' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'kseAttributeName' - The name of a key attribute.
---
--- * 'kseKeyType' - The attribute data, consisting of the data type and the attribute value itself.
-keySchemaElement
-    :: Text -- ^ 'kseAttributeName'
-    -> KeyType -- ^ 'kseKeyType'
-    -> KeySchemaElement
-keySchemaElement pAttributeName_ pKeyType_ =
-  KeySchemaElement'
-    {_kseAttributeName = pAttributeName_, _kseKeyType = pKeyType_}
-
-
--- | The name of a key attribute.
-kseAttributeName :: Lens' KeySchemaElement Text
-kseAttributeName = lens _kseAttributeName (\ s a -> s{_kseAttributeName = a})
-
--- | The attribute data, consisting of the data type and the attribute value itself.
-kseKeyType :: Lens' KeySchemaElement KeyType
-kseKeyType = lens _kseKeyType (\ s a -> s{_kseKeyType = a})
-
-instance FromJSON KeySchemaElement where
-        parseJSON
-          = withObject "KeySchemaElement"
-              (\ x ->
-                 KeySchemaElement' <$>
-                   (x .: "AttributeName") <*> (x .: "KeyType"))
-
-instance Hashable KeySchemaElement where
-
-instance NFData KeySchemaElement where
-
--- | A description of a unique event within a stream.
---
---
---
--- /See:/ 'record' smart constructor.
-data Record = Record'
-  { _rUserIdentity :: !(Maybe Identity)
-  , _rEventVersion :: !(Maybe Text)
-  , _rDynamodb     :: !(Maybe StreamRecord)
-  , _rAwsRegion    :: !(Maybe Text)
-  , _rEventName    :: !(Maybe OperationType)
-  , _rEventSource  :: !(Maybe Text)
-  , _rEventId      :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Record' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'rUserIdentity' - Items that are deleted by the Time to Live process after expiration have the following fields:      * Records[].userIdentity.type "Service"     * Records[].userIdentity.principalId "dynamodb.amazonaws.com"
---
--- * 'rEventVersion' - The version number of the stream record format. This number is updated whenever the structure of @Record@ is modified. Client applications must not assume that @eventVersion@ will remain at a particular value, as this number is subject to change at any time. In general, @eventVersion@ will only increase as the low-level DynamoDB Streams API evolves.
---
--- * 'rDynamodb' - The main body of the stream record, containing all of the DynamoDB-specific fields.
---
--- * 'rAwsRegion' - The region in which the @GetRecords@ request was received.
---
--- * 'rEventName' - The type of data modification that was performed on the DynamoDB table:     * @INSERT@ - a new item was added to the table.     * @MODIFY@ - one or more of an existing item's attributes were modified.     * @REMOVE@ - the item was deleted from the table
---
--- * 'rEventSource' - The AWS service from which the stream record originated. For DynamoDB Streams, this is @aws:dynamodb@ .
---
--- * 'rEventId' - A globally unique identifier for the event that was recorded in this stream record.
-record
-    :: Record
-record =
-  Record'
-    { _rUserIdentity = Nothing
-    , _rEventVersion = Nothing
-    , _rDynamodb = Nothing
-    , _rAwsRegion = Nothing
-    , _rEventName = Nothing
-    , _rEventSource = Nothing
-    , _rEventId = Nothing
-    }
-
-
--- | Items that are deleted by the Time to Live process after expiration have the following fields:      * Records[].userIdentity.type "Service"     * Records[].userIdentity.principalId "dynamodb.amazonaws.com"
-rUserIdentity :: Lens' Record (Maybe Identity)
-rUserIdentity = lens _rUserIdentity (\ s a -> s{_rUserIdentity = a})
-
--- | The version number of the stream record format. This number is updated whenever the structure of @Record@ is modified. Client applications must not assume that @eventVersion@ will remain at a particular value, as this number is subject to change at any time. In general, @eventVersion@ will only increase as the low-level DynamoDB Streams API evolves.
-rEventVersion :: Lens' Record (Maybe Text)
-rEventVersion = lens _rEventVersion (\ s a -> s{_rEventVersion = a})
-
--- | The main body of the stream record, containing all of the DynamoDB-specific fields.
-rDynamodb :: Lens' Record (Maybe StreamRecord)
-rDynamodb = lens _rDynamodb (\ s a -> s{_rDynamodb = a})
-
--- | The region in which the @GetRecords@ request was received.
-rAwsRegion :: Lens' Record (Maybe Text)
-rAwsRegion = lens _rAwsRegion (\ s a -> s{_rAwsRegion = a})
-
--- | The type of data modification that was performed on the DynamoDB table:     * @INSERT@ - a new item was added to the table.     * @MODIFY@ - one or more of an existing item's attributes were modified.     * @REMOVE@ - the item was deleted from the table
-rEventName :: Lens' Record (Maybe OperationType)
-rEventName = lens _rEventName (\ s a -> s{_rEventName = a})
-
--- | The AWS service from which the stream record originated. For DynamoDB Streams, this is @aws:dynamodb@ .
-rEventSource :: Lens' Record (Maybe Text)
-rEventSource = lens _rEventSource (\ s a -> s{_rEventSource = a})
-
--- | A globally unique identifier for the event that was recorded in this stream record.
-rEventId :: Lens' Record (Maybe Text)
-rEventId = lens _rEventId (\ s a -> s{_rEventId = a})
-
-instance FromJSON Record where
-        parseJSON
-          = withObject "Record"
-              (\ x ->
-                 Record' <$>
-                   (x .:? "userIdentity") <*> (x .:? "eventVersion") <*>
-                     (x .:? "dynamodb")
-                     <*> (x .:? "awsRegion")
-                     <*> (x .:? "eventName")
-                     <*> (x .:? "eventSource")
-                     <*> (x .:? "eventID"))
-
-instance Hashable Record where
-
-instance NFData Record where
-
--- | The beginning and ending sequence numbers for the stream records contained within a shard.
---
---
---
--- /See:/ 'sequenceNumberRange' smart constructor.
-data SequenceNumberRange = SequenceNumberRange'
-  { _snrStartingSequenceNumber :: !(Maybe Text)
-  , _snrEndingSequenceNumber   :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'SequenceNumberRange' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'snrStartingSequenceNumber' - The first sequence number.
---
--- * 'snrEndingSequenceNumber' - The last sequence number.
-sequenceNumberRange
-    :: SequenceNumberRange
-sequenceNumberRange =
-  SequenceNumberRange'
-    {_snrStartingSequenceNumber = Nothing, _snrEndingSequenceNumber = Nothing}
-
-
--- | The first sequence number.
-snrStartingSequenceNumber :: Lens' SequenceNumberRange (Maybe Text)
-snrStartingSequenceNumber = lens _snrStartingSequenceNumber (\ s a -> s{_snrStartingSequenceNumber = a})
-
--- | The last sequence number.
-snrEndingSequenceNumber :: Lens' SequenceNumberRange (Maybe Text)
-snrEndingSequenceNumber = lens _snrEndingSequenceNumber (\ s a -> s{_snrEndingSequenceNumber = a})
-
-instance FromJSON SequenceNumberRange where
-        parseJSON
-          = withObject "SequenceNumberRange"
-              (\ x ->
-                 SequenceNumberRange' <$>
-                   (x .:? "StartingSequenceNumber") <*>
-                     (x .:? "EndingSequenceNumber"))
-
-instance Hashable SequenceNumberRange where
-
-instance NFData SequenceNumberRange where
-
--- | A uniquely identified group of stream records within a stream.
---
---
---
--- /See:/ 'shard' smart constructor.
-data Shard = Shard'
-  { _sParentShardId       :: !(Maybe Text)
-  , _sSequenceNumberRange :: !(Maybe SequenceNumberRange)
-  , _sShardId             :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Shard' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'sParentShardId' - The shard ID of the current shard's parent.
---
--- * 'sSequenceNumberRange' - The range of possible sequence numbers for the shard.
---
--- * 'sShardId' - The system-generated identifier for this shard.
-shard
-    :: Shard
-shard =
-  Shard'
-    { _sParentShardId = Nothing
-    , _sSequenceNumberRange = Nothing
-    , _sShardId = Nothing
-    }
-
-
--- | The shard ID of the current shard's parent.
-sParentShardId :: Lens' Shard (Maybe Text)
-sParentShardId = lens _sParentShardId (\ s a -> s{_sParentShardId = a})
-
--- | The range of possible sequence numbers for the shard.
-sSequenceNumberRange :: Lens' Shard (Maybe SequenceNumberRange)
-sSequenceNumberRange = lens _sSequenceNumberRange (\ s a -> s{_sSequenceNumberRange = a})
-
--- | The system-generated identifier for this shard.
-sShardId :: Lens' Shard (Maybe Text)
-sShardId = lens _sShardId (\ s a -> s{_sShardId = a})
-
-instance FromJSON Shard where
-        parseJSON
-          = withObject "Shard"
-              (\ x ->
-                 Shard' <$>
-                   (x .:? "ParentShardId") <*>
-                     (x .:? "SequenceNumberRange")
-                     <*> (x .:? "ShardId"))
-
-instance Hashable Shard where
-
-instance NFData Shard where
-
--- | Represents all of the data describing a particular stream.
---
---
---
--- /See:/ 'stream' smart constructor.
-data Stream = Stream'
-  { _sStreamLabel :: !(Maybe Text)
-  , _sStreamARN   :: !(Maybe Text)
-  , _sTableName   :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Stream' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'sStreamLabel' - A timestamp, in ISO 8601 format, for this stream. Note that @LatestStreamLabel@ is not a unique identifier for the stream, because it is possible that a stream from another table might have the same timestamp. However, the combination of the following three elements is guaranteed to be unique:     * the AWS customer ID.     * the table name     * the @StreamLabel@
---
--- * 'sStreamARN' - The Amazon Resource Name (ARN) for the stream.
---
--- * 'sTableName' - The DynamoDB table with which the stream is associated.
-stream
-    :: Stream
-stream =
-  Stream'
-    {_sStreamLabel = Nothing, _sStreamARN = Nothing, _sTableName = Nothing}
-
-
--- | A timestamp, in ISO 8601 format, for this stream. Note that @LatestStreamLabel@ is not a unique identifier for the stream, because it is possible that a stream from another table might have the same timestamp. However, the combination of the following three elements is guaranteed to be unique:     * the AWS customer ID.     * the table name     * the @StreamLabel@
-sStreamLabel :: Lens' Stream (Maybe Text)
-sStreamLabel = lens _sStreamLabel (\ s a -> s{_sStreamLabel = a})
-
--- | The Amazon Resource Name (ARN) for the stream.
-sStreamARN :: Lens' Stream (Maybe Text)
-sStreamARN = lens _sStreamARN (\ s a -> s{_sStreamARN = a})
-
--- | The DynamoDB table with which the stream is associated.
-sTableName :: Lens' Stream (Maybe Text)
-sTableName = lens _sTableName (\ s a -> s{_sTableName = a})
-
-instance FromJSON Stream where
-        parseJSON
-          = withObject "Stream"
-              (\ x ->
-                 Stream' <$>
-                   (x .:? "StreamLabel") <*> (x .:? "StreamArn") <*>
-                     (x .:? "TableName"))
-
-instance Hashable Stream where
-
-instance NFData Stream where
-
--- | Represents all of the data describing a particular stream.
---
---
---
--- /See:/ 'streamDescription' smart constructor.
-data StreamDescription = StreamDescription'
-  { _sdLastEvaluatedShardId    :: !(Maybe Text)
-  , _sdStreamLabel             :: !(Maybe Text)
-  , _sdStreamStatus            :: !(Maybe StreamStatus)
-  , _sdKeySchema               :: !(Maybe (List1 KeySchemaElement))
-  , _sdStreamViewType          :: !(Maybe StreamViewType)
-  , _sdStreamARN               :: !(Maybe Text)
-  , _sdShards                  :: !(Maybe [Shard])
-  , _sdTableName               :: !(Maybe Text)
-  , _sdCreationRequestDateTime :: !(Maybe POSIX)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'StreamDescription' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'sdLastEvaluatedShardId' - The shard ID of the item where the operation stopped, inclusive of the previous result set. Use this value to start a new operation, excluding this value in the new request. If @LastEvaluatedShardId@ is empty, then the "last page" of results has been processed and there is currently no more data to be retrieved. If @LastEvaluatedShardId@ is not empty, it does not necessarily mean that there is more data in the result set. The only way to know when you have reached the end of the result set is when @LastEvaluatedShardId@ is empty.
---
--- * 'sdStreamLabel' - A timestamp, in ISO 8601 format, for this stream. Note that @LatestStreamLabel@ is not a unique identifier for the stream, because it is possible that a stream from another table might have the same timestamp. However, the combination of the following three elements is guaranteed to be unique:     * the AWS customer ID.     * the table name     * the @StreamLabel@
---
--- * 'sdStreamStatus' - Indicates the current status of the stream:     * @ENABLING@ - Streams is currently being enabled on the DynamoDB table.     * @ENABLED@ - the stream is enabled.     * @DISABLING@ - Streams is currently being disabled on the DynamoDB table.     * @DISABLED@ - the stream is disabled.
---
--- * 'sdKeySchema' - The key attribute(s) of the stream's DynamoDB table.
---
--- * 'sdStreamViewType' - Indicates the format of the records within this stream:     * @KEYS_ONLY@ - only the key attributes of items that were modified in the DynamoDB table.     * @NEW_IMAGE@ - entire items from the table, as they appeared after they were modified.     * @OLD_IMAGE@ - entire items from the table, as they appeared before they were modified.     * @NEW_AND_OLD_IMAGES@ - both the new and the old images of the items from the table.
---
--- * 'sdStreamARN' - The Amazon Resource Name (ARN) for the stream.
---
--- * 'sdShards' - The shards that comprise the stream.
---
--- * 'sdTableName' - The DynamoDB table with which the stream is associated.
---
--- * 'sdCreationRequestDateTime' - The date and time when the request to create this stream was issued.
-streamDescription
-    :: StreamDescription
-streamDescription =
-  StreamDescription'
-    { _sdLastEvaluatedShardId = Nothing
-    , _sdStreamLabel = Nothing
-    , _sdStreamStatus = Nothing
-    , _sdKeySchema = Nothing
-    , _sdStreamViewType = Nothing
-    , _sdStreamARN = Nothing
-    , _sdShards = Nothing
-    , _sdTableName = Nothing
-    , _sdCreationRequestDateTime = Nothing
-    }
-
-
--- | The shard ID of the item where the operation stopped, inclusive of the previous result set. Use this value to start a new operation, excluding this value in the new request. If @LastEvaluatedShardId@ is empty, then the "last page" of results has been processed and there is currently no more data to be retrieved. If @LastEvaluatedShardId@ is not empty, it does not necessarily mean that there is more data in the result set. The only way to know when you have reached the end of the result set is when @LastEvaluatedShardId@ is empty.
-sdLastEvaluatedShardId :: Lens' StreamDescription (Maybe Text)
-sdLastEvaluatedShardId = lens _sdLastEvaluatedShardId (\ s a -> s{_sdLastEvaluatedShardId = a})
-
--- | A timestamp, in ISO 8601 format, for this stream. Note that @LatestStreamLabel@ is not a unique identifier for the stream, because it is possible that a stream from another table might have the same timestamp. However, the combination of the following three elements is guaranteed to be unique:     * the AWS customer ID.     * the table name     * the @StreamLabel@
-sdStreamLabel :: Lens' StreamDescription (Maybe Text)
-sdStreamLabel = lens _sdStreamLabel (\ s a -> s{_sdStreamLabel = a})
-
--- | Indicates the current status of the stream:     * @ENABLING@ - Streams is currently being enabled on the DynamoDB table.     * @ENABLED@ - the stream is enabled.     * @DISABLING@ - Streams is currently being disabled on the DynamoDB table.     * @DISABLED@ - the stream is disabled.
-sdStreamStatus :: Lens' StreamDescription (Maybe StreamStatus)
-sdStreamStatus = lens _sdStreamStatus (\ s a -> s{_sdStreamStatus = a})
-
--- | The key attribute(s) of the stream's DynamoDB table.
-sdKeySchema :: Lens' StreamDescription (Maybe (NonEmpty KeySchemaElement))
-sdKeySchema = lens _sdKeySchema (\ s a -> s{_sdKeySchema = a}) . mapping _List1
-
--- | Indicates the format of the records within this stream:     * @KEYS_ONLY@ - only the key attributes of items that were modified in the DynamoDB table.     * @NEW_IMAGE@ - entire items from the table, as they appeared after they were modified.     * @OLD_IMAGE@ - entire items from the table, as they appeared before they were modified.     * @NEW_AND_OLD_IMAGES@ - both the new and the old images of the items from the table.
-sdStreamViewType :: Lens' StreamDescription (Maybe StreamViewType)
-sdStreamViewType = lens _sdStreamViewType (\ s a -> s{_sdStreamViewType = a})
-
--- | The Amazon Resource Name (ARN) for the stream.
-sdStreamARN :: Lens' StreamDescription (Maybe Text)
-sdStreamARN = lens _sdStreamARN (\ s a -> s{_sdStreamARN = a})
-
--- | The shards that comprise the stream.
-sdShards :: Lens' StreamDescription [Shard]
-sdShards = lens _sdShards (\ s a -> s{_sdShards = a}) . _Default . _Coerce
-
--- | The DynamoDB table with which the stream is associated.
-sdTableName :: Lens' StreamDescription (Maybe Text)
-sdTableName = lens _sdTableName (\ s a -> s{_sdTableName = a})
-
--- | The date and time when the request to create this stream was issued.
-sdCreationRequestDateTime :: Lens' StreamDescription (Maybe UTCTime)
-sdCreationRequestDateTime = lens _sdCreationRequestDateTime (\ s a -> s{_sdCreationRequestDateTime = a}) . mapping _Time
-
-instance FromJSON StreamDescription where
-        parseJSON
-          = withObject "StreamDescription"
-              (\ x ->
-                 StreamDescription' <$>
-                   (x .:? "LastEvaluatedShardId") <*>
-                     (x .:? "StreamLabel")
-                     <*> (x .:? "StreamStatus")
-                     <*> (x .:? "KeySchema")
-                     <*> (x .:? "StreamViewType")
-                     <*> (x .:? "StreamArn")
-                     <*> (x .:? "Shards" .!= mempty)
-                     <*> (x .:? "TableName")
-                     <*> (x .:? "CreationRequestDateTime"))
-
-instance Hashable StreamDescription where
-
-instance NFData StreamDescription where
-
--- | A description of a single data modification that was performed on an item in a DynamoDB table.
---
---
---
--- /See:/ 'streamRecord' smart constructor.
-data StreamRecord = StreamRecord'
-  { _srSizeBytes                   :: !(Maybe Nat)
-  , _srSequenceNumber              :: !(Maybe Text)
-  , _srApproximateCreationDateTime :: !(Maybe POSIX)
-  , _srStreamViewType              :: !(Maybe StreamViewType)
-  , _srKeys                        :: !(Maybe (Map Text AttributeValue))
-  , _srOldImage                    :: !(Maybe (Map Text AttributeValue))
-  , _srNewImage                    :: !(Maybe (Map Text AttributeValue))
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'StreamRecord' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'srSizeBytes' - The size of the stream record, in bytes.
---
--- * 'srSequenceNumber' - The sequence number of the stream record.
---
--- * 'srApproximateCreationDateTime' - The approximate date and time when the stream record was created, in <http://www.epochconverter.com/ UNIX epoch time> format.
---
--- * 'srStreamViewType' - The type of data from the modified DynamoDB item that was captured in this stream record:     * @KEYS_ONLY@ - only the key attributes of the modified item.     * @NEW_IMAGE@ - the entire item, as it appeared after it was modified.     * @OLD_IMAGE@ - the entire item, as it appeared before it was modified.     * @NEW_AND_OLD_IMAGES@ - both the new and the old item images of the item.
---
--- * 'srKeys' - The primary key attribute(s) for the DynamoDB item that was modified.
---
--- * 'srOldImage' - The item in the DynamoDB table as it appeared before it was modified.
---
--- * 'srNewImage' - The item in the DynamoDB table as it appeared after it was modified.
-streamRecord
-    :: StreamRecord
-streamRecord =
-  StreamRecord'
-    { _srSizeBytes = Nothing
-    , _srSequenceNumber = Nothing
-    , _srApproximateCreationDateTime = Nothing
-    , _srStreamViewType = Nothing
-    , _srKeys = Nothing
-    , _srOldImage = Nothing
-    , _srNewImage = Nothing
-    }
-
-
--- | The size of the stream record, in bytes.
-srSizeBytes :: Lens' StreamRecord (Maybe Natural)
-srSizeBytes = lens _srSizeBytes (\ s a -> s{_srSizeBytes = a}) . mapping _Nat
-
--- | The sequence number of the stream record.
-srSequenceNumber :: Lens' StreamRecord (Maybe Text)
-srSequenceNumber = lens _srSequenceNumber (\ s a -> s{_srSequenceNumber = a})
-
--- | The approximate date and time when the stream record was created, in <http://www.epochconverter.com/ UNIX epoch time> format.
-srApproximateCreationDateTime :: Lens' StreamRecord (Maybe UTCTime)
-srApproximateCreationDateTime = lens _srApproximateCreationDateTime (\ s a -> s{_srApproximateCreationDateTime = a}) . mapping _Time
-
--- | The type of data from the modified DynamoDB item that was captured in this stream record:     * @KEYS_ONLY@ - only the key attributes of the modified item.     * @NEW_IMAGE@ - the entire item, as it appeared after it was modified.     * @OLD_IMAGE@ - the entire item, as it appeared before it was modified.     * @NEW_AND_OLD_IMAGES@ - both the new and the old item images of the item.
-srStreamViewType :: Lens' StreamRecord (Maybe StreamViewType)
-srStreamViewType = lens _srStreamViewType (\ s a -> s{_srStreamViewType = a})
-
--- | The primary key attribute(s) for the DynamoDB item that was modified.
-srKeys :: Lens' StreamRecord (HashMap Text AttributeValue)
-srKeys = lens _srKeys (\ s a -> s{_srKeys = a}) . _Default . _Map
-
--- | The item in the DynamoDB table as it appeared before it was modified.
-srOldImage :: Lens' StreamRecord (HashMap Text AttributeValue)
-srOldImage = lens _srOldImage (\ s a -> s{_srOldImage = a}) . _Default . _Map
-
--- | The item in the DynamoDB table as it appeared after it was modified.
-srNewImage :: Lens' StreamRecord (HashMap Text AttributeValue)
-srNewImage = lens _srNewImage (\ s a -> s{_srNewImage = a}) . _Default . _Map
-
-instance FromJSON StreamRecord where
-        parseJSON
-          = withObject "StreamRecord"
-              (\ x ->
-                 StreamRecord' <$>
-                   (x .:? "SizeBytes") <*> (x .:? "SequenceNumber") <*>
-                     (x .:? "ApproximateCreationDateTime")
-                     <*> (x .:? "StreamViewType")
-                     <*> (x .:? "Keys" .!= mempty)
-                     <*> (x .:? "OldImage" .!= mempty)
-                     <*> (x .:? "NewImage" .!= mempty))
-
-instance Hashable StreamRecord where
-
-instance NFData StreamRecord where
diff --git a/gen/Network/AWS/DynamoDBStreams/Types/Sum.hs b/gen/Network/AWS/DynamoDBStreams/Types/Sum.hs
deleted file mode 100644
--- a/gen/Network/AWS/DynamoDBStreams/Types/Sum.hs
+++ /dev/null
@@ -1,176 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE LambdaCase         #-}
-{-# LANGUAGE OverloadedStrings  #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.DynamoDBStreams.Types.Sum
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.DynamoDBStreams.Types.Sum where
-
-import Network.AWS.Prelude
-
-data KeyType
-  = Hash
-  | Range
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText KeyType where
-    parser = takeLowerText >>= \case
-        "hash" -> pure Hash
-        "range" -> pure Range
-        e -> fromTextError $ "Failure parsing KeyType from value: '" <> e
-           <> "'. Accepted values: hash, range"
-
-instance ToText KeyType where
-    toText = \case
-        Hash -> "HASH"
-        Range -> "RANGE"
-
-instance Hashable     KeyType
-instance NFData       KeyType
-instance ToByteString KeyType
-instance ToQuery      KeyType
-instance ToHeader     KeyType
-
-instance FromJSON KeyType where
-    parseJSON = parseJSONText "KeyType"
-
-data OperationType
-  = Insert
-  | Modify
-  | Remove
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText OperationType where
-    parser = takeLowerText >>= \case
-        "insert" -> pure Insert
-        "modify" -> pure Modify
-        "remove" -> pure Remove
-        e -> fromTextError $ "Failure parsing OperationType from value: '" <> e
-           <> "'. Accepted values: insert, modify, remove"
-
-instance ToText OperationType where
-    toText = \case
-        Insert -> "INSERT"
-        Modify -> "MODIFY"
-        Remove -> "REMOVE"
-
-instance Hashable     OperationType
-instance NFData       OperationType
-instance ToByteString OperationType
-instance ToQuery      OperationType
-instance ToHeader     OperationType
-
-instance FromJSON OperationType where
-    parseJSON = parseJSONText "OperationType"
-
-data ShardIteratorType
-  = AfterSequenceNumber
-  | AtSequenceNumber
-  | Latest
-  | TrimHorizon
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText ShardIteratorType where
-    parser = takeLowerText >>= \case
-        "after_sequence_number" -> pure AfterSequenceNumber
-        "at_sequence_number" -> pure AtSequenceNumber
-        "latest" -> pure Latest
-        "trim_horizon" -> pure TrimHorizon
-        e -> fromTextError $ "Failure parsing ShardIteratorType from value: '" <> e
-           <> "'. Accepted values: after_sequence_number, at_sequence_number, latest, trim_horizon"
-
-instance ToText ShardIteratorType where
-    toText = \case
-        AfterSequenceNumber -> "AFTER_SEQUENCE_NUMBER"
-        AtSequenceNumber -> "AT_SEQUENCE_NUMBER"
-        Latest -> "LATEST"
-        TrimHorizon -> "TRIM_HORIZON"
-
-instance Hashable     ShardIteratorType
-instance NFData       ShardIteratorType
-instance ToByteString ShardIteratorType
-instance ToQuery      ShardIteratorType
-instance ToHeader     ShardIteratorType
-
-instance ToJSON ShardIteratorType where
-    toJSON = toJSONText
-
-data StreamStatus
-  = Disabled
-  | Disabling
-  | Enabled
-  | Enabling
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText StreamStatus where
-    parser = takeLowerText >>= \case
-        "disabled" -> pure Disabled
-        "disabling" -> pure Disabling
-        "enabled" -> pure Enabled
-        "enabling" -> pure Enabling
-        e -> fromTextError $ "Failure parsing StreamStatus from value: '" <> e
-           <> "'. Accepted values: disabled, disabling, enabled, enabling"
-
-instance ToText StreamStatus where
-    toText = \case
-        Disabled -> "DISABLED"
-        Disabling -> "DISABLING"
-        Enabled -> "ENABLED"
-        Enabling -> "ENABLING"
-
-instance Hashable     StreamStatus
-instance NFData       StreamStatus
-instance ToByteString StreamStatus
-instance ToQuery      StreamStatus
-instance ToHeader     StreamStatus
-
-instance FromJSON StreamStatus where
-    parseJSON = parseJSONText "StreamStatus"
-
-data StreamViewType
-  = KeysOnly
-  | NewAndOldImages
-  | NewImage
-  | OldImage
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText StreamViewType where
-    parser = takeLowerText >>= \case
-        "keys_only" -> pure KeysOnly
-        "new_and_old_images" -> pure NewAndOldImages
-        "new_image" -> pure NewImage
-        "old_image" -> pure OldImage
-        e -> fromTextError $ "Failure parsing StreamViewType from value: '" <> e
-           <> "'. Accepted values: keys_only, new_and_old_images, new_image, old_image"
-
-instance ToText StreamViewType where
-    toText = \case
-        KeysOnly -> "KEYS_ONLY"
-        NewAndOldImages -> "NEW_AND_OLD_IMAGES"
-        NewImage -> "NEW_IMAGE"
-        OldImage -> "OLD_IMAGE"
-
-instance Hashable     StreamViewType
-instance NFData       StreamViewType
-instance ToByteString StreamViewType
-instance ToQuery      StreamViewType
-instance ToHeader     StreamViewType
-
-instance FromJSON StreamViewType where
-    parseJSON = parseJSONText "StreamViewType"
diff --git a/gen/Network/AWS/DynamoDBStreams/Waiters.hs b/gen/Network/AWS/DynamoDBStreams/Waiters.hs
deleted file mode 100644
--- a/gen/Network/AWS/DynamoDBStreams/Waiters.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies      #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.DynamoDBStreams.Waiters
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.DynamoDBStreams.Waiters where
-
-import Network.AWS.DynamoDBStreams.Types
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Waiter
diff --git a/src/Amazonka/DynamoDBStreams/Internal.hs b/src/Amazonka/DynamoDBStreams/Internal.hs
new file mode 100644
--- /dev/null
+++ b/src/Amazonka/DynamoDBStreams/Internal.hs
@@ -0,0 +1,149 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# OPTIONS_GHC -Wall -Werror #-}
+
+-- |
+-- Module      : Amazonka.DynamoDBStreams.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+module Amazonka.DynamoDBStreams.Internal where
+
+import Amazonka.Data
+import Amazonka.Prelude
+import Data.Aeson (pairs)
+import Data.Hashable
+import Data.Map (Map)
+import Data.Vector (Vector)
+
+#if MIN_VERSION_aeson(2,0,0)
+import qualified  Data.Aeson.KeyMap as KeyMap
+#else
+import qualified  Data.HashMap.Strict as KeyMap
+#endif
+
+-- | Represents the data for an attribute.
+--
+-- DynamoDB sends and receives JSON objects which contain a single
+-- item whose key is a data type and the value is the data itself. We
+-- provide an actual sum type to interact with these.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes Data Types>
+-- in the /Amazon DynamoDB Developer Guide/.
+data AttributeValue
+  = -- | An attribute of type List. For example:
+    --
+    -- @\"L\": [ {\"S\": \"Cookies\"} , {\"S\": \"Coffee\"}, {\"N\", \"3.14159\"}]@
+    L (Vector AttributeValue)
+  | -- | An attribute of type Number Set. For example:
+    --
+    -- @\"NS\": [\"42.2\", \"-19\", \"7.5\", \"3.14\"]@
+    --
+    -- Numbers are sent across the network to DynamoDB as strings, to maximize
+    -- compatibility across languages and libraries. However, DynamoDB treats
+    -- them as number type attributes for mathematical operations.
+    NS (Vector Text)
+  | -- | An attribute of type Map. For example:
+    --
+    -- @\"M\": {\"Name\": {\"S\": \"Joe\"}, \"Age\": {\"N\": \"35\"}}@
+    M (Map Text AttributeValue)
+  | -- | An attribute of type Null. For example:
+    --
+    -- @\"NULL\": true@
+    NULL
+  | -- | An attribute of type Number. For example:
+    --
+    -- @\"N\": \"123.45\"@
+    --
+    -- Numbers are sent across the network to DynamoDB as strings, to maximize
+    -- compatibility across languages and libraries. However, DynamoDB treats
+    -- them as number type attributes for mathematical operations.
+    N Text
+  | -- | An attribute of type Binary Set. For example:
+    --
+    -- @\"BS\": [\"U3Vubnk=\", \"UmFpbnk=\", \"U25vd3k=\"]@
+    BS (Vector Base64)
+  | -- | An attribute of type Binary. For example:
+    --
+    -- @\"B\": \"dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk\"@
+    B Base64
+  | -- | An attribute of type String Set. For example:
+    --
+    -- @\"SS\": [\"Giraffe\", \"Hippo\" ,\"Zebra\"]@
+    SS (Vector Text)
+  | -- | An attribute of type String. For example:
+    --
+    -- @\"S\": \"Hello\"@
+    S Text
+  | -- | An attribute of type Boolean. For example:
+    --
+    -- @\"BOOL\": true@
+    BOOL Bool
+  deriving stock (Eq, Read, Show, Generic)
+  deriving anyclass (NFData)
+
+instance Hashable AttributeValue where
+  hashWithSalt salt = \case
+    L avs -> salt `hashWithSalt` (0 :: Int) `hashVector` avs
+    NS ns -> salt `hashWithSalt` (1 :: Int) `hashVector` ns
+    M m -> salt `hashWithSalt` (2 :: Int) `hashWithSalt` m
+    NULL -> salt `hashWithSalt` (3 :: Int) `hashWithSalt` ()
+    N n -> salt `hashWithSalt` (4 :: Int) `hashWithSalt` n
+    BS bs -> salt `hashWithSalt` (5 :: Int) `hashVector` bs
+    B b -> salt `hashWithSalt` (6 :: Int) `hashWithSalt` b
+    SS ss -> salt `hashWithSalt` (7 :: Int) `hashVector` ss
+    S s -> salt `hashWithSalt` (8 :: Int) `hashWithSalt` s
+    BOOL b -> salt `hashWithSalt` (9 :: Int) `hashWithSalt` b
+    where
+      hashVector :: Hashable a => Int -> Vector a -> Int
+      hashVector = hashUsing toList
+
+instance FromJSON AttributeValue where
+  parseJSON = withObject "AttributeValue" $ \o ->
+    case KeyMap.toList o of
+      [("L", v)] -> L <$> parseJSON v
+      [("NS", v)] -> NS <$> parseJSON v
+      [("M", v)] -> M <$> parseJSON v
+      [("NULL", _)] -> pure NULL
+      [("N", v)] -> N <$> parseJSON v
+      [("BS", v)] -> BS <$> parseJSON v
+      [("B", v)] -> B <$> parseJSON v
+      [("SS", v)] -> SS <$> parseJSON v
+      [("S", v)] -> S <$> parseJSON v
+      [("BOOL", v)] -> BOOL <$> parseJSON v
+      [] -> fail "No keys"
+      _ -> fail $ "Multiple or unrecognized keys: " ++ show (KeyMap.keys o)
+
+instance ToJSON AttributeValue where
+  toJSON =
+    object . pure . \case
+      L avs -> "L" .= avs
+      NS ns -> "NS" .= ns
+      M m -> "M" .= m
+      NULL -> "NULL" .= True
+      N n -> "N" .= n
+      BS bs -> "BS" .= bs
+      B b -> "B" .= b
+      SS ss -> "SS" .= ss
+      S s -> "S" .= s
+      BOOL b -> "BOOL" .= b
+  toEncoding =
+    pairs . \case
+      L avs -> "L" .= avs
+      NS ns -> "NS" .= ns
+      M m -> "M" .= m
+      NULL -> "NULL" .= True
+      N n -> "N" .= n
+      BS bs -> "BS" .= bs
+      B b -> "B" .= b
+      SS ss -> "SS" .= ss
+      S s -> "S" .= s
+      BOOL b -> "BOOL" .= b
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,20 +2,22 @@
 
 -- |
 -- Module      : Main
--- Copyright   : (c) 2013-2018 Brendan Hay
+-- Copyright   : (c) 2013-2023 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Maintainer  : Brendan Hay
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
---
 module Main (main) where
 
+import Test.Amazonka.DynamoDBStreams
+import Test.Amazonka.DynamoDBStreams.Internal
 import Test.Tasty
-import Test.AWS.DynamoDBStreams
-import Test.AWS.DynamoDBStreams.Internal
 
 main :: IO ()
-main = defaultMain $ testGroup "DynamoDBStreams"
-    [ testGroup "tests"    tests
-    , testGroup "fixtures" fixtures
-    ]
+main =
+  defaultMain $
+    testGroup
+      "DynamoDBStreams"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/AWS/DynamoDBStreams.hs b/test/Test/AWS/DynamoDBStreams.hs
deleted file mode 100644
--- a/test/Test/AWS/DynamoDBStreams.hs
+++ /dev/null
@@ -1,26 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-
--- Module      : Test.AWS.DynamoDBStreams
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : This Source Code Form is subject to the terms of
---               the Mozilla Public License, v. 2.0.
---               A copy of the MPL can be found in the LICENSE file or
---               you can obtain it at http://mozilla.org/MPL/2.0/.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
--- Portability : non-portable (GHC extensions)
-
-module Test.AWS.DynamoDBStreams
-    ( tests
-    , fixtures
-    ) where
-
-import           Network.AWS.DynamoDBStreams
-import           Test.AWS.Gen.DynamoDBStreams
-import           Test.Tasty
-
-tests :: [TestTree]
-tests = []
-
-fixtures :: [TestTree]
-fixtures = []
diff --git a/test/Test/AWS/DynamoDBStreams/Internal.hs b/test/Test/AWS/DynamoDBStreams/Internal.hs
deleted file mode 100644
--- a/test/Test/AWS/DynamoDBStreams/Internal.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Module      : Test.AWS.DynamoDBStreams.Internal
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : This Source Code Form is subject to the terms of
---               the Mozilla Public License, v. 2.0.
---               A copy of the MPL can be found in the LICENSE file or
---               you can obtain it at http://mozilla.org/MPL/2.0/.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
--- Portability : non-portable (GHC extensions)
-
-module Test.AWS.DynamoDBStreams.Internal where
-
-import           Test.AWS.Prelude
diff --git a/test/Test/AWS/Gen/DynamoDBStreams.hs b/test/Test/AWS/Gen/DynamoDBStreams.hs
deleted file mode 100644
--- a/test/Test/AWS/Gen/DynamoDBStreams.hs
+++ /dev/null
@@ -1,111 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-orphans        #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Test.AWS.Gen.DynamoDBStreams
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.Gen.DynamoDBStreams where
-
-import Data.Proxy
-import Network.AWS.DynamoDBStreams
-import Test.AWS.DynamoDBStreams.Internal
-import Test.AWS.Fixture
-import Test.AWS.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"
---         [ requestGetShardIterator $
---             getShardIterator
---
---         , requestGetRecords $
---             getRecords
---
---         , requestListStreams $
---             listStreams
---
---         , requestDescribeStream $
---             describeStream
---
---           ]
-
---     , testGroup "response"
---         [ responseGetShardIterator $
---             getShardIteratorResponse
---
---         , responseGetRecords $
---             getRecordsResponse
---
---         , responseListStreams $
---             listStreamsResponse
---
---         , responseDescribeStream $
---             describeStreamResponse
---
---           ]
---     ]
-
--- Requests
-
-requestGetShardIterator :: GetShardIterator -> TestTree
-requestGetShardIterator = req
-    "GetShardIterator"
-    "fixture/GetShardIterator.yaml"
-
-requestGetRecords :: GetRecords -> TestTree
-requestGetRecords = req
-    "GetRecords"
-    "fixture/GetRecords.yaml"
-
-requestListStreams :: ListStreams -> TestTree
-requestListStreams = req
-    "ListStreams"
-    "fixture/ListStreams.yaml"
-
-requestDescribeStream :: DescribeStream -> TestTree
-requestDescribeStream = req
-    "DescribeStream"
-    "fixture/DescribeStream.yaml"
-
--- Responses
-
-responseGetShardIterator :: GetShardIteratorResponse -> TestTree
-responseGetShardIterator = res
-    "GetShardIteratorResponse"
-    "fixture/GetShardIteratorResponse.proto"
-    dynamoDBStreams
-    (Proxy :: Proxy GetShardIterator)
-
-responseGetRecords :: GetRecordsResponse -> TestTree
-responseGetRecords = res
-    "GetRecordsResponse"
-    "fixture/GetRecordsResponse.proto"
-    dynamoDBStreams
-    (Proxy :: Proxy GetRecords)
-
-responseListStreams :: ListStreamsResponse -> TestTree
-responseListStreams = res
-    "ListStreamsResponse"
-    "fixture/ListStreamsResponse.proto"
-    dynamoDBStreams
-    (Proxy :: Proxy ListStreams)
-
-responseDescribeStream :: DescribeStreamResponse -> TestTree
-responseDescribeStream = res
-    "DescribeStreamResponse"
-    "fixture/DescribeStreamResponse.proto"
-    dynamoDBStreams
-    (Proxy :: Proxy DescribeStream)
diff --git a/test/Test/Amazonka/DynamoDBStreams.hs b/test/Test/Amazonka/DynamoDBStreams.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/DynamoDBStreams.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.DynamoDBStreams
+-- 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.DynamoDBStreams
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/DynamoDBStreams/Internal.hs b/test/Test/Amazonka/DynamoDBStreams/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/DynamoDBStreams/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.DynamoDBStreams.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.DynamoDBStreams.Internal where
diff --git a/test/Test/Amazonka/Gen/DynamoDBStreams.hs b/test/Test/Amazonka/Gen/DynamoDBStreams.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/DynamoDBStreams.hs
@@ -0,0 +1,118 @@
+{-# 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.DynamoDBStreams
+-- 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.DynamoDBStreams where
+
+import Amazonka.DynamoDBStreams
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.DynamoDBStreams.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"
+--         [ requestDescribeStream $
+--             newDescribeStream
+--
+--         , requestGetRecords $
+--             newGetRecords
+--
+--         , requestGetShardIterator $
+--             newGetShardIterator
+--
+--         , requestListStreams $
+--             newListStreams
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseDescribeStream $
+--             newDescribeStreamResponse
+--
+--         , responseGetRecords $
+--             newGetRecordsResponse
+--
+--         , responseGetShardIterator $
+--             newGetShardIteratorResponse
+--
+--         , responseListStreams $
+--             newListStreamsResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestDescribeStream :: DescribeStream -> TestTree
+requestDescribeStream =
+  req
+    "DescribeStream"
+    "fixture/DescribeStream.yaml"
+
+requestGetRecords :: GetRecords -> TestTree
+requestGetRecords =
+  req
+    "GetRecords"
+    "fixture/GetRecords.yaml"
+
+requestGetShardIterator :: GetShardIterator -> TestTree
+requestGetShardIterator =
+  req
+    "GetShardIterator"
+    "fixture/GetShardIterator.yaml"
+
+requestListStreams :: ListStreams -> TestTree
+requestListStreams =
+  req
+    "ListStreams"
+    "fixture/ListStreams.yaml"
+
+-- Responses
+
+responseDescribeStream :: DescribeStreamResponse -> TestTree
+responseDescribeStream =
+  res
+    "DescribeStreamResponse"
+    "fixture/DescribeStreamResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeStream)
+
+responseGetRecords :: GetRecordsResponse -> TestTree
+responseGetRecords =
+  res
+    "GetRecordsResponse"
+    "fixture/GetRecordsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetRecords)
+
+responseGetShardIterator :: GetShardIteratorResponse -> TestTree
+responseGetShardIterator =
+  res
+    "GetShardIteratorResponse"
+    "fixture/GetShardIteratorResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetShardIterator)
+
+responseListStreams :: ListStreamsResponse -> TestTree
+responseListStreams =
+  res
+    "ListStreamsResponse"
+    "fixture/ListStreamsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListStreams)
