{"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\/deploying-azure-policy-using-terraform-module\/","title":{"rendered":"Deploying Azure Policy using Terraform Module"},"content":{"rendered":"\n<p class=\"has-text-align-justify wp-block-paragraph\">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 wp-block-paragraph\">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 wp-block-paragraph\">First, let&#8217;s get familiar with the <strong>azure policy<\/strong>.<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><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 wp-block-paragraph\">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 class=\"wp-block-paragraph\">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 class=\"wp-block-paragraph\">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 wp-block-paragraph\">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-995f960e 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 class=\"wp-block-list\">\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 class=\"wp-block-paragraph\">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 wp-block-paragraph\">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 wp-block-paragraph\">Applying the azure policy terraform module will perform the following tasks:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\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 wp-block-paragraph\">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 wp-block-paragraph\">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 wp-block-paragraph\">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 wp-block-paragraph\">Creation of policy depends on the <code>policy_manner<\/code> parameter.&nbsp;<\/p>\n\n\n\n<p class=\"has-text-align-justify wp-block-paragraph\">Policy Module can be executed for 2 scenarios , They are :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\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 wp-block-paragraph\">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 class=\"wp-block-list\">\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 wp-block-paragraph\">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 wp-block-paragraph\">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 wp-block-paragraph\">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 class=\"wp-block-list\">\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 wp-block-paragraph\">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 wp-block-paragraph\">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 wp-block-paragraph\">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\n<figure class=\"wp-block-image 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>\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-53-39.png?w=1024\" alt=\"\" class=\"wp-image-12579\" width=\"800\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-justify wp-block-paragraph\">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 wp-block-paragraph\">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 wp-block-paragraph\">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 wp-block-paragraph\">&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 wp-block-paragraph\"><em>\u00c0 bient\u00f4t!!<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><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 class=\"wp-block-paragraph\"><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 wp-block-paragraph\"><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-fe0a7de2 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=\"M13.2,12c0,3-2.4,5.4-5.3,5.4S2.6,15,2.6,12s2.4-5.4,5.3-5.4S13.2,9,13.2,12 M19.1,12c0,2.8-1.2,5-2.7,5s-2.7-2.3-2.7-5s1.2-5,2.7-5C17.9,7,19.1,9.2,19.1,12 M21.4,12c0,2.5-0.4,4.5-0.9,4.5c-0.5,0-0.9-2-0.9-4.5s0.4-4.5,0.9-4.5C21,7.5,21.4,9.5,21.4,12\"><\/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;]<\/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],"class_list":["post-12553","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-azure","tag-devops","tag-devops-solutioning","tag-technical-blogs","tag-terraform"],"blocksy_meta":[],"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","targetHints":{"allow":["GET"]}}],"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}]}}