{"id":22416,"date":"2021-09-09T14:02:15","date_gmt":"2021-09-09T14:02:15","guid":{"rendered":"http:\/\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary"},"modified":"2024-05-29T17:10:54","modified_gmt":"2024-05-30T00:10:54","slug":"a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary","title":{"rendered":"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p><strong>tl;dr:<\/strong>\nAn AWS-secured and optimized Cloudinary webhook listener for extending the Cloudinary service<\/p>\n<p><strong>Code:<\/strong> <a href=\"https:\/\/github.com\/cloudinary-devs\/web-listener-blueprint-aws\">Github<\/a><\/p>\n<hr \/>\n<p>A webhook is a communication medium for sending notifications from one platform to another about events that occurred. In place are user-defined HTTP callbacks that are triggered by specific events. When a triggered event takes place on the source site, the webhook listens to the event, collects the data, and sends it to the URL you specified in the form of an HTTP request.<\/p>\n<p>With Cloudinary webhooks, you can augment Cloudinary capabilities with home-grown code or third-party APIs by triggering actions in your application when certain events occur in your Cloudinary account. In essence, a Cloudinary webhook is a small piece of code that takes action upon <a href=\"https:\/\/cloudinary.com\/documentation\/notifications\">a Cloudinary event<\/a>, such as a file upload, a metadata modification, or the <a href=\"https:\/\/cloudinary.com\/documentation\/transformations_on_upload#eager_asynchronous_transformations\">complete processing of a media asset<\/a>.<\/p>\n<p>The sections below describe a blueprint of a Hello World! Cloudinary webhook listener that is deploy-ready and customizable with a few clicks or lines of code.<\/p>\n<h2>Real-Life Use Case<\/h2>\n<p>A prominent digital-transformation agency that specializes in luxury fashion migrated a legacy DAM to Cloudinary to leverage our platform\u2019s new capabilities but continue to use the current middleware. Here\u2019s what the agency aimed to accomplish:<\/p>\n<ul>\n<li>Poll Cloudinary on a fixed frequency for changes in content and specific metadata fields.<\/li>\n<li>Preprocess short videos with an <a href=\"https:\/\/cloudinary.com\/documentation\/video_optimization#automatic_format_selection_f_auto\">optimized format<\/a> and <a href=\"https:\/\/cloudinary.com\/documentation\/video_optimization#automatic_quality_q_auto\">quality compression<\/a>.<\/li>\n<li>Preprocess long videos with <a href=\"https:\/\/cloudinary.com\/documentation\/adaptive_bitrate_streaming\">adaptive bitrate (ABR) streaming<\/a>.<\/li>\n<\/ul>\n<p>Accordingly, the agency did the following:<\/p>\n<ol>\n<li>\n<p>Adopted the template in this post to quickly deploy a global web listener that checks if an asset or the nominated metadata has been changed and, if so, update another metadata field to reflect the last update timestamp (<code>last_update_timestamp<\/code>).<\/p>\n<\/li>\n<li>\n<p>Fulfilled the polling requirement with Cloudinary\u2019s <a href=\"https:\/\/cloudinary.com\/documentation\/admin_api\"><code>search<\/code>  API<\/a>.<\/p>\n<\/li>\n<li>\n<p>Through the same web listener, determined if an event is an upload of a video. If so, gauge if the video size is large or small.<\/p>\n<\/li>\n<li>\n<p>Executed the required preprocessing with Cloudinary\u2019s <a href=\"https:\/\/cloudinary.com\/documentation\/image_upload_api_reference#explicit_method\"><code>explicit<\/code>  method<\/a>.<\/p>\n<\/li>\n<\/ol>\n<p>Vincenzo Cerbone, technical consultant of <a href=\"https:\/\/www.openmindonline.it\">openmind<\/a>, said:<\/p>\n<p>\u201cWe had a previous experience in batch synchronization with a legacy DAM based on polling techniques. Despite the pros and cons of that approach, we valued the user\u2019s asset state on Cloudinary the most. That means that we let the CMS act more as a \u2018slave\u2019 of the user\u2019s decisions on the Cloudinary side rather than the opposite. The connection point between the two worlds is the mandatory <code>CMS_ID<\/code> SMD custom field. The rest of the \u2018magic\u2019 is done through AWS Lambda functions (WebListeners) Yuval suggested. Ultimately, that mechanism took care of all the essential transformations.<\/p>\n<p>We look forward to other upcoming features from Cloudinary that this use case can take advantage of. It\u2019s truly exciting to be part of this process!\u201c<\/p>\n<h2>Use Cases<\/h2>\n<p>Cloudinary offers an end-to-end media-management solution for images and videos, including upload, storage, administration, transformation, optimization, and delivery. The many features open up numerous use cases for a webhook listener, such as the following:<\/p>\n<ul>\n<li>Updates to an activity feed on a front-end system with asset-related events and details, such as when someone uploads an asset to the Cloudinary Media Library or deletes one from there.<\/li>\n<li>Bulk processing of records listed in an uploaded CSV file.<\/li>\n<li>Updates to the asset metadata stored in an external database in the event of updates to an asset\u2019s metadata in the Cloudinary Media Library<\/li>\n<li>Extraction of metadata from assets uploaded with Cloudinary\u2019s upload widget\u2014for tagging in an external system.<\/li>\n<li>Dispatch of a text message or email to a customer in case of asset uploads.<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/c_fill,dpr_2.0,f_auto,q_auto,w_700\/Web_Assets\/blog\/webhook-blueprint-aws-diagram.png\" alt=\"Overview Diagram\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"779\"\/><\/p>\n<h2>Prerequisites<\/h2>\n<p>To create a blueprint for a Cloudinary webhook listener, you need the following:<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/users\/login\">A Cloudinary account<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/aws.amazon.com\/console\/\">An AWS account<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/docs.aws.amazon.com\/cli\/latest\/userguide\/cli-chap-install.html\">The AWS command-line interface (CLI)<\/a>\n<\/li>\n<li>A functional S3 bucket<\/li>\n<\/ul>\n<h2>Installation and Setup<\/h2>\n<p>Upon installation, the blueprint for a Cloudinary webhook listener calls for the following:<\/p>\n<ol>\n<li>Install a Lambda listener that adds the tag <code>Hello World!<\/code> to any asset you upload to your Cloudinary account.<\/li>\n<li>Store your Cloudinary account\u2019s credentials in the Amazon Web Services (AWS) Secrets Manager, logging the web-listener activity in Cloudwatch.<\/li>\n<\/ol>\n<p>The installation and setup process takes a few minutes. The boilerplate code is under 50 lines of Python script, easily accessible through AWS Lambda\u2019s code editor.<\/p>\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>Here\u2019s <a href=\"https:\/\/github.com\/cloudinary-devs\/web-listener-blueprint-aws\">the code for this tutorial<\/a><\/p><\/div>\n<p>To set up the tutorial, follow the instructions in the <a href=\"https:\/\/github.com\/cloudinary-devs\/web-listener-blueprint-aws#readme\"><code>README.md<\/code><\/a> file.<\/p>\n<h2>Code Tutorial<\/h2>\n<ol>\n<li>\n<p>Write to your preferred logging solution: either use the default AWS logger with CloudWatch or override <code>set_logger<\/code>. The entry point is where the Cloudinary event was first received.<\/p>\n<p><code>validate_signature<\/code> ensures that the events received are authentic. Note the mandatory return syntax, which  informs Cloudinary that the function has been completed successfully. If the function fails, Cloudinary resends the notification three more times: once after three minutes, then after nine minutes, and then after 27 minutes. <code>exception_wrapper<\/code> adheres to that syntax as well.<\/p>\n<\/li>\n<li>\n<p>Place your code in the <code>main_process<\/code> function. The example below shows how to write back a tag to the uploaded asset. Here, to avoid additional I\/O operations, the utility function <code>config_cloudinary_instance()<\/code> validates the event\u2019s authenticity with cached credentials.<\/p>\n<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\"><code>def lambda_handler(event, context):\n    try:\n        set_logger()\n        logger.info(json.dumps(event))\n        validate_signature(event)\n        main_process(json.loads(event['body']))\n    except Exception as e:\n        return exception_wrapper(logger, e)\n    return {'statusCode': 200, 'body': 'OK', 'isBase64Encoded': False}\n<\/code><\/pre>\n<p>The <code>main_process<\/code> function is where you\u2019ll place your own code. The example shows how to write back a tag to the uploaded asset. To prevent additional I\/O operations, the utility function <code>config_cloudinary_instance()<\/code> ensures that the cached credentials that validated the event\u2019s authenticity are in use.<\/p>\n<h2>Further Options and Resources<\/h2>\n<p>Check out the resources below on creating and managing webhook listeners.<\/p>\n<p><strong>When uploading assets<\/strong>:<\/p>\n<ul>\n<li>Modify the original asset with <a href=\"https:\/\/cloudinary.com\/documentation\/transformations_on_upload#incoming_transformations\">incoming transformations<\/a>.<\/li>\n<li>Eagerly transform assets with <a href=\"https:\/\/cloudinary.com\/documentation\/transformations_on_upload#eager_transformations\">eager transformations<\/a>.<\/li>\n<li>Calculate upload parameters in JavaScript with the <a href=\"https:\/\/cloudinary.com\/documentation\/analysis_on_upload#evaluating_and_modifying_upload_parameters\"><code>eval<\/code>  parameter<\/a>.<\/li>\n<\/ul>\n<p><strong>When delivering assets<\/strong>:<\/p>\n<ul>\n<li>Apply different transformations to different assets with <a href=\"https:\/\/cloudinary.com\/documentation\/conditional_transformations\">conditional transformations<\/a>.<\/li>\n<li>Customize client-side functions with <a href=\"https:\/\/cloudinary.com\/documentation\/custom_functions#webassembly_functions\">WASM code<\/a>.<\/li>\n<li>Customize image transformations with <a href=\"https:\/\/cloudinary.com\/documentation\/custom_functions#remote_functions\">remote functions<\/a>.<\/li>\n<\/ul>\n<h2>Summary<\/h2>\n<p>As always, our goal at Cloudinary is to efficiently manage, transform, and optimize your web and mobile app\u2019s media assets, freeing you up to focus on your core business logic. Oftentimes, real-world use cases are complex and diverse, involving front-end and back-end systems as well as asynchronous workflows. Cloudinary\u2019s webhooks with their ability to perform custom computing tasks promise to be useful tools for handling even the most demanding media-management tasks.<\/p>\n<p>We\u2019d much appreciate your feedback on this new blueprint.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":22417,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[25,305],"class_list":["post-22416","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-asset-management","tag-video-api"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.3 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>A Blueprint for AWS-Secured Webhook Listeners for Cloudinary<\/title>\n<meta name=\"description\" content=\"How to build AWS-secured and optimized webhook listeners for extending Cloudinary\u2019s capabilities.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary\" \/>\n<meta property=\"og:description\" content=\"How to build AWS-secured and optimized webhook listeners for extending Cloudinary\u2019s capabilities.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-09T14:02:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-30T00:10:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649722833\/Web_Assets\/blog\/webhook-blueprint-aws_224170adb3\/webhook-blueprint-aws_224170adb3-png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary\",\"datePublished\":\"2021-09-09T14:02:15+00:00\",\"dateModified\":\"2024-05-30T00:10:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary\"},\"wordCount\":8,\"publisher\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/res.cloudinary.com\\\/cloudinary-marketing\\\/images\\\/f_auto,q_auto\\\/v1649722833\\\/Web_Assets\\\/blog\\\/webhook-blueprint-aws_224170adb3\\\/webhook-blueprint-aws_224170adb3.png?_i=AA\",\"keywords\":[\"Asset Management\",\"Video API\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2021\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary\",\"url\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary\",\"name\":\"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/res.cloudinary.com\\\/cloudinary-marketing\\\/images\\\/f_auto,q_auto\\\/v1649722833\\\/Web_Assets\\\/blog\\\/webhook-blueprint-aws_224170adb3\\\/webhook-blueprint-aws_224170adb3.png?_i=AA\",\"datePublished\":\"2021-09-09T14:02:15+00:00\",\"dateModified\":\"2024-05-30T00:10:54+00:00\",\"description\":\"How to build AWS-secured and optimized webhook listeners for extending Cloudinary\u2019s capabilities.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#primaryimage\",\"url\":\"https:\\\/\\\/res.cloudinary.com\\\/cloudinary-marketing\\\/images\\\/f_auto,q_auto\\\/v1649722833\\\/Web_Assets\\\/blog\\\/webhook-blueprint-aws_224170adb3\\\/webhook-blueprint-aws_224170adb3.png?_i=AA\",\"contentUrl\":\"https:\\\/\\\/res.cloudinary.com\\\/cloudinary-marketing\\\/images\\\/f_auto,q_auto\\\/v1649722833\\\/Web_Assets\\\/blog\\\/webhook-blueprint-aws_224170adb3\\\/webhook-blueprint-aws_224170adb3.png?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/res.cloudinary.com\\\/cloudinary-marketing\\\/images\\\/f_auto,q_auto\\\/v1649718331\\\/Web_Assets\\\/blog\\\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\\\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\\\/\\\/res.cloudinary.com\\\/cloudinary-marketing\\\/images\\\/f_auto,q_auto\\\/v1649718331\\\/Web_Assets\\\/blog\\\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\\\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary","description":"How to build AWS-secured and optimized webhook listeners for extending Cloudinary\u2019s capabilities.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary","og_locale":"en_US","og_type":"article","og_title":"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary","og_description":"How to build AWS-secured and optimized webhook listeners for extending Cloudinary\u2019s capabilities.","og_url":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary","og_site_name":"Cloudinary Blog","article_published_time":"2021-09-09T14:02:15+00:00","article_modified_time":"2024-05-30T00:10:54+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649722833\/Web_Assets\/blog\/webhook-blueprint-aws_224170adb3\/webhook-blueprint-aws_224170adb3-png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary"},"author":{"name":"","@id":""},"headline":"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary","datePublished":"2021-09-09T14:02:15+00:00","dateModified":"2024-05-30T00:10:54+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary"},"wordCount":8,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722833\/Web_Assets\/blog\/webhook-blueprint-aws_224170adb3\/webhook-blueprint-aws_224170adb3.png?_i=AA","keywords":["Asset Management","Video API"],"inLanguage":"en-US","copyrightYear":"2021","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary","url":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary","name":"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722833\/Web_Assets\/blog\/webhook-blueprint-aws_224170adb3\/webhook-blueprint-aws_224170adb3.png?_i=AA","datePublished":"2021-09-09T14:02:15+00:00","dateModified":"2024-05-30T00:10:54+00:00","description":"How to build AWS-secured and optimized webhook listeners for extending Cloudinary\u2019s capabilities.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722833\/Web_Assets\/blog\/webhook-blueprint-aws_224170adb3\/webhook-blueprint-aws_224170adb3.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722833\/Web_Assets\/blog\/webhook-blueprint-aws_224170adb3\/webhook-blueprint-aws_224170adb3.png?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"parsely":{"version":"1.1.0","canonical_url":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary","smart_links":{"inbound":0,"outbound":0},"traffic_boost_suggestions_count":0,"meta":{"@context":"https:\/\/schema.org","@type":"NewsArticle","headline":"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary","url":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary","mainEntityOfPage":{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722833\/Web_Assets\/blog\/webhook-blueprint-aws_224170adb3\/webhook-blueprint-aws_224170adb3.png?_i=AA&w=150&h=150&crop=1","image":{"@type":"ImageObject","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722833\/Web_Assets\/blog\/webhook-blueprint-aws_224170adb3\/webhook-blueprint-aws_224170adb3.png?_i=AA"},"articleSection":"Uncategorized","author":[],"creator":[],"publisher":{"@type":"Organization","name":"Cloudinary Blog","logo":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA"},"keywords":["asset management","video api"],"dateCreated":"2021-09-09T14:02:15Z","datePublished":"2021-09-09T14:02:15Z","dateModified":"2024-05-30T00:10:54Z"},"rendered":"<meta name=\"parsely-title\" content=\"A Blueprint for AWS-Secured Webhook Listeners for Cloudinary\" \/>\n<meta name=\"parsely-link\" content=\"https:\/\/cloudinary.com\/blog\/a_blueprint_for_aws_secured_webhook_listeners_for_cloudinary\" \/>\n<meta name=\"parsely-type\" content=\"post\" \/>\n<meta name=\"parsely-image-url\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722833\/Web_Assets\/blog\/webhook-blueprint-aws_224170adb3\/webhook-blueprint-aws_224170adb3.png?_i=AA&w=150&amp;h=150&amp;crop=1\" \/>\n<meta name=\"parsely-pub-date\" content=\"2021-09-09T14:02:15Z\" \/>\n<meta name=\"parsely-section\" content=\"Uncategorized\" \/>\n<meta name=\"parsely-tags\" content=\"asset management,video api\" \/>","tracker_url":"https:\/\/cdn.parsely.com\/keys\/cloudinary.com\/p.js"},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722833\/Web_Assets\/blog\/webhook-blueprint-aws_224170adb3\/webhook-blueprint-aws_224170adb3.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22416","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=22416"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22416\/revisions"}],"predecessor-version":[{"id":34156,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22416\/revisions\/34156"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/22417"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=22416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=22416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=22416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}