{"id":12553,"date":"2022-12-20T16:28:35","date_gmt":"2022-12-20T10:58:35","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=12553"},"modified":"2022-12-20T16:28:35","modified_gmt":"2022-12-20T10:58:35","slug":"deploying-azure-policy-using-terraform-module","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2022\/12\/20\/deploying-azure-policy-using-terraform-module\/","title":{"rendered":"Deploying Azure Policy using Terraform Module"},"content":{"rendered":"\n<p class=\"has-text-align-justify\">While working on Azure, you might come across a requirement that says the resources being deployed should be in accordance with the organization\u2019s policies. Suppose you might want to grant a particular or a set of permissions on the resource group or on the management group so that the owner of it should be restricted like denying deploying of resources by enforcing resource tagging, region enforcement, allowing approved Virtual machines (VM) images, and many more.&nbsp;<\/p>\n\n\n\n<p class=\"has-text-align-justify\">In this blog, we will try to resolve these issues by applying Azure policies.&nbsp;<\/p>\n\n\n\n<p class=\"has-text-align-justify\">First, let&#8217;s get familiar with the <strong>azure policy<\/strong>.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><strong><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/NU2DScpoYtz8OcZGM9xu2kiCWhbtxuHfhOumLl0Ax8u1DN_MQQW0dKVOBJXKwTq6k91oMEOjJyWYFntX10wwx4kmTH5mHFSTIJmW-nS3rcY3M6l2KlHmXNzZkQxR0WZpXanUip0X0hEhvokvYtNEz1nt2Rsam6IjVGCxKKGtJrdQFJZ36XMjIIcwBXyucg\" width=\"365\" height=\"191\"><\/strong><\/p>\n\n\n\n<p class=\"has-text-align-justify\">The azure policy is a service that has been designed to help you enforce different rules and to act based on the rule&#8217;s effect on your Azure resources. You can use it to create, assign and manage policies. Azure policy evaluates your resources for non-compliance with assigned policies and performs the assigned effect.&nbsp;<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Azure policy is basically <strong>3 components<\/strong>&#8211; <em>policy definition<\/em>, <em>assignment<\/em><strong>,<\/strong> and <em>initiative policy<\/em>.<\/p>\n\n\n\n<p>So, <strong>Policy definition<\/strong> is the conditions under which you want to be controlled. There are built-in definitions such as controlling what type of resources can be deployed to enforce the use of tags on all resources. <strong>Policy assignment<\/strong> is the scope of what the policy definition can take effect around. <strong>Initiative policy<\/strong> is a collection of policies.&nbsp; <\/p>\n\n\n\n<p class=\"has-text-align-justify\">Azure policies can be implemented at various scopes within the organization. They are : <\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-1 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<ul>\n<li>Management groups<\/li>\n\n\n\n<li>Subscriptions<\/li>\n\n\n\n<li>Resource groups&nbsp;<\/li>\n\n\n\n<li>Individual resources&nbsp;<\/li>\n<\/ul>\n<\/div>\n<\/div>\n\n\n\n<p>Now we&#8217;ll achieve this by using our terraform code. <strong>So let&#8217;s get started!!!!<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>AZURE POLICY WITH OT-terraform-azure-modules&nbsp;<\/strong><\/h4>\n\n\n\n<p class=\"has-text-align-justify\">First, let&#8217;s introduce you to OT-terraform-azure-modules i.e., It is an open-source project of Opstree where people from our organization contribute to the azure terraform modules so that anybody can use it.&nbsp;<\/p>\n\n\n\n<p class=\"has-text-align-justify\">Applying the azure policy terraform module will perform the following tasks:<\/p>\n\n\n\n<ul>\n<li>Create Azure policy with policy assignment&nbsp;<\/li>\n\n\n\n<li>Create an initiative policy with policy assignment&nbsp;<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>PREREQUISITES:<\/strong><\/h2>\n\n\n\n<p class=\"has-text-align-justify\">Configure Azure on the machine you will be executing the terraform module.<\/p>\n\n\n\n<p class=\"has-yellow-color has-dark-gray-background-color has-text-color has-background\">az login<br>az account list<br>az account set \u2013subscription=\u201dXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXX&#8221;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">USAGE: <\/h2>\n\n\n\n<p class=\"has-text-align-justify\">Azure policy terraform module can be found <em><a href=\"https:\/\/github.com\/OT-terraform-azure-modules\/terraform-azure-policies\" target=\"_blank\" rel=\"noopener\"><strong>here<\/strong><\/a>.<\/em><\/p>\n\n\n\n<p class=\"has-text-align-justify\">Creation of policy depends on the <code>policy_manner<\/code> parameter.&nbsp;<\/p>\n\n\n\n<p class=\"has-text-align-justify\">Policy Module can be executed for 2 scenarios , They are :<\/p>\n\n\n\n<ul>\n<li>Creation of azure policy., i.e. <code>policy_manner= Policy<\/code><\/li>\n\n\n\n<li>Creation of initiative policy., i.e. <code>policy_manner=Initiative<\/code><\/li>\n<\/ul>\n\n\n\n<h6 class=\"wp-block-heading\"><strong>Creation of azure policy :<\/strong><\/h6>\n\n\n\n<p class=\"has-text-align-justify\">Let\u2019s deploy a simple policy using below code. Parameters that to be kept in mind for this are:&nbsp;<\/p>\n\n\n\n<ul>\n<li><code>Policy_manner = Policy<\/code><\/li>\n\n\n\n<li><code>Policy_def_scope_type<\/code> values can be resource-group , resource, management-group, subscription.<\/li>\n\n\n\n<li>If <code>Policy_def_scope_type = resource-group <\/code>then define the resource group id in <code>resource_group_id <\/code>variable <strong>or<\/strong> If <code>Policy_def_scope_type = resource <\/code>then define the resource id in <code>resource_id <\/code>variable <strong>or<\/strong> If <code>Policy_def_scope_type = management-group<\/code> then define the management group id in <code>management_group_id<\/code> variable <strong>or<\/strong> If <code>Policy_def_scope_type = subscription<\/code> then define the subscription id in <code>subscription_id<\/code> variable<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-justify\">Have a look at <strong>main.tf<\/strong>. Append the below values according to your requirement.<\/p>\n\n\n\n<p class=\"has-text-align-left has-yellow-color has-dark-gray-background-color has-text-color has-background\">module &#8220;policy&#8221; {<br>source = &#8220;OT-terraform-azure-modules\/policies\/azure&#8221;<br>version = &#8220;0.0.1&#8221;<br>policy_manner = &#8220;Policy&#8221;<br>policy_name = &#8220;restrictregion&#8221;<br>policy_type = &#8220;Custom&#8221;<br>mode = &#8220;All&#8221;<br>policy_display_name = &#8220;restrictregion&#8221;<br>policy_rule = {<br>&#8220;if&#8221; : {<br>&#8220;not&#8221; : {<br>&#8220;field&#8221; : &#8220;location&#8221;<br>&#8220;in&#8221; : &#8220;[parameters(&#8216;allowedLocations&#8217;)]&#8221;<br>}<br>},<br>&#8220;then&#8221; : {<br>&#8220;effect&#8221; : &#8220;deny&#8221;<br>}<br>}<br>policy_parameters = {<br>&#8220;allowedLocations&#8221; : {<br>&#8220;type&#8221; : &#8220;Array&#8221;,<br>&#8220;metadata&#8221; : {<br>&#8220;description&#8221; : &#8220;The list of allowed locations for resource group.&#8221;,<br>&#8220;displayName&#8221; : &#8220;Allowed locations&#8221;,<br>&#8220;strongType&#8221; : &#8220;location&#8221;<br>}<br>}<br>}<br>metadata = {<br>&#8220;category&#8221; : &#8220;General&#8221;<br>}<br>policy_def_scope_type = &#8220;resource-group&#8221;<br>policy_assignment_name = &#8220;assignment&#8221;<br>resource_group_id = &#8220;\/subscriptions\/XXXXXX-XXXX-XXXX-XXXX-XXXXXXXX\/resourceGroups\/resourcegroup-name&#8221;<br>assignment_location = &#8220;eastus&#8221;<br>assignment_parameters = {<br>&#8220;allowedLocations&#8221; : {<br>&#8220;value&#8221; : [&#8220;West Europe&#8221;]<br>}<br>}<br>}<\/p>\n\n\n\n<h6 class=\"wp-block-heading\"><strong>Creation of initiative policy :<\/strong><\/h6>\n\n\n\n<p class=\"has-text-align-justify\">Let\u2019s deploy a initiative policy using below code. Parameters that to be kept in mind for this are:&nbsp;<\/p>\n\n\n\n<ul>\n<li><code>Policy_manner = Initiative<\/code><\/li>\n\n\n\n<li><code>Policy_def_scope_type<\/code> values can be resource-group , resource, management-group, subscription.<\/li>\n\n\n\n<li>If <code>Policy_def_scope_type = resource-group <\/code>then define the resource group id in <code>resource_group_id <\/code>variable <strong>or<\/strong> If <code>Policy_def_scope_type = resource <\/code>then define the resource id in <code>resource_id <\/code>variable <strong>or<\/strong> If <code>Policy_def_scope_type = management-group<\/code> then define the management group id in <code>management_group_id<\/code> variable <strong>or<\/strong> If <code>Policy_def_scope_type = subscription<\/code> then define the subscription id in <code>subscription_id<\/code> variable. <\/li>\n\n\n\n<li>Pick existing policyID from azure portal and pass it in the <code>initiative_policy_definition_reference<\/code> block.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-justify\">Have a look at <strong>main.tf<\/strong>. Append the below values according to your requirement.<\/p>\n\n\n\n<p class=\"has-yellow-color has-dark-gray-background-color has-text-color has-background\">module &#8220;policy&#8221; {<br>source = &#8220;OT-terraform-azure-modules\/policies\/azure&#8221;<br>version = &#8220;0.0.1&#8221;<br>policy_manner = &#8220;Initiative&#8221;<br>policy_name = &#8220;test&#8221;<br>policy_type = &#8220;Custom&#8221;<br>policy_display_name = &#8220;test policy&#8221;<br>metadata = {<br>&#8220;category&#8221; : &#8220;General&#8221;<br>}<br>initiative_policy_definition_reference = [{<br>&#8220;policyID&#8221; = &#8220;\/providers\/Microsoft.Authorization\/policyDefinitions\/06a78e20-9358-41c9-923c-fb736d382a4d&#8221;<br>&#8220;reference_id&#8221; = &#8220;Audit VMs that do not use managed disks&#8221;<br>},<br>{<br>&#8220;policyID&#8221; = &#8220;\/providers\/Microsoft.Authorization\/policyDefinitions\/0015ea4d-51ff-4ce3-8d8c-f3f8f0179a56&#8221;<br>&#8220;reference_id&#8221; = &#8220;Audit virtual machines without disaster recovery configured&#8221;<br>}]<br>policy_def_scope_type = &#8220;resource-group&#8221;<br>policy_assignment_name = &#8220;testassign&#8221;<br>resource_group_id = &#8220;\/subscriptions\/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXX\/resourceGroups\/rgname&#8221;<br>assignment_location = &#8220;eastus&#8221;<br>}<\/p>\n\n\n\n<p class=\"has-text-align-justify\">Apply the terraform module and let\u2019s look for the policy definition and policy assignment that is created on the azure portal via the above code.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/12\/screenshot-from-2022-12-06-09-52-57.png?w=1024\" alt=\"\" class=\"wp-image-12578\" width=\"800\" \/><\/figure><\/div>\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/12\/screenshot-from-2022-12-06-09-53-39.png?w=1024\" alt=\"\" class=\"wp-image-12579\" width=\"800\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-justify\">The result of the policy will restrict the user from selecting any region except West Europe.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/12\/screenshot-from-2022-12-06-09-56-01.png?w=1024\" alt=\"\" class=\"wp-image-12581\" width=\"800\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-justify\">Cheers!!! It worked. You have created an Azure policy and assigned it to a specific scope.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CONCLUSION<\/h2>\n\n\n\n<p class=\"has-text-align-justify\">The scope of the terraform module is the creation of custom policy and initiative policy with policy assignments. For more information, you can go through <a href=\"https:\/\/github.com\/OT-terraform-azure-modules\/terraform-azure-policies\/blob\/main\/README.md\" target=\"_blank\" rel=\"noopener\">README.md<\/a> of the module.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">&nbsp;Let us know about your experience with the module and your suggestions.&nbsp;<\/p>\n\n\n\n<p class=\"has-text-align-justify\"><em>\u00c0 bient\u00f4t!!<\/em><\/p>\n\n\n\n<p><strong>Blog Pundits: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.linkedin.com\/in\/mehul-sharma-devops\/\" target=\"_blank\">Mehul Sharma<\/a> and <a rel=\"noreferrer noopener\" href=\"https:\/\/opstree.com\/blog\/\/author\/sandeep7c51ad81ba\/\" target=\"_blank\">Sandeep Rawat<\/a><\/strong><\/p>\n\n\n\n<p><strong><a href=\"https:\/\/opstree.com\/contact-us\/?utm_source=WordPress&amp;utm_medium=Blog&amp;utm_campaign=Deploying+Azure+Policy+using+Terraform+Module\" target=\"_blank\" rel=\"noreferrer noopener\">Opstree<\/a><\/strong>&nbsp;is an End to End DevOps solution provider.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/opstree.com\/contact-us\/?utm_source=WordPress&amp;utm_medium=Blog&amp;utm_campaign=Deploying+Azure+Policy+using+Terraform+Module\" target=\"_blank\" rel=\"noreferrer noopener\">CONTACT US<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Connect with Us<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-social-links aligncenter is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>While working on Azure, you might come across a requirement that says the resources being deployed should be in accordance with the organization\u2019s policies. Suppose you might want to grant a particular or a set of permissions on the resource group or on the management group so that the owner of it should be restricted &hellip; <a href=\"https:\/\/opstree.com\/blog\/2022\/12\/20\/deploying-azure-policy-using-terraform-module\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Deploying Azure Policy using Terraform Module&#8221;<\/span><\/a><\/p>\n","protected":false},"author":223952166,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[335778,768739308,676319247,4996032,3021235],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-3gt","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/12553"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/223952166"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=12553"}],"version-history":[{"count":24,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/12553\/revisions"}],"predecessor-version":[{"id":12630,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/12553\/revisions\/12630"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=12553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=12553"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=12553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}