

# 通过 AWS Marketplace 销售 API Gateway API
<a name="sell-api-as-saas-on-aws-marketplace"></a>

构建、测试和部署 API 后，您可以将其打包到 API Gateway [usage plan](api-gateway-api-usage-plans.md)（使用计划）中，并通过 AWS Marketplace 将该计划作为软件即服务 (SaaS) 产品进行销售。AWS Marketplace 根据向使用计划发出的请求数量，对订阅您的产品/服务的 API 买家进行计费。

要在 AWS Marketplace 上销售 API，您必须设置销售渠道以将 AWS Marketplace 与 API Gateway 集成。一般而言，这涉及在 AWS Marketplace 上列出您的产品，使用适当的策略设置 IAM 角色以允许 API Gateway 向 AWS Marketplace 发送用量指标，将 AWS Marketplace 产品与 API Gateway 使用计划进行关联，以及将 AWS Marketplace 买家与 API Gateway API 密钥进行关联。以下各节讨论了相关详细信息。

有关在 AWS Marketplace 上将您的 API 作为 SaaS 产品进行销售的更多信息，请参阅 [AWS Marketplace 用户指南](https://docs.aws.amazon.com/marketplace/latest/userguide/)。

**Topics**
+ [初始化 AWS Marketplace 与 API Gateway 的集成](#sell-api-as-saas-on-aws-marketplace-initial-setup)
+ [处理使用计划的客户订阅](#sell-api-as-saas-on-aws-marketplace-subscription-unsubscription)

## 初始化 AWS Marketplace 与 API Gateway 的集成
<a name="sell-api-as-saas-on-aws-marketplace-initial-setup"></a>

以下任务是为了一次性初始化 AWS Marketplace 与 API Gateway 的集成，以便您将 API 作为 SaaS 产品进行销售。

### 在 中列出产品AWS Marketplace
<a name="sell-api-as-saas-on-aws-marketplace-inital-setup-list-product"></a>

要将您的使用计划作为 SaaS 产品列出，请通过 [AWS Marketplace](https://aws.amazon.com/marketplace/partners/management-tour) 提交产品加载表单。产品必须包含 `apigateway` 类型且名为 `requests` 的维度。此维度定义基于请求的定价，并由 API Gateway 用于计量对您的 API 提出的请求。

### 创建计量角色
<a name="sell-api-as-saas-on-aws-marketplace-inital-setup-create-metering-role"></a>

使用以下执行策略和信任策略，创建一个名为 `ApiGatewayMarketplaceMeteringRole` 的 IAM 角色。此角色允许 API 代表您向 AWS Marketplace 发送用量指标。

#### 计量角色的执行策略
<a name="sell-api-as-saas-on-aws-marketplace-inital-setup-create-metering-role-execution-policy"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "aws-marketplace:BatchMeterUsage",
        "aws-marketplace:ResolveCustomer"
      ],
      "Resource": "*",
      "Effect": "Allow"
    }
  ]
}
```

------

#### 计量角色的可信关系策略
<a name="sell-api-as-saas-on-aws-marketplace-inital-setup-create-metering-role-trusted-policy"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

### 将使用计划与 AWS Marketplace 产品关联
<a name="sell-api-as-saas-on-aws-marketplace-associate-usage-plan-with-saas-product"></a>

在 AWS Marketplace 上列出产品时，您会收到一个 AWS Marketplace 产品代码。要将 API Gateway 与 AWS Marketplace 集成，请将您的使用计划与 ‭AWS Marketplace 产品代码关联。您可以通过使用 API Gateway 控制台、API Gateway REST API、适用于 API Gateway 的 AWS CLI 或适用于 API Gateway 的 AWS SDK，将 API Gateway `UsagePlan` 的 [https://docs.aws.amazon.com/apigateway/latest/api/API_UsagePlan.html#productCode](https://docs.aws.amazon.com/apigateway/latest/api/API_UsagePlan.html#productCode) 字段设置为 AWS Marketplace 产品代码来启用关联。以下代码示例使用 API Gateway REST API：

```
PATCH /usageplans/{{USAGE_PLAN_ID}}
Host: apigateway.{{region}}.amazonaws.com
Authorization: ...

{
    "patchOperations" : [{
        "path" : "/productCode",
        "value" : "{{MARKETPLACE_PRODUCT_CODE}}",
        "op" : "replace"
    }]
}
```

## 处理使用计划的客户订阅
<a name="sell-api-as-saas-on-aws-marketplace-subscription-unsubscription"></a>

以下任务由您的开发人员门户应用程序处理。

当客户通过 AWS Marketplace 订阅您的产品时，AWS Marketplace 会将 `POST` 请求转发至 SaaS 订阅您在 AWS Marketplace 中上架产品时注册的 URL。`POST` 请求附带一个包含买家信息的 `x-amzn-marketplace-token` 参数。按照 [SaaS 客户登记](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-product-customer-setup.html#in-your-application)中的说明在您的开发人员门户应用程序中处理此重定向。

作为对客户订阅请求的响应，AWS Marketplace 会向您可以订阅的 Amazon SNS 主题发送 `subscribe-success` 通知。（请参阅 [SaaS 客户登记](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-product-customer-setup.html#in-your-application)）。要接受客户订阅请求，您应创建或检索客户的 API Gateway API 密钥，将客户的 AWS Marketplace 预置 `customerId` 与 API 密钥进行关联，然后将该 API 密钥添加到您的使用计划中，以此来处理 `subscribe-success` 通知。

当客户的订阅请求完成后，开发人员门户应用程序应向客户展示关联的 API 密钥，并告知客户该 API 密钥必须包含在对 API 提出的请求的 `x-api-key` 标头中。

如果客户取消对使用计划的订阅，AWS Marketplace 会向 SNS 主题发送 `unsubscribe-success` 通知。要完成客户取消订阅的过程，应通过从使用计划中删除客户的 API 密钥来处理 `unsubscribe-success` 通知。

### 授权客户访问使用计划
<a name="sell-api-as-saas-on-aws-marketplace-subscription-unsubscription-authorize-access-to-usage-plan"></a>

要授权给定客户访问您的使用计划，请使用 API Gateway API 为该客户获取或创建 API 密钥，然后将该 API 密钥添加到使用计划中。

以下示例介绍了如何调用 API Gateway REST API 以创建具有特定 AWS Marketplace `customerId` 值 ({{MARKETPLACE\_CUSTOMER\_ID}}) 的新 API 密钥。

```
POST apikeys HTTP/1.1
Host: apigateway.{{region}}.amazonaws.com
Authorization: ...

{
  "name" : "my_api_key",
  "description" : "My API key",
  "enabled" : "false",
  "stageKeys" : [ {
    "restApiId" : "uycll6xg9a",
    "stageName" : "prod"
  } ],
  "customerId" : "{{MARKETPLACE_CUSTOMER_ID}}"
}
```

以下示例介绍了如何获取具有特定 AWS Marketplace `customerId` 值 ({{MARKETPLACE\_CUSTOMER\_ID}}) 的 API 密钥。

```
GET apikeys?customerId={{MARKETPLACE_CUSTOMER_ID}} HTTP/1.1
Host: apigateway.{{region}}.amazonaws.com
Authorization: ...
```

要向使用计划添加 API 密钥，请通过相关使用计划的 API 密钥创建一个 [https://docs.aws.amazon.com/apigateway/latest/api/API_UsagePlanKey.html](https://docs.aws.amazon.com/apigateway/latest/api/API_UsagePlanKey.html)。以下示例介绍如何使用 API Gateway REST API 完成此操作，其中 `n371pt` 是使用计划 ID，`q5ugs7qjjh` 是从之前的示例返回的示例 API `keyId`。

```
POST /usageplans/n371pt/keys HTTP/1.1
Host: apigateway.{{region}}.amazonaws.com
Authorization: ...

{
    "keyId": "q5ugs7qjjh",
    "keyType": "API_KEY"
}
```

### 将客户与 API 密钥关联
<a name="sell-api-as-saas-on-aws-marketplace-subscription-unsubscription-associate-marketplace"></a>

必须将 [https://docs.aws.amazon.com/apigateway/latest/api/API_ApiKey.html](https://docs.aws.amazon.com/apigateway/latest/api/API_ApiKey.html) 的 `customerId` 字段更新为客户的 AWS Marketplace 客户 ID。这可将 API 密钥与 AWS Marketplace 客户关联，从而可对买家进行计量和计费。以下代码示例调用 API Gateway REST API 来执行此操作。

```
PATCH /apikeys/q5ugs7qjjh
Host: apigateway.{{region}}.amazonaws.com
Authorization: ...
        
{
    "patchOperations" : [{
        "path" : "/customerId",
        "value" : "{{MARKETPLACE_CUSTOMER_ID}}",
        "op" : "replace"
    }]
}
```