Skip to content

Commit 5343ff5

Browse files
authored
Merge pull request #2 from gunnargrosch/develop
Added disk space failure in module and example.
2 parents bafcaf4 + 891d22e commit 5343ff5

File tree

6 files changed

+19
-16
lines changed

6 files changed

+19
-16
lines changed

README.md

+9-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Description
44

5-
`failure-lambda` is a small Node module for injecting failure into AWS Lambda (https://aws.amazon.com/lambda). It offers a simple failure injection wrapper for your Lambda handler where you then can choose to inject failure by setting the `failureMode` to `latency`, `exception` or `statuscode`. You control your failure injection using SSM Parameter Store.
5+
`failure-lambda` is a small Node module for injecting failure into AWS Lambda (https://aws.amazon.com/lambda). It offers a simple failure injection wrapper for your Lambda handler where you then can choose to inject failure by setting the `failureMode` to `latency`, `exception`, `statuscode` or `diskspace`. You control your failure injection using SSM Parameter Store.
66

77
## How to install
88

@@ -22,10 +22,10 @@ exports.handler = failureLambda(async (event, context) => {
2222
```
2323
4. Create a parameter in SSM Parameter Store.
2424
```json
25-
{"isEnabled": false, "failureMode": "latency", "rate": 1, "minLatency": 100, "maxLatency": 400, "exceptionMsg": "Exception message!", "statusCode": 404}
25+
{"isEnabled": false, "failureMode": "latency", "rate": 1, "minLatency": 100, "maxLatency": 400, "exceptionMsg": "Exception message!", "statusCode": 404, "diskSpace": 100}
2626
```
2727
```bash
28-
aws ssm put-parameter --region eu-north-1 --name failureLambdaConfig --type String --overwrite --value "{\"isEnabled\": false, \"failureMode\": \"latency\", \"rate\": 1, \"minLatency\": 100, \"maxLatency\": 400, \"exceptionMsg\": \"Exception message!\", \"statusCode\": 404}"
28+
aws ssm put-parameter --region eu-north-1 --name failureLambdaConfig --type String --overwrite --value "{\"isEnabled\": false, \"failureMode\": \"latency\", \"rate\": 1, \"minLatency\": 100, \"maxLatency\": 400, \"exceptionMsg\": \"Exception message!\", \"statusCode\": 404, \"diskSpace\": 100}"
2929
```
3030
5. Add an environment variable to your Lambda function with the key FAILURE_INJECTION_PARAM and the value set to the name of your parameter in SSM Parameter Store.
3131
6. Try it out!
@@ -41,6 +41,7 @@ Edit the values of your parameter in SSM Parameter Store to use the failure inje
4141
* `minLatency` and `maxLatency` is the span of latency in milliseconds injected into your function when `failureMode` is set to `latency`.
4242
* `exceptionMsg` is the message thrown with the exception created when `failureMode` is set to `exception`.
4343
* `statusCode` is the status code returned by your function when `failureMode` is set to `statuscode`.
44+
* `diskSpace` is size in MB of the file created in tmp when `failureMode` is set to `diskspace`.
4445

4546
## Example
4647

@@ -56,6 +57,11 @@ Inspired by Yan Cui's articles on latency injection for AWS Lambda (https://hack
5657

5758
## Changelog
5859

60+
### 2019-12-30 v0.1.0
61+
62+
* Added disk space failure.
63+
* Updated example application to store example file in tmp.
64+
5965
### 2019-12-23 v0.0.1
6066

6167
* Initial release

example/index.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
'use strict'
22
const failureLambda = require('failure-lambda')
3+
const fs = require('fs')
34
let response
45

56
exports.handler = failureLambda(async (event, context) => {
67
try {
8+
fs.writeFile('/tmp/example-' + Date.now() + '.tmp', 'Contents', (err) => {
9+
if (err) throw err
10+
})
711
response = {
812
statusCode: 200,
913
body: JSON.stringify({

example/package-lock.json

-11
This file was deleted.

example/serverless.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ resources:
2929
Properties:
3030
Name: ${self:service}-${opt:stage, self:provider.stage}-failureLambdaExample
3131
Type: String
32-
Value: '{"isEnabled": false, "failureMode": "latency", "rate": 1, "minLatency": 100, "maxLatency": 400, "exceptionMsg": "Exception message!", "statusCode": 404}'
32+
Value: '{"isEnabled": false, "failureMode": "latency", "rate": 1, "minLatency": 100, "maxLatency": 400, "exceptionMsg": "Exception message!", "statusCode": 404, "diskSpace": 100}'
3333
package:
3434
exclude:
3535
- .vscode

lib/failure.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict'
22
const aws = require('aws-sdk')
33
const ssm = new aws.SSM()
4+
const childProcess = require('child_process')
45

56
async function getConfig () {
67
try {
@@ -32,6 +33,9 @@ var injectFailure = function (fn) {
3233
console.log('Injecting status code: ' + config.statusCode)
3334
let response = { statusCode: config.statusCode }
3435
return response
36+
} else if (config.failureMode === 'diskspace') {
37+
console.log('Injecting disk space: ' + config.diskSpace + ' MB')
38+
childProcess.spawnSync('dd', ['if=/dev/zero', 'of=/tmp/diskspace-failure-' + Date.now() + '.tmp', 'count=1000', 'bs=' + config.diskSpace * 1000])
3539
}
3640
}
3741
return fn.apply(this, arguments)

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "failure-lambda",
3-
"version": "0.0.1",
3+
"version": "0.1.0",
44
"description": "Module for failure injection into AWS Lambda",
55
"main": "./lib/failure.js",
66
"scripts": {

0 commit comments

Comments
 (0)