├── .github └── workflows │ └── main.yml ├── .gitignore ├── README.md ├── lambda.py ├── package-lock.json ├── package.json ├── requirements.txt └── serverless.yml /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Python Lambda 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | deploy: 10 | name: deploy 11 | runs-on: ubuntu-latest 12 | env: 13 | NODE_VERSION: 14.x # used for installing the serverless-python-requirements dependency from NPM 14 | strategy: 15 | matrix: 16 | python-version: 17 | - 3.8 # with a build matrix, you can specify a list of python versions to deploy with 18 | steps: 19 | # --------- use Python to install Python dependencies and run linter, tests, etc. --------- 20 | - uses: actions/checkout@v2 21 | - name: Set up Python ${{ matrix.python-version }} 22 | uses: actions/setup-python@v2 23 | with: 24 | python-version: ${{ matrix.python-version }} 25 | 26 | - name: Cache pip 27 | uses: actions/cache@v2 28 | with: 29 | # This path is specific to Ubuntu 30 | path: ~/.cache/pip 31 | # Look to see if there is a cache hit for the corresponding requirements file 32 | key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} 33 | restore-keys: | 34 | ${{ runner.os }}-pip- 35 | ${{ runner.os }}- 36 | - name: Install dependencies 37 | run: | 38 | python -m pip install --upgrade pip 39 | pip install flake8 pytest 40 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi 41 | - name: Lint with flake8 42 | run: | 43 | # stop the build if there are Python syntax errors or undefined names 44 | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics 45 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide 46 | flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics 47 | 48 | # --------- Use Node and NPM to install serverless-python-requirements --------- 49 | - name: Use Node.js ${{ env.NODE_VERSION }} 50 | uses: actions/setup-node@v1 51 | with: 52 | node-version: ${{ env.NODE_VERSION }} 53 | 54 | - name: Cache node modules 55 | uses: actions/cache@v2 56 | env: 57 | cache-name: cache-node-modules 58 | with: 59 | # npm cache files are stored in `~/.npm` on Linux/macOS 60 | path: ~/.npm 61 | key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} 62 | restore-keys: | 63 | ${{ runner.os }}-build-${{ env.cache-name }}- 64 | ${{ runner.os }}-build- 65 | ${{ runner.os }}- 66 | - name: Install Node dependencies (specifically, serverless-python-requirements) 67 | run: npm install 68 | 69 | - name: Serverless Deploy 70 | uses: dhollerbach/github-action-serverless-with-python-requirements@master 71 | env: 72 | # SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }} 73 | # or if using AWS credentials directly 74 | AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} 75 | AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 76 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | venv/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Deploy an AWS Lambda Function in Python using the Serverless Framework and GitHub Actions (CI/CD) 2 | 3 | ### Full Video Tutorial 4 | * Check out the YouTube tutorial [here](https://youtu.be/KorJPUKvHKc)! -------------------------------------------------------------------------------- /lambda.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def handler(event, context): 4 | response = requests.get("https://jsonplaceholder.typicode.com/todos/1") 5 | res = { 6 | "event": event, 7 | "output": response.json(), 8 | "context": context 9 | } 10 | print(res) 11 | 12 | return None 13 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "basic-serverless-lambda-python", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@iarna/toml": { 8 | "version": "2.2.5", 9 | "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", 10 | "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", 11 | "dev": true 12 | }, 13 | "ansi-regex": { 14 | "version": "5.0.0", 15 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 16 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 17 | "dev": true 18 | }, 19 | "ansi-styles": { 20 | "version": "4.3.0", 21 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 22 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 23 | "dev": true, 24 | "requires": { 25 | "color-convert": "^2.0.1" 26 | } 27 | }, 28 | "appdirectory": { 29 | "version": "0.1.0", 30 | "resolved": "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz", 31 | "integrity": "sha1-62yBYyDnsqsW9e2ZfyjYIF31Y3U=", 32 | "dev": true 33 | }, 34 | "at-least-node": { 35 | "version": "1.0.0", 36 | "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", 37 | "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", 38 | "dev": true 39 | }, 40 | "balanced-match": { 41 | "version": "1.0.2", 42 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 43 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 44 | "dev": true 45 | }, 46 | "bluebird": { 47 | "version": "3.7.2", 48 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 49 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 50 | "dev": true 51 | }, 52 | "brace-expansion": { 53 | "version": "1.1.11", 54 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 55 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 56 | "dev": true, 57 | "requires": { 58 | "balanced-match": "^1.0.0", 59 | "concat-map": "0.0.1" 60 | } 61 | }, 62 | "camelcase": { 63 | "version": "5.3.1", 64 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 65 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 66 | "dev": true 67 | }, 68 | "cliui": { 69 | "version": "6.0.0", 70 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 71 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 72 | "dev": true, 73 | "requires": { 74 | "string-width": "^4.2.0", 75 | "strip-ansi": "^6.0.0", 76 | "wrap-ansi": "^6.2.0" 77 | } 78 | }, 79 | "color-convert": { 80 | "version": "2.0.1", 81 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 82 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 83 | "dev": true, 84 | "requires": { 85 | "color-name": "~1.1.4" 86 | } 87 | }, 88 | "color-name": { 89 | "version": "1.1.4", 90 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 91 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 92 | "dev": true 93 | }, 94 | "concat-map": { 95 | "version": "0.0.1", 96 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 97 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 98 | "dev": true 99 | }, 100 | "core-util-is": { 101 | "version": "1.0.2", 102 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 103 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 104 | "dev": true 105 | }, 106 | "decamelize": { 107 | "version": "1.2.0", 108 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 109 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 110 | "dev": true 111 | }, 112 | "emoji-regex": { 113 | "version": "8.0.0", 114 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 115 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 116 | "dev": true 117 | }, 118 | "find-up": { 119 | "version": "4.1.0", 120 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 121 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 122 | "dev": true, 123 | "requires": { 124 | "locate-path": "^5.0.0", 125 | "path-exists": "^4.0.0" 126 | } 127 | }, 128 | "fs-extra": { 129 | "version": "9.1.0", 130 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", 131 | "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", 132 | "dev": true, 133 | "requires": { 134 | "at-least-node": "^1.0.0", 135 | "graceful-fs": "^4.2.0", 136 | "jsonfile": "^6.0.1", 137 | "universalify": "^2.0.0" 138 | } 139 | }, 140 | "fs.realpath": { 141 | "version": "1.0.0", 142 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 143 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 144 | "dev": true 145 | }, 146 | "get-caller-file": { 147 | "version": "2.0.5", 148 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 149 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 150 | "dev": true 151 | }, 152 | "glob": { 153 | "version": "7.1.6", 154 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 155 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 156 | "dev": true, 157 | "requires": { 158 | "fs.realpath": "^1.0.0", 159 | "inflight": "^1.0.4", 160 | "inherits": "2", 161 | "minimatch": "^3.0.4", 162 | "once": "^1.3.0", 163 | "path-is-absolute": "^1.0.0" 164 | } 165 | }, 166 | "glob-all": { 167 | "version": "3.2.1", 168 | "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.2.1.tgz", 169 | "integrity": "sha512-x877rVkzB3ipid577QOp+eQCR6M5ZyiwrtaYgrX/z3EThaSPFtLDwBXFHc3sH1cG0R0vFYI5SRYeWMMSEyXkUw==", 170 | "dev": true, 171 | "requires": { 172 | "glob": "^7.1.2", 173 | "yargs": "^15.3.1" 174 | } 175 | }, 176 | "graceful-fs": { 177 | "version": "4.2.6", 178 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 179 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 180 | "dev": true 181 | }, 182 | "immediate": { 183 | "version": "3.0.6", 184 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 185 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", 186 | "dev": true 187 | }, 188 | "inflight": { 189 | "version": "1.0.6", 190 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 191 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 192 | "dev": true, 193 | "requires": { 194 | "once": "^1.3.0", 195 | "wrappy": "1" 196 | } 197 | }, 198 | "inherits": { 199 | "version": "2.0.4", 200 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 201 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 202 | "dev": true 203 | }, 204 | "is-docker": { 205 | "version": "2.2.1", 206 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 207 | "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", 208 | "dev": true 209 | }, 210 | "is-fullwidth-code-point": { 211 | "version": "3.0.0", 212 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 213 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 214 | "dev": true 215 | }, 216 | "is-wsl": { 217 | "version": "2.2.0", 218 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 219 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 220 | "dev": true, 221 | "requires": { 222 | "is-docker": "^2.0.0" 223 | } 224 | }, 225 | "isarray": { 226 | "version": "1.0.0", 227 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 228 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 229 | "dev": true 230 | }, 231 | "jsonfile": { 232 | "version": "6.1.0", 233 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 234 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 235 | "dev": true, 236 | "requires": { 237 | "graceful-fs": "^4.1.6", 238 | "universalify": "^2.0.0" 239 | } 240 | }, 241 | "jszip": { 242 | "version": "3.6.0", 243 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", 244 | "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", 245 | "dev": true, 246 | "requires": { 247 | "lie": "~3.3.0", 248 | "pako": "~1.0.2", 249 | "readable-stream": "~2.3.6", 250 | "set-immediate-shim": "~1.0.1" 251 | } 252 | }, 253 | "lie": { 254 | "version": "3.3.0", 255 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 256 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 257 | "dev": true, 258 | "requires": { 259 | "immediate": "~3.0.5" 260 | } 261 | }, 262 | "locate-path": { 263 | "version": "5.0.0", 264 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 265 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 266 | "dev": true, 267 | "requires": { 268 | "p-locate": "^4.1.0" 269 | } 270 | }, 271 | "lodash.get": { 272 | "version": "4.4.2", 273 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 274 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", 275 | "dev": true 276 | }, 277 | "lodash.set": { 278 | "version": "4.3.2", 279 | "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", 280 | "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", 281 | "dev": true 282 | }, 283 | "lodash.uniqby": { 284 | "version": "4.7.0", 285 | "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", 286 | "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", 287 | "dev": true 288 | }, 289 | "lodash.values": { 290 | "version": "4.3.0", 291 | "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", 292 | "integrity": "sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=", 293 | "dev": true 294 | }, 295 | "minimatch": { 296 | "version": "3.0.4", 297 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 298 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 299 | "dev": true, 300 | "requires": { 301 | "brace-expansion": "^1.1.7" 302 | } 303 | }, 304 | "once": { 305 | "version": "1.4.0", 306 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 307 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 308 | "dev": true, 309 | "requires": { 310 | "wrappy": "1" 311 | } 312 | }, 313 | "p-limit": { 314 | "version": "2.3.0", 315 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 316 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 317 | "dev": true, 318 | "requires": { 319 | "p-try": "^2.0.0" 320 | } 321 | }, 322 | "p-locate": { 323 | "version": "4.1.0", 324 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 325 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 326 | "dev": true, 327 | "requires": { 328 | "p-limit": "^2.2.0" 329 | } 330 | }, 331 | "p-try": { 332 | "version": "2.2.0", 333 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 334 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 335 | "dev": true 336 | }, 337 | "pako": { 338 | "version": "1.0.11", 339 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 340 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 341 | "dev": true 342 | }, 343 | "path-exists": { 344 | "version": "4.0.0", 345 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 346 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 347 | "dev": true 348 | }, 349 | "path-is-absolute": { 350 | "version": "1.0.1", 351 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 352 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 353 | "dev": true 354 | }, 355 | "process-nextick-args": { 356 | "version": "2.0.1", 357 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 358 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 359 | "dev": true 360 | }, 361 | "readable-stream": { 362 | "version": "2.3.7", 363 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 364 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 365 | "dev": true, 366 | "requires": { 367 | "core-util-is": "~1.0.0", 368 | "inherits": "~2.0.3", 369 | "isarray": "~1.0.0", 370 | "process-nextick-args": "~2.0.0", 371 | "safe-buffer": "~5.1.1", 372 | "string_decoder": "~1.1.1", 373 | "util-deprecate": "~1.0.1" 374 | } 375 | }, 376 | "require-directory": { 377 | "version": "2.1.1", 378 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 379 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 380 | "dev": true 381 | }, 382 | "require-main-filename": { 383 | "version": "2.0.0", 384 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 385 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 386 | "dev": true 387 | }, 388 | "rimraf": { 389 | "version": "3.0.2", 390 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 391 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 392 | "dev": true, 393 | "requires": { 394 | "glob": "^7.1.3" 395 | } 396 | }, 397 | "safe-buffer": { 398 | "version": "5.1.2", 399 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 400 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 401 | "dev": true 402 | }, 403 | "serverless-python-requirements": { 404 | "version": "5.1.1", 405 | "resolved": "https://registry.npmjs.org/serverless-python-requirements/-/serverless-python-requirements-5.1.1.tgz", 406 | "integrity": "sha512-frqZhQcqf3kLMpkS1U8VUqiRnbDG4C81eQndlZ150gSFkAqCc521LemedtWEWGrBQQoWSTo4LivugLiQU7s/Sg==", 407 | "dev": true, 408 | "requires": { 409 | "@iarna/toml": "^2.2.5", 410 | "appdirectory": "^0.1.0", 411 | "bluebird": "^3.7.2", 412 | "fs-extra": "^9.1.0", 413 | "glob-all": "^3.2.1", 414 | "is-wsl": "^2.2.0", 415 | "jszip": "^3.6.0", 416 | "lodash.get": "^4.4.2", 417 | "lodash.set": "^4.3.2", 418 | "lodash.uniqby": "^4.7.0", 419 | "lodash.values": "^4.3.0", 420 | "rimraf": "^3.0.2", 421 | "sha256-file": "1.0.0", 422 | "shell-quote": "^1.7.2" 423 | } 424 | }, 425 | "set-blocking": { 426 | "version": "2.0.0", 427 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 428 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 429 | "dev": true 430 | }, 431 | "set-immediate-shim": { 432 | "version": "1.0.1", 433 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 434 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", 435 | "dev": true 436 | }, 437 | "sha256-file": { 438 | "version": "1.0.0", 439 | "resolved": "https://registry.npmjs.org/sha256-file/-/sha256-file-1.0.0.tgz", 440 | "integrity": "sha512-nqf+g0veqgQAkDx0U2y2Tn2KWyADuuludZTw9A7J3D+61rKlIIl9V5TS4mfnwKuXZOH9B7fQyjYJ9pKRHIsAyg==", 441 | "dev": true 442 | }, 443 | "shell-quote": { 444 | "version": "1.7.2", 445 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", 446 | "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", 447 | "dev": true 448 | }, 449 | "string-width": { 450 | "version": "4.2.2", 451 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 452 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 453 | "dev": true, 454 | "requires": { 455 | "emoji-regex": "^8.0.0", 456 | "is-fullwidth-code-point": "^3.0.0", 457 | "strip-ansi": "^6.0.0" 458 | } 459 | }, 460 | "string_decoder": { 461 | "version": "1.1.1", 462 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 463 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 464 | "dev": true, 465 | "requires": { 466 | "safe-buffer": "~5.1.0" 467 | } 468 | }, 469 | "strip-ansi": { 470 | "version": "6.0.0", 471 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 472 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 473 | "dev": true, 474 | "requires": { 475 | "ansi-regex": "^5.0.0" 476 | } 477 | }, 478 | "universalify": { 479 | "version": "2.0.0", 480 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 481 | "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 482 | "dev": true 483 | }, 484 | "util-deprecate": { 485 | "version": "1.0.2", 486 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 487 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 488 | "dev": true 489 | }, 490 | "which-module": { 491 | "version": "2.0.0", 492 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 493 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 494 | "dev": true 495 | }, 496 | "wrap-ansi": { 497 | "version": "6.2.0", 498 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 499 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 500 | "dev": true, 501 | "requires": { 502 | "ansi-styles": "^4.0.0", 503 | "string-width": "^4.1.0", 504 | "strip-ansi": "^6.0.0" 505 | } 506 | }, 507 | "wrappy": { 508 | "version": "1.0.2", 509 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 510 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 511 | "dev": true 512 | }, 513 | "y18n": { 514 | "version": "4.0.3", 515 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 516 | "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", 517 | "dev": true 518 | }, 519 | "yargs": { 520 | "version": "15.4.1", 521 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", 522 | "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", 523 | "dev": true, 524 | "requires": { 525 | "cliui": "^6.0.0", 526 | "decamelize": "^1.2.0", 527 | "find-up": "^4.1.0", 528 | "get-caller-file": "^2.0.1", 529 | "require-directory": "^2.1.1", 530 | "require-main-filename": "^2.0.0", 531 | "set-blocking": "^2.0.0", 532 | "string-width": "^4.2.0", 533 | "which-module": "^2.0.0", 534 | "y18n": "^4.0.0", 535 | "yargs-parser": "^18.1.2" 536 | } 537 | }, 538 | "yargs-parser": { 539 | "version": "18.1.3", 540 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 541 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 542 | "dev": true, 543 | "requires": { 544 | "camelcase": "^5.0.0", 545 | "decamelize": "^1.2.0" 546 | } 547 | } 548 | } 549 | } 550 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "basic-serverless-lambda-python", 3 | "version": "1.0.0", 4 | "description": "Basic CI/CD deployment setup for AWS Lambda functions in Python using the Serverless Framework", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "keywords": [], 9 | "author": "Jackson Yuan", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "serverless-python-requirements": "^5.1.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2020.12.5 2 | chardet==4.0.0 3 | idna==2.10 4 | requests==2.25.1 5 | urllib3==1.26.4 6 | -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | service: basic-serverless-lambda-python 2 | 3 | provider: 4 | name: aws 5 | runtime: python3.8 6 | stage: dev 7 | region: us-west-1 8 | 9 | plugins: 10 | - serverless-python-requirements 11 | 12 | package: 13 | individually: true 14 | 15 | functions: 16 | theLambda: 17 | name: test-lambda 18 | handler: lambda.handler 19 | description: test-lambda 20 | timeout: 5 # seconds 21 | memorySize: 128 # mb 22 | package: 23 | patterns: 24 | - "!node_modules/**" 25 | - "!yarn.lock" 26 | - "!package-lock.json" 27 | - "!package.json" 28 | --------------------------------------------------------------------------------