├── .gitignore ├── README.md ├── handler.py ├── package-lock.json ├── package.json ├── requirements.txt └── serverless.yml /.gitignore: -------------------------------------------------------------------------------- 1 | # Distribution / packaging 2 | .Python 3 | env/ 4 | build/ 5 | develop-eggs/ 6 | dist/ 7 | downloads/ 8 | eggs/ 9 | .eggs/ 10 | lib/ 11 | lib64/ 12 | parts/ 13 | sdist/ 14 | var/ 15 | *.egg-info/ 16 | .installed.cfg 17 | *.egg 18 | 19 | # Serverless directories 20 | .serverless 21 | 22 | node_modules/ 23 | .idea/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AWS Lambda Septime 2 | 3 | See blog at: https://medium.com/@stephane.maarek/how-i-used-aws-lambda-to-hack-my-way-into-eating-at-septime-41c7dcd8f861 4 | 5 | # Running 6 | 7 | Install serverless 8 | ```bash 9 | npm install -g serverless 10 | ``` 11 | 12 | Get an [API key](https://docs.pushbullet.com/) for Pushbullet and upload your Pushbullet API key in SSM Parameter Store as a Secure String at: 13 | ```bash 14 | /septime/pushbullet_api_key 15 | ``` 16 | 17 | Configure your AWS credentials 18 | ```bash 19 | aws configure --profile name-your-profile 20 | ``` 21 | 22 | Edit [serverless.yml](serverless.yml) with your AWS profile `name-your-profile` instead of the existing one 23 | 24 | Deploy the function 25 | ```bash 26 | sls deploy -v 27 | ``` 28 | 29 | **Eat good food** 30 | 31 | # Links / Resources 32 | 33 | - [Serverless website](https://serverless.com) 34 | - [Serverless python plugin](https://github.com/UnitedIncome/serverless-python-requirements) 35 | - [Udemy AWS Lambda & Serverless Framework Course](https://www.udemy.com/aws-lambda-serverless/?couponCode=GITHUB10) 36 | - [Udemy AWS Certified Developer Course](https://www.udemy.com/aws-certified-developer-associate-dva-c01/?couponCode=GITHUB10) 37 | -------------------------------------------------------------------------------- /handler.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | import requests 5 | from pushbullet import Pushbullet 6 | 7 | # contains a cache of the previous results 8 | previous_result = {} 9 | 10 | def septime(event, context): 11 | global previous_result 12 | result = do() 13 | # only notify when the results have changed 14 | if result != previous_result: 15 | previous_result = result 16 | if result["resas"]: 17 | print("Sending notification to pushbullet") 18 | send_to_pushbullet(json.dumps(result), os.environ.get("PUSHBULLET_API_KEY")) 19 | else: 20 | print("no available resa") 21 | 22 | 23 | def do(): 24 | main_url = "https://module.lafourchette.com/en_GB/resa/pick-pax/10889-d34ca/54499" 25 | print(main_url) 26 | nb_people_list = requests.get(url=main_url).json()["availableNbPeopleList"] 27 | options_pax = [2] 28 | available_nb_people = list(filter(lambda x: x.get("has_wait_list", 0) != 1 and x.get("nb_people", 0) in options_pax, nb_people_list)) 29 | print(f"List of groups that have availabilities {available_nb_people}") 30 | 31 | results = [] 32 | for pax in options_pax: 33 | resas = find_resa(pax) 34 | if resas: 35 | results.append({ 36 | "pax": pax, 37 | "results": resas 38 | }) 39 | 40 | return { 41 | # "list_available_people": available_nb_people, 42 | "resas": results 43 | } 44 | 45 | 46 | def find_resa(pax): 47 | results = {} 48 | pick_date_url = f"https://module.lafourchette.com/en_GB/resa/pick-date/{pax}/10889-d34ca/54499" 49 | print(pick_date_url) 50 | pick_dates = requests.get(url=pick_date_url).json().get("availableDateList", []) 51 | print(f"Search for a party of {pax} people") 52 | dates = list(filter(lambda x: x != "", map(lambda x: x.get("date", ""), pick_dates))) 53 | print(f"Found dates: {dates}") 54 | for date in dates: 55 | print(f"Requesting for {date}...") 56 | query_date_url = f"https://module.lafourchette.com/en_GB/resa/pick-time/{pax}/{date}/10889-d34ca/54499" 57 | print(query_date_url) 58 | query_date = requests.get(url=query_date_url).json().get("availableTimeslotList", []) 59 | for slot in query_date: 60 | if slot.get("name", "") != "BREAKFAST": 61 | for timeslot in slot.get("timeslots", []): 62 | time = timeslot.get("time", "N/A") 63 | print(time) 64 | if timeslot.get("sale_type_list", {}).get("hasWaitList", 0) != 1: 65 | if (results.get(date, [])): 66 | results[date].append(f"{time}") 67 | else: 68 | results[date] = [time] 69 | 70 | return results 71 | 72 | 73 | def send_to_pushbullet(text, pushbullet_api_key): 74 | print(text) 75 | pb = Pushbullet(pushbullet_api_key) 76 | push = pb.push_note("Septime Booking!", text) 77 | 78 | 79 | # to run locally 80 | if __name__ == "__main__": 81 | septime(None, None) 82 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "septime-resa", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "appdirectory": { 8 | "version": "0.1.0", 9 | "resolved": "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz", 10 | "integrity": "sha1-62yBYyDnsqsW9e2ZfyjYIF31Y3U=", 11 | "dev": true 12 | }, 13 | "array-filter": { 14 | "version": "0.0.1", 15 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 16 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", 17 | "dev": true 18 | }, 19 | "array-map": { 20 | "version": "0.0.0", 21 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 22 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", 23 | "dev": true 24 | }, 25 | "array-reduce": { 26 | "version": "0.0.0", 27 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 28 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", 29 | "dev": true 30 | }, 31 | "balanced-match": { 32 | "version": "1.0.0", 33 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 34 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 35 | "dev": true 36 | }, 37 | "bluebird": { 38 | "version": "3.5.3", 39 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", 40 | "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", 41 | "dev": true 42 | }, 43 | "brace-expansion": { 44 | "version": "1.1.11", 45 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 46 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 47 | "dev": true, 48 | "requires": { 49 | "balanced-match": "^1.0.0", 50 | "concat-map": "0.0.1" 51 | } 52 | }, 53 | "concat-map": { 54 | "version": "0.0.1", 55 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 56 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 57 | "dev": true 58 | }, 59 | "core-js": { 60 | "version": "2.3.0", 61 | "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", 62 | "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", 63 | "dev": true 64 | }, 65 | "core-util-is": { 66 | "version": "1.0.2", 67 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 68 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 69 | "dev": true 70 | }, 71 | "es6-promise": { 72 | "version": "3.0.2", 73 | "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", 74 | "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", 75 | "dev": true 76 | }, 77 | "fs-extra": { 78 | "version": "7.0.1", 79 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", 80 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", 81 | "dev": true, 82 | "requires": { 83 | "graceful-fs": "^4.1.2", 84 | "jsonfile": "^4.0.0", 85 | "universalify": "^0.1.0" 86 | } 87 | }, 88 | "fs.realpath": { 89 | "version": "1.0.0", 90 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 91 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 92 | "dev": true 93 | }, 94 | "glob": { 95 | "version": "7.1.3", 96 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 97 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 98 | "dev": true, 99 | "requires": { 100 | "fs.realpath": "^1.0.0", 101 | "inflight": "^1.0.4", 102 | "inherits": "2", 103 | "minimatch": "^3.0.4", 104 | "once": "^1.3.0", 105 | "path-is-absolute": "^1.0.0" 106 | } 107 | }, 108 | "glob-all": { 109 | "version": "3.1.0", 110 | "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", 111 | "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", 112 | "dev": true, 113 | "requires": { 114 | "glob": "^7.0.5", 115 | "yargs": "~1.2.6" 116 | } 117 | }, 118 | "graceful-fs": { 119 | "version": "4.1.15", 120 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 121 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 122 | "dev": true 123 | }, 124 | "immediate": { 125 | "version": "3.0.6", 126 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 127 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", 128 | "dev": true 129 | }, 130 | "inflight": { 131 | "version": "1.0.6", 132 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 133 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 134 | "dev": true, 135 | "requires": { 136 | "once": "^1.3.0", 137 | "wrappy": "1" 138 | } 139 | }, 140 | "inherits": { 141 | "version": "2.0.3", 142 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 143 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 144 | "dev": true 145 | }, 146 | "is-wsl": { 147 | "version": "1.1.0", 148 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 149 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", 150 | "dev": true 151 | }, 152 | "isarray": { 153 | "version": "1.0.0", 154 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 155 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 156 | "dev": true 157 | }, 158 | "jsonfile": { 159 | "version": "4.0.0", 160 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 161 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 162 | "dev": true, 163 | "requires": { 164 | "graceful-fs": "^4.1.6" 165 | } 166 | }, 167 | "jsonify": { 168 | "version": "0.0.0", 169 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 170 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 171 | "dev": true 172 | }, 173 | "jszip": { 174 | "version": "3.1.5", 175 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", 176 | "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", 177 | "dev": true, 178 | "requires": { 179 | "core-js": "~2.3.0", 180 | "es6-promise": "~3.0.2", 181 | "lie": "~3.1.0", 182 | "pako": "~1.0.2", 183 | "readable-stream": "~2.0.6" 184 | } 185 | }, 186 | "lie": { 187 | "version": "3.1.1", 188 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", 189 | "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", 190 | "dev": true, 191 | "requires": { 192 | "immediate": "~3.0.5" 193 | } 194 | }, 195 | "lodash.get": { 196 | "version": "4.4.2", 197 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 198 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", 199 | "dev": true 200 | }, 201 | "lodash.set": { 202 | "version": "4.3.2", 203 | "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", 204 | "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", 205 | "dev": true 206 | }, 207 | "lodash.uniqby": { 208 | "version": "4.7.0", 209 | "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", 210 | "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", 211 | "dev": true 212 | }, 213 | "lodash.values": { 214 | "version": "4.3.0", 215 | "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", 216 | "integrity": "sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=", 217 | "dev": true 218 | }, 219 | "md5-file": { 220 | "version": "4.0.0", 221 | "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-4.0.0.tgz", 222 | "integrity": "sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg==", 223 | "dev": true 224 | }, 225 | "minimatch": { 226 | "version": "3.0.4", 227 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 228 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 229 | "dev": true, 230 | "requires": { 231 | "brace-expansion": "^1.1.7" 232 | } 233 | }, 234 | "minimist": { 235 | "version": "0.1.0", 236 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", 237 | "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", 238 | "dev": true 239 | }, 240 | "once": { 241 | "version": "1.4.0", 242 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 243 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 244 | "dev": true, 245 | "requires": { 246 | "wrappy": "1" 247 | } 248 | }, 249 | "pako": { 250 | "version": "1.0.7", 251 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", 252 | "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", 253 | "dev": true 254 | }, 255 | "path-is-absolute": { 256 | "version": "1.0.1", 257 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 258 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 259 | "dev": true 260 | }, 261 | "process-nextick-args": { 262 | "version": "1.0.7", 263 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 264 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 265 | "dev": true 266 | }, 267 | "readable-stream": { 268 | "version": "2.0.6", 269 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 270 | "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 271 | "dev": true, 272 | "requires": { 273 | "core-util-is": "~1.0.0", 274 | "inherits": "~2.0.1", 275 | "isarray": "~1.0.0", 276 | "process-nextick-args": "~1.0.6", 277 | "string_decoder": "~0.10.x", 278 | "util-deprecate": "~1.0.1" 279 | } 280 | }, 281 | "rimraf": { 282 | "version": "2.6.2", 283 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 284 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 285 | "dev": true, 286 | "requires": { 287 | "glob": "^7.0.5" 288 | } 289 | }, 290 | "serverless-python-requirements": { 291 | "version": "4.2.5", 292 | "resolved": "https://registry.npmjs.org/serverless-python-requirements/-/serverless-python-requirements-4.2.5.tgz", 293 | "integrity": "sha512-dmdgrSLWgJv2g/LIfFdBIkJFn2duNFRZc7De94AHf2ylZS7s+gKJ8Ga090YdaigWLhH65tMA50Ub06SUk0p6EQ==", 294 | "dev": true, 295 | "requires": { 296 | "appdirectory": "^0.1.0", 297 | "bluebird": "^3.0.6", 298 | "fs-extra": "^7.0.0", 299 | "glob-all": "^3.1.0", 300 | "is-wsl": "^1.1.0", 301 | "jszip": "^3.1.0", 302 | "lodash.get": "^4.4.2", 303 | "lodash.set": "^4.3.2", 304 | "lodash.uniqby": "^4.0.0", 305 | "lodash.values": "^4.3.0", 306 | "md5-file": "^4.0.0", 307 | "rimraf": "^2.6.2", 308 | "shell-quote": "^1.6.1" 309 | } 310 | }, 311 | "shell-quote": { 312 | "version": "1.6.1", 313 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 314 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 315 | "dev": true, 316 | "requires": { 317 | "array-filter": "~0.0.0", 318 | "array-map": "~0.0.0", 319 | "array-reduce": "~0.0.0", 320 | "jsonify": "~0.0.0" 321 | } 322 | }, 323 | "sls": { 324 | "version": "0.1.0", 325 | "resolved": "https://registry.npmjs.org/sls/-/sls-0.1.0.tgz", 326 | "integrity": "sha1-TXKmqNjEo9njqXn1NpMMEgTPHRE=" 327 | }, 328 | "string_decoder": { 329 | "version": "0.10.31", 330 | "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 331 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 332 | "dev": true 333 | }, 334 | "universalify": { 335 | "version": "0.1.2", 336 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 337 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 338 | "dev": true 339 | }, 340 | "util-deprecate": { 341 | "version": "1.0.2", 342 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 343 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 344 | "dev": true 345 | }, 346 | "wrappy": { 347 | "version": "1.0.2", 348 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 349 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 350 | "dev": true 351 | }, 352 | "yargs": { 353 | "version": "1.2.6", 354 | "resolved": "http://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", 355 | "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", 356 | "dev": true, 357 | "requires": { 358 | "minimist": "^0.1.0" 359 | } 360 | } 361 | } 362 | } 363 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "septime-resa", 3 | "description": "", 4 | "version": "0.1.0", 5 | "dependencies": { 6 | "sls": "^0.1.0" 7 | }, 8 | "devDependencies": { 9 | "serverless-python-requirements": "^4.2.5" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | pushbullet.py -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | # Welcome to Serverless! 2 | # 3 | # This file is the main config file for your service. 4 | # It's very minimal at this point and uses default values. 5 | # You can always add more config options for more control. 6 | # We've included some commented out config examples here. 7 | # Just uncomment any of them to get that config option. 8 | # 9 | # For full config options, check the docs: 10 | # docs.serverless.com 11 | # 12 | # Happy Coding! 13 | 14 | service: septime-resa 15 | 16 | # You can pin your service to only deploy with a specific Serverless version 17 | # Check out our docs for more details 18 | # frameworkVersion: "=X.X.X" 19 | 20 | provider: 21 | name: aws 22 | runtime: python3.6 23 | region: eu-west-3 24 | profile: stephane-perso # probably edit out the profile to your matching AWS profile 25 | 26 | functions: 27 | septime: 28 | handler: handler.septime 29 | timeout: 20 30 | memorySize: 128 31 | events: 32 | - schedule: rate(2 minutes) 33 | environment: 34 | PUSHBULLET_API_KEY: ${ssm:/septime/pushbullet_api_key~true} 35 | 36 | plugins: 37 | - serverless-python-requirements 38 | --------------------------------------------------------------------------------