

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

# 使用 Amazon Kinesis Data Streams 的跨账户跨区域账户级别订阅
<a name="CrossAccountSubscriptions-Kinesis-Account"></a>

创建跨账户订阅时，可以指定单个账户或企业作为发件人。如果指定企业，则此过程允许企业中的所有账户向接收方账户发送日志。

要跨账户共享日志数据，您需要建立日志数据发送者和接收者：
+ **日志数据发送者**-从收件人那里获取目标信息，并让 Lo CloudWatch gs 知道它已准备好将其日志事件发送到指定目标。在本节其余部分的步骤中，显示日志数据发送者的虚构 AWS 账号为 111111111111。

  如果您将在企业中设立多个账户向收件人账户发送日志，则可以创建策略，授予企业中的所有账户向收件人账户发送日志的权限。您仍然必须为每个发件人账户设置单独的订阅筛选条件。
+ **日志数据接收者**-设置封装 Amazon Kinesis Data Streams 流的目标，并 CloudWatch 让日志知道接收者想要接收日志数据。接收者随后与发送者共享与此目标有关的信息。在本节其余部分的步骤中，显示日志数据接收者的虚构 AWS 账号为 999999999999。

要开始接收来自跨账户用户的日志事件，日志数据接收者首先创建 CloudWatch 日志目标。每个目标都包含以下键元素：

**目标名称**  
您要创建的目标的名称。

**目标 ARN**  
您要用作订阅 Feed 目标的 AWS 资源的亚马逊资源名称 (ARN)。

**角色 ARN**  
一个 AWS Identity and Access Management (IAM) 角色，它向 CloudWatch Logs 授予将数据放入所选数据流的必要权限。

**访问策略**  
一个 IAM policy 文档（采用 JSON 格式，使用 IAM policy 语法编写），用于管理有权对您的目标进行写入的用户组。

**注意**  
日志组和目标必须位于同一 AWS 区域。但是，目的地指向的 AWS 资源可以位于不同的区域。在以下部分的示例中，所有特定于区域的资源都是在美国东部（弗吉尼亚北部）创建的。

**Topics**
+ [设置新的跨账户订阅](Cross-Account-Log_Subscription-New-Account.md)
+ [更新现有的跨账户订阅](Cross-Account-Log_Subscription-Update-Account.md)

# 设置新的跨账户订阅
<a name="Cross-Account-Log_Subscription-New-Account"></a>

按照这些部分中所述步骤设置新的跨账户日志订阅。

**Topics**
+ [步骤 1：创建目标](CreateDestination-Account.md)
+ [步骤 2：（仅在使用企业时）创建 IAM 角色](CreateSubscriptionFilter-IAMrole-Account.md)
+ [步骤 3：创建账户级订阅筛选策略](CreateSubscriptionFilter-Account.md)
+ [验证日志事件流](ValidateLogEventFlow-Account.md)
+ [在运行时修改目标成员资格](ModifyDestinationMembership-Account.md)

# 步骤 1：创建目标
<a name="CreateDestination-Account"></a>

**重要**  
此过程中的所有步骤都需要在日志数据接收者账户中完成。

在本示例中，日志数据接收者帐户的 AWS 帐户 ID 为 999999999999，而日志数据发送者 AWS 帐户 ID 为 111111111111。

 此示例使用 RecipientStream名为的 Amazon Kinesis Data Streams 流创建一个目标，以及一个 CloudWatch 允许日志向其写入数据的角色。

创建目标后， CloudWatch Logs 会代表收件人账户向目标发送一条测试消息。当订阅筛选器稍后处于活动状态时，Logs 会代表源账户将 CloudWatch 日志事件发送到目标。

**创建目标**

1. 在收款人账户中，在 Amazon Kinesis Data Streams 中创建目标流。在命令提示符下，输入：

   ```
   aws kinesis create-stream --stream-name "RecipientStream" --shard-count 1
   ```

1. 等到 流变为活动状态。**你可以使用 a **ws kinesis describe-stream** 命令来检查。StreamDescription StreamStatus**财产。此外，请记下 **StreamDescription.streamArn** 的值，因为您稍后会将其传递给 Logs： CloudWatch 

   ```
   aws kinesis describe-stream --stream-name "RecipientStream"
   {
     "StreamDescription": {
       "StreamStatus": "ACTIVE",
       "StreamName": "RecipientStream",
       "StreamARN": "arn:aws:kinesis:us-east-1:999999999999:stream/RecipientStream",
       "Shards": [
         {
           "ShardId": "shardId-000000000000",
           "HashKeyRange": {
             "EndingHashKey": "34028236692093846346337460743176EXAMPLE",
             "StartingHashKey": "0"
           },
           "SequenceNumberRange": {
             "StartingSequenceNumber": "4955113521868881845667950383198145878459135270218EXAMPLE"
           }
         }
       ]
     }
   }
   ```

   您的流可能需要一两分钟才会以活动状态显示。

1. 创建 IAM 角色以授予 CloudWatch Logs 将数据放入您的直播的权限。首先，你需要在文件 **\$1/ TrustPolicyFor cwl** .json 中创建信任策略。使用文本编辑器创建此策略文件，请勿使用 IAM 控制台来创建。

   此策略包括指定 `sourceAccountId` 的 `aws:SourceArn` 全局条件上下文密钥，有助于避免出现混淆代理安全问题。如果您在第一次调用中还不知道源账户 ID，则建议您将目标 ARN 放在源 ARN 字段中。在随后的调用中，应将源 ARN 设置为从第一次调用中收集的实际源 ARN。有关更多信息，请参阅 [混淆代理问题防范](Subscriptions-confused-deputy.md)。

   ```
   {
       "Statement": {
           "Effect": "Allow",
           "Principal": {
               "Service": "logs.amazonaws.com"
           },
           "Condition": {
               "StringLike": {
                   "aws:SourceArn": [
                       "arn:aws:logs:region:sourceAccountId:*",
                       "arn:aws:logs:region:recipientAccountId:*"
                   ]
               }
           },
           "Action": "sts:AssumeRole"
       }
   }
   ```

1. 使用 **aws iam create-role** 命令创建 IAM 角色，并指定信任策略文件。请记下返回的 Role.Arn 值，因为它稍后也会传递给 CloudWatch Logs：

   ```
   aws iam create-role \
   --role-name CWLtoKinesisRole \
   --assume-role-policy-document file://~/TrustPolicyForCWL.json
   
   {
       "Role": {
           "AssumeRolePolicyDocument": {
               "Statement": {
                   "Action": "sts:AssumeRole",
                   "Effect": "Allow",
                   "Condition": {
                       "StringLike": {
                           "aws:SourceArn": [
                               "arn:aws:logs:region:sourceAccountId:*",
                               "arn:aws:logs:region:recipientAccountId:*"
                           ]
                       }
                   },
                   "Principal": {
                       "Service": "logs.amazonaws.com"
                   }
               }
           },
           "RoleId": "AAOIIAH450GAB4HC5F431",
           "CreateDate": "2023-05-29T13:46:29.431Z",
           "RoleName": "CWLtoKinesisRole",
           "Path": "/",
           "Arn": "arn:aws:iam::999999999999:role/CWLtoKinesisRole"
       }
   }
   ```

1. 创建权限策略以定义 CloudWatch 日志可以对您的账户执行哪些操作。首先，使用文本编辑器在文件 **\$1/ PermissionsFor cwl** .json 中创建权限策略：

   ```
   {
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "kinesis:PutRecord",
         "Resource": "arn:aws:kinesis:region:999999999999:stream/RecipientStream"
       }
     ]
   }
   ```

1. 使用 a **w** s iam put-role-policy 命令将权限策略与角色关联：

   ```
   aws iam put-role-policy \
       --role-name CWLtoKinesisRole \
       --policy-name Permissions-Policy-For-CWL \
       --policy-document file://~/PermissionsForCWL.json
   ```

1. 在直播处于活动状态并且您已创建 IAM 角色之后，您可以创建 CloudWatch 日志目标。

   1. 此步骤不会将访问策略与您的目标关联，它只是完成目标创建的两个步骤中的第一个步骤。记下有效载荷中返回的：**DestinationArn**

      ```
      aws logs put-destination \
          --destination-name "testDestination" \
          --target-arn "arn:aws:kinesis:region:999999999999:stream/RecipientStream" \
          --role-arn "arn:aws:iam::999999999999:role/CWLtoKinesisRole"
      
      {
        "DestinationName" : "testDestination",
        "RoleArn" : "arn:aws:iam::999999999999:role/CWLtoKinesisRole",
        "DestinationArn" : "arn:aws:logs:us-east-1:999999999999:destination:testDestination",
        "TargetArn" : "arn:aws:kinesis:us-east-1:999999999999:stream/RecipientStream"
      }
      ```

   1. 在步骤 7a 完成后，在日志数据接收者账户中将访问策略与目标关联。此策略必须指定 **logs: PutSubscriptionFilter** action，并向发件人账户授予访问目标的权限。

      该策略向发送日志的 AWS 账户授予权限。您可以在策略中仅指定这一个账户，如果发件人账户是企业的成员，则策略可以指定企业的企业 ID。这样，您只能创建策略，以允许企业中的多个账户向此目标账户发送日志。

      使用文本编辑器创建名为 `~/AccessPolicy.json` 的文件，并包含下列策略语句之一。

      第一个示例策略允许企业中所有 ID 为 `o-1234567890` 的账户将日志发送到收件人账户。

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "",
                  "Effect": "Allow",
                  "Principal": "*",
                  "Action": [
                      "logs:PutSubscriptionFilter",
                      "logs:PutAccountPolicy"
                  ],
                  "Resource": "arn:aws:logs:us-east-1:999999999999:destination:testDestination",
                  "Condition": {
                      "StringEquals": {
                          "aws:PrincipalOrgID": [
                              "o-1234567890"
                          ]
                      }
                  }
              }
          ]
      }
      ```

------

      下一个示例只允许日志数据发件人账户（111111111111）将日志发送到日志数据收件人账户。

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "",
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "111111111111"
                  },
                  "Action": [
                      "logs:PutSubscriptionFilter",
                      "logs:PutAccountPolicy"
                  ],
                  "Resource": "arn:aws:logs:us-east-1:999999999999:destination:testDestination"
              }
          ]
      }
      ```

------

   1. 将您在上一步中创建的策略附加到目标。

      ```
      aws logs put-destination-policy \
          --destination-name "testDestination" \
          --access-policy file://~/AccessPolicy.json
      ```

      此访问策略允许 AWS 账户中编号为 111111111111 的用户使用 ARN arn: aws: logs:: 999999999999: destination: testDestination: testDest **PutSubscriptionFilter**ination呼叫目的地。*region*任何其他用户试图拨 PutSubscriptionFilter打该目的地的电话都将被拒绝。

      要针对访问策略验证用户的权限，请参阅 *IAM 用户指南*中的[使用策略验证程序](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies_policy-validator.html)。

完成后，如果您使用 AWS Organizations 的是跨账户权限，请按照中的[步骤 2：（仅在使用企业时）创建 IAM 角色](CreateSubscriptionFilter-IAMrole-Account.md)步骤操作。如果您选择直接向另一个账户授予权限而不是使用 Organizations，则可以跳过该步骤然后继续执行 [步骤 3：创建账户级订阅筛选策略](CreateSubscriptionFilter-Account.md)。

# 步骤 2：（仅在使用企业时）创建 IAM 角色
<a name="CreateSubscriptionFilter-IAMrole-Account"></a>

在上一节中，如果您使用向账户 `111111111111` 所在的企业授予权限的访问策略创建了目标，而不是直接向账户 `111111111111` 授予权限，则请按照本节中的步骤操作。否则，您可以跳至 [步骤 3：创建账户级订阅筛选策略](CreateSubscriptionFilter-Account.md)。

本节中的步骤创建一个 IAM 角色，该角色 CloudWatch 可以假设和验证发件人账户是否有权针对收件人目的地创建订阅筛选条件。

在发送者账户中执行本节中的步骤。该角色必须存在于发送者账户中，并且您在订阅筛选器中指定该角色的 ARN。在此示例中，发送者账户为 `111111111111`。

**要创建跨账户日志订阅所需的 IAM 角色，请使用 AWS Organizations**

1. 请在文件 `/TrustPolicyForCWLSubscriptionFilter.json` 中创建以下信任策略。使用文本编辑器创建此策略文件；请勿使用 IAM 控制台来创建。

   ```
   {
     "Statement": {
       "Effect": "Allow",
       "Principal": { "Service": "logs.amazonaws.com" },
       "Action": "sts:AssumeRole"
     }
   }
   ```

1. 创建一个使用此策略的 IAM 角色。记录该命令返回的 `Arn` 值，您需要在本过程的后续部分中使用该值。在此示例中，我们将 `CWLtoSubscriptionFilterRole` 用作我们所创建角色的名称。

   ```
   aws iam create-role \ 
        --role-name CWLtoSubscriptionFilterRole \ 
        --assume-role-policy-document file://~/TrustPolicyForCWLSubscriptionFilter.json
   ```

1. 创建权限策略以定义 CloudWatch Logs 可以对您的账户执行的操作。

   1. 首先，使用文本编辑器在名为 `~/PermissionsForCWLSubscriptionFilter.json` 的文件中创建以下权限策略。

      ```
      { 
          "Statement": [ 
              { 
                  "Effect": "Allow", 
                  "Action": "logs:PutLogEvents", 
                  "Resource": "arn:aws:logs:region:111111111111:log-group:LogGroupOnWhichSubscriptionFilterIsCreated:*" 
              } 
          ] 
      }
      ```

   1. 输入以下命令，以将刚创建的权限策略与您在步骤 2 中创建的角色相关联。

      ```
      aws iam put-role-policy  
          --role-name CWLtoSubscriptionFilterRole  
          --policy-name Permissions-Policy-For-CWL-Subscription-filter 
          --policy-document file://~/PermissionsForCWLSubscriptionFilter.json
      ```

完成后，您可以继续执行 [步骤 3：创建账户级订阅筛选策略](CreateSubscriptionFilter-Account.md)。

# 步骤 3：创建账户级订阅筛选策略
<a name="CreateSubscriptionFilter-Account"></a>

在创建目标后，日志数据接收者账户可与其他 AWS 账户共享目标 ARN（arn:aws:logs:us-east-1:999999999999:destination:testDestination），以便他们将日志事件发送到相同的目标。这些其他的发送账户用户随后会在各自的日志组上针对此目标创建订阅筛选条件。订阅筛选器将立即让实时日志数据开始从所选日志组向指定目标的流动。

**注意**  
如果要向整个组织授予订阅筛选器的权限，则需要使用在 [步骤 2：（仅在使用企业时）创建 IAM 角色](CreateSubscriptionFilter-IAMrole-Account.md) 中创建的 IAM 角色的 ARN。

在以下示例中，在发送账户中创建了一个账户级订阅筛选条件。该筛选条件与发送者账户 `111111111111` 相关联，以便将与筛选条件和选择条件匹配的每个日志事件都传输到前面创建的目标。该目的地封装了一个名为 “” 的流。RecipientStream

`selection-criteria` 字段是可选的，但对于从订阅筛选条件中排除可能导致无限日志递归的日志组非常重要。有关此问题以及确定要排除哪些日志组的更多信息，请参阅 [防止日志递归](Subscriptions-recursion-prevention.md)。目前，NOT IN 是 `selection-criteria` 唯一支持的运算符。

```
aws logs put-account-policy \
    --policy-name "CrossAccountStreamsExamplePolicy" \
    --policy-type "SUBSCRIPTION_FILTER_POLICY" \
    --policy-document '{"DestinationArn":"arn:aws:logs:region:999999999999:destination:testDestination", "FilterPattern": "", "Distribution": "Random"}' \
    --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \
    --scope "ALL"
```

发送者账户的日志组和目标必须位于同一 AWS 区域内。但是，目标可以指向位于不同区域的 AWS 资源，例如 Amazon Kinesis Data Streams 流。

# 验证日志事件流
<a name="ValidateLogEventFlow-Account"></a>

创建账户级订阅筛选策略后，Lo CloudWatch gs 会将所有符合过滤模式和选择标准的传入日志事件转发到封装在名为 “” 的目标流中的流。**RecipientStream**目标所有者可以使用 aws kinesis get-shard-iterator 命令获取 **Amazon Kinesis Data Streams 分**片，然后使用 aws kinesis get-records 命令获取一些 **Amazon Kinesis Data Streams** 记录，从而验证是否发生了这种情况：

```
aws kinesis get-shard-iterator \
      --stream-name RecipientStream \
      --shard-id shardId-000000000000 \
      --shard-iterator-type TRIM_HORIZON

{
    "ShardIterator":
    "AAAAAAAAAAFGU/kLvNggvndHq2UIFOw5PZc6F01s3e3afsSscRM70JSbjIefg2ub07nk1y6CDxYR1UoGHJNP4m4NFUetzfL+wev+e2P4djJg4L9wmXKvQYoE+rMUiFq+p4Cn3IgvqOb5dRA0yybNdRcdzvnC35KQANoHzzahKdRGb9v4scv+3vaq+f+OIK8zM5My8ID+g6rMo7UKWeI4+IWiKEXAMPLE"
}

aws kinesis get-records \
      --limit 10 \
      --shard-iterator
      "AAAAAAAAAAFGU/kLvNggvndHq2UIFOw5PZc6F01s3e3afsSscRM70JSbjIefg2ub07nk1y6CDxYR1UoGHJNP4m4NFUetzfL+wev+e2P4djJg4L9wmXKvQYoE+rMUiFq+p4Cn3IgvqOb5dRA0yybNdRcdzvnC35KQANoHzzahKdRGb9v4scv+3vaq+f+OIK8zM5My8ID+g6rMo7UKWeI4+IWiKEXAMPLE"
```

**注意**  
在 Amazon Kinesis Data Streams 开始返回数据之前，你可能需要重新运行该`get-records`命令几次。

您应该会看到包含一组 Amazon Kinesis Data Streams 记录的响应。Amazon Kinesis Data Streams 记录中的数据属性以 gzip 格式压缩，然后进行 base64 编码。您可以使用以下 Unix 命令检查命令行中的原始数据：

```
echo -n "<Content of Data>" | base64 -d | zcat
```

Base64 解码和解压缩数据被格式化为 JSON 并具有以下结构：

```
{
    "owner": "111111111111",
    "logGroup": "CloudTrail/logs",
    "logStream": "111111111111_CloudTrail/logs_us-east-1",
    "subscriptionFilters": [
        "RecipientStream"
    ],
    "messageType": "DATA_MESSAGE",
    "logEvents": [
        {
            "id": "3195310660696698337880902507980421114328961542429EXAMPLE",
            "timestamp": 1432826855000,
            "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
        },
        {
            "id": "3195310660696698337880902507980421114328961542429EXAMPLE",
            "timestamp": 1432826855000,
            "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
        },
        {
            "id": "3195310660696698337880902507980421114328961542429EXAMPLE",
            "timestamp": 1432826855000,
            "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
        }
    ]
}
```

数据架构中的关键元素如下：

**messageType**  
数据消息将使用“DATA\$1MESSAGE”类型。有时， CloudWatch 日志可能会发出 “CONTROL\$1MESSAGE” 类型的 Amazon Kinesis Data Streams 记录，主要用于检查目标是否可达。

**owner**  
原始日志数据的 AWS 账户 ID。

**logGroup**  
原始日志数据的日志组名称。

**logStream**  
原始日志数据的日志流名称。

**subscriptionFilters**  
与原始日志数据匹配的订阅筛选条件名称的列表。

**logEvents**  
表示为一组日志事件记录的实际日志数据。“id”属性是每个日志事件的唯一标识符。

**policyLevel**  
强制实施策略的级别。“ACCOUNT\$1LEVEL\$1POLICY”是账户级订阅筛选策略的 `policyLevel`。

# 在运行时修改目标成员资格
<a name="ModifyDestinationMembership-Account"></a>

您可能遇到必须在您拥有的目标中添加或删除某些用户的成员资格的情况。您可通过新访问策略对您的目标使用 `put-destination-policy` 命令。在以下示例中，将阻止之前添加的账户 **111111111111** 再发送任何日志数据，并将启用账户 **222222222222**。

1. 获取当前与目标 **TestDest** ination 关联的策略并记下：**AccessPolicy**

   ```
   aws logs describe-destinations \
       --destination-name-prefix "testDestination"
   
   {
    "Destinations": [
      {
        "DestinationName": "testDestination",
        "RoleArn": "arn:aws:iam::999999999999:role/CWLtoKinesisRole",
        "DestinationArn": "arn:aws:logs:region:999999999999:destination:testDestination",
        "TargetArn": "arn:aws:kinesis:region:999999999999:stream/RecipientStream",
        "AccessPolicy": "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Sid\": \"\", \"Effect\": \"Allow\", \"Principal\": {\"AWS\": \"111111111111\"}, \"Action\": \"logs:PutSubscriptionFilter\", \"Resource\": \"arn:aws:logs:region:999999999999:destination:testDestination\"}] }"
      }
    ]
   }
   ```

1. 更新该策略，以体现已阻止账户 **111111111111**，并且账户 **222222222222** 已启用。将此政策放入 **\$1/ NewAccessPolicy .json 文件**中：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "222222222222"
               },
               "Action": [
                   "logs:PutSubscriptionFilter",
                   "logs:PutAccountPolicy"
               ],
               "Resource": "arn:aws:logs:us-east-1:999999999999:destination:testDestination"
           }
       ]
   }
   ```

------

1. 调用**PutDestinationPolicy**将 **NewAccessPolicy.json** 文件中定义的策略与目标关联起来：

   ```
   aws logs put-destination-policy \
   --destination-name "testDestination" \
   --access-policy file://~/NewAccessPolicy.json
   ```

   这将最终禁用账户 ID **111111111111** 中的日志事件。在账户 **222222222222** 的所有者创建订阅筛选条件后，账户 ID **222222222222** 中的日志事件就会立即开始流向目标。

# 更新现有的跨账户订阅
<a name="Cross-Account-Log_Subscription-Update-Account"></a>

如果您当前有跨账户日志订阅，其中目标账户仅向特定发件人账户授予权限，并且您想更新此订阅以便目标账户向企业中所有账户授予访问权限，请按照本节中的步骤操作。

**Topics**
+ [步骤 1：更新订阅筛选条件](Cross-Account-Log_Subscription-Update-filter-Account.md)
+ [步骤 2：更新现有的目标访问策略](Cross-Account-Log_Subscription-Update-policy-Account.md)

# 步骤 1：更新订阅筛选条件
<a name="Cross-Account-Log_Subscription-Update-filter-Account"></a>

**注意**  
此步骤仅对于由 [启用来自 AWS 服务的日志记录](AWS-logs-and-resource-policy.md) 中列出的服务创建的日志的跨账户订阅才需要。如果您不使用由这些日志组之一创建的日志，则可以跳至 [步骤 2：更新现有的目标访问策略](Cross-Account-Log_Subscription-Update-policy-Account.md)。

在某些情况下，您必须更新向目标账户发送日志的所有发件人账户中的订阅筛选条件。此更新添加了一个 IAM 角色，该角色 CloudWatch 可以假设并验证发件人账户有权向收件人账户发送日志。

请按照本节中的步骤为您要更新的每个发件人账户执行操作，以使用企业 ID 获得跨账户订阅权限。

在本节的示例中，`111111111111` 和 `222222222222` 两个账户已经创建了用于向账户 `999999999999` 发送日志的订阅筛选条件。现有的订阅筛选条件值如下：

```
## Existing Subscription Filter parameter values
{
    "DestinationArn": "arn:aws:logs:region:999999999999:destination:testDestination",
    "FilterPattern": "{$.userIdentity.type = Root}",
    "Distribution": "Random"
}
```

如果需要查找当前订阅筛选条件参数值，请输入以下命令。

```
aws logs describe-account-policies \
--policy-type "SUBSCRIPTION_FILTER_POLICY" \
--policy-name "CrossAccountStreamsExamplePolicy"
```

**更新订阅筛选器以开始使用组织来 IDs 获得跨账户日志权限**

1. 请在文件 `~/TrustPolicyForCWL.json` 中创建以下信任策略。使用文本编辑器创建此策略文件；请勿使用 IAM 控制台来创建。

   ```
   {
     "Statement": {
       "Effect": "Allow",
       "Principal": { "Service": "logs.amazonaws.com" },
       "Action": "sts:AssumeRole"
     }
   }
   ```

1. 创建一个使用此策略的 IAM 角色。记录该命令返回的 `Arn` 值的 `Arn` 值，您将需要在本过程的后面部分中使用该值。在此示例中，我们将 `CWLtoSubscriptionFilterRole` 用作我们所创建角色的名称。

   ```
   aws iam create-role 
       \ --role-name CWLtoSubscriptionFilterRole 
       \ --assume-role-policy-document file://~/TrustPolicyForCWL.json
   ```

1. 创建权限策略以定义 CloudWatch Logs 可以对您的账户执行的操作。

   1. 首先，使用文本编辑器在名为 `/PermissionsForCWLSubscriptionFilter.json` 的文件中创建以下权限策略。

      ```
      { 
          "Statement": [ 
              { 
                  "Effect": "Allow", 
                  "Action": "logs:PutLogEvents", 
                  "Resource": "arn:aws:logs:region:111111111111:log-group:LogGroupOnWhichSubscriptionFilterIsCreated:*" 
              } 
          ] 
      }
      ```

   1. 输入以下命令，以将刚创建的权限策略与您在步骤 2 中创建的角色相关联。

      ```
      aws iam put-role-policy 
          --role-name CWLtoSubscriptionFilterRole 
          --policy-name Permissions-Policy-For-CWL-Subscription-filter 
          --policy-document file://~/PermissionsForCWLSubscriptionFilter.json
      ```

1. 输入以下命令以更新订阅筛选策略。

   ```
   aws logs put-account-policy \
       --policy-name "CrossAccountStreamsExamplePolicy" \
       --policy-type "SUBSCRIPTION_FILTER_POLICY" \
       --policy-document '{"DestinationArn":"arn:aws:logs:region:999999999999:destination:testDestination", "FilterPattern": "{$.userIdentity.type = Root}", "Distribution": "Random"}' \
       --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \
       --scope "ALL"
   ```

# 步骤 2：更新现有的目标访问策略
<a name="Cross-Account-Log_Subscription-Update-policy-Account"></a>

更新所有发件人账户中的订阅筛选条件后，可以更新收件人账户中的目标访问策略。

在以下示例中，收件人账户为 `999999999999`，目的地名为 `testDestination`。

此更新将使企业中 ID 为 `o-1234567890` 的所有账户向收件人账户发送日志。只有创建了订阅筛选条件的账户才会实际向收件人账户发送日志。

**要更新收件人账户中的目标访问策略以开始使用企业 ID 获取权限**

1. 在收件人账户中，请使用文本编辑器创建包含下列内容的 `~/AccessPolicy.json` 文件。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "",
               "Effect": "Allow",
               "Principal": "*",
               "Action": [
                   "logs:PutSubscriptionFilter",
                   "logs:PutAccountPolicy"
               ],
               "Resource": "arn:aws:logs:us-east-1:999999999999:destination:testDestination",
               "Condition": {
                   "StringEquals": {
                       "aws:PrincipalOrgID": [
                           "o-1234567890"
                       ]
                   }
               }
           }
       ]
   }
   ```

------

1. 输入以下命令，将刚创建的策略附加到现有目标。要更新目标以使用带有组织 ID 的访问策略，而不是列出特定 AWS 账户的访问策略 IDs，请添加`force`参数。
**警告**  
如果您正在处理中列出的 AWS 服务发送的日志[启用来自 AWS 服务的日志记录](AWS-logs-and-resource-policy.md)，则在执行此步骤之前，必须先更新所有发件人账户中的订阅筛选器，如中所述[步骤 1：更新订阅筛选条件](Cross-Account-Log_Subscription-Update-filter-Account.md)。

   ```
   aws logs put-destination-policy 
       \ --destination-name "testDestination" 
       \ --access-policy file://~/AccessPolicy.json
       \ --force
   ```