

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

# 設定新的跨帳戶訂閱
<a name="Cross-Account-Log_Subscription-New"></a>

按照這些章節中的步驟設定新的跨帳戶日誌訂閱。

**Topics**
+ [步驟 1：建立目的地](CreateDestination.md)
+ [步驟 2：(僅限於使用組織時) 建立 IAM 角色](CreateSubscriptionFilter-IAMrole.md)
+ [步驟 3：新增/驗證跨帳戶目的地的 IAM 許可](Subscription-Filter-CrossAccount-Permissions.md)
+ [步驟 4：建立訂閱篩選條件](CreateSubscriptionFilter.md)
+ [驗證日誌事件的流動](ValidateLogEventFlow.md)
+ [在執行期修改目的地成員資格](ModifyDestinationMembership.md)

# 步驟 1：建立目的地
<a name="CreateDestination"></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": "2015-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",
                  "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",
                  "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.md)。如果您要將許可直接授予給其他帳戶，而不是使用 Organizations，則可以略過該步驟並繼續進行 [步驟 4：建立訂閱篩選條件](CreateSubscriptionFilter.md)。

# 步驟 2：(僅限於使用組織時) 建立 IAM 角色
<a name="CreateSubscriptionFilter-IAMrole"></a>

在上一節中，如果您藉由使用授予許可給帳戶 `111111111111` 所屬組織的存取政策來建立目的地，而不是將許可直接授予給帳戶 `111111111111`，則按照本節中的步驟進行。若否，則可跳至步驟 [步驟 4：建立訂閱篩選條件](CreateSubscriptionFilter.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
      ```

完成後，可以繼續進行 [步驟 4：建立訂閱篩選條件](CreateSubscriptionFilter.md)。

# 步驟 3：新增/驗證跨帳戶目的地的 IAM 許可
<a name="Subscription-Filter-CrossAccount-Permissions"></a>

根據 AWS 跨帳戶政策評估邏輯，若要存取任何跨帳戶資源 （例如做為訂閱篩選條件目的地的 Kinesis 或 Firehose 串流），您必須在傳送帳戶中擁有身分型政策，以明確存取跨帳戶目的地資源。如需有關政策評估邏輯的詳細資訊，請參閱《[跨帳戶政策評估邏輯](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html)》。

您可以將身分型政策連接至用來建立訂閱篩選條件的 IAM 角色或 IAM 使用者。傳送帳戶中必須有此政策存在。如果您使用管理員角色建立訂閱篩選條件，則可以略過此步驟並繼續進行 [步驟 4：建立訂閱篩選條件](CreateSubscriptionFilter.md)。

**新增或驗證跨帳戶所需的 IAM 許可**

1. 輸入下列命令，以檢查要用來執行 AWS 日誌命令的 IAM 角色或 IAM 使用者。

   ```
   aws sts get-caller-identity
   ```

   此命令會傳回類似以下的輸出：

   ```
   {
   "UserId": "User ID",
   "Account": "sending account id",
   "Arn": "arn:aws:sending account id:role/user:RoleName/UserName"
   }
   ```

   記下以 *RoleName* 或 *UserName* 表示的值。

1. 登入傳送帳戶中 AWS 管理主控台 的 ，並使用您在步驟 1 中輸入的命令輸出中傳回的 IAM 角色或 IAM 使用者來搜尋附加的政策。

1. 確認連接至此角色或使用者的政策提供明確的許可，可對跨帳戶目的地資源呼叫 `logs:PutSubscriptionFilter`。

   下列政策提供僅在單一 AWS 帳戶 中在任何目的地資源上建立訂閱篩選條件的許可`999999999999`：

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

****  

   ```
   {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
           {
               "Sid": "AllowSubscriptionFiltersOnAccountResources",
               "Effect": "Allow",
               "Action": "logs:PutSubscriptionFilter",
               "Resource": [
                   "arn:aws:logs:*:*:log-group:*",
                   "arn:aws:logs:*:123456789012:destination:*"
               ]
           }
       ]
   }
   ```

------

   下列政策提供僅在單一 AWS 帳戶 `sampleDestination`中名為 的特定目的地資源上建立訂閱篩選條件的許可`123456789012`：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowSubscriptionFiltersonAccountResource",
               "Effect": "Allow",
               "Action": "logs:PutSubscriptionFilter",
               "Resource": [
                   "arn:aws:logs:*:*:log-group:*",
                   "arn:aws:logs:*:123456789012:destination:sampleDestination"
               ]
           }
       ]
   }
   ```

------

# 步驟 4：建立訂閱篩選條件
<a name="CreateSubscriptionFilter"></a>

在建立目的地後，日誌資料收件人帳戶可以與其他 AWS 帳戶共用目的地 ARN (arn:aws:logs:us-east-1:999999999999:destination:testDestination)，讓他們能將日誌事件傳送到相同目的地。然後，這些其他傳送帳戶使用者接著會在個別的日誌群組針對此目的地建立訂閱篩選條件。訂閱篩選條件會立即開始將即時日誌資料從所選的日誌群組傳送到指定的目標。

**注意**  
如果您要將訂閱篩選條件的許可授予給整個組織，您需要使用您在 [步驟 2：(僅限於使用組織時) 建立 IAM 角色](CreateSubscriptionFilter-IAMrole.md) 中建立的 IAM 角色 ARN。

在下列範例中，訂閱篩選條件是在傳送帳戶中建立的。篩選條件與包含 AWS CloudTrail 事件的日誌群組相關聯，因此「根」 AWS 憑證所做的每個記錄活動都會傳送到您先前建立的目的地。該目標會封裝名為「RecipientStream」的 串流。

下列部分中的其餘步驟，假定您已遵照[將 CloudTrail 事件傳送至 CloudWatch Logs](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/send-cloudtrail-events-to-cloudwatch-logs.html) 中的 *AWS CloudTrail 使用者指南*，並建立了一個包含您的 CloudTrail 事件的日誌群組。這些步驟假定此日誌群組的名稱為 `CloudTrail/logs`。

當您輸入以下命令時，確認您以 IAM 使用者身分登入，或是使用您在 [步驟 3：新增/驗證跨帳戶目的地的 IAM 許可](Subscription-Filter-CrossAccount-Permissions.md) 中為其新增政策的 IAM 角色登入。

```
aws logs put-subscription-filter \
    --log-group-name "CloudTrail/logs" \
    --filter-name "RecipientStream" \
    --filter-pattern "{$.userIdentity.type = Root}" \
    --destination-arn "arn:aws:logs:region:999999999999:destination:testDestination"
```

日誌群組和目的地必須位於相同的 AWS 區域。不過，目的地可以指向 AWS 資源，例如位於不同區域的 Amazon Kinesis Data Streams 串流。

# 驗證日誌事件的流動
<a name="ValidateLogEventFlow"></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\"}"
        }
    ]
}
```

在資料結構的關鍵元素如下：

**owner**  
原始日誌資料 AWS 的帳戶 ID。

**logGroup**  
原始日誌資料的日誌群組名稱。

**logStream**  
原始日誌資料的日誌串流名稱。

**subscriptionFilters**  
與原始日誌資料相符的訂閱篩選條件名稱清單。

**messageType**  
資料訊息使用 "DATA\$1MESSAGE" 類型。有時 CloudWatch Logs 可能會發出 "CONTROL\$1MESSAGE" 類型的 Amazon Kinesis Data Streams 記錄，主要用於檢查目的地是否可連線。

**logEvents**  
實際的日誌資料，以一系列的日誌事件記錄呈現。ID 屬性是每個記錄事件的唯一識別符。

# 在執行期修改目的地成員資格
<a name="ModifyDestinationMembership"></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",
               "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** 的日誌事件會立刻開始流向目的地。