在亚马逊云科技 Marketplace 上的 SaaS 架构设计——如何支持跨多账户对接

亚马逊云科技
Marketplace
Amazon EC2
0
0
{"value":"为了给企业提供更加易用的应用层软件,越来越多的软件提供商推出了SaaS 产品。亚马逊云科技 Marketplace (以下简称 Marketplace)是一个提供甄选的数字化产品的平台,能够帮助SaaS厂商降低销售成本,触达更多的客户,是很多 SaaS 厂商的首选。\n\n通过软件即服务(SaaS)产品,您部署了在亚马逊云科技提供的基础设施上的软件,并允许买家可以直接通过 Marketplace 来使用您的软件。您需要在您的软件中管理客户访问、账户创建、资源配置和账户管理。\n\n在 Marketplace 中上架您基于 SaaS 模式的软件过程中,您需要与 Marketplace SaaS 提供的多个 API 进行对接,具体对接的方式您可以参考 [卖家指南](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-products.html)。\n\n在您的 SaaS 中,建议您将与 Marketplace SaaS API 进行接口集成的部分作为独立模块进行研发和管理,并运行在您的亚马逊云科技账号中。\n\n但因为商务上的诸多因素,很多 Marketplace 的卖家的亚马逊云科技账号与运行 SaaS 系统以及对接模块的亚马逊云科技账号并不是同一个账号,而 Marketplace SaaS API 调用的权限仅会对作为卖家的亚马逊云科技账号打开,那该如何在SaaS架构中安全的获取 Marketplace SaaS API 调用权限呢?\n\n在这篇文章中,我将介绍在多个亚马逊云科技账户中构建 Marketplace SaaS 的 API 对接的最佳实践!\n\n### **概述**\n对于亚马逊云科技 Marketplace 中基于 SaaS 交付的产品中,有多种价格模型可以选择,因为本篇文章中只会涉及接口调用权限的内容,所以在下文中,将以基于订阅的价格模型作为举例。\n\n对 SaaS 订阅的 API、ResolveCustomer 和 BatchMeterUsage 的调用必须由 Marketplace 卖家账户的凭证来进行权限的获取。这并代表着您的 SaaS 代码需要在 Marketplace 卖方账户中运行。在架构设计中,最好的方式是在一个单独的亚马逊云科技账户中管理您的生产代码,并使用跨账户角色和 sts:AssumeRole 来获得临时凭证,然后可以用来调用 Marketplace 的计量 API。\n\n## **案例背景**\n在本文章的举例中,有两个亚马逊云科技的账户:\n\n### **亚马逊云科技 Marketplace 卖家账户**\n\n这是您的企业在亚马逊云科技上注册为卖家的账户。API 调用必须从这个账户的相关权限验证后才能进行。\n\n### **生产代码的亚马逊云科技账户**\n\n这是您的 SaaS 系统所运行的亚马逊云科技账户。\n\n在最佳 SaaS on Marketplace 架构设计中,使用单一的账户还是多账户各有利弊,单一的亚马逊云科技账户作为 Marketplace 账户可以简化管理,并避免了客户在查看 ISV 的产品和服务时出现任何混淆。\n\n但将卖方账户与产品账户分开意味着每个 SaaS 服务都可以有自己的亚马逊账户,这提供了一个良好的安全和管理边界。当一个卖家有多个产品时,可以使用多个 Amazon Web Services 账户来进一步分离各团队的环境。\n\n使用不同的亚马逊云科技 Marketplace 卖家和生产账户的情况下,有2个亚马逊云科技账户在发挥作用。注册为 Marketplace 卖方的 Amazon Web Services 账户(Seller-Account)和生产代码所在的 Amazon Web Services 账户(SaaS-Account)。\n\n## **SaaS 架构设计**\n卖家账户在 Marketplace 上进行了注册并上架了产品,所以该账户有调用计量 API 的权限。这时,卖家需要确认了该账户有调用 Marketplace API 权限后,在该账户创建一个 IAM 角色,在策略配置上允许访问计量 API,以及从生产账户来承接该角色的服务,具体承接角色的服务可以根据您的 Marketplace SaaS API 对接模块的部署方式来决定。\n\n在本文章的例子中,卖方账户中的 IAM 角色被称为 saas-account-role。这有附加的 AWSMarketplaceMeteringFullAccess 管理策略。 IAM 角色有一个信任关系,如下所示。\n\n```\\n{\\n \\"Version\\": \\"2012-10-17\\",\\n \\"Statement\\": [\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Principal\\": {\\n \\"AWS\\": \\"arn:aws:iam:: SaaS-Account:root\\"\\n },\\n \\"Action\\": \\"sts:AssumeRole\\",\\n \\"Condition\\": {\\n \\"StringEquals\\": {\\n \\"sts:ExternalId\\": \\"xxxxxxx\\"\\n }\\n }\\n }\\n ]\\n}\\n```\nSaaS 应用程序以及与 Marketplace API 对接的模块部署在生产账户中。该账户没有权限来调用卖家账号上架的那款产品计量 API。在您的SaaS 架构设计中,应该在这个账号中创建一个 IAM 角色以及策略,本文章中所举的例子中,与 Marketplace API 对接的模块部署在 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)实例中,这时您所创建的角色信任实体应该为 Amazon EC2,并在策略中授予 sts:AssumeRole 的权限,通过 EC2 实例配置文件将该角色附加到运行 SaaS Marketplace API 对接的模块的 EC2 实例。这为该实例提供了临时凭证,可用于签署对亚马逊云科技 API 调用的请求。这些临时凭证用于调用 sts:AssumeRole 方法,该方法从卖方账户返回临时凭证。这些都是用来调用 Marketplace 计量 API 的。\n\n执行 sts:AssumeRole 命令所需的权限是。\n\n```\\n{\\n \\"Version\\": \\"2012-10-17\\",\\n \\"Statement\\": {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": \\"sts:AssumeRole\\",\\n \\"Resource\\": \\"arn:aws:iam:: Seller-Account:role/saas-account-role\\"\\n }\\n}\\n```\n\n为了使 SaaS 应用程序的 Marketplace API 对接的模块能够对 Marketplace 计量 API 进行调用,它必须能获取并承接卖家账户中的角色。这是通过调用 sts:AssumeRole 方法来完成的。如果成功的话,这个调用会返回临时凭证(秘密/访问密钥)。然后,这些凭证可以用来调用计量 API。\n\n下面的代码片段显示了您如何调用 assume_role 函数来获得卖方账户的临时凭证,该片段为 Python 代码,其他语言的代码可以参考不同语言的 API 文档。\n\n```\\nimport boto3\\n\\nsts_client = boto3.client('sts')\\n\\nassumedRoleObject = sts_client.assume_role(\\n RoleArn=\\"arn:aws:iam::Seller-Account:role/saas-account-role \\",\\n RoleSessionName=\\"AssumeRoleSession1\\",\\n ExternalId=\\"xxxxxxx\\")\\n\\ncredentials = assumedRoleObject['Credentials']\\n\\nclient = boto3.client('marketplace-metering','us-east-1', \\n aws_access_key_id = credentials['AccessKeyId'], \\n aws_secret_access_key=credentials['SecretAccessKey'], \\n aws_session_token = credentials['SessionToken'])\\n```\n\n至此,您的应用程序模块初始化的客户端将会具备调用卖家账户的 Marketplace API 权限,您可以根据您卖家账户上架的产品 id,直接进行多个 API 的调用以完成与 Marketplace 的集成。\n\n### **总结**\n该文章中说明了在 SaaS 架构设计中,如何在多账号的背景下安全的获得 Marketplace API 的权限并独立分离卖家账号与 SaaS 应用程序账号,请尽可能的避免直接在卖家账号中创建用户,并将用户的身份凭证以明文的方式永久的配置在您的应用程序中。\n\n### **本篇作者**\n\n![image.png](https://dev-media.amazoncloud.cn/bfd74527a6d5425cb1c0e483d1754783_image.png)\n\n### **张明月**\n合作伙伴解决方案架构师\n\n\n\n\n","render":"<p>为了给企业提供更加易用的应用层软件,越来越多的软件提供商推出了SaaS 产品。亚马逊云科技 Marketplace (以下简称 Marketplace)是一个提供甄选的数字化产品的平台,能够帮助SaaS厂商降低销售成本,触达更多的客户,是很多 SaaS 厂商的首选。</p>\n<p>通过软件即服务(SaaS)产品,您部署了在亚马逊云科技提供的基础设施上的软件,并允许买家可以直接通过 Marketplace 来使用您的软件。您需要在您的软件中管理客户访问、账户创建、资源配置和账户管理。</p>\n<p>在 Marketplace 中上架您基于 SaaS 模式的软件过程中,您需要与 Marketplace SaaS 提供的多个 API 进行对接,具体对接的方式您可以参考 <a href=\\"https://docs.aws.amazon.com/marketplace/latest/userguide/saas-products.html\\" target=\\"_blank\\">卖家指南</a>。</p>\\n<p>在您的 SaaS 中,建议您将与 Marketplace SaaS API 进行接口集成的部分作为独立模块进行研发和管理,并运行在您的亚马逊云科技账号中。</p>\n<p>但因为商务上的诸多因素,很多 Marketplace 的卖家的亚马逊云科技账号与运行 SaaS 系统以及对接模块的亚马逊云科技账号并不是同一个账号,而 Marketplace SaaS API 调用的权限仅会对作为卖家的亚马逊云科技账号打开,那该如何在SaaS架构中安全的获取 Marketplace SaaS API 调用权限呢?</p>\n<p>在这篇文章中,我将介绍在多个亚马逊云科技账户中构建 Marketplace SaaS 的 API 对接的最佳实践!</p>\n<h3><a id=\\"_12\\"></a><strong>概述</strong></h3>\\n<p>对于亚马逊云科技 Marketplace 中基于 SaaS 交付的产品中,有多种价格模型可以选择,因为本篇文章中只会涉及接口调用权限的内容,所以在下文中,将以基于订阅的价格模型作为举例。</p>\n<p>对 SaaS 订阅的 API、ResolveCustomer 和 BatchMeterUsage 的调用必须由 Marketplace 卖家账户的凭证来进行权限的获取。这并代表着您的 SaaS 代码需要在 Marketplace 卖方账户中运行。在架构设计中,最好的方式是在一个单独的亚马逊云科技账户中管理您的生产代码,并使用跨账户角色和 sts:AssumeRole 来获得临时凭证,然后可以用来调用 Marketplace 的计量 API。</p>\n<h2><a id=\\"_17\\"></a><strong>案例背景</strong></h2>\\n<p>在本文章的举例中,有两个亚马逊云科技的账户:</p>\n<h3><a id=\\"_Marketplace__20\\"></a><strong>亚马逊云科技 Marketplace 卖家账户</strong></h3>\\n<p>这是您的企业在亚马逊云科技上注册为卖家的账户。API 调用必须从这个账户的相关权限验证后才能进行。</p>\n<h3><a id=\\"_24\\"></a><strong>生产代码的亚马逊云科技账户</strong></h3>\\n<p>这是您的 SaaS 系统所运行的亚马逊云科技账户。</p>\n<p>在最佳 SaaS on Marketplace 架构设计中,使用单一的账户还是多账户各有利弊,单一的亚马逊云科技账户作为 Marketplace 账户可以简化管理,并避免了客户在查看 ISV 的产品和服务时出现任何混淆。</p>\n<p>但将卖方账户与产品账户分开意味着每个 SaaS 服务都可以有自己的亚马逊账户,这提供了一个良好的安全和管理边界。当一个卖家有多个产品时,可以使用多个 Amazon Web Services 账户来进一步分离各团队的环境。</p>\n<p>使用不同的亚马逊云科技 Marketplace 卖家和生产账户的情况下,有2个亚马逊云科技账户在发挥作用。注册为 Marketplace 卖方的 Amazon Web Services 账户(Seller-Account)和生产代码所在的 Amazon Web Services 账户(SaaS-Account)。</p>\n<h2><a id=\\"SaaS__34\\"></a><strong>SaaS 架构设计</strong></h2>\\n<p>卖家账户在 Marketplace 上进行了注册并上架了产品,所以该账户有调用计量 API 的权限。这时,卖家需要确认了该账户有调用 Marketplace API 权限后,在该账户创建一个 IAM 角色,在策略配置上允许访问计量 API,以及从生产账户来承接该角色的服务,具体承接角色的服务可以根据您的 Marketplace SaaS API 对接模块的部署方式来决定。</p>\n<p>在本文章的例子中,卖方账户中的 IAM 角色被称为 saas-account-role。这有附加的 AWSMarketplaceMeteringFullAccess 管理策略。 IAM 角色有一个信任关系,如下所示。</p>\n<pre><code class=\\"lang-\\">{\\n &quot;Version&quot;: &quot;2012-10-17&quot;,\\n &quot;Statement&quot;: [\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Principal&quot;: {\\n &quot;AWS&quot;: &quot;arn:aws:iam:: SaaS-Account:root&quot;\\n },\\n &quot;Action&quot;: &quot;sts:AssumeRole&quot;,\\n &quot;Condition&quot;: {\\n &quot;StringEquals&quot;: {\\n &quot;sts:ExternalId&quot;: &quot;xxxxxxx&quot;\\n }\\n }\\n }\\n ]\\n}\\n</code></pre>\\n<p>SaaS 应用程序以及与 Marketplace API 对接的模块部署在生产账户中。该账户没有权限来调用卖家账号上架的那款产品计量 API。在您的SaaS 架构设计中,应该在这个账号中创建一个 IAM 角色以及策略,本文章中所举的例子中,与 Marketplace API 对接的模块部署在 Amazon EC2 实例中,这时您所创建的角色信任实体应该为 Amazon EC2,并在策略中授予 sts:AssumeRole 的权限,通过 EC2 实例配置文件将该角色附加到运行 SaaS Marketplace API 对接的模块的 EC2 实例。这为该实例提供了临时凭证,可用于签署对亚马逊云科技 API 调用的请求。这些临时凭证用于调用 sts:AssumeRole 方法,该方法从卖方账户返回临时凭证。这些都是用来调用 Marketplace 计量 API 的。</p>\n<p>执行 sts:AssumeRole 命令所需的权限是。</p>\n<pre><code class=\\"lang-\\">{\\n &quot;Version&quot;: &quot;2012-10-17&quot;,\\n &quot;Statement&quot;: {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: &quot;sts:AssumeRole&quot;,\\n &quot;Resource&quot;: &quot;arn:aws:iam:: Seller-Account:role/saas-account-role&quot;\\n }\\n}\\n</code></pre>\\n<p>为了使 SaaS 应用程序的 Marketplace API 对接的模块能够对 Marketplace 计量 API 进行调用,它必须能获取并承接卖家账户中的角色。这是通过调用 sts:AssumeRole 方法来完成的。如果成功的话,这个调用会返回临时凭证(秘密/访问密钥)。然后,这些凭证可以用来调用计量 API。</p>\n<p>下面的代码片段显示了您如何调用 assume_role 函数来获得卖方账户的临时凭证,该片段为 Python 代码,其他语言的代码可以参考不同语言的 API 文档。</p>\n<pre><code class=\\"lang-\\">import boto3\\n\\nsts_client = boto3.client('sts')\\n\\nassumedRoleObject = sts_client.assume_role(\\n RoleArn=&quot;arn:aws:iam::Seller-Account:role/saas-account-role &quot;,\\n RoleSessionName=&quot;AssumeRoleSession1&quot;,\\n ExternalId=&quot;xxxxxxx&quot;)\\n\\ncredentials = assumedRoleObject['Credentials']\\n\\nclient = boto3.client('marketplace-metering','us-east-1', \\n aws_access_key_id = credentials['AccessKeyId'], \\n aws_secret_access_key=credentials['SecretAccessKey'], \\n aws_session_token = credentials['SessionToken'])\\n</code></pre>\\n<p>至此,您的应用程序模块初始化的客户端将会具备调用卖家账户的 Marketplace API 权限,您可以根据您卖家账户上架的产品 id,直接进行多个 API 的调用以完成与 Marketplace 的集成。</p>\n<h3><a id=\\"_97\\"></a><strong>总结</strong></h3>\\n<p>该文章中说明了在 SaaS 架构设计中,如何在多账号的背景下安全的获得 Marketplace API 的权限并独立分离卖家账号与 SaaS 应用程序账号,请尽可能的避免直接在卖家账号中创建用户,并将用户的身份凭证以明文的方式永久的配置在您的应用程序中。</p>\n<h3><a id=\\"_100\\"></a><strong>本篇作者</strong></h3>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/bfd74527a6d5425cb1c0e483d1754783_image.png\\" alt=\\"image.png\\" /></p>\n<h3><a id=\\"_104\\"></a><strong>张明月</strong></h3>\\n<p>合作伙伴解决方案架构师</p>\n"}
0
目录
关闭