{"id":340,"date":"2024-06-10T18:48:23","date_gmt":"2024-06-11T01:48:23","guid":{"rendered":"http:\/\/184.72.63.26\/?p=340"},"modified":"2024-06-17T22:34:18","modified_gmt":"2024-06-18T05:34:18","slug":"building-a-serverless-event-driven-order-fulfillment-system-using-aws-eventbridge-part-2","status":"publish","type":"post","link":"https:\/\/www.wallacel.com\/index.php\/2024\/06\/10\/building-a-serverless-event-driven-order-fulfillment-system-using-aws-eventbridge-part-2\/","title":{"rendered":"Building a Serverless Event-Driven Order Fulfillment System using AWS EventBridge (Part 2)"},"content":{"rendered":"\n<p>This is part 2 of my last post, &#8220;<a href=\"http:\/\/184.72.63.26\/index.php\/2024\/06\/08\/building-a-serverless-event-driven-order-fulfillment-system-part-1\/\" data-type=\"link\" data-id=\"https:\/\/www.linkedin.com\/pulse\/building-serverless-event-driven-order-fulfillment-system-wallace-lee-mlbvc\">Building a Serverless Event-Driven Order Fulfillment System using AWS Event Bridge<\/a>&#8220;. In Part 1, I&#8217;ve already setup the infrastructure to accept orders and publish them as events to EventBridge, along with routing them to an API destination and CloudWatch log group. For the next steps, we can build upon that foundation and add two more rules to further process the orders. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"911\" height=\"661\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/EDA-8.png\" alt=\"\" class=\"wp-image-391\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/EDA-8.png 911w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/EDA-8-300x218.png 300w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/EDA-8-768x557.png 768w\" sizes=\"auto, (max-width: 911px) 100vw, 911px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Route Orders to Workflow<\/h2>\n\n\n\n<p>Here is a very simple workflow that listens to new order events from the EventBridge and publishes back an order processed event. In a more complicated case we can pass the content of the event from EventBridge and use the event payload in the Step Functions.  <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"313\" height=\"214\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/workflow-1.png\" alt=\"\" class=\"wp-image-370\" style=\"width:271px;height:auto\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/workflow-1.png 313w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/workflow-1-300x205.png 300w\" sizes=\"auto, (max-width: 313px) 100vw, 313px\" \/><\/figure>\n\n\n\n<p>To create a workflow, go to <strong>Step Functions<\/strong> console and create a <strong>New State Machine<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"760\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-35-1024x760.png\" alt=\"\" class=\"wp-image-359\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-35-1024x760.png 1024w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-35-300x223.png 300w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-35-768x570.png 768w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-35.png 1044w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>With the Visual Designer, select <strong>Flow<\/strong> and drag a <strong>Pass<\/strong> state to the workflow:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"699\" height=\"553\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-36.png\" alt=\"\" class=\"wp-image-360\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-36.png 699w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-36-300x237.png 300w\" sizes=\"auto, (max-width: 699px) 100vw, 699px\" \/><\/figure>\n\n\n\n<p>Next we select <strong>Actions<\/strong> and choose <strong>Amazon EventBridge<\/strong> and add a <strong>PutEvents<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"701\" height=\"416\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-37.png\" alt=\"\" class=\"wp-image-361\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-37.png 701w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-37-300x178.png 300w\" sizes=\"auto, (max-width: 701px) 100vw, 701px\" \/><\/figure>\n\n\n\n<p>To write an event with a &#8220;Order Processed&#8221; type to your Orders event bus via the PutEvents API Parameters, you&#8217;ll need to provide the following JSON payload.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">{\n  \"Entries\": [\n    {\n      \"Detail\": {\n        \"OrderId\": \"new_id\",\n        \"OrderDetails.$\": \"$.detail\"\n      },\n      \"DetailType\": \"Order Processed\",\n      \"EventBusName\": \"Orders\",\n      \"Source\": \"com.aws.orders\"\n    }\n  ]\n}<\/code><\/pre>\n\n\n\n<p>Additionally, make sure to unselect the &#8220;Wait for callback&#8221; option if it&#8217;s selected, as you don&#8217;t need to wait for a callback in this scenario.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"621\" height=\"499\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-38.png\" alt=\"\" class=\"wp-image-362\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-38.png 621w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-38-300x241.png 300w\" sizes=\"auto, (max-width: 621px) 100vw, 621px\" \/><\/figure>\n\n\n\n<p>Now we can define a new event rule &#8216;<strong>EUOrdertoStepFunctions<\/strong>&#8216; specifically targeting orders with &#8216;EU&#8217; locations to the workflow in Step Functions.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"715\" height=\"619\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-39.png\" alt=\"\" class=\"wp-image-363\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-39.png 715w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-39-300x260.png 300w\" sizes=\"auto, (max-width: 715px) 100vw, 715px\" \/><\/figure>\n\n\n\n<p>For event pattern, match orders with locations originating from &#8216;<strong>eu-west<\/strong>&#8216; only.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"727\" height=\"735\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-40.png\" alt=\"\" class=\"wp-image-364\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-40.png 727w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-40-297x300.png 297w\" sizes=\"auto, (max-width: 727px) 100vw, 727px\" \/><\/figure>\n\n\n\n<p>Choose <strong>Step Functions state machine<\/strong> as the target and workflow created earlier in <strong>State machine<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"730\" height=\"327\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-42.png\" alt=\"\" class=\"wp-image-366\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-42.png 730w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-42-300x134.png 300w\" sizes=\"auto, (max-width: 730px) 100vw, 730px\" \/><\/figure>\n\n\n\n<p>To trigger the execution of our workflow, let&#8217;s make a call to our Producer API with the following parameters:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">https:\/\/xxx.execute-api.ca-central-1.amazonaws.com\/dev?location=eu-west&amp;category=office-supplies&amp;value=300<\/code><\/pre>\n\n\n\n<p>Once the request is made successfully, our Producer API will publish the order event to EventBridge, triggering the associated event rule, which in turn will invoke the Step Functions workflow to process the order.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"935\" height=\"726\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-43.png\" alt=\"\" class=\"wp-image-367\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-43.png 935w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-43-300x233.png 300w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-43-768x596.png 768w\" sizes=\"auto, (max-width: 935px) 100vw, 935px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"990\" height=\"646\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-44.png\" alt=\"\" class=\"wp-image-368\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-44.png 990w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-44-300x196.png 300w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-44-768x501.png 768w\" sizes=\"auto, (max-width: 990px) 100vw, 990px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Route Orders to Lambda Function and DynamoDB<\/h2>\n\n\n\n<p>To complete the order processing flow, we will create a new event rule that routes processed order events to a Lambda function. This Lambda function will store the order details in a DynamoDB table and then publish a dispatch order event to the Orders event bus.<\/p>\n\n\n\n<p>An order consists of an <strong>orderId<\/strong> with the following attributes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>category<\/strong><\/li>\n\n\n\n<li><strong>location<\/strong><\/li>\n\n\n\n<li><strong>value<\/strong><\/li>\n<\/ul>\n\n\n\n<p>First, create a new DynamoDB table with the following details:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Table name: <strong>OrderDetails<\/strong><\/li>\n\n\n\n<li>Partition key: <strong>orderId<\/strong><\/li>\n\n\n\n<li>Partition key type: <strong>String<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"837\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-45-1024x837.png\" alt=\"\" class=\"wp-image-378\" style=\"width:596px;height:auto\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-45-1024x837.png 1024w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-45-300x245.png 300w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-45-768x628.png 768w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-45.png 1422w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>To allow the Lambda function to write to the DynamoDB table, I need to create an IAM policy with the appropriate permissions as follow and attach it to the Lambda function&#8217;s execution role.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">{\n\t\"Version\": \"2012-10-17\",\n\t\"Statement\": [\n\t\t{\n\t\t\t\"Sid\": \"Statement1\",\n\t\t\t\"Effect\": \"Allow\",\n\t\t\t\"Action\": [\n\t\t\t\t\"dynamodb:BatchGetItem\",\n\t\t\t\t\"dynamodb:GetItem\",\n\t\t\t\t\"dynamodb:Query\",\n\t\t\t\t\"dynamodb:Scan\",\n\t\t\t\t\"dynamodb:BatchWriteItem\",\n\t\t\t\t\"dynamodb:PutItem\",\n\t\t\t\t\"dynamodb:UpdateItem\",\n\t\t\t\t\"events:PutEvents\"\n\t\t\t],\n\t\t\t\"Resource\": [\n\t\t\t\t\"arn:aws:dynamodb:*:*:table\/OrderDetails\",\n\t\t\t\t\"arn:aws:events:*:*:event-bus\/Orders\"\t\t\t\t\n\t\t\t]\n\t\t}\n\t]\n}<\/code><\/pre>\n\n\n\n<p>The policy also grants the Lambda function to write events to our <strong>Orders<\/strong> event bus. Now let&#8217;s create a Lambda function that performs the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Read order details (category, location, value) from the order event payload <\/li>\n\n\n\n<li>Generate a new order id and save the order details to the <strong>OrderDetails<\/strong> table<\/li>\n\n\n\n<li>Publish a order dispatch event with order details to <strong>Orders<\/strong> event bus<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"879\" height=\"607\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-49.png\" alt=\"\" class=\"wp-image-384\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-49.png 879w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-49-300x207.png 300w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-49-768x530.png 768w\" sizes=\"auto, (max-width: 879px) 100vw, 879px\" \/><\/figure>\n\n\n\n<p>Edit the Lambda function&#8217;s execution role and attach our new IAM policy to it. Verify the function has permissions to access both the DynamoDB and EventBridge.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"860\" height=\"627\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-52.png\" alt=\"\" class=\"wp-image-387\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-52.png 860w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-52-300x219.png 300w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-52-768x560.png 768w\" sizes=\"auto, (max-width: 860px) 100vw, 860px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"877\" height=\"512\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-55.png\" alt=\"\" class=\"wp-image-390\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-55.png 877w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-55-300x175.png 300w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-55-768x448.png 768w\" sizes=\"auto, (max-width: 877px) 100vw, 877px\" \/><\/figure>\n\n\n\n<p>To create an EventBridge rule that routes only processed orders to my Lambda function, define an event pattern that matches events with the &#8220;Order Processed&#8221; detail type.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">{\n  \"source\": [\"com.aws.orders\"],\n  \"detail-type\": [\"Order Processed\"]\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"922\" height=\"664\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-56.png\" alt=\"\" class=\"wp-image-392\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-56.png 922w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-56-300x216.png 300w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-56-768x553.png 768w\" sizes=\"auto, (max-width: 922px) 100vw, 922px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"652\" height=\"585\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-57.png\" alt=\"\" class=\"wp-image-393\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-57.png 652w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-57-300x269.png 300w\" sizes=\"auto, (max-width: 652px) 100vw, 652px\" \/><\/figure>\n\n\n\n<p>Choose the Lambda function created as target and save the rule. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"670\" height=\"660\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-58.png\" alt=\"\" class=\"wp-image-394\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-58.png 670w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-58-300x296.png 300w\" sizes=\"auto, (max-width: 670px) 100vw, 670px\" \/><\/figure>\n\n\n\n<p>Test our Lambda function logic by calling our Producer API with the following parameters.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">https:\/\/xxx.execute-api.ca-central-1.amazonaws.com\/dev?location=eu-west&amp;category=general-supplies&amp;value=300<\/code><\/pre>\n\n\n\n<p>Verify that the order details are successfully saved into the DynamoDB <strong>OrderDetails<\/strong> table.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"897\" height=\"467\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-59.png\" alt=\"\" class=\"wp-image-395\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-59.png 897w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-59-300x156.png 300w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-59-768x400.png 768w\" sizes=\"auto, (max-width: 897px) 100vw, 897px\" \/><\/figure>\n\n\n\n<p>A dispatch order event with the same <strong>orderId<\/strong> is published to the <strong>Orders<\/strong> event bus, indicating that our Lambda function has successfully executed its logic.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"749\" height=\"541\" src=\"http:\/\/184.72.63.26\/wp-content\/uploads\/2024\/06\/image-60.png\" alt=\"\" class=\"wp-image-396\" srcset=\"https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-60.png 749w, https:\/\/www.wallacel.com\/wp-content\/uploads\/2024\/06\/image-60-300x217.png 300w\" sizes=\"auto, (max-width: 749px) 100vw, 749px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p>My serverless event-driven order fulfillment system is now fully operational, handling the end-to-end process of order submission, processing, and dispatching. I hope you can see how quickly it is to add extensions to a system that builds on Event-Driven Architecture. This approach allows for new functionalities without the need to change the event publisher-consumer model. <\/p>\n\n\n\n<p>You can find all the source codes in my <a href=\"https:\/\/github.com\/wallylee99\/eda-work\">GitHub<\/a> repository. Thank you for reading my post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is part 2 of my last post, &#8220;Building a Serverless Event-Driven Order Fulfillment System using AWS Event Bridge&#8220;. In Part 1, I&#8217;ve already setup the infrastructure to accept orders and publish them as events to EventBridge, along with routing them to an API destination and CloudWatch log group. For the next steps, we can [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":403,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[19,30,29],"class_list":["post-340","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aws","tag-aws","tag-event-driven-architecture-2","tag-eventbridge"],"_links":{"self":[{"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/posts\/340","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/comments?post=340"}],"version-history":[{"count":22,"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/posts\/340\/revisions"}],"predecessor-version":[{"id":495,"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/posts\/340\/revisions\/495"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/media\/403"}],"wp:attachment":[{"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/media?parent=340"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/categories?post=340"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wallacel.com\/index.php\/wp-json\/wp\/v2\/tags?post=340"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}