containers

153 Topics
"}},"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\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageListTabs\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageListTabs-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1750268614987"}],"cachedText({\"lastModified\":\"1750268614987\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1750268614987"}]},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Anonymous","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-1750076308834":{"__typename":"CachedAsset","id":"pages-1750076308834","value":[{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"UserBlogPermissions.Page","type":"COMMUNITY","urlPath":"/c/user-blog-permissions/page","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"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":1750076308834,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"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":1750076308834,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"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":1750076308834,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1750076308834,"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-1750076308235":{"__typename":"CachedAsset","id":"theme:customTheme1-1750076308235","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1750268614987","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1750268614987","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:AppsonAzureBlog":{"__typename":"Blog","id":"board:AppsonAzureBlog","entityType":"BLOG","displayId":"AppsonAzureBlog","nodeType":"board","depth":4,"conversationStyle":"BLOG","title":"Apps on Azure 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":"Apps on Azure 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:AppsonAzureBlog-1750269061019":{"__typename":"CachedAsset","id":"quilt:o365.prod:pages/tags/TagPage:board:AppsonAzureBlog-1750269061019","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:1750076239319":{"__typename":"CachedAsset","id":"quiltWrapper:o365.prod:Common:1750076239319","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.tempStatusBanner","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1750268614987","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.tempStatusBanner-en-us-1750268252189":{"__typename":"CachedAsset","id":"component:custom.widget.tempStatusBanner-en-us-1750268252189","value":{"component":{"id":"custom.widget.tempStatusBanner","template":{"id":"tempStatusBanner","markupLanguage":"HTML","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.tempStatusBanner","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.HeroBanner-en-us-1750268252189":{"__typename":"CachedAsset","id":"component:custom.widget.HeroBanner-en-us-1750268252189","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-1750268252189":{"__typename":"CachedAsset","id":"component:custom.widget.MicrosoftFooter-en-us-1750268252189","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: 50px;\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\n.social-share-email-image:hover {\n border-radius: 0;\n}\n\n.social-link-footer:hover .linkedin-icon {\n border-radius: 0;\n}\n.social-link-footer:hover .social-share-email-image {\n border-radius: 0;\n}\n\n.social-link-footer img {\n width: 30px;\n height: auto;\n transition: filter 0.3s ease;\n}\n\n.social-share-list {\n width: 50px;\n}\n.social-share-rss-image {\n width: 30px;\n height: auto;\n transition: filter 0.3s ease;\n}\n.sharing-options li {\n width: 50px;\n height: 50px;\n padding: 8px;\n box-sizing: border-box;\n border: 2px solid white; \n display: inline-block;\n text-align: center;\n opacity: 1;\n visibility: visible;\n transition: border 0.3s ease; /* Smooth transition effect */\n border-left: none;\n border-bottom: none; /* Apply bottom border to only last item */\n}\n\n.social-share-list-linkedin {\n background-color: #0474b4;\n border-top-right-radius: 5px; /* Rounded top right corner of first item*/\n}\n.social-share-list-facebook {\n background-color: #3c5c9c;\n}\n.social-share-list-xicon {\n background-color: #000;\n}\n.social-share-list-reddit {\n background-color: #fc4404;\n}\n.social-share-list-bluesky {\n background-color: #f0f2f5;\n}\n.social-share-list-rss {\n background-color: #ec7b1c;\n}\n.social-share-list-mail {\n background-color: #848484; \n border-bottom-right-radius: 5px; /* Rounded bottom right corner of last item*/\n}\n.sharing-options li.social-share-list-mail {\n border-bottom: 2px solid white; /* Add bottom border only to the last item */\n height: 52px; /* Increase last child height to make in align with the hover label */\n}\n.x-icon {\n filter: invert(100%);\n transition: filter 0.3s ease;\n width: 20px !important;\n height: auto;\n padding-top: 5px !important;\n}\n.bluesky-icon {\n filter: invert(20%) sepia(100%) saturate(3000%) hue-rotate(180deg);\n transition: filter 0.3s ease;\n padding-top: 5px !important;\n width: 25px !important;\n}\n\n.share-icon {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n\n.sharing-options li:hover {\n border: 2px solid white; \n border-left: none;\n border-bottom: none;\n border-radius: 0px;\n}\n.sharing-options li.social-share-list-mail:hover {\n border-bottom: 2px solid white; /* Add bottom border only to the last item */\n}\n\n.sharing-options li: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: 52px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 10px 12px 15px 8px;\n border: 2px solid white;\n}\n.linkedin {\n background-color: #0474b4;\n border-top-right-radius: 5px; /* Rounded top right corner of first item*/\n}\n.facebook {\n background-color: #3c5c9c;\n}\n.twitter {\n background-color: black;\n color: white;\n}\n.reddit {\n background-color: #fc4404;\n}\n.mail {\n background-color: #848484;\n border-bottom-right-radius: 5px; /* Rounded bottom right corner of last item*/\n}\n.bluesky {\n background-color: #f0f2f5;\n color: black;\n}\n.rss {\n background-color: #ec7b1c;\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_yuh6w_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_yuh6w_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_yuh6w_12 {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.custom_widget_MicrosoftFooter_c-uhff-nav_yuh6w_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_yuh6w_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_yuh6w_57 {\n .custom_widget_MicrosoftFooter_c-uhff-nav-group_yuh6w_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_yuh6w_78.custom_widget_MicrosoftFooter_f-bare_yuh6w_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_yuh6w_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_yuh6w_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_yuh6w_107:hover {\n text-decoration: underline;\n }\n ul.custom_widget_MicrosoftFooter_c-list_yuh6w_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_yuh6w_78.custom_widget_MicrosoftFooter_f-bare_yuh6w_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_yuh6w_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_yuh6w_146 {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 3.125rem;\n border-radius: 0 0.4375rem 0.4375rem 0;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_yuh6w_156 {\n border-top-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_yuh6w_156:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-share-email-image_yuh6w_163:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_yuh6w_167:hover .custom_widget_MicrosoftFooter_linkedin-icon_yuh6w_156 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_yuh6w_167:hover .custom_widget_MicrosoftFooter_social-share-email-image_yuh6w_163 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_yuh6w_167 img {\n width: 1.875rem;\n height: auto;\n transition: filter 0.3s ease;\n}\n.custom_widget_MicrosoftFooter_social-share-list_yuh6w_180 {\n width: 3.125rem;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_yuh6w_183 {\n width: 1.875rem;\n height: auto;\n transition: filter 0.3s ease;\n}\n.custom_widget_MicrosoftFooter_sharing-options_yuh6w_146 li {\n width: 3.125rem;\n height: 3.125rem;\n padding: 0.5rem;\n box-sizing: border-box;\n border: 2px solid white; \n display: inline-block;\n text-align: center;\n opacity: 1;\n visibility: visible;\n transition: border 0.3s ease; /* Smooth transition effect */\n border-left: none;\n border-bottom: none; /* Apply bottom border to only last item */\n}\n.custom_widget_MicrosoftFooter_social-share-list-linkedin_yuh6w_203 {\n background-color: #0474b4;\n border-top-right-radius: 5px; /* Rounded top right corner of first item*/\n}\n.custom_widget_MicrosoftFooter_social-share-list-facebook_yuh6w_207 {\n background-color: #3c5c9c;\n}\n.custom_widget_MicrosoftFooter_social-share-list-xicon_yuh6w_210 {\n background-color: #000;\n}\n.custom_widget_MicrosoftFooter_social-share-list-reddit_yuh6w_213 {\n background-color: #fc4404;\n}\n.custom_widget_MicrosoftFooter_social-share-list-bluesky_yuh6w_216 {\n background-color: #f0f2f5;\n}\n.custom_widget_MicrosoftFooter_social-share-list-rss_yuh6w_219 {\n background-color: #ec7b1c;\n}\n.custom_widget_MicrosoftFooter_social-share-list-mail_yuh6w_222 {\n background-color: #848484; \n border-bottom-right-radius: 5px; /* Rounded bottom right corner of last item*/\n}\n.custom_widget_MicrosoftFooter_sharing-options_yuh6w_146 li.custom_widget_MicrosoftFooter_social-share-list-mail_yuh6w_222 {\n border-bottom: 2px solid white; /* Add bottom border only to the last item */\n height: 3.25rem; /* Increase last child height to make in align with the hover label */\n}\n.custom_widget_MicrosoftFooter_x-icon_yuh6w_230 {\n filter: invert(100%);\n transition: filter 0.3s ease;\n width: 1.25rem !important;\n height: auto;\n padding-top: 0.3125rem !important;\n}\n.custom_widget_MicrosoftFooter_bluesky-icon_yuh6w_237 {\n filter: invert(20%) sepia(100%) saturate(3000%) hue-rotate(180deg);\n transition: filter 0.3s ease;\n padding-top: 0.3125rem !important;\n width: 1.5625rem !important;\n}\n.custom_widget_MicrosoftFooter_share-icon_yuh6w_244 {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n.custom_widget_MicrosoftFooter_sharing-options_yuh6w_146 li:hover {\n border: 2px solid white; \n border-left: none;\n border-bottom: none;\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_sharing-options_yuh6w_146 li.custom_widget_MicrosoftFooter_social-share-list-mail_yuh6w_222:hover {\n border-bottom: 2px solid white; /* Add bottom border only to the last item */\n}\n.custom_widget_MicrosoftFooter_sharing-options_yuh6w_146 li:hover .custom_widget_MicrosoftFooter_label_yuh6w_260 {\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_yuh6w_260 {\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: 3.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.625rem 0.75rem 0.9375rem 0.5rem;\n border: 2px solid white;\n}\n.custom_widget_MicrosoftFooter_linkedin_yuh6w_156 {\n background-color: #0474b4;\n border-top-right-radius: 5px; /* Rounded top right corner of first item*/\n}\n.custom_widget_MicrosoftFooter_facebook_yuh6w_290 {\n background-color: #3c5c9c;\n}\n.custom_widget_MicrosoftFooter_twitter_yuh6w_293 {\n background-color: black;\n color: white;\n}\n.custom_widget_MicrosoftFooter_reddit_yuh6w_297 {\n background-color: #fc4404;\n}\n.custom_widget_MicrosoftFooter_mail_yuh6w_300 {\n background-color: #848484;\n border-bottom-right-radius: 5px; /* Rounded bottom right corner of last item*/\n}\n.custom_widget_MicrosoftFooter_bluesky_yuh6w_237 {\n background-color: #f0f2f5;\n color: black;\n}\n.custom_widget_MicrosoftFooter_rss_yuh6w_308 {\n background-color: #ec7b1c;\n}\n@media (max-width: 991px) {\n .custom_widget_MicrosoftFooter_social-share_yuh6w_138 {\n display: none;\n }\n}\n","tokens":{"context-uhf":"custom_widget_MicrosoftFooter_context-uhf_yuh6w_1","c-uhff-link":"custom_widget_MicrosoftFooter_c-uhff-link_yuh6w_12","c-uhff":"custom_widget_MicrosoftFooter_c-uhff_yuh6w_12","c-uhff-nav":"custom_widget_MicrosoftFooter_c-uhff-nav_yuh6w_35","c-heading-4":"custom_widget_MicrosoftFooter_c-heading-4_yuh6w_49","c-uhff-nav-row":"custom_widget_MicrosoftFooter_c-uhff-nav-row_yuh6w_57","c-uhff-nav-group":"custom_widget_MicrosoftFooter_c-uhff-nav-group_yuh6w_58","c-list":"custom_widget_MicrosoftFooter_c-list_yuh6w_78","f-bare":"custom_widget_MicrosoftFooter_f-bare_yuh6w_78","c-uhff-base":"custom_widget_MicrosoftFooter_c-uhff-base_yuh6w_94","c-uhff-ccpa":"custom_widget_MicrosoftFooter_c-uhff-ccpa_yuh6w_107","social-share":"custom_widget_MicrosoftFooter_social-share_yuh6w_138","sharing-options":"custom_widget_MicrosoftFooter_sharing-options_yuh6w_146","linkedin-icon":"custom_widget_MicrosoftFooter_linkedin-icon_yuh6w_156","social-share-email-image":"custom_widget_MicrosoftFooter_social-share-email-image_yuh6w_163","social-link-footer":"custom_widget_MicrosoftFooter_social-link-footer_yuh6w_167","social-share-list":"custom_widget_MicrosoftFooter_social-share-list_yuh6w_180","social-share-rss-image":"custom_widget_MicrosoftFooter_social-share-rss-image_yuh6w_183","social-share-list-linkedin":"custom_widget_MicrosoftFooter_social-share-list-linkedin_yuh6w_203","social-share-list-facebook":"custom_widget_MicrosoftFooter_social-share-list-facebook_yuh6w_207","social-share-list-xicon":"custom_widget_MicrosoftFooter_social-share-list-xicon_yuh6w_210","social-share-list-reddit":"custom_widget_MicrosoftFooter_social-share-list-reddit_yuh6w_213","social-share-list-bluesky":"custom_widget_MicrosoftFooter_social-share-list-bluesky_yuh6w_216","social-share-list-rss":"custom_widget_MicrosoftFooter_social-share-list-rss_yuh6w_219","social-share-list-mail":"custom_widget_MicrosoftFooter_social-share-list-mail_yuh6w_222","x-icon":"custom_widget_MicrosoftFooter_x-icon_yuh6w_230","bluesky-icon":"custom_widget_MicrosoftFooter_bluesky-icon_yuh6w_237","share-icon":"custom_widget_MicrosoftFooter_share-icon_yuh6w_244","label":"custom_widget_MicrosoftFooter_label_yuh6w_260","linkedin":"custom_widget_MicrosoftFooter_linkedin_yuh6w_156","facebook":"custom_widget_MicrosoftFooter_facebook_yuh6w_290","twitter":"custom_widget_MicrosoftFooter_twitter_yuh6w_293","reddit":"custom_widget_MicrosoftFooter_reddit_yuh6w_297","mail":"custom_widget_MicrosoftFooter_mail_yuh6w_300","bluesky":"custom_widget_MicrosoftFooter_bluesky_yuh6w_237","rss":"custom_widget_MicrosoftFooter_rss_yuh6w_308"}},"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1750268614987","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1750268614987","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1750268614987","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:4371463":{"__typename":"Conversation","id":"conversation:4371463","topic":{"__typename":"BlogTopicMessage","uid":4371463},"lastPostingActivityTime":"2025-03-18T17:19:53.616-07:00","solved":false},"User:user:1447505":{"__typename":"User","uid":1447505,"login":"Cary_Chai","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xNDQ3NTA1LTUwMzI1MWkxRDYyQjE0NTY3NEUzNTEz"},"id":"user:1447505"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLXRoQ1Y2RA?revision=21\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLXRoQ1Y2RA?revision=21","title":"Deepseek thumbnail - Copy.png","associationType":"COVER","width":2098,"height":1229,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLTBMRFlJMA?revision=21\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLTBMRFlJMA?revision=21","title":"image.png","associationType":"BODY","width":2062,"height":436,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLW5sMVlkNQ?revision=21\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLW5sMVlkNQ?revision=21","title":"image.png","associationType":"BODY","width":1767,"height":1014,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLVR0cTNGZQ?revision=21\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLVR0cTNGZQ?revision=21","title":"image.png","associationType":"BODY","width":2463,"height":1410,"altText":""},"BlogTopicMessage:message:4371463":{"__typename":"BlogTopicMessage","subject":"DeepSeek-R1 on Azure Container Apps Serverless GPUs","conversation":{"__ref":"Conversation:conversation:4371463"},"id":"message:4371463","revisionNum":21,"uid":4371463,"depth":0,"board":{"__ref":"Blog:board:AppsonAzureBlog"},"author":{"__ref":"User:user:1447505"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" Deploy DeepSeek-R1 to Azure Container Apps serverless GPUs using Ollama and learn how serverless GPUs can support your AI workloads. ","introduction":"","metrics":{"__typename":"MessageMetrics","views":10122},"postTime":"2025-01-28T19:12:46.971-08:00","lastPublishTime":"2025-01-28T21:37:44.266-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" The world of AI is evolving at a breakneck pace with new models constantly being created. With so much rapid innovation, it is essential to have the flexibility to quickly adapt applications to the latest models. This is where Azure Container Apps serverless GPUs come in. \n Azure Container Apps is a managed serverless container platform that enables you to deploy and run containerized applications while reducing infrastructure management and saving costs. \n With serverless GPU support, you get the flexibility to bring any containerized workload, including new language models, and deploy them to a platform that automatically scales with your customer demand. In addition, you get optimized cold start, per-second billing and reduced operational overhead to allow you to focus on the core components of your applications when using GPUs. All the while, you can run your AI applications alongside your non-AI apps on the same platform, within the same environment, which shares networking, observability, and security capabilities. \n DeepSeek-R1 and Ollama \n DeepSeek-R1 is a model released just last week and has quickly gotten traction in the AI space. In this blog post, we’ll go over how you can easily deploy DeepSeek-R1 using Azure Container Apps serverless GPUs and Ollama. This guide will showcase how to deploy DeepSeek-R1, but the same steps apply for any model that you can find in Ollama's library. \n Prerequisites \n \n An Azure account with an active subscription.\n \n If you don't have one, you can create one for free. \n \n \n Serverless GPU quota for Azure Container Apps. Request quota here. Note: All EA customers will have 1 T4 GPU by default. In the future, all EA customers will also have 1 A100 by default and all paying customers will get 1 T4 GPU by default. \n \n Deploy Azure Container Apps resources \n \n Go to the Azure Portal. \n Click Create a resource. \n Search for Azure Container Apps. \n Select Container App and Create. \n On the Basics tab, you can leave most of the defaults. For region, select West US 3, Australia East, or Sweden Central. These are the regions Azure Container Apps serverless GPUs are supported. \n In the Container tab, fill in the following details. The container that will be deployed has Ollama and Open WebUI bundled together. For more details on the container. \n \n \n \n \n Field \n Value \n \n \n Image source  \n Docker hub or other registries \n \n \n Image type \n public \n \n \n Registry login server \n ghcr.io \n \n \n Image and tag \n open-webui/open-webui:ollama \n \n \n Workload profile \n Consumption \n \n \n GPU (preview) \n \n Check the box \n \n \n \n GPU Type \n \n T4 \n (Note: A100 GPUs are also supported, but for this guide, we'll be using T4 GPUs.) \n \n \n \n \n*If you don't have quota for serverless GPUs in Azure Container Apps, request quota here.  \n \n In the Ingress tab, fill in the following details: \n \n \n \n \n Field \n Value \n \n \n Ingress \n Enabled \n \n \n Ingress traffic \n Accepting traffic from anywhere \n \n \n Target port \n 8080 \n \n \n \n \n \n Select Review + Create at the bottom of the page, then select Create. \n \n Access Ollama Web UI \n \n Once your deployment is complete, select Go to resource. \n Select the Application Url for your container app. This will launch the container. Note: You will see a higher cold start for this tutorial. Cold start for Azure Container Apps serverless GPUs is optimized when using Azure Container Registry (ACR) with artifact streaming enabled. In order to get faster cold start times, you can pull the image into your own ACR and enable artifact streaming. Steps are here. \n \n Use DeepSeek-R1 \n \n Once your container starts up, follow the prompts to get started. \n You will end up on a page that looks like the below. Click on Select a model in the top left corner. Enter deepseek-r1:14b into the search box. This is the 14 billion parameter Qwen model. Alternatively, you can use the Llama based models such as deepseek-r1:8b. For a full list of models available, see the Ollama library. \n   \n \n Select Pull \"deepseek-r1:14b\" from Ollama.com. You will be updated on the progress of downloading the model. \n Once downloaded, select the top left box for Select a model again, and select deepseek-r1:14b. Your page should look like the below. \n   \n \n Use the central chat box to begin using the model. An example prompt is: What are the benefits of Azure Container Apps? \n \n Congratulations! \n You have now successfully gotten up and running with DeepSeek-R1 on Azure Container Apps! As mentioned previously, the same steps apply for any model that you can find in Ollama's library. In addition, Azure Container Apps is a completely agnostic compute platform. You can bring any Linux-based container for your AI workloads and run them on serverless GPUs. \n Please comment below to let us know what you think of the experience and any AI workloads you're deploying to Azure Container Apps.  \n Next Steps \n Azure Container Apps is fully ephemeral and doesn't have a mounted storage. In order to persist your data and conversations, you can add a volume mount to your Azure Container App. For steps on how to add a volume mount, follow steps here. \n In order to get faster cold start times, you can also pull the image into your own ACR and enable artifact streaming. See the tutorial for enabling artifact streaming. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"5478","kudosSumWeight":10,"repliesCount":10,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLXRoQ1Y2RA?revision=21\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLTBMRFlJMA?revision=21\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLW5sMVlkNQ?revision=21\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzcxNDYzLVR0cTNGZQ?revision=21\"}"}}],"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/bS00MzcxNDYzLXRoQ1Y2RA?revision=21"},"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:4400609":{"__typename":"Conversation","id":"conversation:4400609","topic":{"__typename":"BlogTopicMessage","uid":4400609},"lastPostingActivityTime":"2025-04-15T09:29:10.991-07:00","solved":false},"User:user:1400175":{"__typename":"User","uid":1400175,"login":"fiveisprime","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xNDAwMTc1LXc0RmlLMg?image-coordinates=1%2C0%2C1400%2C1398"},"id":"user:1400175"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAwNjA5LTFRSXJReA?revision=6\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAwNjA5LTFRSXJReA?revision=6","title":"image.png","associationType":"BODY","width":973,"height":159,"altText":""},"BlogTopicMessage:message:4400609":{"__typename":"BlogTopicMessage","subject":"Major Updates to VS Code Docker: Introducing Container Tools","conversation":{"__ref":"Conversation:conversation:4400609"},"id":"message:4400609","revisionNum":6,"uid":4400609,"depth":0,"board":{"__ref":"Blog:board:AppsonAzureBlog"},"author":{"__ref":"User:user:1400175"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"The world of software development is ever evolving, and with it, the tools we use must adapt and improve. The Docker extension is no exception. We are thrilled to announce significant updates that will open new opportunities for your development experience. Here's a comprehensive overview of what's coming your way.","metrics":{"__typename":"MessageMetrics","views":21539},"postTime":"2025-04-15T08:59:33.954-07:00","lastPublishTime":"2025-04-15T09:29:10.991-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" \n The first, most obvious thing is the introduction of the Container Tools extension to broaden our focus and open new extensibility opportunities. The existing extension code (and MIT license) will be migrated to the Container Tools extension, and the Docker extension will become an extension pack that includes the Docker DX and Container Tools extensions. For you, this means the ability to customize the tooling to meet your needs - choose your preferred container runtime and only the functionality that you need in the extension settings. \n This major update marks a significant step forward in enhancing the development experience when working with containers. Please comment here with any questions or feedback and stay tuned to experiment with the new features! \n   \n tl;dr  \n \n The Docker extension is becoming the Container Tools extension \n Still free and open source \n Podman support is coming \n No action is required \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"948","kudosSumWeight":9,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAwNjA5LTFRSXJReA?revision=6\"}"}}],"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":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:2867265":{"__typename":"Conversation","id":"conversation:2867265","topic":{"__typename":"BlogTopicMessage","uid":2867265},"lastPostingActivityTime":"2021-12-19T04:49:48.941-08:00","solved":false},"User:user:665873":{"__typename":"User","uid":665873,"login":"DariaGrigoriu","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS02NjU4NzMtMTkxNTg1aUYzQTJBQTVENUMxNDE3MUU"},"id":"user:665873"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMxODg1MmlDN0YxNjk2QUEyMDE4OTU5?revision=14\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMxODg1MmlDN0YxNjk2QUEyMDE4OTU5?revision=14","title":"Blog.png","associationType":"TEASER","width":538,"height":300,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY3MWk4REFFNzAwMjI3MDdBM0Y0?revision=14\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY3MWk4REFFNzAwMjI3MDdBM0Y0?revision=14","title":"create-res.png","associationType":"BODY","width":1230,"height":588,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMxODg0NmkxQ0NCQUZDQ0VCQ0IzMDlG?revision=14\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMxODg0NmkxQ0NCQUZDQ0VCQ0IzMDlG?revision=14","title":"ContaineAppsBlogPost.gif","associationType":"BODY","width":1920,"height":996,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY3NGlBMkY4QTc0OUQ3NzY2NTRE?revision=14\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY3NGlBMkY4QTc0OUQ3NzY2NTRE?revision=14","title":"scale-res.png","associationType":"BODY","width":1230,"height":603,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY0NGk0OUMzOUYwQjgxRkI2Njk1?revision=14\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY0NGk0OUMzOUYwQjgxRkI2Njk1?revision=14","title":"dapr.png","associationType":"BODY","width":702,"height":624,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY3NmkzOEFFN0Q1NERDQzU1RDY1?revision=14\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY3NmkzOEFFN0Q1NERDQzU1RDY1?revision=14","title":"lifecycle-res.png","associationType":"BODY","width":1230,"height":585,"altText":null},"BlogTopicMessage:message:2867265":{"__typename":"BlogTopicMessage","subject":"Introducing Azure Container Apps: a serverless container service for running modern apps at scale","conversation":{"__ref":"Conversation:conversation:2867265"},"id":"message:2867265","revisionNum":14,"uid":2867265,"depth":0,"board":{"__ref":"Blog:board:AppsonAzureBlog"},"author":{"__ref":"User:user:665873"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" \n Announcing Azure Container Apps—a serverless container service for building and deploying modern apps at scale, built on open-source technology. ","introduction":"","metrics":{"__typename":"MessageMetrics","views":103413},"postTime":"2021-11-02T08:00:00.970-07:00","lastPublishTime":"2021-11-02T09:58:22.431-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" The fast pace of innovation today requires businesses to focus on differentiated business logic and high velocity delivery to maximize impact. Business logic is often encapsulated in modern cloud native applications represented as microservices with multiple application components that are independently developed and interconnected. Many cloud hosting options for microservices and containerized applications require infrastructure management and orchestration that can increase solution complexity, overall cost, and time to market. \n   \n At Ignite, we announced Azure Container Apps, a serverless application centric hosting service where users do not see or manage any underlying VMs, orchestrators, or other cloud infrastructure. Azure Container Apps enables executing application code packaged in any container and is unopinionated about runtime or programming model. Applications can scale in response to HTTP requests, events (e.g. storage queue messages, Kafka topics, etc.), or simply run as always-on background jobs. Azure Container Apps addresses specific requirements for microservices including encrypted service to service communication and the independent versioning and scaling of services. \n   \n Azure Container Apps is built on the foundation of powerful open-source technology in the Kubernetes ecosystem . The open-source centric approach enables a path for teams to build microservices without having to overcome the concept and operational overhead of working with Kubernetes directly and enables continued application portability by leveraging open standards and APIs. Behind the scenes, every application runs on Azure Kubernetes Service, with Kubernetes Event Driven Autoscaling (KEDA), Distributed Application Runtime (Dapr), and Envoy deeply integrated in the hosting service. \n   \n Getting started with Azure Container Apps \n Multiple individual Container Apps can be deployed to a single Container Apps environment, which acts as an isolation and observability boundary between a group of Container Apps. Container Apps deployed to the same environment write logs to the same Log Analytics workspace. This structure enables easy communication between microservices that compose the overall solution. Additionally, multiple containers can be deployed to the same container app and in that case, they’ll be deployed and scaled together as a single unit or pod of containers. To get started with Azure Container Apps see Quickstart: Deploy an HTTP application to Azure Container Apps. \n   \n \n You can use the Azure CLI to create and manage Container Apps. \n   \n \n   \n Horizontal autoscaling and scale triggers \n Azure Container Apps manages horizontal autoscaling through a set of declarative scaling rules. By default, Azure Container Apps scale to zero and pause billing when not in use. As a Container App scales out, new instances of the Container App are created on-demand. Container Apps supports many scale triggers including HTTP and event-based triggers using Kubernetes Event Driven Autoscaling (KEDA). KEDA is a rich autoscaler with many event scaler options continuously contributed by the community. For more information about supported scale triggers, see KEDA Scalers. See How-to – Set scaling rules in Azure Container Apps for more details. \n   \n \n   \n Making microservices development easier with Distributed Application Runtime (Dapr) \n Dapr is an open-source event-driven runtime that codifies best practices for building portable microservice applications into independent platform agnostic building blocks using the development language and framework of your choice. Azure Container Apps offers a fully managed version of the Dapr APIs. With Dapr for Azure Container Apps, sidecars can be enabled to run next to your application instances and provide a rich set of capabilities and productivity gains. You can use the following Dapr APIs: Service to Service calls, Pub/Sub, Event Bindings, State Stores, and Actors. See Tutorial – Use Dapr in Azure Container Apps for more details. \n   \n \n App lifecycle management \n Azure Container Apps streamlines the application lifecycle management by supporting multiple revisions to manage application versions, enabling traffic splitting and balancing across application versions, securing application secrets, connecting different applications, and delivering integrated monitoring via Log Analytics. See Concepts - Application lifecycle management in Azure Container Apps for more details. \n   \n \n Partner feedback \n \"Many of our users want to package up their microservices and apps in containers, have them scale with demand and not have to worry about managing an underlying cluster,\" said Luke Hoban, CTO of Pulumi. \"We're excited to announce launch day support for Azure Container Apps - so cloud engineers everywhere can define, deploy and manage container apps using their favorite programming languages.\". \n   \n We’re looking forward to the applications you will build with Azure Container Apps! To learn more about Azure Container Apps visit the Getting Started guide on Microsoft Docs and make sure to watch Jeff Hollan do a demo during the Innovate with cloud-native apps and open source on Azure session at Microsoft Ignite, happening tomorrow November 3 rd , 2021. \n   \n Learn more about pricing details by heading over to the Azure Container Apps pricing page, reach us directly via our GitHub microsoft/azure-container-apps repo, and deploy example application at Azure-Samples/container-apps-store-api-microservice. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"5666","kudosSumWeight":9,"repliesCount":5,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMxODg1MmlDN0YxNjk2QUEyMDE4OTU5?revision=14\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY3MWk4REFFNzAwMjI3MDdBM0Y0?revision=14\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMxODg0NmkxQ0NCQUZDQ0VCQ0IzMDlG?revision=14\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY3NGlBMkY4QTc0OUQ3NzY2NTRE?revision=14\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY0NGk0OUMzOUYwQjgxRkI2Njk1?revision=14\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0yODY3MjY1LTMyMTY3NmkzOEFFN0Q1NERDQzU1RDY1?revision=14\"}"}}],"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:4383006":{"__typename":"Conversation","id":"conversation:4383006","topic":{"__typename":"BlogTopicMessage","uid":4383006},"lastPostingActivityTime":"2025-02-20T08:46:18.562-08:00","solved":false},"User:user:2258735":{"__typename":"User","uid":2258735,"login":"GuilhermeFrança","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0yMjU4NzM1LW5kbXNHQg?image-coordinates=0%2C23%2C1312%2C1336"},"id":"user:2258735"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzgzMDA2LWRJam5Hbw?revision=6\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzgzMDA2LWRJam5Hbw?revision=6","title":"moodle-high-scale.png","associationType":"BODY","width":1127,"height":400,"altText":""},"BlogTopicMessage:message:4383006":{"__typename":"BlogTopicMessage","subject":"Reference Architecture for a High Scale Moodle Environment on Azure","conversation":{"__ref":"Conversation:conversation:4383006"},"id":"message:4383006","revisionNum":6,"uid":4383006,"depth":0,"board":{"__ref":"Blog:board:AppsonAzureBlog"},"author":{"__ref":"User:user:2258735"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"This project deploys a robust infrastructure on Azure to handle a high scale moodle installation. This environment is able - and tested - to handle 400k concurrent users.","metrics":{"__typename":"MessageMetrics","views":695},"postTime":"2025-02-19T04:44:02.288-08:00","lastPublishTime":"2025-02-20T08:46:18.562-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Introduction  \n Moodle is an open-source learning platform that was developed in 1999 by Martin Dougiamas, a computer scientist and educator from Australia. Moodle stands for Modular Object-Oriented Dynamic Learning Environment, and it is written in PHP, a popular web programming language. Moodle aims to provide educators and learners with a flexible and customizable online environment for teaching and learning, where they can create and access courses, activities, resources, and assessments. Moodle also supports collaboration, communication, and feedback among users, as well as various plugins and integrations with other systems and tools.  \n Moodle is widely used around the world by schools, universities, businesses, and other organizations, with over 100 million registered users and 250,000 registered sites as of 2020. Moodle is also supported by a large and active community of developers, educators, and users, who contribute to its development, documentation, translation, and support. [URL] is the official website of the Moodle project, where anyone can download the software, join the forums, access the documentation, participate in events, and find out more about Moodle.  \n Goal  \n The goal for this architecture is to have a Moodle environment that can handle 400k concurrent users and scale in and out its application resources according to usage.   \n Using Azure managed services to minimize operational burden was a design premise because standard Moodle reference architectures are based on Virtual Machines that comes with a heavy operational cost.  \n Challenges  \n Being a monolith application, scaling Moodle in a modern cloud native environment is challenging. We choose to use Kubernetes as its computing provider due to the fact that it allow us to build a Moodle artifact in an immutable way that allows it to scale out and in when needed in a fast and automatic way and also recover from potential failures by simply recreating its Deployments without the need to maintain Virtual Machine resources, introducing the concept of pets vs cattle[1] to a scenario that at first glance wouldn't be feasible.  \n Since Moodle is written in PHP it has no concept of database polling, creating a scenario where its underlying database is heavily impacted by new client requests, making it necessary to use an external database pooling solution that had to be custom tailored in order to handle the amount of connections for a heavy-traffic setup like this instead of using Azure Database for PostgreSQL's built-in pgbouncer.  \n The same effect is also observed in its Redis implementation, where a custom Redis cluster had to be created, whereas using Azure Cache for Redis would incur prohibitive costs due to the way it is set up for a more general usage.   \n 1 - https://learn.microsoft.com/en-us/dotnet/architecture/cloud-native/definition#the-cloud   \n Architecture  \n \n   \n This architecture uses Azure managed (PaaS) components to minimize operational burden by using Azure Kubernetes Service to run Moodle, Azure Storage Account to host course content, Azure Database for PostgreSQL Flexible Server as its database and Azure Front Door to expose the application to the public as well as caching commonly used assets. The solution also leverages Azure Availability Zones to distribute its component across different zones in the region to optimize its availability.  \n Provisioning the solution  \n The provisioning has two parts: setting up the infrastructure and the application. The first part uses Terraform to deploy easily. The second part involves creating Moodle's database and configuring the application for optimal performance based on the templates, number of users, etc. and installing templates, courses, plugins etc.  \n The following steps walk you through all tasks needed to have this job done.  \n Clone the repository \n $ git clone https://github.com/Azure-Samples/moodle-high-scale \n Provision the infrastructure  \n $ cd infra/  $ az login  $ az group create --name moodle-high-scale --location <region>  $ terraform init  $ terraform plan -var moodle-environment=production  $ terraform apply -var moodle-environment=production  $ az aks get-credentials --name moodle-high-scale --resource-group moodle-high-scale  \n  Provision the Redis Cluster \n $ cd ../manifests/redis-cluster  $ kubectl apply -f redis-configmap.yaml  $ kubectl apply -f redis-cluster.yaml  $ kubectl apply -f redis-service.yaml  \n  Wait for all the replicas to be running \n $ ./init.sh \n Type 'yes' when prompted.  \n Deploy Moodle and its services  \n Change image in moodle-service.yaml and also adjust the moodle data storage account name in the nfs-pv.yaml (see commented lines in the files)  \n $ cd ../../images/moodle  $ az acr build --registry moodlehighscale<suffix> -t moodle:v0.1 --file Dockerfile .  $ cd ../../manifests  $ kubectl apply -f pgbouncer-deployment.yaml  $ kubectl apply -f nfs-pv.yaml  $ kubectl apply -f nfs-pvc.yaml  $ kubectl apply -f moodle-service.yaml  $ kubectl -n moodle get svc –watch  \n Provision the frontend configuration that will be used to expose Moodle and its assets publicly \n $ cd ../frontend  $ terraform init  $ terraform plan $ terraform apply \n Approve the private endpoint connection request from Frontdoor in moodle-svc-pls resource.  \n Private Link Services > moodle-svc-pls > Private Endpoint Connections > Select the request from Front Door and click on Approve.  \n Install database \n $ kubectl -n moodle exec -it deployment/moodle-deployment -- /bin/bash  $ php /var/www/html/admin/cli/install_database.php --adminuser=admin_user --adminpass=admin_pass --agree-license  \n Deploy Moodle Cron \n Change image in moodle-cron.yaml  \n $ cd ../manifests $ kubectl apply -f moodle-cron.yaml  \n   \n Your Moodle installation is now ready to use! \n Conclusion  \n You can create a Moodle environment that is scalable and reliable in minutes with a very simple approach, without having to deal with the hassle of operating its parts that normally comes with standard Moodle installations.  ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"6379","kudosSumWeight":8,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzgzMDA2LWRJam5Hbw?revision=6\"}"}}],"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":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:4130496":{"__typename":"Conversation","id":"conversation:4130496","topic":{"__typename":"BlogTopicMessage","uid":4130496},"lastPostingActivityTime":"2024-10-08T00:33:36.928-07:00","solved":false},"User:user:1564375":{"__typename":"User","uid":1564375,"login":"Alibengtsson","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xNTY0Mzc1LTU3MjI0NWlFNjYzNTYyRDBBOEUzOTkx"},"id":"user:1564375"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTMwNDk2LTU3NzIxOGk0OTMwRTg3MjJEMjNERjdE?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTMwNDk2LTU3NzIxOGk0OTMwRTg3MjJEMjNERjdE?revision=11","title":"Alibengtsson_0-1714743413367.jpeg","associationType":"TEASER","width":924,"height":780,"altText":null},"BlogTopicMessage:message:4130496":{"__typename":"BlogTopicMessage","subject":"Azure Kubernetes Service Baseline - The Hard Way","conversation":{"__ref":"Conversation:conversation:4130496"},"id":"message:4130496","revisionNum":11,"uid":4130496,"depth":0,"board":{"__ref":"Blog:board:AppsonAzureBlog"},"author":{"__ref":"User:user:1564375"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" Are you ready to tackle Kubernetes on Azure like a pro? Embark on the “AKS Baseline - The Hard Way” and prepare for a journey that’s likely to be a mix of command line, detective work and revelations. This is a serious endeavour that will equip you with deep insights and substantial knowledge. \n   \n As you navigate through the intricacies of Azure, you’ll not only face challenges but also accumulate a wealth of learning that will sharpen your skills and broaden your understanding of cloud infrastructure. Get set for an enriching experience that’s all about mastering the ins and outs of Azure Kubernetes Service! \n   \n \n   \n   \n   ","introduction":"","metrics":{"__typename":"MessageMetrics","views":42752},"postTime":"2024-05-03T05:57:00.557-07:00","lastPublishTime":"2024-10-08T00:33:36.928-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":"   \n Azure Kubernetes Service Baseline - The Hard Way \n   \n Welcome to \"Azure Kubernetes Service - The Hard Way\". From this blog, you will learn how to deploy a scalable and resilient Kubernetes cluster on Azure using Azure Kubernetes Service (AKS) and a number of adjacent Azure services. You will also learn how to apply best practices from the AKS baseline reference architecture, which provides a recommended starting point for a general purpose AKS cluster infrastructure. \n   \n The target audience of these instructions is intermediate to advanced Kubernetes users who want to improve their skills and knowledge about AKS and Azure. You will need to have some familiarity with Kubernetes concepts and tools such as pods, services, deployments, and kubectl. You will also need to have an Azure subscription with contributor permission and access to a bash shell. We recommend using Azure Cloud Shell for this, as it has all the necessary tools already installed. \n   \n To access the cloud shell, you can type shell.azure.com in your web browser. Bear in mind that Cloud Shell times out after around 20 minutes of inactivity. Make sure to copy all the environment variables you will be creating, to a file so that you don't loose them. \n Upon finishing, you will have a deeper understanding of how to use AKS to deploy and manage a scalable and resilient Kubernetes cluster on Azure. You will also have a working AKS cluster that follows the AKS baseline reference architecture. Expect the entire exercise to take up to eight hours. \n   \n \n Overview \n   \n The AKS baseline is a reference architecture that provides a set of best practices and recommendations for deploying a scalable and resilient Azure Kubernetes Service (AKS) cluster. One of the key components of the AKS baseline is the network design, which is divided into several subnets and virtual networks (VNets) to isolate and protect the cluster resources from external and internal threats. In this article, we will describe the purpose and configuration of each subnet and VNet in the AKS baseline, and how they work together to provide a robust network infrastructure for your AKS cluster. \n   \n IP Plan \n   \n IP planning is an important aspect of deploying an AKS cluster and Azure services in general, as it affects the scalability, performance, security, and availability of the cluster and its workloads. IP planning involves choosing the right network topology, IP address ranges, subnet sizes, and network policies for the cluster and its nodes, pods, and services. For more information on IP planning for an AKS cluster, see Plan IP addressing for your cluster and Best practices for network resources in AKS. \n This is the proposed IP design that we will adhere to throughout the documentation. \n   \n \n \n Note: IP planning is a crucial step that requires careful consideration of the number and size of subnets for your current solution, as well as the potential for future expansion. You should avoid using excessively large IP ranges, and instead be economical with IP and allocate only what you need for the present and the future. \n \n   \n Each subnet in AKS baseline has a specific purpose and configuration, further information can be found below. \n   \n Hub VNET \n   \n \n \n Azure Firewall Subnet: This subnet is where the Azure Firewall is deployed. The firewall acts as an egress controller for the AKS cluster, filtering and logging the outbound traffic from the cluster to external resources or services. It also provides network address translation (NAT) functionality, which allows the cluster to access resources that are not reachable by private IP addresses. The subnet size can be small for this particular case, as it only needs to accommodate one firewall instance. \n \n \n   \n \n \n Azure Bastion Subnet: This subnet is where the Azure Bastion service is deployed. Azure Bastion is a fully managed service that provides secure and seamless Remote Desktop Protocol (RDP) and Secure Shell (SSH) access to your virtual machines directly through the Azure portal⁴. This subnet is used for management and operations only, and it does not expose any resources to the internet. The subnet name must be AzureBastionSubnet, and the subnet size must be /26 or larger. \n \n \n   \n \n \n Jump Box Subnet: This subnet is where the jump server resides, where operation teams can login and access services in the spoke, to perform operations and maintenance. \n \n \n   \n Spoke VNET \n   \n \n \n Endpoints Subnet: This subnet is where the private endpoints for Azure services are deployed. Private endpoints are a network interface that connects you privately and securely to a service powered by Azure Private Link. Private endpoints allow you to access Azure services, such as Azure Container Registry, Azure Key Vault, or Azure Storage, without exposing them to the internet or requiring a public IP address. The subnet name can be any valid name, and the subnet size depends on the number of private endpoints you need to create. \n \n \n   \n \n \n AKS Subnet: This subnet is where the AKS cluster nodes are deployed. It uses Azure CNI networking, which assigns IP addresses from the subnet to each node and pod. The subnet size depends on the number of nodes and pods per node, and it should be large enough to accommodate the expected growth. The subnet also has a Network Security Group (NSG) that controls the inbound and outbound traffic to and from the nodes. \n \n \n   \n \n \n Azure Application Gateway Subnet: This subnet is where the Azure Application Gateway is deployed. The application gateway acts as an ingress controller for the AKS cluster, routing external traffic to the appropriate services or pods inside the cluster. It also provides web application firewall (WAF) functionality, which helps protect the applications from common web attacks. The subnet size can be small, as it only needs to accommodate one or more application gateway instances. The subnet also has a NSG that allows inbound traffic on ports 80 and 443, and outbound traffic to the AKS cluster. \n \n \n   \n \n \n Azure Loadbalancer Subnet: The load balancer subnet is a part of the network topology that supports the AKS cluster. It is where the internal load balancer (ILB) resides and assigns IP addresses to the services that are exposed within the cluster. \n \n \n   \n Prepare Environment Variables for HUB VNET and SPOKE VNET \n   \n Let’s use the IP plan to set up some environment variables for the Hub VNet and adjust its configuration accordingly to the IP Plan above. Make sure to also save your environment variables to a text file, so that you can restore them later. \n Configure the hub according to the IP Plan (see image above). \n   \n HUB_VNET_NAME=Hub_VNET\nFW_SUBNET_NAME=AzureFirewallSubnet\nBASTION_SUBNET_NAME=AzureBastionSubnet\nHUB_VNET_PREFIX=10.0.0.0/22 # IP address range of the Virtual network (VNet).\nBASTION_SUBNET_PREFIX=10.0.0.128/26 # IP address range of the Bastion subnet \nFW_SUBNET_PREFIX=10.0.0.0/26 # IP address range of the Firewall subnet\nJUMPBOX_SUBNET_PREFIX=10.0.0.64/26 # IP address range of the Jumpbox subnet\n \n Configure the spoke according to the IP Plan (see image above). \n   \n SPOKE_VNET_NAME=Spoke_VNET\nJUMPBOX_SUBNET_NAME=JumpboxSubnet\nENDPOINTS_SUBNET_NAME=endpoints-subnet\nAPPGW_SUBNET_NAME=app-gw-subnet\nAKS_SUBNET_NAME=aks-subnet\nLOADBALANCER_SUBNET_NAME=loadbalancer-subnet\nSPOKE_VNET_PREFIX=10.1.0.0/22 # IP address range of the Virtual network (VNet).\nAKS_SUBNET_PREFIX=10.1.0.0/24 # IP address range of the AKS subnet\nLOADBALANCER_SUBNET_PREFIX=10.1.1.0/28 # IP address range of the Loadbalancer subnet\nAPPGW_SUBNET_PREFIX=10.1.2.0/24 # IP address range of the Application Gateway subnet\nENDPOINTS_SUBNET_PREFIX=10.1.1.16/28 # IP address range of the Endpoints subnet\n \n Infrastructure Deployment \n   \n The objective of this part is to guide you through the process of deploying the AKS baseline infrastructure. The infrastructure consists of the essential components and configurations that are required for running a secure and scalable AKS cluster. \n   \n Prepare Environment Variables for infrastructure \n   \n This configuration sets up environment variables for the names and locations of various network and security resources, such as resource groups, virtual networks, subnets, network security groups, firewall, application gateway, route table, identity, virtual machines, AKS cluster, and ACR registry. \n   \n \n Note: Since the Azure container registry has a globally unique FQDN name, you need to assign a distinct value to the ACR_NAME environment variable, else the ACR deployment will fail. Also, the ACR name can only container lowercase letters and numbers. \n \n   \n HUB_RG=rg-hub\nSPOKE_RG=rg-spoke\nLOCATION=eastus \nBASTION_NSG_NAME=Bastion_NSG\nJUMPBOX_NSG_NAME=Jumpbox_NSG\nAKS_NSG_NAME=Aks_NSG\nENDPOINTS_NSG_NAME=Endpoints_NSG\nLOADBALANCER_NSG_NAME=Loadbalancer_NSG\nAPPGW_NSG=Appgw_NSG\nFW_NAME=azure-firewall\nAPPGW_NAME=AppGateway\nROUTE_TABLE_NAME=spoke-rt\nAKS_IDENTITY_NAME=aks-msi\nJUMPBOX_VM_NAME=Jumpbox-VM\nAKS_CLUSTER_NAME=private-aks\nACR_NAME=<Globally unique name of the azure container registry>\nSTUDENT_NAME=<e.g. your first name> # don't use spaces\n \n Create the Resource Groups for the Hub and Spoke. \n   \n az group create --name $HUB_RG --location $LOCATION\naz group create --name $SPOKE_RG --location $LOCATION\n \n Create Network Security Groups (NSG) and Virtual Network (VNET) for the Hub. \n   \n In this step, we will begin by establishing Network Security Groups (NSGs) that will subsequently be associated with their respective subnet. It is crucial to note that there are specific prerequisites concerning security rules for certain subnets that must be met before a service can be deployed. Azure Bastion is one of them. \n For Azure Bastion, we are establishing security rules to permit both the control and data plane access to the AzureBastion. For a more detailed understanding of these rules, please refer to the following resource: More Information. \n   \n \n Create the NSG for AzureBastionSubnet. \n \n az network nsg create \\\n --resource-group $HUB_RG \\\n --name $BASTION_NSG_NAME \\\n --location $LOCATION\n \n \n Associate the required inbound security rules to the NSG. \n \n az network nsg rule create --name AllowHttpsInbound \\\n --nsg-name $BASTION_NSG_NAME --priority 120 --resource-group $HUB_RG\\\n --access Allow --protocol TCP --direction Inbound \\\n --source-address-prefixes \"Internet\" \\\n --source-port-ranges \"*\" \\\n --destination-address-prefixes \"*\" \\\n --destination-port-ranges \"443\"\n\t\n \taz network nsg rule create --name AllowGatewayManagerInbound \\\n --nsg-name $BASTION_NSG_NAME --priority 130 --resource-group $HUB_RG\\\n --access Allow --protocol TCP --direction Inbound \\\n --source-address-prefixes \"GatewayManager\" \\\n --source-port-ranges \"*\" \\\n --destination-address-prefixes \"*\" \\\n --destination-port-ranges \"443\"\n\t\n\taz network nsg rule create --name AllowAzureLoadBalancerInbound \\\n --nsg-name $BASTION_NSG_NAME --priority 140 --resource-group $HUB_RG\\\n --access Allow --protocol TCP --direction Inbound \\\n --source-address-prefixes \"AzureLoadBalancer\" \\\n --source-port-ranges \"*\" \\\n --destination-address-prefixes \"*\" \\\n --destination-port-ranges \"443\"\n\t\n\t\n\taz network nsg rule create --name AllowBastionHostCommunication \\\n --nsg-name $BASTION_NSG_NAME --priority 150 --resource-group $HUB_RG\\\n --access Allow --protocol TCP --direction Inbound \\\n --source-address-prefixes \"VirtualNetwork\" \\\n --source-port-ranges \"*\" \\\n --destination-address-prefixes \"VirtualNetwork\" \\\n --destination-port-ranges 8080 5701\n \n \n Associate the required outbound security rules to the NSG. \n \n az network nsg rule create --name AllowSshRdpOutbound \\\n --nsg-name $BASTION_NSG_NAME --priority 100 --resource-group $HUB_RG\\\n --access Allow --protocol \"*\" --direction outbound \\\n --source-address-prefixes \"*\" \\\n --source-port-ranges \"*\" \\\n --destination-address-prefixes \"VirtualNetwork\" \\\n --destination-port-ranges 22 3389\n\t\n az network nsg rule create --name AllowAzureCloudOutbound \\\n --nsg-name $BASTION_NSG_NAME --priority 110 --resource-group $HUB_RG\\\n --access Allow --protocol Tcp --direction outbound \\\n --source-address-prefixes \"*\" \\\n --source-port-ranges \"*\" \\\n --destination-address-prefixes \"AzureCloud\" \\\n --destination-port-ranges 443\n\t\n\taz network nsg rule create --name AllowBastionCommunication \\\n --nsg-name $BASTION_NSG_NAME --priority 120 --resource-group $HUB_RG\\\n --access Allow --protocol \"*\" --direction outbound \\\n --source-address-prefixes \"VirtualNetwork\" \\\n --source-port-ranges \"*\" \\\n --destination-address-prefixes \"VirtualNetwork\" \\\n --destination-port-ranges 8080 5701\n\t\n\taz network nsg rule create --name AllowHttpOutbound \\\n --nsg-name $BASTION_NSG_NAME --priority 130 --resource-group $HUB_RG\\\n --access Allow --protocol \"*\" --direction outbound \\\n --source-address-prefixes \"*\" \\\n --source-port-ranges \"*\" \\\n --destination-address-prefixes \"Internet\" \\\n --destination-port-ranges 80\n \n \n Create an NSG for the JumpBox subnet. \n \n az network nsg create \\\n --resource-group $HUB_RG \\\n --name $JUMPBOX_NSG_NAME \\\n --location $LOCATION\n \n \n Create the HUB VNET with one subnet for Azure Bastion Subnet and associate it to the bastion NSG. \n \n az network vnet create \\\n --resource-group $HUB_RG \\\n --name $HUB_VNET_NAME \\\n --address-prefixes $HUB_VNET_PREFIX \\\n --subnet-name $BASTION_SUBNET_NAME \\\n --subnet-prefixes $BASTION_SUBNET_PREFIX \\\n --network-security-group $BASTION_NSG_NAME\n \n \n Create a subnet for the Azure Firewall. \n \n az network vnet subnet create \\\n --resource-group $HUB_RG \\\n --vnet-name $HUB_VNET_NAME \\\n --name $FW_SUBNET_NAME \\\n --address-prefixes $FW_SUBNET_PREFIX\n \n \n Create a subnet for the Virtual Machine that will be used as \"jumpbox\". \n \n az network vnet subnet create \\\n --resource-group $HUB_RG \\\n --vnet-name $HUB_VNET_NAME \\\n --name $JUMPBOX_SUBNET_NAME \\\n --address-prefixes $JUMPBOX_SUBNET_PREFIX \\\n --network-security-group $JUMPBOX_NSG_NAME\n \n You have successfully configured the network for your hub virtual network.You have established three subnets and two NSGs, as depicted on the image: \n   \n   \n \n \n \n To Validate your deployment, navigate to the Azure portal at https://portal.azure.com and enter your login credentials. \n \n \n Once logged in, locate and select your resource group called rg-hub where the hub vnet is deployed. \n \n \n Select your vnet called HUB_VNET. \n \n \n In the left-hand side menu, under the Settings section, select Subnets. \n \n \n Make sure that your subnets have the appropriate IP range and that Network Security Groups (NSGs) are correctly associated with their respective subnets as depicted below. \n \n \n   \n \n   \n Create Network Security Groups and Virtual Network for the Spoke. \n   \n We will now start to setup the spoke vnet, subnets and their respective NSGs. \n \n Create the NSG for AKS subnet. \n \n az network nsg create \\\n --resource-group $SPOKE_RG \\\n --name $AKS_NSG_NAME \\\n --location $LOCATION\n \n \n Create the NSG for endpoints subnet, were the endpoints will reside. \n \n az network nsg create \\\n --resource-group $SPOKE_RG \\\n --name $ENDPOINTS_NSG_NAME \\\n --location $LOCATION\n \n \n Create the NSG for load balancer subnet, were the internal load balancer will reside. \n \n az network nsg create \\\n --resource-group $SPOKE_RG \\\n --name $LOADBALANCER_NSG_NAME \\\n --location $LOCATION\n \n \n To use an NSG with your application gateway, you need to open these port ranges: \n \n Inbound rules: The Internet service tag needs access to port 65200-65535 for the backend health API. Your application traffic needs access to TCP port 80 and/or 443. for futher information refer to Required security rules for Application Gateway for more information. \n az network nsg create \\\n --resource-group $SPOKE_RG \\\n --name $APPGW_NSG \\\n --location $LOCATION\n \n \n Create the NSG rule to allow application traffic, on port 443 and 80. \n \n # Allow Internet Client request on Port 443 and 80\naz network nsg rule create \\\n --resource-group $SPOKE_RG \\\n --nsg-name $APPGW_NSG \\\n --name Allow-Internet-Inbound-HTTP-HTTPS \\\n --priority 100 \\\n --source-address-prefixes Internet \\\n --destination-port-ranges 80 443 \\\n --access Allow \\\n --protocol Tcp \\\n --description \"Allow inbound traffic to port 80 and 443 to Application Gateway from client requests originating from the Internet\"\n \n \n Create the NSG rule to allow application traffic, on port range 65200-65535. \n \n # Infrastructure ports\naz network nsg rule create \\\n --resource-group $SPOKE_RG \\\n --nsg-name $APPGW_NSG \\\n --name Allow-GatewayManager-Inbound \\\n --priority 110 \\\n --source-address-prefixes \"GatewayManager\" \\\n --destination-port-ranges 65200-65535 \\\n --access Allow \\\n --protocol Tcp \\\n --description \"Allow inbound traffic to ports 65200-65535 from GatewayManager service tag\"\n \n \n Create the spoke VNET with one subnet for AKS Subnet and associate it to the AKS NSG. \n \n az network vnet create \\\n --resource-group $SPOKE_RG \\\n --name $SPOKE_VNET_NAME \\\n --address-prefixes $SPOKE_VNET_PREFIX \\\n --subnet-name $AKS_SUBNET_NAME \\\n --subnet-prefixes $AKS_SUBNET_PREFIX \\\n\t--network-security-group $AKS_NSG_NAME\n \n \n Create the subnet for Endpoints and associate it to the endpoints NSG. \n \n az network vnet subnet create \\\n --resource-group $SPOKE_RG \\\n --vnet-name $SPOKE_VNET_NAME \\\n --name $ENDPOINTS_SUBNET_NAME \\\n --address-prefixes $ENDPOINTS_SUBNET_PREFIX \\\n\t--network-security-group $ENDPOINTS_NSG_NAME\n \n \n Create subnet for the load balancer that will be used for ingress traffic and associate it to the loadbalancer NSG. \n \n az network vnet subnet create \\\n --resource-group $SPOKE_RG \\\n --vnet-name $SPOKE_VNET_NAME \\\n --name $LOADBALANCER_SUBNET_NAME \\\n --address-prefixes $LOADBALANCER_SUBNET_PREFIX \\\n\t--network-security-group $LOADBALANCER_NSG_NAME\n \n \n Create subnet for the Application Gateway and associate it to the Application Gateway NSG. \n \n az network vnet subnet create \\\n --resource-group $SPOKE_RG \\\n --vnet-name $SPOKE_VNET_NAME \\\n --name $APPGW_SUBNET_NAME \\\n --address-prefixes $APPGW_SUBNET_PREFIX \\\n\t--network-security-group $APPGW_NSG\n \n   \n You have successfully configured the network for your spoke virtual network. You should now have established the following setup in your Azure subscription. \n   \n   \n \n   \n \n \n Navigate to the Azure portal at https://portal.azure.com again. \n \n \n Locate and select your resource group called rg-spoke where the spoke vnet is deployed. \n \n \n Select the vnet called Spoke_VNET. \n \n \n In the left-hand side menu, under the Settings section, select Subnets. \n \n \n Make sure that your subnets have the appropriate IP range and that Network Security Groups (NSGs) are correctly associated with their respective subnets. \n \n \n   \n \n   \n Create VNET Peering Between Hub and Spoke \n   \n The next step is to create a virtual network peering between the hub and spoke VNets. This will enable the communication between the VNETs and allow the AKS cluster to route traffic to the Firewall. \n   \n \n Before we can do a VNET peering we need to obtain the full resource id of the Spoke_VNET and Hub_VNET as they resides in different resource groups. \n \n SPOKE_VNET_ID=$(az network vnet show --resource-group $SPOKE_RG --name $SPOKE_VNET_NAME --query id --output tsv)\n \n HUB_VNET_ID=$(az network vnet show --resource-group $HUB_RG --name $HUB_VNET_NAME --query id --output tsv)\n \n \n Now, create a peering connection from the hub to the spoke virtual network. \n \n az network vnet peering create \\\n --resource-group $HUB_RG \\\n --name hub-to-spoke \\\n --vnet-name $HUB_VNET_NAME \\\n --remote-vnet $SPOKE_VNET_ID \\\n --allow-vnet-access\n \n \n Then create a peering connection from the spoke to hub virtual network. \n \n az network vnet peering create \\\n --resource-group $SPOKE_RG \\\n --name spoke-to-hub \\\n --vnet-name $SPOKE_VNET_NAME \\\n --remote-vnet $HUB_VNET_ID \\\n --allow-vnet-access\n \n Peering should be established and the high level design should now look like this: \n   \n   \n \n   \n \n \n Navigate to the Azure portal at https://portal.azure.com \n \n \n Locate and select the resource group called rg-spoke where the spoke vnet is deployed. \n \n \n Select the vnet called Spoke_VNET. \n \n \n In the left-hand side menu, under the Settings section, select peerings. \n \n \n Ensure that the peering status is set to Connected. \n \n \n Repeat step 4 - 7 but for Hub_VNET. \n \n \n   \n \n   \n Create Azure Bastion and Jumpbox VM \n   \n \n The Bastion Host needs a Public IP. Create the Public IP address. \n \n az network public-ip create \\\n --resource-group $HUB_RG \\\n --name Bastion-PIP \\\n --sku Standard \\\n --allocation-method Static\n \n \n Create JumpBox Virtual Machine. \n \n \n Note: Ensure you specify a password for the admin user called azureuser. The password length must be between 12 and 72. Password must have 3 of the following: 1 lower case character, 1 upper case character, 1 number and 1 special character. \n \n   \n az vm create \\\n --resource-group $HUB_RG \\\n --name $JUMPBOX_VM_NAME \\\n --image Ubuntu2204 \\\n --admin-username azureuser \\\n --admin-password <SPECIFY A PASSWORD HERE> \\\n --vnet-name $HUB_VNET_NAME \\\n --subnet $JUMPBOX_SUBNET_NAME \\\n --size Standard_B2s \\\n --storage-sku Standard_LRS \\\n --os-disk-name $JUMPBOX_VM_NAME-VM-osdisk \\\n --os-disk-size-gb 128 \\\n --public-ip-address \"\" \\\n --nsg \"\" \n \n \n Create the bastion host in hub vnet and associate it to the public IP. \n \n \n Note: Azure Bastion service requires a dedicated subnet named AzureBastionSubnet to provide secure and seamless RDP/SSH connectivity to your virtual machines. When you deploy Azure Bastion service, it will automatically create this subnet for you, if it does not exist in the target virtual network. However, if the subnet already exists, it must meet the minimum size of /26 or larger, otherwise the deployment will fail. \n \n   \n az network bastion create \\\n --resource-group $HUB_RG \\\n --name bastionhost \\\n --public-ip-address Bastion-PIP \\\n --vnet-name $HUB_VNET_NAME \\\n --location $LOCATION\n \n \n \n Upon successful installation of the Jumpbox Virtual Machine (VM). Navigate to the Azure portal at https://portal.azure.com \n \n \n Locate and select your rg-hub where the Jumpbox has been deployed. \n \n \n Within your resource group, find and click on the Jumpbox VM. \n \n \n In the left-hand side menu, under the Connect section, select ‘Bastion’. \n \n \n Enter the credentials for the Jumpbox VM and verify that you can log in successfully. \n \n \n For additional information on accessing VMs through Bastion, please refer to this Microsoft Azure Bastion tutorial \n After completing these steps, The high-level targeted architecture now matches the following diagram: \n   \n   \n \n   \n Create an Azure Firewall and Setup a User Defined Route (UDR) \n   \n To secure your outbound traffic, you can use an Azure Firewall. The following steps will help you restrict the outbound access and to certain FQDNs that are needed by the cluster. further information can be found here: Control egress traffic using Azure Firewall in Azure Kubernetes Service (AKS) \n   \n \n Create Azure Firewall, and deploy it to it to firewall subnet in hub vnet. \n \n az network firewall create \\\n --resource-group $HUB_RG \\\n --name $FW_NAME \\\n --location $LOCATION \\\n --vnet-name $HUB_VNET_NAME \\\n --enable-dns-proxy true\n\n \n \n The firewall needs a Public IP address. Create the Public IP. \n \n az network public-ip create \\\n --name fw-pip \\\n --resource-group $HUB_RG \\\n --location $LOCATION \\\n --allocation-method static \\\n --sku standard\n\n \n \n Associate the public IP address with the Firewall. \n \n az network firewall ip-config create \\\n --firewall-name $FW_NAME \\\n --name FW-config \\\n --public-ip-address fw-pip \\\n --resource-group $HUB_RG \\\n --vnet-name $HUB_VNET_NAME\n\n \n \n Update the existing Azure Firewall configuration. \n \n az network firewall update \\\n --name $FW_NAME \\\n --resource-group $HUB_RG \n \n \n Create Network rules in Azure Firewall. \n \n   \n The following network rules allows outbound traffic from any source address to certain destinations and ports. If the required destination is not specified the AKS cluster will fail to deploy. \n Please note that these transactions are slow. Expect each rule to require around 5 minutes to complete. \n az network firewall network-rule create -g $HUB_RG -f $FW_NAME --collection-name 'aksfwnr' -n 'apiudp' --protocols 'UDP' --source-addresses '*' --destination-addresses \"AzureCloud.$LOCATION\" --destination-ports 1194 --action allow --priority 100\n\n\naz network firewall network-rule create -g $HUB_RG -f $FW_NAME --collection-name 'aksfwnr' -n 'apitcp' --protocols 'TCP' --source-addresses '*' --destination-addresses \"AzureCloud.$LOCATION\" --destination-ports 9000\n\n\naz network firewall network-rule create -g $HUB_RG -f $FW_NAME --collection-name 'aksfwnr' -n 'time' --protocols 'UDP' --source-addresses '*' --destination-fqdns 'ntp.ubuntu.com' --destination-ports 123\n \n \n Create Azure Firewall application rule. \n \n This rule specifies the FQDN's which are required by AKS, AzureKubernetesService tag which include all the FQDNs listed in Outbound network and FQDN rules for AKS clusters. \n   \n For more information about required egress destinations, see Outbound network and FQDN rules for Azure Kubernetes Service (AKS) clusters \n az network firewall application-rule create -g $HUB_RG -f $FW_NAME --collection-name 'aksfwar' -n 'fqdn' --source-addresses '*' --protocols 'http=80' 'https=443' --fqdn-tags \"AzureKubernetesService\" --action allow --priority 100\n \n \n Create a route table in the spoke. \n \n az network route-table create \\\n --resource-group $SPOKE_RG \\\n --name $ROUTE_TABLE_NAME\n\n \n \n Create a route to the internet via the Azure Firewall. \n \n In order to create the route we need to obtain the private IP address of the Firewall.To get the private IP address of the Firewall, you need to run the following command: \n az network firewall show --resource-group $HUB_RG --name $FW_NAME |grep privateIPAddress\n \n Then store the output (the ip address) in an environment variable: \n FW_PRIVATE_IP=<IP Address from previous command>\n \n Create the route table to route egress traffic to the firewall in the hub VNET: \n az network route-table route create \\\n --resource-group $SPOKE_RG \\\n --name default-route \\\n --route-table-name $ROUTE_TABLE_NAME \\\n --address-prefix 0.0.0.0/0 \\\n --next-hop-type VirtualAppliance \\\n --next-hop-ip-address $FW_PRIVATE_IP\n\n \n \n Note: The route will direct all traffic (0.0.0.0/0) to the next hop type of VirtualAppliance, which is the firewall instance. The next hop IP address is the private IP address of the firewall, which is stored in the environment variable $FW_PRIVATE_IP. This way, the traffic from the AKS subnet will be routed to the firewall instance on its private endpoint. This will allow you to perform inspection on outbound traffic. \n \n   \n \n Associate the route table with the AKS subnet. \n \n az network vnet subnet update \\\n --resource-group $SPOKE_RG \\\n --vnet-name $SPOKE_VNET_NAME \\\n --name $AKS_SUBNET_NAME \\\n --route-table $ROUTE_TABLE_NAME\n \n You have successfully configured the firewall in the hub VNet, set up network and application rules, and created a route table associated with the AKS subnet to direct all internet-bound traffic through the Azure Firewall. \n   \n   \n \n   \n \n   \n \n \n To validate your deployment, navigate to the Azure portal at https://portal.azure.com \n \n \n Locate and select your resource group called rg-hub where the hub vnet is deployed. \n \n \n Select your firewall called azure-firewall. \n \n \n In the left-hand side menu, under the Settings section, select Rules. \n \n \n Click on Network rule collection \n \n \n Verify that you have a network rule collection called aksfwnr which should contain 3 rules. Inspect the rules. \n \n \n   \n \n   \n \n \n Click on Application rule collection. \n \n \n Verify that you have an application rule collection called aksfwar which should contain 1 rule. Inspect the rule. \n \n \n   \n \n \n \n Lets validate the routing between AKS subnet and Azure Firewall, in the Azure portal, in the top menu select Resource Groups. \n \n \n Select resource group rg-spoke. \n \n \n Select routing table called spoke-rt. \n \n \n Ensure that the default route has a prefix of 0.0.0.0/0 and the next hop is set to the virtual appliance with the IP address of the Azure Firewall. Also, make sure that the routing table is associated with the AKS subnet called aks-subnet. \n \n \n   \n \n   \n Deploy Azure Kubernetes Service \n   \n This part covers deploying AKS with outbound traffic configured to use a user-defined routing table, ensuring traffic passes through the Azure Firewall. A private DNS zone is also created when deploying a private AKS cluster. A user-assigned identity with necessary permissions is assigned to the cluster and load balancer subnet. This identity is a type of managed identity in Azure. \n   \n \n Create a user-assigned managed identity. \n \n az identity create \\\n --resource-group $SPOKE_RG \\\n --name $AKS_IDENTITY_NAME-${STUDENT_NAME}\n \n \n Get the id of the user managed identity. \n \n IDENTITY_ID=$(az identity show \\\n --resource-group $SPOKE_RG \\\n --name $AKS_IDENTITY_NAME-${STUDENT_NAME} \\\n --query id \\\n --output tsv)\n \n \n Get the principal id of the user managed identity. \n \n PRINCIPAL_ID=$(az identity show \\\n --resource-group $SPOKE_RG \\\n --name $AKS_IDENTITY_NAME-${STUDENT_NAME} \\\n --query principalId \\\n --output tsv)\n \n \n Get the scope of the routing table. \n \n RT_SCOPE=$(az network route-table show \\\n --resource-group $SPOKE_RG \\\n --name $ROUTE_TABLE_NAME \\\n --query id \\\n --output tsv)\n \n \n Assign permissions for the AKS user defined managed identity to the routing table. \n \n az role assignment create \\\n --assignee $PRINCIPAL_ID\\\n --scope $RT_SCOPE \\\n --role \"Network Contributor\"\n \n \n Assign permission for the AKS user defined managed identity to the load balancer subnet. \n \n LB_SUBNET_SCOPE=$(az network vnet subnet list \\\n --resource-group $SPOKE_RG \\\n --vnet-name $SPOKE_VNET_NAME \\\n --query \"[?name=='$LOADBALANCER_SUBNET_NAME'].id\" \\\n --output tsv)\n \n az role assignment create \\\n --assignee $PRINCIPAL_ID \\\n --scope $LB_SUBNET_SCOPE \\\n --role \"Network Contributor\"\n\n \n \n Note: Granting the Network Contributor role to the load balancer subnet in AKS could result in over-privileged access. To minimize security risks, it is recommended to only provide AKS with the necessary permissions to function effectively, adhering to the principle of least privilege access. For more information refer to Creating Azure custom role. \n \n   \n \n Retrieve the scope of AKS subnet, were AKS shall be deployed. \n \n AKS_SUBNET_SCOPE=$(az network vnet subnet list \\\n --resource-group $SPOKE_RG \\\n --vnet-name $SPOKE_VNET_NAME \\\n --query \"[?name=='$AKS_SUBNET_NAME'].id\" \\\n --output tsv)\n \n \n Deploy a Highly Available Private AKS Cluster. \n \n   \n To deploy a highly available private AKS cluster, you can use the following command: \n This command creates an AKS cluster with two system nodes, using the specified VNet subnet ID and cluster name. It is configured as a private cluster with user-defined routing and OIDC issuer and workload identity enabled. The network plugin and policy are set to Azure, and the public FQDN is disabled. The cluster is deployed across availability zones 1, 2, and 3. \n   \n For more information about OIDC and Workload Identity refer to Use Microsoft Entra Workload ID with Azure Kubernetes Service (AKS) \n   \n az aks create --resource-group $SPOKE_RG --node-count 2 --vnet-subnet-id $AKS_SUBNET_SCOPE --name $AKS_CLUSTER_NAME-${STUDENT_NAME} --enable-private-cluster --outbound-type userDefinedRouting --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys --assign-identity $IDENTITY_ID --network-plugin azure --network-policy azure --disable-public-fqdn --zones 1 2 3\n \n \n Note: A private AKS cluster has its Kubernetes API endpoint isolated from public access, allowing access only within the same virtual network. To communicate with the private AKS cluster from a jumpbox in a different virtual network, a virtual network link must be created between the two networks for DNS resolution. This will be covered in a later section. \n \n   \n \n An additional nodepool will be created to host user workloads. Auto-scaling is enabled to allow for automatic scaling out and scaling in based on demand. The worker nodes will be distributed across three different zones to ensure higher availability. \n \n az aks nodepool add --resource-group $SPOKE_RG --cluster-name $AKS_CLUSTER_NAME-${STUDENT_NAME} --name userpool --node-count 3 --mode user --zones 1 2 3 --enable-cluster-autoscaler --min-count 1 --max-count 5\n \n \n Create a virtual network link to resolve AKS private endpoint from HUB vnet. \n \n   \n Fetch the node group of the AKS cluster, and save it in an environment variable. \n NODE_GROUP=$(az aks show --resource-group $SPOKE_RG --name $AKS_CLUSTER_NAME-${STUDENT_NAME} --query nodeResourceGroup -o tsv)\n \n Fetch the AKS DNS zone name. \n DNS_ZONE_NAME=$(az network private-dns zone list --resource-group $NODE_GROUP --query \"[0].name\" -o tsv)\n\n \n Fetch the ID of the HUB virtual network. \n HUB_VNET_ID=$(az network vnet show -g $HUB_RG -n $HUB_VNET_NAME --query id --output tsv)\n \n Create a virtual network link between the hub virtual network and the AKS private DNS zone, that was created for the AKS cluster. \n az network private-dns link vnet create --name \"hubnetdnsconfig\" --registration-enabled false --resource-group $NODE_GROUP --virtual-network $HUB_VNET_ID --zone-name $DNS_ZONE_NAME \n \n Validate your deployment in the Azure portal. \n \n \n Navigate to the Azure portal at https://portal.azure.com. \n \n \n Click on Resource groups to view all of your resource groups in your subscription. You should have 3 RGs which you have created,MC_rg-spoke_private-aks-xxxx_eastus, rg-hub and rg-spoke \n \n \n   \n \n Note: MC_rg-spoke_private-aks-xxxx_eastus is a resource group automatically created when deploying an AKS cluster. It is used by Azure to manage resources for the cluster, this particular resource group is also known as Node group. \n \n   \n   \n \n   \n \n \n Verify that a virtual network link exists between the Hub and spoke to enable the jumpbox to resolve the AKS domain name and access the cluster. Select the node group called MC_rg-spoke_private-aks-xxxxx_eastus. \n \n \n Select the Private DNS zone. \n \n \n On your left hand side menu, under Settings click on Virtual network links. \n \n \n Validate that there is a link name called hubnetdnsconfig and the link status is set to Completed and the virtual network is set to Hub_VNET. \n \n \n   \n \n   \n \n \n On the top menu click Resource groups and choose rg-spoke from the resource group list. \n \n \n Click on the AKS resource called private-aks-. Verify that the Private cluster is set to Enabled. \n \n \n   \n \n   \n \n Verify AKS control plane connectivity. \n \n In this section we will verify that we are able to connect to the AKS cluster from the jumpbox, firstly we need to connect to the cluster successfully and secondly we need to verify that the kubernetes client is able to communicate with the AKS control plane from the jumpbox. \n   \n \n \n Select resource group rg-hub where the Jumpbox has been deployed. \n \n \n Within your resource group, find and click on the virtual machine called Jumpbox VM. \n \n \n In the left-hand side menu, under Connect section, select Bastion. \n \n \n Enter the credentials for the Jumpbox VM and verify that you can log in successfully. \n \n \n Once successfully logged in to the jumpbox you need to install a few tools. Run the commands one by one, or create a bash script. \n \n \n   \n # Update apt repo\nsudo apt update \n# Install Docker\nsudo apt install docker.io -y\n# Install azure CLI\ncurl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash\n# Install AKS CLI (kubectl)\nsudo az aks install-cli\n# Add user to Docker group\nsudo usermod -aG docker $USER\n \n \n Now, login to Azure in order to obtain AKS credentials. \n \n az login\naz account set --subscription <SUBSCRIPTION ID>\n \n \n Note: To check the current subscription, run the command: az account show To change the subscription, run the command: az account set --subscription , where the ID of the desired subscription. You can find the subscription ID by running the command: az account list --output table \n \n   \n \n Add your Environment variables to the jumpbox bash shell. \n \n SPOKE_RG=rg-spoke\nAKS_CLUSTER_NAME=private-aks\nSTUDENT_NAME=<WRITE YOUR STUDENT NAME HERE>\n \n \n Download the AKS credentials onto the jumpbox. \n \n az aks get-credentials --resource-group $SPOKE_RG --name $AKS_CLUSTER_NAME-${STUDENT_NAME}\n \n \n Ensure you can list resources in AKS. \n \n kubectl get nodes\n \n The following output shows the result of running the command kubectl get nodes on with kubectl CLI. \n azureuser@Jumpbox-VM:~$ kubectl get nodes\nNAME STATUS ROLES AGE VERSION\naks-nodepool1-12240482-vmss000000 Ready agent 89m v1.27.9\naks-nodepool1-12240482-vmss000001 Ready agent 89m v1.27.9\naks-userpool-16991029-vmss000000 Ready agent 78m v1.27.9\n \n \n Log out from the Jumpbox host. \n \n Congratulations! You have completed the steps to deploy a private AKS cluster and configure its network settings. You have assigned a user assigned identity to the cluster that has the required permissions to modify the user-defined routing table and load balancer subnet. You have also created a virtual network link between the hub virtual network and the private DNS zone of the cluster. This enables the jumpbox to resolve the private API server of the cluster and access it for management and maintenance purposes. \n   \n \n   \n \n   \n Deploy Azure Container Registry \n   \n In this section, we will learn how to deploy a private Azure Container Registry that will store our container images. A private container registry is a type of container registry that is not accessible from the public internet. To enable access to the private container registry from the jumpbox, we need to create some networking resources that will allow us to resolve the container registry name and connect to it securely. These resources are: a private endpoint, a private link, and a virtual network link. We will see how to create and configure these resources in the following steps. We will also test the connection to the private container registry by pushing some images to it from the jumpbox. \n   \n   \n \n Create the Azure Container Registry, and disable public access to the registry. \n \n az acr create \\\n --resource-group $SPOKE_RG \\\n --name $ACR_NAME \\\n --sku Premium \\\n --admin-enabled false \\\n --location $LOCATION \\\n --allow-trusted-services false \\\n --public-network-enabled false\n \n \n IMPORTANT: Ensure you have a globally unique name for your ACR, or else the deployment will fail. \n \n \n Configure the private DNS zone for ACR. \n \n az network private-dns zone create \\\n --resource-group $SPOKE_RG \\\n --name \"privatelink.azurecr.io\"\n \n \n Create a virtual network link to the spoke network. \n \n az network private-dns link vnet create \\\n --resource-group $SPOKE_RG \\\n --zone-name \"privatelink.azurecr.io\" \\\n --name ACRDNSSpokeLink \\\n --virtual-network $SPOKE_VNET_NAME \\\n --registration-enabled false\n \n \n Create a virtual network link to the hub network. \n \n \n Note: The $HUB_VNET_ID variable specifies the full path to the virtual network in another resource group, allowing the command to correctly link to it. Make sure the environment variable $HUB_VNET_ID is populated before running the command below. If it is empty, just rerun the command: \n \n HUB_VNET_ID=$(az network vnet show --resource-group $HUB_RG --name $HUB_VNET_NAME --query id --output tsv)\n \n   \n \n az network private-dns link vnet create \\\n --resource-group $SPOKE_RG \\\n --zone-name \"privatelink.azurecr.io\" \\\n --name ACRDNSHubLink \\\n --virtual-network $HUB_VNET_ID \\\n --registration-enabled false\n \n \n Create ACR private endpoint. \n \n   \n To create a private endpoint for an Azure Container Registry (ACR), you need to obtain the resource ID of the container registry. This resource ID is used to specify the target resource when creating the private endpoint. \n REGISTRY_ID=$(az acr show --name $ACR_NAME \\\n --query 'id' --output tsv)\n\n \n az network private-endpoint create \\\n --name ACRPrivateEndpoint \\\n --resource-group $SPOKE_RG \\\n --vnet-name $SPOKE_VNET_NAME \\\n --subnet $ENDPOINTS_SUBNET_NAME \\\n --private-connection-resource-id $REGISTRY_ID \\\n --group-ids registry \\\n --connection-name PrivateACRConnection\n \n \n Configure DNS record for ACR. \n \n   \n In this section we will configure DNS records for an Azure Container Registry (ACR) using Azure Private Link.This is to ensure that the ACR can be accessed over a private network connection, enhancing security by eliminating exposure to the public internet. \n Before we can configure the DNS record we need to obtain the private IP address of the ACR, both the control and data plane. \n Get endpoint IP configuration: \n   \n NETWORK_INTERFACE_ID=$(az network private-endpoint show \\\n --name ACRPrivateEndpoint \\\n --resource-group $SPOKE_RG \\\n --query 'networkInterfaces[0].id' \\\n --output tsv)\n \n Fetch the private IP address associated with the ACR. These IP addresses are used for data and control of the container registry. \n az network nic show --ids $NETWORK_INTERFACE_ID |grep azurecr.io -B 7\n \n In the output you should see two IP addresses, and their associated FQDNS. It should look similar to this: \n \"name\": \"privateEndpointIpConfig.9c4c0ee4-c187-4094-aede-fc0dabb70236\",\n \"primary\": true,\n \"privateIPAddress\": \"10.1.1.20\",\n \"privateIPAddressVersion\": \"IPv4\",\n \"privateIPAllocationMethod\": \"Dynamic\",\n \"privateLinkConnectionProperties\": {\n \"fqdns\": [\n \"acrforakssecurity.westus2.data.azurecr.io\"\n--\n \"name\": \"privateEndpointIpConfig.7ffb814c-aacc-4199-a07d-35f61df0ea1f\",\n \"primary\": false,\n \"privateIPAddress\": \"10.1.1.21\",\n \"privateIPAddressVersion\": \"IPv4\",\n \"privateIPAllocationMethod\": \"Dynamic\",\n \"privateLinkConnectionProperties\": {\n \"fqdns\": [\n \"acrforakssecurity.azurecr.io\"\n \n Note down the privateIPAddress and fqdns as it will be used in a later step (when creating DNS zones). \n \n Create a new 'A' record set for control in the private DNZ zone. \n \n az network private-dns record-set a create \\\n --name $ACR_NAME \\\n --zone-name privatelink.azurecr.io \\\n --resource-group $SPOKE_RG\n \n \n Create a new 'A' record set for data in the private DNZ zone. \n \n az network private-dns record-set a create \\\n --name $ACR_NAME.$LOCATION.data \\\n --zone-name privatelink.azurecr.io \\\n --resource-group $SPOKE_RG\n \n \n Update the 'A' record to contain the data IP address of the ACR. \n \n az network private-dns record-set a add-record \\\n --record-set-name $ACR_NAME.$LOCATION.data \\\n --zone-name privatelink.azurecr.io \\\n --resource-group $SPOKE_RG \\\n --ipv4-address <IP address assicoated with FQDN \"$ACR_NAME.$LOCATION.data.azurecr.io\">\n \n \n Update the 'A' record to contain the control IP address of the ACR. \n \n az network private-dns record-set a add-record \\\n --record-set-name $ACR_NAME \\\n --zone-name privatelink.azurecr.io \\\n --resource-group $SPOKE_RG \\\n --ipv4-address <IP address associated with FQDN \"$ACR_NAME.azurecr.io\">\n \n Validate your deployment in the Azure portal. \n \n \n Navigate to the Azure portal at https://portal.azure.com and enter your login credentials. \n \n \n log in and select the rg-spoke resource group. Verify that you have a container registry and a private endpoint named ACRPrivateEndpoint deployed in your resource group, as well as a network card named ACRPrivateEndpoint.nic.xxxxx. \n \n \n   \n \n   \n \n Select the private DNS zone named privatelink.azurecr.io. Ensure that you have two ‘A’ records, one for control and one for data, and that the correct IP addresses are configured. \n \n   \n \n \n In the left-hand side menu, under Settings section, select Virtual Network links. Ensure you have the link status set to completed for both hub and spoke. \n \n   \n \n \n Test the connection to ACR from the Jumpbox. \n \n In this section, you will learn how to check if you can access your private Azure Container Registry (ACR) and push Docker images to it. You will need to have the Azure CLI installed and logged in to your Azure account. You will also need to have Docker installed and running on your Jumpbox. Here are the steps to follow: \n   \n \n \n Select resource group rg-hub where the Jumpbox has been deployed. \n \n \n Within your resource group, find and click on the Jumpbox VM. \n \n \n In the left-hand side menu, under the Connect section, select ‘Bastion’. \n \n \n Enter the credentials for the Jumpbox VM and verify that you can log in successfully. \n \n \n Once successfully logged in to the jumpbox login to Azure if you have not already done so in previous steps. \n \n \n az login\n \n Identify your subscription id from the list, if you have several subscriptions. \n az account list -o table\n \n Set your subscription id to be the default subscription. \n az account set --subscription <SUBSCRIPTION ID>\n \n \n Validate private link connection. \n \n List your ACR in your subscription and note down the ACR name. \n az acr list -o table\n \n Example output: \n azureuser@Jumpbox-VM:~$ az acr list -o table\nNAME RESOURCE GROUP LOCATION SKU LOGIN SERVER CREATION DATE ADMIN ENABLED\n---------- ---------------- ---------- ------- --------------------- -------------------- ---------------\nalibaksacr rg-spoke eastus Premium alibaksacr.azurecr.io 2024-03-03T07:56:00Z False\n \n dig <REGISTRY NAME>.azurecr.io\n \n Example output shows the registry's private IP address in the address space of the subnet: \n \nazureuser@Jumpbox-VM:~$ dig alibaksacr.azurecr.io\n\n; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> alibaksacr.azurecr.io\n;; global options: +cmd\n;; Got answer:\n;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3738\n;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 65494\n;; QUESTION SECTION:\n;alibaksacr.azurecr.io. IN A\n\n;; ANSWER SECTION:\nalibaksacr.azurecr.io. 60 IN CNAME alibaksacr.privatelink.azurecr.io.\nalibaksacr.privatelink.azurecr.io. 1800 IN A 10.1.1.21\n\n;; Query time: 8 msec\n;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)\n;; WHEN: Sun Mar 03 09:04:31 UTC 2024\n;; MSG SIZE rcvd: 103\n \n \n Test the connection to the container registry, you will push a container to it. You will need to create a Dockerfile, build the docker image, authenticate towards ACR and push the image to the container registry. \n \n vim Dockerfile\n \n Add the following content to the Dockerfile. \n FROM nginx\nEXPOSE 80\n \n Build the Docker image. \n docker build --tag nginx .\n \n Example output: \n azureuser@Jumpbox-VM:~$ docker build --tag nginx .\n\nSending build context to Docker daemon 222.7kB\nStep 1/3 : FROM nginx\nlatest: Pulling from library/nginx\na803e7c4b030: Pull complete \n8b625c47d697: Pull complete \n4d3239651a63: Pull complete \n0f816efa513d: Pull complete \n01d159b8db2f: Pull complete \n5fb9a81470f3: Pull complete \n9b1e1e7164db: Pull complete \nDigest: sha256:32da30332506740a2f7c34d5dc70467b7f14ec67d912703568daff790ab3f755\nStatus: Downloaded newer image for nginx:latest\n ---> 61395b4c586d\nStep 2/3 : EXPOSE 80\n ---> Running in d7267ee641b6\nRemoving intermediate container d7267ee641b6\n ---> 06a5ac2e4ba6\nStep 3/3 : CMD [“nginx”, “-g”, “daemon off;”]\n ---> Running in c02c94dc283c\nRemoving intermediate container c02c94dc283c\n ---> 49a47448ba86\nSuccessfully built 49a47448ba86\nSuccessfully tagged nginx:latest\n \n Create an alias of the image. \n docker tag nginx <CONTAINER REGISTRY NAME>.azurecr.io/nginx\n \n Authenticate to ACR with your AD user. \n az acr login --name <CONTAINER REGISTRY NAME> \n \n Upload the docker image to the ACR repository. \n docker push <CONTAINER REGISTRY NAME>.azurecr.io/nginx\n \n Example output: \n azureuser@Jumpbox-VM:~$ docker push acraksbl.azurecr.io/nginx\nUsing default tag: latest\nThe push refers to repository [acraksbl.azurecr.io/nginx]\nd26d4f0eb474: Pushed \na7e2a768c198: Pushed \n9c6261b5d198: Pushed \nea43d4f82a03: Pushed \n1dc45c680d0f: Pushed \neb7e3384f0ab: Pushed \nd310e774110a: Pushed \nlatest: digest: sha256:3dc6726adf74039f21eccf8f3b5de773080f8183545de5a235726132f70aba63 size: 1778\n \n \n To enable AKS to pull images from ACR, you can attach AKS to the ACR. This command updates the existing AKS cluster and attaches it to the ACR. \n \n az aks update \\\n --resource-group $SPOKE_RG \\\n --name $AKS_CLUSTER_NAME-${STUDENT_NAME} \\\n --attach-acr $ACR_NAME\n \n \n Validate AKS is able to pull images from ACR, by deploying a simple application to the AKS cluster. During deployment, the AKS cluster will pull the container image of the application from ACR. \n \n On the Jumpbox VM create a yaml file. \n vim test-pod.yaml\n \n Pro-tip: when you copy to vim, prevent vim from auto-indenting the text you paste. \n :set paste\n \n Press enter. \n Paste in the following manifest file which creates a pod named internal-test-app which fetches the docker images from our internal container registry, created in previous step. \n apiVersion: v1\nkind: Pod\nmetadata:\n name: internal-test-app\n labels:\n app: internal-test-app\nspec:\n containers:\n - name: nginx\n image: <ACR NAME>.azurecr.io/nginx\n ports:\n - containerPort: 80\n \n Create the pod. \n kubectl apply -f test-pod.yaml\n \n Verify that the pod is in running state. \n kubectl get po --show-labels\n \n Example output: \n azureuser@Jumpbox-VM:~$ kubectl get po \nNAME READY STATUS RESTARTS AGE\ninternal-test-app 1/1 Running 0 8s\n \n The next step is to set up an internal load balancer that will direct the traffic to our internal pod. The internal load balancer will be deployed in the load balancer subnet of the spoke-vnet. \n vim internal-app-service.yaml\n \n :set paste\n \n Press enter. \n Copy the following manifest to expose the pod to the internet. Replace with your subnet name stored in your local shell environment variable $LOADBALANCER_SUBNET_NAME. \n apiVersion: v1\nkind: Service\nmetadata:\n name: internal-test-app-service\n annotations:\n service.beta.kubernetes.io/azure-load-balancer-internal: \"true\"\n service.beta.kubernetes.io/azure-load-balancer-internal-subnet: \"<LOADBALANCER SUBNET NAME>\"\nspec:\n type: LoadBalancer\n ports:\n - port: 80\n selector:\n app: internal-test-app\n \n Deploy the service object in AKS. \n kubectl create -f internal-app-service.yaml\n \n Verify that your service object is created and associated with the pod that you have created, also ensure that you have recieved an external IP, which should be a private IP address range from the load balancer subnet. \n kubectl get svc -o wide\n \n Example output: \n azureuser@Jumpbox-VM:~$ kubectl get svc -o wide\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR\ninternal-test-app-service LoadBalancer 10.0.22.55 10.1.1.4 80:31644/TCP 112s app=internal-test-app\nkubernetes ClusterIP 10.0.0.1 <none> 443/TCP 13h <none>\n \n \n Note: Note down the EXTERNAL-IP (Private IP of the load balancer), as this will be used for creating the application gateway. \n \n   \n Verify that you are able to access the exposed Nginx pod from your jumpbox VM. \n azureuser@Jumpbox-VM:~$ curl <EXTERNAL-IP>\n \n Example output: \n azureuser@Jumpbox-VM:~$ curl 10.1.1.4\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n \n You have successfully deployed a private Azure Container Registry that is accessible from the jumpbox host. You also built and deployed the nginx image, which is only exposed over the private network. \n   \n \n   \n Deploy Azure Application Gateway. \n   \n In this section, you will set up an application gateway that will terminate TLS connections at its ingress. You will also learn how to perform these tasks: upload a certificate to Application Gateway, configure AKS as a backend pool by routing traffic to its internal load balancer, create a health probe to check the health of the AKS backend pool, and set up a WAF (Web Application Firewall) to defend against common web attacks. \n   \n \n Create public IP address with a domain name associated to the public IP resource. \n \n   \n The public IP address will be associated with a fully qualified domain name (FQDN) based on the location of your IP address and a unique name that you provide. For example, if you create an IP address in westeurope, the FQDN would look similar to this: \n myveryuniquename.westeurope.cloudapp.azure.com\n \n Lets make an environment variable of the uniqe name, and call it $DNS_NAME. \n DNS_NAME=<your unique name>\n \n az network public-ip create -g $SPOKE_RG -n AGPublicIPAddress --dns-name $DNS_NAME --allocation-method Static --sku Standard --location $LOCATION\n \n \n Create WAF policy. \n \n az network application-gateway waf-policy create --name ApplicationGatewayWAFPolicy --resource-group $SPOKE_RG\n \n \n Create self signed certificate. \n \n In order to expose your services to internet using HTTPs, you need to add a certificate to Application Gateway. In a production setting, this would be a trusted certificate from a certificate authority such as letsencrypt. In the interest of simplicity, you will instead create a self signed certificate, and upload to Application Gateway. \n Following are short instructions on how to create the self signed certificate. If you want to understand the details, or need more information, please review this page: https://learn.microsoft.com/en-us/azure/application-gateway/self-signed-certificates \n Step one is to create a Root CA Certificate. During the creation, you will need to provide an FQDN. This FQDN will be the one associated with the Public IP address created above. \n   \n To get the FQDN you can run the following command: \n az network public-ip show -g $SPOKE_RG -n AGPublicIPAddress --query dnsSettings.fqdn\n \n After this, use the following commands to create a key and sign the key (self signed). \n openssl genrsa -out my.key 2048\nopenssl req -new -x509 -sha256 -key my.key -out my.crt -days 365\n \n When prompted, type the password for the root key (and note it down), and the organizational information for the custom CA such as Country/Region, State, Org, OU, and the fully qualified domain name from the step above. Here is an example of how it might look: \n peter [ ~ ]$ openssl req -new -x509 -sha256 -key my.key -out my.crt -days 365\nYou are about to be asked to enter information that will be incorporated\ninto your certificate request.\nWhat you are about to enter is what is called a Distinguished Name or a DN.\nThere are quite a few fields but you can leave some blank\nFor some fields there will be a default value,\nIf you enter '.', the field will be left blank.\n-----\nCountry Name (2 letter code) [AU]:SE\nState or Province Name (full name) [Some-State]:\nLocality Name (eg, city) []:\nOrganization Name (eg, company) [Internet Widgits Pty Ltd]:\nOrganizational Unit Name (eg, section) []:\nCommon Name (e.g. server FQDN or YOUR name) []:uniqueappgwname.eastus.cloudapp.azure.com\nEmail Address []:johndoe@contoso.com\n \n Now, combine the private key and the certificate into a single .pfx file. Choose a good certificate password and make a note of it, as it will be used when creating the Application Gateway. \n openssl pkcs12 -export -out my.pfx -inkey my.key -in my.crt -password pass:<CERTIFICATE PASSWORD>\n \n \n Create Application Gateway. \n \n \n Note: Before executing the command below, make sure the certificate is located in your working directory. Replace with the password you used when creating the certificate and with the private IP of the load balancer. \n \n   \n az network application-gateway create \\\n --name AppGateway \\\n --location $LOCATION \\\n --resource-group $SPOKE_RG \\\n --vnet-name $SPOKE_VNET_NAME \\\n --subnet $APPGW_SUBNET_NAME \\\n --capacity 1 \\\n --sku WAF_v2 \\\n --http-settings-cookie-based-affinity Disabled \\\n --frontend-port 443 \\\n --http-settings-port 80 \\\n --http-settings-protocol Http \\\n --priority \"1\" \\\n --public-ip-address AGPublicIPAddress \\\n --cert-file my.pfx \\\n --cert-password \"<CERTIFICATE PASSWORD>\" \\\n --waf-policy ApplicationGatewayWAFPolicy \\\n --servers <LOAD BALANCER PRIVATE IP>\n \n \n Create a custom probe for the application gateway that will monitor the health of the AKS backend pool. \n \n az network application-gateway probe create \\\n --gateway-name $APPGW_NAME \\\n --resource-group $SPOKE_RG \\\n --name health-probe \\\n --protocol Http \\\n --path / \\\n --interval 30 \\\n --timeout 120 \\\n --threshold 3 \\\n --host 127.0.0.1\n \n \n Associate the health probe to the backend pool. \n \n az network application-gateway http-settings update -g $SPOKE_RG --gateway-name $APPGW_NAME -n appGatewayBackendHttpSettings --probe health-probe\n \n Validate your deployment in the Azure portal. \n \n \n Select the resource group called rg-spoke where the application gateway is deployed. \n \n \n Select your Azure Application Gateway called AppGateway. Ensure you have a Public IP address and Tier set to WAF v2. \n \n \n   \n \n \n \n In the left-hand side menu, under the Settings section, select Backend pools and choose from the list appGatewayBackendPool. \n \n \n Ensure the target type is set to IP address or FQDN and target is set to the IP address of your internal load balancer. \n \n \n   \n \n \n \n On the top menu click on AppGateway | Backend pools. \n \n \n Lets verify the backend settings of Application Gateway, in the left-hand side menu choose *Backend settings. \n \n \n From the list click on appGatewayBackendHttpSettings validate that the backend port is configured for port 80, and that health probe called health-probe is associated to the backend. \n \n \n   \n \n \n \n Press Cancel \n \n \n Verify that we have Web application rules configured. In the left-hand side menu choose *Web Application Firewall. \n \n \n Click on ApplicationGatewayWAFPolicy In the left-hand side menu choose *Managed rules. \n \n \n   \n \n We have successfully completed the deployment and configuration of the network and cluster resources. The following diagram shows the high-level architecture of the solution. As you can see, there is a test pod running in AKS that can receive traffic from the internet through the Azure Application Gateway and the Azure Internal Load Balancer. We can also access the private API server of the AKS cluster and the private container registry from the jumpbox using the private endpoints and links. We have also enabled outbound traffic from the AKS subnet to go through the Azure Firewall for inspection and filtering. In the next section, we will validate if we can access our test pod securely from the Internet. \n   \n \n   \n Validate Ingress Connection. \n   \n Open your web browser and access the domain created above: https://<application gateway FQDN> \n \n Note: The certificate used was self-signed, so the browser will issue a warning that the content is potentially unsafe. In a production setting, a certificate from a well known certificate authority should be used, but this is beyond the scope of this tutorial. \n \n   \n If you discard the warning, you should see a similar output as to the one below. \n   \n \n You have now verified connectivity from the public IP address, through the Application Gateway to the nginx pod running in your private AKS cluster. Well done! \n   \n Clean Up Resources in Azure \n   \n Once you have verified that everything works as depicted earlier you can issue the following commands to delete all of the Azure resources that you have created while working with these instructions.  The easiest way is to delete the resource groups which you have created your resources in. \n   \n az group delete -n $HUB_RG\naz group delete -n $SPOKE_RG \n   ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"62330","kudosSumWeight":8,"repliesCount":6,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTMwNDk2LTU3NzIxOGk0OTMwRTg3MjJEMjNERjdE?revision=11\"}"}}],"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":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:3837828":{"__typename":"Conversation","id":"conversation:3837828","topic":{"__typename":"BlogTopicMessage","uid":3837828},"lastPostingActivityTime":"2024-01-20T22:52:19.587-08:00","solved":false},"User:user:1357822":{"__typename":"User","uid":1357822,"login":"theringe","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xMzU3ODIyLVIxNkJKdg?image-coordinates=0%2C0%2C800%2C800"},"id":"user:1357822"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI1OGk1MkJEMEVGQjU2NTg1MkQ4?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI1OGk1MkJEMEVGQjU2NTg1MkQ4?revision=11","title":"theringe_0-1685678431366.png","associationType":"BODY","width":865,"height":206,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI1OWlENEY2NzhDQjk0QzY1MDgw?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI1OWlENEY2NzhDQjk0QzY1MDgw?revision=11","title":"theringe_1-1685678468236.png","associationType":"BODY","width":865,"height":488,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3Nmk5NTYwNTQ3QjY0MDUwMkRF?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3Nmk5NTYwNTQ3QjY0MDUwMkRF?revision=11","title":"theringe_0-1685679683481.png","associationType":"BODY","width":865,"height":241,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3N2k5MDJDMkI2MTFDMDczOEYz?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3N2k5MDJDMkI2MTFDMDczOEYz?revision=11","title":"theringe_1-1685679758008.png","associationType":"BODY","width":865,"height":101,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3OGlCMDNGMDdEMjk2Q0I0RkVC?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3OGlCMDNGMDdEMjk2Q0I0RkVC?revision=11","title":"theringe_2-1685679816282.png","associationType":"BODY","width":865,"height":748,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3OWlGNDMzM0U4MjIzNjBGRTRC?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3OWlGNDMzM0U4MjIzNjBGRTRC?revision=11","title":"theringe_3-1685679849889.png","associationType":"BODY","width":865,"height":716,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4MGk5MTEzMjI1RDIzMzY1NURF?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4MGk5MTEzMjI1RDIzMzY1NURF?revision=11","title":"theringe_4-1685679908011.png","associationType":"BODY","width":865,"height":58,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4MWkxRDM3QjZBRTA2OUNCNUZB?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4MWkxRDM3QjZBRTA2OUNCNUZB?revision=11","title":"theringe_5-1685679951421.png","associationType":"BODY","width":865,"height":186,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4MmlGNzRGRDQ2MDU2RERFRUEz?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4MmlGNzRGRDQ2MDU2RERFRUEz?revision=11","title":"theringe_6-1685680001213.png","associationType":"BODY","width":865,"height":324,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4NmkyMDA1NERCMjU5QjU3QTA4?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4NmkyMDA1NERCMjU5QjU3QTA4?revision=11","title":"theringe_0-1685680251876.png","associationType":"BODY","width":695,"height":484,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4N2lBQkI3NTgyQzAwOTlFRDgz?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4N2lBQkI3NTgyQzAwOTlFRDgz?revision=11","title":"theringe_1-1685680266785.png","associationType":"BODY","width":684,"height":476,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4OGkxN0NDMEM1RkJEMTQ5REE1?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4OGkxN0NDMEM1RkJEMTQ5REE1?revision=11","title":"theringe_2-1685680290371.png","associationType":"BODY","width":683,"height":476,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4OWk1Q0VCRUU4REI4RkFDQkUw?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4OWk1Q0VCRUU4REI4RkFDQkUw?revision=11","title":"theringe_0-1685680356510.png","associationType":"BODY","width":865,"height":455,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5MGlFOUZFQzc4QUMzNTY5QkIw?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5MGlFOUZFQzc4QUMzNTY5QkIw?revision=11","title":"theringe_1-1685680391192.png","associationType":"BODY","width":865,"height":450,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5MWk0NTFGODRDMzlBQTBDNTY0?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5MWk0NTFGODRDMzlBQTBDNTY0?revision=11","title":"theringe_2-1685680402270.png","associationType":"BODY","width":366,"height":242,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5MmlCQzEwNzgzRUNCNTEwRkQ5?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5MmlCQzEwNzgzRUNCNTEwRkQ5?revision=11","title":"theringe_3-1685680446778.png","associationType":"BODY","width":865,"height":546,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5M2lGRDc0Rjk4NkNCNDk3NjJC?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5M2lGRDc0Rjk4NkNCNDk3NjJC?revision=11","title":"theringe_4-1685680465724.png","associationType":"BODY","width":865,"height":364,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5NGkwMzVCOTBFMzA4ODQzNEZC?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5NGkwMzVCOTBFMzA4ODQzNEZC?revision=11","title":"theringe_5-1685680523994.png","associationType":"BODY","width":865,"height":264,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5NWlBRTZFRTJGNzc3NDZBOEMx?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5NWlBRTZFRTJGNzc3NDZBOEMx?revision=11","title":"theringe_6-1685680567952.png","associationType":"BODY","width":865,"height":193,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5Nmk4MUI1OUNGM0E0NEEzMjM4?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5Nmk4MUI1OUNGM0E0NEEzMjM4?revision=11","title":"theringe_0-1685680714410.png","associationType":"BODY","width":865,"height":708,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5N2k4Mzk2NDdDRjFEOTk3QzNF?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5N2k4Mzk2NDdDRjFEOTk3QzNF?revision=11","title":"theringe_1-1685680755078.png","associationType":"BODY","width":865,"height":428,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5OGk0ODkyQUFDOUQ3MTkzRTZF?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5OGk0ODkyQUFDOUQ3MTkzRTZF?revision=11","title":"theringe_2-1685680772828.png","associationType":"BODY","width":550,"height":364,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5OWlBQjNCRThEODQxMEY3MzFB?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5OWlBQjNCRThEODQxMEY3MzFB?revision=11","title":"theringe_3-1685680802093.png","associationType":"BODY","width":865,"height":843,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjMwMGkzQ0Q3ODg5NjRDREVBQUVG?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjMwMGkzQ0Q3ODg5NjRDREVBQUVG?revision=11","title":"theringe_4-1685680831604.png","associationType":"BODY","width":735,"height":736,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjMwMWk0M0E0QTkxNzg3MkVFRTU1?revision=11\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjMwMWk0M0E0QTkxNzg3MkVFRTU1?revision=11","title":"theringe_5-1685680852349.png","associationType":"BODY","width":815,"height":771,"altText":null},"BlogTopicMessage:message:3837828":{"__typename":"BlogTopicMessage","subject":"Cloud Rendering Adobe After Effects Video with Windows Docker Container","conversation":{"__ref":"Conversation:conversation:3837828"},"id":"message:3837828","revisionNum":11,"uid":3837828,"depth":0,"board":{"__ref":"Blog:board:AppsonAzureBlog"},"author":{"__ref":"User:user:1357822"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" Since I run Newbie Homemade Mashup Lab, I always have video render needs for After Effects. When there are many videos, my personal computer will spend a lot of time rendering them. During this time, I cannot do anything else. So, I came up with the idea of Cloud Rendering. This article will guide you to build your own After Effects Docker image and ultimately try rendering on Azure App Service. ","introduction":"","metrics":{"__typename":"MessageMetrics","views":5893},"postTime":"2023-06-01T22:25:12.524-07:00","lastPublishTime":"2024-01-20T22:52:19.587-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Since I run Newbie Homemade Mashup Lab, I always have video render needs for After Effects. When there are many videos, my personal computer will spend a lot of time rendering them. During this time, I cannot do anything else. So, I came up with the idea of Cloud Rendering. This article will guide you to build your own After Effects Docker image and ultimately try rendering on Azure App Service. \n   \n TOC \n \n Prerequisite \n Download After Effects install Package \n Launch a Windows Server container and install After Effects \n (Optional) Install After Effects Plugins: Take Plexus as Example \n Rendering Locally \n Rendering on Azure App Service \n Conclusion \n \n Prerequisite \n Before we start, we need to confirm whether our operating environment is suitable and whether we have all the relevant tools. Please refer to the following table for verification. \n \n \n \n \n Host Machine / OS \n \n \n Hardware configuration requires at least a 4-core processor and 8GB of memory. The operating system must be Windows 10/11 and a 64-bit operating system. \n \n \n \n \n Software \n \n \n Installed Docker Desktop Windows \n \n \n \n \n Software (Optional) \n \n \n Installed Adobe After Effects 2022 \n Must have a genuine license \n \n \n \n \n Software \n \n \n Adobe After Effects Installer Package \n Must have a genuine license \n \n \n \n \n Software (Optional) \n \n \n Rowbyte Plexus Plugin \n Must have a genuine license \n \n \n \n \n Cloud Platform \n \n \n Azure account with a subscription \n \n \n \n \n   \n Please be notice that the Adobe After Effects Installer Package is not the installation file used on personal computers in the past. We need to use silent install this time and download a dedicated installation program from the Adobe official website. \n Download After Effects install Package \n Visit https://adminconsole.adobe.com/ \n   \n Create a package. \n \n   \n Specify your preferred name (and we will use it later), for example AE, selecting Windows (64-bit), selecting English (North America), then click Create package. \n \n Download the installation package. \n \n For example, we give it a name AE_en_US_WIN_64.zip for further use. \n Launch a Windows Server container and install After Effects \n On our host machine, put AE_en_US_WIN_64.zip on your desktop, then open a terminal and run the following command to create a Windows container. \n   \n   \n   \n   \n docker run -it --cpus=4 --memory=8192m -v C:/Users/CCH:C:/Users/ContainerUser mcr.microsoft.com/windows/server:ltsc2022 cmd.exe \n   \n   \n   \n   \n Please change C:/Users/CCH into your home folder name. \n \n   \n It might take a while for downloading, please run the following command once it finished. This command used to install the chocolatey package manager. \n   \n   \n   \n   \n @\"%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command \"[System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))\" && SET \"PATH=%PATH%;%ALLUSERSPROFILE%\\chocolatey\\bin\" \n   \n   \n   \n   \n \n   \n And then, run the following command to install some tools related to the installation process. \n   \n   \n   \n   \n choco install -y nano unzip ntop.portable \n   \n   \n   \n   \n \n   \n Create a link from by running this command. \n   \n   \n   \n   \n mklink /h /j \"C:\\Users\\CCH\" \"C:\\Users\\ContainerAdministrator\" \n   \n   \n   \n   \n Please change C:\\Users\\CCH into your home folder name. \n \n   \n We are copying and extracting the installation package from our host machine to the container by running this command. \n   \n   \n   \n   \n copy \"C:\\Users\\ContainerUser\\Desktop\\AE_en_US_WIN_64.zip\" \"C:\\Users\\CCH\\Desktop\"\ncd \"C:\\Users\\CCH\\Desktop\"\nunzip AE_en_US_WIN_64.zip \n   \n   \n   \n   \n Please change C:\\Users\\CCH into your home folder name. \n \n   \n It might take a while for extracting, please run the following command once it finished. This command used to install Adobe After Effects on your container. \n   \n   \n   \n   \n cd AE\ncd Build\nsetup.exe --silent --INSTALLLANGUAGE=en_US \n   \n   \n   \n   \n Depends on the name you have specified on the previous step, please change AE to your specified name. \n \n We are done. \n (Optional) Install After Effects Plugins: Take Plexus as Example \n Almost every After Effects projects need the plugins, I take Rowbyte Plexus for example. \n Before we apply this plugin to the container, we must normally install it on the host machine and activate it to obtain the installed files and activation key file. \n Then we can put the installed files and activation key file from host machine to the container. \n We firstly install the plugin, and the process is nothing special. \n \n \n \n Here it is. After the installation, we locate the file path in: \n   \n   \n   \n   \n C:\\Program Files\\Adobe\\Adobe After Effects 2022\\Support Files\\Plug-ins \n   \n   \n   \n   \n And named Rowbyte. \n \n We can right click on it and send it to a zip file named Rowbyte.zip for further use. \n   \n Then we open After Effects and the Plexus activation screen and activate it. \n \n \n Ater the activation, we locate the file path in: \n   \n   \n   \n   \n C:\\Users\\All Users \n   \n   \n   \n   \n And named RWBYTE. \n \n \n We can right click on it and send it to a zip file named RWBYTE.zip for further use. \n   \n Now we put Rowbyte.zip and RWBYTE.zip on desktop and go back to the terminal. \n Run the following command to install the plugin to the container. \n   \n   \n   \n   \n copy \"C:\\Users\\ContainerUser\\Desktop\\Rowbyte.zip\" \"C:\\Program Files\\Adobe\\Adobe After Effects 2022\\Support Files\\Plug-ins\"\ncd \"C:\\Program Files\\Adobe\\Adobe After Effects 2022\\Support Files\\Plug-ins\"\nunzip \"Rowbyte.zip\" \n   \n   \n   \n   \n \n   \n Run the following command to put the activation file. \n   \n   \n   \n   \n copy \"C:\\Users\\ContainerUser\\Desktop\\RWBYTE.zip\" \"C:\\Users\\All Users\"\ncd \"C:\\Users\\All Users\"\nunzip \"RWBYTE.zip\" \n   \n   \n   \n   \n \n We are done. \n Rendering Locally \n We can try to render some sample projects on local container before we deploy this image on Azure. \n You can download a sample project file from this YouTuber (not me), here is the sample project files. \n Please unzip the project file, put any of the file into container and run the command. \n   \n   \n   \n   \n \"C:\\Program Files\\Adobe\\Adobe After Effects 2022\\Support Files\\aerender.exe\" -project \"C:\\Users\\ContainerAdministrator\\Desktop\\EP_EFFECT\\RAW\\DN.aep\" -comp \"Day\" -output \"DN.mov\" -s 0 -e 100 \n   \n   \n   \n   \n Please change C:\\Users\\ContainerAdministrator\\Desktop\\EP_EFFECT\\RAW\\DN.aep to your actual file path and name inside the container. \n \n Cool! We are rendering inside a container. \n Rendering on Azure App Service \n Now we can try to make it on the cloud. Go to https://portal.azure.com and search for app service. \n \n   \n In App Service, create a new Web App \n \n   \n Give it a name (we will use it later), for example yourname, select Docker Container, select Windows, click Next. \n \n   \n Select Private Registry, input mcr.microsoft.com into Server URL, input windows/server:ltsc2022 into Image and tag, click Review + create \n \n   \n Check the information and create. \n \n   \n It might take a while for preparing, please go to https://yourname.scm.azurewebsites.net/webssh/host after the online container has ready. \n Please change yourname into the name you have specified in the application previously. \n   \n After we applied all the command mentioned previously in the App Service Container, we can finally see it works. \n \n Conclusion \n Using Cloud rendering is possible. At this stage, it may not be practical due to cost-effectiveness and various hardware and software limitations. However, as a research topic, it is quite an interesting one. \n   \n 2024-01-21 updates: \n theringe/winae (github.com) ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"8434","kudosSumWeight":8,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI1OGk1MkJEMEVGQjU2NTg1MkQ4?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI1OWlENEY2NzhDQjk0QzY1MDgw?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3Nmk5NTYwNTQ3QjY0MDUwMkRF?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3N2k5MDJDMkI2MTFDMDczOEYz?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3OGlCMDNGMDdEMjk2Q0I0RkVC?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI3OWlGNDMzM0U4MjIzNjBGRTRC?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4MGk5MTEzMjI1RDIzMzY1NURF?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDg","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4MWkxRDM3QjZBRTA2OUNCNUZB?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDk","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4MmlGNzRGRDQ2MDU2RERFRUEz?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDEw","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4NmkyMDA1NERCMjU5QjU3QTA4?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDEx","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4N2lBQkI3NTgyQzAwOTlFRDgz?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDEy","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4OGkxN0NDMEM1RkJEMTQ5REE1?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDEz","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI4OWk1Q0VCRUU4REI4RkFDQkUw?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE0","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5MGlFOUZFQzc4QUMzNTY5QkIw?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE1","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5MWk0NTFGODRDMzlBQTBDNTY0?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE2","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5MmlCQzEwNzgzRUNCNTEwRkQ5?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE3","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5M2lGRDc0Rjk4NkNCNDk3NjJC?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE4","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5NGkwMzVCOTBFMzA4ODQzNEZC?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE5","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5NWlBRTZFRTJGNzc3NDZBOEMx?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDIw","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5Nmk4MUI1OUNGM0E0NEEzMjM4?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDIx","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5N2k4Mzk2NDdDRjFEOTk3QzNF?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDIy","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5OGk0ODkyQUFDOUQ3MTkzRTZF?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDIz","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjI5OWlBQjNCRThEODQxMEY3MzFB?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI0","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjMwMGkzQ0Q3ODg5NjRDREVBQUVG?revision=11\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI1","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODM3ODI4LTQ3NjMwMWk0M0E0QTkxNzg3MkVFRTU1?revision=11\"}"}}],"totalCount":26,"pageInfo":{"__typename":"PageInfo","hasNextPage":true,"endCursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI1","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:3827989":{"__typename":"Conversation","id":"conversation:3827989","topic":{"__typename":"BlogTopicMessage","uid":3827989},"lastPostingActivityTime":"2023-06-02T14:46:20.744-07:00","solved":false},"User:user:1387591":{"__typename":"User","uid":1387591,"login":"bobmital","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xMzg3NTkxLTQ3MjcwNWkzNThDQ0M3QTZENTNFRjVD"},"id":"user:1387591"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjY5Mmk0ODg5OEJDMkNFRTJBNTEz?revision=32\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjY5Mmk0ODg5OEJDMkNFRTJBNTEz?revision=32","title":"custbe.png","associationType":"BODY","width":2166,"height":1216,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjU5NWlGM0QwRTk0QzA4RTQ4QjFF?revision=32\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjU5NWlGM0QwRTk0QzA4RTQ4QjFF?revision=32","title":"isovalent.png","associationType":"BODY","width":1180,"height":558,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjYwMWk2Njg0QjYwN0RGMzRBODg2?revision=32\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjYwMWk2Njg0QjYwN0RGMzRBODg2?revision=32","title":"castaiv2.png","associationType":"BODY","width":1920,"height":752,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjU5OWkyRTk3RTQ1REUzRkQ5N0U1?revision=32\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjU5OWkyRTk3RTQ1REUzRkQ5N0U1?revision=32","title":"portworx-by-ps-logo_full-color.png","associationType":"BODY","width":2421,"height":880,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjUwNGk1Q0VEQzhFN0FBRDk1NDUy?revision=32\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjUwNGk1Q0VEQzhFN0FBRDk1NDUy?revision=32","title":"bobmital_1-1684790096971.png","associationType":"BODY","width":1842,"height":522,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjY5NWkyMjBGMTU5RTFBQTJDOEUw?revision=32\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjY5NWkyMjBGMTU5RTFBQTJDOEUw?revision=32","title":"weaveWorks_colour_logo.png","associationType":"BODY","width":450,"height":130,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjYwMmlEMjIxNjRENkU4RjhBNjRF?revision=32\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjYwMmlEMjIxNjRENkU4RjhBNjRF?revision=32","title":"bitnami-by-vmware.png","associationType":"BODY","width":977,"height":401,"altText":null},"BlogTopicMessage:message:3827989":{"__typename":"BlogTopicMessage","subject":"Extend the capabilities of your AKS deployments with Kubernetes Apps on Azure Marketplace","conversation":{"__ref":"Conversation:conversation:3827989"},"id":"message:3827989","revisionNum":32,"uid":3827989,"depth":0,"board":{"__ref":"Blog:board:AppsonAzureBlog"},"author":{"__ref":"User:user:1387591"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" We’re excited to announce that Kubernetes Apps in the Azure Marketplace is now Generally Available. Azure Kubernetes Service (AKS) provides a robust and scalable managed Kubernetes platform for organizations running their most mission-critical applications on Azure. With Kubernetes Apps, teams can further extend the capabilities of their AKS deployments with a vibrant ecosystem of tested and transactable third-party solutions from industry-leading partners and popular open-source offerings. ","introduction":"","metrics":{"__typename":"MessageMetrics","views":11875},"postTime":"2023-05-23T12:09:17.162-07:00","lastPublishTime":"2023-06-02T14:46:20.744-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" We're excited to announce that Kubernetes Apps in the Azure Marketplace is now Generally Available. Azure Kubernetes Service (AKS) provides a robust and scalable managed Kubernetes platform for organizations running their most mission-critical applications on Azure. With Kubernetes Apps, teams can further extend the capabilities of their AKS deployments with a vibrant ecosystem of tested and transactable third-party solutions from industry-leading partners and popular open-source offerings. \n   \n Customers benefit from a simplified supply chain that offers vetted security, integrated billing, and one-click deployment to AKS, making it easier than ever to build cutting-edge solutions. Kubernetes Apps enables you to:   \n   \n \n Drive business efficiency with one-click deployments and CI/CD automation. \n Reduce management & operations overhead with streamlined enterprise support and automated lifecycle management. \n Use vetted and secure solutions that have gone through a rigorous certification process and are continually scanned for vulnerabilities. \n Simplify billing and consumption with flexible billing options and the ability to apply Microsoft Azure Consumption Commitment (MACC) to 3 rd party solutions. \n \n   \n \n   \n Get started using Kubernetes Apps today at: https://aka.ms/deployK8sApp. \n   \n Featured Kubernetes Apps Partners \n We announced the public preview of the Kubernetes Apps marketplace offering in October 2022, followed by our General Availability in May 2023 with our launch partners. Since then, several customers have begun using the marketplace offerings from our partners in their Kubernetes environments. I'd like to share details of some of those partner offerings and what customers have been able to achieve: \n   \n   \n \n   \n Isovalent \n   \n AKS empowers enterprises with a highly scalable and secure platform for managing containerized applications, enabling faster development, increased agility, and improved resource utilization. However, as applications scale, there can be increased complexity around security and networking. Isovalent Cilium Enterprise, built on top of the open-source Cilium project, addresses these concerns by providing additional functionality such as advanced observability and security policy enforcement across multiple layers of the stack. It uses eBPF technology to deliver network and application-layer security, while also providing observability and tracing for Kubernetes workloads. Isovalent Cilium Enterprise also provides seamless integration with popular Kubernetes platforms and tools, including Istio, Helm, and more, thereby making it a trusted offering among organizations. \n   \n With Kubernetes Apps, customers can easily deploy and upgrade Isovalent Cilium Enterprise features to a new or existing AKS cluster (running Azure CNI powered by Cilium) with just a few clicks. Isovalent Cilium Enterprise is built with native integration with the Azure networking platform to offer advanced features and capabilities with best-in-class performance and scale. \n   \n \"Adobe has used Isovalent Enterprise for Cilium in production for many years, and we were excited to learn of the enterprise features and support provided on Microsoft Azure Kubernetes Service. By leveraging Azure Marketplace, we can perform lifecycle management of the application with ease, gain access to integrated billing and enterprise-grade support. This helps us reduce costs and achieve efficiency\" –Joseph Sandoval, Cloud Native Product Manager at Adobe. \n   \n Get started with Isovalent Cilium Enterprise on the Azure Marketplace: Cilium Enterprise by Isovalent \n   \n   \n \n   \n CAST AI \n   \n CAST AI is an AI-driven Kubernetes automation platform for AKS users looking to optimize and automatically manage their cloud resources in minutes. CAST AI combines Kubernetes monitoring and end-to-end automation, to cover AKS cloud cost monitoring, management, and optimization operations automatically, in one place. \n   \n With Kubernetes Apps, Azure users are now one click away from enabling an AI engine to help improve the efficiency of AKS clusters. CAST AI's cutting-edge machine learning algorithms continuously analyze and fine-tune the infrastructure, ensuring optimal resource utilization. After connecting an AKS cluster via the Azure Marketplace, teams will first see a cost monitoring suite – after a few minutes, the AI engine will manage the compute resources automatically via an ultra-efficient rightsizing and bin packing autoscaler and will also manage any Spot VMs. \n   \n “Our recent purchase of Cast AI has helped us optimize costs and automate AKS management, including cost reporting. Now having this available on the marketplace makes it even easier to integrate into our platform” – James O’ Hare, Principle Platform Engineer, NielsenIQ \n   \n \"Azure Marketplace simplifies access to exceptional services like Cast.AI, enabling Phlexglobal to optimize our Kubernetes clusters and achieve significant cost savings. By leveraging Azure Marketplace, we streamline resource utilization, enhance performance, and maximize cost-efficiency. This seamless integration empowers Phlexglobal to unlock unparalleled value, ensuring a highly professional and budget-friendly Kubernetes experience.\" Alex Potter-Dixon VP, Cloud Engineering and Operations, Phlexglobal \n   \n Get started with CAST AI on the Azure Marketplace: CAST AI by CAST AI Group \n   \n   \n \n   \n Portworx by Pure Storage \n Portworx enables customers to easily develop, deploy, scale, and manage their data and stateful applications in AKS. Offering dynamic provisioning, CSI-compliant volume lifecycle management, and automatic capacity planning, Portworx enables developers to get applications to production faster while lowering DevOps costs. Day 2 needs are also taken care of, including granular RBAC for access control, encryption using Azure KMS, cross zone availability with zero second RPO, and cross region availability. \n Customers run their business-critical applications and data on Portworx on AKS for scale and resilience. With Kubernetes Apps on the Azure Marketplace, AKS customers can now seamlessly purchase and utilize the capabilities of Portworx Enterprise from directly within the AKS management plane. \n   \n “Many of our customers run their modern data-rich cloud native applications with Portworx on Azure. With the launch of Microsoft Container Marketplace, our customers will have the ability to easily access Portworx – the #1 Cloud Native Storage and Data Services Platform – combined with the scalability and reliability of Azure to run their business-critical applications in production and at scale. We are excited to extend our partnership with Microsoft Azure as a launch partner in the marketplace.” - Murli Thirumale, VP & GM, Portworx by Pure Storage  \n   \n Get started with Portworx on the Azure Marketplace: Portworx Enterprise by Pure Storage \n   \n   \n \n   \n CloudCasa by Catalogic \n   \n CloudCasa is a simple yet powerful Kubernetes backup service, recognized recently by GigaOm as a Kubernetes Data Protection Leader and Outperformer.  Organizations can benefit from the service within minutes of signing up and skip the complexity of setting up a dedicated backup infrastructure. Furthermore, teams can centralize data protection across Kubernetes clusters deployed in both hybrid cloud as well as multi-cloud models. CloudCasa is fully compatible with the popular open-source backup tool Velero, enabling AKS users to centrally manage their Velero instances as well as perform a full stack AKS backup and recovery. \n   \n Using Kubernetes Apps, AKS customers can now easily find, subscribe to and deploy CloudCasa as an extension on any cluster delivering enterprise-grade, cloud-native data protection and management. With a one-click seamless deployment of CloudCasa, AKS customers can now centralize data protection across a multi-cluster environment, protect against ransomware, mobilize application copies for test/dev, and recover in alternate tenants and regions. \n   \n “With more customers choosing managed Kubernetes offerings such as AKS, it is obvious that they also choose to offload data protection to a managed service like CloudCasa. With one click installation and integrated billing, Azure is generously facilitating innovators like CloudCasa to access the trusted procurement channels Microsoft has built over several decades” said Yongkang He, a CNCF Ambassador and organizer of the fast-growing Kubernetes User Group” \n   \n Get started with CloudCasa on the Azure Marketplace:  CloudCasa by Catalogic \n   \n   \n   \n \n Weaveworks \n   \n Weave GitOps Enterprise (WGE) is the GitOps software built on Flux, enhancing AKS to deliver cloud-native applications and infrastructure quickly and reliably at scale. Platform teams can build internal developer platforms on AKS. Applications teams can utilize secure CI/CD pipelines to operate applications in the cloud, on premise, or at the edge. Weave GitOps Enterprise works with many of the popular tools such as Helm and Terraform on AKS. A single centralized management console offers unparalleled control, flexibility, and customization for true GitOps at scale resulting in increased developer productivity and higher reliability and stability. \n   \n We are excited to join the AKS Azure Marketplace to bring our Weave GitOps Enterprise software to the AKS users looking to have GitOps backed resilience, ease of scale, cluster management, and application pipeline support. Our stand-out features include multiple cluster management dashboard; WGE control panel that visualizes application lifecycle, drift, and cluster health among other critical metrics; application pipelines for observable, repeatable, and secure promotions. Weaveworks offers private offer pricing for annual support subscriptions of WGE per node, per cluster, or application based. Please contact us to discuss your best option. \n   \n \"We are excited to bring the automation and scale of Weave GitOps to the Azure Marketplace. With one click, AKS can strengthen resilience, ease of scale, cluster management, and application pipeline support with the market leading GitOps solution built on FluxCD. Weave GitOps customers build internal developer platforms on AKS, bridge hybrid and multi cloud infrastructure, as well as leverage simpler operations of applications with secure CI/CD pipelines in the cloud, on premise or at the edge.\" - Mike Kress, VP of Business Development and Alliances \n   \n To get started with the Weaveworks offer on the Azure Marketplace contact here: azure-partner-team@weave.works  \n   \n   \n \n Bitnami \n   \n ​Bitnami provides prepackaged, ready-to-use applications, tailored for individual developers’ use, with no need for any additional configurations or setups. Bitnami’s community catalog has over 150 custom-packaged open source software solutions, delivered through various open source software libraries and enterprise marketplaces. Leveraging more than a decade of experience in packaging, updating and publishing an extensive library of open source applications, the Bitnami applications are delivered following industry-standard best practices and tested for use in all major end platforms. \n   \n Get started with Bitnami on the Azure Marketplace and search for Bitnami Kubernetes Apps: https://aka.ms/KubernetesAppsInMarketplace \n   \n Learn More \n   \n \n Get started with Kubernetes Apps: https://aka.ms/deployK8sApp. \n Find other Kubernetes Apps listed on Azure Marketplace: https://aka.ms/KubernetesAppsInMarketplace \n For Customer support, please visit: https://learn.microsoft.com/en-us/azure/aks/aks-support-help#create-an-azure-support-request \n Partner with us: If you are an ISV or Azure partner interested in listing your Kubernetes App, please visit: http://aka.ms/K8sAppsGettingStarted \n Learn more about Partner Benefits: https://learn.microsoft.com/en-us/partner-center/marketplace/overview#why-sell-with-microsoft \n For Partner Support, please visit: https://partner.microsoft.com/support/?stage=1 \n \n   ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"12448","kudosSumWeight":7,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjY5Mmk0ODg5OEJDMkNFRTJBNTEz?revision=32\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjU5NWlGM0QwRTk0QzA4RTQ4QjFF?revision=32\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjYwMWk2Njg0QjYwN0RGMzRBODg2?revision=32\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjU5OWkyRTk3RTQ1REUzRkQ5N0U1?revision=32\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjUwNGk1Q0VEQzhFN0FBRDk1NDUy?revision=32\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjY5NWkyMjBGMTU5RTFBQTJDOEUw?revision=32\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zODI3OTg5LTQ3MjYwMmlEMjIxNjRENkU4RjhBNjRF?revision=32\"}"}}],"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":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:3678390":{"__typename":"Conversation","id":"conversation:3678390","topic":{"__typename":"BlogTopicMessage","uid":3678390},"lastPostingActivityTime":"2023-01-05T23:50:12.799-08:00","solved":false},"User:user:185703":{"__typename":"User","uid":185703,"login":"AnthonyChu","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xODU3MDMtMjM2NzgzaTYyOEE4QTFDMTM2OTA2NjU"},"id":"user:185703"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zNjc4MzkwLTQxOTUyNGlCOURFNDgwNkUyMzEyODVG?revision=4\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zNjc4MzkwLTQxOTUyNGlCOURFNDgwNkUyMzEyODVG?revision=4","title":"aca-cicd.png","associationType":"TEASER","width":1280,"height":720,"altText":null},"BlogTopicMessage:message:3678390":{"__typename":"BlogTopicMessage","subject":"Introducing more ways to deploy Azure Container Apps","conversation":{"__ref":"Conversation:conversation:3678390"},"id":"message:3678390","revisionNum":4,"uid":3678390,"depth":0,"board":{"__ref":"Blog:board:AppsonAzureBlog"},"author":{"__ref":"User:user:185703"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" \n Deploy Azure Container Apps with GitHub Actions and Azure DevOps, and build container images without Dockerfiles. ","introduction":"","metrics":{"__typename":"MessageMetrics","views":11507},"postTime":"2022-11-17T09:00:00.055-08:00","lastPublishTime":"2022-11-17T09:19:31.321-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Azure Container Apps is a fully managed serverless container service for building and deploying modern apps at scale. Today, we’re introducing new preview features to make it even easier to build and deploy container apps:  \n \n A new GitHub action to build and deploy container apps \n A new Azure Pipelines task to build and deploy container apps \n Build container images without a Dockerfile \n \n These features are currently in public preview. Try them out and let us know what you think!  \n   \n Azure Container Apps GitHub action \n   \n With the azure/container-apps-deploy-action GitHub action, you can build and deploy container apps directly from your GitHub repository. Here's an example GitHub Actions workflow that builds a container image from source code and deploys it to Azure Container Apps:  \n   \n name: Azure Container Apps Build and Deploy \n \non: \n push: \n branches: \n - main \n \njobs: \n build: \n runs-on: ubuntu-latest \n \n steps: \n - uses: actions/checkout@v3 \n \n - name: Log in to Azure \n uses: azure/login@v1 \n with: \n creds: ${{ secrets.AZURE_CREDENTIALS }} \n \n - name: Build and deploy Container App \n uses: azure/container-apps-deploy-action@v0 \n with: \n appSourcePath: ${{ github.workspace }}/src \n acrName: myregistry \n containerAppName: my-container-app \n resourceGroup: my-container-app-rg \n   \n For more information, see the Azure Container Apps GitHub Actions documentation.  \n   \n Azure Container Apps Azure Pipelines task \n   \n With the Azure Container Apps task in Azure Pipelines, you can build and deploy container apps directly from your build or release pipeline. Here's an example Azure DevOps build pipeline that builds a container image from source code and deploys it to Azure Container Apps:  \n   \n trigger: \n branches: \n include: \n - main \n \npool: \n vmImage: ubuntu-latest \n \nsteps: \n - task: AzureContainerAppsRC@0 \n inputs: \n appSourcePath: '$(Build.SourcesDirectory)/src' \n azureSubscription: 'my-azure-service-connection' \n acrName: 'myregistry' \n containerAppName: 'my-container-app' \n resourceGroup: 'my-container-app-rg' \n   \n There will be two versions of the task that you can choose from:  \n \n AzureContainerAppsRC (available now) - This release candidate version contains the latest features and updates. You can install it now from the Visual Studio Marketplace.  \n AzureContainerApps (expected in December 2022) - This version ships with Azure Pipelines and is available by default. Features and updates that are added to AzureContainerAppsRC appear in this version after a few weeks.  \n \n For more information, see the Azure Container Apps Azure Pipelines documentation.  \n   \n Dockerfile-less builds  \n   \n Azure Container Apps now supports building container images from source code without a Dockerfile. This makes it even easier to build and deploy container apps.  \n   \n Dockerfile-less builds are powered by the Microsoft Oryx open-source project. Supported languages and runtimes include: .NET, Python, Node.js, PHP, Ruby, and Go.  \n   \n Here are the tools that currently support Dockerfile-less builds:  \n \n Azure Container Apps GitHub action  \n Azure Container Apps Azure Pipelines task  \n Azure CLI using the az containerapp up command  \n \n   ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"3506","kudosSumWeight":7,"repliesCount":1,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zNjc4MzkwLTQxOTUyNGlCOURFNDgwNkUyMzEyODVG?revision=4\"}"}}],"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":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:4146701":{"__typename":"Conversation","id":"conversation:4146701","topic":{"__typename":"BlogTopicMessage","uid":4146701},"lastPostingActivityTime":"2024-05-24T20:18:54.773-07:00","solved":false},"User:user:794922":{"__typename":"User","uid":794922,"login":"nceres","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS03OTQ5MjItNTg0MTI1aTEyNjk5ODkyNzU5NEVCQjA"},"id":"user:794922"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTQ2NzAxLTU4Mzg5NWk0RUE0QUIwNEMzNjQ3MTQx?revision=6\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTQ2NzAxLTU4Mzg5NWk0RUE0QUIwNEMzNjQ3MTQx?revision=6","title":"BRK122 - Introducing AKS Automatic_v02.jpg","associationType":"TEASER","width":1920,"height":1080,"altText":null},"BlogTopicMessage:message:4146701":{"__typename":"BlogTopicMessage","subject":"AKS at Build: Enhancing security, reliability, and ease of use for developers and platform teams","conversation":{"__ref":"Conversation:conversation:4146701"},"id":"message:4146701","revisionNum":6,"uid":4146701,"depth":0,"board":{"__ref":"Blog:board:AppsonAzureBlog"},"author":{"__ref":"User:user:794922"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" At Microsoft Build 2024, we’re releasing a host of new features for Azure Kubernetes Service (AKS) aimed at making Kubernetes adoption easier and more accessible to a greater number of teams.  \n ","introduction":"","metrics":{"__typename":"MessageMetrics","views":10290},"postTime":"2024-05-21T08:30:00.256-07:00","lastPublishTime":"2024-05-24T20:18:54.773-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" At Microsoft Build 2024, we’re releasing a host of new features for Azure Kubernetes Service (AKS) aimed at making Kubernetes adoption easier and more accessible to a greater number of teams. With a focus on built-in best practices and AI assistance, you no longer need to be a Kubernetes expert to run your workloads on Kubernetes. AKS supports your workloads whether you’re modernizing or building new intelligent applications. \n   \n   \n AKS Automatic \n   \n AKS Automatic, now available in public preview, provides the easiest managed Kubernetes experience for developers, DevOps, and platform engineers. It’s ideal for modern and AI applications, automating AKS cluster setup and management, and embedding best practice configurations. This ensures users of any skill level have security, performance, and dependability for their applications. \n   \n With AKS Automatic, Azure manages the cluster configuration, including nodes, scaling, security, updates, and other preconfigured settings. Automatic clusters are optimized to run most production workloads and provision compute resources based on Kubernetes manifests. The streamlined configuration follows AKS best practices and recommendations for cluster and workload setup, scalability, and security, while still providing flexibility and access to the Kubernetes APIs. AKS Automatic incorporates learnings from Microsoft’s experience running Kubernetes at scale, with Microsoft Teams, Bing, Xbox online services, Microsoft 365, and GitHub Copilot all running on AKS. \n   \n Learn more about AKS Automatic and check out BRK122 at Build to see AKS Automatic in action. Automatic enables developers to be more productive; to see how BMW is empowering its developer teams with AKS and GitHub, check out BRK128. You can also download a copy of our new ebook, Code to cloud with AKS, to learn about building a more productive developer experience. \n   \n   \n AI assisted operations \n   \n With more teams running Kubernetes at scale, the need to manage hundreds to thousands of clusters efficiently becomes a priority. Azure Kubernetes Fleet Manager now helps platform operators schedule their workloads for greater efficiency. To assist platform operators and developers, several new skills are available for AKS in Copilot for Azure. Application auto-instrumentation and Kubernetes Event Driven Autoscaling (KEDA) scaling in Azure portal enhance observability. \n   \n \n Intelligent workload scheduling through resource override for Azure Kubernetes Fleet Manager (Fleet) is now available in public preview. Leveraging Fleet as a centralized, intelligent orchestration engine, users can tailor workload placement by customizing cluster-specific resources and overriding the resources to be propagated from the hub to member clusters. Learn more and see a demo in DEM719. \n Copilot in Azure has added several new skills for AKS to simplify common management tasks, including the ability to configure AKS backups, change pricing tiers, locate YAML files for editing, and how to construct kubectl commands further simplifying users’ Kubernetes experience. \n Auto-instrumentation for Azure Monitor Application Insights is coming soon to AKS. Auto-instrumentation enables Application Insights to make telemetry like metrics, requests, and dependencies available in Application Insights resource. It provides easy access to Application performance monitoring (APM) experiences such as the application dashboard and application map. Auto-instrumentation automatically injects the Azure Monitor OpenTelemetry distro into application pods to generate application monitoring telemetry. The preview will support .NET, Java, and JavaScript (Node.js). Support for Python is coming soon. \n Azure portal now supports KEDA scaling on memory, CPU, cron, and Azure Service Bus scalers in public preview. Users will be able to easily create and monitor scaled objects and jobs within the portal interface. For Azure Service Bus, portal will handle the deployment and configuration of workload identity. This streamlines the creation and management of KEDA resources through the portal interface. \n \n   \n Learn more about these announcements and how H&M is practicing platform engineering with AKS and GitHub in BRK123. BRK188 will show platform engineering best practices enabled by AKS and Microsoft’s developer and security tools. \n   \n   \n Security \n   \n Security continues to be top of mind for teams building and operating cloud-native applications. Security-conscious ops teams can apply and enforce Kubernetes policy best practices at the cluster level, thereby strengthening governance and reliability. Deployment safeguards enforcement mode (now available in preview) will either deny or mutate (automatically fix) your Kubernetes resources based on the individual safeguards applied. A mutation will be triggered if your resources deviate from best practices. To view which safeguards allow for mutations, visit the deployment safeguard documentation. \n   \n The security of containerized environments requires a holistic approach, spanning the entire software supply chain. Defender for Containers, a plan under Microsoft Defender for Cloud, offers a multi-pronged strategy to bolster Kubernetes security, from code repositories to container images, and container security in runtime, providing an extra layer of protection. It offers risk-based posture recommendations, vulnerability assessment and threat protection capabilities for images, containers, and Kubernetes infrastructure, empowering you to secure your AKS environment from code to cloud. And now AKS Automatic customers can take advantage of the advanced security capabilities of Defender for Containers for a free trial of three (3) months. Learn more about Defender for Containers and how to enable this offer. \n   \n In addition to using security tools, container security also requires teams to apply rigorous processes. The Containers Secure Supply Chain (CSSC) framework offers a set of security best practices across the container lifecycle—from acquiring images from public sources to deploying them on AKS. If you want to learn more about securing the supply chain for your containers and AKS workloads with the CSSC framework, see BRK230 at Build. \n   \n   \n Running AI/ML workloads on AKS \n   \n In addition to AI capabilities like Microsoft Copilot that simplify operations, AKS has released features that make it easier to run your AI/ML workloads on the platform. \n   \n Two previous announcements are worth mentioning: node autoprovisioning and the Kubernetes AI toolchain operator add-on, both released at KubeCon Europe 2024 in public preview. Node auto-provisioning efficiently allocates infrastructure for a workload by provisioning the right sized virtual machines (VMs). This greatly reduces the burden of designing node pool configuration before workloads are deployed. The Kubernetes AI toolchain operator (KAITO) is an open-source project also available as an AKS add-on. The KAITO add-on for AKS enables running specialized machine learning workloads like LLMs on more cost-effectively and with less manual configuration. \n   \n For many, customers, the easiest way to incorporate AI into their workloads is through hosted services like Azure AI Services. Service Connector greatly simplifies the connection configuration experience for AKS workloads and Azure services, including Azure OpenAI Service. Service Connector takes care of authentication and network configuration securely and follows Azure recommended practices, so you can focus on your application code without worrying about your infrastructure connectivity. Learn more about Service Connector and AKS. \n   \n If you’re attending Build in person, be sure to attend LAB303 on building intelligent apps on AKS that connect to Azure OpenAI Service. \n   \n   \n AKS at Microsoft Build \n   \n With these new announcements, AKS continues to innovate and lead in the Kubernetes space, making it easier for users of all skill levels to adopt and use Kubernetes effectively. We look forward to seeing you during Build, either virtually or in-person! \n   \n \n \n \n \n Session Code \n \n \n Session Title \n \n \n Date and time \n \n \n Streamed and recorded \n \n \n \n \n BRK121 \n \n \n TomTom brings AI-powered, talking cars to life with Azure \n \n \n ·      Wednesday, May 22 | 2:15 PM - 3:00 PM PDT \n \n \n Yes \n \n \n \n \n BRK122 \n \n \n Build and scale modern apps with Azure Kubernetes Service (AKS) \n \n \n ·      Wednesday, May 22 | 10:30 AM - 11:15 AM PDT \n \n \n Yes \n \n \n \n \n BRK123 \n \n \n Leverage AKS for your enterprise platform: H&M’s journey \n \n \n ·      Thursday, May 23 | 9:45 AM - 10:30 AM PDT \n \n \n Yes \n \n \n \n \n BRK128 \n \n \n Building a connected vehicle and app experience with BMW and Azure \n \n \n ·      Tuesday, May 21 | 11:30 AM - 12:15 PM PDT \n \n \n Yes \n \n \n \n \n BRK188 \n \n \n Platform Engineering: Creating Scalable and Resilient Systems \n \n \n ·      Tuesday, May 21 | 4:45 PM - 5:30 PM PDT \n \n \n Yes \n \n \n \n \n BRK230 \n \n \n Securing the Containers’ Supply Chain for Azure Kubernetes Service \n \n \n ·      Wednesday, May 22 | 3:30 PM - 4:15 PM PDT \n \n \n Yes \n \n \n \n \n DEM719 \n \n \n Intelligent Workload Scheduling with Azure Kubernetes Fleet Manager \n \n \n ·      Wednesday, May 22 | 6:15 PM - 6:30 PM PDT \n ·      Thursday, May 23 | 4:30 PM - 4:45 PM PDT \n \n \n No \n \n \n \n \n LAB303 \n \n \n Build and run intelligent apps with AKS and Azure OpenAI Service \n \n \n ·      Tuesday, May 21 | 3:30 PM - 4:30 PM PDT \n ·      Wednesday, May 22 | 3:30 PM - 4:30 PM PDT \n ·      Thursday, May 23 | 12:30 PM - 1:30 PM PDT \n \n \n No \n \n \n \n \n   ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"10033","kudosSumWeight":6,"repliesCount":1,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTQ2NzAxLTU4Mzg5NWk0RUE0QUIwNEMzNjQ3MTQx?revision=6\"}"}}],"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":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"Conversation:conversation:3913345":{"__typename":"Conversation","id":"conversation:3913345","topic":{"__typename":"BlogTopicMessage","uid":3913345},"lastPostingActivityTime":"2024-07-20T21:24:43.257-07:00","solved":false},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTEzMzQ1LTUwMjk5M2lBM0Y3MTRCQUIyRkY4Q0Q4?revision=12\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTEzMzQ1LTUwMjk5M2lBM0Y3MTRCQUIyRkY4Q0Q4?revision=12","title":"aca-cover.png","associationType":"TEASER","width":1280,"height":720,"altText":null},"BlogTopicMessage:message:3913345":{"__typename":"BlogTopicMessage","subject":"Generally available: Azure Container Apps workload profiles, more networking features, and jobs","conversation":{"__ref":"Conversation:conversation:3913345"},"id":"message:3913345","revisionNum":12,"uid":3913345,"depth":0,"board":{"__ref":"Blog:board:AppsonAzureBlog"},"author":{"__ref":"User:user:185703"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" \n Announcing the general availability of workload profiles, Dedicated plan, additional networking features, and jobs in Azure Container Apps. ","introduction":"","metrics":{"__typename":"MessageMetrics","views":13290},"postTime":"2023-08-30T09:00:00.030-07:00","lastPublishTime":"2023-08-31T10:36:25.286-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Azure Container Apps is a service that enables you to deploy and run containerized applications and microservices without having to manage the underlying infrastructure. Today, we're excited to announce the general availability of the following features in Azure Container Apps:  \n   \n \n Workload profiles environment – supports apps in Consumption and Dedicated plans across workload profiles within the same Azure Container Apps environment.  \n Dedicated plan – option to run your apps on dedicated compute resources and select from a range of compute sizes and types up to 32 vCPUs and 256 GiB of memory.  \n Additional networking features – support for user defined routes (UDR), smaller subnet sizes, and network address translation (NAT) gateway.  \n Jobs – ability to run containerized jobs on demand, on a schedule, or in response to events.  \n \n   \n These join other generally available features previously announced in August, including:  \n \n Built-in support for CORS (Cross-Origin Resource Sharing)  \n Init containers  \n Secrets volume mounts  \n Session affinity for single-revision HTTP apps  \n \n   \n In addition, the following features are now in public preview:  \n \n Environment level network encryption with mTLS  \n Additional TCP ports  \n \n   \n Consumption and Dedicated Workload Profiles  \n   \n Workload profiles are designed to optimize spend and performance for microservices by selecting either serverless Consumption compute or customized Dedicated compute. Workload profiles determine the amount of compute and memory resources available to your apps in an Azure Container Apps environment. You can have multiple workload profiles of varying sizes within the same Azure Container Apps environment and select the optimal compute size for each of your applications’ resource requirements. This is ideal for developers when deploying a microservice solution. \n   \n A Consumption workload profile is available by default and provides serverless scale all the way to zero, and bills only for resources your apps use.  \n Dedicated workload profiles provide dedicated compute resources for your apps and are ideal for running apps that require more compute and/or memory resources as you can select from a range of compute sizes and types up to 32 vCPUs and 256 GiB of memory. Apps running in these dedicated workload profiles use the new Dedicated pricing plan which bills per compute instance and provides better cost predictability. \n   \n To learn more about the Dedicated plan and workload profiles, see: \n \n Azure Container Apps plan types \n Workload profiles in Azure Container Apps \n Create a workload profiles environment with the Azure CLI \n Create a workload profiles environment in the Azure portal \n \n   \n Additional networking features  \n   \n By selecting the workload profiles environment type, you also gain access to additional networking features. These features are available to you regardless of which workload profile and plan type you select, and both the Consumption and Dedicated plans are supported.   \n You can now configure user defined routes (UDR) with the workload profiles environment type. UDRs control the routing of network traffic from your container apps to other resources in your virtual network such as Azure Firewall or other network appliances. Use UDR with Azure Firewall to restrict the outbound traffic from your container apps. \n   \n Workload profiles environments also have a minimum subnet size of /27. The minimum subnet size for Consumption-only environments is /23. The smaller required address space for your virtual network integration allows for greater flexibility when configuring your Azure network.  \n In addition, network address translation (NAT) gateways are also supported with workload profiles environments. Configure NAT Gateway with your container apps to set a static outbound IP address. \n   \n To learn more about UDR, smaller subnets, and NAT Gateway with Azure Container Apps, see: \n \n User Defined Routes in Azure Container Apps \n Container Apps outbound traffic control with Azure Firewall \n Subnets in Azure Container Apps \n NAT Gateway in Azure Container Apps   \n \n Jobs  \n   \n Jobs allow you to run containerized, run-to-completion tasks in an Azure Container Apps environment. They support three trigger types:  \n   \n \n Manual – A job can be triggered on demand by a user or application.  \n Schedule – A job can be scheduled to run on a recurring basis.  \n Event – A job can be triggered in response to an event, such as a message being added to a queue. You can also use it to run build agents for your CI/CD pipelines.  \n \n   \n Jobs run in the same environment as your container apps. This allows jobs and apps to share the same resources such as networking and storage. They support both the Consumption and Dedicated plans.  \n   \n Since public preview in May, the jobs feature has added support for volume mounts, init containers, Key Vault secrets references, and more. As of this week, you can now create, manage, and monitor jobs in the Azure portal.  \n   \n To learn about jobs, see the Azure Container Apps jobs documentation and deploy your first job.  \n   \n Join us on the next live stream \n   \n We'll talk about and demo the new announcements on the next live stream on September 5 (11:00 PDT / 14:00 EDT / 18:00 UTC). Don't miss it! \n   \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"5593","kudosSumWeight":6,"repliesCount":4,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuM3wyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTEzMzQ1LTUwMjk5M2lBM0Y3MTRCQUIyRkY4Q0Q4?revision=12\"}"}}],"totalCount":1,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[{"__typename":"VideoEdge","cursor":"MHxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXp0OVpTa21oeWRVfDB8MjU7MjV8fA","node":{"__typename":"AssociatedVideo","videoTag":{"__typename":"VideoTag","vid":"https://www.youtube.com/watch?v=zt9ZSkmhydU","thumbnail":"https://i.ytimg.com/vi/zt9ZSkmhydU/hqdefault.jpg","uploading":false,"height":113,"width":200,"title":null},"videoAssociationType":"INLINE_BODY"}}],"totalCount":1,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"coverImage":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""}},"CachedAsset:text:en_US-components/community/Navbar-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1750268614987","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1750268614987","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1750268614987","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1750268614987","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1750268614987","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1750268614987","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1750268614987","value":{"errorMessage":"Error rendering component id: {customComponentId}","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-components/messages/MessageListTabs-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1750268614987","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1750268614987","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1750268614987","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1750268614987","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1750268614987","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1750268614987","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1750268614987","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-1750268614987":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1750268614987","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"messages.widget.messagelistfornodebyrecentactivitywidget-tab-main-messages-list-for-tag-widget-0":"mostKudoed","nodeId":"board:AppsonAzureBlog","tagName":"containers"},"buildId":"cQon2PUqbQU8la6pXifn2","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","./components/customComponent/CustomComponentContent/HtmlContent.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","./components/customComponent/CustomComponentContent/CustomComponentScripts.tsx"],"appGip":true,"scriptLoader":[{"id":"analytics","src":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/pagescripts/1730819800000/analytics.js?page.id=TagPage","strategy":"afterInteractive"}]}
OSZAR »