

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS 网关-物联网
<a name="aws-apigateway-iot"></a>

![](https://docs.aws.amazon.com/zh_cn/solutions/latest/constructs/images/experimental.png)


 所有类都处于积极开发之中，并且在任何未来版本中都会受到非向后兼容的更改或删除。这些不受[语义版本控制](https://semver.org/)模型。这意味着，虽然您可以使用它们，但在升级到此软件包的较新版本时，您可能需要更新源代码。

**注意：** 为确保正确的功能，您项目中的 AWS 解决方案构造软件包和 AWS CDK 包必须是相同的版本。


|  **语言**  |  **程序包**  | 
| --- | --- | 
|  ![](https://docs.aws.amazon.com/zh_cn/solutions/latest/constructs/images/python.png) Python  |  aws\_solutions\_constructs.aws\_apigateway\_iot  | 
|  ![](https://docs.aws.amazon.com/zh_cn/solutions/latest/constructs/images/typescript.png) TypeScript  |  @aws-solutions-constructs/aws-apigateway-iot  | 
|  ![](https://docs.aws.amazon.com/zh_cn/solutions/latest/constructs/images/java.png) Java  |  software.amazon.awsconstructs.services.apigatewayiot  | 

## Overview
<a name="overview-32"></a>

 此 AWS 解决方案构造实现了连接到 AWS IoT 模式的 Amazon API Gateway REST API。

 此构造可在 API Gateway 和 AWS IoT 之间创建可扩展的 HTTPS 代理。当希望允许不支持 MQTT 或 MQT/WebSocket 协议的旧式设备与 AWS IoT 平台进行交互时，这会很方便。

 此实现允许在给定的 MQTT 主题上发布只写消息，并且还支持 HTTPS 设备的卷影更新以允许设备注册表中的内容。它不涉及用于代理消息的 Lambda 函数，而是依赖于直接 API Gateway 到 AWS IoT 集成，该网关支持 JSON 消息和二进制消息。

 以下是 TypeScript 中的最小可部署模式定义：

```
import { ApiGatewayToIot } from '@aws-solutions-constructs/aws-apigateway-iot';

new ApiGatewayToIot(this, 'ApiGatewayToIotPattern', {
    iotEndpoint: 'a1234567890123-ats'
});
```

## Initializer
<a name="initializer-32"></a>

```
new ApiGatewayToIot(scope: Construct, id: string, props: ApiGatewayToIotProps);
```

 *参数* 
+  scope[`Construct`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_core.Construct.html) 
+  id`string` 
+  props[`ApiGatewayToIotProps`](#pattern-construct-props-32) 

## 模式构建道具
<a name="pattern-construct-props-32"></a>


|  **名称**  |  **类型**  |  **描述**  | 
| --- | --- | --- | 
|  物联网点  |  string  |  用于集成 API Gateway 的 AWS IoT 终端节点子域（例如， | 
|  养蜂网关创建密钥？  |  boolean  |  如果设置为true时，将创建 API 密钥并与 UsagePlan 相关联。用户在访问 RestApi 时应该指定 “X-api 键” 标头。默认值设置为false。 | 
|  网关执行角色？  |  [`iam.Role`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-iam.Role.html)  |  API Gateway 用于访问 AWS IoT 的 IAM 角色。如果未指定，则会创建一个默认角色，并使用通配符 ('\*') 访问所有主题和内容。 | 
|  养蜂网关道具？  |  [`api.restApiProps`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-apigateway.RestApiProps.html)  |  用户提供的可选道具，用于覆盖 API Gateway REST API 的默认道具。 | 
|  日志组道具？  |  [`logs.LogGroupProps`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-logs.LogGroupProps.html)  |  可选的用户提供的道具，用于覆盖 CloudWatch Logs 日志组的默认道具。 | 

## 模式属性
<a name="pattern-properties-32"></a>


|  **名称**  |  **类型**  |  **描述**  | 
| --- | --- | --- | 
|  APIGateway  |  [`api.RestApi`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-apigateway.RestApi.html)  |  返回由模式创建的 API Gateway REST API 的实例。 | 
|  网关云监视角色  |  [`iam.Role`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-iam.Role.html)  |  返回由模式创建的 IAM 角色的实例，该模式允许从 API Gateway REST API 访问日志记录到 CloudWatch。 | 
|  网关日志组  |  [`logs.LogGroup`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-logs.LogGroup.html)  |  返回由 API Gateway REST API 访问日志发送到的模式创建的日志组的实例。 | 
|  养蜂网关角色  |  [`iam.Role`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-iam.Role.html)  |  返回由 API Gateway REST API 模式创建的 IAM 角色的实例。 | 

## 默认设置
<a name="default-settings-32"></a>

 没有任何覆盖的此模式的开箱即用实现将设置以下默认值：

### Amazon API Gateway
<a name="amazon-api-gateway-32"></a>
+  部署边缘优化的 API 终端 
+  创建 API 资源`POST`将消息发布到 IoT 主题的方法 
+  创建 API 资源`POST`将消息发布到的方法`ThingShadow`和`NamedShadows` 
+  为 API Gateway 启用 CloudWatch 日志 
+  为 API Gateway 配置 IAM 角色，可访问所有主题和内容 
+  将所有 API 方法的默认授权类型设置为 IAM 
+  启用 X-Ray 跟踪 
+  创建 UsagePlan 并将`prod`stage 

 以下是 API Gateway 在部署构造后公开的不同资源和方法的说明。请参阅[示例](#examples-32)部分，获取有关如何使用轻松测试这些终端的更多信息`curl`。


|  **方法**  |  **资源**  |  **查询参数**  |  **返回代码**  |  **描述**  | 
| --- | --- | --- | --- | --- | 
|  POST  |  /message/<topics>  |  qos  |  200/403/500  |  通过调用此终端节点，您需要传递要发布的主题（例如/message/device/foo`）。 | 
|  POST  |  /shadow/<thingName>  |  无  |  200/403/500  |  这条路由允许更新一个事物的影子文档，因为它thingName使用未命名的（经典）影子类型。身体必须符合标准的影子结构，包括state节点和关联desired和reported节点。请参阅[更新设备影子](#updating-device-shadows-32)节中的示例。 | 
|  POST  |  /shadow/<thingName>/<shadowName>  |  无  |  200/403/500  |  这条路由允许更新某个事物的命名影子文档，因为它thingName和shadowName使用命名阴影类型。身体必须符合标准的影子结构，包括state节点和关联desired和reported节点。请参阅[更新命名的影子](#updating-named-shadows-32)节中的示例。 | 

## Architecture
<a name="w23aab9c23c21"></a>

![](https://docs.aws.amazon.com/zh_cn/solutions/latest/constructs/images/aws-apigateway-iot.png)


## Examples
<a name="examples-32"></a>

以下示例仅适用于`API_KEY`身份验证类型，因为 IAM 授权也需要指定一个 sigv4 令牌，所以请确保`apiGatewayCreateApiKey`属性设置为`true`，否则下面的示例将无法正常工作。

### 发布消息
<a name="publishing-a-message-32"></a>

您可以使用`curl`使用 HTTPS API 发布有关不同 MQTT 主题的消息。下面的示例将在`device/foo`主题。

```
curl -XPOST https://<stage-id>.execute-api.<region>.amazonaws.com/prod/message/device/foo -H "x-api-key: <api-key>" -H "Content-Type: application/json" -d '{"Hello": "World"}'
```

注意：将替换为`stage-id`、`region`, 和`api-key`参数与您的部署值一起使用。

您可以在 URL 中链接主题名称，API 接受最多 7 个可以发布的子主题。例如，以下示例将在主题上发布消息`device/foo/bar/abc/xyz`。

```
curl -XPOST https://<stage-id>.execute-api.<region>.amazonaws.com/prod/message/device/foo/bar/abc/xyz -H "x-api-key: <api-key>" -H "Content-Type: application/json" -d '{"Hello": "World"}'
```

### 更新设备影子
<a name="updating-device-shadows-32"></a>

要更新与给定事物关联的影子文档，您可以使用事物名称发出影子状态请求。有关如何更新事物影子的以下示例。

```
curl -XPOST https://<stage-id>.execute-api.<region>.amazonaws.com/prod/shadow/device1 -H "x-api-key: <api-key>" -H "Content-Type: application/json" -d '{"state": {"desired": { "Hello": "World" }}}'
```

### 更新命名的影子
<a name="updating-named-shadows-32"></a>

要更新与给定事物的命名影子关联的影子文档，您可以使用事物名称和影子名称发出影子状态请求。请参阅以下示例，了解如何更新命名阴影。

```
curl -XPOST https://<stage-id>.execute-api.<region>.amazonaws.com/prod/shadow/device1/shadow1 -H "x-api-key: <api-key>" -H "Content-Type: application/json" -d '{"state": {"desired": { "Hello": "World" }}}'
```

### 发送二进制负载
<a name="sending-binary-payloads-32"></a>

可以将二进制负载发送到代理 API，直至 AWS IoT 服务。在以下示例中，我们将向发送`README.md`文件（被视为二进制数据）到`device/foo`主题使用`application/octet-stream`内容类型。

```
curl -XPOST https://<stage-id>.execute-api.<region>.amazonaws.com/prod/message/device/foo/bar/baz/qux -H "x-api-key: <api-key>" -H "Content-Type: application/octet-stream" --data-binary @README.md
```

 注意：在此项目的目录中执行此命令。然后，您可以测试从文件系统发送其他类型的二进制文件。

## GitHub
<a name="github-32"></a>


<table>
<thead>
  <tr><th colspan="2"> <b>要查看此模式的代码、创建/查看问题和拉取请求等，请执行以下操作：</b> </th></tr>
</thead>
<tbody>
  <tr><td> <img src="https://docs.aws.amazon.com/zh_cn/solutions/latest/constructs/images/GitHub-Mark-32px.png" alt="" /> </td><td> <a href="https://github.com/awslabs/aws-solutions-constructs/tree/master/source/patterns/%40aws-solutions-constructs/aws-apigateway-iot">@aws-解决方案结构/AWS-网关-物联网</a> </td></tr>
</tbody>
</table>
