

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Amazon Kinesis Data Streams 的跨帳戶跨區域帳戶層級訂閱
<a name="CrossAccountSubscriptions-Kinesis-Account"></a>

建立跨帳戶訂閱時，您可以指定單一帳戶或一個組織作為寄件者。如果您指定組織，則此程序會讓組織中的所有帳戶都能將日誌傳送至接收者帳戶。

若要跨帳戶共用日誌資料，您需要建立日誌資料寄件者和接收者：
+ **Log data sender** (日誌資料寄件者) - 從收件人取得目的地資訊，並讓 CloudWatch Logs 知道可開始將日誌事件傳送到指定的目的地。在本節其餘部分的程序中，日誌資料寄件者顯示的虛構 AWS 帳戶號碼為 111111111111。

  如果您要讓一個組織中的多個帳戶將日誌傳送至一個收件人帳戶，則可以建立一個政策，授予組織中所有帳戶將日誌傳送至收件人帳戶的許可。您仍然必須為每個寄件者帳戶設定個別的訂閱篩選條件。
+ **日誌資料收件人** - 設定封裝 Amazon Kinesis Data Streams 串流的目的地，並讓 CloudWatch Logs 知道收件人想要接收日誌資料。然後，收件人接著會與寄件者共用與其目的地有關的資訊。在本節其餘部分的程序中，日誌資料收件人的虛構 AWS 帳戶號碼為 999999999999。

若要從跨帳戶使用者開始接收日誌事件，日誌資料收件人會先建立 CloudWatch Logs 目的地。每個目的地包含以下關鍵元素：

**目的地名稱**  
您要建立的目的地名稱。

**目標 ARN**  
您要用作訂閱摘要目的地之 AWS 資源的 Amazon Resource Name (ARN)。

**角色 ARN**  
授予 CloudWatch Logs 將資料放入所選串流的必要許可的 AWS Identity and Access Management (IAM) 角色。

**存取政策**  
IAM 政策文件 (JSON 格式，使用 IAM 政策文法撰寫)，決定允許一組使用者寫入您的目的地。

**注意**  
日誌群組和目的地必須位於相同的 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 Logs 將資料寫入其中的角色。

建立目的地時，CloudWatch Logs 會以收件人帳戶的名義向目的地傳送測試訊息。當訂閱篩選條件在稍後處於作用中狀態時，CloudWatch Logs 會以來源帳戶的名義向目的地傳送日誌事件。

**若要建立目的地**

1. 在收件人帳戶中，在 Amazon Kinesis Data Streams 中建立目的地串流。在命令提示字元中輸入：

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

1. 等到 串流變成作用中。您可以使用以下 **aws kinesis describe-stream** 命令來檢查 **StreamDescription.StreamStatus** 屬性。此外，應記下 **StreamDescription.StreamARN** 值，因為稍後要將該值傳遞至 CloudWatch Logs：

   ```
   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. 建立將授予 CloudWatch Logs 許可以將資料放到串流中的 IAM 角色。首先，您將需要在檔案 **\$1/TrustPolicyForCWL.json** 中建立信任政策。使用文字編輯器來建立此政策檔案，請勿使用 IAM 主控台。

   此政策包含 `aws:SourceArn` 全域條件內容金鑰，可指定 `sourceAccountId` 以協助預防混淆代理人安全問題。如果您在第一次呼叫中還不知道來源帳戶 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 Logs 可在您的帳戶上執行哪些動作。首先，使用文字編輯器在檔案 **\$1/PermissionsForCWL.json** 中建立許可政策：

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

1. 使用 **aws 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 Logs 目的地。

   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** 動作，並授予寄件者帳戶許可以存取目的地。

      政策會將許可授予傳送日誌 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
      ```

      此存取政策可讓 ID 為 111111111111 的 AWS 帳戶中的使用者針對 ARN arn：aws：logs：*region*：999999999999：destination：testDestination 的目的地呼叫 **PutSubscriptionFilter**。任何其他使用者針對此目的地呼叫 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>

建立帳戶層級訂閱篩選條件政策後，CloudWatch Logs 會將符合篩選條件模式和選取條件的所有傳入日誌事件，轉送至名為 "**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 Logs 可能會發出 "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. 擷取目前與目的地 **testDestination** 相關聯的政策，並留意 **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"
```

**更新訂閱篩選條件以開始將組織 ID 用於跨帳戶日誌許可**

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
   ```