"}},"componentScriptGroups({\"componentId\":\"custom.widget.MicrosoftFooter\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageListTabs\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageListTabs-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1745505307000"}],"cachedText({\"lastModified\":\"1745505307000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505307000"}]},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Deleted","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"MMM dd yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":null,"possibleValues":["en-US","es-ES"]},"repliesSortOrder":{"__typename":"InheritableStringSettingWithPossibleValues","key":"config.user_replies_sort_order","value":"DEFAULT","localValue":"DEFAULT","possibleValues":["DEFAULT","LIKES","PUBLISH_TIME","REVERSE_PUBLISH_TIME"]}},"deleted":false},"CachedAsset:pages-1746563717119":{"__typename":"CachedAsset","id":"pages-1746563717119","value":[{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"UserBlogPermissions.Page","type":"COMMUNITY","urlPath":"/c/user-blog-permissions/page","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"AllEvents","type":"CUSTOM","urlPath":"/Events","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"CommunityHub.Page","type":"CUSTOM","urlPath":"/Directory","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"AllBlogs.Page","type":"CUSTOM","urlPath":"/blogs","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746563717119,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}","userBanned":"We're sorry, but you have been banned from using this site.","userBannedReason":"You have been banned for the following reason: {reason}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:theme:customTheme1-1746563716603":{"__typename":"CachedAsset","id":"theme:customTheme1-1746563716603","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["default"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"favicon-1730836283320.png","imageLastModified":"1730836286415","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"favicon-1730836271365.png","imageLastModified":"1730836274203","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1300px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_BROWSER","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"3px","borderRadius":"3px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"16px","paddingXHero":"60px","fontStyle":"NORMAL","fontWeight":"700","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-200)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-200)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"LIGHT","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.16)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.12)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-link-color)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","defaultMessageFontFamily":"var(--lia-bs-font-family-base)","forumColor":"#4099E2","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#148563","blogColor":"#1CBAA0","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#4C6B90","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#FF8000","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#D13A1F","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#333333","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#717171","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0069D4","secondary":"#333333","bodyText":"#1E1E1E","bodyBg":"#FFFFFF","info":"#409AE2","success":"#41C5AE","warning":"#FCC844","danger":"#BC341B","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#D3F5A4","#243A5E"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Segoe UI","fontStyle":"NORMAL","fontWeight":"400","h1FontSize":"34px","h2FontSize":"32px","h3FontSize":"28px","h4FontSize":"24px","h5FontSize":"20px","h6FontSize":"16px","lineHeight":"1.3","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":"","imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"40px","defaultMessageHeaderMarginBottom":"20px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"40px","specialMessageHeaderMarginBottom":"20px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Segoe UI","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.5","fontSizeBase":"16px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"14px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[{"source":"SERVER","name":"Segoe UI","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"},{"style":"NORMAL","weight":"300","__typename":"FontStyleData"},{"style":"NORMAL","weight":"600","__typename":"FontStyleData"},{"style":"NORMAL","weight":"700","__typename":"FontStyleData"},{"style":"ITALIC","weight":"400","__typename":"FontStyleData"}],"assetNames":["SegoeUI-normal-400.woff2","SegoeUI-normal-300.woff2","SegoeUI-normal-600.woff2","SegoeUI-normal-700.woff2","SegoeUI-italic-400.woff2"],"__typename":"CustomFont"},{"source":"SERVER","name":"MWF Fluent Icons","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"}],"assetNames":["MWFFluentIcons-normal-400.woff2"],"__typename":"CustomFont"}],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1745505307000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1745505307000","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-pages/tags/TagPage-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1745505307000","value":{"tagPageTitle":"Tag:\"{tagName}\" | {communityTitle}","tagPageForNodeTitle":"Tag:\"{tagName}\" in \"{title}\" | {communityTitle}","name":"Tags Page","tag":"Tag: {tagName}"},"localOverride":false},"Category:category:Azure":{"__typename":"Category","id":"category:Azure","entityType":"CATEGORY","displayId":"Azure","nodeType":"category","depth":3,"title":"Azure","shortTitle":"Azure","parent":{"__ref":"Category:category:products-services"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top"},"Category:category:communities":{"__typename":"Category","id":"category:communities","displayId":"communities","nodeType":"category","depth":1,"parent":{"__ref":"Category:category:top"},"title":"Communities"},"Category:category:products-services":{"__typename":"Category","id":"category:products-services","displayId":"products-services","nodeType":"category","depth":2,"parent":{"__ref":"Category:category:communities"},"title":"Products"},"Blog:board:AzureArchitectureBlog":{"__typename":"Blog","id":"board:AzureArchitectureBlog","entityType":"BLOG","displayId":"AzureArchitectureBlog","nodeType":"board","depth":4,"conversationStyle":"BLOG","title":"Azure Architecture Blog","description":"","avatar":null,"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:Azure"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:gxcuf89792"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:communities"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:products-services"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:Azure"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}}},"theme":{"__ref":"Theme:customTheme1"},"shortTitle":"Azure Architecture Blog","tagPolicies":{"__typename":"TagPolicies","canSubscribeTagOnNode":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","args":[]}},"canManageTagDashboard":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","args":[]}}}},"CachedAsset:quilt:o365.prod:pages/tags/TagPage:board:AzureArchitectureBlog-1746740537099":{"__typename":"CachedAsset","id":"quilt:o365.prod:pages/tags/TagPage:board:AzureArchitectureBlog-1746740537099","value":{"id":"TagPage","container":{"id":"Common","headerProps":{"removeComponents":["community.widget.bannerWidget"],"__typename":"QuiltContainerSectionProps"},"items":[{"id":"tag-header-widget","layout":"ONE_COLUMN","bgColor":"var(--lia-bs-white)","showBorder":"BOTTOM","sectionEditLevel":"LOCKED","columnMap":{"main":[{"id":"tags.widget.TagsHeaderWidget","__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"},"__typename":"OneColumnQuiltSection"},{"id":"messages-list-for-tag-widget","layout":"ONE_COLUMN","columnMap":{"main":[{"id":"messages.widget.messageListForNodeByRecentActivityWidget","props":{"viewVariant":{"type":"inline","props":{"useUnreadCount":true,"useViewCount":true,"useAuthorLogin":true,"clampBodyLines":3,"useAvatar":true,"useBoardIcon":false,"useKudosCount":true,"usePreviewMedia":true,"useTags":false,"useNode":true,"useNodeLink":true,"useTextBody":true,"truncateBodyLength":-1,"useBody":true,"useRepliesCount":true,"useSolvedBadge":true,"timeStampType":"conversation.lastPostingActivityTime","useMessageTimeLink":true,"clampSubjectLines":2}},"panelType":"divider","useTitle":false,"hideIfEmpty":false,"pagerVariant":{"type":"loadMore"},"style":"list","showTabs":true,"tabItemMap":{"default":{"mostRecent":true,"mostRecentUserContent":false,"newest":false},"additional":{"mostKudoed":true,"mostViewed":true,"mostReplies":false,"noReplies":false,"noSolutions":false,"solutions":false}}},"__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"},"__typename":"OneColumnQuiltSection"}],"__typename":"QuiltContainer"},"__typename":"Quilt"},"localOverride":false},"CachedAsset:quiltWrapper:o365.prod:Common:1746797692591":{"__typename":"CachedAsset","id":"quiltWrapper:o365.prod:Common:1746797692591","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"community.widget.navbarWidget","props":{"showUserName":true,"showRegisterLink":true,"useIconLanguagePicker":true,"useLabelLanguagePicker":true,"className":"QuiltComponent_lia-component-edit-mode__0nCcm","links":{"sideLinks":[],"mainLinks":[{"children":[],"linkType":"INTERNAL","id":"gxcuf89792","params":{},"routeName":"CommunityPage"},{"children":[],"linkType":"EXTERNAL","id":"external-link","url":"/Directory","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft365","params":{"categoryId":"microsoft365"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows","params":{"categoryId":"Windows"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-microsoft365-copilot-link","params":{"categoryId":"Microsoft365Copilot"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-teams","params":{"categoryId":"MicrosoftTeams"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-securityand-compliance","params":{"categoryId":"microsoft-security"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"azure","params":{"categoryId":"Azure"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-content_management-link","params":{"categoryId":"Content_Management"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"exchange","params":{"categoryId":"Exchange"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows-server","params":{"categoryId":"Windows-Server"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"outlook","params":{"categoryId":"Outlook"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-endpoint-manager","params":{"categoryId":"microsoftintune"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-2","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities","url":"/","target":"BLANK"},{"children":[{"linkType":"INTERNAL","id":"a-i","params":{"categoryId":"AI"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"education-sector","params":{"categoryId":"EducationSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"partner-community","params":{"categoryId":"PartnerCommunity"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"i-t-ops-talk","params":{"categoryId":"ITOpsTalk"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"healthcare-and-life-sciences","params":{"categoryId":"HealthcareAndLifeSciences"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-mechanics","params":{"categoryId":"MicrosoftMechanics"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"public-sector","params":{"categoryId":"PublicSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"s-m-b","params":{"categoryId":"MicrosoftforNonprofits"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"io-t","params":{"categoryId":"IoT"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"startupsat-microsoft","params":{"categoryId":"StartupsatMicrosoft"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"driving-adoption","params":{"categoryId":"DrivingAdoption"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-1","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities-1","url":"/","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external","url":"/Blogs","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external-1","url":"/Events","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft-learn-1","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-learn-blog","params":{"boardId":"MicrosoftLearnBlog","categoryId":"MicrosoftLearn"},"routeName":"BlogBoardPage"},{"linkType":"EXTERNAL","id":"external-10","url":"https://learningroomdirectory.microsoft.com/","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-3","url":"https://docs.microsoft.com/learn/dynamics365/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-4","url":"https://docs.microsoft.com/learn/m365/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-5","url":"https://docs.microsoft.com/learn/topics/sci/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-6","url":"https://docs.microsoft.com/learn/powerplatform/?wt.mc_id=techcom_header-webpage-powerplatform","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-7","url":"https://docs.microsoft.com/learn/github/?wt.mc_id=techcom_header-webpage-github","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-8","url":"https://docs.microsoft.com/learn/teams/?wt.mc_id=techcom_header-webpage-teams","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-9","url":"https://docs.microsoft.com/learn/dotnet/?wt.mc_id=techcom_header-webpage-dotnet","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-2","url":"https://docs.microsoft.com/learn/azure/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"}],"linkType":"INTERNAL","id":"microsoft-learn","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"community-info-center","params":{"categoryId":"Community-Info-Center"},"routeName":"CategoryPage"}]},"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","controllerHighlightColor":"hsla(30, 100%, 50%)","linkFontWeight":"400","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkBoxShadowHover":"none","linkFontSize":"14px","backgroundOpacity":0.8,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","hamburgerColor":"var(--lia-nav-controller-icon-color)","linkTextBorderBottom":"none","brandLogoHeight":"30px","linkBgHoverColor":"transparent","linkLetterSpacing":"normal","collapseMenuDividerOpacity":0.16,"dropdownPaddingBottom":"15px","paddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"1px solid var(--lia-bs-border-color)","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","collapseMenuDividerBg":"var(--lia-nav-link-color)","linkColor":"var(--lia-bs-body-color)","linkJustifyContent":"flex-start","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","controllerTextColor":"var(--lia-nav-controller-icon-color)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-body-color)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid var(--lia-bs-body-color)","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","linkPaddingX":"10px","linkPaddingY":"5px","paddingTop":"15px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkBgColor":"transparent","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkDropdownPaddingY":"9px","controllerIconColor":"var(--lia-bs-body-color)","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"var(--lia-bs-body-color)"},"showSearchIcon":false,"languagePickerStyle":"iconAndLabel"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"transparent","linkHighlightColor":"var(--lia-bs-primary)","visualEffects":{"showBottomBorder":true},"linkTextColor":"var(--lia-bs-gray-700)"},"__typename":"QuiltComponent"},{"id":"custom.widget.HeroBanner","props":{"widgetVisibility":"signedInOrAnonymous","usePageWidth":false,"useTitle":true,"cMax_items":3,"useBackground":false,"title":"","lazyLoad":false,"widgetChooser":"custom.widget.HeroBanner"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.MicrosoftFooter","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1745505307000","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.HeroBanner-en-us-1746740527657":{"__typename":"CachedAsset","id":"component:custom.widget.HeroBanner-en-us-1746740527657","value":{"component":{"id":"custom.widget.HeroBanner","template":{"id":"HeroBanner","markupLanguage":"REACT","style":null,"texts":{"searchPlaceholderText":"Search this community","followActionText":"Follow","unfollowActionText":"Following","searchOnHoverText":"Please enter your search term(s) and then press return key to complete a search.","blogs.sidebar.pagetitle":"Latest Blogs | Microsoft Tech Community","followThisNode":"Follow this node","unfollowThisNode":"Unfollow this node"},"defaults":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.HeroBanner","form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"__typename":"Component","localOverride":false},"globalCss":null,"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"}},"localOverride":false},"CachedAsset:component:custom.widget.MicrosoftFooter-en-us-1746740527657":{"__typename":"CachedAsset","id":"component:custom.widget.MicrosoftFooter-en-us-1746740527657","value":{"component":{"id":"custom.widget.MicrosoftFooter","template":{"id":"MicrosoftFooter","markupLanguage":"HANDLEBARS","style":".context-uhf {\n min-width: 280px;\n font-size: 15px;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.c-uhff-link {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.c-uhff {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.c-uhff-nav {\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n .c-heading-4 {\n color: #616161;\n word-break: break-word;\n font-size: 15px;\n line-height: 20px;\n padding: 36px 0 4px;\n font-weight: 600;\n }\n .c-uhff-nav-row {\n .c-uhff-nav-group {\n display: block;\n float: left;\n min-height: 1px;\n vertical-align: text-top;\n padding: 0 12px;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.c-list.f-bare {\n font-size: 11px;\n line-height: 16px;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 8px 0;\n margin: 0;\n }\n }\n }\n }\n}\n.c-uhff-base {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 30px 5% 16px;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.c-uhff-ccpa {\n font-size: 11px;\n line-height: 16px;\n float: left;\n margin: 3px 0;\n }\n a.c-uhff-ccpa:hover {\n text-decoration: underline;\n }\n ul.c-list {\n font-size: 11px;\n line-height: 16px;\n float: right;\n margin: 3px 0;\n color: #616161;\n li {\n padding: 0 24px 4px 0;\n display: inline-block;\n }\n }\n .c-list.f-bare {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 30px 24px 16px;\n }\n}\n\n.social-share {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n\n.sharing-options {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 43px;\n border-radius: 0px 7px 7px 0px;\n}\n.linkedin-icon {\n border-top-right-radius: 7px;\n}\n.linkedin-icon:hover {\n border-radius: 0;\n}\n.social-share-rss-image {\n border-bottom-right-radius: 7px;\n}\n.social-share-rss-image:hover {\n border-radius: 0;\n}\n\n.social-link-footer {\n position: relative;\n display: block;\n margin: -2px 0;\n transition: all 0.2s ease;\n}\n.social-link-footer:hover .linkedin-icon {\n border-radius: 0;\n}\n.social-link-footer:hover .social-share-rss-image {\n border-radius: 0;\n}\n\n.social-link-footer img {\n width: 40px;\n height: auto;\n transition: filter 0.3s ease;\n}\n\n.social-share-list {\n width: 40px;\n}\n.social-share-rss-image {\n width: 40px;\n}\n\n.share-icon {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n\n.share-icon:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n\n.share-icon:hover .label {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n\n.label {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 10px;\n top: 50%;\n transform: translateY(-50%);\n height: 40px;\n border-radius: 0 6px 6px 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 5px 20px 8px;\n margin-left: -1px;\n}\n.linkedin {\n background-color: #0474b4;\n}\n.facebook {\n background-color: #3c5c9c;\n}\n.twitter {\n background-color: white;\n color: black;\n}\n.reddit {\n background-color: #fc4404;\n}\n.mail {\n background-color: #848484;\n}\n.bluesky {\n background-color: white;\n color: black;\n}\n.rss {\n background-color: #ec7b1c;\n}\n#RSS {\n width: 40px;\n height: 40px;\n}\n\n@media (max-width: 991px) {\n .social-share {\n display: none;\n }\n}\n","texts":{"New tab":"What's New","New 1":"Surface Laptop Studio 2","New 2":"Surface Laptop Go 3","New 3":"Surface Pro 9","New 4":"Surface Laptop 5","New 5":"Surface Studio 2+","New 6":"Copilot in Windows","New 7":"Microsoft 365","New 8":"Windows 11 apps","Store tab":"Microsoft Store","Store 1":"Account Profile","Store 2":"Download Center","Store 3":"Microsoft Store Support","Store 4":"Returns","Store 5":"Order tracking","Store 6":"Certified Refurbished","Store 7":"Microsoft Store Promise","Store 8":"Flexible Payments","Education tab":"Education","Edu 1":"Microsoft in education","Edu 2":"Devices for education","Edu 3":"Microsoft Teams for Education","Edu 4":"Microsoft 365 Education","Edu 5":"How to buy for your school","Edu 6":"Educator Training and development","Edu 7":"Deals for students and parents","Edu 8":"Azure for students","Business tab":"Business","Bus 1":"Microsoft Cloud","Bus 2":"Microsoft Security","Bus 3":"Dynamics 365","Bus 4":"Microsoft 365","Bus 5":"Microsoft Power Platform","Bus 6":"Microsoft Teams","Bus 7":"Microsoft Industry","Bus 8":"Small Business","Developer tab":"Developer & IT","Dev 1":"Azure","Dev 2":"Developer Center","Dev 3":"Documentation","Dev 4":"Microsoft Learn","Dev 5":"Microsoft Tech Community","Dev 6":"Azure Marketplace","Dev 7":"AppSource","Dev 8":"Visual Studio","Company tab":"Company","Com 1":"Careers","Com 2":"About Microsoft","Com 3":"Company News","Com 4":"Privacy at Microsoft","Com 5":"Investors","Com 6":"Diversity and inclusion","Com 7":"Accessiblity","Com 8":"Sustainibility"},"defaults":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.MicrosoftFooter","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_MicrosoftFooter_context-uhf_105bp_1 {\n min-width: 17.5rem;\n font-size: 0.9375rem;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-link_105bp_12 {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff_105bp_12 {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35 {\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n .custom_widget_MicrosoftFooter_c-heading-4_105bp_49 {\n color: #616161;\n word-break: break-word;\n font-size: 0.9375rem;\n line-height: 1.25rem;\n padding: 2.25rem 0 0.25rem;\n font-weight: 600;\n }\n .custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57 {\n .custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58 {\n display: block;\n float: left;\n min-height: 0.0625rem;\n vertical-align: text-top;\n padding: 0 0.75rem;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 0.5rem 0;\n margin: 0;\n }\n }\n }\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff-base_105bp_94 {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 1.875rem 5% 1rem;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: left;\n margin: 0.1875rem 0;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107:hover {\n text-decoration: underline;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: right;\n margin: 0.1875rem 0;\n color: #616161;\n li {\n padding: 0 1.5rem 0.25rem 0;\n display: inline-block;\n }\n }\n .custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 1.875rem 1.5rem 1rem;\n }\n}\n.custom_widget_MicrosoftFooter_social-share_105bp_138 {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n.custom_widget_MicrosoftFooter_sharing-options_105bp_146 {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 2.6875rem;\n border-radius: 0 0.4375rem 0.4375rem 0;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-top-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-bottom-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 {\n position: relative;\n display: block;\n margin: -0.125rem 0;\n transition: all 0.2s ease;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 img {\n width: 2.5rem;\n height: auto;\n transition: filter 0.3s ease;\n}\n.custom_widget_MicrosoftFooter_social-share-list_105bp_188 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195 {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover .custom_widget_MicrosoftFooter_label_105bp_207 {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n.custom_widget_MicrosoftFooter_label_105bp_207 {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 0.625rem;\n top: 50%;\n transform: translateY(-50%);\n height: 2.5rem;\n border-radius: 0 0.375rem 0.375rem 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.25rem 0.3125rem 1.25rem 0.5rem;\n margin-left: -0.0625rem;\n}\n.custom_widget_MicrosoftFooter_linkedin_105bp_156 {\n background-color: #0474b4;\n}\n.custom_widget_MicrosoftFooter_facebook_105bp_237 {\n background-color: #3c5c9c;\n}\n.custom_widget_MicrosoftFooter_twitter_105bp_240 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_reddit_105bp_244 {\n background-color: #fc4404;\n}\n.custom_widget_MicrosoftFooter_mail_105bp_247 {\n background-color: #848484;\n}\n.custom_widget_MicrosoftFooter_bluesky_105bp_250 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_rss_105bp_254 {\n background-color: #ec7b1c;\n}\n#custom_widget_MicrosoftFooter_RSS_105bp_1 {\n width: 2.5rem;\n height: 2.5rem;\n}\n@media (max-width: 991px) {\n .custom_widget_MicrosoftFooter_social-share_105bp_138 {\n display: none;\n }\n}\n","tokens":{"context-uhf":"custom_widget_MicrosoftFooter_context-uhf_105bp_1","c-uhff-link":"custom_widget_MicrosoftFooter_c-uhff-link_105bp_12","c-uhff":"custom_widget_MicrosoftFooter_c-uhff_105bp_12","c-uhff-nav":"custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35","c-heading-4":"custom_widget_MicrosoftFooter_c-heading-4_105bp_49","c-uhff-nav-row":"custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57","c-uhff-nav-group":"custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58","c-list":"custom_widget_MicrosoftFooter_c-list_105bp_78","f-bare":"custom_widget_MicrosoftFooter_f-bare_105bp_78","c-uhff-base":"custom_widget_MicrosoftFooter_c-uhff-base_105bp_94","c-uhff-ccpa":"custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107","social-share":"custom_widget_MicrosoftFooter_social-share_105bp_138","sharing-options":"custom_widget_MicrosoftFooter_sharing-options_105bp_146","linkedin-icon":"custom_widget_MicrosoftFooter_linkedin-icon_105bp_156","social-share-rss-image":"custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162","social-link-footer":"custom_widget_MicrosoftFooter_social-link-footer_105bp_169","social-share-list":"custom_widget_MicrosoftFooter_social-share-list_105bp_188","share-icon":"custom_widget_MicrosoftFooter_share-icon_105bp_195","label":"custom_widget_MicrosoftFooter_label_105bp_207","linkedin":"custom_widget_MicrosoftFooter_linkedin_105bp_156","facebook":"custom_widget_MicrosoftFooter_facebook_105bp_237","twitter":"custom_widget_MicrosoftFooter_twitter_105bp_240","reddit":"custom_widget_MicrosoftFooter_reddit_105bp_244","mail":"custom_widget_MicrosoftFooter_mail_105bp_247","bluesky":"custom_widget_MicrosoftFooter_bluesky_105bp_250","rss":"custom_widget_MicrosoftFooter_rss_105bp_254","RSS":"custom_widget_MicrosoftFooter_RSS_105bp_1"}},"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1745505307000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1745505307000","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1745505307000","value":{"title@userScope:other":"Recent Content","title@userScope:self":"Contributions","title@board:FORUM@userScope:other":"Recent Discussions","title@board:BLOG@userScope:other":"Recent Blogs","emptyDescription":"No content to show","MessageListForNodeByRecentActivityWidgetEditor.nodeScope.label":"Scope","title@instance:1722894000155":"Recent Discussions","title@instance:1727367112619":"Recent Blog Articles","title@instance:1727367069748":"Recent Discussions","title@instance:1727366213114":"Latest Discussions","title@instance:1727899609720":"","title@instance:1727363308925":"Latest Discussions","title@instance:1737115580352":"Latest Articles","title@instance:1720453418992":"Recent Discssions","title@instance:1727365950181":"Latest Blog Articles","title@instance:bmDPnI":"Latest Blog Articles","title@instance:IiDDJZ":"Latest Blog Articles","title@instance:1721244347979":"Latest blog posts","title@instance:1728383752171":"Related Content","title@instance:1722893956545":"Latest Skilling Resources","title@instance:dhcgCU":"Latest Discussions"},"localOverride":false},"Category:category:Exchange":{"__typename":"Category","id":"category:Exchange","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Outlook":{"__typename":"Category","id":"category:Outlook","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Community-Info-Center":{"__typename":"Category","id":"category:Community-Info-Center","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:EducationSector":{"__typename":"Category","id":"category:EducationSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:DrivingAdoption":{"__typename":"Category","id":"category:DrivingAdoption","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows-Server":{"__typename":"Category","id":"category:Windows-Server","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftTeams":{"__typename":"Category","id":"category:MicrosoftTeams","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PublicSector":{"__typename":"Category","id":"category:PublicSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft365":{"__typename":"Category","id":"category:microsoft365","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:IoT":{"__typename":"Category","id":"category:IoT","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:HealthcareAndLifeSciences":{"__typename":"Category","id":"category:HealthcareAndLifeSciences","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:ITOpsTalk":{"__typename":"Category","id":"category:ITOpsTalk","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftLearn":{"__typename":"Category","id":"category:MicrosoftLearn","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Blog:board:MicrosoftLearnBlog":{"__typename":"Blog","id":"board:MicrosoftLearnBlog","blogPolicies":{"__typename":"BlogPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:AI":{"__typename":"Category","id":"category:AI","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftMechanics":{"__typename":"Category","id":"category:MicrosoftMechanics","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftforNonprofits":{"__typename":"Category","id":"category:MicrosoftforNonprofits","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:StartupsatMicrosoft":{"__typename":"Category","id":"category:StartupsatMicrosoft","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PartnerCommunity":{"__typename":"Category","id":"category:PartnerCommunity","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Microsoft365Copilot":{"__typename":"Category","id":"category:Microsoft365Copilot","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows":{"__typename":"Category","id":"category:Windows","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Content_Management":{"__typename":"Category","id":"category:Content_Management","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft-security":{"__typename":"Category","id":"category:microsoft-security","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoftintune":{"__typename":"Category","id":"category:microsoftintune","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Conversation:conversation:4404467":{"__typename":"Conversation","id":"conversation:4404467","topic":{"__typename":"BlogTopicMessage","uid":4404467},"lastPostingActivityTime":"2025-05-01T10:08:10.762-07:00","solved":false},"User:user:222853":{"__typename":"User","uid":222853,"login":"GeertVanTeylingen","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0yMjI4NTMtMzI1MjMwaTVERUE2NzdCRkJBNjkxQzg"},"id":"user:222853"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTIwa2NMUA?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTIwa2NMUA?revision=11","title":"2025-04-15_16-10-59.png","associationType":"COVER","width":752,"height":410,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWZVaFFmSQ?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWZVaFFmSQ?revision=11","title":"image.png","associationType":"BODY","width":940,"height":528,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTU3QWxjZA?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTU3QWxjZA?revision=11","title":"image.png","associationType":"BODY","width":940,"height":528,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUlIcW5vdw?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUlIcW5vdw?revision=11","title":"image.png","associationType":"BODY","width":940,"height":528,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LXk4WlRLMQ?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LXk4WlRLMQ?revision=11","title":"image.png","associationType":"BODY","width":940,"height":528,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWNScFFxeQ?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWNScFFxeQ?revision=11","title":"image.png","associationType":"BODY","width":940,"height":528,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LVpiTExyWQ?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LVpiTExyWQ?revision=11","title":"image.png","associationType":"BODY","width":940,"height":528,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LVRZWlBadg?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LVRZWlBadg?revision=11","title":"image.png","associationType":"BODY","width":940,"height":573,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWM4SjNSaw?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWM4SjNSaw?revision=11","title":"image.png","associationType":"BODY","width":940,"height":563,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTFvU3h6cQ?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTFvU3h6cQ?revision=11","title":"image.png","associationType":"BODY","width":940,"height":504,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTlSbklBQw?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTlSbklBQw?revision=11","title":"image.png","associationType":"BODY","width":940,"height":504,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LXZTNXhVTA?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LXZTNXhVTA?revision=11","title":"image.png","associationType":"BODY","width":940,"height":504,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWpBSThUWA?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWpBSThUWA?revision=11","title":"image.png","associationType":"BODY","width":940,"height":504,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTY3bWJiOA?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTY3bWJiOA?revision=11","title":"image.png","associationType":"BODY","width":940,"height":504,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWdqREl5cA?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWdqREl5cA?revision=11","title":"image.png","associationType":"BODY","width":940,"height":504,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LXhicjBqSg?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LXhicjBqSg?revision=11","title":"image.png","associationType":"BODY","width":940,"height":504,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTJnTkN1VQ?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTJnTkN1VQ?revision=11","title":"image.png","associationType":"BODY","width":940,"height":504,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUhaVFZKMg?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUhaVFZKMg?revision=11","title":"image.png","associationType":"BODY","width":940,"height":504,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUZqalJmUg?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUZqalJmUg?revision=11","title":"image.png","associationType":"BODY","width":940,"height":460,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUwyZHlveA?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUwyZHlveA?revision=11","title":"image.png","associationType":"BODY","width":940,"height":585,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LVN2bGdNbQ?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LVN2bGdNbQ?revision=11","title":"image.png","associationType":"BODY","width":940,"height":585,"altText":""},"BlogTopicMessage:message:4404467":{"__typename":"BlogTopicMessage","subject":"Streamlining data discovery for AI/ML with OpenMetadata on AKS and Azure NetApp Files","conversation":{"__ref":"Conversation:conversation:4404467"},"id":"message:4404467","revisionNum":11,"uid":4404467,"depth":0,"board":{"__ref":"Blog:board:AzureArchitectureBlog"},"author":{"__ref":"User:user:222853"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" This article contains a step-by-step guide to deploying OpenMetadata on Azure Kubernetes Service (AKS), using Azure NetApp Files for storage. It also covers the deployment and configuration of PostgreSQL and OpenSearch databases to run externally from the Kubernetes cluster, following OpenMetadata best practices, managed by NetApp® Instaclustr®. This comprehensive tutorial aims to assist Microsoft and NetApp customers in overcoming the challenges of identifying and managing their data for AI/ML purposes. By following this guide, users will achieve a fully functional OpenMetadata instance, enabling efficient data discovery, enhanced collaboration, and robust data governance. ","introduction":"Unlock the full potential of your data for AI/ML applications with this comprehensive guide to deploying OpenMetadata on Azure Kubernetes Service, backed by Azure NetApp Files and NetApp® Instaclustr®. Learn how to set up a robust metadata management solution that enhances data discovery, collaboration, and governance.","metrics":{"__typename":"MessageMetrics","views":222},"postTime":"2025-05-01T10:08:10.762-07:00","lastPublishTime":"2025-05-01T10:08:10.762-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Table of Contents \n Abstract \n Introduction \n Prerequisites \n Workstation setup \n Repository directory contents \n Terraform variables file \n Credentials \n Azure settings \n Instaclustr settings \n VNet settings \n AKS cluster settings \n Azure NetApp Files settings \n PostgreSQL settings \n OpenSearch settings \n Authorized networks \n Infrastructure deployment \n Application deployment \n Using OpenMetadata \n Adding a service \n Adding an ingestion \n Cleanup \n Summary \n Additional Information \n Abstract \n This article contains a step-by-step guide to deploying OpenMetadata on Azure Kubernetes Service (AKS), using Azure NetApp Files for storage. It also covers the deployment and configuration of PostgreSQL and OpenSearch databases to run externally from the Kubernetes cluster, following OpenMetadata best practices, managed by NetApp® Instaclustr®. This comprehensive tutorial aims to assist Microsoft and NetApp customers in overcoming the challenges of identifying and managing their data for AI/ML purposes. By following this guide, users will achieve a fully functional OpenMetadata instance, enabling efficient data discovery, enhanced collaboration, and robust data governance. \n Co-authors: \n \n Kyle Radder, Azure NetApp Files Technical Marketing Engineer \n Michael Haigh, Senior Technical Marketing Engineer (NetApp) \n \n Introduction \n In this age of data-driven decision making, organizations are increasingly leveraging artificial intelligence and machine learning (AI/ML) to gain insights and drive innovation. However, enterprises face the challenge of identifying and managing their diverse data assets spread across various systems and platforms. Without a comprehensive understanding of available data, it’s difficult to use the full potential of data for AI/ML initiatives. \n OpenMetadata, an open-source metadata management platform, offers a comprehensive solution to these challenges. By providing a centralized metadata catalog, OpenMetadata enables organizations to capture, organize, and discover metadata across various data sources. This ability enhances data visibility and also facilitates better data governance, collaboration, and lineage tracking—key components for successful AI/ML initiatives. \n This article guides you through the process of deploying OpenMetadata on Azure Kubernetes Service (AKS), backed by Azure NetApp Files for storage. OpenMetadata’s PostgreSQL and OpenSearch databases run external to the AKS cluster with NetApp Instaclustr for optimal performance and reliability. By following this article, you will have a fully functional OpenMetadata instance that empowers you to discover and manage your data assets, facilitating your AI/ML initiatives. \n Whether you're a data engineer, data scientist, or IT administrator, this step-by-step guide will help you overcome the challenges of data discovery and management, enabling you to unlock the potential of your data for AI/ML purposes. \n Let's get started building a robust metadata management solution with OpenMetadata on Azure. \n Prerequisites \n To follow along step by step, make sure that the following items are available: \n \n An Azure Account with the ability to create Azure Kubernetes Service (AKS) and Azure NetApp Files resources \n A NetApp Instaclustr account with the ability to create databases \n A local workstation with Git, Azure CLI, kubectl, helm, and Terraform installed \n \n Workstation setup \n This GitHub repository contains the Terraform code to create the required infrastructure and helm values to deploy OpenMetadata. Run the following command to clone the repository to the local workstation (or alternatively fork the repo if you expect to make changes) and change into the new directory: \n git clone https://github.com/MichaelHaigh/netapp-1p-data-catalogs.git \ncd netapp-1p-data-catalogs/OpenMetadata/Azure \n Install the necessary Terraform providers: \n terraform init \n Your workstation is now ready to deploy the necessary infrastructure, but let’s first inspect the repository contents. \n Repository directory contents \n The OpenMetadata/Azure directory contains several Terraform files for deploying the infrastructure and several markup files for deploying the application: \n \n aks.tf: Terraform code that deploys a basic managed Kubernetes cluster \n anf.tf: Terraform code that deploys Azure NetApp Files, which is used as the storage back end for the Kubernetes cluster \n default.tfvars: Terraform variable values that enable customization of the OpenMetadata deployment with the default Terraform workspace \n dependencies-values.yaml: helm values for OpenMetadata’s dependencies, primarily Apache® Airflow® \n instaclustr.tf: Terraform code that deploys an Instaclustr managed PostgreSQL cluster running on Azure NetApp Files and an OpenSearch cluster \n logs_dags_pvc.yaml: Kubernetes manifest that defines two ReadWriteMany persistent volume claims, which are provided by the default Azure NetApp Files storage class \n main.tf: Terraform code that sets the required provider versions, including credential configuration \n openmetadata-values.yaml: helm values for OpenMetadata, primarily referencing the external database and search configurations \n outputs.tf: Terraform code that defines output variables of the to-be-deployed infrastructure, which is used when deploying the OpenMetadata application \n scripts/:\n \n opensearch_setup.sh: shell script invoked by instaclustr.tf, which configures the OpenSearch cluster after deployment by creating an OpenMetadata user with necessary privileges \n postgresql_setup.sh: a shell script invoked by instaclustr.tf, which configures the PostgreSQL cluster after deployment by creating Airflow and OpenMetadata users and databases \n storage_class_setup.sh: a shell script invoked by aks.tf, which installs NetApp Trident™ on the AKS cluster and creates an Azure NetApp Files back end and storage class \n \n \n variables.tf: Terraform code that defines input variables and correlates with tfvar files \n vnet.tf: Terraform code that deploys Azure virtual networking \n \n If you’re familiar with Terraform or Kubernetes and helm concepts, you can inspect these files to better understand the environment. However, most of the complexity and decision making are abstracted by Terraform variables, next. \n Terraform variables file \n As mentioned in the previous section, default.tfvars specifies the values that allow customization of each OpenMetadata deployment. This variable file (and the default workspace) are acceptable to use if you’re deploying a single OpenMetadata environment. \n However, if your use case requires multiple OpenMetadata deployments (for example, prod and dr, or eastus and westus), you can create any number of new workspaces and copy the default variable file (be sure to match your workspace name): \n terraform workspace new <workspace-name> \ncp default.tfvars <workspace-name>.tfvars \n Each deployment can then be configured independently by using its corresponding variable file. Most of the variables can be left as–is; however, a handful must be changed for your environment. \n Credentials \n The credentials section of the variables file has two variables, both of which must be updated for your environment: \n \n # Credentials \nsp_creds = \"~/.azure/azure-sp-tme-demo2-terraform.json\" \nic_creds = \"~/.instaclustr/instaclustr-creds.json\" \n The sp_creds variable points to the local file path of a credential file of a service principal, which has the following format: \n { \n \"subscriptionId\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\", \n \"appId\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\", \n \"displayName\": \"azure-sp-terraform\", \n \"password\": \"aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd\", \n \"tenant\": \"aaaaaaaaaabbbbbbbbbbccccccccccdddddd\" \n} \n If you need to create a new service principal, follow the Azure Terraform provider documentation (the contributor role will have all the necessary privileges): \n \n The subscriptionIdfield can be gathered from the subscription blade. \n The appId(also known as the client ID), displayName, and tenant (also known as the directory ID) fields can be gathered from the app registration blade (step 1 in the Terraform provider documentation). \n The passwordfield can be gathered (only at time of creation) from the Certificates & secrets: client secrets page of your app registration (step 2 in the Terraform provider documentation). \n \n The ic_creds variable points to the local file path of an Instaclustr API key file with the following format: \n { \n \"username\": \"johndoe@domain.com\", \n \"api_key\": \"aaaaaaaaaabbbbbbbbbbccccccccccdd\" \n} \n Both of these values can be gathered from the Gear Icon > Account Settings > API Keys section of the Instaclustr console (detailed instructions can be found here). \n Azure settings \n The Azure settings section contains to variables: \n # Azure Settings \nazr_region = \"eastus\" \ncreator_tag = \"johndoe\" \n The azr_region variable specifies which region to deploy the non Instaclustr resources into; it can be changed. The creator_tag variable is used as an Azure tag to help identity and organize resources; it should be updated. \n Instaclustr settings \n The Instaclustr settings section contains three variables: \n \n # Instaclustr Settings \nic_region = \"EAST_US\" \nic_provider_account = \"riyoa-name\" # Only needed for RIYOA, set to \"\" for Instaclustr's cloud \nic_resource_group = \"instaclustreastus\" \n \n ic_region: Should be the same region as specified in azr_region; however, the formatting is slightly different (see the Instaclustr-specific Azure terminology here). \n ic_provider_account: Must be changed, to either your provider account name (if running in your own account (RIYOA)), or to an empty string (\"\") if running in the Instaclustr account. \n ic_resource_group: Must be changed, to either the name of the resource group you want to deploy into for RIYOA environments, or to an empty string (\"\") if running in the Instaclustr account. \n \n VNet settings \n The VNet settings section contains the network and subnet addresses for all infrastructure: \n # VNet Settings \nom_vnet_cidr = \"10.20.0.0/22\" \nom_vnet_dns_ip = \"10.20.3.254\" # must be w/in om_vnet_cidr \nom_anf_cidr = \"10.20.2.0/24\" # must be w/in om_vnet_cidr \nom_aks_nodepool_cidr = \"10.20.0.0/23\" # must be w/in \nom_vnet_cidr om_aks_services_cidr = \"172.16.0.0/16\" # must not be w/in om_vnet_cidr \nom_aks_services_dns_ip = \"172.16.0.10\" # must be w/in om_aks_services_cidr \nom_aks_pods_cidr = \"172.18.0.0/16\" # must not be w/in om_vnet_cidr \npostgresql_network = \"10.0.0.0/16\" # must not be w/in om_vnet_cidr \npostgresql_storage_net = \"10.1.0.0/22\" # must not be w/in om_vnet_cidr nor postgresql_network \nopensearch_network = \"10.2.0.0/16\" # must not be w/in om_vnet_cidr nor postgresql_network \n These addresses can be left as is or configured for your environment. Be sure to take note of the comments, because certain addresses must or must not be within other address spaces. \n AKS cluster settings \n The AKS cluster section has four variables: \n # AKS Cluster Settings \naks_kubernetes_version = \"1.30.7\" \naks_trident_version = \"24.10.0\" \naks_node_count = 2 \naks_image_size = \"Standard_D4s_v3\" \n At the time of publishing, these values can be left as–is. However, refer to the AKS Kubernetes release calendar to make sure that aks_kubernetes_version is still under support. Depending on the Kubernetes version deployed, Trident may need to be updated, but at the time of publishing, 24.10.0 is current. \n The other two variables can be left as the default, or they can be updated according to use-case requirements. \n Azure NetApp Files settings \n The Azure NetApp Files section has two variables: \n # ANF Settings \nanf_service_level = \"Standard\" \nanf_pool_size = 2 \n These variables specify the service level and capacity pool size. They can be left as is or customized for your environment. \n PostgreSQL settings \n The PostgreSQL section specifies the Instaclustr PostgreSQL cluster settings: \n # PostgreSQL Settings \npostgresql_sla_tier = \"NON_PRODUCTION\" \npostgresql_version = \"16.6.0\" \npostgresql_replication = \"ASYNCHRONOUS\" \npostgresql_node_size = \"PGS-PRD-Standard_E16s_v4-ANF-2048\" \npostgresql_node_count = 2 \n These settings can all be left at their existing values. However, for production workloads, NetApp recommends modifying the SLA tier and replication to PRODUCTION and SYNCHRONOUS, respectively. Also note that the PostgreSQL node size specifies that it uses Azure NetApp Files as the storage provider. \n OpenSearch settings \n The OpenSearch section specifies the Instaclustr OpenSearch cluster settings: \n # OpenSearch Settings \nopensearch_sla_tier = \"NON_PRODUCTION\" \nopensearch_version = \"2.18.0\" \nopensearch_data_node_count = 3 \nopensearch_data_node_size = \"SRH-PRD-D2s_v5-120-an\" \nopensearch_dashboard_node_size = \"SRH-PRD-D2s_v5-120-an\" \nopensearch_manager_node_size = \"SRH-DM-PRD-D2as_v4-16-an\" \n These settings can all be left at their existing values. However, for production workloads, NetApp recommends modifying the SLA tier to PRODUCTION. \n Authorized networks \n The authorized network section specifies a list of maps which enable the following: \n # Authorized Networks \nauthorized_networks = [ \n { \n cidr_block = \"198.51.100.0/24\" \n display_name = \"company_range\" \n }, \n { \n cidr_block = \"203.0.113.30/32\" \n display_name = \"home_address\" \n }, \n] \n These values must be updated, at a minimum, to your current workstation’s IP address. (Run curl -4 ifconfig.me to get your IP address.) If you only need to specify a single address or subnet, remove the second map. Or, optionally, you can add any number of maps to specify additional networks, depending on your use case. \n Infrastructure deployment \n With the variable files properly configured, it’s time to deploy the infrastructure that OpenMetadata runs on: \n terraform apply -var-file=\"$(terraform workspace show).tfvars\" \n Review the prompt that Terraform displays and enter yes if the plan is acceptable. It should take 15 to 20 minutes for everything to deploy, at which point you’ll see the following output: \n Apply complete! Resources: 25 added, 0 changed, 0 destroyed. \n\nOutputs: \n\naz_kubeconfig_cmd = \"az aks get-credentials --resource-group openmetadata-default-rg --name openmetadata-default-cluster\" \nkubeconfig = <sensitive> \nopenmetadata_airflow_password = <sensitive> \nopensearch_openmetadata_password = <sensitive> \nopensearch_private_address = \"private-search.6c7736c38687463da6f3a0eac1c9fa44.cnodes.io\" \npostgresql_airflow_password = <sensitive> \npostgresql_icpostgresql_password = <sensitive> \npostgresql_openmetadata_password = <sensitive> \npostgresql_private_address = \"10.0.0.5\" \n These output variables will be used programmatically when the application is deployed, which is up next. \n Application deployment \n Now that the infrastructure has been created and configured, it’s time to deploy OpenMetadata. First, add the official OpenMetadata helm repository: \n helm repo add open-metadata https://helm.open-metadata.org/ \nhelm repo update \n Due to the storage_class_setup.sh script, which was invoked as part of the Terraform apply, your kubectl configuration context will already be pointed at the deployed AKS cluster: \n $ kubectl get storageclasses\nkubectl get storageclasses\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\nazure-netapp-files-standard (default) csi.trident.netapp.io Delete Immediate true 14m\nazurefile file.csi.azure.com Delete Immediate true 18m\nazurefile-csi file.csi.azure.com Delete Immediate true 18m\nazurefile-csi-premium file.csi.azure.com Delete Immediate true 18m\nazurefile-premium file.csi.azure.com Delete Immediate true 18m\ndefault disk.csi.azure.com Delete WaitForFirstConsumer true 18m\nmanaged disk.csi.azure.com Delete WaitForFirstConsumer true 18m\nmanaged-csi disk.csi.azure.com Delete WaitForFirstConsumer true 18m\nmanaged-csi-premium disk.csi.azure.com Delete WaitForFirstConsumer true 18m\nmanaged-premium disk.csi.azure.com Delete WaitForFirstConsumer true 18m \n Run the following commands to create the Kubernetes namespace, secrets, and persistent volumes (note that the secrets are created by referencing the Terraform output variables shown earlier): \n kubectl create namespace openmetadata\nkubectl create secret -n openmetadata generic sql-secrets \\\n --from-literal=airflow-sql-password=$(terraform output -raw postgresql_airflow_password) \\\n --from-literal=openmetadata-sql-password=$(terraform output -raw postgresql_openmetadata_password)\nkubectl create secret -n openmetadata generic elasticsearch-secrets \\\n --from-literal=openmetadata-elasticsearch-password=$(terraform output -raw opensearch_openmetadata_password)\nkubectl create secret -n openmetadata generic airflow-secrets \\\n --from-literal=openmetadata-airflow-password=$(terraform output -raw openmetadata_airflow_password)\nkubectl apply -f logs_dags_pvc.yaml \n OpenMetadata has a few dependencies, primarily Apache Airflow, that must be installed next. As mentioned earlier, dependencies-values.yaml contains the nonsensitive helm values (sensitive values are set through the CLI), optionally modified for your environment. For more information on all possible helm value options, see the official repository. \n helm install -n openmetadata openmetadata-dependencies open-metadata/openmetadata-dependencies \\\n --set airflow.externalDatabase.host=$(terraform output -raw postgresql_private_address) \\\n --values dependencies-values.yaml \n After 5 to 10 minutes, the persistent volumes should be bound, and all pods should be in a ready state: \n $ kubectl -n openmetadata get pods,pvc\nNAME READY STATUS RESTARTS AGE\npod/openmetadata-dependencies-db-migrations-797fd8b77d-cppfx 1/1 Running 0 11m\npod/openmetadata-dependencies-pgbouncer-68d7bbc96f-2mm65 1/1 Running 0 11m\npod/openmetadata-dependencies-scheduler-88c55846-9l7pc 1/1 Running 0 11m\npod/openmetadata-dependencies-sync-users-6484f6896d-2mj57 1/1 Running 0 11m\npod/openmetadata-dependencies-triggerer-75f8584fc9-vvrfx 1/1 Running 0 11m\npod/openmetadata-dependencies-web-6bd7b5698b-sqrwr 1/1 Running 0 11m\npod/opensearch-0 1/1 Running 0 11m\n\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE\npersistentvolumeclaim/openmetadata-dependencies-dags-pvc Bound pvc-0508e8e4-5633-46cb-b36e-2bbe1eac3315 50Gi RWX azure-netapp-files-standard <unset> 12m\npersistentvolumeclaim/openmetadata-dependencies-logs-pvc Bound pvc-bd367907-c36d-40ec-a9c7-a1f251fed1db 50Gi RWX azure-netapp-files-standard <unset> 12m\npersistentvolumeclaim/opensearch-opensearch-0 Bound pvc-77d50368-650f-4771-afa7-c343062f4769 50Gi RWO azure-netapp-files-standard <unset> 11m \n Finally, the openmetadata-values.yaml file specifies the OpenMetadata helm values. Optionally modify any values based on the official repository and deploy OpenMetadata: \n helm install -n openmetadata openmetadata open-metadata/openmetadata \\\n --set openmetadata.config.database.host=$(terraform output -raw postgresql_private_address) \\\n --set openmetadata.config.elasticsearch.host=$(terraform output -raw opensearch_private_address) \\\n --values openmetadata-values.yaml \n When the openmetadata-0 pod is in a ready state, deployment of OpenMetadata is complete: \n \n $ kubectl -n openmetadata get pod -l app.kubernetes.io/name=openmetadata\nNAME READY STATUS RESTARTS AGE\nopenmetadata-c4d4f88bc-9l7z8 1/1 Running 0 2m2s \n Using OpenMetadata \n Now that OpenMetadata has been deployed, you can access it through your favorite browser at the following URL: \n echo http://$(kubectl -n openmetadata get service/openmetadata -o jsonpath='{.status.loadBalancer.ingress[0].ip}'):8585 \n \n (i) Note \n For production use cases, you should enable SSL through an AKS Ingress Controller, external Nginx, or directly within the OpenMetadata server, according to usual business practices. \n \n Log in with the default credentials of admin@open-metadata.org / admin to access the OpenMetadata homepage: \n \n Adding a service \n Adding services and ingestions to OpenMetadata enables the extraction of service-specific metadata into the central metadata catalog. This connectivity ensures that the metadata catalog remains up to date and reflects the current state of data assets. There are many supported services (like NetApp® ONTAP®), but as an example we’ll add the Instaclustr PostgreSQL database we just deployed. \n In the OpenMetadata UI, click Settings in the lower left corner. \n \n Select the Services tile. \n \n Select the Databases tile. \n \n Click the Add New Service button. \n \n Scroll down, or search for Postgres, select the Postgres Service, and click Next. \n \n Give the service a descriptive name, such as instaclustr-openmetadata-default-postgresql, optionally provide a description, and click Next. \n \n Specify icpostgresql as the Username and leave Basic Auth selected in the dropdown. Copy the output from the following command and paste it into the Password field. \n terraform output -raw postgresql_icpostgresql_password \n For the Host and Port field, copy and paste the output from this command (the virtual networks of the AKS cluster and Instaclustr resources are peered, enabling internal IP addresses): \n terraform output -raw postgresql_private_address && echo -n :5432 \n Enter postgres as the Database, select Ingest All Databases, and scroll down. \n \n Expand the Postgres Connection Advanced Config section, select require in the SSL Mode dropdown, collapse the Postgres Connection Advanced Config section, and scroll down. \n \n Click Test Connection. \n \n After 10 to 15 seconds, verify that each check and query returns Success. Click OK. \n \n Click Save to finish adding the PostgreSQL service. \n \n Adding an ingestion \n Now that OpenMetadata has the credentials to communicate with PostgreSQL, it’s time to create an ingestion, which uses Airflow to perform the actual metadata collection. Click Add Ingestion. \n \n Optionally specify a database for inclusion or exclusion. In this example, the instaclustr database is specified under Excludes, which results in all other databases being included in metadata extraction. \n \n Scroll down, optionally modifying any default fields based on your use case, and click Next. \n \n Metadata ingestion has the option to run on a regular schedule or on demand. A schedule is preferable for most production use cases. To have the ingestion happen quickly for demo purposes, Every Hour at 55 minutes past the hour is selected. Click Add and Deploy. \n \n Click View Service to be redirected to the PostgreSQL service page. \n \n Head back into your terminal to view the Airflow pod that was created for the ingestion. \n $ kubectl -n openmetadata get pods -l task_id=ingestion_task NAME READY STATUS RESTARTS AGE 09e49cb9-4db8-4a92-bc54-0be48772b6c3-ingestion-task-hbqcoo5c 1/1 Running 0 3m48s \n After a few minutes the ingestion is complete: \n \n Navigate to the Databases tab to view the databases that were discovered during ingestion. \n \n Search for one of the databases in the search bar at the top of the page and view the results in the dropdown. This search is powered by the Instaclustr OpenSearch cluster. \n \n Cleanup \n If you deployed OpenMetadata only for testing or demo purposes, you can destroy OpenMetadata and its infrastructure with the following commands: \n \n helm -n openmetadata uninstall openmetadata\nhelm -n openmetadata uninstall openmetadata-dependencies\nkubectl delete namespace openmetadata\nterraform destroy -var-file=\"$(terraform workspace show).tfvars\" --auto-approve \n Summary \n Deploying OpenMetadata on Azure Kubernetes Service (AKS) with Azure NetApp Files offers a robust solution for metadata management and data discovery, essential for AI/ML initiatives. By following this guide, you can establish a scalable and efficient metadata platform, enhancing collaboration and governance. \n With OpenMetadata, your data teams gain a centralized view of data assets, improving their ability to identify and use data effectively. Leveraging Azure NetApp Files means high performance and reliability, and using external PostgreSQL and OpenSearch databases managed by NetApp Instaclustr optimizes database management. \n This deployment helps NetApp customers overcome data silos, improve data quality, and fully leverage their data for AI/ML purposes. We hope that this article has been valuable in setting up your OpenMetadata instance, empowering your organization to make data-driven decisions and accelerate your AI/ML journey. \n Additional Information \n \n Building scalable and persistent AI applications with LangChain, Instaclustr, and Azure NetApp Files \n What is Azure NetApp Files | Microsoft Learn \n NetApp Instaclustr | Build and Scale Applications Faster \n Catalog Your Data in ONTAP \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"26497","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTIwa2NMUA?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWZVaFFmSQ?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTU3QWxjZA?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUlIcW5vdw?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LXk4WlRLMQ?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWNScFFxeQ?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LVpiTExyWQ?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDg","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LVRZWlBadg?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDk","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWM4SjNSaw?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDEw","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTFvU3h6cQ?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDEx","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTlSbklBQw?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDEy","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LXZTNXhVTA?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDEz","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWpBSThUWA?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE0","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTY3bWJiOA?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE1","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LWdqREl5cA?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE2","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LXhicjBqSg?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE3","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTJnTkN1VQ?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE4","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUhaVFZKMg?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE5","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUZqalJmUg?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDIw","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LUwyZHlveA?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDIx","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LVN2bGdNbQ?revision=11\"}"}}],"totalCount":21,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":{"__typename":"UploadedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDA0NDY3LTIwa2NMUA?revision=11"},"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:4402649":{"__typename":"Conversation","id":"conversation:4402649","topic":{"__typename":"BlogTopicMessage","uid":4402649},"lastPostingActivityTime":"2025-05-01T01:33:07.262-07:00","solved":false},"User:user:171629":{"__typename":"User","uid":171629,"login":"Ilan_Nyska","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xNzE2MjktNTM2MTE1aTc2N0MzOTJGOTMzNDM0ODM"},"id":"user:171629"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LXlpT09MOA?revision=6\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LXlpT09MOA?revision=6","title":"Screenshot 2024-11-26 110136.png","associationType":"COVER","width":2000,"height":930,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LXBXb0ZvTw?revision=6\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LXBXb0ZvTw?revision=6","title":"clipboard_image-4-1744234609550.png","associationType":"BODY","width":750,"height":665,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LWZmQnBpbA?revision=6\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LWZmQnBpbA?revision=6","title":"clipboard_image-5-1744234609550.png","associationType":"BODY","width":750,"height":342,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LU00UTFOWg?revision=6\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LU00UTFOWg?revision=6","title":"clipboard_image-6-1744234609550.png","associationType":"BODY","width":750,"height":164,"altText":""},"BlogTopicMessage:message:4402649":{"__typename":"BlogTopicMessage","subject":"Azure Training Maps","conversation":{"__ref":"Conversation:conversation:4402649"},"id":"message:4402649","revisionNum":6,"uid":4402649,"depth":0,"board":{"__ref":"Blog:board:AzureArchitectureBlog"},"author":{"__ref":"User:user:171629"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":4172},"postTime":"2025-04-10T11:58:32.284-07:00","lastPublishTime":"2025-04-10T11:58:32.284-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Overview \n The Azure Training Maps are a comprehensive visual guide to the Azure ecosystem, integrating all the resources, tools, structures, and connections covered in the course into one inclusive diagram. It enables students to map out and understand the elements they've studied, providing a clear picture of their place within the larger Azure ecosystem. It serves as a 1:1 representation of all the topics officially covered in the instructor-led training. Formats available include PDF, Visio, Excel, and Video. \n \n \n \n Links: \n Each icon in the blueprint has a hyperlink to the pertinent document in the learning path on Learn. \n Layers: \n You have the capability to filter layers to concentrate on segments of the course by modules. \n I.E.: Just day 1 of AZ-104, using filters in Visio and selecting modules 1-3 \n \n \n Integration: \n The Visio Template+ for expert courses like SC-100 and AZ-305 includes an additional layer that enables you to compare SC-100, AZ-500, SC-200, and SC-300 within the same diagram. Similarly, you can compare any combination of AZ-305, AZ-700, AZ-204, and AZ-104 to identify differences and study gaps. This comparison is particularly useful for understanding the extra knowledge or skills required to advance to the next level. \n Advantages for Students \n \n Defined Goals: The blueprint presents learners with a clear vision of what they are expected to master and achieve by the course’s end. \n Focused Learning: By spotlighting the course content and learning targets, it steers learners’ efforts towards essential areas, leading to more productive learning. \n Progress Tracking: The blueprint allows learners to track their advancement and assess their command of the course material. \n Topic List: A comprehensive list of topics for each slide deck is now available in a downloadable .xlsx file. Each entry includes a link to Learn and its dependencies. \n \n Download links \n Note: some files may not be available in web preview so downloading is recommended if you want to view them. \n \n Associate Level \n \n PDF \n \n Visio \n \n Contents \n \n Video Overview \n \n AZ-104 Azure Administrator Associate R: 12/14/2023 U: 10/28/2024 \n \n Blueprint \n \n Visio \n \n Excel \n \n Mod 01 \n \n AZ-204 Azure Developer Associate R: 11/05/2024 U: 11/11/2024 \n \n Blueprint \n \n Visio \n \n Excel \n \n \n \n AZ-500 Azure Security Engineer Associate \n R: 01/09/2024 U: 10/10/2024 \n \n Blueprint \n \n Visio+ \n \n Excel \n \n \n \n AZ-700 Azure Network Engineer Associate \n R: 01/25/2024 U: 11/04/2024 \n \n Blueprint \n \n Visio \n \n Excel \n \n \n \n SC-200 Security Operations Analyst Associate \n R: 04/03/2025 U:04/09/2025 \n Blueprint Visio \n Excel \n \n \n \n SC-300 Identity and Access Administrator Associate \n R: 10/10/2024 \n \n Blueprint \n \n Excel \n \n \n Specialty PDF \n Visio \n \n Contents \n \n \n \n AZ-140 Azure Virtual Desktop Specialty \n R: 01/03/2024 U: 02/27/2025 \n \n Blueprint \n \n Visio \n \n Excel \n \n \n \n Expert level \n PDF \n Visio \n \n Contents \n \n \n \n AZ-305 Designing Microsoft Azure Infrastructure Solutions \n R: 05/07/2024 U: 02/05/2025 \n \n Blueprint \n \n Visio+ AZ-104 AZ-204 AZ-700 AZ-140 \n \n Excel \n \n \n \n SC-100 Microsoft Cybersecurity Architect \n R: 10/10/2024 U: 04/09/2025 \n \n Blueprint \n \n Visio+ \n AZ-500 SC-300 SC-200 \n \n Excel \n \n \n \n Skill based Credentialing \n \n PDF \n Visio \n Contents \n \n \n \n AZ-1002 Configure secure access to your workloads using Azure virtual networking \n R: 05/27/2024 \n \n Blueprint \n \n Visio \n \n Excel \n \n \n \n AZ-1003 Secure storage for Azure Files and Azure Blob Storage \n R: 02/07/2024 U: 02/05/2024 \n \n Blueprint \n Excel \n \n Benefits for Trainers: \n Trainers can follow this plan to design a tailored diagram for their course, filled with notes. They can construct this comprehensive diagram during class on a whiteboard and continuously add to it in each session. This evolving visual aid can be shared with students to enhance their grasp of the subject matter. \n Explore Azure Training Maps! | Microsoft Community Hub Visio stencils Azure icons - Azure Architecture Center | Microsoft Learn \n ___ Subscribe if you want to get notified of any update like new releases or updates. \n My email ilan.nyska@microsoft.com LinkedIn https://www.linkedin.com/in/ilan-nyska/ \n Please consider sharing your anonymous feedback <-- \n Thank you for your support! \n \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4785","kudosSumWeight":7,"repliesCount":3,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LXlpT09MOA?revision=6\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LXBXb0ZvTw?revision=6\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LWZmQnBpbA?revision=6\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LU00UTFOWg?revision=6\"}"}}],"totalCount":4,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":{"__typename":"UploadedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAyNjQ5LXlpT09MOA?revision=6"},"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:4338972":{"__typename":"Conversation","id":"conversation:4338972","topic":{"__typename":"BlogTopicMessage","uid":4338972},"lastPostingActivityTime":"2025-04-10T11:44:02.253-07:00","solved":false},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLUhyRnZHeA?revision=30\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLUhyRnZHeA?revision=30","title":"Screenshot 2024-11-26 110136.png","associationType":"COVER","width":2008,"height":934,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLTZyWDNpTg?revision=30\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLTZyWDNpTg?revision=30","title":"Screenshot 2024-11-26 111334.png","associationType":"BODY","width":1270,"height":1126,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLTRWTUxDVQ?revision=30\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLTRWTUxDVQ?revision=30","title":"Screenshot 2024-11-26 111150.png","associationType":"BODY","width":1438,"height":655,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLW1pRUw5aw?revision=30\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLW1pRUw5aw?revision=30","title":"clipboard_image-3-1732647760934.png","associationType":"BODY","width":750,"height":164,"altText":""},"BlogTopicMessage:message:4338972":{"__typename":"BlogTopicMessage","subject":"Azure Course Blueprints","conversation":{"__ref":"Conversation:conversation:4338972"},"id":"message:4338972","revisionNum":30,"uid":4338972,"depth":0,"board":{"__ref":"Blog:board:AzureArchitectureBlog"},"author":{"__ref":"User:user:171629"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":17442},"postTime":"2024-12-13T11:13:11.007-08:00","lastPublishTime":"2025-04-10T11:44:02.253-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Overview \n The Course Blueprint is a comprehensive visual guide to the Azure ecosystem, integrating all the resources, tools, structures, and connections covered in the course into one inclusive diagram. It enables students to map out and understand the elements they've studied, providing a clear picture of their place within the larger Azure ecosystem. It serves as a 1:1 representation of all the topics officially covered in the instructor-led training. Formats available include PDF, Visio, Excel, and Video. \n \n \n Links: \n Each icon in the blueprint has a hyperlink to the pertinent document in the learning path on Learn. \n Layers: \n You have the capability to filter layers to concentrate on segments of the course by modules. \n I.E.: Just day 1 of AZ-104, using filters in Visio and selecting modules 1-3 \n \n \n Integration: \n The Visio Template+ for expert courses like SC-100 and AZ-305 includes an additional layer that enables you to compare SC-100, AZ-500, and SC-300 within the same diagram. Similarly, you can compare any combination of AZ-305, AZ-700, AZ-204, and AZ-104 to identify differences and study gaps. Since SC-300 and AZ-500 are potential prerequisites for the expert certification associated with SC-100, and AZ-204 or AZ-104 for the expert certification associated with AZ-305, this comparison is particularly useful for understanding the extra knowledge or skills required to advance to the next level. \n Advantages for Students \n \n Defined Goals: The blueprint presents learners with a clear vision of what they are expected to master and achieve by the course’s end. \n Focused Learning: By spotlighting the course content and learning targets, it steers learners’ efforts towards essential areas, leading to more productive learning. \n Progress Tracking: The blueprint allows learners to track their advancement and assess their command of the course material. \n Topic List: A comprehensive list of topics for each slide deck is now available in a downloadable .xlsx file. Each entry includes a link to Learn and its dependencies. \n \n Download links \n \n Associate Level \n \n PDF \n \n Visio \n \n Contents \n \n Video Overview \n \n AZ-104 Azure Administrator Associate R: 12/14/2023 U: 10/28/2024 \n \n Blueprint \n \n Visio \n \n Excel \n \n Mod 01 \n \n AZ-204 Azure Developer Associate R: 11/05/2024 U: 11/11/2024 \n \n Blueprint \n \n Visio \n \n Excel \n \n \n \n AZ-500 Azure Security Engineer Associate \n R: 01/09/2024 U: 10/10/2024 \n \n Blueprint \n \n Visio+ \n \n Excel \n \n \n \n AZ-700 Azure Network Engineer Associate \n R: 01/25/2024 U: 11/04/2024 \n \n Blueprint \n \n Visio \n \n Excel \n \n \n \n SC-200 Security Operations Analyst Associate \n R: 04/03/2025 U:04/09/2025 \n Blueprint Visio \n Excel \n \n \n \n SC-300 Identity and Access Administrator Associate \n R: 10/10/2024 \n \n Blueprint \n \n Excel \n \n \n Specialty \n PDF \n \n Visio \n \n \n \n \n \n AZ-140 Azure Virtual Desktop Specialty \n R: 01/03/2024 U: 02/27/2025 \n \n Blueprint \n \n Visio \n \n Excel \n \n \n \n Expert level \n \n PDF \n \n Visio \n \n \n \n \n \n AZ-305 Designing Microsoft Azure Infrastructure Solutions \n R: 05/07/2024 U: 02/05/2025 \n \n Blueprint \n \n Visio+ AZ-104 AZ-204 AZ-700 AZ-140 \n \n Excel \n \n \n \n SC-100 Microsoft Cybersecurity Architect \n R: 10/10/2024 U: 04/09/2025 \n \n Blueprint \n \n Visio+ \n AZ-500 SC-300 SC-200 \n \n Excel \n \n \n \n Skill based Credentialing \n \n PDF \n \n \n \n \n \n AZ-1002 Configure secure access to your workloads using Azure virtual networking \n R: 05/27/2024 \n \n Blueprint \n \n Visio \n \n Excel \n \n \n \n AZ-1003 Secure storage for Azure Files and Azure Blob Storage \n R: 02/07/2024 U: 02/05/2024 \n \n Blueprint \n Excel \n \n Benefits for Trainers: \n Trainers can follow this plan to design a tailored diagram for their course, filled with notes. They can construct this comprehensive diagram during class on a whiteboard and continuously add to it in each session. This evolving visual aid can be shared with students to enhance their grasp of the subject matter. \n Explore Azure Course Blueprints! | Microsoft Community Hub Visio stencils Azure icons - Azure Architecture Center | Microsoft Learn \n AZ-104 Overview of Mod 01 using Azure Course Blueprint \n \n ___ Subscribe if you want to get notified of any update like new releases or updates. \n My email ilan.nyska@microsoft.com LinkedIn https://www.linkedin.com/in/ilan-nyska/ \n Please consider sharing your anonymous feedback <-- \n Thank you for your support! \n \n \n \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4866","kudosSumWeight":10,"repliesCount":9,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLUhyRnZHeA?revision=30\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLTZyWDNpTg?revision=30\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLTRWTUxDVQ?revision=30\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLW1pRUw5aw?revision=30\"}"}}],"totalCount":4,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":{"__typename":"UploadedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzM4OTcyLUhyRnZHeA?revision=30"},"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:4329673":{"__typename":"Conversation","id":"conversation:4329673","topic":{"__typename":"BlogTopicMessage","uid":4329673},"lastPostingActivityTime":"2025-04-09T09:50:20.963-07:00","solved":false},"User:user:1466128":{"__typename":"User","uid":1466128,"login":"TaleTom","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xNDY2MTI4LTM5MDU1OWlBNjk4NDU2QjYyRjk1RDY5"},"id":"user:1466128"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLUZYOGJ0dA?revision=24\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLUZYOGJ0dA?revision=24","title":"AIfOps.png","associationType":"COVER","width":1195,"height":682,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLWhzYVRneA?revision=24\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLWhzYVRneA?revision=24","title":"Framework LZ.jpg","associationType":"BODY","width":1870,"height":1015,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLXJlbXVCeg?revision=24\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLXJlbXVCeg?revision=24","title":"SQL BPA.png","associationType":"BODY","width":3239,"height":1431,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLWhoaXNHaw?revision=24\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLWhoaXNHaw?revision=24","title":"Smart Update.png","associationType":"BODY","width":2011,"height":949,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLVh0dE1vZg?revision=24\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLVh0dE1vZg?revision=24","title":"Cost Mgmt.png","associationType":"BODY","width":2220,"height":1084,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLWxHRkpKWA?revision=24\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLWxHRkpKWA?revision=24","title":"Anomalies detection.png","associationType":"BODY","width":2053,"height":1057,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLUJsdEhVQQ?revision=24\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLUJsdEhVQQ?revision=24","title":"Smart Doc Creator.png","associationType":"BODY","width":2251,"height":1062,"altText":""},"BlogTopicMessage:message:4329673":{"__typename":"BlogTopicMessage","subject":"AI for Operations","conversation":{"__ref":"Conversation:conversation:4329673"},"id":"message:4329673","revisionNum":24,"uid":4329673,"depth":0,"board":{"__ref":"Blog:board:AzureArchitectureBlog"},"author":{"__ref":"User:user:1466128"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"An integrated framework leveraging Azure OpenAI,Logic Apps and Azure Fuctions to optimize operational processes, including cost monitoring, anomaly detection, security updates, and database assessments, with seamless scalability and intelligence for modern cloud environments.","metrics":{"__typename":"MessageMetrics","views":2420},"postTime":"2024-12-10T09:09:48.493-08:00","lastPublishTime":"2025-04-09T09:50:20.963-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Solutions idea \n This solution series shows some examples of how Azure OpenAI and its LLM models can be used on Operations and FinOps issues. With a view to the use of models linked to the Enterprise Scale Landing Zone, the solutions shown, which are available on a dedicated GitHub, are designed to be deployed within a dedicated subscription, in the examples called ‘OpenAI-CoreIntegration’. The examples we are going to list are: \n \n SQL BPA AI Enhanced \n Azure Update Manager AI Enhanced \n Azure Cost Management AI Enhanced \n Azure AI Anomalies Detection \n Azure OpenAI Smart Doc Creator \n \n Enterprise Scale AI for Operations Landing Zone Design Architecture \n \n SQL BPA AI Enhanced Architecture \n This LogApp is an example of integrating ARC SQL practices assessment results with OpenAI, creating an HTML report and CSV file send via Email with OpenAI comment of Severity High and/or Medium results based on the actual Microsoft Documentation. \n \n Dataflow \n Initial Trigger \n \n Type: Recurrence \n Configuration:\n \n Frequency: Weekly \n Day: Monday \n Time: 9:00 AM \n Time Zone: W. Europe Standard Time \n \n \n Description: The Logic App is triggered weekly to gather data for SQL Best Practice Assessments. \n \n Step 1: Data Query \n \n Action: Run_query_and_list_results \n Description: Executes a Log Analytics query to retrieve SQL assessment results from monitored resources. \n Output: A dataset containing issues classified by severity (High/Medium). \n \n Step 2: Variable Initialization \n \n Actions:\n \n Initialize_variable_CSV: Initializes an empty array to store CSV results. \n Open_AI_API_Key: Sets up the API key for Azure OpenAI service. \n HelpLinkContent: Prepares a variable to store useful links. \n \n \n Description: Configures necessary variables for subsequent steps. \n \n Step 3: Process Results \n \n Action: For_eachSQLResult \n Description: Processes the query results with the following sub-steps:\n \n Condition: Checks if the severity is High or Medium. \n OpenAI Processing:\n \n Sends structured prompts to the GPT-4 model for recommendations on identified issues. \n Parses the JSON response to extract specific insights. \n \n \n CSV Composition: Creates an array containing detailed results. \n \n \n \n Step 4: Report Generation \n \n Actions:\n \n Create_CSV_table: Converts processed data into a CSV format. \n Create_HTML_table: Generates an HTML table from the data. \n ComposeMailMessage: Prepares an HTML email message containing the results and a link to the report. \n \n \n Description: Formats the data for sharing. \n \n Step 5: Saving and Sharing \n \n Actions:\n \n Create_file: Saves the HTML report to OneDrive. \n Send_an_email_(V2): Sends an email with the reports attached (HTML and CSV). \n Post_message_in_a_chat_or_channel: Shares the results in a Teams channel. \n \n \n Description: Distributes the reports to defined recipients. \n \n Components \n \n Azure OpenAI service is a platform provided by Microsoft that offers access to powerful language models developed by OpenAI, including GPT-4, GPT-4o, GPT-4o mini, and others. The service is used in this scenario for all the natural language understanding and generating communication to the customers. \n Azure Logic Apps is a cloud platform where you can create and run automated workflows with little to no code. \n Azure Logic Apps Managed Identities allow to authenticate to any resource that supports Microsoft Entra authentication, including your own applications. \n Azure ARC SQL Server enabled by Azure Arc extends Azure services to SQL Server instances hosted outside of Azure: in your data center, in edge site locations like retail stores, or any public cloud or hosting provider. \n SQL Best Practices Assessment feature provides a mechanism to evaluate the configuration of your SQL Server instance. \n Azure Monitor is a comprehensive monitoring solution for collecting, analyzing, and responding to monitoring data from your cloud and on-premises environments. \n Azure Kusto Query is a powerful tool to explore your data and discover patterns, identify anomalies and outliers, create statistical modeling, and more \n \n Potential use cases \n SQL BPA AI Enhanced exploits the capabilities of the SQL Best Practice Assessment service based on Azure ARC SQL Server. The collected data can be used for the generation of customised tables. The solution is designed for customers who want to enrich their Assessment information with Generative Artificial Intelligence. \n \n Azure Update Manager AI Enhanced Architecture \n This LogApp solution example retrieves data from the Azure Update Manager service and returns an output processed by generative artificial intelligence. \n \n Dataflow \n Initial Trigger \n \n Type: Recurrence Trigger \n Frequency: Monthly \n Time Zone: W. Europe Standard Time \n Triggers the Logic App at the beginning of every month. \n \n Step 1: Initialize API Key \n \n Action: Initialize Variable \n Variable Name: Api-Key \n \n Step 2: Fetch Update Status \n \n Action: HTTP Request \n URI: https://management.azure.com/providers/Microsoft.ResourceGraph/resources \n Query: Retrieves resources related to patch assessments using patchassessmentresources. \n \n Step 3: Parse Update Status \n \n Action: Parse JSON \n Content: Response body from the HTTP request. \n Schema: Extracts details such as VM Name, Patch Name, Patch Properties, etc. \n \n Step 4: Process Updates \n For Each: Body('Parse_JSON')?['data'] \n \n Iterates through each item in the parsed update data. \n \n Condition: If Patch Name is not null and contains \"KB\": \n \n Action: Format Item\n \n Parses individual update items for VM Name, Patch Name, and additional properties. \n \n \n Action: Send to Azure OpenAI\n \n Description: Sends structured prompts to the GPT-4 model \n Headers:\n \n Content-Type: application/json \n api-key: @variables('Api-Key') \n \n \n Body:\n \n Prompts Azure OpenAI to generate a report for each virtual machine and patch, formatted in Italian. \n \n \n \n \n Action: Parse OpenAI Response\n \n Extracts and formats the response generated by Azure OpenAI. \n \n \n Action: Append to Summary and CSV\n \n Adds the OpenAI-generated response to the Updated Summary array. \n Appends patch details to the CSV array. \n \n \n \n Step 5: Finalize Report \n \n Action: Create Reports (I, II, III)\n \n Formats and cleans the Updated Summary variable to remove unwanted characters. \n \n \n Action: Compose HTML Email Content\n \n Constructs an HTML email with the following:\n \n Report summary generated using OpenAI. \n Disclaimer about possible formatting anomalies. \n Company logo embedded. \n \n \n \n \n \n Step 6: Generate CSV Table \n \n Action: Converts the CSV array into a CSV format for attachment. \n \n Step 7: Send E-Mail \n \n Action: Send Email\n \n Recipient: user@microsoft.com \n Subject: Security Update Assessment \n Body: HTML content with report summary. \n Attachment:\n \n Name: SmartUpdate_<timestamp>.csv \n Content: CSV table of update details. \n \n \n \n \n \n Components \n \n Azure OpenAI service is a platform provided by Microsoft that offers access to powerful language models developed by OpenAI, including GPT-4, GPT-4o, GPT-4o mini, and others. The service is used in this scenario for all the natural language understanding and generating communication to the customers. \n Azure Logic Apps is a cloud platform where you can create and run automated workflows with little to no code. \n Azure Logic Apps Managed Identities allow to authenticate to any resource that supports Microsoft Entra authentication, including your own applications. \n Azure Update Manager is a unified service to help manage and govern updates for all your machines. You can monitor Windows and Linux update compliance across your machines in Azure and on-premises/on other cloud platforms (connected by Azure Arc) from a single pane of management. You can also use Update Manager to make real-time updates or schedule them within a defined maintenance window. \n Azure Arc Server lets you manage Windows and Linux physical servers and virtual machines hosted outside of Azure, on your corporate network, or other cloud provider. \n \n Potential use cases \n Azure Update Manager AI Enhanced is an example of a solution designed for all those situations where the IT department needs to manage and automate the telling of information in a readable format on the status of updates to its infrastructure thanks to an output managed by generative artificial intelligence \n Azure Cost Management AI Enhanced Architecture \n This LogApp solution retrieves consumption data from the Azure environment and generates a general and detailed cost trend report on a scheduled basis. \n \n Dataflow \n Initial Trigger \n \n Type: Manual HTTP Trigger \n The Logic App is triggered manually using an HTTP request. \n \n Step 1: Set Current Date and Old Date \n \n Action: Set Actual Date\n \n Current date is initialized to @utcNow('yyyy-MM-dd'). \n Example Value: 2024-11-22. \n \n \n Action: Set Actual Date -30\n \n Old date is set to 30 days before the current date. \n Example Value: 2024-10-23. \n \n \n Action: Set old date -30\n \n Sets the variable currentdate to 30 days prior to the old date. \n Example Value: 2024-09-23. \n \n \n Action: Set old date -60\n \n Sets the variable olddate to 60 days before the current date. \n Example Value: 2024-08-23. \n \n \n \n Step 2: Query Cost Data \n \n Action: Query last 30 days\n \n Queries Azure Cost Management for the last 30 days. \n Example Data Returned:json{ \"properties\": { \"rows\": [ [\"Virtual Machines\", 5000], [\"Databases\", 7000], [\"Storage\", 3000] ] } } \n Copia codice \n \n \n Action: Query -60 -30 days\n \n Queries Azure Cost Management for 30 to 60 days ago. \n Example Data Returned:json{ \"properties\": { \"rows\": [ [\"Virtual Machines\", 4800], [\"Databases\", 6800], [\"Storage\", 3050] ] } } \n Copia codice \n \n \n \n Step 3: Download Detailed Reports \n \n Action: Download_report_actual_month\n \n Generates and retrieves a detailed cost report for the current month. \n \n \n Action: Download_report_last_month\n \n Generates and retrieves a detailed cost report for the previous month. \n \n \n \n Step 4: Process and Store Reports \n \n Action: Actual_Month_Report\n \n Parses the JSON from the current month's report. \n Retrieves blob download links for the detailed report. \n \n \n Action: Last_Month_Report\n \n Parses the JSON from the last month's report. \n Retrieves blob download links for the detailed report. \n \n \n Action: Create_ActualMonthDownload and Create_LastMonthDownload\n \n Initializes variables to store download links. \n \n \n Action: Get_Actual_Month_Download_Link and Get_Last_Month_Download_Link\n \n Iterates through blob data and assigns the download link variables. \n \n \n \n Step 5: Generate Questions for OpenAI \n \n Action: Set_Question\n \n Prepares the first question for Azure OpenAI: \"Describe the key differences between the previous and current month's costs, and create a bullet-point list detailing these differences in Euros.\" \n \n \n Action: Set_Second_Question\n \n Prepares a second question for Azure OpenAI: \"Briefly describe in Italian the major cost differences between the two months, rounding the amounts to Euros.\" \n \n \n \n Step 6: Send Questions to Azure OpenAI \n \n Action: Passo result to OpenAI\n \n Sends the first question to OpenAI for generating detailed insights. \n \n \n Action: Get Description from OpenAI\n \n Sends the second question to OpenAI for a brief summary in Italian. \n \n \n \n Step 8: Process OpenAI Responses \n \n Action: Parse_JSON and Parse_JSON_Second_Question\n \n Parses the JSON response from OpenAI for both questions. \n Retrieves the content of the generated insights. \n \n \n Action: For_each_Description\n \n Iterates through OpenAI's responses and assigns the description to a variable DescriptionOutput. \n \n \n \n Step 9: Compose and send E-Mail \n \n Action: Compose_Email\n \n Composes an HTML email including:\n \n Key insights from OpenAI. \n Links to download the detailed reports. \n \n \n Example Email Content: Azure automated cost control system: - Increase of €200 in Virtual Machines. - Reduction of €50 in Storage. Download details: - Current month: [Download Report] - Previous month: [Download Report]. \n \n \n Action: Send_an_email_(V2)\n \n Sends the composed email. \n \n \n \n Components \n \n Azure OpenAI service is a platform provided by Microsoft that offers access to powerful language models developed by OpenAI, including GPT-4, GPT-4o, GPT-4o mini, and others. The service is used in this scenario for all the natural language understanding and generating communication to the customers. \n Azure Logic Apps is a cloud platform where you can create and run automated workflows with little to no code. \n Azure Logic Apps Managed Identities allow to authenticate to any resource that supports Microsoft Entra authentication, including your own applications. \n \n Potential use cases \n Azure Cost Management AI Enhanced is an example of a solution designed for those who need to programme the generation of reports related to FinOps topics with the possibility to customise the output and send the results via e-mail or perform a customised upload. \n Azure AI Anomalies Detection Architecture \n This LogApp solution leverages Azure Monitor's native machine learning capabilities to retrieve anomalous data within application logs. These will then be analysed by OpenAI. \n \n Dataflow \n Initial Trigger \n \n Type: Recurrence Trigger \n Frequency: Monthly \n Time Zone: W. Europe Standard Time \n Triggers the Logic App at the beginning of every month. \n \n Step 1: Initialize API Key \n \n Action: Initialize Variable \n Variable Name: Api-Key \n \n Step 2: Fetch Update Status \n \n Action: HTTP Request \n URI: https://management.azure.com/providers/Microsoft.ResourceGraph/resources \n Query: Retrieves resources related to patch assessments using patchassessmentresources. \n \n Step 3: Parse Update Status \n \n Action: Parse JSON \n Content: Response body from the HTTP request. \n Schema: Extracts details such as VM Name, Patch Name, Patch Properties, etc. \n \n Step 4: Process Updates \n For Each: @body('Parse_JSON')?['data'] \n \n Iterates through each item in the parsed update data. \n \n Condition: If Patch Name is not null and contains \"KB\": \n \n Action: Format Item\n \n Parses individual update items for VM Name, Patch Name, and additional properties. \n \n \n Action: Send to Azure OpenAI\n \n Description: Sends structured prompts to the GPT-4 model. \n Headers:\n \n Content-Type: application/json \n api-key: @variables('Api-Key') \n \n \n Body:\n \n Prompts Azure OpenAI to generate a report for each virtual machine and patch, formatted in Italian. \n \n \n \n \n Action: Parse OpenAI Response\n \n Extracts and formats the response generated by Azure OpenAI. \n \n \n Action: Append to Summary and CSV\n \n Adds the OpenAI-generated response to the Updated Summary array. \n Appends patch details to the CSV array. \n \n \n \n Step 5: Finalize Report \n \n Action: Create Reports (I, II, III)\n \n Formats and cleans the Updated Summary variable to remove unwanted characters. \n \n \n Action: Compose HTML Email Content\n \n Constructs an HTML email with the following:\n \n Report summary generated using OpenAI. \n Disclaimer about possible formatting anomalies. \n Company logo embedded. \n \n \n \n \n \n Step 6: Generate CSV Table \n \n Action: Converts the CSV array into a CSV format for attachment. \n \n Step 7: Send Notifications \n \n Action: Send Email\n \n Recipient: user@microsoft.com \n Subject: Security Update Assessment \n Body: HTML content with report summary. \n Attachment:\n \n Name: SmartUpdate_<timestamp>.csv \n Content: CSV table of update details. \n \n \n \n \n \n Components \n \n Azure OpenAI service is a platform provided by Microsoft that offers access to powerful language models developed by OpenAI, including GPT-4, GPT-4o, GPT-4o mini, and others. The service is used in this scenario for all the natural language understanding and generating communication to the customers. \n Azure Logic Apps is a cloud platform where you can create and run automated workflows with little to no code. \n Azure Logic Apps Managed Identities allow to authenticate to any resource that supports Microsoft Entra authentication, including your own applications. \n Azure Monitor is a comprehensive monitoring solution for collecting, analyzing, and responding to monitoring data from your cloud and on-premises environments. \n Azure Kusto Queryis a powerful tool to explore your data and discover patterns, identify anomalies and outliers, create statistical modeling, and more \n \n Potential use cases \n Azure AI Anomalies Detection is an example of a solution that exploits the Machine Learning capabilities of Azure Monitor to diagnose anomalies within application logs that will then be analysed by Azure OpenAI. The solution can be customized based on Customer requirements. \n \n Azure OpenAI Smart Doc Creator Architecture \n This Function App solution leverages the Azure OpenAI LLM Generative AI to create a docx file based on the Azure architectural information of a specific workload (Azure Metadata based). The function exploits the 'OpenAI multi-agent' concept. \n \n Dataflow \n Step 1: Logging and Configuration Setup \n \n Initialize Logging:\n \n Advanced logging is set up to provide debug-level insights. \n Format includes timestamps, log levels, and messages. \n \n \n Retrieve OpenAI Endpoint:\n \n QUESTION_ENDPOINT is retrieved from environment variables. \n Logging confirms the endpoint retrieval. \n \n \n \n Step 2: Authentication \n \n Managed Identity Authentication:\n \n The ManagedIdentityCredential class is used for secure Azure authentication. \n The SubscriptionClient is initialized to access Azure subscriptions. \n Retrieves a token for Azure Cognitive Services (https://cognitiveservices.azure.com/.default). \n \n \n \n Step 3: Flattening Dictionaries \n \n Function: flatten_dict\n \n Transforms nested dictionaries into a flat structure. \n Handles nested lists and dictionaries recursively. \n Used for preparing metadata for storage in CSV. \n \n \n \n Step 4: Resource Tag Filtering \n \n Functions:\n \n get_resources_by_tag_in_subscription: Filters resources in a subscription based on a tag key and value. \n get_resource_groups_by_tag_in_subscription: Identifies resource groups with matching tags. \n \n \n Purpose: Retrieve Azure resources and resource groups tagged with specific key-value pairs. \n \n Step 5: Resource Metadata Retrieval \n \n Functions:\n \n get_all_resources: Aggregates resources and resource groups across all accessible subscriptions. \n get_resources_in_resource_group_in_subscription: Retrieves resources from specific resource groups. \n get_latest_api_version: Determines the most recent API version for a given resource type. \n get_resource_metadata: Retrieves detailed metadata for individual resources using the latest API version. \n \n \n Purpose: Collect comprehensive resource details for further processing. \n \n Step 6: Documentation Generation \n \n Function: generate_infra_config\n \n Processes metadata through OpenAI to generate documentation. \n OpenAI generates detailed and human-readable descriptions for Azure resources. \n Multi-stage review process:\n \n Initial draft by OpenAI. \n Feedback loop with ArchitecturalReviewer and DocCreator for refinement. \n \n \n Final content is saved to architecture.txt. \n \n \n \n Step 7: Workload Overview \n \n Function: generate_workload_overview\n \n Reads from the generated CSV file to create a summary of the workload. \n Sends resource list to OpenAI for generating a high-level overview. \n \n \n \n Step 8: Conversion to DOCX \n \n Function: txt_to_docx\n \n Creates a Word document (Output.docx) with:\n \n Section 1: \"Workload Overview\" (generated summary). \n Section 2: \"Workload Details\" (detailed resource metadata). \n \n \n Adds structured headings and page breaks. \n \n \n \n Step 9: Temporary Files Cleanup \n \n Function: cleanup_files\n \n Deletes temporary files:\n \n architecture.txt \n resources_with_expanded_metadata.csv \n Output.docx \n \n \n Ensures no residual files remain after execution. \n \n \n \n Step 10: CSV Metadata Export \n \n Function: save_resources_with_expanded_metadata_to_csv\n \n Aggregates and flattens resource metadata. \n Saves details to resources_with_expanded_metadata.csv. \n Includes unique keys derived from all metadata fields. \n \n \n \n Step 11: Architectural Review Process \n \n Functions:\n \n ArchitecturalReviewer: Reviews and suggests improvements to documentation. \n DocCreator: Incorporates reviewer suggestions into the documentation. \n \n \n Purpose: Iterative refinement for high-quality documentation. \n \n Step 12: HTTP Trigger Function \n \n Function: smartdocs\n \n Accepts HTTP requests with tag_key and tag_value parameters. \n Orchestrates the entire workflow:\n \n Resource discovery. \n Metadata retrieval. \n Documentation generation. \n File cleanup. \n \n \n Responds with success or error messages. \n \n \n \n Components \n \n Azure OpenAI service is a platform provided by Microsoft that offers access to powerful language models developed by OpenAI, including GPT-4, GPT-4o, GPT-4o mini, and others. The service is used in this scenario for all the natural language understanding and generating communication to the customers. \n Azure Functions is a serverless solution that allows you to write less code, maintain less infrastructure, and save on costs. Instead of worrying about deploying and maintaining servers, the cloud infrastructure provides all the up-to-date resources needed to keep your applications running. \n Azure Function App Managed Identities allow to authenticate to any resource that supports Microsoft Entra authentication, including your own applications. \n Azure libraries for Python (SDK) are the open-source Azure libraries for Python designed to simplify the provisioning, management and utilisation of Azure resources from Python application code. \n \n Potential use cases \n The Azure OpenAI Smart Doc Creator Function App, like all proposed solutions, can be modified to suit your needs. It can be of practical help when there is a need to obtain all the configurations, in terms of metadata, of the resources and services that make up a workload. \n \n Contributors \n Principal author: \n \n Tommaso Sacco | Cloud Solutions Architect \n Simone Verza | Cloud Solution Architect \n \n Extended Contribution: \n \n Saverio Lorenzini | Senior Cloud Solution Architect \n Andrea De Gregorio | Technical Specialist \n Gianluca De Rossi | Technical Specialist \n \n Special Thanks: \n \n Carmelo Ferrara | Director CSA \n Marco Crippa | Sr CSA Manager \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"22400","kudosSumWeight":4,"repliesCount":3,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLUZYOGJ0dA?revision=24\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLWhzYVRneA?revision=24\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLXJlbXVCeg?revision=24\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLWhoaXNHaw?revision=24\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLVh0dE1vZg?revision=24\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLWxHRkpKWA?revision=24\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLUJsdEhVQQ?revision=24\"}"}}],"totalCount":7,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":{"__typename":"UploadedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzI5NjczLUZYOGJ0dA?revision=24"},"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:4396849":{"__typename":"Conversation","id":"conversation:4396849","topic":{"__typename":"BlogTopicMessage","uid":4396849},"lastPostingActivityTime":"2025-03-24T17:00:18.023-07:00","solved":false},"User:user:1295005":{"__typename":"User","uid":1295005,"login":"MeganLordeonPennie","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xMjk1MDA1LTU1NjkxOWlENjNCM0RCMUEyOTdDRDI1"},"id":"user:1295005"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2ODQ5LWdIRGZHTw?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2ODQ5LWdIRGZHTw?revision=3","title":"CLO Azure Manuf.png","associationType":"COVER","width":464,"height":309,"altText":""},"BlogTopicMessage:message:4396849":{"__typename":"BlogTopicMessage","subject":"Skill your team to increase performance efficiency of Azure and AI projects","conversation":{"__ref":"Conversation:conversation:4396849"},"id":"message:4396849","revisionNum":3,"uid":4396849,"depth":0,"board":{"__ref":"Blog:board:AzureArchitectureBlog"},"author":{"__ref":"User:user:1295005"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"Discover how to maximize the performance efficiency of your Azure and AI workloads, ensuring your team can scale effectively while maintaining optimal resource utilization and user experience.","metrics":{"__typename":"MessageMetrics","views":386},"postTime":"2025-03-24T17:00:18.023-07:00","lastPublishTime":"2025-03-24T17:00:18.023-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" The cost and performance benefits of moving your workload to the cloud are clear — reduced latency, improved elasticity, and great agility of resources — but it’s also critical to learn to manage ongoing performance efficiency beyond initial migrating to see optimal results. Best practices in performance efficiency go beyond designing your workloads so you only pay for what you need; it’s building the best of cloud computing into every design choice. Ideally, a workload should meet performance targets without overprovisioning, which makes the resources, skilling and how-to guidance offered by Azure Essentials crucial considerations for any team looking to scale efficiently. \n Built to provide help at your point of need, the resources available in Azure Essentials have helped clients complete their app migrations 30% faster (an average of 2.7 weeks) from normal, according to a November 2024 research study by IDC. They also experienced 73% fewer unplanned outages, leading to a 94% decrease in associated revenue losses. \n In this blog, we’ll review how Azure Essentials skilling, tools and frameworks can help your team build resilient, efficient workloads, and introduce self-paced training on Microsoft Learn to help you Elevate reliability, security, and ongoing performance of Azure and AI projects. \n Maximize Azure efficiency with free tools and expert guidance \n Achieving basic operational status is challenging enough— scaling introduces additional complexity that can compromise user experience and exasperate latency issues. Teams tap into free training and comprehensive guidance to improve workload performance efficiency by optimizing migration speed, operational effectiveness, and system resiliency. Azure Essentials provides all these resources in one place to accelerate efficiency and monitor workloads to optimize ongoing performance. \n Tools like Azure Monitor and Azure Advisor that provide continuous monitoring with real-time insights and automated recommendations, while automated testing and remediation using Azure Automation and Azure Functions proactively address performance bottlenecks. These tools collect telemetry data from workloads and their supporting resources to give architectural recommendations and performance metrics that are aligned to the guidance routed in best practices. \n Learn to apply efficiency principles to achieve and sustain performance \n Learning to monitor performance efficiency and applying them at each stage of your workload’s lifecycle are equally important. Recognizing this challenge, our Plan on Microsoft Learn titled Elevate reliability, security, and ongoing performance of Azure and AI projects offers curated skilling to help your team improve reliability, security, and performance in your Azure projects, and explore best practices for deploying Azure landing zones and designing optimized workloads. After completing the Plan, you should be able to: \n \n Use Azure Well-Architected Framework to build effective solutions that balance performance efficiency, security, reliability, cost optimization, and operational excellence and learn about the model of shared responsibility with your cloud provider. \n Make effective decisions about how to implement FinOps, use available Microsoft resources and solutions for FinOps, and conduct a FinOps iteration. \n Utilize Azure savings plans to save your organization money on compute. \n Purchase and use the right reserved instance for your cloud needs and perform basic reporting on your cloud needs. \n \n Maximize workload efficiency with Azure Well-Architected Framework \n In the skilling modules shared here, developers learn to maximize workload performance efficiency through a comprehensive approach in the Azure Well-Architected Framework. It emphasizes scalability planning and resource optimization, enabling applications to handle increased demands while maintaining cost effectiveness. \n Rather than treating performance as an afterthought, the framework integrates it into the early design process, allowing developers to build optimization directly into their applications. This approach balances performance with other critical factors like cost, reliability, and security to create well-rounded solutions that meet business needs. \n The framework views performance efficiency as an ongoing journey, providing tools like Azure Advisor and Well-Architected Review for continuous assessment and improvement. By establishing clear performance targets based on business requirements and promoting regular testing and monitoring, it ensures applications maintain their efficiency as they evolve. This systematic approach helps your team create and maintain high-performing workloads that adapt to changing business demands while optimizing resource usage. \n Scale your workloads with a design checklist and assessment \n In addition to the curated lessons in our Plan on Microsoft Learn, we also created an Azure Quickstart guide with additional learning resources to help you build a comprehensive strategy for performance efficiency, including: \n > Performance efficiency design principles \n Get crucial insight on establishing realistic performance targets and designing for capacity requirements to ensure sustained performance. This document explores optimization strategies, including dedicated cycles for performance enhancement and the utilization of monitoring tools for trend analysis. You’ll also learn the importance of technology adoption in driving performance improvements and the mitigation of adverse effects from updates, enabling you to construct resilient and high-performing cloud solutions. \n > Design review checklist for performance efficiency \n This checklist helps you scale your system to meet growing workload demands while maintaining efficient performance. When designing for performance, consider how cost, complexity, new requirements, technical debt, reporting, and operational work affect your system's efficiency. \n > Performance efficiency tradeoffs \n When setting performance targets and designing for efficiency, it’s important to consider how your decisions affect other architectural pillars. Performance optimizations may enhance some aspects while requiring tradeoffs in others. This article lists example tradeoffs you might encounter when designing for performance efficiency, including: \n \n Reliability: Optimizing for performance efficiency can compromise reliability by reducing redundancy and increasing complexity. \n Security: Security controls may be weakened by performance optimizations that reduce security measures, expand the attack surface, or decrease segmentation. \n Cost optimization: Cost saving measures like avoiding overprovisioning, managing the cost of added components, and ensuring investments align with functional requirements can limit efficiency. \n Operational excellence: Performance optimizations can reduce observability, increase operational complexity, and create culture stress. \n \n Azure Well-Architected Review assessment \n This Microsoft Assessment helps you examine the performance efficiency of your workloads through the lens of the Azure Well-Architected Review Framework. The self-guided assessment takes about an hour to complete, after which you will receive pragmatic recommendations based on your specific needs. \n Ensure a positive user experience while optimizing resources \n Performance efficiency is crucial when developing workloads as it directly impacts user experience and operational costs. You’ll find all of the Azure Essentials resources you need to get started in the Azure Essentials resource kit. \n Ready to get started? Begin the Plan on Microsoft Learn to Elevate reliability, security, and ongoing performance of Azure and AI projects, and ensure your applications scale effectively while maintaining responsiveness and optimizing resource utilization. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"7919","kudosSumWeight":1,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2ODQ5LWdIRGZHTw?revision=3\"}"}}],"totalCount":1,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":{"__typename":"UploadedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2ODQ5LWdIRGZHTw?revision=3"},"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:4394051":{"__typename":"Conversation","id":"conversation:4394051","topic":{"__typename":"BlogTopicMessage","uid":4394051},"lastPostingActivityTime":"2025-03-24T10:27:22.128-07:00","solved":false},"User:user:2766860":{"__typename":"User","uid":2766860,"login":"camzuloiu","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-6.svg?time=0"},"id":"user:2766860"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk0MDUxLUUyZGE5cA?revision=4\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk0MDUxLUUyZGE5cA?revision=4","title":"image1.png","associationType":"COVER","width":1430,"height":1327,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk0MDUxLXozR0Z5Yg?revision=4\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk0MDUxLXozR0Z5Yg?revision=4","title":"clipboard_image-1-1742222095290.png","associationType":"BODY","width":1430,"height":1327,"altText":""},"BlogTopicMessage:message:4394051":{"__typename":"BlogTopicMessage","subject":"Cross-Region Resiliency for Ecommerce Reference Application","conversation":{"__ref":"Conversation:conversation:4394051"},"id":"message:4394051","revisionNum":4,"uid":4394051,"depth":0,"board":{"__ref":"Blog:board:AzureArchitectureBlog"},"author":{"__ref":"User:user:2766860"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"The Cross-Region ECommerce Reference Application is a synthetic workload that mirrors a simple, bare-bones, e-commerce platform. Its purpose is to demonstrate how to further leverage Azure Resiliency best practices to achieve cross-regional resiliency and ensure availability during regional outages.","metrics":{"__typename":"MessageMetrics","views":393},"postTime":"2025-03-24T10:27:22.128-07:00","lastPublishTime":"2025-03-24T10:27:22.128-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Authors: \n \n Radu Dilirici (radudilirici@microsoft.com) \n Ioan Dragan (ioan.dragan@microsoft.com) \n Ciprian Amzuloiu (camzuloiu@microsoft.com) \n \n Introduction \n The initial Resilient Ecommerce Reference Application demonstrated the best practices to achieve regional resiliency using Azure’s availability zones. Expanding on this foundation, in the current article we aim to achieve cross-region resiliency, ensuring high availability and disaster recovery capabilities across multiple geographic regions. This article outlines the enhancements made to extend the application into a cross-region resilient architecture. \n The app is publicly available on GitHub and can be used for educational purposes or as a starting point for developing cross-region resilient applications. \n Overview of Cross-Region Enhancements \n The main architectural change needed to extend the application to a cross-region approach was to replicate the existing zonal resilient setup across multiple Azure regions and enable failover mechanisms for seamless operation during regional outages. \n Below is a visual representation of the new architecture: \n \n \n \n Component Details \n Networking Architecture \n The networking architecture has been extended to support cross-region traffic management. \n Azure Front Door serves as the global entry point, routing traffic to the primary region. In case of a disaster, the traffic is redirected to the secondary region. \n Global Virtual Network Peering is used to link together the virtual networks of the two regions. This enables the Redis Caches and SQL Databases to communicate with each other, keeping them in sync and allowing them to perform the switchover procedure. This change allowed us to remove the previous DNS zone groups. \n Service Endpoints provide secure and direct connectivity with the Azure Virtual Network for the SQL Databases and Key Vault. They allow access to these services without exposing them to the public internet, reducing the attack surface and enhancing security. \n Storage Architecture \n Azure SQL Database, Azure Cache for Redis and Azure Container Registry now employ geo-replication to ensure data availability across regions. Azure Key Vault is cross-region resilient by default as it automatically replicates the data to the Azure paired region. \n Read more about geo-replication for Azure SQL and Azure Cache for Redis. \n Compute Architecture \n The Azure Kubernetes Service (AKS) clusters are deployed across multiple regions , with each cluster running in a minimum of three Availability Zones. The autoscaling and load distribution mechanisms from the original setup are retained, ensuring optimal performance and high availability. Read more about multi-region AKS clusters. \n The application supports both Active-Active and Active-Passive states, determined by the AKS configuration. In an Active-Active state, the secondary AKS is always running, providing a faster switchover at the cost of higher expenses. Conversely, in an Active-Passive state, the secondary AKS is deployed but not started, reducing costs but resulting in a slower switchover. Additionally, the secondary AKS can be configured with fewer resources for further cost savings. \n Failover \n The failover procedure consists of migrating the compute, storage and networking services to the secondary region. Firstly, the AKS cluster is started in the secondary region. In an Active-Active configuration, this step is skipped as the cluster is already running. Then, the SQL Database and Redis Cache are synced with their replicas and the secondary instances are elevated to the primary role. The traffic is reconfigured through the Front Door profile to hit the services in the new region. \n Controlled failover is crucial for keeping systems running smoothly during a disaster. When things go wrong, an on-call engineer can start the failover process to quickly move operations to a backup system, minimizing any potential issues. Follow this guide to start experimenting with failover over the reference application. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4097","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk0MDUxLUUyZGE5cA?revision=4\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk0MDUxLXozR0Z5Yg?revision=4\"}"}}],"totalCount":2,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":{"__typename":"UploadedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk0MDUxLUUyZGE5cA?revision=4"},"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:3885378":{"__typename":"Conversation","id":"conversation:3885378","topic":{"__typename":"BlogTopicMessage","uid":3885378},"lastPostingActivityTime":"2025-03-10T12:03:48.482-07:00","solved":false},"User:user:1940863":{"__typename":"User","uid":1940863,"login":"FreddyAyala","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xOTQwODYzLTQ5MjE3N2kzOEUxRUJENTdCNDkxMDk1"},"id":"user:1940863"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODg1Mzc4LTQ5Mjg2NmlCMzY3NTVBQkQ0Q0U1RURF?revision=7\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODg1Mzc4LTQ5Mjg2NmlCMzY3NTVBQkQ0Q0U1RURF?revision=7","title":"image-2.png","associationType":"BODY","width":1308,"height":902,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODg1Mzc4LTQ5Mjg2OGkyMzNDM0U0NjA0MDZFOUNF?revision=7\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODg1Mzc4LTQ5Mjg2OGkyMzNDM0U0NjA0MDZFOUNF?revision=7","title":"image-1.png","associationType":"BODY","width":1496,"height":548,"altText":null},"BlogTopicMessage:message:3885378":{"__typename":"BlogTopicMessage","subject":"Empowering Disaster Recovery for Azure VMs with Azure Site Recovery and Terraform","conversation":{"__ref":"Conversation:conversation:3885378"},"id":"message:3885378","revisionNum":7,"uid":3885378,"depth":0,"board":{"__ref":"Blog:board:AzureArchitectureBlog"},"author":{"__ref":"User:user:1940863"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" Discover how to ensure business continuity and achieve disaster recovery for your Azure Virtual Machines with ease. Learn how to integrate seamlessly with Azure Site Recovery using Terraform, providing a simple, secure, and cost-effective way to replicate VMs across regions. Stay prepared for any outage with a failover process that keeps your apps running, all while paying only for storage and traffic to the secondary region. Don't miss this opportunity to fortify your VM infrastructure and maintain uninterrupted operations! ","introduction":"","metrics":{"__typename":"MessageMetrics","views":11719},"postTime":"2023-08-01T10:41:11.259-07:00","lastPublishTime":"2023-08-01T10:41:11.259-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Azure provides comprehensive backup and disaster recovery solutions that are easy to use, secure, scalable, and budget-friendly. They can also be seamlessly integrated with existing on-premises data protection setups. \n \n In this article, we'll explore a practical demonstration of implementing Virtual Machine Disaster Recovery using Azure Site Recovery VM Replication through Terraform. This approach ensures the continuity of your business apps and workloads during unexpected outages, replicating your virtual machines from one location to another in a straightforward manner. \n \n Azure Site Recovery \n \n Site Recovery helps ensure business continuity by keeping business apps and workloads running during outages. Site Recovery replicates workloads running on physical and virtual machines (VMs) from a primary site to a secondary location. When an outage occurs at your primary site, you fail over to secondary location, and access apps from there. After the primary location is running again, you can fail back to it. \n \n Use Case and architecture \n \n Our use case is to replicate a VM using Site Recovery, so in case we have a failure, we can failover to a secondary VM that will be available using the same FQDN and Public IP as the first one. The second VM should be replicated to a different Region. \n \n \n The architecture of implementing Azure VM Disaster Recovery using Azure Site Recovery and Terraform involves several key components and steps: \n \n \n \n Virtual Machines (VMs): These are the primary workloads that need to be protected and replicated to a secondary location. The VMs run on Azure infrastructure and are the core components of the system. \n \n \n Terraform: Terraform is used as the infrastructure as code tool to provision and manage Azure resources. It provides a declarative approach to define the desired state of the infrastructure and enables easy replication and management of resources. \n \n \n Azure Site Recovery (ASR): ASR is a Microsoft service that orchestrates and automates the disaster recovery process for Azure VMs. It ensures business continuity by replicating VMs from a primary Azure region to a secondary region. \n \n \n Recovery Vault: A Recovery Vault is a central component in ASR that holds the configuration settings for replication, failover, and recovery. It acts as a control center for managing the disaster recovery process. \n \n \n Primary and Secondary Regions: The architecture involves at least two Azure regions: the primary region where the original VMs reside and the secondary region where the replicated VMs will be stored. \n \n \n Replication Policy: A replication policy defines the rules for replication, including how often data should be synchronized between the primary and secondary VMs. \n \n \n Network Infrastructure: Virtual Networks and Subnets are set up in both the primary and secondary regions to facilitate communication between VMs and ensure that the replication process works seamlessly. \n \n \n Managed Disks: The VM's OS and data disks are replicated to the secondary region's Storage Account. Managed Disks provide high availability and reliability for data storage. \n \n \n Failover Testing: Before a disaster occurs, it's essential to perform failover testing to ensure that the replication process works as expected and that applications can run successfully in the secondary region. \n \n \n Failover and Failback: In the event of a disaster, a failover operation is executed to switch the applications from the primary VMs to the replicated VMs in the secondary region. After the primary region is restored, a failback operation can be performed to return to the original setup. \n \n \n In summary, the architecture leverages Terraform's infrastructure as code capabilities to set up the necessary Azure resources, including VMs, Storage Accounts, Virtual Networks, and Subnets. Azure Site Recovery orchestrates the replication, failover, and failback processes to ensure business continuity and disaster recovery for Azure VMs. The well-defined workflow and automation provided by these services enable a resilient and reliable disaster recovery solution for Azure Virtual Machines. \n \n The advantage of using Site Recovery is that the second VM is not running, so we do not pay for the computing resources but only for the storage and traffic to the secondary region. \n \n Implementation example \n \n Before starting you should already have a VNET and Subnet deployed. \n \n First of all we will deploy our virtual machine with a public IP: \n \n \n \ndata \"azurerm_subnet\" \"snet-backend\" {\n depends_on = [var.subnets]\n name = var.vm.snet_name\n virtual_network_name = var.vm.vnet_name\n resource_group_name = var.resource_group\n}\n\nresource \"azurerm_public_ip\" \"pip-vm-app\" {\n name = \"pip-app\"\n location = var.location\n resource_group_name = var.resource_group\n allocation_method = \"Static\"\n idle_timeout_in_minutes = 30\n domain_name_label = var.vm.fqdn\n\n tags = {\n environment = \"test\"\n }\n}\nresource \"azurerm_network_interface\" \"main\" {\n name = var.vm.nic_name\n location = var.location\n resource_group_name = var.resource_group\n\n ip_configuration {\n name = \"testconfiguration1\"\n subnet_id = data.azurerm_subnet.snet-backend.id\n private_ip_address_allocation = \"Dynamic\"\n public_ip_address_id = azurerm_public_ip.pip-vm-app.id\n }\n}\n\nresource \"azurerm_virtual_machine\" \"main\" {\n name = var.vm.name\n location = var.location\n resource_group_name = var.resource_group\n network_interface_ids = [azurerm_network_interface.main.id]\n vm_size = var.vm.size\n\n # Uncomment this line to delete the OS disk automatically when deleting the VM\n # delete_os_disk_on_termination = true\n\n # Uncomment this line to delete the data disks automatically when deleting the VM\n # delete_data_disks_on_termination = true\n\n storage_image_reference {\n publisher = var.vm.storage_image_reference.publisher\n offer = var.vm.storage_image_reference.offer\n sku = var.vm.storage_image_reference.sku\n version = var.vm.storage_image_reference.version\n }\n\n storage_os_disk {\n name = \"disk-${var.vm.name}-os\"\n caching = var.vm.storage_os_disk.caching\n create_option = var.vm.storage_os_disk.create_option\n managed_disk_type = var.vm.storage_os_disk.managed_disk_type\n }\n\n os_profile {\n computer_name = var.vm.os_profile.computer_name\n admin_username = var.vm.os_profile.admin_username\n admin_password = var.vm.os_profile.admin_password\n #custom_data = file(var.vm.os_profile.custom_data)\n }\n\n os_profile_linux_config {\n disable_password_authentication = false\n }\n\n boot_diagnostics {\n enabled = true\n storage_uri = \"https://${var.storage_account.name}.blob.core.windows.net\"\n }\n tags = var.tags\n}\n\n\nresource \"azurerm_managed_disk\" \"disk-data-app\" {\n name = \"disk-${azurerm_virtual_machine.main.name}-data\"\n location = var.location\n resource_group_name = var.resource_group\n storage_account_type = \"StandardSSD_LRS\"\n create_option = \"Empty\"\n disk_size_gb = var.vm.storage_data_disk.disk_size_gb\n}\n\nresource \"azurerm_virtual_machine_data_disk_attachment\" \"example\" {\n managed_disk_id = azurerm_managed_disk.disk-data-app.id\n virtual_machine_id = azurerm_virtual_machine.main.id\n lun = var.vm.storage_data_disk.lun\n caching = \"ReadWrite\"\n} \n \n \n Once the VM is deployed we will deploy a Recovery Vault to use the service Site Recovery \n \n \n \ndata \"azurerm_resource_group\" \"secondary\" {\n name =var.resource_group_secondary\n}\n\n\ndata \"azurerm_resource_group\" \"primary\" {\n name =var.resource_group\n}\n\n\nresource \"azurerm_recovery_services_vault\" \"vault\" {\n name = \"rv-app-${var.region_secondary}-${var.environment}\"\n location = var.location_secondary\n resource_group_name = data.azurerm_resource_group.secondary.name\n sku = \"Standard\"\n}\n \n \n \n Then we will deploy a recovery fabric and a protection container \n \n \n \nresource \"azurerm_site_recovery_fabric\" \"primary\" {\n name = \"primary-fabric\"\n resource_group_name = data.azurerm_resource_group.secondary.name\n recovery_vault_name = azurerm_recovery_services_vault.vault.name\n location = data.azurerm_resource_group.primary.location\n}\n\nresource \"azurerm_site_recovery_fabric\" \"secondary\" {\n name = \"secondary-fabric\"\n resource_group_name = data.azurerm_resource_group.secondary.name\n recovery_vault_name = azurerm_recovery_services_vault.vault.name\n location = var.location_secondary\n}\n\nresource \"azurerm_site_recovery_protection_container\" \"primary\" {\n name = \"primary-protection-container\"\n resource_group_name = data.azurerm_resource_group.secondary.name\n recovery_vault_name = azurerm_recovery_services_vault.vault.name\n recovery_fabric_name = azurerm_site_recovery_fabric.primary.name\n}\n\nresource \"azurerm_site_recovery_protection_container\" \"secondary\" {\n name = \"secondary-protection-container\"\n resource_group_name = data.azurerm_resource_group.secondary.name\n recovery_vault_name = azurerm_recovery_services_vault.vault.name\n recovery_fabric_name = azurerm_site_recovery_fabric.secondary.name\n} \n \n \n We will define a replication policy \n \n \n resource \"azurerm_site_recovery_replication_policy\" \"policy\" {\n name = \"policy\"\n resource_group_name = data.azurerm_resource_group.secondary.name\n recovery_vault_name = azurerm_recovery_services_vault.vault.name\n recovery_point_retention_in_minutes = 24 * 60\n application_consistent_snapshot_frequency_in_minutes = 4 * 60\n} \n \n \n We will map the source container with the target \n \n \n resource \"azurerm_site_recovery_protection_container_mapping\" \"container-mapping\" {\n name = \"container-mapping\"\n resource_group_name = data.azurerm_resource_group.secondary.name\n recovery_vault_name = azurerm_recovery_services_vault.vault.name\n recovery_fabric_name = azurerm_site_recovery_fabric.primary.name\n recovery_source_protection_container_name = azurerm_site_recovery_protection_container.primary.name\n recovery_target_protection_container_id = azurerm_site_recovery_protection_container.secondary.id\n recovery_replication_policy_id = azurerm_site_recovery_replication_policy.policy.id\n}\n \n \n \n Now we will deploy a VNET and Subnet were we will replicate or main Virtual Machine, another one to test the failover and a staging storage account for data replication. \n \n \n \nresource \"random_string\" \"lower\" {\n length = 4\n upper = false\n lower = true\n number = true\n special = false\n}\n\nresource \"azurerm_storage_account\" \"primary\" {\n name = \"prireccache${random_string.lower.result}\"\n location = var.location\n resource_group_name = var.resource_group\n account_tier = \"Standard\"\n account_replication_type = \"LRS\"\n}\n\n\nresource \"azurerm_virtual_network\" \"secondary\" {\n name = \"vnet-app\"\n resource_group_name = data.azurerm_resource_group.secondary.name\n address_space = var.vnet.address_space\n location = var.location_secondary\n}\n\nresource \"azurerm_subnet\" \"secondary\" {\n name = \"snet-backend\"\n resource_group_name = data.azurerm_resource_group.secondary.name\n virtual_network_name = azurerm_virtual_network.secondary.name\n address_prefix = var.vnet.subnets[0].address_prefix\n}\n\n\nresource \"azurerm_virtual_network\" \"test-failover\" {\n name = \"vnet-app-test-failover\"\n resource_group_name = data.azurerm_resource_group.secondary.name\n address_space = [var.vnet.address_space_failover_test[0]]\n location = var.location_secondary\n}\n\nresource \"azurerm_subnet\" \"test-failover\" {\n name = var.vnet.subnets_failover_test[0].name\n resource_group_name = data.azurerm_resource_group.secondary.name\n virtual_network_name = azurerm_virtual_network.test-failover.name\n address_prefix = var.vnet.subnets_failover_test[0].address_prefix\n}\n\nresource \"azurerm_network_interface\" \"vm\" {\n name = \"vm-nic\"\n location = var.location_secondary\n resource_group_name = data.azurerm_resource_group.secondary.name\n\n ip_configuration {\n name = \"nic-vm-app-01\"\n subnet_id = azurerm_subnet.secondary.id\n private_ip_address_allocation = \"Dynamic\"\n }\n} \n \n \n Finally we will deploy our replicated VM \n \n \n \nresource \"azurerm_site_recovery_replicated_vm\" \"vm-replication\" {\n name = \"vm-replication\"\n resource_group_name = data.azurerm_resource_group.secondary.name\n recovery_vault_name = azurerm_recovery_services_vault.vault.name\n source_recovery_fabric_name = azurerm_site_recovery_fabric.primary.name\n source_vm_id = azurerm_virtual_machine.main.id\n recovery_replication_policy_id = azurerm_site_recovery_replication_policy.policy.id\n source_recovery_protection_container_name = azurerm_site_recovery_protection_container.primary.name\n\n target_resource_group_id = data.azurerm_resource_group.secondary.id\n target_recovery_fabric_id = azurerm_site_recovery_fabric.secondary.id\n target_recovery_protection_container_id = azurerm_site_recovery_protection_container.secondary.id\n \n managed_disk {\n disk_id = azurerm_virtual_machine.main.storage_os_disk[0].managed_disk_id\n staging_storage_account_id = azurerm_storage_account.primary.id\n target_resource_group_id = data.azurerm_resource_group.secondary.id\n target_disk_type = var.vm.storage_os_disk.managed_disk_type\n target_replica_disk_type = var.vm.storage_os_disk.managed_disk_type\n }\n\n managed_disk {\n disk_id = azurerm_managed_disk.disk-data-app.id\n staging_storage_account_id = azurerm_storage_account.primary.id\n target_resource_group_id = data.azurerm_resource_group.secondary.id\n target_disk_type = \"StandardSSD_LRS\"\n target_replica_disk_type = \"StandardSSD_LRS\"\n }\n\n target_network_id = azurerm_virtual_network.secondary.id\n\n network_interface {\n source_network_interface_id = azurerm_network_interface.main.id\n target_static_ip = azurerm_public_ip.pip-vm-app.id\n \n }\n} \n \n \n Once we have deployed the resources, we can verify in the Azure Portal Recovery Vault and do a test failover: \n \n \n And voila! Your VM is replicated to a second region and will keep the same FQDN and public IP in the case of a region outage when performing a manual failover, which can be automated using Azure Monitor and a Automation Account. \n \n Conclusion \n In conclusion, setting up Azure VM Disaster Recovery with Azure Site Recovery and Terraform helps businesses protect their important work and keep their operations running smoothly. By using Terraform's simple way to manage resources and Azure Site Recovery's automatic disaster recovery features, companies can easily replicate VMs to another location. \n \n This approach ensures that even if something goes wrong or there's a problem, the applications and data are safe. When a disaster happens, the failover process lets businesses switch to the replicated VMs in a different region, minimizing downtime and data loss. \n \n The combination of Azure Site Recovery and Terraform makes it cost-effective and easy to manage the disaster recovery setup. Businesses can focus on strategic tasks instead of spending time on manual recovery efforts. \n \n With this solution, businesses can be well-prepared for unexpected disruptions, keeping their services up and running and protecting their important data. Implementing Azure VM Disaster Recovery with Azure Site Recovery and Terraform is a smart choice to ensure business continuity and peace of mind. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"16687","kudosSumWeight":4,"repliesCount":2,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODg1Mzc4LTQ5Mjg2NmlCMzY3NTVBQkQ0Q0U1RURF?revision=7\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODg1Mzc4LTQ5Mjg2OGkyMzNDM0U0NjA0MDZFOUNF?revision=7\"}"}}],"totalCount":2,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:4358422":{"__typename":"Conversation","id":"conversation:4358422","topic":{"__typename":"BlogTopicMessage","uid":4358422},"lastPostingActivityTime":"2025-02-19T10:25:02.677-08:00","solved":false},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzU4NDIyLVBtSUFsNw?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzU4NDIyLVBtSUFsNw?revision=10","title":"fef90b42-a2d3-4747-a9a5-4dcdf54689ab.jpeg","associationType":"COVER","width":1024,"height":1024,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzU4NDIyLW1lUnFuZA?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzU4NDIyLW1lUnFuZA?revision=10","title":"clipboard_image-1-1734468801461.jpeg","associationType":"BODY","width":1024,"height":1024,"altText":""},"BlogTopicMessage:message:4358422":{"__typename":"BlogTopicMessage","subject":"Getting started with the NetApp Connector for Microsoft M365 Copilot and Azure NetApp Files","conversation":{"__ref":"Conversation:conversation:4358422"},"id":"message:4358422","revisionNum":10,"uid":4358422,"depth":0,"board":{"__ref":"Blog:board:AzureArchitectureBlog"},"author":{"__ref":"User:user:222853"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" Imagine a world where your on-premises and enterprise cloud files seamlessly integrate with Microsoft Copilot unleashing AI on your Azure NetApp Files enterprise data, and making your workday smoother and more efficient. Welcome to the future with the NetApp Connector for Microsoft Copilot! ","introduction":"Imagine a world where your on-premises and enterprise cloud files seamlessly integrate with Microsoft Copilot unleashing AI on your Azure NetApp Files enterprise data, and making your workday smoother and more efficient. Welcome to the future with the NetApp Connector for Microsoft Copilot!","metrics":{"__typename":"MessageMetrics","views":2195},"postTime":"2025-01-09T12:12:11.802-08:00","lastPublishTime":"2025-02-19T10:25:02.677-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" \n \n Table of Contents \n Introduction \n Prerequisites \n Install the NetApp Connector for Copilot \n Config.json \n ConnectionInfo.json \n CustomConnectorPortMap.json \n Manifest.json \n Uninstallation \n Demonstration \n Summary \n Additional information \n Introduction \n Imagine a world where your on-premises and enterprise cloud files seamlessly integrate with Microsoft 365 Copilot unleashing AI on your Azure NetApp Files enterprise data, and making your workday smoother and more efficient. Welcome to the future with the NetApp Connector for Microsoft Copilot! \n The NetApp Connector for Microsoft Copilot is a fully managed solution provided by Office 365 that integrates your on-premises and enterprise cloud data, including high-performance Azure NetApp Files, with the AI capabilities of Microsoft 365 Copilot. This enables you to harness the full potential of the business intelligence stored on your NetApp systems without the need for any data migration. Whether you're drafting a document in Word or creating a presentation in PowerPoint, Copilot's advanced AI capabilities are at your fingertips, ready to enhance your productivity and streamline your workflows. \n But that's not all. The NetApp Connector ensures that your data remains secure and compliant with existing Microsoft 365 role-based access controls. This ensures that your data is secure while you benefit from seamless integration and improved functionality. \n Co-authors \n \n Kirk Ryan, Office of the CTO (NetApp) \n Kyle Radder, Azure NetApp Files Technical Marketing Engineer \n \n Prerequisites \n Prior to the installation and configuration of the NetApp Connector, complete the following prerequisites. \n \n Obtain 365 License(s) and Microsoft Copilot License(s) \n Install and configure Graph Connector Agent on a Virtual Machine \n Install latest node (LTS) \n Install latest python (LTS) \n Request access here for the NetApp Connector \n \n \n \n \n \n \n (!) Note \n The VM running the Graph Connector Agent requires network connectivity to the Azure NetApp Files share(s) to be indexed. \n \n \n \n \n \n \n Install the NetApp Connector for Copilot \n Download and install NetApp connector onto the VM where you have installed the GCA. The installer automatically performs the following steps. \n \n Installs the NetApp Connector to Program Files/NetApp Connector for Microsoft 365 Copilot (by default). \n Registers the connector as a Windows service (with automatic start). \n \n The connector installation also generates the appropriate files for use by the GCA. These are detailed below and can be copy/pasted or appended (if using several connectors per VM). \n Config.json \n This is the configuration file that is loaded at runtime by the connector. The connectorId and port are set in this file. To change the connectors configuration, simply stop the service (if running), amend the relevant entry in this file and restart the service. Note: If you intend to run several connectors on a single VM, each must have it’s own unique port (i.e. 50051, 50051 and so on). \n ConnectionInfo.json \n Update the providerId under the configuration object: \n {\"id\": \"NetAppConnector\",\"name\": \"NetAppConnector\",\"description\": \"NetApp Connector\",\"configuration\": {\"providerId\": \"5e0f1fd8-bdba-44a4-be18-408515dd2326\",\"scheduleSetting\": {\"fullSyncInterval\": 60},\"CredentialData\": {\"Path\": \"\\\\\\\\anf-2669.demo.yourdomain.com\\\\sharename\",\"AuthenticationKind\": \"windows\",\"CredentialDetails\": {\"loginId\": \"yourloginusername\",\"loginSecret\": \"yourpassword\",\"domain\": \"demo.yourdomain.com\"}},\"ProviderParameters\": null}} \n CustomConnectorPortMap.json \n This file resides in the Graph Connector installation directory, be sure to add the second and additional connectors as follows so that you have a list of all connectors, and their unique ports (note each connector should have its own unique port if running on the same host/VM). \n {\"f3ab6fb9-fd9d-4a28-907e-5e739786bb80\": \"50051\",\"5e0f1fd8-bdba-44a4-be18-408515dd2326\": \"50052\"} \n Manifest.json \n (Note: No longer required as of Feb 2025 as this is now configured in the “Add custom connector” UX of M365 Search and Intelligence) \n { \"connectorId\": \"5e0f1fd8-bdba-44a4-be18-408515dd2326\", \"authTypes\": [\"Windows\"], \"additionalCrawlsSupported\": [\"Incremental\"] } \n Uninstallation \n The connector can be removed via the Control Panel -> Add/Remove Programs menu. This will automatically remove the service and all files. \n Demonstration \n Watch the Quick Bytes video for an overview as well as powerful real-world examples of unleashing AI on your data with Microsoft Copilot. \n \n Summary \n With the NetApp Connector for Copilot, you can unlock the full potential of your business intelligence without the need for data migration, making it an invaluable tool for modern enterprises. Embrace this innovative solution and experience a new level of efficiency and effectiveness in your digital workspace. Stay tuned for more insights and real-world applications of the NetApp Connector for Microsoft Copilot. \n Additional information \n \n Quick Bytes: What is Azure NetApp Files \n Quick Bytes: NetApp Connector for Copilot \n What is Azure NetApp Files? \n General performance considerations for Azure NetApp Files \n Solution architectures using Azure NetApp Files \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"5289","kudosSumWeight":1,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzU4NDIyLVBtSUFsNw?revision=10\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzU4NDIyLW1lUnFuZA?revision=10\"}"}}],"totalCount":2,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[{"__typename":"VideoEdge","cursor":"MHxodHRwczovL3lvdXR1LmJlLzZwbTU5R1ItN0xBLzE3Mzk3ODE4NDk4NDN8MHwyNTsyNXx8","node":{"__typename":"AssociatedVideo","videoTag":{"__typename":"VideoTag","vid":"https://youtu.be/6pm59GR-7LA/1739781849843","thumbnail":"https://i.ytimg.com/vi/6pm59GR-7LA/hqdefault.jpg","uploading":false,"height":240,"width":320,"title":null},"videoAssociationType":"INLINE_BODY"}}],"totalCount":1,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":{"__typename":"UploadedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzU4NDIyLVBtSUFsNw?revision=10"},"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:3932802":{"__typename":"Conversation","id":"conversation:3932802","topic":{"__typename":"BlogTopicMessage","uid":3932802},"lastPostingActivityTime":"2025-02-12T02:09:27.046-08:00","solved":false},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4N2lFQjZDMzcwREJGRjAwOENE?revision=5\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4N2lFQjZDMzcwREJGRjAwOENE?revision=5","title":"OpenAIArchitecture.png","associationType":"BODY","width":3346,"height":1291,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTUwN2kyRURFMkJBQTEzMUMzMzM3?revision=5\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTUwN2kyRURFMkJBQTEzMUMzMzM3?revision=5","title":"AIChatbot.png","associationType":"BODY","width":3136,"height":1826,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4MGkzNjdEQzQ1NUJFQUJFNkEz?revision=5\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4MGkzNjdEQzQ1NUJFQUJFNkEz?revision=5","title":"AILZScenario2.png","associationType":"BODY","width":3346,"height":1291,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4MWk5Mjk2NUM0NjlGQjEzRTIz?revision=5\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4MWk5Mjk2NUM0NjlGQjEzRTIz?revision=5","title":"AILZScenario1.png","associationType":"BODY","width":3346,"height":2033,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4Mmk5NUYyMTQ1MjcwNTkwQTcy?revision=5\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4Mmk5NUYyMTQ1MjcwNTkwQTcy?revision=5","title":"AILZScenarioDNS.png","associationType":"BODY","width":3191,"height":1291,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ5OWk0NjBDQzI5Njc5NzVGREZB?revision=5\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ5OWk0NjBDQzI5Njc5NzVGREZB?revision=5","title":"AILZTopology.png","associationType":"BODY","width":1464,"height":667,"altText":null},"BlogTopicMessage:message:3932802":{"__typename":"BlogTopicMessage","subject":"Demystifying Azure OpenAI Networking for Secure Chatbot Deployment","conversation":{"__ref":"Conversation:conversation:3932802"},"id":"message:3932802","revisionNum":5,"uid":3932802,"depth":0,"board":{"__ref":"Blog:board:AzureArchitectureBlog"},"author":{"__ref":"User:user:1940863"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" Embark on a technical exploration of Azure's networking features for building secure chatbots. In this article, we'll dive deep into the practical aspects of Azure's networking capabilities and their crucial role in ensuring the security of your OpenAI deployments. With real-world use cases and step-by-step instructions, you'll gain practical insights into optimizing Azure and OpenAI for your projects. ","introduction":"","metrics":{"__typename":"MessageMetrics","views":26796},"postTime":"2023-09-20T10:29:18.582-07:00","lastPublishTime":"2023-11-09T11:09:42.528-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Introduction \n \n Azure AI Landing Zones provide a solid foundation for deploying advanced AI technologies like OpenAI's GPT-4 models. These environments are designed to support AI enthusiasts, but it's essential to grasp their networking aspects, especially concerning Platform as a Service (PaaS) offerings. \n \n In this article, we'll dive into the networking details of OpenAI Landing Zones, focusing on how PaaS services handle networking configurations, manage inbound and outbound connectivity, and handle DNS resolution. The knowledge you gain here is applicable not only to OpenAI but also to other PaaS and AI Services within Azure. \n \n But there's more! We'll walk you through a practical scenario involving the creation of an Open AI Chat Web Application. This application allows for seamless interaction between users and AI. To make it even better, we've provided a link to a GitHub repository where you can deploy this application yourself. It's a hands-on opportunity to put what you've learned into practice, transforming concepts into real AI-powered applications. \n \n \n \n Whether you're new to AI networking or looking to expand your knowledge, join us on this informative journey through Azure AI Landing Zones, PaaS networking, and the world of practical AI deployment. \n \n PaaS Services Networking in Azure \n \n PaaS services in Azure are a powerful way to host your applications without the overhead of managing infrastructure. However, understanding how PaaS services handle networking is essential for building secure and efficient solutions. Let's delve deeper into the networking aspects of PaaS services. \n \n PaaS services in Azure do not have a private IP address assigned by default. They can only have a private IP address if they are configured with a private endpoint. Private endpoints allow the PaaS service to communicate securely within the Azure Virtual Network (VNet) using a private IP address. This private IP enables communication between the PaaS service and other resources within the same VNet, such as virtual machines or other PaaS services. \n \n Without a private endpoint, the PaaS service can only be accessed via its public IP address or through other networking configurations like VNet integration or firewall rules. Public IP addresses enable external clients and users to access the PaaS service over the internet. VNet integration allows the PaaS service to securely access resources within a VNet, such as databases or virtual machines, over a private connection. \n \n To summarize, PaaS services in Azure can have both public IP addresses and private IP addresses, but the private IP address is only available if the service is configured with a private endpoint. The private IP address enables communication within the VNet, while the public IP address allows external access over the internet. \n \n Inbound and Outbound Connectivity \n \n Inbound and outbound connectivity are essential aspects of PaaS services' networking. Let's break down how these aspects work in the context of Azure. \n \n Inbound Connectivity: \n \n Inbound connectivity refers to the ability of external clients or users to access a PaaS service. This can be achieved through various means, including public IP addresses or private endpoints. \n \n If a PaaS service has a public IP address, it can be accessed directly over the internet by external clients. \n If a PaaS service is configured with a private endpoint, inbound connectivity is achieved by mapping the service to a private IP address within a VNet. This allows clients within the same VNet to securely access the PaaS service without going through the public internet. \n \n \n Outbound Connectivity: \n \n Outbound connectivity refers to the ability of the PaaS service to initiate outbound connections to external resources, such as databases or APIs. \n \n By default, PaaS services have outbound connectivity enabled, allowing them to communicate with external resources over the internet. \n If a PaaS service is configured with a private endpoint, it does not necessarily mean that the service will have a private outbound IP address. \n The private endpoint primarily focuses on inbound connectivity and provides a private IP address for secure communication within the VNet. Outbound connectivity still uses the public IP address of the PaaS service to communicate with external resources. \n \n In summary, a private endpoint for a PaaS service enhances inbound connectivity by providing a private IP address within a VNet. However, it does not automatically provide a private outbound IP address. Outbound connectivity still relies on the public IP address of the PaaS service. \n \n Understanding Azure Network Traffic \n \n In Azure, the flow of network traffic between Platform as a Service (PaaS) services can take different paths, depending on your network configuration and architecture. It's crucial to comprehend when traffic stays within the Azure network backbone and when it traverses to the public internet. Here's a breakdown: \n \n Traffic Staying Within Azure's Network Backbone \n \n \n \n Within the Same Azure Region: When PaaS services are located within the same Azure region, and no specific network configurations divert traffic outside of that region, the traffic usually remains within the Azure network backbone. Azure's extensive and well-connected network backbone ensures optimal performance and security. \n \n \n Virtual Network (VNet) Integration: Integration of PaaS services with an Azure Virtual Network (VNet) enables communication entirely within Azure's network backbone. VNets create isolated network spaces within Azure, allowing PaaS services connected to the same VNet to communicate using private IP addresses without crossing the public internet. \n \n \n Private Endpoints: Azure offers Private Endpoints for many PaaS services. When you configure PaaS services to use Private Endpoints, traffic between these services and other resources, like virtual machines or databases, can stay within the Azure network backbone. Private Endpoints provide private IP addresses within your VNet for secure and private communication. \n \n \n Regional Peering: Azure features regional network peering, facilitating efficient and secure communication between resources in different Azure regions within the same geographical area. When PaaS services in different regions need to communicate, Azure's regional peering ensures traffic takes an optimized path within the Azure backbone, minimizing latency and ensuring security. \n \n \n Use of Azure Front Door or Azure Application Gateway: Azure Front Door and Azure Application Gateway act as reverse proxies and load balancers for web applications. When traffic flows through these services, they can efficiently route it to PaaS services while ensuring that the traffic remains within Azure's network backbone. They also provide security features like Web Application Firewall (WAF) protection. \n \n \n Internet-Bound Traffic \n \n \n \n Internet-Bound Traffic: Sometimes, PaaS services need to communicate with resources external to Azure, such as external APIs, services, or the public internet. In such cases, the traffic exits the Azure network backbone and travels over the public internet to reach its destination. \n \n \n Network Security Group (NSG) and Firewall Rules: Network Security Groups and Azure Firewall allow you to define access controls and firewall rules for traffic entering and exiting your Azure resources. The configurations within these security features determine whether traffic stays within Azure or is allowed to exit to external destinations. \n \n \n Does My Traffic Go to the Public Internet? \n \n It's essential to understand that even if a resource in Azure has a public IP address for outbound traffic, it doesn't necessarily mean that the traffic will exit the Azure network backbone. Azure's network architecture is designed for intelligent traffic routing. Here's how it works: \n \n \n \n Azure's Internet Egress Points: Azure strategically places internet egress points within its data centers. These egress points are where outbound traffic from Azure resources, such as virtual machines and PaaS services, is routed when it needs to access the public internet. \n \n \n Traffic Optimization: Azure's network routing is optimized to keep traffic within the Azure backbone for as long as possible. When a resource in Azure initiates an outbound connection to a destination on the public internet, Azure's network routing directs the traffic to the nearest internet egress point. \n \n \n Egress Points vs. Data Centers: It's crucial to note that these internet egress points are separate from Azure data centers. While data centers host Azure resources, egress points are specialized network infrastructure designed for efficiently routing traffic to the internet. \n \n \n Public IPs and Network Address Translation (NAT): Azure often uses Network Address Translation (NAT) to manage outbound traffic. Even if a resource has a public IP address assigned, the traffic from that resource may be translated to a different, shared IP address at the egress point before it reaches the public internet. This helps improve security and resource utilization. \n \n \n \n In summary, Azure's network architecture is designed to intelligently route traffic based on destination and optimize performance. Even if a resource in Azure has a public IP address for outbound traffic, Azure strives to keep the traffic within its network backbone for as long as possible, ensuring efficient and secure communication. However, when traffic needs to reach external destinations on the public internet, it will exit Azure's network through designated egress points. This design balances performance, security, and efficiency in handling outbound traffic from Azure resources. \n \n OpenAI Landing Zones and Chatbot Scenarios \n \n Now that we have a better understanding of PaaS services' networking, let's apply this knowledge to OpenAI Landing Zones, specifically in the context of deploying a chatbot web application. \n \n Scenario 1: Secure Communication to Azure App Service via Private Link \n \n \n \n In this scenario, we're building a secure and structured Azure environment designed to ensure the utmost protection for your resources. \n \n Let's break down the key components of this setup: \n \n \n \n Azure Landing Zone: This serves as the foundation of our Azure environment. Think of it as a meticulously organized framework that ensures every aspect of your cloud deployment follows best practices in terms of security, compliance, and efficiency. It's like having a well-structured blueprint for your cloud infrastructure. \n \n \n Jumpbox or Bastion Host: To access and manage our resources securely, we employ a jumpbox or bastion host. These are like gatekeepers, allowing authorized users to enter the Azure environment while keeping unauthorized access at bay. It's akin to having a secure entrance to a restricted area. \n \n \n Azure App Service: Within our environment, we have an Azure App Service. This is where we host a web application that requires a secure connection to Azure OpenAI. Imagine it as the platform where your web application resides, like a dedicated workspace for your digital application. \n \n \n Private Link: To ensure that our communication remains private and secure, we utilize Private Link. This feature allows us to establish a direct and private connection between our Azure App Service and Azure OpenAI. Think of it as having a secret tunnel that only authorized entities can use, keeping your data and interactions confidential. \n \n \n Firewall Rules: In Azure OpenAI, we configure specific firewall rules that permit communication exclusively from the dynamic IP address of our Azure App Service. This meticulous configuration ensures that only the designated service can access Azure OpenAI, enhancing security by allowing only trusted communication. \n \n \n This entire architectural setup is dedicated to maximizing security, maintaining isolation, and controlling communication in a well-organized manner. It's like building a fortified castle with guarded entrances, secret passages, and strict rules to safeguard your valuable digital assets. \n \n Certainly, let's explain how this scenario represents a standard approach to securing Azure OpenAI by using networking as a perimeter. Additionally, we'll introduce the concept of creating an identity perimeter through zero trust and managed identities for an even more comprehensive security strategy. \n Standard Networking Perimeter for Azure OpenAI Security: \n In the described scenario, we've established a robust security perimeter around our Azure OpenAI environment using standard networking practices. Here's how it works: \n \n \n Private Link: We've employed Private Link to establish a dedicated and private connection between our Azure App Service and Azure OpenAI. This serves as a crucial networking perimeter that ensures all communication remains within the protected Azure environment. It's similar to having a secure fortress wall around your critical resources, allowing only authorized access. \n \n \n Firewall Rules: To further enhance security, we've configured precise firewall rules within Azure OpenAI. These rules specify that only communication originating from the dynamic IP address of our Azure App Service is allowed. This means that even within the private network perimeter, only a specific, trusted entity can interact with Azure OpenAI. It's akin to having a heavily guarded gate within the fortress, allowing entry only to those with the right credentials. \n \n \n Identity Perimeter: Leveraging Zero Trust and Managed Identities: \n While the networking perimeter is a foundational security layer, modern security strategies go beyond it to create an identity perimeter. Here's how we can extend our security approach: \n \n \n \n Zero Trust: Zero Trust is a security framework that operates under the principle of \"never trust, always verify.\" In this context, it means that we don't rely solely on network perimeters but instead verify the identity of users and devices attempting to access resources. Think of it as a system of multiple checkpoints and identity verification steps throughout your environment, ensuring that only authenticated and authorized entities can proceed. \n \n \n Managed Identities: Azure provides Managed Identities, which are a secure way to handle identities and access to Azure resources. With Managed Identities, we can ensure that only authorized applications or services can interact with Azure OpenAI. These identities are centrally managed and rotated automatically for enhanced security. It's like having digital badges for your applications, allowing them to access specific resources securely. \n \n \n By combining the networking perimeter with the principles of Zero Trust and Managed Identities, we create a comprehensive security strategy. It's like fortifying our castle not only with strong walls but also with rigorous identity checks at every entry point, making our Azure OpenAI environment exceptionally secure and well-protected. \n \n Scenario 2: Securely Exposing the Application with Application Gateway and WAF \n \n Building upon the first scenario, this advanced configuration aims to securely expose the web application to external users while maintaining robust security measures. This scenario includes the following components: \n \n \n \n Standard Azure Landing Zone: The foundation of this architecture remains consistent with the Azure Landing Zone, ensuring a well-structured and secure environment. \n \n \n Internal Network Access: Access to the internal network is achieved through a jumpbox or bastion host, providing controlled and monitored access to critical resources. \n \n \n Azure App Service with Private Link: The web application continues to be hosted within the Azure App Service, utilizing a private link for connections. This private link ensures that the web application can securely communicate with Azure OpenAI via a private endpoint, maintaining isolation from the public internet. \n \n \n Azure OpenAI Integration: Azure OpenAI remains a crucial part of this scenario, facilitating AI capabilities for the web application. It is integrated through a private endpoint, ensuring data privacy and security. \n \n \n Azure Application Gateway (App GW): An Azure Application Gateway is introduced as a key component. It acts as a reverse proxy and load balancer for the web application. App GW enhances security and traffic management. \n \n \n Web Application Firewall (WAF): The Azure Application Gateway is equipped with a Web Application Firewall (WAF), which serves as a critical security layer. The WAF provides protection against common web vulnerabilities and attacks, safeguarding the web application from potential threats. \n \n \n Firewall Rules in Azure OpenAI: Firewall rules in Azure OpenAI are meticulously configured to maintain secure communication. These rules ensure that only authorized traffic, including that originating from the Azure App Service's dynamic IP address, can access the OpenAI services. \n \n \n This architecture brings an extra layer of protection and load balancing capabilities through the Azure Application Gateway and Web Application Firewall. The App GW efficiently distributes incoming traffic to the web application while safeguarding it against malicious activities. Meanwhile, the private link and endpoint architecture maintain the privacy and security of data exchanged between the web application and Azure OpenAI. \n \n While Scenario 1 prioritizes the network as a perimeter for security, this advanced scenario combines network security with enhanced application-level security through the Azure Application Gateway and Web Application Firewall. This comprehensive approach ensures that the web application remains highly available, performs optimally, and is well-protected against potential threats, providing a robust and secure environment for AI-powered applications. \n \n \n \n \n \n \n \n \n \n \n \n \n DNS Resolution for Both Scenarios \n \n \n In both of the scenarios outlined above, DNS resolution plays a critical role in enabling secure and efficient communication between the Azure App Service and Azure OpenAI. Here's how the DNS resolution process works: \n \n \n \n DNS Query: When the Azure App Service needs to connect to Azure OpenAI's private endpoint, it initiates a DNS query to resolve the hostname (e.g., \"azure-openai.com\") to an IP address. This DNS query is directed to the Azure Private DNS Resolver, which is configured using the custom DNS within the Virtual Network (VNet). \n \n \n Azure Private DNS Zone: Within the virtual network of the hub, where the Private DNS Resolver resides, there is an associated Azure Private DNS Zone. This DNS zone is specifically configured for Azure OpenAI and contains the mapping of the hostname to its private IP address. This association is crucial, as it ensures that DNS requests for Azure OpenAI are resolved internally within your Azure network. \n \n \n DNS Resolution: The Azure Private DNS Resolver consults the Azure OpenAI Private DNS Zone to obtain the private IP address associated with \"azure-openai.com.\" This DNS resolution process occurs entirely within your Azure Virtual Network, maintaining security and privacy. \n \n \n Response: The resolver then provides the Azure App Service with the private IP address it retrieved from the DNS zone. \n \n \n Connection: Armed with the private IP address, your Azure App Service can establish a secure, private connection to Azure OpenAI's private endpoint. Importantly, this connection takes place entirely within your Azure network, eliminating the need for traffic to traverse the public internet. \n \n \n This DNS resolution process ensures that DNS requests for Azure OpenAI are resolved to private IP addresses within your network, enhancing security and minimizing exposure to external networks. By leveraging Azure Private DNS and Private Link, you establish a secure communication channel between your application and Azure OpenAI while maintaining complete control over DNS resolution. \n \n App Service Gotchas and Networking Considerations \n \n Azure App Service is a versatile platform for hosting web applications, including chatbots. However, it does have some networking nuances that need to be addressed in the context of Azure OpenAI Landing Zones. \n \n \n Dynamic Outbound IPs: Azure App Service may have dynamic, frequently changing outbound IP addresses. This dynamism can pose a challenge when configuring firewall rules or IP-based access control for services like Azure OpenAI, which typically require specifying allowed IP addresses. \n Solution: To address this challenge, it's essential to allow a range of IP addresses to accommodate the dynamic nature of outbound IPs from your App Service. This range ensures that your firewall rules or IP restrictions remain effective despite IP changes. \n \n \n Route Traffic Through a Fixed IP: In certain scenarios, Azure OpenAI may require a fixed, known IP address for communication. This is common when dealing with services that enforce IP whitelisting. \n Solution: To meet this requirement, consider routing your App Service traffic through a specific, static IP address. You can achieve this by configuring a NAT Gateway (NATGW) or using Azure Front Door with a dedicated IP. However, keep in mind that even with these solutions, the traffic may still be routed through a public IP address, even though it doesn't leave Azure. \n \n \n VNet Integration: Azure App Service can be integrated with Azure Virtual Networks (VNets) to enable secure communication between your web app and resources within the VNet. This integration can enhance security and enable the use of private endpoints for communication with services like Azure OpenAI. \n \n \n Private Endpoints: Private endpoints offer a highly secure way to connect your Azure App Service to services like Azure OpenAI over a private network. They provide a private IP address within your VNet, ensuring that data does not traverse the public internet during communication. \n \n \n Secure Communication to Azure OpenAI: When your Azure App Service needs to connect to Azure OpenAI, it should use a private endpoint for Azure OpenAI. This approach ensures that the communication remains within your VNet and does not rely on public IP addresses. Implementing encryption protocols like HTTPS or mutual TLS (mTLS) further enhances security. From the AppService side you need both private endpoint and vnet integration to make sure that you are using the private endpoint of azure open ai, if you only use private enpoint and no vnet integration then the AppService will try to use the public endpoint. In theory this might not matter because the traffic will stay in the microsoft backbone and will not go out to the public internet but it's always better to be sure. \n \n \n Firewall Rules for Azure OpenAI: Given that the Azure App Service's outbound IP address is dynamic and public, you need to configure firewall rules in Azure OpenAI to allow communication specifically from the dynamic IP address of your App Service. This step ensures that your web application can establish a secure connection with Azure OpenAI while maintaining a private and secure network architecture. \n \n \n In essence, the key to successfully integrating Azure App Service into your Azure OpenAI Landing Zone lies in managing outbound connectivity effectively while ensuring secure, private, and controlled communication with Azure OpenAI. By addressing these considerations and configurations, you can establish secure, reliable, and efficient communication within your Azure AI Landing Zone. \n \n Securing with Azure Application Gateway \n \n In certain scenarios, particularly when deploying a chatbot that requires web-based interaction, Azure Application Gateway (App Gateway) proves to be an invaluable asset. App Gateway serves as a powerful layer-7 load balancer that not only enhances the availability and scalability of your applications but also plays a pivotal role in securing them. \n \n Frontend IP Configuration: When setting up Azure Application Gateway, you define a Frontend IP Configuration, which acts as the entry point for incoming traffic. You can configure this to be a public IP or a private IP address, depending on your security requirements. For a secure chatbot deployment, the use of a private IP address is often preferred, aligning with the best practices of keeping your chatbot communication within the Azure network. \n \n Backend Pool with Private Endpoints: To establish a secure connection between Azure Application Gateway and your chatbot, you set up a backend pool pointing to the Azure App Service where your chatbot resides. Importantly, this backend pool should use the private endpoint associated with your App Service. Private Endpoints allow the chatbot service to communicate securely within your Azure Virtual Network using a private IP address. \n \n Web Application Firewall (WAF): One of the standout features of Azure Application Gateway is its integration with Web Application Firewall (WAF). The WAF helps safeguard your chatbot by inspecting and filtering incoming traffic. It's a critical security layer that protects against a wide range of web-based threats, such as SQL injection, cross-site scripting (XSS), and more. Configuring and fine-tuning WAF rules according to your chatbot's specific requirements can significantly enhance its security posture. \n \n SSL Termination: Azure Application Gateway also offers the advantage of SSL termination. When deploying a chatbot that requires secure communication over HTTPS, the gateway can handle the SSL/TLS encryption and decryption, thereby offloading this resource-intensive task from your chatbot service. This not only simplifies certificate management but also improves performance. \n By integrating Azure Application Gateway into your chatbot deployment, you ensure that incoming requests are efficiently routed to your chatbot service via a private endpoint. The Web Application Firewall adds an essential security layer, and SSL termination simplifies secure communication setup. These components work harmoniously to protect your chatbot while maintaining optimal performance and accessibility. Incorporating Azure Application Gateway is a valuable step towards a secure and robust chatbot deployment within your Azure environment. \n Conclusion \n Deploying intelligent chatbots powered by OpenAI within Microsoft Azure offers numerous advantages, including scalability, reliability, and seamless integration with other Azure services. However, to ensure the optimal performance, security, and compliance of your chatbot solutions, it's crucial to pay careful attention to the networking aspects. \n \n Azure Landing Zones provide a structured approach to setting up Azure resources, ensuring a strong foundation for your chatbot deployments. Understanding how PaaS services operate within Azure's network and utilizing features like Virtual Network (VNet) Integration and Private Endpoints can enhance the security and efficiency of your chatbot's networking. \n \n Moreover, Azure's intelligent network architecture offers the capability to keep traffic within the Azure network backbone, minimizing latency and improving performance for chatbot interactions. It efficiently routes traffic to designated egress points only when necessary, ensuring that your chatbot's outbound traffic to the public internet is optimized and secure. \n \n By implementing these best practices and leveraging Azure's networking capabilities, you can ensure that your chatbot solutions deliver exceptional user experiences while maintaining the highest standards of performance and security. \n \n \n \n Certainly, you can utilize my repository available at https://github.com/FreddyAyala/AzureAIServicesLandingZone to access a comprehensive working example. This repository provides the resources and configurations needed to deploy both a complete AI Landing Zone and a functional chatbot using Azure OpenAI services. \n \n Whether you're looking to set up an end-to-end AI Landing Zone or simply integrate a chatbot into your existing Azure environment, this repository offers a valuable starting point. It streamlines the deployment process, saving you time and effort, and allows you to harness the capabilities of OpenAI in Azure for your specific use cases. \n \n By leveraging this repository, you can explore and implement AI solutions more efficiently, enabling you to take full advantage of the power of intelligent chatbots within your applications. \n \n \n \n \n \n \n \n \n \n \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"29118","kudosSumWeight":7,"repliesCount":9,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4N2lFQjZDMzcwREJGRjAwOENE?revision=5\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTUwN2kyRURFMkJBQTEzMUMzMzM3?revision=5\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4MGkzNjdEQzQ1NUJFQUJFNkEz?revision=5\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4MWk5Mjk2NUM0NjlGQjEzRTIz?revision=5\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ4Mmk5NUYyMTQ1MjcwNTkwQTcy?revision=5\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTMyODAyLTUwOTQ5OWk0NjBDQzI5Njc5NzVGREZB?revision=5\"}"}}],"totalCount":6,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:4351732":{"__typename":"Conversation","id":"conversation:4351732","topic":{"__typename":"BlogTopicMessage","uid":4351732},"lastPostingActivityTime":"2024-12-12T23:49:06.774-08:00","solved":false},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzUxNzMyLUtaeEdHZw?revision=12\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzUxNzMyLUtaeEdHZw?revision=12","title":"image1 (1).png","associationType":"COVER","width":1462,"height":922,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzUxNzMyLXlkc3puRg?revision=12\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzUxNzMyLXlkc3puRg?revision=12","title":"image1 (1).png","associationType":"TEASER","width":1462,"height":922,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzUxNzMyLWo3UUs3SQ?revision=12\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzUxNzMyLWo3UUs3SQ?revision=12","title":"clipboard_image-2-1733224879608.png","associationType":"BODY","width":735,"height":568,"altText":""},"BlogTopicMessage:message:4351732":{"__typename":"BlogTopicMessage","subject":"Availability Zone Resiliency on Ecommerce Reference Application","conversation":{"__ref":"Conversation:conversation:4351732"},"id":"message:4351732","revisionNum":12,"uid":4351732,"depth":0,"board":{"__ref":"Blog:board:AzureArchitectureBlog"},"author":{"__ref":"User:user:2766860"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" The Resilient Ecommerce Reference Application is a synthetic workload that mirrors a simple, bare-bones, e-commerce platform. The purpose of it is to demonstrate how to use Azure Resiliency best practices to achieve availability during zonal outages or components outages. \n \n ","introduction":"","metrics":{"__typename":"MessageMetrics","views":1220},"postTime":"2024-12-06T10:33:11.007-08:00","lastPublishTime":"2024-12-06T10:33:11.007-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Authors: \n \n Ioan Dragan (ioan.dragan@microsoft.com) \n Ciprian Amzuloiu (camzuloiu@microsoft.com) \n Dragos Unguru (ungurud@microsoft.com) \n \n Introduction \n The Resilient Ecommerce Reference Application is a synthetic workload that mirrors a simple, bare-bones, e-commerce platform. The purpose of it is to demonstrate how to use Azure Resiliency best practices to achieve availability during zonal outages or components outages. \n The application has been tested for resiliency during simulated zonal outages and has performed as expected, keeping a high availability of the service with minimal impact to end users. Currently, it is being used by internal Microsoft teams for regression testing and new region buildouts, providing valuable telemetry to Azure service owners with regards to availability, recovery, service behavior and end user experience. \n The app is publicly available on github and can be used for educational purposes or as a starting point for developing new resilient applications. \n Why does resiliency matter? \n Building zone-resilient systems guarantees high availability by distributing resources across multiple availability zones, minimizing the impact of localized outages. This not only keeps critical applications running smoothly but also enhances user trust and business continuity. A resilient architecture maximizes uptime, reduces downtime risks, and helps organizations meet stringent reliability standards, safeguarding both performance and customer satisfaction. \n Azure provides a robust suite of tools and services designed for high availability, scalability, and disaster recovery. Azure's global network of data centers allows customers to deploy applications across multiple regions, ensuring that applications remain available even if a regional failure occurs. \n Using cloud native services allows customers to leverage built-in redundancy features, such as Azure Availability Zones and Azure Site Recovery, safeguard against hardware failures and natural disasters. Additionally, Azure’s auto-scaling capabilities enable applications to handle varying traffic loads without downtime. With integrated monitoring and security tools like Azure Monitor and Azure Security Center, businesses can proactively address issues, ensuring continuous uptime and resilience against cyber threats. \n Hosting on Azure gives customers the confidence that their applications will remain operational, even under challenging conditions, while benefiting from the scalability and security of a leading cloud provider. \n Azure regions and availability zones (AZ) \n Different Azure regions have different characteristics. Two common ways that Azure regions vary involve availability zones and paired regions. Also, some regions are operated by sovereign entities in particular countries. The region architecture refers to how a specific region is designed and the overall regional capabilities that it provides. \n Many Azure regions include availability zones, which are physically separate data center within a region, equipped with independent power, cooling, and networking, ensuring that localized hardware or infrastructure failures in one zone do not affect others. This architectural separation minimizes downtime and data loss, making it easier to meet stringent uptime and disaster recovery requirements. Additionally, services like virtual machines, storage, and databases can automatically replicate across zones, offering seamless resilience without complex manual configurations. Some regions are paired with another region, with both regions typically located in the same geopolitical area. Region pairing provides resiliency during catastrophic region failures. Region pairing is mostly used for geo-redundant storage (GRS) and by other Azure services that depend on Azure Storage for replication. \n Application structure \n The API \n The API serves as the backbone for the Cart and Order services of an e-commerce platform, handling critical business operations such as adding items to the shopping cart, managing cart contents, and processing customer orders. To ensure high availability and reliability, the API leverages several cloud-native patterns and techniques. \n One of the core techniques used is the retry pattern for interacting with Azure SQL and AzureCache for Redis. In cloud environments, transient failures—such as brief network interruptions or service throttling—are common, especially when services scale dynamically. The retry pattern is crucial to mitigate these failures by automatically retrying operations that fail due to temporary issues. For example, if a connection to Azure SQL or Redis is interrupted, the API will retry the operation after a short delay, ensuring that it doesn't result in a permanent failure or data inconsistency. This retry mechanism significantly improves the resilience of the API, ensuring that the platform continues to function smoothly even in the face of transient issues. \n The API also implements idempotency for critical operations, such as processing orders, ensuring that if a request is retried multiple times, it will produce the same result. This is essential to avoid issues like duplicate orders or overcharging customers, which can occur if the same operation is mistakenly processed more than once. By assigning unique identifiers to each transaction and checking for duplicates, it guarantees that repeated requests do not affect the outcome, preserving data integrity and customer trust. \n To provide detailed insights into the API's behavior and performance, it enriches its logging by incorporating infrastructure-level data such as the pod, node, and Azure Application Gateway instance ID. These enriched logs are stored in Azure Log Analytics, allowing for comprehensive monitoring and troubleshooting. Combined with Container Insights and ingress logs from AKS, this logging strategy enables detailed step-by-step reconstruction of the request lifecycle, making it easier to trace issues and understand system behavior. This level of logging and observability ensures that not only is the API resilient, but also that its performance can be monitored and optimized at every stage of a request’s journey. \n Networking architecture \n The network architecture leverages a Virtual Network (VNet) to securely segment and isolate traffic between the front-end and back-end services, with subnets assigned to critical components such as the Azure Kubernetes Service (AKS), Application Gateway, and the various Azure PaaS services like Azure SQL Database, Azure Cache for Redis, and Azure Key Vault. The architecture implements multiple Availability Zones (in our case: AZ1, AZ2, AZ3) for fault tolerance, ensuring that application services remain operational even in the event of a zone-level failure. \n Azure Front Door acts as the global entry point for users. It routes HTTP/S traffic to the appropriate region or backend service based on proximity, performance, and availability. In this setup, it also integrates Web Application Firewall (WAF) policies for enhanced security against common web vulnerabilities like DDOS, malicious bots and cross-site scripting. Front Door monitors the health of your origin servers, and if an origin becomes unavailable, Front Door can route requests to an alternative origin. By design, Azure Front Door is a global service with embedded resiliency without any requirement for additional settings. Learn more about Azure Front Door. \n The Azure Application Gateway is a web traffic (OSI layer 7) load balancer that enables you to forward traffic to the Internal Load Balancer and ultimately to the backend AKS services. It also includes Web Application Firewall (WAF) features to protect against malicious threats. An Application Gateway can span multiple Availability Zones, removing the need to provision separate Application Gateway instances in each zone with a Traffic Manager. Choosing multiple zones where Application Gateway instances are deployed makes it resilient to zone failure. Learn more about Scaling Application Gateway v2 and high availability \n To manage incoming traffic efficiently, Azure Application Gateway is deployed with autoscaling enabled and is configured to have a minimum of three instances, with one instance in each Availability Zone. This deployment ensures that the traffic is balanced across zones, and if one zone becomes unavailable, the remaining Application Gateway instances in other zones continue to handle the incoming traffic without disruption. \n The autoscaling functionality of Application Gateway automatically adjusts the number of gateway instances based on the volume of incoming traffic. During periods of high traffic, additional instances are spun up to ensure smooth traffic flow, while during low-traffic periods, the number of instances is scaled down to reduce costs. With this configuration the platform can efficiently manage both high-traffic spikes and routine workloads while maintaining optimal performance. With a minimum of three instances across zones, the platform ensures high availability, fault tolerance, and efficient traffic distribution. \n \n The Internal Load Balancer is responsible for distributing traffic to the pods within the Azure Kubernetes Service (AKS) cluster. This helps balance API traffic across the microservices hosted in different Availability Zones. In a region that supports availability zones, Load Balancers can be deployed across multiple zones (zone-redundant). A zone-redundant Load Balancer allows traffic to be served by a single frontend IP address that can survive zone failure. Learn more about reliability and zone redundancy in Azure Load Balancer \n Private Endpoints (for Redis Cache, Key Vault, SQL Database) are used to securely access Azure services over a Private Link within the Azure Virtual Network (VNet). These endpoints allow access to critical services like Cache Redis, Key Vault, and SQL Database without exposing them to the public internet, reducing the attack surface and enhancing security. By default, Private Endpoints offer out of the box Zone Resiliency, without any additional SKU or configuration being required. \n Network Security Groups (NSG) act as additional layers of security to control inbound and outbound traffic between the different components within the VNet, allowing only authorized traffic to reach the e-commerce services. By default, NSGs offer out of the box Zone Resiliency, without any additional SKU or configuration being required. \n Azure Private DNS Zones provide name resolution for the private endpoints within the VNet. The platform uses endpoints like vaultcore.azure.net for Key Vault, database.windows.net for SQL Database, and azmk8s.io for AKS-related resources. This ensures secure and private connections without exposure to public DNS resolutions. Private DNS Zones are Zone Resilient by default. \n Storage architecture \n The data storage is managed by different services based on the data use cases. These include Azure SQL Database for persistent storage, Azure Cache for Redis for temporary cache storage, Azure Key Vault for secrets management, and Azure Container Registry for storing application images. \n Azure SQL Database: Acts as the relational database for storing transactional and persistent data like customer information and order histories. In this setup, the SQL database stores product details, user details and all user orders that have been successfully submitted. Zone-redundant availability ensures your data is spread across three Azure availability zones in the primary region. Zone-redundant availability is available to databases in the Business Critical, General Purpose and Hyperscale service tiers of the vCore-based purchasing model, and only the Premium service tier of the DTU-based purchasing model - the Basic and Standard service tiers don't support zone redundancy. Azure SQL Databases support different backup techniques, which are not in scope of this document. Further reading for Automated backups in Azure SQL Database. \n Azure Cache for Redis: Provides fast in-memory data storage for frequently accessed information, improving application response time. In the current setup, Redis Cache is used to store user cart data. Azure Cache for Redis Standard, Premium, and Enterprise tiers provide built-in redundancy by hosting each cache on two dedicated virtual machines. Azure Cache for Redis also supports zone redundancy in its Standard, Premium, and Enterprise tiers. A zone-redundant cache runs on VMs spread across multiple Availability Zones. \n Azure Key Vault: Used to securely store application secrets, certificates, and encryption keys. In this specific setup, the Key Vault is used to securely store connection details for SQL and Redis. While Managed Identities are used for authentication and no user and password secrets are used, this has been chosen as an additional security measure. For most Azure regions that are paired with another region, the contents of your key vault are replicated both within the region and to the paired region. For non-paired Azure regions and the Brazil South and West US 3 regions, Azure Key Vault uses zone redundant storage (ZRS) to replicate your data three times within the region, across independent availability zones. For Azure Key Vault Premium, two of the three zones are used to replicate the hardware security module (HSM) keys. \n Azure Container Registry: This service is used to store and manage container images for deployment to the AKS cluster. It provides a secure location to pull the containerized microservices that make up the e-commerce platform. The Container Registry can be deployed in a Zone Redundant configuration and/or with a geo-replication to ensure zonal and regional resiliency. Learn more about enabling zone redundancy in Azure Container Registry \n Compute architecture \n The Azure Kubernetes Service (AKS) is the primary compute service deployed across multiple Availability Zones to achieve resilience, autoscaling, and optimal load distribution. \n AKS is configured to run across at least three Availability Zones within the region. Each AKS node pool ensures that there are a minimum of three pod replicas, with one replica per zone, for all key services like APIs or microservices (e.g., Cart and Order in an e-commerce setting). This configuration guarantees that even if an entire zone fails, the services continue to function seamlessly through the remaining replicas in the other zones, thus ensuring high availability and minimizing downtime. Read more about AKS availability zones \n Additionally, the AKS autoscaling is configured for the user node pools. The cluster autoscaler dynamically adjusts the number of nodes in the AKS user node pool based on demand. When application traffic increases, more pods are created, and AKS automatically provisions additional nodes to accommodate the load. Similarly, during low traffic periods, the autoscaler reduces the node count to minimize resource usage and costs. This setup ensures that the application can handle varying traffic loads efficiently while maintaining optimal performance. The pod scaling mechanism also ensures that enough pods are distributed across all availability zones to maintain availability and load balance. \n Other Considerations \n Scalability \n The architecture leverages the scalability features of several Azure services to ensure that the platform can efficiently handle varying workloads and traffic demands: \n \n AKS is set up with autoscaling enabled, allowing it to dynamically adjust the number of nodes in the user node pool based on demand. \n \n \n Azure SQL Database is provisioned with a Premium Zone Redundant SKU. \n \n \n Azure Cache for Redis is provisioned with a Premium Zone Redundant SKU. \n \n \n For handling incoming web traffic, Azure Application Gateway scales automatically based on traffic volume, ensuring that additional instances are created as needed \n \n Monitoring \n To monitor the availability metrics can be used (such as uptime percentage), which reflects the proportion of time the application is available and operational. This can be tracked using Azure Monitor and Application Insights, which provide detailed insights into the health of services, response times, and incident occurrences. Additionally, service-level agreements (SLAs) from Azure, typically guaranteeing 99.99% uptime for zone-redundant services, serve as a baseline for measuring and maintaining high availability. \n Security \n The application achieves robust security through a multi-layered approach, leveraging Azure’s native security features to protect against external threats and unauthorized access. \n Managed Identities and Workload Identities in Azure Kubernetes Service (AKS) are used instead of traditional app secrets or credentials, allowing the application to securely access Azure resources (such as Key Vault and SQL Database) without hardcoding credentials, thus minimizing the risk of credential leaks. Private Endpoints are implemented for all critical services, including Azure SQL, Redis, and Key Vault, ensuring that communication between components happens over a private network, without exposure to the public internet. \n The entire infrastructure operates within a closed Virtual Network (VNET), isolating all services and workloads. Additionally, Network Security Groups (NSGs) are applied to each subnet to block external access and only allow approved internal traffic, further securing the environment. The AKS cluster itself uses a private endpoint, ensuring that access to the cluster is restricted and cannot be reached from the public internet. Together, these security measures create a tightly controlled and secure environment, preventing unauthorized access while allowing the application to securely interact with the necessary Azure services. \n Least privilege is used when applying RBAC roles to ensure that no Managed Identity is overprivileged. Additionally, Privileged Identity Management can be used to further strengthen the security by adding an additional layer of security when accessing production data. \n Stay Resilient using Azure Policies \n Azure Policies can be effectively used to enforce that only zone-resilient resources are deployed within the environment, ensuring consistent high availability and preventing non-compliant configurations. \n By applying Azure Policies, you can apply rules that allow only resources that support and are configured for Availability Zones (such as zone-redundant Redis, databases, and storage accounts) to be deployed. The policy can be scoped to specific subscriptions, resource groups, or management groups, and it will audit or deny resource deployments that do not meet the zone resiliency criteria. For instance, the policy can check if resources like VMSS, Azure SQL, and other critical services are using the appropriate Zone Redundant SKUs or Availability Zones. Once the policy is in place, Azure will automatically prevent any future deployment or configuration updates that are not zone-resilient, effectively blocking non-compliant resource types or configurations from being used. Additionally, policy compliance reports can be generated to monitor and ensure that all resources remain aligned with the zone-resiliency standards, ensuring that the infrastructure continues to support high availability as it scales. \n Azure provides built in policies for the majority of services that support Zonal Resilient configurations. To apply them, search in the Azure Policy for “Resilience” category as in the screenshot below. Microsoft is striving to provide additional policies to support more complex setups. \n \n \n \n \n For a more generic approach, apply the “Resources should be Zone Redundant” initiative that blocks deployment of all non-zone resilient configurations of components. \n Cost optimization \n Cost optimization in a zone-resilient system on Azure involves carefully balancing availability and performance with resource efficiency. Maintaining high availability across zones can lead to increased costs due to duplication of resources, such as virtual machines, storage, and networking components. To optimize costs, organizations can reduce unnecessary expenses and improve operational efficiencies. For more information, see Overview of the cost optimization pillar. \n Use the right virtual machine SKUs. Depending on the size of the deployment and estimated number of users, start with the minimum viable virtual machines. Leverage autoscaling on both VMSS and AKS PODs to ensure no idle machines are running. \n Use autoscaling for Azure SQL. Azure SQL databases allow scaling or DTU based billing. Consider using DTU based billing when you have an uncertain number of users and switch to vCore when you have an accurate estimation. \n Use autoscaling for Application Gateway. App gateway allows setting a min and a max number of instances to run. Consider starting with 3 instances that cover all 3 availability zones and scale up based on traffic requirements. \n Use the Azure calculator. The Azure calculator can help you estimate and optimize costs. For an estimated cost of the baseline architecture, see estimated cost. Your estimates might differ based on your Azure Teamcenter implementation. \n Hands-on experiments \n Deploy the App \n The app source code and the deployment details are maintained in the GitHub repository. Follow the instructions in the readme file to deploy the app and run the health checks. \n Simulating a zone-down (Chaos Studio) \n Azure Chaos Studio Overview \n Azure Chaos Studio is a managed experimentation platform that helps developers and operations teams improve the resilience of their applications by intentionally injecting faults and disruptions into their system. It allows teams to simulate real-world failure scenarios—such as network latency, service downtime, or hardware failures—so they can observe how their application behaves under stress and identify potential weaknesses. By testing with Azure Chaos Studio, teams can proactively improve the reliability and robustness of their applications, ensuring they perform well even in unpredictable cloud environments. The platform integrates seamlessly with Azure services, making it easier to conduct controlled chaos experiments without compromising production environments. Read more about chaos studio. \n Using Chaos Studio to Test Zone Resiliency \n To test the resiliency of the e-commerce application, Azure Chaos Studio can be used to simulate a zone down fault within the application’s architecture. By injecting this fault, the application’s failover mechanisms can be tested (such as retry patterns, zone-redundant deployments, and load balancing). The experiment ensures the application behaves properly in case of an outage and finds any possible degradation in a timely manner. \n The sample source code contains scripts to start the Chaos Experiment and run health checks to ensure the app is running smoothly. Browse to the README file in the GitHub repository to learn more about it. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"23658","kudosSumWeight":4,"repliesCount":1,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzUxNzMyLUtaeEdHZw?revision=12\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzUxNzMyLXlkc3puRg?revision=12\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzUxNzMyLWo3UUs3SQ?revision=12\"}"}}],"totalCount":3,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":{"__typename":"UploadedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzUxNzMyLUtaeEdHZw?revision=12"},"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"CachedAsset:text:en_US-components/community/Navbar-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1745505307000","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","gxcuf89792":"Tech Community","external-1":"Events","s-m-b":"Nonprofit Community","windows-server":"Windows Server","education-sector":"Education Sector","driving-adoption":"Driving Adoption","Common-content_management-link":"Content Management","microsoft-learn":"Microsoft Learn","s-q-l-server":"Content Management","partner-community":"Microsoft Partner Community","microsoft365":"Microsoft 365","external-9":".NET","external-8":"Teams","external-7":"Github","products-services":"Products","external-6":"Power Platform","communities-1":"Topics","external-5":"Microsoft Security","planner":"Outlook","external-4":"Microsoft 365","external-3":"Dynamics 365","azure":"Azure","healthcare-and-life-sciences":"Healthcare and Life Sciences","external-2":"Azure","microsoft-mechanics":"Microsoft Mechanics","microsoft-learn-1":"Community","external-10":"Learning Room Directory","microsoft-learn-blog":"Blog","windows":"Windows","i-t-ops-talk":"ITOps Talk","external-link-1":"View All","microsoft-securityand-compliance":"Microsoft Security","public-sector":"Public Sector","community-info-center":"Lounge","external-link-2":"View All","microsoft-teams":"Microsoft Teams","external":"Blogs","microsoft-endpoint-manager":"Microsoft Intune","startupsat-microsoft":"Startups at Microsoft","exchange":"Exchange","a-i":"AI and Machine Learning","io-t":"Internet of Things (IoT)","Common-microsoft365-copilot-link":"Microsoft 365 Copilot","outlook":"Microsoft 365 Copilot","external-link":"Community Hubs","communities":"Products"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1745505307000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1745505307000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1745505307000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1745505307000","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1745505307000","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1745505307000","value":{"success.follow.title":"Following Tag","success.unfollow.title":"Unfollowed Tag","success.follow.message.followAcrossCommunity":"You will be notified when this tag is used anywhere across the community","success.unfollowtag.message":"You will no longer be notified when this tag is used anywhere in this place","success.unfollowtagAcrossCommunity.message":"You will no longer be notified when this tag is used anywhere across the community","unexpected.error.title":"Error - Action Failed","unexpected.error.message":"An unidentified problem occurred during the action you took. Please try again later.","buttonTitle":"{isSubscribed, select, true {Unfollow} false {Follow} other{}}","unfollow":"Unfollow"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1745505307000","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1745505307000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListTabs-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1745505307000","value":{"mostKudoed":"{value, select, IDEA {Most Votes} other {Most Likes}}","mostReplies":"Most Replies","mostViewed":"Most Viewed","newest":"{value, select, IDEA {Newest Ideas} OCCASION {Newest Events} other {Newest Topics}}","newestOccasions":"Newest Events","mostRecent":"Most Recent","noReplies":"No Replies Yet","noSolutions":"No Solutions Yet","solutions":"Solutions","mostRecentUserContent":"Most Recent","trending":"Trending","draft":"Drafts","spam":"Spam","abuse":"Abuse","moderation":"Moderation","tags":"Tags","PAST":"Past","UPCOMING":"Upcoming","sortBymostRecent":"Sort By Most Recent","sortBymostRecentUserContent":"Sort By Most Recent","sortBymostKudoed":"Sort By Most Likes","sortBymostReplies":"Sort By Most Replies","sortBymostViewed":"Sort By Most Viewed","sortBynewest":"Sort By Newest Topics","sortBynewestOccasions":"Sort By Newest Events","otherTabs":" Messages list in the {tab} for {conversationStyle}","guides":"Guides","archives":"Archives"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1745505307000","value":{"bylineAuthor":"{bylineAuthor}","bylineBoard":"{bylineBoard}","anonymous":"Anonymous","place":"Place {bylineBoard}","gotoParent":"Go to parent {name}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1745505307000","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1745505307000","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1745505307000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1745505307000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1745505307000","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1745505307000","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1745505307000","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1745505307000","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1745505307000","value":{"textTitle":"{count, plural,one {{messageType, select, IDEA{Vote} other{Like}}} other{{messageType, select, IDEA{Votes} other{Likes}}}}","likes":"{count, plural, one{like} other{likes}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1745505307000","value":{"textTitle":"{count, plural,one {{conversationStyle, select, IDEA{Comment} OCCASION{Comment} other{Reply}}} other{{conversationStyle, select, IDEA{Comments} OCCASION{Comments} other{Replies}}}}","comments":"{count, plural, one{Comment} other{Comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1745505307000","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505307000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1745505307000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"nodeId":"board:AzureArchitectureBlog","tagName":"infrastructure"},"buildId":"-gVUpXaWnPcjlrLJZ92B7","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"o365","openTelemetryServiceVersion":"25.3.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/customComponent/CustomComponent/CustomComponent.tsx","./components/tags/TagsHeaderWidget/TagsHeaderWidget.tsx","./components/messages/MessageListForNodeByRecentActivityWidget/MessageListForNodeByRecentActivityWidget.tsx","./components/tags/TagSubscriptionAction/TagSubscriptionAction.tsx","./components/external/components/ExternalComponent.tsx","../shared/client/components/common/List/ListGroup/ListGroup.tsx","./components/messages/MessageView/MessageView.tsx","./components/messages/MessageView/MessageViewInline/MessageViewInline.tsx","../shared/client/components/common/Pager/PagerLoadMore/PagerLoadMore.tsx","./components/customComponent/CustomComponentContent/TemplateContent.tsx"],"appGip":true,"scriptLoader":[{"id":"analytics","src":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/pagescripts/1730819800000/analytics.js?page.id=TagPage","strategy":"afterInteractive"}]}