2015年9月16日,星期三

Using Azure 部署槽 to implement dev/test/production ALM for Office 365 apps and SharePoint 加-ins

这是我的第四篇文章 Office 365开发中的挑战–以及如何解决 series. 在里面past, I’ve建议使用 *多* 围绕Office 365 / SharePoint Online进行自定义开发的Office 365租赁-毕竟,通常不需要单独的开发/测试/生产环境’不要在云端消失,只是因为这些’您自己托管的物理环境。但是,这种多重租赁安排有时会带来其他挑战–在之前的文章中,我’ve讨论了开发/测试Office 365环境如何经常使用’具有诸如身份集成和SSO之类的与生产类似的方面,但是自定义应用程序的任何开发也带来了挑战。从根本上来说,这是因为Office 365应用程序和(通常)SharePoint加载项 需要在将使用该应用程序的每个环境中进行注册 –这会带来问题,因为每次注册都会提供不同的客户端密钥和密码,但是您的应用通常只能满足一个要求。 但是,在我们对问题(以及潜在的解决方案)过于深入之前,让’我在我的文章系列中考虑了这一点:

问题–使用多个环境时使用Office 365 API

所以我’m在这里主要关注Office 365应用程序-换句话说,某种使用Office 365 API的应用程序(Web或客户端应用程序)。当然,还有其他类型的应用程序,例如提供商托管的SharePoint加载项– I’由于它们有一些不同的考虑因素,因此在本文结尾处将专门讨论这些内容。

但是Office 365应用正在变得“the new normal” for app development in Office 365, not least because you can step outside of the Office 365 APIs and use good 旧-fashioned SharePoint CSOM/REST APIs if you need to (but 没有 having to use SharePoint应用程序身份验证)。所以,在我看来’s starting to make less sense to create apps which will run in Office 365 as a SharePoint 加-in, rather than just creating an Office 365 app. But back to the story - to be able to read/write data to Office 365, 关键因素是该应用程序已在Office 365租约背后向Azure AD注册’re using.

如果你’不熟悉这一领域,那句话没有’对您来说有意义,请考虑每个Office 365租约背后都有一个Azure订阅。默认情况下,这仅是背景操作,并且仅包含Azure AD目录,该目录用于保存Office 365用户。但是它可以变成一个“full”通过提供信用卡进行Azure订阅– this unlocks the ability to use the 充分 set of other Azure capabilities in this subscription, such as Azure web apps.

现在,如果您的应用程序是一个Web应用程序,并且您希望将其托管在Azure中,则无需将该应用程序本身发布到该Azure订阅中(或从中运行)。但是,必须在此Azure AD中注册该应用程序。一世’我们已经看到很多开发者为此付出了代价–也许是因为他们将应用程序发布到了他们可以访问的Azure订阅中,但实际上这与Office 365之后的Azure实例(尤其是Azure AD目录)没有关系。

因此,我们可以显示这种关系:

所以呢’我们的应用需要在不同的地方注册的问题吗?好吧,除了随之而来的一般开销外,最大的问题是每次注册都会给 不同 客户端ID和密码。但是,Office 365应用程序和SharePoint加载项(由提供商托管)的设计是,客户端ID和密码存储在web.config中– Microsoft’包含在每个应用程序中的s身份验证处理代码在此处查找它们。

假设我们不’不想为每个环境安排一些不同的web.config文件的怪异安排,我们该怎么办?好吧,我想其他一些选择可能是web.config转换或重写Microsoft’s认证/凭证处理代码–但这些都不吸引人。

如果你’将应用程序重新托管在云中后,Azure具有以下一些不错的功能:“deployment slots”在这里可以提供帮助。

Azure 部署槽 –简要介绍

部署槽是Azure Web Apps(以前称为Azure网站)的功能。它们仅在您使用时可用’re using a Standard or Premium pricing plan. 如果你 go into the “Settings”Web应用程序区域中,您可以单击进入“Deployment Slots”然后从这里创建一个插槽:

You might name this 插槽something like “Staging”。您可以选择是否从现有副本复制任何配置“main” 插槽(which is there by default), or not:

对于Office 365应用,这不是’重要的是’有很多配置设置值得担心。使用此过程,您可以在标准计划中最多创建5个部署插槽,在高级计划中最多创建20个部署插槽。– each 插槽effectively gives you an additional “instance”Web应用程序的代码,可以在其他URL上访问。所以对于一个网站 http://mysite.azurewebsites.net,如果您创建两个名为“test” and “staging”, you’最终会得到一组这样的URL:

这是一项很棒的Azure功能,它以一种简单的方式为您的站点提供测试/分段功能。有两个关键方面可以提供有用的支持:

  • 的能力“swap”部署槽的内容–这实际上是您推广网站版本的部署机制’从测试/过渡到生产的s代码
  • Each deployment 插槽can have its own configuration, such as connection strings and AppSettings 价值观

对于配置设置,可以在Azure门户中(或通过Azure API)输入值,然后 当您执行此操作时,这些值将覆盖web.config中指定的任何值-它’我们可以利用此功能来支持Office 365和SharePoint应用程序。 还有一些其他事情需要排队,以便您的应用可以通过Office 365 / SharePoint进行身份验证,但是我’以后再讲。

就使用部署槽而言,您可以使用典型的方式将网站/应用部署到特定的槽“publish to Azure” approaches –从Visual Studio发布,Web Deploy,PowerShell,FTP,从源代码管理发布等等。一旦您’在将您的应用程序部署到临时插槽的时候,可以将此版本的代码推送到生产环境中 交换 the 分期 and 生产 slots –使用Azure门户中的此按钮:

..或 Switch-Azure网站位置 PowerShell命令。这确实是一次交换,实际上是通过简单的DNS更新进行的–因此,如果代码更新一切正常,那么现在您的暂存槽中已有一个过时的代码库。您可以通过简单地覆盖那里的内容并随后直接发布到该广告位来解决此问题,但是’有用的是,您可以使用一种快速,强大的回滚机制来依靠’t go to plan.

你可以阅读 Set up 分期 environments for web apps in Azure App Service to understand more about working with 部署槽 in general, but I want to now discuss them specifically for Office 365 apps and SharePoint 加-ins –与前第一。

Implementing dev/test/production for Office 365/SharePoint apps using 部署槽

现在,我们了解了部署插槽的工作原理,’我们考虑了它们可用于Office 365应用程序和SharePoint加载项的方法。一方面,“插槽特定的配置”强大的功能是因为我们可以使用它为不同的环境指定不同的客户端ID和密码,从而避免了单个web.config文件的问题。但有趣的是,部署插槽还为我们提供了一种拥有应用程序的开发/测试/生产实例的方式, 没有 必须在不同的Office 365 / SharePoint环境中注册它们。让’仔细考虑一下:

仅在Azure方面实施开发/测试/生产

我什么’m suggesting here is that 部署槽 are used to implement dev/test/production PURELY on the Azure side. Using an Office 365 app as an example, 所有 实例s of the app are actually registered with the 生产 仅Office 365环境。这很棒,因为它使我们避免了本系列前面列出的许多问题–诸如开发/测试环境之类的东西遭受不同的配置(例如,身份验证,Office 365计划类型等),用户数量减少,内容/数据质量较低等。现在,我们开始在生产环境中构建并测试我们的应用程序,尤其是针对包含生产Office 365用户的Azure AD目录。但是,我们仍在保持应用程序的开发/测试/生产分离,这需要我们做好发布和维护的工作。我们的应用程序仍然具有可靠的ALM做法,但是它们’在Azure端重新实现–这可以很好地工作,因为’s where the app’的代码和实现是。

排队的细节很少,因为您需要为每个应用注册您的应用“instance”,即使它们全部发生在一个Office 365环境中。但它’很简单,我’很快就会讲这些。

所以,希望我’m证明这是一个不错的选择。但是在我们走得更远之前,它’还值得考虑的事情以及何时可能不合适的注意事项:

But consider if your app can do "dangerous" things in 测试ing!

因此,我们拥有应用程序的dev / 测试 / 生产实例,这些实例可能会或可能不会运行相同版本的代码库(例如,在升级周期中可能会有所不同)。但是所有实例都在与同一个Office 365租用进行通信–这通常是好的,因为使用了相同的Azure AD,但根据应用的用途,它也可能是不好的(或至少需要考虑)。如果您的应用程序可以读写Office 365数据(大概可以),那么请考虑使用它’与Office 365邮件,日历项,任务和OneDrive for Business文件相同的一组 所有 实例s of your app are running against –这是用户’s 生产 数据!显然,如果您的应用程序可以写数据,发送电子邮件或进行其他更改,则需要牢记这一点,尤其是在测试时。同样地,如果您’对SharePoint Online数据执行任何操作(例如,将数据写入列表或库),则存在相同的考虑因素。您可以在应用中实现一些特定的逻辑,但最终“仅在Azure中分离”方法可能不适用于所有情况– you’我需要对你是否做出一些判断’d更好地以其他方式处理ALM。例如,这可能是在您拥有的每个环境中注册您的应用程序并将其发布到单独的Azure Web应用程序。

什么 it looks like – using 部署槽 for dev/test/prod in an Office 365 app

因此,创建一个新的部署槽将为您提供一个新的URL,例如 //mysite-staging.azurewebsites.net,现在它将在Azure门户中列出:

But 在 this point, the 插槽is empty and has no website content:

因此,我们需要将我们的应用程序/网站内容发布到此广告位–使用上述方法之一(例如从Visual Studio发布),或者更好的方法。要是我们’重新使用Visual Studio Online进行源代码控制,它’使用自动化构建将最新的构建部署到特定的部署插槽非常简单–因此您的CI流程始终部署到测试或临时插槽,但是您 手动地 例如,选择何时将其替换为生产。一世’ll show some of this CI approach in a video in a future post - but in the end we just need to ensure our files get published to the 分期 插槽不知何故. HOWEVER, your app will NOT be 充分y working 在 this point! At first glance, however, 所有 looks good and you should see your app is now visible 在 the slot’s URL (N.B. I’m using the 用于ASP.NET MVC的Office 365入门项目 这里):

但是,您的应用此时将无法通过Office 365进行身份验证– it is not known to Azure AD. 如果你 click the “Sign in”链接并输入凭据,您’会得到一个有效地告诉您可以的错误’t sign in – most likely saying “the reply address ‘foo’与为应用程序配置的预期回复地址不匹配[应用程序ID]”, like this:

什么’这是因为正在使用web.config中用于客户端ID和密码的值。在此处找到的ClientID与Azure AD应用程序的注册匹配 生产 插槽– but we’在登台广告位中使用其他网址,因此“回复地址不匹配”错误。另外,那里’进入应用暂存版本的真正方法(在地址栏中输入URL除外)不是真正的方法,因为它没有’不会出现在Office 365我的应用程序页面或应用程序启动器中。因此,我们现在需要做的两件事是:

1. Manually register the 分期 实例 of the app in Azure AD – we’ll specify the 分期 插槽URL for the app’■在此处重定向URL,我们还需要授予适当的权限。

2. 配置 “slot-specific”覆盖Azure中客户端ID和密码的值 –为此,我们从Azure AD中的登台注册获取客户端ID和密码,然后使用Azure门户(或API)针对登台插槽配置这些ID,以覆盖web.config。

We’接下来将更详细地介绍这些步骤,但是在这一点上,我想创建一个简单的图标来区分“我的应用程序”页面中应用程序的暂存版本–这样的事情会做:

clip_image015
我们所有人 ’重新尝试做的是确保稍后可以在“我的应用程序”页面中分辨出哪个应用程序。但是让’现在更详细地进入这两个步骤:

Manually registering the 分期 实例 of the app in Azure AD

如果你’您已经开发了与Office 365 API对话的应用程序,那么您可能熟悉“添加连接的服务..”Visual Studio中的对话框,使您可以在Office 365中注册应用程序并授予权限。在这里,我们需要执行与Visual Studio相同的步骤,但直接在Azure AD中执行。

要注册登台应用程序,我们进入Azure AD(N.B.)的目录区域,“old”在撰写本文时,由于Azure Active Directory在预览门户中尚不可用),因此在“应用程序”区域中,我们单击‘Add’ button:

接下来的几张图片显示了应用程序注册向导中的后续步骤– here we’re supplying some details of our app, and notably, specifying the URL of our 分期 插槽as the sign-on URL:

一旦我们’re through the wizard, our 分期 app is registered in Azure AD:

现在,我们需要对其进行配置:

在“Configure”标签,我们上传了令人惊叹的徽标,更重要的是,获得了Azure为该应用程序注册生成的客户端ID和密码。对于密钥,您需要从下拉列表中选择密钥持续时间,并且当您单击时,代表密钥的字符串将可用。‘Save’。此时,请复制这些值并将其存储在安全的地方 – we’下一步将需要它们:

根据应用程序实际执行的操作,我们还需要向Office 365中的相应数据和服务授予权限。例如,也许它需要读取或写入Exchange Online邮箱和日历,或者工作SharePoint网站和文件:

保存后,注册完成,您的应用程序将显示在“我的应用程序”页面中(如果已分配给当前用户):

但是,如果您此时尝试登录,’ll仍然会显示登录错误:

So, we now need to override the web.config 价值观 to match our 分期 app details.

加 特定于插槽 config for the Client ID and password (key):

现在,我们需要使用我们先前记下的详细信息添加特定于插槽的配置。当然,这必须在* new * Azure门户中完成,因为部署插槽仅在该位置可用J

在里面“Application settings”区域中,我们使用与web.config相同的键名,但对于 价值观 we’重新使用我们之前记下的那些:

现在保存设置,并确保您看到成功通知:

然后’s it –我们的登台应用程序现已在Azure中注册,并且所有内容现在都可以使用。我现在可以成功登录该应用了。

..和应用’的功能正常。例如,它可以读取我的OneDrive for Business文件夹中的文件:

因此,我们有它。现在,我们具有在Azure中运行的不同版本,但所有版本都与生产Office 365租赁挂钩。虽然我’提出了以开发/测试/生产方式使用的部署插槽(也许是最常用的用法),很明显,您可以按照自己喜欢的任何方式使用它们,也可以使用自己喜欢的任何ALM方法。沿着这些思路,其他一些Azure功能也可能会有用,例如“流量路由”。

Azure coolness - Traffic Routing for 部署槽

流量路由是一项功能,可让我将应用程序的一定百分比的流量定向到特定的插槽。在某些情况下这可能很有用– a soft rollout of some new functionality, A/B 测试ing and so on. Essentially I can define what proportion of traffic each 插槽should receive:

流量路由基于Cookie,因此有两种方法可以覆盖核心行为(’允许通过围绕此实现代码来通过任何特定逻辑隔离流量),但是’关于流量路由,可能要说的不多。它’当然是一项功能,在某些情况下可能会有用,因此请记住这一点。让’现在将我们的注意力转移到Office 365 / SharePoint开发的其他方面,以及这里的工作方式。

SharePoint 加-ins (provider-hosted) – what’处理这些吗?

许多相同的注意事项也适用于SharePoint加载项–在这里,该应用已向AppRegNew.aspx注册,然后将客户端ID /秘密添加到SharePoint环境中’s list of “known remote callers”(即AppPrincipals)。显然,如果你’重新使用开发/测试/生产SharePoint环境,则需要在每个环境中注册加载项。但是,对于此类型,还需要考虑其他几件事:

  • 向AppRegNew.aspx注册的另一种方法是使用卖方仪表板。这个*是’t *仅适用于通过商店销售应用程序的应用程序供应商–在内部公司环境中使用它也是很有意义的,因为您必须回避必须在每个不同的环境中注册。 (回到本文的开头部分,’s这个选项使我说SharePoint加载项*通常*需要在不同的环境中注册– i.e. not always :))
  • 如果你 do use AppRegNew.aspx to register your SharePoint add-in, a notable difference compared to Office 365 apps is that 您可以在不同的环境中提供相同的客户端ID /秘密 (因为AppRegNew.aspx表单上的字段是您可以键入的文本框)。但是,即使使用这种方法,也要考虑到’d仍然需要部署不同的应用程序包,因为每个应用程序包将具有不同的重定向URL。
  • 如果你’re hosting your remote components in Azure, 所有 实例s of your app could live in the 相同 Azure subscription, with no worries about the fact that they 所有 share the 相同 Azure Active Directory(与Office 365应用相反)。这是因为Azure AD不’用于SharePoint加载项身份验证– it doesn’进入图片。

概要

Azure部署插槽为Office 365应用程序和SharePoint加载项的开发提供了一些有趣的功能。我们可以实现与同一Office 365租约交谈的应用程序的开发/测试/生产版本的想法可能非常有用,因为它有助于克服开头概述的非生产Office 365环境中的许多挑战。这个系列的–缺少生产数据,缺少完整的用户目录,由于身份验证方法不同而导致的SSO缺失,Yammer Enterprise缺失等。如上所述,您需要考虑此处概述的方法是否适合您的情况。例如,如果您的应用程序可以将数据写入Office 365 / SharePoint,则可能需要小心。

但是,部署槽为应用程序开发提供了一些有用的可能性,并且它们肯定是实现者中的有用工具’s toolbox.