Skip to content

Commit dfbe24b

Browse files
committed
Route AWS Scheduled Events to given route
1 parent 63f2049 commit dfbe24b

File tree

4 files changed

+57
-10
lines changed

4 files changed

+57
-10
lines changed

project.clj

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,8 @@
33
:url "http://example.com/FIXME"
44
:license {:name "Eclipse Public License"
55
:url "http://www.eclipse.org/legal/epl-v10.html"}
6-
:dependencies [[org.clojure/clojure "1.8.0"]])
6+
:dependencies [[org.clojure/clojure "1.8.0"]]
7+
:profiles {:dev {:dependencies [[cheshire "5.7.0"]
8+
[compojure "1.5.2"]
9+
[ring/ring-json "0.4.0"]]}})
10+

src/ring/middleware/apigw.clj

+16-9
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,19 @@
44
(defn- generate-query-string [params]
55
(clojure.string/join "&" (map (fn [[k v]] (str (URLEncoder/encode (name k)) "=" (URLEncoder/encode v))) params)))
66

7-
(defn wrap-apigw-lambda-proxy [handler]
8-
(fn [apigw-request]
9-
(let [ring-request {:uri (:path apigw-request)
10-
:query-string (generate-query-string (:queryStringParameters apigw-request))
11-
:request-method :get}
12-
response (handler ring-request)]
13-
{:statusCode (:status response)
14-
:headers (:headers response)
15-
:body (:body response)})))
7+
(defn wrap-apigw-lambda-proxy
8+
([handler] (wrap-apigw-lambda-proxy handler {}))
9+
([handler {:keys [scheduled-event-route]}]
10+
(fn [apigw-request]
11+
(let [scheduled-event? (= "Scheduled Event" (:detail-type apigw-request))
12+
ring-request (if scheduled-event?
13+
{:uri scheduled-event-route
14+
:query-string ""
15+
:request-method :get}
16+
{:uri (:path apigw-request)
17+
:query-string (generate-query-string (:queryStringParameters apigw-request))
18+
:request-method :get})
19+
response (handler ring-request)]
20+
{:statusCode (:status response)
21+
:headers (:headers response)
22+
:body (:body response)}))))

test/ring/middleware/apigw_test.clj

+24
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,24 @@
11
(ns ring.middleware.apigw-test
22
(:require [clojure.test :refer :all]
3+
[clojure.java.io :as io]
4+
[compojure.core :refer :all]
5+
[compojure.route :as route]
6+
[cheshire.core :refer [parse-string]]
7+
[ring.middleware.params :refer [wrap-params]]
8+
[ring.middleware.keyword-params :refer [wrap-keyword-params]]
9+
[ring.middleware.json :refer [wrap-json-response]]
310
[ring.middleware.apigw :refer [wrap-apigw-lambda-proxy]]))
411

12+
(defroutes app-routes
13+
(GET "/warmup" request {:status 200 :body "warmup"})
14+
(route/not-found {:status 404 :body {:errors "Route not found"}}))
15+
16+
(def ring-routes
17+
(-> app-routes
18+
wrap-keyword-params
19+
wrap-params
20+
wrap-json-response))
21+
522
(deftest query-string-is-url-encoded
623
(let [handler (fn [request] {:body request :status 200 :headers nil})
724
app (wrap-apigw-lambda-proxy handler)
@@ -10,3 +27,10 @@
1027
(keyword "foo[]") "bar"}}
1128
query-string (get-in (app request) [:body :query-string])]
1229
(is (= query-string "text=hello%2C+world%21&foo%5B%5D=bar"))))
30+
31+
(deftest scheduled-event-is-handled
32+
(let [app (wrap-apigw-lambda-proxy ring-routes {:scheduled-event-route "/warmup"})
33+
result (app (-> (io/resource "scheduled-event.json")
34+
(slurp)
35+
(parse-string true)))]
36+
(is (= {:statusCode 200 :headers {} :body "warmup"} result))))

test/scheduled-event.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"account": "123456789012",
3+
"region": "us-east-1",
4+
"detail": {},
5+
"detail-type": "Scheduled Event",
6+
"source": "aws.events",
7+
"time": "1970-01-01T00:00:00Z",
8+
"id": "cdc73f9d-aea9-11e3-9d5a-835b769c0d9c",
9+
"resources": [
10+
"arn:aws:events:us-east-1:123456789012:rule/my-schedule"
11+
]
12+
}

0 commit comments

Comments
 (0)