

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

# 直接消息策略示例
<a name="direct-messaging-policy-examples"></a>

使用直接消息需要特定的政策。直接消息使用 SendDirectMessage HTTP API 将消息从发送者传送到由其 MQTT 客户端 ID 标识的单个接收者。本节提供允许常见使用直接消息的策略示例。

**Topics**
+ [向特定客户发送有关特定主题的直接消息的政策](#dm-policy-send-specific)
+ [接收直接消息的政策](#dm-policy-receive)
+ [向任何客户发送有关特定主题的直接消息的政策](#dm-policy-send-any-client)
+ [向任何客户发送有关任何主题的直接消息的政策](#dm-policy-send-any-client-any-topic)

## 向特定客户发送有关特定主题的直接消息的政策
<a name="dm-policy-send-specific"></a>

要使发件人发送直接消息，发件人必须具有将目标客户端 ID 作为资源的`iot:SendDirectMessage`权限。`iot:Topic`条件键（可选）限制发件人可以在哪些主题上发送消息。
+ 对于 SigV4-authenticated 后端服务器，将其添加到 IAM 策略中。
+ 对于 X.509-authenticated 物联网设备，请将其添加到 Amazon IoT Core 策略中。
+ 对于经过自定义授权者身份验证的客户端，Lambda 函数必须返回使用条件密钥向目标客户端资源授予`iot:SendDirectMessage`的策略文档 `iot:Topic`

以下政策允许客户直接`device1`向客户发送`myDevice`有关主题`commands/reboot`和的消息`commands/update`。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iot:SendDirectMessage",
            "Resource": "arn:aws:iot:us-west-2:123456789012:client/myDevice",
            "Condition": {
                "StringEquals": {
                    "iot:Topic": ["commands/reboot", "commands/update"]
                }
            }
        }
    ]
}
```

## 接收直接消息的政策
<a name="dm-policy-receive"></a>

收款人的政策必须`iot:Receive`就该主题给予批准。接收者不需要`iot:Subscribe`许可—— Amazon IoT Core 无需订阅主题即可直接发送消息。接收者可以使用 X.509 客户端证书（Amazon IoT Core 策略）或 SigV4（IAM 策略）进行身份验证。在这两种情况下，接收主题都需要`iot:Receive`权限。

以下策略允许接收者客户端`myDevice`接收有关主题的直接消息，`commands/reboot`以及`commands/update`.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "Resource": "arn:aws:iot:us-west-2:123456789012:topic/commands/reboot"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "Resource": "arn:aws:iot:us-west-2:123456789012:topic/commands/update"
        }
    ]
}
```

以下策略使用通配符允许接收者接收有关`commands/`前缀下任何主题的直接消息。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "Resource": "arn:aws:iot:us-west-2:123456789012:topic/commands/*"
        }
    ]
}
```

**注意**  
接收方必须与其建立 MQTT 连接， Amazon IoT Core 然后才能接收直接消息。对于离线设备，私信不会排队。

## 向任何客户发送有关特定主题的直接消息的政策
<a name="dm-policy-send-any-client"></a>

以下策略允许发件人向任何客户端发送直接消息，但仅限于与`commands/*`前缀匹配的主题发送消息。这对于需要访问任何设备的舰队管理服务很有用，但仅适用于特定的命令主题。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iot:SendDirectMessage",
            "Resource": "arn:aws:iot:us-west-2:123456789012:client/*",
            "Condition": {
                "StringLike": {
                    "iot:Topic": "commands/*"
                }
            }
        }
    ]
}
```

**注意**  
`iot:Topic`条件键支持使用`StringLike`条件运算符进行通配符匹配。

## 向任何客户发送有关任何主题的直接消息的政策
<a name="dm-policy-send-any-client-any-topic"></a>

以下策略允许发件人直接向任何客户发送有关任何主题的消息。这适用于后端服务需要不受限制访问的管理或舰队管理用例。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iot:SendDirectMessage",
            "Resource": "arn:aws:iot:us-west-2:123456789012:client/*",
            "Condition": {
                "StringLike": {
                    "iot:Topic": "*"
                }
            }
        }
    ]
}
```