Repository files navigation

aws-lambda-image

Build StatusCode ClimateCoverage Statusnpm versionJoin the chat at https://gitter.im/aws-lambda-image

An AWS Lambda Function to resize/reduce images automatically. When an image is put on AWS S3 bucket, this package will resize/reduce it and put to S3.

Requirements

  • Node.js ( AWS Lambda working version is 6.10 )

Preparation

Clone this repository and install dependencies:

git clone git@github.com:ysugimoto/aws-lambda-image.git
cd aws-lambda-image
npm install .

When upload to AWS Lambda, the project will bundle only needed files - no dev dependencies will be included.

Configuration

Configuration file you will find under the name config.json in project root. It's copy of our example file config.json.sample. More or less it looks like:

{
"bucket": "your-destination-bucket",
"backup": {
"directory": "./original"
},
"reduce": {
"directory": "./reduced",
"prefix": "reduced-",
"quality": 90,
"acl": "public-read"
},
"resizes": [
{
"size": 300,
"directory": "./resized/small",
"prefix": "resized-"
},
{
"size": 450,
"directory": "./resized/medium",
"suffix": "_medium"
},
{
"size": "600x600^",
"gravity": "Center",
"crop": "600x600",
"directory": "./resized/cropped-to-square"
},
{
"size": 600,
"directory": "./resized/600-jpeg",
"format": "jpg",
"background": "white"
},
{
"size": 900,
"directory": "./resized/large",
"quality": 90
}
]
}

Configuration Parameters

namefieldtypedescription
bucket-StringDestination bucket name at S3 to put processed image. If not supplied, it will use same bucket of event source.
jpegOptimizer-StringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
acl-StringPermission of S3 object. See AWS ACL documentation.
backup-ObjectBackup original file setting.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
moveBooleanIf true, an original uploaded file will delete from Bucket after completion.
reduce-ObjectReduce setting following fields.
qualityNumberDetermine reduced image quality ( only JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
resize-ArrayResize setting list of following fields.
sizeStringImage dimensions. See ImageMagick geometry documentation.
formatStringImage format override. If not supplied, it will leave the image in original format.
cropStringDimensions to crop the image. See ImageMagick crop documentation.
gravityStringChanges how size and crop. See ImageMagick gravity documentation.
qualityNumberDetermine reduced image quality ( forces format JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
orientationBooleanAuto orientation if value is true.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
optimizers-ObjectDefinitions for override the each Optimizers command arguments.
pngquantArrayPngquant command arguments. Default is ["--speed=1", "256"].
jpegoptimArrayJpegoptim command arguments. Default is ["-s", "--all-progressive"].
mozjpegArrayMozjpeg command arguments. Default is ["-optimize", "-progressive"].
gifsicleArrayGifsicle command arguments. Default is ["--optimize"].

Note that the optmizers option will force override its command arguments, so if you define these configurations, we don't care any more about how optimizer works.

Testing Configuration

If you want to check how your configuration will work, you can use:

npm run test-config

Installation

Setup

To use the automated deployment scripts you will need to have aws-cli installed and configured.

Deployment scripts are pre-configured to use some default values for the Lambda configuration. I you want to change any of those just use:

npm config set aws-lambda-image:profile default
npm config set aws-lambda-image:region eu-west-1
npm config set aws-lambda-image:memory 1280
npm config set aws-lambda-image:timeout 5

Deployment

Command below will deploy the Lambda function on AWS, together with setting up roles and policies.

npm run deploy

Notice: Because there are some limitations in Claudia.js support for policies, which could lead to issues with Access Denied when processing images from one bucket and saving them to another, we have decided to introduce support for custom policies.

Custom policies

Policies which should be installed together with our Lambda function are stored in policies/ directory. We keep there policy that grants access to all buckets, which is preventing possible errors with Access Denied described above. If you have any security-related concerns, feel free to change the:

"Resource": [
"*"
]

in the policies/s3-bucket-full-access.json to something more restrictive, like:

"Resource": [
"arn:aws:s3:::destination-bucket-name/*"
]

Just keep in mind, that you need to make those changes before you do the deployment.

Adding S3 event handlers

To complete installation process you will need to take one more action. It will allow you to install S3 Bucket event handler, which will send information about all uploaded images directly to your Lambda function.

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".jpg"

You are able to install multiple handlers per Bucket. So, to add handler for PNG files you just need to re-run above command with different suffix, ie:

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".png"

Adding SNS message handlers

As an addition, you can also setup and SNS message handler in case you would like to process S3 events over an SNS topic.

npm run add-sns-handler --sns_topic="arn:of:SNS:topic"

Updating

To update Lambda with you latest code just use command below. Script will build new package and automatically publish it on AWS.

npm run update

More

For more scripts look into package.json.

Complete / Failed hooks

You can handle resize/reduce/backup process on success/error result on index.js. ImageProcessor::run will return Promise object, run your original code:

processor.run(config).then(function(proceedImages)){// Success case:// proceedImages is list of ImageData instance on you configuration/* your code here */// notify lambdacontext.succeed("OK, numbers of "+proceedImages.length+" images has proceeded.");}).catch(function(messages){// Failed case:// messages is list of string on error messages/* your code here */// notify lambdacontext.fail("Woops, image process failed: "+messages);});

Image resize

  • ImageMagick (installed on AWS Lambda)

Image reduce

License

MIT License.

Author

Yoshiaki Sugimoto

Image credits

Thanks for testing fixture images:

About

Automatic image resize/reduce on AWS Lambda

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

aws-lambda-image

Build StatusCode ClimateCoverage Statusnpm versionJoin the chat at https://gitter.im/aws-lambda-image

An AWS Lambda Function to resize/reduce images automatically. When an image is put on AWS S3 bucket, this package will resize/reduce it and put to S3.

Requirements

  • Node.js ( AWS Lambda working version is 6.10 )

Preparation

Clone this repository and install dependencies:

git clone git@github.com:ysugimoto/aws-lambda-image.git
cd aws-lambda-image
npm install .

When upload to AWS Lambda, the project will bundle only needed files - no dev dependencies will be included.

Configuration

Configuration file you will find under the name config.json in project root. It's copy of our example file config.json.sample. More or less it looks like:

{
"bucket": "your-destination-bucket",
"backup": {
"directory": "./original"
},
"reduce": {
"directory": "./reduced",
"prefix": "reduced-",
"quality": 90,
"acl": "public-read"
},
"resizes": [
{
"size": 300,
"directory": "./resized/small",
"prefix": "resized-"
},
{
"size": 450,
"directory": "./resized/medium",
"suffix": "_medium"
},
{
"size": "600x600^",
"gravity": "Center",
"crop": "600x600",
"directory": "./resized/cropped-to-square"
},
{
"size": 600,
"directory": "./resized/600-jpeg",
"format": "jpg",
"background": "white"
},
{
"size": 900,
"directory": "./resized/large",
"quality": 90
}
]
}

Configuration Parameters

namefieldtypedescription
bucket-StringDestination bucket name at S3 to put processed image. If not supplied, it will use same bucket of event source.
jpegOptimizer-StringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
acl-StringPermission of S3 object. See AWS ACL documentation.
backup-ObjectBackup original file setting.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
moveBooleanIf true, an original uploaded file will delete from Bucket after completion.
reduce-ObjectReduce setting following fields.
qualityNumberDetermine reduced image quality ( only JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
resize-ArrayResize setting list of following fields.
sizeStringImage dimensions. See ImageMagick geometry documentation.
formatStringImage format override. If not supplied, it will leave the image in original format.
cropStringDimensions to crop the image. See ImageMagick crop documentation.
gravityStringChanges how size and crop. See ImageMagick gravity documentation.
qualityNumberDetermine reduced image quality ( forces format JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
orientationBooleanAuto orientation if value is true.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
optimizers-ObjectDefinitions for override the each Optimizers command arguments.
pngquantArrayPngquant command arguments. Default is ["--speed=1", "256"].
jpegoptimArrayJpegoptim command arguments. Default is ["-s", "--all-progressive"].
mozjpegArrayMozjpeg command arguments. Default is ["-optimize", "-progressive"].
gifsicleArrayGifsicle command arguments. Default is ["--optimize"].

Note that the optmizers option will force override its command arguments, so if you define these configurations, we don't care any more about how optimizer works.

Testing Configuration

If you want to check how your configuration will work, you can use:

npm run test-config

Installation

Setup

To use the automated deployment scripts you will need to have aws-cli installed and configured.

Deployment scripts are pre-configured to use some default values for the Lambda configuration. I you want to change any of those just use:

npm config set aws-lambda-image:profile default
npm config set aws-lambda-image:region eu-west-1
npm config set aws-lambda-image:memory 1280
npm config set aws-lambda-image:timeout 5

Deployment

Command below will deploy the Lambda function on AWS, together with setting up roles and policies.

npm run deploy

Notice: Because there are some limitations in Claudia.js support for policies, which could lead to issues with Access Denied when processing images from one bucket and saving them to another, we have decided to introduce support for custom policies.

Custom policies

Policies which should be installed together with our Lambda function are stored in policies/ directory. We keep there policy that grants access to all buckets, which is preventing possible errors with Access Denied described above. If you have any security-related concerns, feel free to change the:

"Resource": [
"*"
]

in the policies/s3-bucket-full-access.json to something more restrictive, like:

"Resource": [
"arn:aws:s3:::destination-bucket-name/*"
]

Just keep in mind, that you need to make those changes before you do the deployment.

Adding S3 event handlers

To complete installation process you will need to take one more action. It will allow you to install S3 Bucket event handler, which will send information about all uploaded images directly to your Lambda function.

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".jpg"

You are able to install multiple handlers per Bucket. So, to add handler for PNG files you just need to re-run above command with different suffix, ie:

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".png"

Adding SNS message handlers

As an addition, you can also setup and SNS message handler in case you would like to process S3 events over an SNS topic.

npm run add-sns-handler --sns_topic="arn:of:SNS:topic"

Updating

To update Lambda with you latest code just use command below. Script will build new package and automatically publish it on AWS.

npm run update

More

For more scripts look into package.json.

Complete / Failed hooks

You can handle resize/reduce/backup process on success/error result on index.js. ImageProcessor::run will return Promise object, run your original code:

processor.run(config).then(function(proceedImages)){// Success case:// proceedImages is list of ImageData instance on you configuration/* your code here */// notify lambdacontext.succeed("OK, numbers of "+proceedImages.length+" images has proceeded.");}).catch(function(messages){// Failed case:// messages is list of string on error messages/* your code here */// notify lambdacontext.fail("Woops, image process failed: "+messages);});

Image resize

  • ImageMagick (installed on AWS Lambda)

Image reduce

License

MIT License.

Author

Yoshiaki Sugimoto

Image credits

Thanks for testing fixture images:

About

Automatic image resize/reduce on AWS Lambda

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

aws-lambda-image

Build StatusCode ClimateCoverage Statusnpm versionJoin the chat at https://gitter.im/aws-lambda-image

An AWS Lambda Function to resize/reduce images automatically. When an image is put on AWS S3 bucket, this package will resize/reduce it and put to S3.

Requirements

  • Node.js ( AWS Lambda working version is 6.10 )

Preparation

Clone this repository and install dependencies:

git clone git@github.com:ysugimoto/aws-lambda-image.git
cd aws-lambda-image
npm install .

When upload to AWS Lambda, the project will bundle only needed files - no dev dependencies will be included.

Configuration

Configuration file you will find under the name config.json in project root. It's copy of our example file config.json.sample. More or less it looks like:

{
"bucket": "your-destination-bucket",
"backup": {
"directory": "./original"
},
"reduce": {
"directory": "./reduced",
"prefix": "reduced-",
"quality": 90,
"acl": "public-read"
},
"resizes": [
{
"size": 300,
"directory": "./resized/small",
"prefix": "resized-"
},
{
"size": 450,
"directory": "./resized/medium",
"suffix": "_medium"
},
{
"size": "600x600^",
"gravity": "Center",
"crop": "600x600",
"directory": "./resized/cropped-to-square"
},
{
"size": 600,
"directory": "./resized/600-jpeg",
"format": "jpg",
"background": "white"
},
{
"size": 900,
"directory": "./resized/large",
"quality": 90
}
]
}

Configuration Parameters

namefieldtypedescription
bucket-StringDestination bucket name at S3 to put processed image. If not supplied, it will use same bucket of event source.
jpegOptimizer-StringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
acl-StringPermission of S3 object. See AWS ACL documentation.
backup-ObjectBackup original file setting.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
moveBooleanIf true, an original uploaded file will delete from Bucket after completion.
reduce-ObjectReduce setting following fields.
qualityNumberDetermine reduced image quality ( only JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
resize-ArrayResize setting list of following fields.
sizeStringImage dimensions. See ImageMagick geometry documentation.
formatStringImage format override. If not supplied, it will leave the image in original format.
cropStringDimensions to crop the image. See ImageMagick crop documentation.
gravityStringChanges how size and crop. See ImageMagick gravity documentation.
qualityNumberDetermine reduced image quality ( forces format JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
orientationBooleanAuto orientation if value is true.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
optimizers-ObjectDefinitions for override the each Optimizers command arguments.
pngquantArrayPngquant command arguments. Default is ["--speed=1", "256"].
jpegoptimArrayJpegoptim command arguments. Default is ["-s", "--all-progressive"].
mozjpegArrayMozjpeg command arguments. Default is ["-optimize", "-progressive"].
gifsicleArrayGifsicle command arguments. Default is ["--optimize"].

Note that the optmizers option will force override its command arguments, so if you define these configurations, we don't care any more about how optimizer works.

Testing Configuration

If you want to check how your configuration will work, you can use:

npm run test-config

Installation

Setup

To use the automated deployment scripts you will need to have aws-cli installed and configured.

Deployment scripts are pre-configured to use some default values for the Lambda configuration. I you want to change any of those just use:

npm config set aws-lambda-image:profile default
npm config set aws-lambda-image:region eu-west-1
npm config set aws-lambda-image:memory 1280
npm config set aws-lambda-image:timeout 5

Deployment

Command below will deploy the Lambda function on AWS, together with setting up roles and policies.

npm run deploy

Notice: Because there are some limitations in Claudia.js support for policies, which could lead to issues with Access Denied when processing images from one bucket and saving them to another, we have decided to introduce support for custom policies.

Custom policies

Policies which should be installed together with our Lambda function are stored in policies/ directory. We keep there policy that grants access to all buckets, which is preventing possible errors with Access Denied described above. If you have any security-related concerns, feel free to change the:

"Resource": [
"*"
]

in the policies/s3-bucket-full-access.json to something more restrictive, like:

"Resource": [
"arn:aws:s3:::destination-bucket-name/*"
]

Just keep in mind, that you need to make those changes before you do the deployment.

Adding S3 event handlers

To complete installation process you will need to take one more action. It will allow you to install S3 Bucket event handler, which will send information about all uploaded images directly to your Lambda function.

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".jpg"

You are able to install multiple handlers per Bucket. So, to add handler for PNG files you just need to re-run above command with different suffix, ie:

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".png"

Adding SNS message handlers

As an addition, you can also setup and SNS message handler in case you would like to process S3 events over an SNS topic.

npm run add-sns-handler --sns_topic="arn:of:SNS:topic"

Updating

To update Lambda with you latest code just use command below. Script will build new package and automatically publish it on AWS.

npm run update

More

For more scripts look into package.json.

Complete / Failed hooks

You can handle resize/reduce/backup process on success/error result on index.js. ImageProcessor::run will return Promise object, run your original code:

processor.run(config).then(function(proceedImages)){// Success case:// proceedImages is list of ImageData instance on you configuration/* your code here */// notify lambdacontext.succeed("OK, numbers of "+proceedImages.length+" images has proceeded.");}).catch(function(messages){// Failed case:// messages is list of string on error messages/* your code here */// notify lambdacontext.fail("Woops, image process failed: "+messages);});

Image resize

  • ImageMagick (installed on AWS Lambda)

Image reduce

License

MIT License.

Author

Yoshiaki Sugimoto

Image credits

Thanks for testing fixture images:

About

Automatic image resize/reduce on AWS Lambda

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

aws-lambda-image

Build StatusCode ClimateCoverage Statusnpm versionJoin the chat at https://gitter.im/aws-lambda-image

An AWS Lambda Function to resize/reduce images automatically. When an image is put on AWS S3 bucket, this package will resize/reduce it and put to S3.

Requirements

  • Node.js ( AWS Lambda working version is 6.10 )

Preparation

Clone this repository and install dependencies:

git clone git@github.com:ysugimoto/aws-lambda-image.git
cd aws-lambda-image
npm install .

When upload to AWS Lambda, the project will bundle only needed files - no dev dependencies will be included.

Configuration

Configuration file you will find under the name config.json in project root. It's copy of our example file config.json.sample. More or less it looks like:

{
"bucket": "your-destination-bucket",
"backup": {
"directory": "./original"
},
"reduce": {
"directory": "./reduced",
"prefix": "reduced-",
"quality": 90,
"acl": "public-read"
},
"resizes": [
{
"size": 300,
"directory": "./resized/small",
"prefix": "resized-"
},
{
"size": 450,
"directory": "./resized/medium",
"suffix": "_medium"
},
{
"size": "600x600^",
"gravity": "Center",
"crop": "600x600",
"directory": "./resized/cropped-to-square"
},
{
"size": 600,
"directory": "./resized/600-jpeg",
"format": "jpg",
"background": "white"
},
{
"size": 900,
"directory": "./resized/large",
"quality": 90
}
]
}

Configuration Parameters

namefieldtypedescription
bucket-StringDestination bucket name at S3 to put processed image. If not supplied, it will use same bucket of event source.
jpegOptimizer-StringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
acl-StringPermission of S3 object. See AWS ACL documentation.
backup-ObjectBackup original file setting.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
moveBooleanIf true, an original uploaded file will delete from Bucket after completion.
reduce-ObjectReduce setting following fields.
qualityNumberDetermine reduced image quality ( only JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
resize-ArrayResize setting list of following fields.
sizeStringImage dimensions. See ImageMagick geometry documentation.
formatStringImage format override. If not supplied, it will leave the image in original format.
cropStringDimensions to crop the image. See ImageMagick crop documentation.
gravityStringChanges how size and crop. See ImageMagick gravity documentation.
qualityNumberDetermine reduced image quality ( forces format JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
orientationBooleanAuto orientation if value is true.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
optimizers-ObjectDefinitions for override the each Optimizers command arguments.
pngquantArrayPngquant command arguments. Default is ["--speed=1", "256"].
jpegoptimArrayJpegoptim command arguments. Default is ["-s", "--all-progressive"].
mozjpegArrayMozjpeg command arguments. Default is ["-optimize", "-progressive"].
gifsicleArrayGifsicle command arguments. Default is ["--optimize"].

Note that the optmizers option will force override its command arguments, so if you define these configurations, we don't care any more about how optimizer works.

Testing Configuration

If you want to check how your configuration will work, you can use:

npm run test-config

Installation

Setup

To use the automated deployment scripts you will need to have aws-cli installed and configured.

Deployment scripts are pre-configured to use some default values for the Lambda configuration. I you want to change any of those just use:

npm config set aws-lambda-image:profile default
npm config set aws-lambda-image:region eu-west-1
npm config set aws-lambda-image:memory 1280
npm config set aws-lambda-image:timeout 5

Deployment

Command below will deploy the Lambda function on AWS, together with setting up roles and policies.

npm run deploy

Notice: Because there are some limitations in Claudia.js support for policies, which could lead to issues with Access Denied when processing images from one bucket and saving them to another, we have decided to introduce support for custom policies.

Custom policies

Policies which should be installed together with our Lambda function are stored in policies/ directory. We keep there policy that grants access to all buckets, which is preventing possible errors with Access Denied described above. If you have any security-related concerns, feel free to change the:

"Resource": [
"*"
]

in the policies/s3-bucket-full-access.json to something more restrictive, like:

"Resource": [
"arn:aws:s3:::destination-bucket-name/*"
]

Just keep in mind, that you need to make those changes before you do the deployment.

Adding S3 event handlers

To complete installation process you will need to take one more action. It will allow you to install S3 Bucket event handler, which will send information about all uploaded images directly to your Lambda function.

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".jpg"

You are able to install multiple handlers per Bucket. So, to add handler for PNG files you just need to re-run above command with different suffix, ie:

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".png"

Adding SNS message handlers

As an addition, you can also setup and SNS message handler in case you would like to process S3 events over an SNS topic.

npm run add-sns-handler --sns_topic="arn:of:SNS:topic"

Updating

To update Lambda with you latest code just use command below. Script will build new package and automatically publish it on AWS.

npm run update

More

For more scripts look into package.json.

Complete / Failed hooks

You can handle resize/reduce/backup process on success/error result on index.js. ImageProcessor::run will return Promise object, run your original code:

processor.run(config).then(function(proceedImages)){// Success case:// proceedImages is list of ImageData instance on you configuration/* your code here */// notify lambdacontext.succeed("OK, numbers of "+proceedImages.length+" images has proceeded.");}).catch(function(messages){// Failed case:// messages is list of string on error messages/* your code here */// notify lambdacontext.fail("Woops, image process failed: "+messages);});

Image resize

  • ImageMagick (installed on AWS Lambda)

Image reduce

License

MIT License.

Author

Yoshiaki Sugimoto

Image credits

Thanks for testing fixture images:

About

Automatic image resize/reduce on AWS Lambda

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

aws-lambda-image

Build StatusCode ClimateCoverage Statusnpm versionJoin the chat at https://gitter.im/aws-lambda-image

An AWS Lambda Function to resize/reduce images automatically. When an image is put on AWS S3 bucket, this package will resize/reduce it and put to S3.

Requirements

  • Node.js ( AWS Lambda working version is 6.10 )

Preparation

Clone this repository and install dependencies:

git clone git@github.com:ysugimoto/aws-lambda-image.git
cd aws-lambda-image
npm install .

When upload to AWS Lambda, the project will bundle only needed files - no dev dependencies will be included.

Configuration

Configuration file you will find under the name config.json in project root. It's copy of our example file config.json.sample. More or less it looks like:

{
"bucket": "your-destination-bucket",
"backup": {
"directory": "./original"
},
"reduce": {
"directory": "./reduced",
"prefix": "reduced-",
"quality": 90,
"acl": "public-read"
},
"resizes": [
{
"size": 300,
"directory": "./resized/small",
"prefix": "resized-"
},
{
"size": 450,
"directory": "./resized/medium",
"suffix": "_medium"
},
{
"size": "600x600^",
"gravity": "Center",
"crop": "600x600",
"directory": "./resized/cropped-to-square"
},
{
"size": 600,
"directory": "./resized/600-jpeg",
"format": "jpg",
"background": "white"
},
{
"size": 900,
"directory": "./resized/large",
"quality": 90
}
]
}

Configuration Parameters

namefieldtypedescription
bucket-StringDestination bucket name at S3 to put processed image. If not supplied, it will use same bucket of event source.
jpegOptimizer-StringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
acl-StringPermission of S3 object. See AWS ACL documentation.
backup-ObjectBackup original file setting.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
moveBooleanIf true, an original uploaded file will delete from Bucket after completion.
reduce-ObjectReduce setting following fields.
qualityNumberDetermine reduced image quality ( only JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
resize-ArrayResize setting list of following fields.
sizeStringImage dimensions. See ImageMagick geometry documentation.
formatStringImage format override. If not supplied, it will leave the image in original format.
cropStringDimensions to crop the image. See ImageMagick crop documentation.
gravityStringChanges how size and crop. See ImageMagick gravity documentation.
qualityNumberDetermine reduced image quality ( forces format JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
orientationBooleanAuto orientation if value is true.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
optimizers-ObjectDefinitions for override the each Optimizers command arguments.
pngquantArrayPngquant command arguments. Default is ["--speed=1", "256"].
jpegoptimArrayJpegoptim command arguments. Default is ["-s", "--all-progressive"].
mozjpegArrayMozjpeg command arguments. Default is ["-optimize", "-progressive"].
gifsicleArrayGifsicle command arguments. Default is ["--optimize"].

Note that the optmizers option will force override its command arguments, so if you define these configurations, we don't care any more about how optimizer works.

Testing Configuration

If you want to check how your configuration will work, you can use:

npm run test-config

Installation

Setup

To use the automated deployment scripts you will need to have aws-cli installed and configured.

Deployment scripts are pre-configured to use some default values for the Lambda configuration. I you want to change any of those just use:

npm config set aws-lambda-image:profile default
npm config set aws-lambda-image:region eu-west-1
npm config set aws-lambda-image:memory 1280
npm config set aws-lambda-image:timeout 5

Deployment

Command below will deploy the Lambda function on AWS, together with setting up roles and policies.

npm run deploy

Notice: Because there are some limitations in Claudia.js support for policies, which could lead to issues with Access Denied when processing images from one bucket and saving them to another, we have decided to introduce support for custom policies.

Custom policies

Policies which should be installed together with our Lambda function are stored in policies/ directory. We keep there policy that grants access to all buckets, which is preventing possible errors with Access Denied described above. If you have any security-related concerns, feel free to change the:

"Resource": [
"*"
]

in the policies/s3-bucket-full-access.json to something more restrictive, like:

"Resource": [
"arn:aws:s3:::destination-bucket-name/*"
]

Just keep in mind, that you need to make those changes before you do the deployment.

Adding S3 event handlers

To complete installation process you will need to take one more action. It will allow you to install S3 Bucket event handler, which will send information about all uploaded images directly to your Lambda function.

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".jpg"

You are able to install multiple handlers per Bucket. So, to add handler for PNG files you just need to re-run above command with different suffix, ie:

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".png"

Adding SNS message handlers

As an addition, you can also setup and SNS message handler in case you would like to process S3 events over an SNS topic.

npm run add-sns-handler --sns_topic="arn:of:SNS:topic"

Updating

To update Lambda with you latest code just use command below. Script will build new package and automatically publish it on AWS.

npm run update

More

For more scripts look into package.json.

Complete / Failed hooks

You can handle resize/reduce/backup process on success/error result on index.js. ImageProcessor::run will return Promise object, run your original code:

processor.run(config).then(function(proceedImages)){// Success case:// proceedImages is list of ImageData instance on you configuration/* your code here */// notify lambdacontext.succeed("OK, numbers of "+proceedImages.length+" images has proceeded.");}).catch(function(messages){// Failed case:// messages is list of string on error messages/* your code here */// notify lambdacontext.fail("Woops, image process failed: "+messages);});

Image resize

  • ImageMagick (installed on AWS Lambda)

Image reduce

License

MIT License.

Author

Yoshiaki Sugimoto

Image credits

Thanks for testing fixture images:

About

Automatic image resize/reduce on AWS Lambda

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

aws-lambda-image

Build StatusCode ClimateCoverage Statusnpm versionJoin the chat at https://gitter.im/aws-lambda-image

An AWS Lambda Function to resize/reduce images automatically. When an image is put on AWS S3 bucket, this package will resize/reduce it and put to S3.

Requirements

  • Node.js ( AWS Lambda working version is 6.10 )

Preparation

Clone this repository and install dependencies:

git clone git@github.com:ysugimoto/aws-lambda-image.git
cd aws-lambda-image
npm install .

When upload to AWS Lambda, the project will bundle only needed files - no dev dependencies will be included.

Configuration

Configuration file you will find under the name config.json in project root. It's copy of our example file config.json.sample. More or less it looks like:

{
"bucket": "your-destination-bucket",
"backup": {
"directory": "./original"
},
"reduce": {
"directory": "./reduced",
"prefix": "reduced-",
"quality": 90,
"acl": "public-read"
},
"resizes": [
{
"size": 300,
"directory": "./resized/small",
"prefix": "resized-"
},
{
"size": 450,
"directory": "./resized/medium",
"suffix": "_medium"
},
{
"size": "600x600^",
"gravity": "Center",
"crop": "600x600",
"directory": "./resized/cropped-to-square"
},
{
"size": 600,
"directory": "./resized/600-jpeg",
"format": "jpg",
"background": "white"
},
{
"size": 900,
"directory": "./resized/large",
"quality": 90
}
]
}

Configuration Parameters

namefieldtypedescription
bucket-StringDestination bucket name at S3 to put processed image. If not supplied, it will use same bucket of event source.
jpegOptimizer-StringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
acl-StringPermission of S3 object. See AWS ACL documentation.
backup-ObjectBackup original file setting.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
moveBooleanIf true, an original uploaded file will delete from Bucket after completion.
reduce-ObjectReduce setting following fields.
qualityNumberDetermine reduced image quality ( only JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
resize-ArrayResize setting list of following fields.
sizeStringImage dimensions. See ImageMagick geometry documentation.
formatStringImage format override. If not supplied, it will leave the image in original format.
cropStringDimensions to crop the image. See ImageMagick crop documentation.
gravityStringChanges how size and crop. See ImageMagick gravity documentation.
qualityNumberDetermine reduced image quality ( forces format JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
orientationBooleanAuto orientation if value is true.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
optimizers-ObjectDefinitions for override the each Optimizers command arguments.
pngquantArrayPngquant command arguments. Default is ["--speed=1", "256"].
jpegoptimArrayJpegoptim command arguments. Default is ["-s", "--all-progressive"].
mozjpegArrayMozjpeg command arguments. Default is ["-optimize", "-progressive"].
gifsicleArrayGifsicle command arguments. Default is ["--optimize"].

Note that the optmizers option will force override its command arguments, so if you define these configurations, we don't care any more about how optimizer works.

Testing Configuration

If you want to check how your configuration will work, you can use:

npm run test-config

Installation

Setup

To use the automated deployment scripts you will need to have aws-cli installed and configured.

Deployment scripts are pre-configured to use some default values for the Lambda configuration. I you want to change any of those just use:

npm config set aws-lambda-image:profile default
npm config set aws-lambda-image:region eu-west-1
npm config set aws-lambda-image:memory 1280
npm config set aws-lambda-image:timeout 5

Deployment

Command below will deploy the Lambda function on AWS, together with setting up roles and policies.

npm run deploy

Notice: Because there are some limitations in Claudia.js support for policies, which could lead to issues with Access Denied when processing images from one bucket and saving them to another, we have decided to introduce support for custom policies.

Custom policies

Policies which should be installed together with our Lambda function are stored in policies/ directory. We keep there policy that grants access to all buckets, which is preventing possible errors with Access Denied described above. If you have any security-related concerns, feel free to change the:

"Resource": [
"*"
]

in the policies/s3-bucket-full-access.json to something more restrictive, like:

"Resource": [
"arn:aws:s3:::destination-bucket-name/*"
]

Just keep in mind, that you need to make those changes before you do the deployment.

Adding S3 event handlers

To complete installation process you will need to take one more action. It will allow you to install S3 Bucket event handler, which will send information about all uploaded images directly to your Lambda function.

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".jpg"

You are able to install multiple handlers per Bucket. So, to add handler for PNG files you just need to re-run above command with different suffix, ie:

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".png"

Adding SNS message handlers

As an addition, you can also setup and SNS message handler in case you would like to process S3 events over an SNS topic.

npm run add-sns-handler --sns_topic="arn:of:SNS:topic"

Updating

To update Lambda with you latest code just use command below. Script will build new package and automatically publish it on AWS.

npm run update

More

For more scripts look into package.json.

Complete / Failed hooks

You can handle resize/reduce/backup process on success/error result on index.js. ImageProcessor::run will return Promise object, run your original code:

processor.run(config).then(function(proceedImages)){// Success case:// proceedImages is list of ImageData instance on you configuration/* your code here */// notify lambdacontext.succeed("OK, numbers of "+proceedImages.length+" images has proceeded.");}).catch(function(messages){// Failed case:// messages is list of string on error messages/* your code here */// notify lambdacontext.fail("Woops, image process failed: "+messages);});

Image resize

  • ImageMagick (installed on AWS Lambda)

Image reduce

License

MIT License.

Author

Yoshiaki Sugimoto

Image credits

Thanks for testing fixture images:

About

Automatic image resize/reduce on AWS Lambda

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

aws-lambda-image

Build StatusCode ClimateCoverage Statusnpm versionJoin the chat at https://gitter.im/aws-lambda-image

An AWS Lambda Function to resize/reduce images automatically. When an image is put on AWS S3 bucket, this package will resize/reduce it and put to S3.

Requirements

  • Node.js ( AWS Lambda working version is 6.10 )

Preparation

Clone this repository and install dependencies:

git clone git@github.com:ysugimoto/aws-lambda-image.git
cd aws-lambda-image
npm install .

When upload to AWS Lambda, the project will bundle only needed files - no dev dependencies will be included.

Configuration

Configuration file you will find under the name config.json in project root. It's copy of our example file config.json.sample. More or less it looks like:

{
"bucket": "your-destination-bucket",
"backup": {
"directory": "./original"
},
"reduce": {
"directory": "./reduced",
"prefix": "reduced-",
"quality": 90,
"acl": "public-read"
},
"resizes": [
{
"size": 300,
"directory": "./resized/small",
"prefix": "resized-"
},
{
"size": 450,
"directory": "./resized/medium",
"suffix": "_medium"
},
{
"size": "600x600^",
"gravity": "Center",
"crop": "600x600",
"directory": "./resized/cropped-to-square"
},
{
"size": 600,
"directory": "./resized/600-jpeg",
"format": "jpg",
"background": "white"
},
{
"size": 900,
"directory": "./resized/large",
"quality": 90
}
]
}

Configuration Parameters

namefieldtypedescription
bucket-StringDestination bucket name at S3 to put processed image. If not supplied, it will use same bucket of event source.
jpegOptimizer-StringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
acl-StringPermission of S3 object. See AWS ACL documentation.
backup-ObjectBackup original file setting.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
moveBooleanIf true, an original uploaded file will delete from Bucket after completion.
reduce-ObjectReduce setting following fields.
qualityNumberDetermine reduced image quality ( only JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
resize-ArrayResize setting list of following fields.
sizeStringImage dimensions. See ImageMagick geometry documentation.
formatStringImage format override. If not supplied, it will leave the image in original format.
cropStringDimensions to crop the image. See ImageMagick crop documentation.
gravityStringChanges how size and crop. See ImageMagick gravity documentation.
qualityNumberDetermine reduced image quality ( forces format JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
orientationBooleanAuto orientation if value is true.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
optimizers-ObjectDefinitions for override the each Optimizers command arguments.
pngquantArrayPngquant command arguments. Default is ["--speed=1", "256"].
jpegoptimArrayJpegoptim command arguments. Default is ["-s", "--all-progressive"].
mozjpegArrayMozjpeg command arguments. Default is ["-optimize", "-progressive"].
gifsicleArrayGifsicle command arguments. Default is ["--optimize"].

Note that the optmizers option will force override its command arguments, so if you define these configurations, we don't care any more about how optimizer works.

Testing Configuration

If you want to check how your configuration will work, you can use:

npm run test-config

Installation

Setup

To use the automated deployment scripts you will need to have aws-cli installed and configured.

Deployment scripts are pre-configured to use some default values for the Lambda configuration. I you want to change any of those just use:

npm config set aws-lambda-image:profile default
npm config set aws-lambda-image:region eu-west-1
npm config set aws-lambda-image:memory 1280
npm config set aws-lambda-image:timeout 5

Deployment

Command below will deploy the Lambda function on AWS, together with setting up roles and policies.

npm run deploy

Notice: Because there are some limitations in Claudia.js support for policies, which could lead to issues with Access Denied when processing images from one bucket and saving them to another, we have decided to introduce support for custom policies.

Custom policies

Policies which should be installed together with our Lambda function are stored in policies/ directory. We keep there policy that grants access to all buckets, which is preventing possible errors with Access Denied described above. If you have any security-related concerns, feel free to change the:

"Resource": [
"*"
]

in the policies/s3-bucket-full-access.json to something more restrictive, like:

"Resource": [
"arn:aws:s3:::destination-bucket-name/*"
]

Just keep in mind, that you need to make those changes before you do the deployment.

Adding S3 event handlers

To complete installation process you will need to take one more action. It will allow you to install S3 Bucket event handler, which will send information about all uploaded images directly to your Lambda function.

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".jpg"

You are able to install multiple handlers per Bucket. So, to add handler for PNG files you just need to re-run above command with different suffix, ie:

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".png"

Adding SNS message handlers

As an addition, you can also setup and SNS message handler in case you would like to process S3 events over an SNS topic.

npm run add-sns-handler --sns_topic="arn:of:SNS:topic"

Updating

To update Lambda with you latest code just use command below. Script will build new package and automatically publish it on AWS.

npm run update

More

For more scripts look into package.json.

Complete / Failed hooks

You can handle resize/reduce/backup process on success/error result on index.js. ImageProcessor::run will return Promise object, run your original code:

processor.run(config).then(function(proceedImages)){// Success case:// proceedImages is list of ImageData instance on you configuration/* your code here */// notify lambdacontext.succeed("OK, numbers of "+proceedImages.length+" images has proceeded.");}).catch(function(messages){// Failed case:// messages is list of string on error messages/* your code here */// notify lambdacontext.fail("Woops, image process failed: "+messages);});

Image resize

  • ImageMagick (installed on AWS Lambda)

Image reduce

License

MIT License.

Author

Yoshiaki Sugimoto

Image credits

Thanks for testing fixture images:

About

Automatic image resize/reduce on AWS Lambda

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

aws-lambda-image

Build StatusCode ClimateCoverage Statusnpm versionJoin the chat at https://gitter.im/aws-lambda-image

An AWS Lambda Function to resize/reduce images automatically. When an image is put on AWS S3 bucket, this package will resize/reduce it and put to S3.

Requirements

  • Node.js ( AWS Lambda working version is 6.10 )

Preparation

Clone this repository and install dependencies:

git clone git@github.com:ysugimoto/aws-lambda-image.git
cd aws-lambda-image
npm install .

When upload to AWS Lambda, the project will bundle only needed files - no dev dependencies will be included.

Configuration

Configuration file you will find under the name config.json in project root. It's copy of our example file config.json.sample. More or less it looks like:

{
"bucket": "your-destination-bucket",
"backup": {
"directory": "./original"
},
"reduce": {
"directory": "./reduced",
"prefix": "reduced-",
"quality": 90,
"acl": "public-read"
},
"resizes": [
{
"size": 300,
"directory": "./resized/small",
"prefix": "resized-"
},
{
"size": 450,
"directory": "./resized/medium",
"suffix": "_medium"
},
{
"size": "600x600^",
"gravity": "Center",
"crop": "600x600",
"directory": "./resized/cropped-to-square"
},
{
"size": 600,
"directory": "./resized/600-jpeg",
"format": "jpg",
"background": "white"
},
{
"size": 900,
"directory": "./resized/large",
"quality": 90
}
]
}

Configuration Parameters

namefieldtypedescription
bucket-StringDestination bucket name at S3 to put processed image. If not supplied, it will use same bucket of event source.
jpegOptimizer-StringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
acl-StringPermission of S3 object. See AWS ACL documentation.
backup-ObjectBackup original file setting.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
moveBooleanIf true, an original uploaded file will delete from Bucket after completion.
reduce-ObjectReduce setting following fields.
qualityNumberDetermine reduced image quality ( only JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
resize-ArrayResize setting list of following fields.
sizeStringImage dimensions. See ImageMagick geometry documentation.
formatStringImage format override. If not supplied, it will leave the image in original format.
cropStringDimensions to crop the image. See ImageMagick crop documentation.
gravityStringChanges how size and crop. See ImageMagick gravity documentation.
qualityNumberDetermine reduced image quality ( forces format JPG ).
jpegOptimizerStringDetermine optimiser that should be used mozjpeg (default) or jpegoptim ( only JPG ).
orientationBooleanAuto orientation if value is true.
bucketStringDestination bucket to override. If not supplied, it will use bucket setting.
directoryStringImage directory path. Supports relative and absolute paths. Mode details in DIRECTORY.md
templateObjectMap representing pattern substitution pair. Mode details in DIRECTORY.md
prefixStringPrepend filename prefix if supplied.
suffixStringAppend filename suffix if supplied.
aclStringPermission of S3 object. See AWS ACL documentation.
optimizers-ObjectDefinitions for override the each Optimizers command arguments.
pngquantArrayPngquant command arguments. Default is ["--speed=1", "256"].
jpegoptimArrayJpegoptim command arguments. Default is ["-s", "--all-progressive"].
mozjpegArrayMozjpeg command arguments. Default is ["-optimize", "-progressive"].
gifsicleArrayGifsicle command arguments. Default is ["--optimize"].

Note that the optmizers option will force override its command arguments, so if you define these configurations, we don't care any more about how optimizer works.

Testing Configuration

If you want to check how your configuration will work, you can use:

npm run test-config

Installation

Setup

To use the automated deployment scripts you will need to have aws-cli installed and configured.

Deployment scripts are pre-configured to use some default values for the Lambda configuration. I you want to change any of those just use:

npm config set aws-lambda-image:profile default
npm config set aws-lambda-image:region eu-west-1
npm config set aws-lambda-image:memory 1280
npm config set aws-lambda-image:timeout 5

Deployment

Command below will deploy the Lambda function on AWS, together with setting up roles and policies.

npm run deploy

Notice: Because there are some limitations in Claudia.js support for policies, which could lead to issues with Access Denied when processing images from one bucket and saving them to another, we have decided to introduce support for custom policies.

Custom policies

Policies which should be installed together with our Lambda function are stored in policies/ directory. We keep there policy that grants access to all buckets, which is preventing possible errors with Access Denied described above. If you have any security-related concerns, feel free to change the:

"Resource": [
"*"
]

in the policies/s3-bucket-full-access.json to something more restrictive, like:

"Resource": [
"arn:aws:s3:::destination-bucket-name/*"
]

Just keep in mind, that you need to make those changes before you do the deployment.

Adding S3 event handlers

To complete installation process you will need to take one more action. It will allow you to install S3 Bucket event handler, which will send information about all uploaded images directly to your Lambda function.

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".jpg"

You are able to install multiple handlers per Bucket. So, to add handler for PNG files you just need to re-run above command with different suffix, ie:

npm run add-s3-handler --s3_bucket="your-bucket-name" --s3_prefix="directory/" --s3_suffix=".png"

Adding SNS message handlers

As an addition, you can also setup and SNS message handler in case you would like to process S3 events over an SNS topic.

npm run add-sns-handler --sns_topic="arn:of:SNS:topic"

Updating

To update Lambda with you latest code just use command below. Script will build new package and automatically publish it on AWS.

npm run update

More

For more scripts look into package.json.

Complete / Failed hooks

You can handle resize/reduce/backup process on success/error result on index.js. ImageProcessor::run will return Promise object, run your original code:

processor.run(config).then(function(proceedImages)){// Success case:// proceedImages is list of ImageData instance on you configuration/* your code here */// notify lambdacontext.succeed("OK, numbers of "+proceedImages.length+" images has proceeded.");}).catch(function(messages){// Failed case:// messages is list of string on error messages/* your code here */// notify lambdacontext.fail("Woops, image process failed: "+messages);});

Image resize

  • ImageMagick (installed on AWS Lambda)

Image reduce

License

MIT License.

Author

Yoshiaki Sugimoto

Image credits

Thanks for testing fixture images:

About

Automatic image resize/reduce on AWS Lambda

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages