{"id":62595,"date":"2024-06-27T14:03:42","date_gmt":"2024-06-27T08:33:42","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=62595"},"modified":"2024-06-28T17:05:10","modified_gmt":"2024-06-28T11:35:10","slug":"enabling-a-tv-ad-firm-to-reduce-risk-and-boost-reliability-with-canary-deployments","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/enabling-a-tv-ad-firm-to-reduce-risk-and-boost-reliability-with-canary-deployments\/","title":{"rendered":"Enabling a TV Ad Firm to Reduce Risk and Boost Reliability with Canary Deployments"},"content":{"rendered":"<p><b>Introduction<br \/>\n<\/b><span style=\"font-weight: 400;\">In today&#8217;s fast-paced software development landscape, ensuring that new features and updates are delivered reliably and without disruption is crucial. Canary deployments, a critical strategy within the DevOps toolkit, offer a powerful method to achieve this goal. <\/span><span style=\"font-weight: 400;\">One such great journey is the story of a <strong>Global Advertising Management Platform<\/strong> client, a powerhouse in advertising and connected TVs. With a state-of-the-art Connected TV Advertising Management Platform, they needed a trusted partner to manage their critical deployment process. This blog explores how canary deployments helped the client, ensuring seamless ad delivery and enhancing their deployment pipeline&#8217;s efficiency and reliability.<\/span><\/p>\n<p><b>What is Canary Deployment?<br \/>\n<\/b><span style=\"font-weight: 400;\">Canary deployments are a DevOps strategy that involves rolling out a new software version to a small, controlled subset of users before a full-scale release. This approach allows teams to monitor the impact of the latest changes in a real-world environment, quickly identify and resolve issues, and minimize risks associated with deployment.<br \/>\n<\/span><\/p>\n<div id=\"attachment_62622\" style=\"width: 656px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-62622\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-62622 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/06\/weight1.png\" alt=\"Canary Deployment\" width=\"646\" height=\"455\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/06\/weight1.png 646w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/weight1-300x211.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/weight1-624x440.png 624w\" sizes=\"(max-width: 646px) 100vw, 646px\" \/><p id=\"caption-attachment-62622\" class=\"wp-caption-text\">Canary Deployment<\/p><\/div>\n<h3><b>Requirements and Use Cases<\/b><\/h3>\n<ul>\n<li><strong>Testing Against Production Traffic<\/strong>: Our client needed to test various scenarios on a portion of their production traffic without disrupting the entire environment.<\/li>\n<li><strong>Selective Application Inclusion:<\/strong>\u00a0 Recognizing that not all applications require a canary deployment, we identified the critical ones for this implementation. By focusing on the essentials, we ensured an efficient process.<\/li>\n<li><strong>Balancing Automation and Manual Intervention<\/strong>: While aiming for full automation, we ensured a manageable initial setup with a clear path to automation.<\/li>\n<li><strong>Ensuring Reliable Rollback<\/strong>: We implemented a seamless rollback process to revert to the previous state if the canary release encountered issues or failed approval.<\/li>\n<li><strong>Compatibility and Coexistence<\/strong>: Application changes were designed to support the canary version running alongside the current one, following best practices for containerized deployments.<\/li>\n<\/ul>\n<h3><b>Existing Deployment Strategy and Its Challenges<\/b><\/h3>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Our existing deployment strategy relied on the <\/span><b>rolling update<\/b><span style=\"font-weight: 400;\"> feature of AWS ECS Service. New code underwent rigorous testing in the pre-production environment, where automated <\/span><b>regression<\/b><span style=\"font-weight: 400;\"> and <\/span><b>unit tests<\/b><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"> were conducted, supplemented by manual testing from the QA team. We used artifacts and Docker images built in a pre-production environment in production. However, deploying new code directly to production posed significant risks despite these measures.<br \/>\n<\/span><\/span><\/p>\n<div class=\"mceTemp\"><\/div>\n<p><div id=\"attachment_62624\" style=\"width: 635px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-62624\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-62624 size-large\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Preprod-Deployment-1024x620.png\" alt=\"Existing Preprod Deployment\" width=\"625\" height=\"378\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Preprod-Deployment-1024x620.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Preprod-Deployment-300x182.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Preprod-Deployment-768x465.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Preprod-Deployment-624x378.png 624w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Preprod-Deployment.png 1174w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><p id=\"caption-attachment-62624\" class=\"wp-caption-text\">Existing Preprod Deployment<\/p><\/div><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">With the rolling update approach, all new containers received 100% of the traffic once deployed in production. This setup left no room for error; any oversight or flaw missed during testing in lower environments could lead to sudden failures in production.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Moreover, our work heavily depended on real-time data that testing environments couldn&#8217;t mimic. Factors like <strong>user locations<\/strong>,<strong> IPs<\/strong>, and the <strong>flow of messages<\/strong> exchanged in real-time were critical and couldn&#8217;t be fully tested beforehand, leaving us at risk.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Traditional deployment methods also struggled to keep up with the rapid pace of our industry, failing to handle sudden traffic bursts or unexpected issues effectively. If we encountered problems such as an increase in <\/span><b>5xx errors<\/b><span style=\"font-weight: 400;\">, <\/span><b>memory leaks<\/b><span style=\"font-weight: 400;\">, or <\/span><b>High CPU<\/b><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"> usage, we were forced to roll back everything in production to the previous stable version, causing disruptions and potential losses.<br \/>\n<\/span><\/span><\/p>\n<div class=\"mceTemp\"><\/div>\n<p><div id=\"attachment_62626\" style=\"width: 635px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-62626\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-62626 size-large\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Prod-Deployment-1024x502.png\" alt=\"Existing Prod Deployment\" width=\"625\" height=\"306\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Prod-Deployment-1024x502.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Prod-Deployment-300x147.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Prod-Deployment-768x376.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Prod-Deployment-624x306.png 624w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Existing-Prod-Deployment.png 1157w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><p id=\"caption-attachment-62626\" class=\"wp-caption-text\">Existing Prod Deployment<\/p><\/div><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Recognizing these shortcomings, we decided to transition to a canary deployment model. This approach allowed us to mitigate risks by gradually routing a small percentage of traffic to the new code, enabling us to observe its behavior in a real-world setting. In our upcoming discussion on canary deployment design, we&#8217;ll examine how this strategy addressed our challenges and ensured a more stable and reliable deployment process.<\/span><\/li>\n<\/ul>\n<h3><b>Canary Deployment Design<br \/>\n<\/b><b>Jenkins Pipeline Integration<\/b><\/h3>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">We added 3 new stages in our Jenkins pipeline dedicated to canary deployments. <\/span><b>Canary Deployment<\/b><span style=\"font-weight: 400;\">, <\/span><b>Approve\/Disapprove Canary<\/b><span style=\"font-weight: 400;\"> and <\/span><b>Rollback Canary Applications<\/b><span style=\"font-weight: 400;\">.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">The canary application, named in the format <\/span><strong>app1_canary<\/strong><span style=\"font-weight: 400;\">, replicates the non-canary application <strong>app 1<\/strong>.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">We also configured load balancer target groups to direct <\/span><b>1%<\/b><span style=\"font-weight: 400;\"> of the traffic to the canary application and<\/span><b> 99%<\/b><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"> to the non-canary application. These percentages are handled via <strong>Terraform<\/strong> and can be changed from case to case.<br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><div id=\"attachment_62672\" style=\"width: 635px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-62672\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-62672 size-large\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-28-16-58-02-1024x473.png\" alt=\"Canary Deployment Strategy\" width=\"625\" height=\"289\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-28-16-58-02-1024x473.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-28-16-58-02-300x138.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-28-16-58-02-768x354.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-28-16-58-02-624x288.png 624w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-28-16-58-02.png 1092w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><p id=\"caption-attachment-62672\" class=\"wp-caption-text\">Canary Deployment Strategy<\/p><\/div><\/li>\n<\/ul>\n<h4><b>Liquibase Database Updates<\/b><\/h4>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Before deploying the new code, we perform database schema updates using Liquibase.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Liquibase<\/b><span style=\"font-weight: 400;\"> is an open-source database schema change management tool. It allows us to define database changes in a format that is easy to track and rollback if necessary, ensuring database schema consistency and reliability during deployments.<\/span><\/li>\n<\/ul>\n<h4><b>Canary Deployment<\/b><\/h4>\n<ul>\n<li style=\"font-weight: 400;\">The new code is deployed to the Canary application, where QA tests it with 1% traffic before the approval stage.<\/li>\n<\/ul>\n<h4><b>Approval Stage<\/b><\/h4>\n<ul>\n<li style=\"font-weight: 400;\">The QA team tests the canary deployment with 1% traffic; if approved, the new code is deployed to the rest of the application handling 99% of the traffic.\n<p><div id=\"attachment_62628\" style=\"width: 607px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-62628\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-62628 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/06\/Approval-1.png\" alt=\"Approval Stage\" width=\"597\" height=\"561\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/06\/Approval-1.png 597w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Approval-1-300x282.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Approval-1-24x24.png 24w\" sizes=\"(max-width: 597px) 100vw, 597px\" \/><p id=\"caption-attachment-62628\" class=\"wp-caption-text\">Approval Stage<\/p><\/div><\/li>\n<\/ul>\n<h2><b>Rollback<\/b><\/h2>\n<ol>\n<li style=\"font-weight: 400;\"><b>Disapproval and Rollback:<\/b>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">If QA disapproves the canary deployment, a rollback is triggered.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">The rollback involves reverting the canary application and database schema (using Liquibase) to the previous stable version.<br \/>\n<\/span><\/span><\/p>\n<div class=\"mceTemp\"><\/div>\n<p><div id=\"attachment_62630\" style=\"width: 476px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-62630\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-62630 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/06\/rollback.png\" alt=\"rollback \" width=\"466\" height=\"497\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/06\/rollback.png 466w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/rollback-281x300.png 281w\" sizes=\"(max-width: 466px) 100vw, 466px\" \/><p id=\"caption-attachment-62630\" class=\"wp-caption-text\">rollback<\/p><\/div><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">This is achieved by running a dedicated <\/span><span style=\"font-weight: 400;\">canaryRollback<\/span><span style=\"font-weight: 400;\"> Jenkins job that automates the rollback process.<\/span>\n<p><div id=\"attachment_62631\" style=\"width: 364px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-62631\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-62631 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/06\/rollback1.png\" alt=\"Rollback Strategy\" width=\"354\" height=\"214\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/06\/rollback1.png 354w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/rollback1-300x181.png 300w\" sizes=\"(max-width: 354px) 100vw, 354px\" \/><p id=\"caption-attachment-62631\" class=\"wp-caption-text\">Rollback Strategy<\/p><\/div><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2><b>Monitoring<\/b><\/h2>\n<ol>\n<li style=\"font-weight: 400;\"><b>Kibana Logs and CloudWatch Dashboards:<\/b>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">QA uses Kibana logs to monitor real-time application logs during the canary deployment.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">CloudWatch dashboards are set up to track key metrics such as <\/span><b>CPU usage, memory usage,<\/b><span style=\"font-weight: 400;\"> and <\/span><b>HTTP response codes (5xx and 4xx<\/b><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">.<br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><div id=\"attachment_62634\" style=\"width: 635px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-62634\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-62634 size-large\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-26-15-12-27-1024x532.png\" alt=\"Cloudwatch Dashboard\" width=\"625\" height=\"325\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-26-15-12-27-1024x532.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-26-15-12-27-300x156.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-26-15-12-27-768x399.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-26-15-12-27-1536x797.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-26-15-12-27-624x324.png 624w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/Screenshot-from-2024-06-26-15-12-27.png 1880w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><p id=\"caption-attachment-62634\" class=\"wp-caption-text\">Cloudwatch Dashboard<\/p><\/div><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\"><b>CloudWatch Alarms:<\/b>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Specific CloudWatch alarms are configured for the canary application to alert the team of any anomalies or issues.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">These alarms help quickly identify and respond to potential problems during the canary phase.<\/span><\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\"><b>Approval for Full Deployment:<\/b>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">After thorough testing and monitoring, QA approves the canary deployment if everything looks good. The new software version is now deployed to the entire application.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">This ensures that the updated software handles 100% of the traffic, providing a seamless transition from canary to full deployment.<br \/>\n<\/span><\/span><\/p>\n<div class=\"mceTemp\"><\/div>\n<p><div id=\"attachment_62632\" style=\"width: 635px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-62632\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-62632 size-large\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/06\/approval-stage-1024x228.png\" alt=\"approval stage\" width=\"625\" height=\"139\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/06\/approval-stage-1024x228.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/approval-stage-300x67.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/approval-stage-768x171.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/approval-stage-624x139.png 624w, \/blog\/wp-ttn-blog\/uploads\/2024\/06\/approval-stage.png 1392w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><p id=\"caption-attachment-62632\" class=\"wp-caption-text\">approval stage<\/p><\/div><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">The final approval skips the canary rollback stage and proceeds with deploying the new software to the entire application.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">By integrating canary deployments into our Jenkins pipeline, we can ensure a safer and more controlled rollout of new software versions, with the ability to quickly rollback if issues are detected.<\/span><\/p>\n<h3><b>Business Benefits After Moving To Canary Deployments<\/b><\/h3>\n<ul>\n<li style=\"font-weight: 400;\"><b>Maintained high availability and reliability<\/b><span style=\"font-weight: 400;\"> by minimizing the impact of potential issues.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Deliver better customer experiences<\/b><span style=\"font-weight: 400;\"> through well-tested, stable releases.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Operational Efficiency<\/b><span style=\"font-weight: 400;\">: Smoother, less stressful deployments and easier rollback if needed..<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Stay competitive and innovative<\/b><span style=\"font-weight: 400;\"> with faster, more frequent updates.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Enhance decision-making<\/b><span style=\"font-weight: 400;\"> with insights gained from real-world user feedback during canary phases.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Real-World Testing<\/b><span style=\"font-weight: 400;\">: Allows for early detection of issues using real user interactions.<\/span><\/li>\n<\/ul>\n<h2><b>Conclusion<\/b><\/h2>\n<p>Transitioning to a canary deployment model was transformative for our client, significantly reducing deployment risks by introducing new code to a small percentage of traffic and allowing early issue detection. At <strong>TO THE NEW<\/strong>, we excel in simplifying AWS cloud migrations and implementing advanced deployment strategies. Our <strong>AWS Certified Architects<\/strong> and <strong>DevOps Engineers<\/strong> are committed to saving you time and resources while enhancing business efficiency and reliability. Stay tuned for more insights and developments as we continue our journey toward deployment excellence.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In today&#8217;s fast-paced software development landscape, ensuring that new features and updates are delivered reliably and without disruption is crucial. Canary deployments, a critical strategy within the DevOps toolkit, offer a powerful method to achieve this goal. One such great journey is the story of a Global Advertising Management Platform client, a powerhouse in [&hellip;]<\/p>\n","protected":false},"author":1601,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":48},"categories":[2348],"tags":[6052,4252,1366,1892,6053],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/62595"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/1601"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=62595"}],"version-history":[{"count":12,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/62595\/revisions"}],"predecessor-version":[{"id":62675,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/62595\/revisions\/62675"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=62595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=62595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=62595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}