From 673534b14f8c81971534e19e4bb56d98471f253e Mon Sep 17 00:00:00 2001 From: Sayan Samanta Date: Wed, 25 Mar 2020 12:13:21 -0700 Subject: [PATCH 1/8] 0.4.1 --- golang.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/golang.mk b/golang.mk index 6035eac..63f8ab4 100644 --- a/golang.mk +++ b/golang.mk @@ -1,7 +1,7 @@ # This is the default Clever Golang Makefile. # It is stored in the dev-handbook repo, github.com/Clever/dev-handbook # Please do not alter this file directly. -GOLANG_MK_VERSION := 0.4.0 +GOLANG_MK_VERSION := 0.4.1 SHELL := /bin/bash SYSTEM := $(shell uname -a | cut -d" " -f1 | tr '[:upper:]' '[:lower:]') @@ -39,7 +39,7 @@ $(FGT): golang-ensure-curl-installed: @command -v curl >/dev/null 2>&1 || { echo >&2 "curl not installed. Please install curl."; exit 1; } -DEP_VERSION = v0.4.1 +DEP_VERSION = v0.5.4 DEP_INSTALLED := $(shell [[ -e "bin/dep" ]] && bin/dep version | grep version | grep -v go | cut -d: -f2 | tr -d '[:space:]') # Dep is a tool used to manage Golang dependencies. It is the offical vendoring experiment, but # not yet the official tool for Golang. From 0adb43a4d6f3c8fdf4cbfcb41e8bd9f2b4f9d230 Mon Sep 17 00:00:00 2001 From: Sayan Samanta Date: Wed, 25 Mar 2020 12:13:35 -0700 Subject: [PATCH 2/8] add aws-sdk-go + update leakybucket --- Gopkg.lock | 155 +++++++++++++++++++++++++++++++++++++++++++++++------ Gopkg.toml | 29 ++-------- 2 files changed, 145 insertions(+), 39 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index b3d12de..8648ade 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,88 +2,213 @@ [[projects]] + digest = "1:d91a090d94f858edced27f983656c5a85d186463e40f4996a996ceee423b058f" name = "github.com/Clever/leakybucket" packages = [ ".", + "dynamodb", "memory", - "redis" + "redis", ] - revision = "e71c0c5ef35405c601ade74f6c02b71aa68b8d0d" + pruneopts = "" + revision = "d6df64f795e6d308d51d5e3e4ea18456ffb3b264" + version = "v1.0.0" [[projects]] + digest = "1:0fc946169edf6aed7facaf8d0893f40aa1a3a363a4fae5e0cb4ff07fe3532655" + name = "github.com/aws/aws-sdk-go" + packages = [ + "aws", + "aws/awserr", + "aws/awsutil", + "aws/client", + "aws/client/metadata", + "aws/corehandlers", + "aws/credentials", + "aws/credentials/ec2rolecreds", + "aws/credentials/endpointcreds", + "aws/credentials/processcreds", + "aws/credentials/stscreds", + "aws/crr", + "aws/csm", + "aws/defaults", + "aws/ec2metadata", + "aws/endpoints", + "aws/request", + "aws/session", + "aws/signer/v4", + "internal/context", + "internal/ini", + "internal/sdkio", + "internal/sdkmath", + "internal/sdkrand", + "internal/sdkuri", + "internal/shareddefaults", + "internal/strings", + "internal/sync/singleflight", + "private/protocol", + "private/protocol/json/jsonutil", + "private/protocol/jsonrpc", + "private/protocol/query", + "private/protocol/query/queryutil", + "private/protocol/rest", + "private/protocol/xml/xmlutil", + "service/dynamodb", + "service/dynamodb/dynamodbattribute", + "service/dynamodb/dynamodbiface", + "service/sts", + "service/sts/stsiface", + ] + pruneopts = "" + revision = "38d919b886b050f26e53e5de9bd3b3ba46f018e8" + version = "v1.29.34" + +[[projects]] + digest = "1:0deddd908b6b4b768cfc272c16ee61e7088a60f7fe2f06c547bd3d8e1f8b8e77" + name = "github.com/davecgh/go-spew" + packages = ["spew"] + pruneopts = "" + revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" + version = "v1.1.1" + +[[projects]] + digest = "1:9525d0e79ccf382e32edeef466b9a91f16eb0eebdca5971a03fad1bb3be9cd89" name = "github.com/garyburd/redigo" packages = [ "internal", - "redis" + "redis", ] + pruneopts = "" revision = "a69d19351219b6dd56f274f96d85a7014a2ec34e" version = "v1.6.0" [[projects]] + digest = "1:ad92aa49f34cbc3546063c7eb2cabb55ee2278b72842eda80e2a20a8a06a8d73" + name = "github.com/google/uuid" + packages = ["."] + pruneopts = "" + revision = "0cd6bf5da1e1c83f8b45653022c74f71af0538a4" + version = "v1.1.1" + +[[projects]] + digest = "1:13fe471d0ed891e8544eddfeeb0471fd3c9f2015609a1c000aefdedf52a19d40" + name = "github.com/jmespath/go-jmespath" + packages = ["."] + pruneopts = "" + revision = "c2b33e84" + +[[projects]] + digest = "1:a5484d4fa43127138ae6e7b2299a6a52ae006c7f803d98d717f60abf3e97192e" name = "github.com/pborman/uuid" packages = ["."] - revision = "c55201b036063326c5b1b89ccfe45a184973d073" + pruneopts = "" + revision = "adf5a7427709b9deb95d29d3fa8a2bf9cfd388f1" + version = "v1.2" + +[[projects]] + digest = "1:256484dbbcd271f9ecebc6795b2df8cad4c458dd0f5fd82a8c2fa0c29f233411" + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + pruneopts = "" + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" [[projects]] + digest = "1:88e031206b52c11a8442f3f07e9bcddc1b248274d0506c768a948e7e254b84bb" name = "github.com/stretchr/objx" packages = ["."] - revision = "cbeaeb16a013161a98496fad62933b1d21786672" + pruneopts = "" + revision = "ea4fe68685ee0d3cee7032121851b57e7494e8ea" + version = "v0.2.0" [[projects]] + digest = "1:cc4eb6813da8d08694e557fcafae8fcc24f47f61a0717f952da130ca9a486dfc" name = "github.com/stretchr/testify" packages = [ "assert", - "mock" + "mock", ] - revision = "ddcad49ec6b8f31bc3daf3a1fbea7eac58d61ff0" + pruneopts = "" + revision = "3ebf1ddaeb260c4b1ae502a01c7844fa8c1fa0e9" + version = "v1.5.1" [[projects]] + branch = "master" + digest = "1:5372ed388f189f6204f1864a2bae1ce9bbdf33f47528ffc776d31a649e3978aa" name = "github.com/xeipuuv/gojsonpointer" packages = ["."] - revision = "e0fe6f68307607d540ed8eac07a342c33fa1b54a" + pruneopts = "" + revision = "02993c407bfbf5f6dae44c4f4b1cf6a39b5fc5bb" [[projects]] branch = "master" + digest = "1:604f98a38394d2805a78c462396a4992b93fdd5b7306130add330f1a99ac6b0a" name = "github.com/xeipuuv/gojsonreference" packages = ["."] - revision = "e02fc20de94c78484cd5ffb007f8af96be030a45" + pruneopts = "" + revision = "bd5ef7bd5415a7ac448318e64f11a24cd21e594b" [[projects]] + branch = "master" + digest = "1:43ea491ae2a23ad30fe6273b50d2ecafa93b98f7ab8e3d0f533b39337c25930e" name = "github.com/xeipuuv/gojsonschema" packages = ["."] - revision = "00f9fafb54d2244d291b86ab63d12c38bd5c3886" + pruneopts = "" + revision = "b537c054d4b486d62f64a76b8d48fdf38a0ea99d" [[projects]] + digest = "1:7f26011c3c526622fb75234cde0241821e1910e5f8284e129249aef104898353" name = "gopkg.in/Clever/kayvee-go.v6" packages = [ ".", "logger", "middleware", - "router" + "router", ] - revision = "096364e316a52652d3493be702d8105d8d01db84" - version = "v6.6.0" + pruneopts = "" + revision = "f1eb862e07bb00f481e0064c742181db62c8818c" + version = "v6.21.0" [[projects]] + digest = "1:8143ea52154df4cf52589d780ad447f625978a4c29713200842ccaa7c532350a" name = "gopkg.in/tylerb/graceful.v1" packages = ["."] + pruneopts = "" revision = "4654dfbb6ad53cb5e27f37d99b02e16c1872fbbb" version = "v1.2.15" [[projects]] branch = "v1" + digest = "1:d6dfc13bd1ac289efe8d7d267ccb0d34dc6a6e55703a228cdea1848f5b2dc529" name = "gopkg.in/yaml.v1" packages = ["."] + pruneopts = "" revision = "9f9df34309c04878acc86042b16630b0f696e1de" [[projects]] + branch = "v2" + digest = "1:2efc9662a6a1ff28c65c84fc2f9030f13d3afecdb2ecad445f3b0c80e75fc281" name = "gopkg.in/yaml.v2" packages = ["."] - revision = "49c95bdc21843256fb6c4e0d370a05f24a0bf213" + pruneopts = "" + revision = "53403b58ad1b561927d19068c655246f2db79d48" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "8fa60781398ccfb94fb0732ba14e22ca7407bc00d4469583ca617322d3a9cfc9" + input-imports = [ + "github.com/Clever/leakybucket", + "github.com/Clever/leakybucket/dynamodb", + "github.com/Clever/leakybucket/memory", + "github.com/Clever/leakybucket/redis", + "github.com/aws/aws-sdk-go/aws", + "github.com/aws/aws-sdk-go/aws/session", + "github.com/pborman/uuid", + "github.com/stretchr/testify/mock", + "gopkg.in/Clever/kayvee-go.v6/logger", + "gopkg.in/Clever/kayvee-go.v6/middleware", + "gopkg.in/tylerb/graceful.v1", + "gopkg.in/yaml.v1", + ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 442525f..12d5112 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -1,29 +1,6 @@ - -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" - - [[constraint]] name = "github.com/Clever/leakybucket" - revision = "e71c0c5ef35405c601ade74f6c02b71aa68b8d0d" + version = "1.0.0" [[constraint]] name = "github.com/pborman/uuid" @@ -42,3 +19,7 @@ [[constraint]] name = "gopkg.in/tylerb/graceful.v1" version = "1.2.15" + +[[constraint]] + name = "github.com/aws/aws-sdk-go" + version = "1.29.32" From f2152e7a1a6e601989a678e0fcf2be752533c470 Mon Sep 17 00:00:00 2001 From: Sayan Samanta Date: Wed, 25 Mar 2020 13:07:39 -0700 Subject: [PATCH 3/8] validate and use dynamodb config --- config/config.go | 7 +++++++ ratelimiter/ratelimiter.go | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/config/config.go b/config/config.go index 10ab60e..be96416 100644 --- a/config/config.go +++ b/config/config.go @@ -105,6 +105,13 @@ func ValidateConfig(config Config) error { switch strings.ToLower(store) { default: return fmt.Errorf("storage type needs to be memory or redis") + case "dynamodb": + if _, ok := config.Storage["region"]; !ok { + return fmt.Errorf("storage region must be set for DynamoDB") + } + if _, ok := config.Storage["table"]; !ok { + return fmt.Errorf("storage table must be set for DynamoDB") + } case "redis": if _, ok := config.Storage["host"]; !ok { return fmt.Errorf("storage host must be set for Redis") diff --git a/ratelimiter/ratelimiter.go b/ratelimiter/ratelimiter.go index 2a70c4a..b91c294 100644 --- a/ratelimiter/ratelimiter.go +++ b/ratelimiter/ratelimiter.go @@ -3,13 +3,18 @@ package ratelimiter import ( "errors" "fmt" + "time" + "github.com/Clever/leakybucket" + leakybucketDynamoDB "github.com/Clever/leakybucket/dynamodb" leakybucketMemory "github.com/Clever/leakybucket/memory" leakybucketRedis "github.com/Clever/leakybucket/redis" "github.com/Clever/sphinx/common" "github.com/Clever/sphinx/config" "github.com/Clever/sphinx/limit" - "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" ) // Status contains the status of a limit. @@ -42,6 +47,15 @@ func resolveBucketStore(config map[string]string) (leakybucket.Storage, error) { case "redis": return leakybucketRedis.New("tcp", fmt.Sprintf("%s:%s", config["host"], config["port"])) + case "dynamodb": + return leakybucketDynamoDB.New( + config["table"], + session.New(&aws.Config{ + Region: aws.String(config["region"]), + MaxRetries: aws.Int(0), + }), + 24*time.Hour, + ) } } From 2b66c855141eb09b5906dda53e5bcc116dbcba11 Mon Sep 17 00:00:00 2001 From: Sayan Samanta Date: Wed, 25 Mar 2020 13:25:18 -0700 Subject: [PATCH 4/8] test dynamo config. use new buffer every case --- config/config_test.go | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/config/config_test.go b/config/config_test.go index 5a3af7a..0faba14 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -181,7 +181,8 @@ limits: t.Errorf("Expected Storage error. Got: %s", err.Error()) } - configBuf := baseBuf + // invalid redis configs (requires both host and port) + configBuf := bytes.NewBuffer(baseBuf.Bytes()) configBuf.WriteString(` storage: type: redis @@ -191,7 +192,7 @@ storage: t.Errorf("Expected redis Storage host error. Got: %s", err.Error()) } - configBuf = baseBuf + configBuf = bytes.NewBuffer(baseBuf.Bytes()) configBuf.WriteString(` storage: type: redis @@ -199,6 +200,30 @@ storage: `) _, err = LoadAndValidateYaml(configBuf.Bytes()) if err == nil || !strings.Contains(err.Error(), "port") { - t.Errorf("Expected redis Storage host error. Got: %s", err.Error()) + t.Errorf("Expected redis Storage post error. Got: %s", err.Error()) + } + + // invalid dynamodb configs (requires table and region) + configBuf = bytes.NewBuffer(baseBuf.Bytes()) + configBuf.WriteString(` +storage: + type: dynamodb + region: bar +`) + _, err = LoadAndValidateYaml(configBuf.Bytes()) + if err == nil || !strings.Contains(err.Error(), "table") { + t.Errorf("Expected dynamodb Storage table error. Got: %s", err.Error()) + } + + configBuf = bytes.NewBuffer(baseBuf.Bytes()) + configBuf.WriteString(` +storage: + type: dynamodb + table: foo +`) + _, err = LoadAndValidateYaml(configBuf.Bytes()) + if err == nil || !strings.Contains(err.Error(), "region") { + t.Errorf("Expected dynamodb Storage region error. Got: %s", err.Error()) } + } From fd19e88020b64f8369513fc9755b8fbc8622d9e5 Mon Sep 17 00:00:00 2001 From: Sayan Samanta Date: Wed, 25 Mar 2020 13:25:50 -0700 Subject: [PATCH 5/8] update docs to include dynamo config --- README.md | 6 +++++- deb/sphinx/etc/sphinx/sphinx.yaml | 8 +++++--- example.yaml | 8 +++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index fd3fdf3..d0d61d2 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,11 @@ proxy: listen: :6634 # bind to host:port. default: height of the Great Sphinx of Giza storage: - type: memory # can be {redis,memory} + type: redis # must be one of {redis, dynamodb, memory} + host: localhost # redis hostname. required for redis + port: 6379 # redis port. required for redis + table: table # table name. required for dynamodb + region: us-west-1 # table region. required for dynamodb limits: test-limit: diff --git a/deb/sphinx/etc/sphinx/sphinx.yaml b/deb/sphinx/etc/sphinx/sphinx.yaml index 7b09278..9046ca9 100644 --- a/deb/sphinx/etc/sphinx/sphinx.yaml +++ b/deb/sphinx/etc/sphinx/sphinx.yaml @@ -5,9 +5,11 @@ proxy: listen: :6634 # height of the Great Sphinx of Giza storage: - type: redis # can be {redis, memory} - host: localhost # not required for memory - port: 6379 # not required for memory + type: redis # must be one of {redis, dynamodb, memory} + host: localhost # redis hostname. required for redis + port: 6379 # redis port. required for redis + table: table # table name. required for dynamodb + region: us-west-1 # table region. required for dynamodb limits: sample-limit: diff --git a/example.yaml b/example.yaml index 98b5f80..8b9bdc6 100644 --- a/example.yaml +++ b/example.yaml @@ -6,9 +6,11 @@ proxy: allow-on-error: Yes # become passive proxy if error detected? (optional, default=No) storage: - type: memory # can be {redis,memory} - host: localhost # redis hostname. not required for memory - port: 6379 # redis port. not required for memory + type: memory # must be one of {redis, dynamodb, memory} + host: localhost # redis hostname. required for redis + port: 6379 # redis port. required for redis + table: table # table name. required for dynamodb + region: us-west-1 # table region. required for dynamodb health-check: enabled: true From d2a4f7db4967a1baa67a5776ad6c0937f90b1aff Mon Sep 17 00:00:00 2001 From: Sayan Samanta Date: Wed, 25 Mar 2020 13:26:10 -0700 Subject: [PATCH 6/8] 0.7.1 - add dynamo --- CHANGES.md | 2 ++ deb/sphinx/DEBIAN/control | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 79735c0..b63b35f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,5 @@ +# v0.7.1: Add AWS DynamoDB as a backend + # v0.7.0: Add global limit key - Allows global rate limiting irrespective of request content diff --git a/deb/sphinx/DEBIAN/control b/deb/sphinx/DEBIAN/control index 22fae59..54c7bb5 100644 --- a/deb/sphinx/DEBIAN/control +++ b/deb/sphinx/DEBIAN/control @@ -1,5 +1,5 @@ Package: sphinx -Version: 0.7.0 +Version: 0.7.1 Section: base Priority: optional Architecture: amd64 From f259947922f9d02b0d6a5d4afff75f1a19c90653 Mon Sep 17 00:00:00 2001 From: Sayan Samanta Date: Tue, 31 Mar 2020 12:20:40 -0700 Subject: [PATCH 7/8] modern goreturns --- handlers/http_test.go | 11 ++++++----- limitkeys/headerlimitkey.go | 3 ++- limitkeys/headerlimitkey_test.go | 3 ++- limitkeys/limitkey.go | 1 + matchers/headermatcher.go | 3 ++- matchers/matchers.go | 1 + matchers/pathmatcher.go | 3 ++- ratelimiter/ratelimiter_test.go | 7 ++++--- 8 files changed, 20 insertions(+), 12 deletions(-) diff --git a/handlers/http_test.go b/handlers/http_test.go index 042e264..604b28c 100644 --- a/handlers/http_test.go +++ b/handlers/http_test.go @@ -3,17 +3,18 @@ package handlers import ( "errors" "fmt" - "github.com/Clever/leakybucket" - "github.com/Clever/sphinx/common" - "github.com/Clever/sphinx/limit" - "github.com/Clever/sphinx/ratelimiter" - "github.com/stretchr/testify/mock" "net/http" "net/http/httptest" "net/url" "strings" "testing" "time" + + "github.com/Clever/leakybucket" + "github.com/Clever/sphinx/common" + "github.com/Clever/sphinx/limit" + "github.com/Clever/sphinx/ratelimiter" + "github.com/stretchr/testify/mock" ) func constructMockRequestWithHeaders(headers map[string][]string) *http.Request { diff --git a/limitkeys/headerlimitkey.go b/limitkeys/headerlimitkey.go index e49275c..0c358ff 100644 --- a/limitkeys/headerlimitkey.go +++ b/limitkeys/headerlimitkey.go @@ -2,10 +2,11 @@ package limitkeys import ( "fmt" - "github.com/Clever/sphinx/common" "net/http" "sort" "strings" + + "github.com/Clever/sphinx/common" ) type headerLimitKey struct { diff --git a/limitkeys/headerlimitkey_test.go b/limitkeys/headerlimitkey_test.go index 20e0fe9..8a95dc1 100644 --- a/limitkeys/headerlimitkey_test.go +++ b/limitkeys/headerlimitkey_test.go @@ -1,8 +1,9 @@ package limitkeys import ( - "github.com/Clever/sphinx/common" "testing" + + "github.com/Clever/sphinx/common" ) func getRequest(headers map[string][]string) common.Request { diff --git a/limitkeys/limitkey.go b/limitkeys/limitkey.go index 27fc76c..89beb7f 100644 --- a/limitkeys/limitkey.go +++ b/limitkeys/limitkey.go @@ -2,6 +2,7 @@ package limitkeys import ( "fmt" + "github.com/Clever/sphinx/common" ) diff --git a/matchers/headermatcher.go b/matchers/headermatcher.go index b88d1cd..d8a3228 100644 --- a/matchers/headermatcher.go +++ b/matchers/headermatcher.go @@ -1,9 +1,10 @@ package matchers import ( - "github.com/Clever/sphinx/common" "net/http" "regexp" + + "github.com/Clever/sphinx/common" ) // type to deserialize configuration diff --git a/matchers/matchers.go b/matchers/matchers.go index a39f9a0..e59ae50 100644 --- a/matchers/matchers.go +++ b/matchers/matchers.go @@ -2,6 +2,7 @@ package matchers import ( "fmt" + "github.com/Clever/sphinx/common" ) diff --git a/matchers/pathmatcher.go b/matchers/pathmatcher.go index 2150bfd..4ebf117 100644 --- a/matchers/pathmatcher.go +++ b/matchers/pathmatcher.go @@ -1,8 +1,9 @@ package matchers import ( - "github.com/Clever/sphinx/common" "regexp" + + "github.com/Clever/sphinx/common" ) type pathMatcherConfig struct { diff --git a/ratelimiter/ratelimiter_test.go b/ratelimiter/ratelimiter_test.go index 4a10630..f677372 100644 --- a/ratelimiter/ratelimiter_test.go +++ b/ratelimiter/ratelimiter_test.go @@ -2,13 +2,14 @@ package ratelimiter import ( "fmt" + "net/http" + "testing" + "time" + "github.com/Clever/leakybucket" "github.com/Clever/sphinx/common" "github.com/Clever/sphinx/config" "github.com/Clever/sphinx/limit" - "net/http" - "testing" - "time" ) func returnLastAddStatus(rateLimiter RateLimiter, request common.Request, numAdds int) ([]Status, error) { From afde6c229210ba6419829bc0b4e69324b7c00626 Mon Sep 17 00:00:00 2001 From: Sayan Samanta Date: Tue, 31 Mar 2020 14:41:02 -0700 Subject: [PATCH 8/8] include dynamodb in error message --- ratelimiter/ratelimiter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ratelimiter/ratelimiter.go b/ratelimiter/ratelimiter.go index b91c294..8797a47 100644 --- a/ratelimiter/ratelimiter.go +++ b/ratelimiter/ratelimiter.go @@ -41,7 +41,7 @@ func resolveBucketStore(config map[string]string) (leakybucket.Storage, error) { switch config["type"] { default: - return nil, errors.New("must specify one of 'redis' or 'memory' storage") + return nil, errors.New("must specify one of 'redis', 'dynamodb', or 'memory' storage") case "memory": return leakybucketMemory.New(), nil case "redis":