diff --git a/Network/Wreq/Internal/AWS.hs b/Network/Wreq/Internal/AWS.hs
--- a/Network/Wreq/Internal/AWS.hs
+++ b/Network/Wreq/Internal/AWS.hs
@@ -82,12 +82,13 @@
             -- Runscope (correctly) doesn't send Bucket Auth header to AWS,
             -- remove it from the headers we sign. Adding back in at the end.
             . deleteKey "Runscope-Bucket-Auth"
+  let encodePath p = S.intercalate "/" $ map (urlEncode False) $ S.split '/' p
   -- task 1
   let hl = req ^. requestHeaders . to sort
       signedHeaders = S.intercalate ";" . map (lowerCI . fst) $ hl
       canonicalReq = S.intercalate "\n" [
           req ^. method             -- step 1
-        , req ^. path               -- step 2
+        , encodePath (req ^. path)  -- step 2
         ,   S.intercalate "&"       -- step 3b, incl. sort
             -- urlEncode True (QS) to encode ':' and '/' (e.g. in AWS arns)
           . map (\(k,v) -> urlEncode True k <> "=" <> urlEncode True v)
@@ -164,6 +165,12 @@
     -- not s3
   | endpoint `elem` ["sts.amazonaws.com"] =
     ("sts", "us-east-1")
+  | ".execute-api." `S.isInfixOf` endpoint =
+    let gateway:service:region:_ = S.split '.' endpoint
+    in (service, region)
+  | ".es.amazonaws.com" `S.isSuffixOf` endpoint =
+    let _:region:_ = S.split '.' endpoint
+    in ("es", region)
   | svc `HashSet.member` noRegion =
     (svc, "us-east-1")
   | otherwise =
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,9 @@
 -*- markdown -*-
 
+2018-12-10 0.5.3.1
+
+* Fix AWS-related things
+
 2018-11-16 0.5.3.0
 
 * Added Postable/Putable on aeson encoding
diff --git a/wreq.cabal b/wreq.cabal
--- a/wreq.cabal
+++ b/wreq.cabal
@@ -1,5 +1,5 @@
 name:                wreq
-version:             0.5.3.0
+version:             0.5.3.1
 synopsis:            An easy-to-use HTTP client library.
 description:
   .
