├── .circleci └── config.yml ├── .github └── workflows │ └── push.yml ├── .gitignore ├── .vscode └── settings.json ├── README.md ├── artillery ├── .gitignore ├── db_write_read.yml ├── generator.js ├── package-lock.json ├── package.json ├── reports │ └── .gitkeep └── runtime_baseline.yml ├── aws ├── .env.template ├── .gitignore ├── Makefile ├── README.md ├── aws-csharp2.1 │ ├── Handler.cs │ ├── Makefile │ ├── aws-csharp2.1.csproj │ └── serverless.yml ├── aws-fsharp2.1 │ ├── Handler.fs │ ├── Makefile │ ├── aws-fsharp2.1.fsproj │ └── serverless.yml ├── aws-go1.x │ ├── .gitignore │ ├── Makefile │ ├── main.go │ └── serverless.yml ├── aws-java8 │ ├── .npmignore │ ├── Makefile │ ├── pom.xml │ ├── serverless.yml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── serverless │ │ └── Handler.java ├── aws-nodejs10.x │ ├── .npmignore │ ├── Makefile │ ├── handler.js │ ├── package-lock.json │ ├── package.json │ ├── serverless.yml │ └── users │ │ ├── create.js │ │ ├── list.js │ │ └── read.js ├── aws-nodejs8.10 │ ├── .npmignore │ ├── Makefile │ ├── handler.js │ ├── package-lock.json │ ├── package.json │ ├── serverless.yml │ └── users │ │ ├── create.js │ │ ├── list.js │ │ └── read.js ├── aws-python2.7 │ ├── .npmignore │ ├── Makefile │ ├── handler.py │ └── serverless.yml ├── aws-python3.6 │ ├── .npmignore │ ├── Makefile │ ├── handler.py │ └── serverless.yml ├── aws-python3.7 │ ├── .npmignore │ ├── Makefile │ ├── handler.py │ └── serverless.yml ├── aws-ruby2.5 │ ├── .npmignore │ ├── Makefile │ ├── aws-ruby2.5.json │ ├── aws-ruby2.5.json.html │ ├── handler.rb │ ├── serverless.yml │ └── test │ │ └── handler_test.rb ├── common.mk └── docker-compose.yml ├── azure └── azure-nodejs │ ├── handler.js │ ├── package-lock.json │ ├── package.json │ └── serverless.yml ├── gcp ├── .env.template ├── Makefile ├── docker-compose.yml ├── gcp-go111 │ ├── Makefile │ ├── function.js │ ├── package-lock.json │ ├── package.json │ └── serverless.yml ├── gcp-nodejs10 │ ├── Makefile │ ├── function.js │ ├── package-lock.json │ ├── package.json │ └── serverless.yml ├── gcp-nodejs8 │ ├── Makefile │ ├── index.js │ ├── package-lock.json │ ├── package.json │ └── serverless.yml └── gcp-python37 │ ├── Makefile │ ├── main.py │ ├── package-lock.json │ ├── package.json │ └── serverless.yml ├── shared.mk └── temp └── aws-bash ├── Makefile ├── bootstrap ├── function.sh └── serverless.yml /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | executors: 4 | ubuntu: 5 | machine: 6 | image: ubuntu-1604:201903-01 7 | docker_layer_caching: true 8 | 9 | commands: 10 | build: 11 | parameters: 12 | provider: 13 | type: string 14 | default: "aws" 15 | runtime: 16 | type: string 17 | default: "" 18 | steps: 19 | - checkout 20 | - attach_workspace: 21 | at: ~/project/<< parameters.provider >>/<< parameters.runtime >> 22 | - run: 23 | name: Build and Package 24 | working_directory: ~/project/<< parameters.provider >>/<< parameters.runtime >> 25 | command: make build package 26 | - persist_to_workspace: 27 | root: ~/project/<< parameters.provider >>/<< parameters.runtime >> 28 | paths: 29 | - .serverless 30 | - target 31 | - bin 32 | deployer: 33 | parameters: 34 | provider: 35 | type: string 36 | default: "aws" 37 | runtime: 38 | type: string 39 | default: "" 40 | steps: 41 | - checkout 42 | - attach_workspace: 43 | at: ~/project/<< parameters.provider >>/<< parameters.runtime >> 44 | - deploy: 45 | name: Deploy 46 | command: make deploy 47 | working_directory: ~/project/<< parameters.provider >>/<< parameters.runtime >> 48 | benchmark: 49 | parameters: 50 | provider: 51 | type: string 52 | default: "aws" 53 | runtime: 54 | type: string 55 | default: "" 56 | steps: 57 | - checkout 58 | - run: 59 | name: Performance Benchmark 60 | working_directory: ~/project/<< parameters.provider >>/<< parameters.runtime >> 61 | command: make baseLine 62 | environment: 63 | RATE: 10 64 | - persist_to_workspace: 65 | root: ~/project/artillery 66 | paths: 67 | - reports/*.json 68 | report: 69 | parameters: 70 | provider: 71 | type: string 72 | default: "aws" 73 | steps: 74 | - checkout 75 | - attach_workspace: 76 | at: ~/project/artillery 77 | - run: 78 | name: Performance Report 79 | working_directory: ~/project/<< parameters.provider >> 80 | command: make report 81 | - store_artifacts: 82 | path: ~/project/artillery/reports 83 | 84 | jobs: 85 | build-aws-csharp2-1: 86 | executor: ubuntu 87 | steps: 88 | - build: 89 | provider: aws 90 | runtime: aws-csharp2.1 91 | build-aws-fsharp2-1: 92 | executor: ubuntu 93 | steps: 94 | - build: 95 | provider: aws 96 | runtime: aws-fsharp2.1 97 | build-aws-go1-x: 98 | executor: ubuntu 99 | steps: 100 | - build: 101 | provider: aws 102 | runtime: aws-go1.x 103 | build-aws-java8: 104 | executor: ubuntu 105 | steps: 106 | - build: 107 | provider: aws 108 | runtime: aws-java8 109 | build-aws-nodejs8-10: 110 | executor: ubuntu 111 | steps: 112 | - build: 113 | provider: aws 114 | runtime: aws-nodejs8.10 115 | build-aws-nodejs10-x: 116 | executor: ubuntu 117 | steps: 118 | - build: 119 | provider: aws 120 | runtime: aws-nodejs10.x 121 | build-aws-python2-7: 122 | executor: ubuntu 123 | steps: 124 | - build: 125 | provider: aws 126 | runtime: aws-python2.7 127 | build-aws-python3-6: 128 | executor: ubuntu 129 | steps: 130 | - build: 131 | provider: aws 132 | runtime: aws-python3.6 133 | build-aws-python3-7: 134 | executor: ubuntu 135 | steps: 136 | - build: 137 | provider: aws 138 | runtime: aws-python3.7 139 | build-aws-ruby2-5: 140 | executor: ubuntu 141 | steps: 142 | - build: 143 | provider: aws 144 | runtime: aws-ruby2.5 145 | 146 | # Deploy Jobs 147 | deploy-aws-csharp2-1: 148 | executor: ubuntu 149 | steps: 150 | - deployer: 151 | provider: aws 152 | runtime: aws-csharp2.1 153 | deploy-aws-fsharp2-1: 154 | executor: ubuntu 155 | steps: 156 | - deployer: 157 | provider: aws 158 | runtime: aws-fsharp2.1 159 | deploy-aws-go1-x: 160 | executor: ubuntu 161 | steps: 162 | - deployer: 163 | provider: aws 164 | runtime: aws-go1.x 165 | deploy-aws-java8: 166 | executor: ubuntu 167 | steps: 168 | - deployer: 169 | provider: aws 170 | runtime: aws-java8 171 | deploy-aws-nodejs8-10: 172 | executor: ubuntu 173 | steps: 174 | - deployer: 175 | provider: aws 176 | runtime: aws-nodejs8.10 177 | deploy-aws-nodejs10-x: 178 | executor: ubuntu 179 | steps: 180 | - deployer: 181 | provider: aws 182 | runtime: aws-nodejs10.x 183 | deploy-aws-python2-7: 184 | executor: ubuntu 185 | steps: 186 | - deployer: 187 | provider: aws 188 | runtime: aws-python2.7 189 | deploy-aws-python3-6: 190 | executor: ubuntu 191 | steps: 192 | - deployer: 193 | provider: aws 194 | runtime: aws-python3.6 195 | deploy-aws-python3-7: 196 | executor: ubuntu 197 | steps: 198 | - deployer: 199 | provider: aws 200 | runtime: aws-python3.7 201 | deploy-aws-ruby2-5: 202 | executor: ubuntu 203 | steps: 204 | - deployer: 205 | provider: aws 206 | runtime: aws-ruby2.5 207 | 208 | # Benchmark Jobs 209 | benchmark-aws-csharp2-1: 210 | executor: ubuntu 211 | steps: 212 | - benchmark: 213 | provider: aws 214 | runtime: aws-csharp2.1 215 | benchmark-aws-fsharp2-1: 216 | executor: ubuntu 217 | steps: 218 | - benchmark: 219 | provider: aws 220 | runtime: aws-fsharp2.1 221 | benchmark-aws-go1-x: 222 | executor: ubuntu 223 | steps: 224 | - benchmark: 225 | provider: aws 226 | runtime: aws-go1.x 227 | benchmark-aws-java8: 228 | executor: ubuntu 229 | steps: 230 | - benchmark: 231 | provider: aws 232 | runtime: aws-java8 233 | benchmark-aws-nodejs8-10: 234 | executor: ubuntu 235 | steps: 236 | - benchmark: 237 | provider: aws 238 | runtime: aws-nodejs8.10 239 | benchmark-aws-nodejs10-x: 240 | executor: ubuntu 241 | steps: 242 | - benchmark: 243 | provider: aws 244 | runtime: aws-nodejs10.x 245 | benchmark-aws-python2-7: 246 | executor: ubuntu 247 | steps: 248 | - benchmark: 249 | provider: aws 250 | runtime: aws-python2.7 251 | benchmark-aws-python3-6: 252 | executor: ubuntu 253 | steps: 254 | - benchmark: 255 | provider: aws 256 | runtime: aws-python3.6 257 | benchmark-aws-python3-7: 258 | executor: ubuntu 259 | steps: 260 | - benchmark: 261 | provider: aws 262 | runtime: aws-python3.7 263 | benchmark-aws-ruby2-5: 264 | executor: ubuntu 265 | steps: 266 | - benchmark: 267 | provider: aws 268 | runtime: aws-ruby2.5 269 | benchmark-gcp-nodejs8: 270 | executor: ubuntu 271 | steps: 272 | - benchmark: 273 | provider: gcp 274 | runtime: gcp-nodejs8 275 | 276 | # Report Jobs 277 | report-aws: 278 | executor: ubuntu 279 | steps: 280 | - report: 281 | provider: aws 282 | 283 | workflows: 284 | version: 2 285 | build-deploy-aws: 286 | jobs: 287 | # Build 288 | - build-aws-csharp2-1 289 | - build-aws-fsharp2-1 290 | - build-aws-go1-x 291 | - build-aws-java8 292 | - build-aws-nodejs8-10 293 | - build-aws-nodejs10-x 294 | - build-aws-python2-7 295 | - build-aws-python3-6 296 | - build-aws-python3-7 297 | - build-aws-ruby2-5 298 | 299 | # Deploy 300 | - deploy-aws-csharp2-1: 301 | filters: 302 | branches: 303 | only: master 304 | requires: 305 | - build-aws-csharp2-1 306 | - deploy-aws-fsharp2-1: 307 | filters: 308 | branches: 309 | only: master 310 | requires: 311 | - build-aws-fsharp2-1 312 | - deploy-aws-go1-x: 313 | filters: 314 | branches: 315 | only: master 316 | requires: 317 | - build-aws-go1-x 318 | - deploy-aws-java8: 319 | filters: 320 | branches: 321 | only: master 322 | requires: 323 | - build-aws-java8 324 | - deploy-aws-nodejs8-10: 325 | filters: 326 | branches: 327 | only: master 328 | requires: 329 | - build-aws-nodejs8-10 330 | - deploy-aws-nodejs10-x: 331 | filters: 332 | branches: 333 | only: master 334 | requires: 335 | - build-aws-nodejs10-x 336 | - deploy-aws-python2-7: 337 | filters: 338 | branches: 339 | only: master 340 | requires: 341 | - build-aws-python2-7 342 | - deploy-aws-python3-6: 343 | filters: 344 | branches: 345 | only: master 346 | requires: 347 | - build-aws-python3-6 348 | - deploy-aws-python3-7: 349 | filters: 350 | branches: 351 | only: master 352 | requires: 353 | - build-aws-python3-7 354 | - deploy-aws-ruby2-5: 355 | filters: 356 | branches: 357 | only: master 358 | requires: 359 | - build-aws-ruby2-5 360 | 361 | benchmark-and-report: 362 | jobs: 363 | - hold: 364 | type: approval 365 | # Benchmark 366 | - benchmark-aws-csharp2-1: 367 | requires: 368 | - hold 369 | - benchmark-aws-fsharp2-1: 370 | requires: 371 | - hold 372 | - benchmark-aws-go1-x: 373 | requires: 374 | - hold 375 | - benchmark-aws-java8: 376 | requires: 377 | - hold 378 | - benchmark-aws-nodejs8-10: 379 | requires: 380 | - hold 381 | - benchmark-aws-nodejs10-x: 382 | requires: 383 | - hold 384 | - benchmark-aws-python2-7: 385 | requires: 386 | - hold 387 | - benchmark-aws-python3-6: 388 | requires: 389 | - hold 390 | - benchmark-aws-python3-7: 391 | requires: 392 | - hold 393 | - benchmark-aws-ruby2-5: 394 | requires: 395 | - hold 396 | - benchmark-gcp-nodejs8: 397 | requires: 398 | - hold 399 | # Report 400 | - report-aws: 401 | requires: 402 | - benchmark-aws-csharp2-1 403 | - benchmark-aws-fsharp2-1 404 | - benchmark-aws-go1-x 405 | - benchmark-aws-java8 406 | - benchmark-aws-nodejs8-10 407 | - benchmark-aws-nodejs10-x 408 | - benchmark-aws-python2-7 409 | - benchmark-aws-python3-6 410 | - benchmark-aws-python3-7 411 | - benchmark-aws-ruby2-5 412 | -------------------------------------------------------------------------------- /.github/workflows/push.yml: -------------------------------------------------------------------------------- 1 | on: push 2 | name: AWS Lambda 3 | jobs: 4 | build: 5 | name: package 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/checkout@master 9 | - name: C# 2.1 10 | uses: docker://flemay/musketeers 11 | env: 12 | PROVIDERS: aws 13 | RUNTIMES: aws-csharp2.1 14 | with: 15 | entrypoint: make 16 | args: package 17 | - name: Go 1.x 18 | uses: docker://flemay/musketeers 19 | env: 20 | PROVIDERS: aws 21 | RUNTIMES: 'aws-go1.x' 22 | with: 23 | entrypoint: make 24 | args: package 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .serverless/ 2 | bin 3 | apis.txt 4 | .env 5 | .env.auth 6 | 7 | # performance tests 8 | reports/*.html 9 | reports/*.json 10 | 11 | # IDEs 12 | *.iml 13 | *.ipr 14 | .settings/ 15 | .project 16 | .classpath 17 | .idea/ 18 | 19 | # dotnet 20 | obj 21 | 22 | # java 23 | target/ 24 | 25 | # node 26 | node_modules -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.templateFilter": "All" 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Serverless Multi Cloud Benchmarks 2 | 3 | [![CircleCI](https://circleci.com/gh/serverlesscloud/serverless-multi-cloud-benchmarks.svg?style=svg)](https://circleci.com/gh/serverlesscloud/serverless-multi-cloud-benchmarks) 4 | 5 | A multi cloud provider continuation of 6 | 7 | https://read.acloud.guru/comparing-aws-lambda-performance-of-node-js-python-java-c-and-go-29c1163c2581 8 | 9 | # Features 10 | 11 | ## Cloud Providers 12 | 13 | - [x] AWS 14 | - [X] GCP 15 | - [ ] Azure 16 | - [ ] OpenShift 17 | - [ ] Alibaba 18 | - [ ] Cloud Flare 19 | 20 | ## Test Scenarios 21 | 22 | - [x] Hello world baseline 23 | - [ ] Dynamo DB read write 24 | - [ ] Serverless Containers (Fargate, Cloud Run, Container Instances etc) 25 | - [ ] Relational read write 26 | - [ ] GraphQL 27 | 28 | ## House Rules 29 | 30 | 1. No caching 31 | 2. Memory = 1GB 32 | 3. ID need to be UUID v4 33 | 4. Zero initial instances for serverless containers 34 | -------------------------------------------------------------------------------- /artillery/.gitignore: -------------------------------------------------------------------------------- 1 | *.json 2 | *.html -------------------------------------------------------------------------------- /artillery/db_write_read.yml: -------------------------------------------------------------------------------- 1 | config: 2 | target: 'https:/' 3 | processor: "../../artillery/generator.js" 4 | phases: 5 | - duration: 60 6 | arrivalRate: 10 7 | 8 | scenarios: 9 | - name "Database Write and Read": 10 | flow: 11 | - function: "generateRandomData" 12 | - post: 13 | url: "/users" 14 | json: 15 | name: "{{ name }}" 16 | email: "{{ email }}" 17 | dob: "{{ dob }}" 18 | address: "{{ address }}" -------------------------------------------------------------------------------- /artillery/generator.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | generateRandomData 5 | }; 6 | 7 | // Make sure to "npm install faker" first. 8 | const Faker = require('faker'); 9 | 10 | function generateRandomData(userContext, events, done) { 11 | // generate data with Faker: 12 | const name = `${Faker.name.firstName()} ${Faker.name.lastName()}`; 13 | const email = Faker.internet.exampleEmail(); 14 | const dob = Faker.date.past(50); 15 | const address = Faker.address.streetAddress(); 16 | // add variables to virtual user's context: 17 | userContext.vars.name = name; 18 | userContext.vars.email = email; 19 | userContext.vars.dob = dob; 20 | userContext.vars.address = address; 21 | // continue with executing the scenario: 22 | return done(); 23 | } -------------------------------------------------------------------------------- /artillery/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "artillery", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "faker": { 8 | "version": "4.1.0", 9 | "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", 10 | "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /artillery/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "artillery", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "generator.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "faker": "^4.1.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /artillery/reports/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverlesscloud/serverless-multi-cloud-benchmarks/46df201019dfe9014ce62626f482b779098fe0e0/artillery/reports/.gitkeep -------------------------------------------------------------------------------- /artillery/runtime_baseline.yml: -------------------------------------------------------------------------------- 1 | config: 2 | target: "{{ $processEnvironment.API_URL }}" 3 | phases: 4 | - duration: "{{ $processEnvironment.DURATION }}" 5 | arrivalRate: "{{ $processEnvironment.RATE }}" 6 | 7 | scenarios: 8 | - name "Hello": 9 | flow: 10 | - get: 11 | url: "/" 12 | -------------------------------------------------------------------------------- /aws/.env.template: -------------------------------------------------------------------------------- 1 | # these will be interpolated from your shell if undefined 2 | AWS_ACCESS_KEY_ID 3 | AWS_SECRET_ACCESS_KEY 4 | AWS_PROFILE 5 | AWS_REGION 6 | 7 | # Serverless Enterprise 8 | SERVERLESS_ACCESS_KEY 9 | 10 | # Artillery 11 | DURATION 12 | RATE 13 | 14 | AWS_RUBY_2_5_URL 15 | AWS_RUBY_2_5_URL 16 | AWS_CSHARP2_1_URL 17 | AWS_FSHARP2_1_URL 18 | AWS_GO_URL 19 | AWS_JAVA8_URL 20 | AWS_NODEJS_8_URL 21 | AWS_NODEJS_10_URL 22 | AWS_PYTHON_2_7_URL 23 | AWS_PYTHON_3_6_URL 24 | AWS_PYTHON_3_7_URL 25 | -------------------------------------------------------------------------------- /aws/.gitignore: -------------------------------------------------------------------------------- 1 | # Serverless 2 | .serverless 3 | .env 4 | tmp 5 | .coveralls.yml 6 | 7 | # Google 8 | keyfile.json 9 | 10 | # Logs 11 | *.log 12 | 13 | # Directory for instrumented libs generated by jscoverage/JSCover 14 | lib-cov 15 | 16 | # Coverage directory used by tools like istanbul 17 | coverage 18 | 19 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 20 | .grunt 21 | 22 | # node-waf configuration 23 | .lock-wscript 24 | 25 | # Compiled binary addons (http://nodejs.org/api/addons.html) 26 | build/Release 27 | 28 | # Dependency directory 29 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 30 | node_modules 31 | 32 | # IDE 33 | **/.idea 34 | 35 | # OS 36 | .DS_Store 37 | .tmp 38 | -------------------------------------------------------------------------------- /aws/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIMES ?= $(shell ls -d */) 2 | 3 | .env: 4 | cp .env.template .env 5 | 6 | all: .env 7 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME) && make && cd ..;) 8 | 9 | package: .env 10 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME) && make package && cd ..;) 11 | 12 | deploy: .env 13 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME); make deploy && cd ..;) 14 | 15 | baseLine: .env 16 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME); make baseLine && cd ..;) 17 | 18 | report: .env 19 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME); make report && cd ..;) 20 | 21 | clean: .env 22 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME); make clean && cd ..;) 23 | 24 | remove: .env 25 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME); make remove && cd ..;) 26 | 27 | reset: .env 28 | @$(foreach RUNTIME, $(RUNTIMES), $(call resetDynamo, $(RUNTIME)) ) 29 | 30 | define resetDynamo 31 | echo "deleting items in $(RUNTIME)" 32 | aws dynamodb scan \ 33 | --region $(AWS_REGION) --table-name $(subst /,,$(1)) --attributes-to-get "id" --query "Items[].id.S" --output text | tr "\t" "\n" | \ 34 | xargs -t -I keyvalue aws dynamodb delete-item --table-name $TABLE_NAME --key '{"id": {"S": "keyvalue"}}' 35 | endef 36 | 37 | -------------------------------------------------------------------------------- /aws/README.md: -------------------------------------------------------------------------------- 1 | # AWS Runtimes 2 | 3 | ## Usage 4 | Default make task will build and deploy all runtimes: 5 | 6 | make 7 | 8 | Alternative specify invidual `RUNTIMES` and / or invidual make targets 9 | 10 | RUNTIMES=aws-csharp2.1 make build deploy 11 | RUNTIMES=aws-go1.x make build deploy 12 | -------------------------------------------------------------------------------- /aws/aws-csharp2.1/Handler.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Amazon.Lambda.Core; 3 | using Amazon.Lambda.APIGatewayEvents; 4 | 5 | [assembly:LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))] 6 | 7 | namespace AwsDotnetCsharp 8 | { 9 | public class Handler 10 | { 11 | public APIGatewayProxyResponse Hello(APIGatewayProxyRequest apigProxyEvent, ILambdaContext context) => new APIGatewayProxyResponse 12 | { 13 | StatusCode = 200, 14 | Body = "hello" 15 | }; 16 | } 17 | } -------------------------------------------------------------------------------- /aws/aws-csharp2.1/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-csharp2.1 2 | API_URL=$(AWS_CSHARP2_1_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | _clean: 8 | rm -rf .serverless bin obj 9 | 10 | _build: 11 | dotnet restore && \ 12 | dotnet lambda package -c release -f netcoreapp2.1 --o bin/release/netcoreapp2.1/publish/deploy-package.zip -------------------------------------------------------------------------------- /aws/aws-csharp2.1/aws-csharp2.1.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netcoreapp2.1 5 | CsharpHandlers 6 | aws-csharp2.1 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /aws/aws-csharp2.1/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: aws-csharp2-1 4 | 5 | provider: 6 | name: aws 7 | runtime: dotnetcore2.1 8 | 9 | package: 10 | artifact: bin/release/netcoreapp2.1/publish/deploy-package.zip 11 | 12 | functions: 13 | hello: 14 | handler: CsharpHandlers::AwsDotnetCsharp.Handler::Hello 15 | events: 16 | - http: 17 | path: / 18 | method: get 19 | -------------------------------------------------------------------------------- /aws/aws-fsharp2.1/Handler.fs: -------------------------------------------------------------------------------- 1 | namespace AwsDotnetFsharp 2 | open Amazon.Lambda.Core 3 | 4 | [)>] 5 | do () 6 | 7 | module Handler = 8 | open Amazon.Lambda.APIGatewayEvents 9 | 10 | let hello(_:APIGatewayProxyRequest, _:ILambdaContext): APIGatewayProxyResponse = 11 | let response = APIGatewayProxyResponse() 12 | response.StatusCode <- 200 13 | response.Body <- "hello" 14 | response -------------------------------------------------------------------------------- /aws/aws-fsharp2.1/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-fsharp2.1 2 | API_URL=$(AWS_FSHARP2_1_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | _clean: 8 | rm -rf .serverless bin obj 9 | 10 | _build: 11 | dotnet restore && \ 12 | dotnet lambda package -c release -f netcoreapp2.1 --o bin/release/netcoreapp2.1/publish/deploy-package.zip 13 | -------------------------------------------------------------------------------- /aws/aws-fsharp2.1/aws-fsharp2.1.fsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.1 5 | FsharpHandlers 6 | aws-fsharp2.1 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /aws/aws-fsharp2.1/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: aws-fsharp2-1 4 | 5 | provider: 6 | name: aws 7 | runtime: dotnetcore2.1 8 | 9 | package: 10 | artifact: bin/release/netcoreapp2.1/publish/deploy-package.zip 11 | 12 | functions: 13 | hello: 14 | handler: FsharpHandlers::AwsDotnetFsharp.Handler::hello 15 | events: 16 | - http: 17 | path: / 18 | method: get -------------------------------------------------------------------------------- /aws/aws-go1.x/.gitignore: -------------------------------------------------------------------------------- 1 | .serverless 2 | 3 | bin/ -------------------------------------------------------------------------------- /aws/aws-go1.x/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-go1.x 2 | API_URL=$(AWS_GO1_X_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | _clean: 8 | rm -rf .serverless bin 9 | 10 | _build: 11 | go get -u github.com/aws/aws-lambda-go/lambda && \ 12 | go get -u github.com/aws/aws-lambda-go/events && \ 13 | env GOOS=linux go build -ldflags='-w -s' -o bin/main 14 | -------------------------------------------------------------------------------- /aws/aws-go1.x/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/aws/aws-lambda-go/events" 7 | "github.com/aws/aws-lambda-go/lambda" 8 | ) 9 | 10 | func Handler(_ context.Context, request *events.APIGatewayProxyRequest) (*events.APIGatewayProxyResponse, error) { 11 | return &events.APIGatewayProxyResponse{Body: "hello", StatusCode: 200}, nil 12 | } 13 | 14 | func main() { 15 | lambda.Start(Handler) 16 | } 17 | -------------------------------------------------------------------------------- /aws/aws-go1.x/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: aws-go1-x 4 | 5 | provider: 6 | name: aws 7 | runtime: go1.x 8 | 9 | package: 10 | exclude: 11 | - ./** 12 | include: 13 | - ./bin/main 14 | 15 | functions: 16 | hello: 17 | handler: bin/main 18 | events: 19 | - http: 20 | path: / 21 | method: get 22 | 23 | -------------------------------------------------------------------------------- /aws/aws-java8/.npmignore: -------------------------------------------------------------------------------- 1 | *.class 2 | target 3 | /bin/ 4 | /.settings/ 5 | .project 6 | .classpath 7 | 8 | # Package Files 9 | *.jar 10 | *.war 11 | *.ear 12 | 13 | # Serverless directories 14 | .serverless -------------------------------------------------------------------------------- /aws/aws-java8/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-java8 2 | API_URL=$(AWS_JAVA8_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | _clean: 8 | rm -rf .serverless target 9 | 10 | build: 11 | $(BUILDER) mvn package -------------------------------------------------------------------------------- /aws/aws-java8/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | 4 | com.serverless 5 | hello 6 | jar 7 | dev 8 | hello 9 | 10 | 11 | 1.8 12 | 1.8 13 | UTF-8 14 | 15 | 16 | 17 | 18 | com.amazonaws 19 | aws-lambda-java-core 20 | 1.2.0 21 | 22 | 23 | com.amazonaws 24 | aws-lambda-java-events 25 | 2.2.2 26 | 27 | 28 | 29 | 30 | 31 | 32 | org.apache.maven.plugins 33 | maven-shade-plugin 34 | 2.3 35 | 36 | false 37 | 38 | 39 | 40 | package 41 | 42 | shade 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /aws/aws-java8/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: aws-java8 4 | provider: 5 | name: aws 6 | runtime: java8 7 | package: 8 | artifact: target/hello-dev.jar 9 | 10 | functions: 11 | hello: 12 | handler: com.serverless.Handler 13 | events: 14 | - http: 15 | path: / 16 | method: get 17 | -------------------------------------------------------------------------------- /aws/aws-java8/src/main/java/com/serverless/Handler.java: -------------------------------------------------------------------------------- 1 | package com.serverless; 2 | 3 | import com.amazonaws.services.lambda.runtime.Context; 4 | import com.amazonaws.services.lambda.runtime.RequestHandler; 5 | import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; 6 | import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; 7 | 8 | public class Handler implements RequestHandler { 9 | 10 | @Override 11 | public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) { 12 | return new APIGatewayProxyResponseEvent().withBody("hello").withStatusCode(200); 13 | } 14 | } -------------------------------------------------------------------------------- /aws/aws-nodejs10.x/.npmignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless -------------------------------------------------------------------------------- /aws/aws-nodejs10.x/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-nodejs10.x 2 | API_URL=$(AWS_NODEJS8_10_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | _clean: 8 | rm -rf .serverless bin node_modules 9 | 10 | _build: 11 | npm install --ignore-scripts -------------------------------------------------------------------------------- /aws/aws-nodejs10.x/handler.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports.hello = (event, context, callback) => { 4 | const response = { 5 | statusCode: 200, 6 | body: "hello" 7 | }; 8 | 9 | callback(null, response); 10 | }; 11 | -------------------------------------------------------------------------------- /aws/aws-nodejs10.x/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-nodejs10.x", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "uuid": { 8 | "version": "2.0.3", 9 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", 10 | "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /aws/aws-nodejs10.x/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-nodejs10.x", 3 | "version": "1.0.0", 4 | "description": "AWS Node.js 10.x", 5 | "dependencies": { 6 | "uuid": "^2.0.3" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /aws/aws-nodejs10.x/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: aws-nodejs10-x 4 | 5 | provider: 6 | name: aws 7 | runtime: nodejs10.x 8 | environment: 9 | DYNAMODB_TABLE: ${self:service} 10 | iamRoleStatements: 11 | - Effect: Allow 12 | Action: 13 | - dynamodb:Query 14 | - dynamodb:Scan 15 | - dynamodb:GetItem 16 | - dynamodb:PutItem 17 | - dynamodb:UpdateItem 18 | - dynamodb:DeleteItem 19 | - dynamodb:DeleteTable 20 | Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}" 21 | 22 | functions: 23 | hello: 24 | handler: handler.hello 25 | events: 26 | - http: 27 | path: / 28 | method: get 29 | create: 30 | handler: users/create.create 31 | events: 32 | - http: 33 | path: /users 34 | method: post 35 | read: 36 | handler: users/read.read 37 | events: 38 | - http: 39 | path: /users/{id} 40 | method: get 41 | list: 42 | handler: users/list.list 43 | events: 44 | - http: 45 | path: /users 46 | method: get 47 | 48 | resources: 49 | Resources: 50 | TodosDynamoDbTable: 51 | Type: 'AWS::DynamoDB::Table' 52 | DeletionPolicy: Delete 53 | Properties: 54 | AttributeDefinitions: 55 | - 56 | AttributeName: id 57 | AttributeType: S 58 | KeySchema: 59 | - 60 | AttributeName: id 61 | KeyType: HASH 62 | ProvisionedThroughput: 63 | ReadCapacityUnits: 10 64 | WriteCapacityUnits: 10 65 | TableName: ${self:provider.environment.DYNAMODB_TABLE} -------------------------------------------------------------------------------- /aws/aws-nodejs10.x/users/create.js: -------------------------------------------------------------------------------- 1 | 2 | 'use strict'; 3 | 4 | const uuid = require('uuid'); 5 | const AWS = require('aws-sdk'); 6 | const dynamoDb = new AWS.DynamoDB.DocumentClient(); 7 | 8 | module.exports.create = (event, context, callback) => { 9 | const timestamp = new Date().getTime(); 10 | const data = JSON.parse(event.body); 11 | 12 | const params = { 13 | TableName: process.env.DYNAMODB_TABLE, 14 | Item: { 15 | id: uuid.v4(), 16 | name: data.name, 17 | email: data.email, 18 | dob: data.dob, 19 | address: data.address, 20 | createdAt: timestamp, 21 | updatedAt: timestamp, 22 | }, 23 | }; 24 | 25 | // write the todo to the database 26 | dynamoDb.put(params, (error) => { 27 | // handle potential errors 28 | if (error) { 29 | console.error(error); 30 | callback(null, { 31 | statusCode: error.statusCode || 501, 32 | headers: { 'Content-Type': 'text/plain' }, 33 | body: 'Failed to create the user.', 34 | }); 35 | return; 36 | } 37 | 38 | // create a response 39 | const response = { 40 | statusCode: 201, 41 | body: JSON.stringify(params.Item), 42 | }; 43 | callback(null, response); 44 | }); 45 | }; -------------------------------------------------------------------------------- /aws/aws-nodejs10.x/users/list.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const AWS = require('aws-sdk'); // eslint-disable-line import/no-extraneous-dependencies 4 | 5 | const dynamoDb = new AWS.DynamoDB.DocumentClient(); 6 | const params = { 7 | TableName: process.env.DYNAMODB_TABLE, 8 | }; 9 | 10 | module.exports.list = (event, context, callback) => { 11 | // fetch all todos from the database 12 | dynamoDb.scan(params, (error, result) => { 13 | // handle potential errors 14 | if (error) { 15 | console.error(error); 16 | callback(null, { 17 | statusCode: error.statusCode || 501, 18 | headers: { 'Content-Type': 'text/plain' }, 19 | body: 'Couldn\'t fetch the users.', 20 | }); 21 | return; 22 | } 23 | 24 | // create a response 25 | const response = { 26 | statusCode: 200, 27 | body: JSON.stringify(result.Items), 28 | }; 29 | callback(null, response); 30 | }); 31 | }; -------------------------------------------------------------------------------- /aws/aws-nodejs10.x/users/read.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const AWS = require('aws-sdk'); // eslint-disable-line import/no-extraneous-dependencies 4 | 5 | const dynamoDb = new AWS.DynamoDB.DocumentClient(); 6 | 7 | module.exports.get = (event, context, callback) => { 8 | const params = { 9 | TableName: process.env.DYNAMODB_TABLE, 10 | Key: { 11 | id: event.pathParameters.id, 12 | }, 13 | }; 14 | 15 | // fetch todo from the database 16 | dynamoDb.get(params, (error, result) => { 17 | // handle potential errors 18 | if (error) { 19 | console.error(error); 20 | callback(null, { 21 | statusCode: error.statusCode || 501, 22 | headers: { 'Content-Type': 'text/plain' }, 23 | body: 'Couldn\'t fetch the user.', 24 | }); 25 | return; 26 | } 27 | 28 | // create a response 29 | const response = { 30 | statusCode: 200, 31 | body: JSON.stringify(result.Item), 32 | }; 33 | callback(null, response); 34 | }); 35 | }; -------------------------------------------------------------------------------- /aws/aws-nodejs8.10/.npmignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless -------------------------------------------------------------------------------- /aws/aws-nodejs8.10/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-nodejs8.10 2 | API_URL=$(AWS_NODEJS8_10_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | _clean: 8 | rm -rf .serverless bin node_modules 9 | 10 | _build: 11 | npm install --ignore-scripts -------------------------------------------------------------------------------- /aws/aws-nodejs8.10/handler.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports.hello = (event, context, callback) => { 4 | const response = { 5 | statusCode: 200, 6 | body: "hello" 7 | }; 8 | 9 | callback(null, response); 10 | }; 11 | -------------------------------------------------------------------------------- /aws/aws-nodejs8.10/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-nodejs8.10", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "uuid": { 8 | "version": "2.0.3", 9 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", 10 | "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /aws/aws-nodejs8.10/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-nodejs8.10", 3 | "version": "1.0.0", 4 | "description": "AWS Node.js 8.10", 5 | "dependencies": { 6 | "uuid": "^2.0.3" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /aws/aws-nodejs8.10/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: aws-nodejs8 4 | 5 | provider: 6 | name: aws 7 | runtime: nodejs8.10 8 | environment: 9 | DYNAMODB_TABLE: ${self:service} 10 | iamRoleStatements: 11 | - Effect: Allow 12 | Action: 13 | - dynamodb:Query 14 | - dynamodb:Scan 15 | - dynamodb:GetItem 16 | - dynamodb:PutItem 17 | - dynamodb:UpdateItem 18 | - dynamodb:DeleteItem 19 | - dynamodb:DeleteTable 20 | Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}" 21 | 22 | functions: 23 | hello: 24 | handler: handler.hello 25 | events: 26 | - http: 27 | path: / 28 | method: get 29 | create: 30 | handler: users/create.create 31 | events: 32 | - http: 33 | path: /users 34 | method: post 35 | read: 36 | handler: users/read.read 37 | events: 38 | - http: 39 | path: /users/{id} 40 | method: get 41 | list: 42 | handler: users/list.list 43 | events: 44 | - http: 45 | path: /users 46 | method: get 47 | 48 | resources: 49 | Resources: 50 | TodosDynamoDbTable: 51 | Type: 'AWS::DynamoDB::Table' 52 | DeletionPolicy: Delete 53 | Properties: 54 | AttributeDefinitions: 55 | - 56 | AttributeName: id 57 | AttributeType: S 58 | KeySchema: 59 | - 60 | AttributeName: id 61 | KeyType: HASH 62 | ProvisionedThroughput: 63 | ReadCapacityUnits: 10 64 | WriteCapacityUnits: 10 65 | TableName: ${self:provider.environment.DYNAMODB_TABLE} -------------------------------------------------------------------------------- /aws/aws-nodejs8.10/users/create.js: -------------------------------------------------------------------------------- 1 | 2 | 'use strict'; 3 | 4 | const uuid = require('uuid'); 5 | const AWS = require('aws-sdk'); 6 | const dynamoDb = new AWS.DynamoDB.DocumentClient(); 7 | 8 | module.exports.create = (event, context, callback) => { 9 | const timestamp = new Date().getTime(); 10 | const data = JSON.parse(event.body); 11 | 12 | const params = { 13 | TableName: process.env.DYNAMODB_TABLE, 14 | Item: { 15 | id: uuid.v4(), 16 | name: data.name, 17 | email: data.email, 18 | dob: data.dob, 19 | address: data.address, 20 | createdAt: timestamp, 21 | updatedAt: timestamp, 22 | }, 23 | }; 24 | 25 | // write the todo to the database 26 | dynamoDb.put(params, (error) => { 27 | // handle potential errors 28 | if (error) { 29 | console.error(error); 30 | callback(null, { 31 | statusCode: error.statusCode || 501, 32 | headers: { 'Content-Type': 'text/plain' }, 33 | body: 'Failed to create the user.', 34 | }); 35 | return; 36 | } 37 | 38 | // create a response 39 | const response = { 40 | statusCode: 201, 41 | body: JSON.stringify(params.Item), 42 | }; 43 | callback(null, response); 44 | }); 45 | }; -------------------------------------------------------------------------------- /aws/aws-nodejs8.10/users/list.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const AWS = require('aws-sdk'); // eslint-disable-line import/no-extraneous-dependencies 4 | 5 | const dynamoDb = new AWS.DynamoDB.DocumentClient(); 6 | const params = { 7 | TableName: process.env.DYNAMODB_TABLE, 8 | }; 9 | 10 | module.exports.list = (event, context, callback) => { 11 | // fetch all todos from the database 12 | dynamoDb.scan(params, (error, result) => { 13 | // handle potential errors 14 | if (error) { 15 | console.error(error); 16 | callback(null, { 17 | statusCode: error.statusCode || 501, 18 | headers: { 'Content-Type': 'text/plain' }, 19 | body: 'Couldn\'t fetch the users.', 20 | }); 21 | return; 22 | } 23 | 24 | // create a response 25 | const response = { 26 | statusCode: 200, 27 | body: JSON.stringify(result.Items), 28 | }; 29 | callback(null, response); 30 | }); 31 | }; -------------------------------------------------------------------------------- /aws/aws-nodejs8.10/users/read.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const AWS = require('aws-sdk'); // eslint-disable-line import/no-extraneous-dependencies 4 | 5 | const dynamoDb = new AWS.DynamoDB.DocumentClient(); 6 | 7 | module.exports.get = (event, context, callback) => { 8 | const params = { 9 | TableName: process.env.DYNAMODB_TABLE, 10 | Key: { 11 | id: event.pathParameters.id, 12 | }, 13 | }; 14 | 15 | // fetch todo from the database 16 | dynamoDb.get(params, (error, result) => { 17 | // handle potential errors 18 | if (error) { 19 | console.error(error); 20 | callback(null, { 21 | statusCode: error.statusCode || 501, 22 | headers: { 'Content-Type': 'text/plain' }, 23 | body: 'Couldn\'t fetch the user.', 24 | }); 25 | return; 26 | } 27 | 28 | // create a response 29 | const response = { 30 | statusCode: 200, 31 | body: JSON.stringify(result.Item), 32 | }; 33 | callback(null, response); 34 | }); 35 | }; -------------------------------------------------------------------------------- /aws/aws-python2.7/.npmignore: -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- /aws/aws-python2.7/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-python2.7 2 | API_URL=$(AWS_PYTHON2_7_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | _clean: 8 | rm -rf .serverless 9 | 10 | build: 11 | @echo "nothing to build" -------------------------------------------------------------------------------- /aws/aws-python2.7/handler.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | def hello(event, context): 4 | return { 5 | "statusCode": 200, 6 | "body": "hello" 7 | } 8 | -------------------------------------------------------------------------------- /aws/aws-python2.7/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: aws-python2-7 4 | 5 | provider: 6 | name: aws 7 | runtime: python2.7 8 | 9 | functions: 10 | hello: 11 | handler: handler.hello 12 | events: 13 | - http: 14 | path: / 15 | method: get 16 | -------------------------------------------------------------------------------- /aws/aws-python3.6/.npmignore: -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- /aws/aws-python3.6/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-python3.6 2 | API_URL=$(AWS_PYTHON3_6_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | _clean: 8 | rm -rf .serverless 9 | 10 | build: 11 | @echo "nothing to build" -------------------------------------------------------------------------------- /aws/aws-python3.6/handler.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | def hello(event, context): 4 | return { 5 | "statusCode": 200, 6 | "body": "hello" 7 | } 8 | -------------------------------------------------------------------------------- /aws/aws-python3.6/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: aws-python3-6 4 | 5 | provider: 6 | name: aws 7 | runtime: python3.6 8 | 9 | functions: 10 | hello: 11 | handler: handler.hello 12 | 13 | events: 14 | - http: 15 | path: / 16 | method: get 17 | -------------------------------------------------------------------------------- /aws/aws-python3.7/.npmignore: -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- /aws/aws-python3.7/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-python3.7 2 | API_URL=$(AWS_PYTHON3_7_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | _clean: 8 | rm -rf .serverless 9 | 10 | build: 11 | @echo "nothing to build" -------------------------------------------------------------------------------- /aws/aws-python3.7/handler.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | def hello(event, context): 4 | return { 5 | "statusCode": 200, 6 | "body": "hello" 7 | } 8 | -------------------------------------------------------------------------------- /aws/aws-python3.7/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: aws-python3-7 4 | 5 | provider: 6 | name: aws 7 | runtime: python3.7 8 | 9 | functions: 10 | hello: 11 | handler: handler.hello 12 | events: 13 | - http: 14 | path: / 15 | method: get 16 | -------------------------------------------------------------------------------- /aws/aws-ruby2.5/.npmignore: -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- /aws/aws-ruby2.5/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-ruby2.5 2 | API_URL=$(AWS_RUBY2_5_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | _clean: 8 | rm -rf .serverless 9 | 10 | _test: 11 | ruby -I test test/handler_test.rb 12 | 13 | build: 14 | @echo "nothing to build" -------------------------------------------------------------------------------- /aws/aws-ruby2.5/aws-ruby2.5.json.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Artillery report 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 48 | 49 | 2349 | 2350 | 2364 | 2365 | 2366 | 2367 | 2368 | 2369 |
2370 | 2371 | 2384 | 2385 |
2386 |
2387 |

Test run on date

2388 |
2389 |
2390 | 2391 |
2392 |
2393 |

Summary

2394 | 2395 | 2396 | 2397 | 2398 | 2399 | 2400 | 2401 | 2402 | 2403 | 2404 | 2405 | 2406 | 2407 | 2408 | 2409 | 2410 |
Test duration0 sec
Scenarios created0
Scenarios completed0
2411 |
2412 | 2413 |
2414 |
2415 | Scenario counts: 2416 | 2417 |

2418 | 2419 | 2420 |
2421 |
2422 |
2423 | 2424 |
2425 |
2426 | Codes 2427 | 2428 |

2429 | 2430 | 2431 |
2432 |
2433 |
2434 | 2435 |
2436 |
2437 | Errors 2438 | 2439 |

2440 | 2441 | 2442 |
2443 |
2444 |
2445 |
2446 | 2447 |
2448 |
2449 |

Charts

2450 |
2451 |
2452 | 2453 |
2454 |
2455 |
2456 | 2457 |
2458 |
2459 |
2460 | 2461 |
2462 | 2463 |
2464 | 2465 |
2466 | 2467 |
2468 |
2469 |
2470 | 2471 |
2472 |
2473 |
2474 |
2475 |
2476 |
2477 | 2478 |
2479 |
2480 |
2481 |
2482 |
2483 |
2484 | 2485 | 2486 | 2487 | 2488 | 2489 |
2490 | 2491 |
2492 |
2493 |

Raw report data

2494 |

This is the raw JSON stats output that the report was generated from.

2495 |
2496 |
2497 |
2498 |
2499 | 2500 | 2768 | 2771 | 2772 | 2773 | -------------------------------------------------------------------------------- /aws/aws-ruby2.5/handler.rb: -------------------------------------------------------------------------------- 1 | require 'json' 2 | 3 | def hello(event:, context:) 4 | begin 5 | { statusCode: 200, body: "hello" } 6 | end 7 | end -------------------------------------------------------------------------------- /aws/aws-ruby2.5/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: aws-ruby-2-5 4 | 5 | provider: 6 | name: aws 7 | runtime: ruby2.5 8 | 9 | package: 10 | exclude: 11 | - ./** 12 | include: 13 | - ./handler.rb 14 | 15 | functions: 16 | hello: 17 | handler: handler.hello 18 | events: 19 | - http: 20 | path: / 21 | method: get 22 | -------------------------------------------------------------------------------- /aws/aws-ruby2.5/test/handler_test.rb: -------------------------------------------------------------------------------- 1 | require_relative '../handler.rb' 2 | require 'test/unit' 3 | 4 | class TestHandler < Test::Unit::TestCase 5 | def test_hello() 6 | response = hello(event: {"body": "Hello, World!"}, context: {}) 7 | assert_equal 200, response[:statusCode] 8 | assert_match /hello/, response[:body] 9 | end 10 | end -------------------------------------------------------------------------------- /aws/common.mk: -------------------------------------------------------------------------------- 1 | BUILDER=docker-compose -f ../docker-compose.yml run --rm $(RUNTIME) 2 | SLS=docker-compose -f ../docker-compose.yml run --rm -w /opt/app/$(RUNTIME) sls 3 | ARTILLERY=docker-compose -f ../docker-compose.yml run --rm -e API_URL=$(API_URL) artillery 4 | ARTILLERY_BASH=docker-compose -f ../docker-compose.yml run --rm -e API_URL=$(API_URL) --entrypoint bash artillery 5 | 6 | # Builder 7 | all: clean package deploy 8 | 9 | clean: ../.env 10 | $(BUILDER) make _clean 11 | 12 | build: ../.env 13 | $(BUILDER) make _build 14 | 15 | # Serverless 16 | package: ../.env build 17 | $(SLS) package 18 | 19 | deploy: ../.env 20 | $(SLS) deploy --package .serverless 21 | 22 | remove: ../.env 23 | $(SLS) remove 24 | 25 | # Artillery 26 | baseLine: ../.env 27 | $(ARTILLERY) run --output reports/$(RUNTIME).json runtime_baseline.yml 28 | 29 | report: ../.env 30 | $(ARTILLERY) report reports/$(RUNTIME).json 31 | 32 | # Helpers 33 | ../.env: 34 | cp ../.env.template ../.env 35 | 36 | shellBuilder: 37 | $(BUILDER) bash 38 | 39 | shellArtillery: 40 | $(ARTILLERY_BASH) -------------------------------------------------------------------------------- /aws/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.4' 2 | services: 3 | sls: 4 | image: amaysim/serverless:1.49.0 5 | env_file: .env 6 | entrypoint: serverless 7 | volumes: 8 | - ~/.aws:/root/.aws 9 | - ~/.gcloud:/root/.gcloud 10 | - .:/opt/app 11 | artillery: 12 | image: serverlesscloud/artillery 13 | env_file: .env 14 | working_dir: /artillery 15 | volumes: 16 | - ../artillery:/artillery 17 | aws-csharp2.1: 18 | image: lambci/lambda:build-dotnetcore2.1 19 | working_dir: /var/task/aws-csharp2.1 20 | volumes: 21 | - .:/var/task 22 | aws-fsharp2.1: 23 | image: lambci/lambda:build-dotnetcore2.1 24 | working_dir: /var/task/aws-fsharp2.1 25 | volumes: 26 | - .:/var/task 27 | aws-go1.x: 28 | image: lambci/lambda:build-go1.x 29 | working_dir: /var/task/aws-go1.x 30 | volumes: 31 | - .:/var/task 32 | aws-nodejs6.10: 33 | image: lambci/lambda:build-nodejs6.10 34 | working_dir: /var/task/aws-nodejs6.10 35 | volumes: 36 | - .:/var/task 37 | aws-nodejs8.10: 38 | image: lambci/lambda:build-nodejs8.10 39 | working_dir: /var/task/aws-nodejs8.10 40 | volumes: 41 | - .:/var/task 42 | aws-nodejs10.x: 43 | image: lambci/lambda:build-nodejs10.x 44 | working_dir: /var/task/aws-nodejs10.x 45 | volumes: 46 | - .:/var/task 47 | aws-java8: 48 | image: lambci/lambda:build-java8 49 | working_dir: /var/task/aws-java8 50 | volumes: 51 | - .:/var/task 52 | - ~/.m2:/root/.m2 53 | aws-python2.7: 54 | image: lambci/lambda:build-python2.7 55 | working_dir: /var/task/aws-python2.7 56 | volumes: 57 | - .:/var/task 58 | aws-python3.6: 59 | image: lambci/lambda:build-python3.6 60 | working_dir: /var/task/aws-python3.6 61 | volumes: 62 | - .:/var/task 63 | aws-ruby2.5: 64 | image: lambci/lambda:build-ruby2.5 65 | working_dir: /var/task/aws-ruby2.5 66 | volumes: 67 | - .:/var/task 68 | 69 | gcp-nodejs8: 70 | image: launcher.gcr.io/google/nodejs 71 | working_dir: /var/task/gcp-nodejs8 72 | volumes: 73 | - .:/var/task -------------------------------------------------------------------------------- /azure/azure-nodejs/handler.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports.hello = (context, req) => { 4 | 5 | const res = {}; 6 | res.status = 200 7 | res.body = `Hello`; 8 | context.done(null, res); 9 | }; -------------------------------------------------------------------------------- /azure/azure-nodejs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "azure-nodejs", 3 | "version": "0.1.0", 4 | "author": "Yunspace", 5 | "dependencies": { 6 | "serverless-azure-functions": "^1.0.0-11" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /azure/azure-nodejs/serverless.yml: -------------------------------------------------------------------------------- 1 | service: azure-nodejs 2 | 3 | provider: 4 | name: azure 5 | location: East US 6 | 7 | plugins: 8 | - serverless-azure-functions 9 | 10 | package: 11 | exclude: 12 | - node_modules/** 13 | - .gitignore 14 | - package.json 15 | - .git/** 16 | 17 | functions: 18 | hello: 19 | handler: handler.hello 20 | events: 21 | - http: true 22 | x-azure-settings: 23 | authLevel: anonymous -------------------------------------------------------------------------------- /gcp/.env.template: -------------------------------------------------------------------------------- 1 | REGION 2 | SERVERLESS_ACCESS_KEY 3 | 4 | SERVERLESS_ACCESS_KEY 5 | 6 | GCP_PYTHON37_URL 7 | GCP_NODEJS10_URL 8 | GCP_NODEJS8_URL 9 | GCP_GO111_URL -------------------------------------------------------------------------------- /gcp/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIMES ?= $(shell ls -d */) 2 | 3 | .env: 4 | cp .env.template .env 5 | 6 | all: .env 7 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME) && make && cd ..;) 8 | 9 | package: .env 10 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME) && make package && cd ..;) 11 | 12 | deploy: .env 13 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME); make deploy && cd ..;) 14 | 15 | baseLine: .env 16 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME); make baseLine && cd ..;) 17 | 18 | report: .env 19 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME); make report && cd ..;) 20 | 21 | clean: .env 22 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME); make clean && cd ..;) 23 | 24 | remove: .env 25 | @$(foreach RUNTIME, $(RUNTIMES),cd $(RUNTIME); make remove && cd ..;) 26 | 27 | reset: .env 28 | @$(foreach RUNTIME, $(RUNTIMES), $(call resetDynamo, $(RUNTIME)) ) 29 | 30 | define resetDynamo 31 | echo "deleting items in $(RUNTIME)" 32 | aws dynamodb scan \ 33 | --region $(AWS_REGION) --table-name $(subst /,,$(1)) --attributes-to-get "id" --query "Items[].id.S" --output text | tr "\t" "\n" | \ 34 | xargs -t -I keyvalue aws dynamodb delete-item --table-name $TABLE_NAME --key '{"id": {"S": "keyvalue"}}' 35 | endef 36 | 37 | -------------------------------------------------------------------------------- /gcp/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.4' 2 | services: 3 | sls: 4 | image: amaysim/serverless:1.49.0 5 | env_file: .env 6 | # entrypoint: serverless 7 | volumes: 8 | - ~/.gcloud:/root/.gcloud 9 | - ../:/opt/app 10 | artillery: 11 | image: serverlesscloud/artillery 12 | env_file: .env 13 | working_dir: /artillery 14 | volumes: 15 | - ../artillery:/artillery 16 | gcp-nodejs8: 17 | image: nodjs:8 18 | working_dir: /var/task/gcp/gcp-nodejs8 19 | volumes: 20 | - ../:/var/task 21 | gcp-nodejs10: 22 | image: node:10 23 | working_dir: /var/task/gcp/gcp-nodejs10 24 | volumes: 25 | - ../:/var/task 26 | gcp-go111: 27 | image: golang:11 28 | working_dir: /var/task/gcp/gcp-go111 29 | volumes: 30 | - ../:/var/task 31 | gcp-python37: 32 | image: python:3.7 33 | working_dir: /var/task/gcp/gcp-python37 34 | volumes: 35 | - ../:/var/task -------------------------------------------------------------------------------- /gcp/gcp-go111/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=gcp-go111 2 | 3 | include ../../shared.mk 4 | 5 | # Internals 6 | _clean: 7 | rm -rf .serverless bin node_modules 8 | 9 | _build: 10 | npm install --ignore-scripts -------------------------------------------------------------------------------- /gcp/gcp-go111/function.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | exports.hello = (request, response) => { 4 | response.status(200).send('hello'); 5 | }; 6 | 7 | exports.users = (request, response) => { 8 | switch (request.method) { 9 | case 'GET': 10 | response.status(200).send('user'); 11 | break; 12 | case 'PUT': 13 | response.status(201).send('created'); 14 | break; 15 | default: 16 | response.status(500).send('unsupported method'); 17 | break; 18 | } 19 | }; -------------------------------------------------------------------------------- /gcp/gcp-go111/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-nodejs", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abort-controller": { 8 | "version": "3.0.0", 9 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 10 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 11 | "requires": { 12 | "event-target-shim": "^5.0.0" 13 | } 14 | }, 15 | "agent-base": { 16 | "version": "4.3.0", 17 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 18 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 19 | "requires": { 20 | "es6-promisify": "^5.0.0" 21 | } 22 | }, 23 | "ansi-regex": { 24 | "version": "2.1.1", 25 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 26 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 27 | }, 28 | "ansi-styles": { 29 | "version": "2.2.1", 30 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 31 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 32 | }, 33 | "async": { 34 | "version": "2.6.3", 35 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 36 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", 37 | "requires": { 38 | "lodash": "^4.17.14" 39 | } 40 | }, 41 | "axios": { 42 | "version": "0.18.1", 43 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", 44 | "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", 45 | "requires": { 46 | "follow-redirects": "1.5.10", 47 | "is-buffer": "^2.0.2" 48 | } 49 | }, 50 | "bluebird": { 51 | "version": "3.5.5", 52 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", 53 | "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" 54 | }, 55 | "buffer-equal-constant-time": { 56 | "version": "1.0.1", 57 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 58 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 59 | }, 60 | "chalk": { 61 | "version": "1.1.3", 62 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 63 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 64 | "requires": { 65 | "ansi-styles": "^2.2.1", 66 | "escape-string-regexp": "^1.0.2", 67 | "has-ansi": "^2.0.0", 68 | "strip-ansi": "^3.0.0", 69 | "supports-color": "^2.0.0" 70 | } 71 | }, 72 | "debug": { 73 | "version": "3.1.0", 74 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 75 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 76 | "requires": { 77 | "ms": "2.0.0" 78 | } 79 | }, 80 | "ecdsa-sig-formatter": { 81 | "version": "1.0.11", 82 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 83 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 84 | "requires": { 85 | "safe-buffer": "^5.0.1" 86 | } 87 | }, 88 | "es6-promise": { 89 | "version": "4.2.8", 90 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 91 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 92 | }, 93 | "es6-promisify": { 94 | "version": "5.0.0", 95 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 96 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 97 | "requires": { 98 | "es6-promise": "^4.0.3" 99 | } 100 | }, 101 | "escape-string-regexp": { 102 | "version": "1.0.5", 103 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 104 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 105 | }, 106 | "event-target-shim": { 107 | "version": "5.0.1", 108 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 109 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 110 | }, 111 | "extend": { 112 | "version": "3.0.2", 113 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 114 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 115 | }, 116 | "follow-redirects": { 117 | "version": "1.5.10", 118 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 119 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 120 | "requires": { 121 | "debug": "=3.1.0" 122 | } 123 | }, 124 | "fs-extra": { 125 | "version": "3.0.1", 126 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", 127 | "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", 128 | "requires": { 129 | "graceful-fs": "^4.1.2", 130 | "jsonfile": "^3.0.0", 131 | "universalify": "^0.1.0" 132 | } 133 | }, 134 | "gaxios": { 135 | "version": "1.8.4", 136 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.4.tgz", 137 | "integrity": "sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==", 138 | "requires": { 139 | "abort-controller": "^3.0.0", 140 | "extend": "^3.0.2", 141 | "https-proxy-agent": "^2.2.1", 142 | "node-fetch": "^2.3.0" 143 | } 144 | }, 145 | "gcp-metadata": { 146 | "version": "0.6.3", 147 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", 148 | "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", 149 | "requires": { 150 | "axios": "^0.18.0", 151 | "extend": "^3.0.1", 152 | "retry-axios": "0.3.2" 153 | } 154 | }, 155 | "google-auth-library": { 156 | "version": "1.6.1", 157 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.6.1.tgz", 158 | "integrity": "sha512-jYiWC8NA9n9OtQM7ANn0Tk464do9yhKEtaJ72pKcaBiEwn4LwcGYIYOfwtfsSm3aur/ed3tlSxbmg24IAT6gAg==", 159 | "requires": { 160 | "axios": "^0.18.0", 161 | "gcp-metadata": "^0.6.3", 162 | "gtoken": "^2.3.0", 163 | "jws": "^3.1.5", 164 | "lodash.isstring": "^4.0.1", 165 | "lru-cache": "^4.1.3", 166 | "retry-axios": "^0.3.2" 167 | } 168 | }, 169 | "google-p12-pem": { 170 | "version": "1.0.4", 171 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz", 172 | "integrity": "sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==", 173 | "requires": { 174 | "node-forge": "^0.8.0", 175 | "pify": "^4.0.0" 176 | }, 177 | "dependencies": { 178 | "pify": { 179 | "version": "4.0.1", 180 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 181 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 182 | } 183 | } 184 | }, 185 | "googleapis": { 186 | "version": "32.0.0", 187 | "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-32.0.0.tgz", 188 | "integrity": "sha512-UUPvQnztLkpkAt8cs2Zw/uVqCGbl9FuJbhqdvWIHr8RX7zrdemPQWkIrW7clyjhSZceHlnMya4U3tuQ4BXSxIQ==", 189 | "requires": { 190 | "google-auth-library": "^1.4.0", 191 | "pify": "^3.0.0", 192 | "qs": "^6.5.2", 193 | "url-template": "^2.0.8", 194 | "uuid": "^3.2.1" 195 | }, 196 | "dependencies": { 197 | "uuid": { 198 | "version": "3.3.2", 199 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 200 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 201 | } 202 | } 203 | }, 204 | "graceful-fs": { 205 | "version": "4.2.1", 206 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", 207 | "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==" 208 | }, 209 | "gtoken": { 210 | "version": "2.3.3", 211 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", 212 | "integrity": "sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==", 213 | "requires": { 214 | "gaxios": "^1.0.4", 215 | "google-p12-pem": "^1.0.0", 216 | "jws": "^3.1.5", 217 | "mime": "^2.2.0", 218 | "pify": "^4.0.0" 219 | }, 220 | "dependencies": { 221 | "pify": { 222 | "version": "4.0.1", 223 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 224 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 225 | } 226 | } 227 | }, 228 | "has-ansi": { 229 | "version": "2.0.0", 230 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 231 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 232 | "requires": { 233 | "ansi-regex": "^2.0.0" 234 | } 235 | }, 236 | "https-proxy-agent": { 237 | "version": "2.2.2", 238 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", 239 | "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", 240 | "requires": { 241 | "agent-base": "^4.3.0", 242 | "debug": "^3.1.0" 243 | } 244 | }, 245 | "is-buffer": { 246 | "version": "2.0.3", 247 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", 248 | "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" 249 | }, 250 | "jsonfile": { 251 | "version": "3.0.1", 252 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", 253 | "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", 254 | "requires": { 255 | "graceful-fs": "^4.1.6" 256 | } 257 | }, 258 | "jwa": { 259 | "version": "1.4.1", 260 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 261 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 262 | "requires": { 263 | "buffer-equal-constant-time": "1.0.1", 264 | "ecdsa-sig-formatter": "1.0.11", 265 | "safe-buffer": "^5.0.1" 266 | } 267 | }, 268 | "jws": { 269 | "version": "3.2.2", 270 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 271 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 272 | "requires": { 273 | "jwa": "^1.4.1", 274 | "safe-buffer": "^5.0.1" 275 | } 276 | }, 277 | "lodash": { 278 | "version": "4.17.15", 279 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 280 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 281 | }, 282 | "lodash.isstring": { 283 | "version": "4.0.1", 284 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 285 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 286 | }, 287 | "lru-cache": { 288 | "version": "4.1.5", 289 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 290 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 291 | "requires": { 292 | "pseudomap": "^1.0.2", 293 | "yallist": "^2.1.2" 294 | } 295 | }, 296 | "mime": { 297 | "version": "2.4.4", 298 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", 299 | "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" 300 | }, 301 | "ms": { 302 | "version": "2.0.0", 303 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 304 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 305 | }, 306 | "node-fetch": { 307 | "version": "2.6.0", 308 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 309 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" 310 | }, 311 | "node-forge": { 312 | "version": "0.8.5", 313 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz", 314 | "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==" 315 | }, 316 | "pify": { 317 | "version": "3.0.0", 318 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 319 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 320 | }, 321 | "pseudomap": { 322 | "version": "1.0.2", 323 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 324 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 325 | }, 326 | "qs": { 327 | "version": "6.7.0", 328 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 329 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 330 | }, 331 | "retry-axios": { 332 | "version": "0.3.2", 333 | "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-0.3.2.tgz", 334 | "integrity": "sha512-jp4YlI0qyDFfXiXGhkCOliBN1G7fRH03Nqy8YdShzGqbY5/9S2x/IR6C88ls2DFkbWuL3ASkP7QD3pVrNpPgwQ==" 335 | }, 336 | "safe-buffer": { 337 | "version": "5.2.0", 338 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 339 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 340 | }, 341 | "serverless-google-cloudfunctions": { 342 | "version": "2.3.2", 343 | "resolved": "https://registry.npmjs.org/serverless-google-cloudfunctions/-/serverless-google-cloudfunctions-2.3.2.tgz", 344 | "integrity": "sha512-aDIpoZ7laJNI+HgXn5ktCUxyyMkqUBX2oNNd7TDKtgIs4eQyjKelUQPf5C+89HdolEsDyqRKag3/ok2g085Q7w==", 345 | "requires": { 346 | "async": "^2.1.4", 347 | "bluebird": "^3.4.7", 348 | "chalk": "^1.1.3", 349 | "fs-extra": "^3.0.1", 350 | "googleapis": "^32.0.0", 351 | "lodash": "^4.17.4" 352 | } 353 | }, 354 | "strip-ansi": { 355 | "version": "3.0.1", 356 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 357 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 358 | "requires": { 359 | "ansi-regex": "^2.0.0" 360 | } 361 | }, 362 | "supports-color": { 363 | "version": "2.0.0", 364 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 365 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 366 | }, 367 | "universalify": { 368 | "version": "0.1.2", 369 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 370 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 371 | }, 372 | "url-template": { 373 | "version": "2.0.8", 374 | "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", 375 | "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" 376 | }, 377 | "uuid": { 378 | "version": "2.0.3", 379 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", 380 | "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" 381 | }, 382 | "yallist": { 383 | "version": "2.1.2", 384 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 385 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 386 | } 387 | } 388 | } 389 | -------------------------------------------------------------------------------- /gcp/gcp-go111/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-nodejs", 3 | "version": "0.1.0", 4 | "description": "An example of making http endpoints with the Google Cloud Functions Serverless Framework plugin.", 5 | "main": "function.js", 6 | "dependencies": { 7 | "uuid": "^2.0.3", 8 | "serverless-google-cloudfunctions": "^2.3.2" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /gcp/gcp-go111/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: gcp-go111 4 | 5 | provider: 6 | name: google 7 | memorySize: 1024 8 | runtime: go111 9 | region: us-east4 10 | project: serverless-cloud-benchmark 11 | credentials: ~/.gcloud/benchmark.json # path must be absolute 12 | 13 | plugins: 14 | - serverless-google-cloudfunctions 15 | 16 | package: 17 | exclude: 18 | - node_modules/** 19 | - .gitignore 20 | - .git/** 21 | 22 | functions: 23 | gcp-go111-hello: 24 | handler: hello 25 | events: 26 | - http: /hello -------------------------------------------------------------------------------- /gcp/gcp-nodejs10/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=gcp-nodejs10 2 | 3 | include ../../shared.mk 4 | 5 | # Internals 6 | _clean: 7 | rm -rf .serverless bin node_modules 8 | 9 | _build: 10 | npm install --ignore-scripts -------------------------------------------------------------------------------- /gcp/gcp-nodejs10/function.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | exports.hello = (request, response) => { 4 | response.status(200).send('hello'); 5 | }; -------------------------------------------------------------------------------- /gcp/gcp-nodejs10/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-nodejs10", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abort-controller": { 8 | "version": "3.0.0", 9 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 10 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 11 | "requires": { 12 | "event-target-shim": "^5.0.0" 13 | } 14 | }, 15 | "agent-base": { 16 | "version": "4.3.0", 17 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 18 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 19 | "requires": { 20 | "es6-promisify": "^5.0.0" 21 | } 22 | }, 23 | "ansi-regex": { 24 | "version": "2.1.1", 25 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 26 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 27 | }, 28 | "ansi-styles": { 29 | "version": "2.2.1", 30 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 31 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 32 | }, 33 | "async": { 34 | "version": "2.6.3", 35 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 36 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", 37 | "requires": { 38 | "lodash": "^4.17.14" 39 | } 40 | }, 41 | "axios": { 42 | "version": "0.18.1", 43 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", 44 | "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", 45 | "requires": { 46 | "follow-redirects": "1.5.10", 47 | "is-buffer": "^2.0.2" 48 | } 49 | }, 50 | "bluebird": { 51 | "version": "3.5.5", 52 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", 53 | "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" 54 | }, 55 | "buffer-equal-constant-time": { 56 | "version": "1.0.1", 57 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 58 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 59 | }, 60 | "chalk": { 61 | "version": "1.1.3", 62 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 63 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 64 | "requires": { 65 | "ansi-styles": "^2.2.1", 66 | "escape-string-regexp": "^1.0.2", 67 | "has-ansi": "^2.0.0", 68 | "strip-ansi": "^3.0.0", 69 | "supports-color": "^2.0.0" 70 | } 71 | }, 72 | "debug": { 73 | "version": "3.1.0", 74 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 75 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 76 | "requires": { 77 | "ms": "2.0.0" 78 | } 79 | }, 80 | "ecdsa-sig-formatter": { 81 | "version": "1.0.11", 82 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 83 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 84 | "requires": { 85 | "safe-buffer": "^5.0.1" 86 | } 87 | }, 88 | "es6-promise": { 89 | "version": "4.2.8", 90 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 91 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 92 | }, 93 | "es6-promisify": { 94 | "version": "5.0.0", 95 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 96 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 97 | "requires": { 98 | "es6-promise": "^4.0.3" 99 | } 100 | }, 101 | "escape-string-regexp": { 102 | "version": "1.0.5", 103 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 104 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 105 | }, 106 | "event-target-shim": { 107 | "version": "5.0.1", 108 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 109 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 110 | }, 111 | "extend": { 112 | "version": "3.0.2", 113 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 114 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 115 | }, 116 | "follow-redirects": { 117 | "version": "1.5.10", 118 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 119 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 120 | "requires": { 121 | "debug": "=3.1.0" 122 | } 123 | }, 124 | "fs-extra": { 125 | "version": "3.0.1", 126 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", 127 | "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", 128 | "requires": { 129 | "graceful-fs": "^4.1.2", 130 | "jsonfile": "^3.0.0", 131 | "universalify": "^0.1.0" 132 | } 133 | }, 134 | "gaxios": { 135 | "version": "1.8.4", 136 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.4.tgz", 137 | "integrity": "sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==", 138 | "requires": { 139 | "abort-controller": "^3.0.0", 140 | "extend": "^3.0.2", 141 | "https-proxy-agent": "^2.2.1", 142 | "node-fetch": "^2.3.0" 143 | } 144 | }, 145 | "gcp-metadata": { 146 | "version": "0.6.3", 147 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", 148 | "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", 149 | "requires": { 150 | "axios": "^0.18.0", 151 | "extend": "^3.0.1", 152 | "retry-axios": "0.3.2" 153 | } 154 | }, 155 | "google-auth-library": { 156 | "version": "1.6.1", 157 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.6.1.tgz", 158 | "integrity": "sha512-jYiWC8NA9n9OtQM7ANn0Tk464do9yhKEtaJ72pKcaBiEwn4LwcGYIYOfwtfsSm3aur/ed3tlSxbmg24IAT6gAg==", 159 | "requires": { 160 | "axios": "^0.18.0", 161 | "gcp-metadata": "^0.6.3", 162 | "gtoken": "^2.3.0", 163 | "jws": "^3.1.5", 164 | "lodash.isstring": "^4.0.1", 165 | "lru-cache": "^4.1.3", 166 | "retry-axios": "^0.3.2" 167 | } 168 | }, 169 | "google-p12-pem": { 170 | "version": "1.0.4", 171 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz", 172 | "integrity": "sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==", 173 | "requires": { 174 | "node-forge": "^0.8.0", 175 | "pify": "^4.0.0" 176 | }, 177 | "dependencies": { 178 | "pify": { 179 | "version": "4.0.1", 180 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 181 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 182 | } 183 | } 184 | }, 185 | "googleapis": { 186 | "version": "32.0.0", 187 | "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-32.0.0.tgz", 188 | "integrity": "sha512-UUPvQnztLkpkAt8cs2Zw/uVqCGbl9FuJbhqdvWIHr8RX7zrdemPQWkIrW7clyjhSZceHlnMya4U3tuQ4BXSxIQ==", 189 | "requires": { 190 | "google-auth-library": "^1.4.0", 191 | "pify": "^3.0.0", 192 | "qs": "^6.5.2", 193 | "url-template": "^2.0.8", 194 | "uuid": "^3.2.1" 195 | }, 196 | "dependencies": { 197 | "uuid": { 198 | "version": "3.3.2", 199 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 200 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 201 | } 202 | } 203 | }, 204 | "graceful-fs": { 205 | "version": "4.2.1", 206 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", 207 | "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==" 208 | }, 209 | "gtoken": { 210 | "version": "2.3.3", 211 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", 212 | "integrity": "sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==", 213 | "requires": { 214 | "gaxios": "^1.0.4", 215 | "google-p12-pem": "^1.0.0", 216 | "jws": "^3.1.5", 217 | "mime": "^2.2.0", 218 | "pify": "^4.0.0" 219 | }, 220 | "dependencies": { 221 | "pify": { 222 | "version": "4.0.1", 223 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 224 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 225 | } 226 | } 227 | }, 228 | "has-ansi": { 229 | "version": "2.0.0", 230 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 231 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 232 | "requires": { 233 | "ansi-regex": "^2.0.0" 234 | } 235 | }, 236 | "https-proxy-agent": { 237 | "version": "2.2.2", 238 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", 239 | "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", 240 | "requires": { 241 | "agent-base": "^4.3.0", 242 | "debug": "^3.1.0" 243 | } 244 | }, 245 | "is-buffer": { 246 | "version": "2.0.3", 247 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", 248 | "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" 249 | }, 250 | "jsonfile": { 251 | "version": "3.0.1", 252 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", 253 | "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", 254 | "requires": { 255 | "graceful-fs": "^4.1.6" 256 | } 257 | }, 258 | "jwa": { 259 | "version": "1.4.1", 260 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 261 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 262 | "requires": { 263 | "buffer-equal-constant-time": "1.0.1", 264 | "ecdsa-sig-formatter": "1.0.11", 265 | "safe-buffer": "^5.0.1" 266 | } 267 | }, 268 | "jws": { 269 | "version": "3.2.2", 270 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 271 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 272 | "requires": { 273 | "jwa": "^1.4.1", 274 | "safe-buffer": "^5.0.1" 275 | } 276 | }, 277 | "lodash": { 278 | "version": "4.17.15", 279 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 280 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 281 | }, 282 | "lodash.isstring": { 283 | "version": "4.0.1", 284 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 285 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 286 | }, 287 | "lru-cache": { 288 | "version": "4.1.5", 289 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 290 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 291 | "requires": { 292 | "pseudomap": "^1.0.2", 293 | "yallist": "^2.1.2" 294 | } 295 | }, 296 | "mime": { 297 | "version": "2.4.4", 298 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", 299 | "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" 300 | }, 301 | "ms": { 302 | "version": "2.0.0", 303 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 304 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 305 | }, 306 | "node-fetch": { 307 | "version": "2.6.0", 308 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 309 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" 310 | }, 311 | "node-forge": { 312 | "version": "0.8.5", 313 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz", 314 | "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==" 315 | }, 316 | "pify": { 317 | "version": "3.0.0", 318 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 319 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 320 | }, 321 | "pseudomap": { 322 | "version": "1.0.2", 323 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 324 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 325 | }, 326 | "qs": { 327 | "version": "6.7.0", 328 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 329 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 330 | }, 331 | "retry-axios": { 332 | "version": "0.3.2", 333 | "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-0.3.2.tgz", 334 | "integrity": "sha512-jp4YlI0qyDFfXiXGhkCOliBN1G7fRH03Nqy8YdShzGqbY5/9S2x/IR6C88ls2DFkbWuL3ASkP7QD3pVrNpPgwQ==" 335 | }, 336 | "safe-buffer": { 337 | "version": "5.2.0", 338 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 339 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 340 | }, 341 | "serverless-google-cloudfunctions": { 342 | "version": "2.3.2", 343 | "resolved": "https://registry.npmjs.org/serverless-google-cloudfunctions/-/serverless-google-cloudfunctions-2.3.2.tgz", 344 | "integrity": "sha512-aDIpoZ7laJNI+HgXn5ktCUxyyMkqUBX2oNNd7TDKtgIs4eQyjKelUQPf5C+89HdolEsDyqRKag3/ok2g085Q7w==", 345 | "requires": { 346 | "async": "^2.1.4", 347 | "bluebird": "^3.4.7", 348 | "chalk": "^1.1.3", 349 | "fs-extra": "^3.0.1", 350 | "googleapis": "^32.0.0", 351 | "lodash": "^4.17.4" 352 | } 353 | }, 354 | "strip-ansi": { 355 | "version": "3.0.1", 356 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 357 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 358 | "requires": { 359 | "ansi-regex": "^2.0.0" 360 | } 361 | }, 362 | "supports-color": { 363 | "version": "2.0.0", 364 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 365 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 366 | }, 367 | "universalify": { 368 | "version": "0.1.2", 369 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 370 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 371 | }, 372 | "url-template": { 373 | "version": "2.0.8", 374 | "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", 375 | "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" 376 | }, 377 | "uuid": { 378 | "version": "2.0.3", 379 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", 380 | "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" 381 | }, 382 | "yallist": { 383 | "version": "2.1.2", 384 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 385 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 386 | } 387 | } 388 | } 389 | -------------------------------------------------------------------------------- /gcp/gcp-nodejs10/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-nodejs10", 3 | "version": "0.1.0", 4 | "description": "An example of making http endpoints with the Google Cloud Functions Serverless Framework plugin.", 5 | "main": "function.js", 6 | "dependencies": { 7 | "uuid": "^2.0.3", 8 | "serverless-google-cloudfunctions": "^2.3.2" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /gcp/gcp-nodejs10/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: gcp-nodejs10 4 | 5 | provider: 6 | name: google 7 | memorySize: 1024 8 | runtime: nodejs10 9 | region: us-east4 10 | project: serverless-cloud-benchmarks 11 | credentials: ~/.gcloud/serverless-cloud-benchmarks.json # path must be absolute 12 | 13 | plugins: 14 | - serverless-google-cloudfunctions 15 | 16 | package: 17 | exclude: 18 | - node_modules/** 19 | - .gitignore 20 | - .git/** 21 | 22 | functions: 23 | gcp-nodejs10-hello: 24 | handler: hello 25 | events: 26 | - http: gcp-nodejs10/hello -------------------------------------------------------------------------------- /gcp/gcp-nodejs8/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=gcp-nodejs8 2 | 3 | include ../../shared.mk 4 | 5 | # Internals 6 | _clean: 7 | rm -rf .serverless bin node_modules 8 | 9 | _build: 10 | npm install --ignore-scripts -------------------------------------------------------------------------------- /gcp/gcp-nodejs8/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | exports.hello = (request, response) => { 4 | response.status(200).send('hello'); 5 | }; -------------------------------------------------------------------------------- /gcp/gcp-nodejs8/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gcp-nodejs8", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abort-controller": { 8 | "version": "3.0.0", 9 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 10 | "integrity": "sha1-6vVNU7YrrkE46AnKIlyEOabvs5I=", 11 | "dev": true, 12 | "requires": { 13 | "event-target-shim": "^5.0.0" 14 | } 15 | }, 16 | "agent-base": { 17 | "version": "4.3.0", 18 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 19 | "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=", 20 | "dev": true, 21 | "requires": { 22 | "es6-promisify": "^5.0.0" 23 | } 24 | }, 25 | "ansi-regex": { 26 | "version": "2.1.1", 27 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 28 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 29 | "dev": true 30 | }, 31 | "ansi-styles": { 32 | "version": "2.2.1", 33 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 34 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 35 | "dev": true 36 | }, 37 | "async": { 38 | "version": "2.6.3", 39 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 40 | "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", 41 | "dev": true, 42 | "requires": { 43 | "lodash": "^4.17.14" 44 | } 45 | }, 46 | "axios": { 47 | "version": "0.18.1", 48 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", 49 | "integrity": "sha1-/z8N4ue10YDnV62YAA8Qgbh7zqM=", 50 | "dev": true, 51 | "requires": { 52 | "follow-redirects": "1.5.10", 53 | "is-buffer": "^2.0.2" 54 | } 55 | }, 56 | "bluebird": { 57 | "version": "3.5.5", 58 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", 59 | "integrity": "sha1-qNCv1zJR7/u9X+OEp31zADwXpx8=", 60 | "dev": true 61 | }, 62 | "buffer-equal-constant-time": { 63 | "version": "1.0.1", 64 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 65 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", 66 | "dev": true 67 | }, 68 | "chalk": { 69 | "version": "1.1.3", 70 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 71 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 72 | "dev": true, 73 | "requires": { 74 | "ansi-styles": "^2.2.1", 75 | "escape-string-regexp": "^1.0.2", 76 | "has-ansi": "^2.0.0", 77 | "strip-ansi": "^3.0.0", 78 | "supports-color": "^2.0.0" 79 | } 80 | }, 81 | "debug": { 82 | "version": "3.1.0", 83 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 84 | "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", 85 | "dev": true, 86 | "requires": { 87 | "ms": "2.0.0" 88 | } 89 | }, 90 | "ecdsa-sig-formatter": { 91 | "version": "1.0.11", 92 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 93 | "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8=", 94 | "dev": true, 95 | "requires": { 96 | "safe-buffer": "^5.0.1" 97 | } 98 | }, 99 | "es6-promise": { 100 | "version": "4.2.8", 101 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 102 | "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=", 103 | "dev": true 104 | }, 105 | "es6-promisify": { 106 | "version": "5.0.0", 107 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 108 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 109 | "dev": true, 110 | "requires": { 111 | "es6-promise": "^4.0.3" 112 | } 113 | }, 114 | "escape-string-regexp": { 115 | "version": "1.0.5", 116 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 117 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 118 | "dev": true 119 | }, 120 | "event-target-shim": { 121 | "version": "5.0.1", 122 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 123 | "integrity": "sha1-XU0+vflYPWOlMzzi3rdICrKwV4k=", 124 | "dev": true 125 | }, 126 | "extend": { 127 | "version": "3.0.2", 128 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 129 | "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", 130 | "dev": true 131 | }, 132 | "follow-redirects": { 133 | "version": "1.5.10", 134 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 135 | "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", 136 | "dev": true, 137 | "requires": { 138 | "debug": "=3.1.0" 139 | } 140 | }, 141 | "fs-extra": { 142 | "version": "3.0.1", 143 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", 144 | "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", 145 | "dev": true, 146 | "requires": { 147 | "graceful-fs": "^4.1.2", 148 | "jsonfile": "^3.0.0", 149 | "universalify": "^0.1.0" 150 | } 151 | }, 152 | "gaxios": { 153 | "version": "1.8.4", 154 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.4.tgz", 155 | "integrity": "sha1-4Iw0/pPAqbZ6Ure556ZOZDX5ozk=", 156 | "dev": true, 157 | "requires": { 158 | "abort-controller": "^3.0.0", 159 | "extend": "^3.0.2", 160 | "https-proxy-agent": "^2.2.1", 161 | "node-fetch": "^2.3.0" 162 | } 163 | }, 164 | "gcp-metadata": { 165 | "version": "0.6.3", 166 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", 167 | "integrity": "sha1-RVDAiFnFKLNwRZvXenGH6gvbxKs=", 168 | "dev": true, 169 | "requires": { 170 | "axios": "^0.18.0", 171 | "extend": "^3.0.1", 172 | "retry-axios": "0.3.2" 173 | } 174 | }, 175 | "google-auth-library": { 176 | "version": "1.6.1", 177 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.6.1.tgz", 178 | "integrity": "sha1-nHPYMa1yDAwwSKuJ0P/exxTQfdI=", 179 | "dev": true, 180 | "requires": { 181 | "axios": "^0.18.0", 182 | "gcp-metadata": "^0.6.3", 183 | "gtoken": "^2.3.0", 184 | "jws": "^3.1.5", 185 | "lodash.isstring": "^4.0.1", 186 | "lru-cache": "^4.1.3", 187 | "retry-axios": "^0.3.2" 188 | } 189 | }, 190 | "google-p12-pem": { 191 | "version": "1.0.4", 192 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz", 193 | "integrity": "sha1-t3+4M6Lrn388aJ4uVPCVJ293dgU=", 194 | "dev": true, 195 | "requires": { 196 | "node-forge": "^0.8.0", 197 | "pify": "^4.0.0" 198 | }, 199 | "dependencies": { 200 | "pify": { 201 | "version": "4.0.1", 202 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 203 | "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", 204 | "dev": true 205 | } 206 | } 207 | }, 208 | "googleapis": { 209 | "version": "32.0.0", 210 | "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-32.0.0.tgz", 211 | "integrity": "sha1-BHldGVZWhUa7PjzKPK4pp1kyZJM=", 212 | "dev": true, 213 | "requires": { 214 | "google-auth-library": "^1.4.0", 215 | "pify": "^3.0.0", 216 | "qs": "^6.5.2", 217 | "url-template": "^2.0.8", 218 | "uuid": "^3.2.1" 219 | }, 220 | "dependencies": { 221 | "uuid": { 222 | "version": "3.3.3", 223 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 224 | "integrity": "sha1-RWjwIW54dg7h2/Ok0s9T4iQRKGY=", 225 | "dev": true 226 | } 227 | } 228 | }, 229 | "graceful-fs": { 230 | "version": "4.2.1", 231 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", 232 | "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==", 233 | "dev": true 234 | }, 235 | "gtoken": { 236 | "version": "2.3.3", 237 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", 238 | "integrity": "sha1-in/hVcXODEtxyIbPsoKpBg2UpkE=", 239 | "dev": true, 240 | "requires": { 241 | "gaxios": "^1.0.4", 242 | "google-p12-pem": "^1.0.0", 243 | "jws": "^3.1.5", 244 | "mime": "^2.2.0", 245 | "pify": "^4.0.0" 246 | }, 247 | "dependencies": { 248 | "pify": { 249 | "version": "4.0.1", 250 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 251 | "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", 252 | "dev": true 253 | } 254 | } 255 | }, 256 | "has-ansi": { 257 | "version": "2.0.0", 258 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 259 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 260 | "dev": true, 261 | "requires": { 262 | "ansi-regex": "^2.0.0" 263 | } 264 | }, 265 | "https-proxy-agent": { 266 | "version": "2.2.2", 267 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", 268 | "integrity": "sha1-Jx6o6Q+DasnxGdrM05wZ/337B5M=", 269 | "dev": true, 270 | "requires": { 271 | "agent-base": "^4.3.0", 272 | "debug": "^3.1.0" 273 | } 274 | }, 275 | "is-buffer": { 276 | "version": "2.0.3", 277 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", 278 | "integrity": "sha1-Ts8/z3ScvR5HJonhCaxmJhol5yU=", 279 | "dev": true 280 | }, 281 | "jsonfile": { 282 | "version": "3.0.1", 283 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", 284 | "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", 285 | "dev": true, 286 | "requires": { 287 | "graceful-fs": "^4.1.6" 288 | } 289 | }, 290 | "jwa": { 291 | "version": "1.4.1", 292 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 293 | "integrity": "sha1-dDwymFy56YZVUw1TZBtmyGRbA5o=", 294 | "dev": true, 295 | "requires": { 296 | "buffer-equal-constant-time": "1.0.1", 297 | "ecdsa-sig-formatter": "1.0.11", 298 | "safe-buffer": "^5.0.1" 299 | } 300 | }, 301 | "jws": { 302 | "version": "3.2.2", 303 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 304 | "integrity": "sha1-ABCZ82OUaMlBQADpmZX6UvtHgwQ=", 305 | "dev": true, 306 | "requires": { 307 | "jwa": "^1.4.1", 308 | "safe-buffer": "^5.0.1" 309 | } 310 | }, 311 | "lodash": { 312 | "version": "4.17.15", 313 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 314 | "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", 315 | "dev": true 316 | }, 317 | "lodash.isstring": { 318 | "version": "4.0.1", 319 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 320 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", 321 | "dev": true 322 | }, 323 | "lru-cache": { 324 | "version": "4.1.5", 325 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 326 | "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", 327 | "dev": true, 328 | "requires": { 329 | "pseudomap": "^1.0.2", 330 | "yallist": "^2.1.2" 331 | } 332 | }, 333 | "mime": { 334 | "version": "2.4.4", 335 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", 336 | "integrity": "sha1-vXuRE1/GsBzePpuuM9ZZtj2IV+U=", 337 | "dev": true 338 | }, 339 | "ms": { 340 | "version": "2.0.0", 341 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 342 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 343 | "dev": true 344 | }, 345 | "node-fetch": { 346 | "version": "2.6.0", 347 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 348 | "integrity": "sha1-5jNFY4bUqlWGP2dqerDaqP3ssP0=", 349 | "dev": true 350 | }, 351 | "node-forge": { 352 | "version": "0.8.5", 353 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz", 354 | "integrity": "sha1-V5BvB2FNxydiyEzvRC9CfA4bhu4=", 355 | "dev": true 356 | }, 357 | "pify": { 358 | "version": "3.0.0", 359 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 360 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 361 | "dev": true 362 | }, 363 | "pseudomap": { 364 | "version": "1.0.2", 365 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 366 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 367 | "dev": true 368 | }, 369 | "qs": { 370 | "version": "6.7.0", 371 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 372 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", 373 | "dev": true 374 | }, 375 | "retry-axios": { 376 | "version": "0.3.2", 377 | "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-0.3.2.tgz", 378 | "integrity": "sha1-V1fID1hbTMTEmGqi/9R6YMbTXhM=", 379 | "dev": true 380 | }, 381 | "safe-buffer": { 382 | "version": "5.2.0", 383 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 384 | "integrity": "sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk=", 385 | "dev": true 386 | }, 387 | "serverless-google-cloudfunctions": { 388 | "version": "2.3.2", 389 | "resolved": "https://registry.npmjs.org/serverless-google-cloudfunctions/-/serverless-google-cloudfunctions-2.3.2.tgz", 390 | "integrity": "sha1-y2QmNrWlZmRuXhWS3Sw8MtaVeRo=", 391 | "dev": true, 392 | "requires": { 393 | "async": "^2.1.4", 394 | "bluebird": "^3.4.7", 395 | "chalk": "^1.1.3", 396 | "fs-extra": "^3.0.1", 397 | "googleapis": "^32.0.0", 398 | "lodash": "^4.17.4" 399 | } 400 | }, 401 | "strip-ansi": { 402 | "version": "3.0.1", 403 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 404 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 405 | "dev": true, 406 | "requires": { 407 | "ansi-regex": "^2.0.0" 408 | } 409 | }, 410 | "supports-color": { 411 | "version": "2.0.0", 412 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 413 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 414 | "dev": true 415 | }, 416 | "universalify": { 417 | "version": "0.1.2", 418 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 419 | "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", 420 | "dev": true 421 | }, 422 | "url-template": { 423 | "version": "2.0.8", 424 | "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", 425 | "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", 426 | "dev": true 427 | }, 428 | "yallist": { 429 | "version": "2.1.2", 430 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 431 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 432 | "dev": true 433 | } 434 | } 435 | } 436 | -------------------------------------------------------------------------------- /gcp/gcp-nodejs8/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gcp-nodejs8", 3 | "version": "0.1.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "serverless.com", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "serverless-google-cloudfunctions": "*" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /gcp/gcp-nodejs8/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: gcp-nodejs8 4 | 5 | provider: 6 | name: google 7 | stage: dev 8 | memorySize: 1024 9 | runtime: nodejs8 10 | region: us-east4 11 | project: serverless-cloud-benchmarks 12 | credentials: ~/.gcloud/serverless-cloud-benchmarks.json 13 | 14 | plugins: 15 | - serverless-google-cloudfunctions 16 | 17 | package: 18 | exclude: 19 | - node_modules/** 20 | - .gitignore 21 | - .git/** 22 | 23 | functions: 24 | gcp-nodejs8-hello: 25 | handler: hello 26 | events: 27 | - http: gcp-nodejs8/hello 28 | -------------------------------------------------------------------------------- /gcp/gcp-python37/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=gcp-python37 2 | 3 | include ../../shared.mk 4 | 5 | # Internals 6 | _clean: 7 | rm -rf .serverless bin node_modules 8 | 9 | _build: 10 | @echo "nothing to build" -------------------------------------------------------------------------------- /gcp/gcp-python37/main.py: -------------------------------------------------------------------------------- 1 | """GCP HTTP Cloud Function Python""" 2 | # -*- coding: utf-8 -*- 3 | 4 | import json 5 | 6 | def hello(request): 7 | response = { 8 | "statusCode": 200, 9 | "body": "hello" 10 | } 11 | 12 | return json.dumps(response, indent=4) -------------------------------------------------------------------------------- /gcp/gcp-python37/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-python37", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abort-controller": { 8 | "version": "3.0.0", 9 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 10 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 11 | "requires": { 12 | "event-target-shim": "^5.0.0" 13 | } 14 | }, 15 | "agent-base": { 16 | "version": "4.3.0", 17 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 18 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 19 | "requires": { 20 | "es6-promisify": "^5.0.0" 21 | } 22 | }, 23 | "ansi-regex": { 24 | "version": "2.1.1", 25 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 26 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 27 | }, 28 | "ansi-styles": { 29 | "version": "2.2.1", 30 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 31 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 32 | }, 33 | "async": { 34 | "version": "2.6.3", 35 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 36 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", 37 | "requires": { 38 | "lodash": "^4.17.14" 39 | } 40 | }, 41 | "axios": { 42 | "version": "0.18.1", 43 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", 44 | "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", 45 | "requires": { 46 | "follow-redirects": "1.5.10", 47 | "is-buffer": "^2.0.2" 48 | } 49 | }, 50 | "bluebird": { 51 | "version": "3.5.5", 52 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", 53 | "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" 54 | }, 55 | "buffer-equal-constant-time": { 56 | "version": "1.0.1", 57 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 58 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 59 | }, 60 | "chalk": { 61 | "version": "1.1.3", 62 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 63 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 64 | "requires": { 65 | "ansi-styles": "^2.2.1", 66 | "escape-string-regexp": "^1.0.2", 67 | "has-ansi": "^2.0.0", 68 | "strip-ansi": "^3.0.0", 69 | "supports-color": "^2.0.0" 70 | } 71 | }, 72 | "debug": { 73 | "version": "3.1.0", 74 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 75 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 76 | "requires": { 77 | "ms": "2.0.0" 78 | } 79 | }, 80 | "ecdsa-sig-formatter": { 81 | "version": "1.0.11", 82 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 83 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 84 | "requires": { 85 | "safe-buffer": "^5.0.1" 86 | } 87 | }, 88 | "es6-promise": { 89 | "version": "4.2.8", 90 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 91 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 92 | }, 93 | "es6-promisify": { 94 | "version": "5.0.0", 95 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 96 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 97 | "requires": { 98 | "es6-promise": "^4.0.3" 99 | } 100 | }, 101 | "escape-string-regexp": { 102 | "version": "1.0.5", 103 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 104 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 105 | }, 106 | "event-target-shim": { 107 | "version": "5.0.1", 108 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 109 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 110 | }, 111 | "extend": { 112 | "version": "3.0.2", 113 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 114 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 115 | }, 116 | "follow-redirects": { 117 | "version": "1.5.10", 118 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 119 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 120 | "requires": { 121 | "debug": "=3.1.0" 122 | } 123 | }, 124 | "fs-extra": { 125 | "version": "3.0.1", 126 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", 127 | "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", 128 | "requires": { 129 | "graceful-fs": "^4.1.2", 130 | "jsonfile": "^3.0.0", 131 | "universalify": "^0.1.0" 132 | } 133 | }, 134 | "gaxios": { 135 | "version": "1.8.4", 136 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.4.tgz", 137 | "integrity": "sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==", 138 | "requires": { 139 | "abort-controller": "^3.0.0", 140 | "extend": "^3.0.2", 141 | "https-proxy-agent": "^2.2.1", 142 | "node-fetch": "^2.3.0" 143 | } 144 | }, 145 | "gcp-metadata": { 146 | "version": "0.6.3", 147 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", 148 | "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", 149 | "requires": { 150 | "axios": "^0.18.0", 151 | "extend": "^3.0.1", 152 | "retry-axios": "0.3.2" 153 | } 154 | }, 155 | "google-auth-library": { 156 | "version": "1.6.1", 157 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.6.1.tgz", 158 | "integrity": "sha512-jYiWC8NA9n9OtQM7ANn0Tk464do9yhKEtaJ72pKcaBiEwn4LwcGYIYOfwtfsSm3aur/ed3tlSxbmg24IAT6gAg==", 159 | "requires": { 160 | "axios": "^0.18.0", 161 | "gcp-metadata": "^0.6.3", 162 | "gtoken": "^2.3.0", 163 | "jws": "^3.1.5", 164 | "lodash.isstring": "^4.0.1", 165 | "lru-cache": "^4.1.3", 166 | "retry-axios": "^0.3.2" 167 | } 168 | }, 169 | "google-p12-pem": { 170 | "version": "1.0.4", 171 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz", 172 | "integrity": "sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==", 173 | "requires": { 174 | "node-forge": "^0.8.0", 175 | "pify": "^4.0.0" 176 | }, 177 | "dependencies": { 178 | "pify": { 179 | "version": "4.0.1", 180 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 181 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 182 | } 183 | } 184 | }, 185 | "googleapis": { 186 | "version": "32.0.0", 187 | "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-32.0.0.tgz", 188 | "integrity": "sha512-UUPvQnztLkpkAt8cs2Zw/uVqCGbl9FuJbhqdvWIHr8RX7zrdemPQWkIrW7clyjhSZceHlnMya4U3tuQ4BXSxIQ==", 189 | "requires": { 190 | "google-auth-library": "^1.4.0", 191 | "pify": "^3.0.0", 192 | "qs": "^6.5.2", 193 | "url-template": "^2.0.8", 194 | "uuid": "^3.2.1" 195 | } 196 | }, 197 | "graceful-fs": { 198 | "version": "4.2.2", 199 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", 200 | "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" 201 | }, 202 | "gtoken": { 203 | "version": "2.3.3", 204 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", 205 | "integrity": "sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==", 206 | "requires": { 207 | "gaxios": "^1.0.4", 208 | "google-p12-pem": "^1.0.0", 209 | "jws": "^3.1.5", 210 | "mime": "^2.2.0", 211 | "pify": "^4.0.0" 212 | }, 213 | "dependencies": { 214 | "pify": { 215 | "version": "4.0.1", 216 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 217 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 218 | } 219 | } 220 | }, 221 | "has-ansi": { 222 | "version": "2.0.0", 223 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 224 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 225 | "requires": { 226 | "ansi-regex": "^2.0.0" 227 | } 228 | }, 229 | "https-proxy-agent": { 230 | "version": "2.2.2", 231 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", 232 | "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", 233 | "requires": { 234 | "agent-base": "^4.3.0", 235 | "debug": "^3.1.0" 236 | } 237 | }, 238 | "is-buffer": { 239 | "version": "2.0.3", 240 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", 241 | "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" 242 | }, 243 | "jsonfile": { 244 | "version": "3.0.1", 245 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", 246 | "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", 247 | "requires": { 248 | "graceful-fs": "^4.1.6" 249 | } 250 | }, 251 | "jwa": { 252 | "version": "1.4.1", 253 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 254 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 255 | "requires": { 256 | "buffer-equal-constant-time": "1.0.1", 257 | "ecdsa-sig-formatter": "1.0.11", 258 | "safe-buffer": "^5.0.1" 259 | } 260 | }, 261 | "jws": { 262 | "version": "3.2.2", 263 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 264 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 265 | "requires": { 266 | "jwa": "^1.4.1", 267 | "safe-buffer": "^5.0.1" 268 | } 269 | }, 270 | "lodash": { 271 | "version": "4.17.15", 272 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 273 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 274 | }, 275 | "lodash.isstring": { 276 | "version": "4.0.1", 277 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 278 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 279 | }, 280 | "lru-cache": { 281 | "version": "4.1.5", 282 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 283 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 284 | "requires": { 285 | "pseudomap": "^1.0.2", 286 | "yallist": "^2.1.2" 287 | } 288 | }, 289 | "mime": { 290 | "version": "2.4.4", 291 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", 292 | "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" 293 | }, 294 | "ms": { 295 | "version": "2.0.0", 296 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 297 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 298 | }, 299 | "node-fetch": { 300 | "version": "2.6.0", 301 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 302 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" 303 | }, 304 | "node-forge": { 305 | "version": "0.8.5", 306 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz", 307 | "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==" 308 | }, 309 | "pify": { 310 | "version": "3.0.0", 311 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 312 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 313 | }, 314 | "pseudomap": { 315 | "version": "1.0.2", 316 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 317 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 318 | }, 319 | "qs": { 320 | "version": "6.8.0", 321 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.8.0.tgz", 322 | "integrity": "sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w==" 323 | }, 324 | "retry-axios": { 325 | "version": "0.3.2", 326 | "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-0.3.2.tgz", 327 | "integrity": "sha512-jp4YlI0qyDFfXiXGhkCOliBN1G7fRH03Nqy8YdShzGqbY5/9S2x/IR6C88ls2DFkbWuL3ASkP7QD3pVrNpPgwQ==" 328 | }, 329 | "safe-buffer": { 330 | "version": "5.2.0", 331 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 332 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 333 | }, 334 | "serverless-google-cloudfunctions": { 335 | "version": "2.3.2", 336 | "resolved": "https://registry.npmjs.org/serverless-google-cloudfunctions/-/serverless-google-cloudfunctions-2.3.2.tgz", 337 | "integrity": "sha512-aDIpoZ7laJNI+HgXn5ktCUxyyMkqUBX2oNNd7TDKtgIs4eQyjKelUQPf5C+89HdolEsDyqRKag3/ok2g085Q7w==", 338 | "requires": { 339 | "async": "^2.1.4", 340 | "bluebird": "^3.4.7", 341 | "chalk": "^1.1.3", 342 | "fs-extra": "^3.0.1", 343 | "googleapis": "^32.0.0", 344 | "lodash": "^4.17.4" 345 | } 346 | }, 347 | "strip-ansi": { 348 | "version": "3.0.1", 349 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 350 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 351 | "requires": { 352 | "ansi-regex": "^2.0.0" 353 | } 354 | }, 355 | "supports-color": { 356 | "version": "2.0.0", 357 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 358 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 359 | }, 360 | "universalify": { 361 | "version": "0.1.2", 362 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 363 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 364 | }, 365 | "url-template": { 366 | "version": "2.0.8", 367 | "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", 368 | "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" 369 | }, 370 | "uuid": { 371 | "version": "3.3.3", 372 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 373 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" 374 | }, 375 | "yallist": { 376 | "version": "2.1.2", 377 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 378 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 379 | } 380 | } 381 | } 382 | -------------------------------------------------------------------------------- /gcp/gcp-python37/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-python37", 3 | "version": "0.1.0", 4 | "description": "Python http endpoints with the Google Cloud Functions Serverless Framework plugin.", 5 | "main": "main.py", 6 | "dependencies": { 7 | "serverless-google-cloudfunctions": "^2.3.2" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /gcp/gcp-python37/serverless.yml: -------------------------------------------------------------------------------- 1 | org: serverlesscloud 2 | app: multi-cloud-benchmark 3 | service: gcp-python37 4 | 5 | provider: 6 | name: google 7 | memorySize: 1024 8 | runtime: python37 9 | region: us-east4 10 | project: serverless-cloud-benchmarks 11 | credentials: ~/.gcloud/serverless-cloud-benchmarks.json # path must be absolute 12 | 13 | plugins: 14 | - serverless-google-cloudfunctions 15 | 16 | package: 17 | exclude: 18 | - node_modules/** 19 | - .gitignore 20 | - .git/** 21 | 22 | functions: 23 | gcp-python37-hello: 24 | handler: hello 25 | events: 26 | - http: gcp-python37/hello 27 | -------------------------------------------------------------------------------- /shared.mk: -------------------------------------------------------------------------------- 1 | BUILDER=docker-compose -f ../docker-compose.yml run --rm $(RUNTIME) 2 | SLS=docker-compose -f ../docker-compose.yml run --rm -w /opt/app/gcp/$(RUNTIME) --entrypoint sls sls 3 | SLS_BASH=docker-compose -f ../docker-compose.yml run --rm -w /opt/app/gcp/$(RUNTIME) sls 4 | ARTILLERY=docker-compose -f ../docker-compose.yml run --rm -e API_URL=$(API_URL) artillery 5 | ARTILLERY_BASH=docker-compose -f ../docker-compose.yml run --rm -e API_URL=$(API_URL) --entrypoint bash artillery 6 | 7 | # Builder 8 | all: clean package deploy 9 | 10 | clean: ../.env 11 | $(BUILDER) make _clean 12 | 13 | build: ../.env 14 | $(BUILDER) make _build 15 | 16 | # Serverless 17 | package: ../.env build 18 | $(SLS) package 19 | 20 | deploy: ../.env 21 | if [ -d .serverless ]; then \ 22 | $(SLS) deploy --package .serverless; \ 23 | else \ 24 | $(SLS) deploy; \ 25 | fi 26 | 27 | plugins: ../.env 28 | $(SLS_BASH) npm install --ignore-scripts 29 | 30 | remove: ../.env 31 | $(SLS) remove 32 | 33 | # Artillery 34 | baseLine: ../.env 35 | $(ARTILLERY) run --output reports/$(RUNTIME).json runtime_baseline.yml 36 | 37 | report: ../.env 38 | $(ARTILLERY) report reports/$(RUNTIME).json 39 | 40 | # Helpers 41 | ../.env: 42 | cp ../.env.template ../.env 43 | 44 | shellBuilder: ../.env 45 | $(BUILDER) bash 46 | 47 | shellSls: ../.env 48 | $(SLS_BASH) bash 49 | 50 | shellArtillery: ../.env 51 | $(ARTILLERY_BASH) -------------------------------------------------------------------------------- /temp/aws-bash/Makefile: -------------------------------------------------------------------------------- 1 | RUNTIME=aws-bash 2 | API_URL=$(AWS_BASH_URL) 3 | 4 | include ../common.mk 5 | 6 | # Internals 7 | clean: 8 | rm -rf .serverless 9 | 10 | build: 11 | @echo "nothing to build" -------------------------------------------------------------------------------- /temp/aws-bash/bootstrap: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -euo pipefail 4 | 5 | # Initialization - load function handler 6 | source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" 7 | 8 | # Processing 9 | while true 10 | do 11 | HEADERS="$(mktemp)" 12 | # Get an event 13 | EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") 14 | REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) 15 | 16 | # Execute the handler function from the script 17 | RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") 18 | 19 | # Send the response 20 | curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" 21 | done -------------------------------------------------------------------------------- /temp/aws-bash/function.sh: -------------------------------------------------------------------------------- 1 | function handler () { 2 | EVENT_DATA=$1 3 | echo "$EVENT_DATA" 1>&2; 4 | RESPONSE="hello" 5 | 6 | echo $RESPONSE 7 | } -------------------------------------------------------------------------------- /temp/aws-bash/serverless.yml: -------------------------------------------------------------------------------- 1 | service: aws-bash 2 | 3 | provider: 4 | name: aws 5 | runtime: provided 6 | 7 | functions: 8 | hello: 9 | handler: function.sh 10 | events: 11 | - http: 12 | path: / 13 | method: get 14 | --------------------------------------------------------------------------------