

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

# 使用訂閱即時處理日誌資料
<a name="Subscriptions"></a>

您可以使用訂閱從 CloudWatch Logs 存取日誌事件的即時摘要，並將其交付至其他服務，例如 Amazon Kinesis 串流、Amazon Data Firehose 串流，或 AWS Lambda 用於自訂處理、分析或載入至其他系統。日誌事件傳送至接收端服務時會以 Base64 編碼並以 gzip 格式壓縮。

您也可以使用 CloudWatch Logs 集中，將多個帳戶和區域的日誌資料複寫至中央位置。如需詳細資訊，請參閱[跨帳戶跨區域日誌集中化](CloudWatchLogs_Centralization.md)。

若要開始訂閱日誌事件，請建立接收資源，例如將交付事件的 Amazon Kinesis Data Streams 串流。訂閱篩選條件定義篩選條件模式，用於篩選哪些日誌事件交付至您的 AWS 資源，以及有關將相符日誌事件傳送到何處的資訊。日誌事件會在擷取後立即傳送到接收資源，通常不到三分鐘。

**注意**  
如果具有訂閱的日誌群組使用日誌轉換，則會將篩選條件模式與日誌事件的轉換版本進行比較。如需詳細資訊，請參閱[在擷取期間轉換日誌](CloudWatch-Logs-Transformation.md)。

您可以在帳戶層級和日誌群組層級建立訂閱。每個帳戶在每個區域可以有一個帳戶層級訂閱篩選條件。每個日誌群組最多有兩個相關聯的訂閱篩選條件。

**注意**  
如果目的地服務傳回可重試的錯誤，例如調節例外狀況或可重試的服務例外狀況 (例如 HTTP 5xx)，CloudWatch Logs 會繼續重試傳送，最多 24 小時。如果錯誤是不可重試的錯誤，例如 AccessDeniedException 或 ResourceNotFoundException，CloudWatch Logs 不會嘗試重新交付。在這些情況下，訂閱篩選條件會停用最多 10 分鐘，然後 CloudWatch Logs 會重試將日誌傳送至目的地。在此停用期間，日誌會略過。

CloudWatch Logs 也會產生有關將日誌事件轉送到訂閱的 CloudWatch 指標。如需詳細資訊，請參閱[使用 CloudWatch 指標監控使用量](CloudWatch-Logs-Monitoring-CloudWatch-Metrics.md)。

 您也可以使用 CloudWatch Logs 訂閱，將日誌資料以近乎即時的方式串流到 Amazon OpenSearch Service 叢集。如需詳細資訊，請參閱[將 CloudWatch Logs 資料串流到 Amazon OpenSearch Service](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_OpenSearch_Stream.html)。

只有標準日誌類別中的日誌群組才支援訂閱。如需日誌類別的詳細資訊，請參閱 [日誌類別](CloudWatch_Logs_Log_Classes.md)。

**注意**  
訂閱篩選條件可能會批次記錄事件，以最佳化傳輸並減少對目的地進行的呼叫量。不保證批次處理，但盡可能使用。

若要依排程批次處理和分析日誌資料，請考慮使用 [使用排程查詢自動化日誌分析](ScheduledQueries.md)。排程查詢會自動執行 CloudWatch Logs Insights 查詢，並將結果交付至目的地，例如 Amazon S3 儲存貯體或 Amazon EventBridge 事件匯流排。

**注意**  
訂閱篩選條件可確保事件至少交付一次，而重複的事件偶爾可能會發生。

**Topics**
+ [概念](subscription-concepts.md)
+ [日誌群組層級訂閱篩選條件](SubscriptionFilters.md)
+ [帳戶層級訂閱篩選條件](SubscriptionFilters-AccountLevel.md)
+ [跨帳戶跨區域訂閱](CrossAccountSubscriptions.md)
+ [預防混淆代理人](Subscriptions-confused-deputy.md)
+ [日誌遞迴預防](Subscriptions-recursion-prevention.md)

# 概念
<a name="subscription-concepts"></a>

每個訂閱篩選條件是由下列關鍵元素組成：

**篩選條件模式**  
CloudWatch Logs 應如何解譯每個日誌事件中資料的符號描述，以及限制傳遞至目的地 AWS 資源內容的篩選表達式。如需篩選條件模式語法的詳細資訊，請參閱 [用於指標篩選條件、訂閱篩選條件、篩選條件日誌事件和 Live Tail 的篩選條件模式語法](FilterAndPatternSyntax.md)。

**目的地 ARN**  
您要用作訂閱摘要目的地之 Amazon Kinesis Data Streams 串流、Firehose 串流或 Lambda 函數的 Amazon Resource Name (ARN)。

**角色 ARN**  
IAM 角色，授予 CloudWatch Logs 必要許可將資料放入所選目的地。Lambda 目的地不需此角色，因為 CloudWatch Logs 可以從 Lambda 函數本身的存取控制設定中取得必要許可。

**分佈**  
當目的地是 Amazon Kinesis Data Streams 中的串流時,用來將日誌資料分送到目的地的方法。在預設情況下，日誌資料是依日誌串流來分組的。如需進行更多分發，您可以將日誌資料隨機分組。

對於日誌群組層級訂閱，也包含下列金鑰元素：

**日誌群組名稱**  
要與訂閱篩選條件關聯的日誌群組。所有上傳到此日誌群組的日誌事件取決於訂閱篩選條件，符合篩選條件的日誌事件會傳送至負責接收相符日誌事件的目的地服務。

對於帳戶層級訂閱，也包含下列金鑰元素：

**選擇條件**  
用於選取哪些日誌群組套用帳戶層級訂閱篩選條件的條件。如果您未指定此項目，帳戶層級訂閱篩選條件會套用至帳戶中的所有日誌群組。此欄位用於防止無限日誌迴圈。如需無限日誌迴圈問題的詳細資訊，請參閱 [日誌遞迴預防](Subscriptions-recursion-prevention.md)。  
選擇條件的大小限制為 25 KB。

對於集中式日誌群組，也會包含下列金鑰元素。這些元素可以用作欄位選擇條件，以協助識別日誌資料來源，以便更精細地篩選和分析衍生自集中式日誌的指標。

**@aws.account**  
此欄位識別日誌事件來源 AWS 的帳戶 ID。

**@aws.region**  
此欄位識別產生日誌事件 AWS 的區域。

# 日誌群組層級訂閱篩選條件
<a name="SubscriptionFilters"></a>

 您可以搭配 Amazon Kinesis Data Streams AWS Lambda、Amazon Data Firehose 或 Amazon OpenSearch Service 使用訂閱篩選條件。透過訂閱篩選條件傳送到服務的日誌會以 gzip 格式進行 base64 編碼和壓縮。如果您搭配 使用集中式日誌 AWS Organizations，您可以選擇發出 `@aws.account`和 `@aws.region` 系統欄位，以識別哪些資料來自組織中的帳戶和區域。本節提供您可以遵循的範例，以建立 CloudWatch Logs 訂閱篩選條件，將日誌資料傳送至 Firehose、Lambda、Amazon Kinesis Data Streams 和 OpenSearch Service。

**注意**  
 如果您想要搜尋日誌資料，請參閱[篩選和模式語法](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html)。

**Topics**
+ [範例 1：使用 Amazon Kinesis Data Streams 的訂閱篩選條件](#DestinationKinesisExample)
+ [範例 2：使用 的訂閱篩選條件 AWS Lambda](#LambdaFunctionExample)
+ [範例 3：使用 Amazon Data Firehose 的訂閱篩選條件](#FirehoseExample)
+ [範例 4：使用 Amazon OpenSearch Service 的訂閱篩選條件](#OpenSearchExample)

## 範例 1：使用 Amazon Kinesis Data Streams 的訂閱篩選條件
<a name="DestinationKinesisExample"></a>

下列範例將訂閱篩選條件與包含 AWS CloudTrail 事件的日誌群組建立關聯。訂閱篩選條件會將 "Root" AWS credentials 所做的每個記錄活動交付至 Amazon Kinesis Data Streams 中名為 "RootAccess." 如需如何將 AWS CloudTrail 事件傳送至 CloudWatch Logs 的詳細資訊，請參閱*AWS CloudTrail 《 使用者指南*》中的[將 CloudTrail 事件傳送至 CloudWatch Logs](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cw_send_ct_events.html)。

**注意**  
在您建立 串流前，計算將產生的日誌資料磁碟區。請務必使用足夠碎片建立 串流，以處理此磁碟區。如果串流沒有足夠的碎片，日誌串流將受到限制。如需更多有關串流磁碟區限制的資訊，請參閱[配額與限制](https://docs.aws.amazon.com/streams/latest/dev/service-sizes-and-limits.html)。  
限流的交付項目會持續重試，時間長達 24 小時。24 小時後，失敗的交付項目就會捨棄。  
若要降低限流風險，您可以採取下步驟：  
當您使用 [ PutSubscriptionFilter](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutSubscriptionFilter.html#CWL-PutSubscriptionFilter-request-distribution) 或 [ put-subscription-filter](https://awscli.amazonaws.com/v2/documentation/api/2.4.18/reference/logs/put-subscription-filter.html) 建立訂閱篩選條件`distribution`時，請指定 `random`的 。根據預設，串流篩選條件分佈是依日誌串流，這可能會導致限流。
使用 CloudWatch 指標監控您的串流。如此可協助您找出任何限流，並根據實際情況調整您的組態。例如，將資料轉送至訂閱目的地時，`DeliveryThrottling` 指標可用來追蹤 CloudWatch Logs 遭限流的日誌事件數量。如需監控的詳細資訊，請參閱[使用 CloudWatch 指標監控使用量](CloudWatch-Logs-Monitoring-CloudWatch-Metrics.md)。
在 Amazon Kinesis Data Streams 中為您的串流使用隨需容量模式。隨需模式會在您的工作負載上升或下降時，立即為您的工作負載調整所需的容量。有關隨需容量模式的詳細資訊，請參閱[隨需模式](https://docs.aws.amazon.com/streams/latest/dev/how-do-i-size-a-stream.html#ondemandmode)。
限制您的 CloudWatch 訂閱篩選條件模式，以符合 Amazon Kinesis Data Streams 中的串流容量。如果您傳送太多資料至串流，您可能需要減少篩選條件大小或調整篩選條件標準。

**建立 Amazon Kinesis Data Streams 的訂閱篩選條件**

1. 使用下列命令建立目的地 串流：

   ```
   $ C:\>  aws kinesis create-stream --stream-name "RootAccess" --shard-count 1
   ```

1. 等到 串流成為作用中 (這可能需要花費幾分鐘)。您可以使用下列 Amazon Kinesis Data Streams [describe-stream](https://docs.aws.amazon.com/cli/latest/reference/kinesis/describe-stream.html) 命令來檢查 **StreamDescription.StreamStatus** 屬性。此外，請留意 **StreamDescription.StreamARN** 值，因您將在後續步驟需要此值：

   ```
   aws kinesis describe-stream --stream-name "RootAccess"
   ```

   下列為範例輸出：

   ```
   {
       "StreamDescription": {
           "StreamStatus": "ACTIVE",
           "StreamName": "RootAccess",
           "StreamARN": "arn:aws:kinesis:us-east-1:123456789012:stream/RootAccess",
           "Shards": [
               {
                   "ShardId": "shardId-000000000000",
                   "HashKeyRange": {
                       "EndingHashKey": "340282366920938463463374607431768211455",
                       "StartingHashKey": "0"
                   },
                   "SequenceNumberRange": {
                       "StartingSequenceNumber":
                       "49551135218688818456679503831981458784591352702181572610"
                   }
               }
           ]
       }
   }
   ```

1. 建立將授予 CloudWatch Logs 許可以將資料放到串流中的 IAM 角色。首先，您將需要在檔案中建立信任政策 (例如，`~/TrustPolicyForCWL-Kinesis.json`)。請使用文字編輯器來建立此政策。請勿使用 IAM 主控台建立這一項。

   此政策包含 `aws:SourceArn` 全域條件內容金鑰，以協助預防混淆代理人安全問題。如需詳細資訊，請參閱[預防混淆代理人](Subscriptions-confused-deputy.md)。

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

1. 使用 **create-role** 命令來建立 IAM 角色，並指定信任政策檔案。請注意傳回的 **Role.Arn** 值，因您將在後續步驟需要此值：

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

   以下為輸出範例。

   ```
   {
       "Role": {
           "AssumeRolePolicyDocument": {
               "Statement": {
                   "Action": "sts:AssumeRole",
                   "Effect": "Allow",
                   "Principal": {
                       "Service": "logs.amazonaws.com"
                   },
                   "Condition": { 
                       "StringLike": { 
                           "aws:SourceArn": { "arn:aws:logs:region:123456789012:*" }
                       } 
                   }
               }
           },
           "RoleId": "AAOIIAH450GAB4HC5F431",
           "CreateDate": "2015-05-29T13:46:29.431Z",
           "RoleName": "CWLtoKinesisRole",
           "Path": "/",
           "Arn": "arn:aws:iam::123456789012:role/CWLtoKinesisRole"
       }
   }
   ```

1. 建立許可政策以定義 CloudWatch Logs 可在您的帳戶上執行哪些動作。首先，您將需要在檔案中建立許可政策 (例如，`~/PermissionsForCWL-Kinesis.json`)。請使用文字編輯器來建立此政策。請勿使用 IAM 主控台建立這一項。

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

1. 使用以下 [put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html) 命令將許可政策與角色建立關聯：

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

1. 在串流處於**作用中**狀態且您已建立 IAM 角色後，您就可以建立 CloudWatch Logs 訂閱篩選條件。訂閱篩選條件會立即開始將即時日誌資料從所選的日誌群組傳送到 串流：

   ```
   aws logs put-subscription-filter \
       --log-group-name "CloudTrail/logs" \
       --filter-name "RootAccess" \
       --filter-pattern "{$.userIdentity.type = Root}" \
       --destination-arn "arn:aws:kinesis:region:123456789012:stream/RootAccess" \
       --role-arn "arn:aws:iam::123456789012:role/CWLtoKinesisRole"
   ```

1. 在您設定訂閱篩選條件後，CloudWatch Logs 會將所有符合篩選條件模式的傳入日誌事件轉送至串流。您可以透過抓取 Amazon Kinesis Data Streams 碎片迭代器，並使用 Amazon Kinesis Data Streams get-records 命令擷取一些 Amazon Kinesis Data Streams 記錄，來驗證是否發生這種情況：

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

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

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

   請注意，您可能需要在 Amazon Kinesis Data Streams 開始傳回資料之前進行此呼叫幾次。

   您應該預期會看到含一系列的記錄的回應。Amazon Kinesis Data Streams 記錄中**的資料**屬性是 base64 編碼並以 gzip 格式壓縮。您可以使用以下 Unix 命令來透過命令列檢查原始資料：

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

   Base64 解碼和解壓縮資料是以 JSON 形式並以下列結構進行格式化：

   ```
   {
       "owner": "111111111111",
       "logGroup": "CloudTrail/logs",
       "logStream": "111111111111_CloudTrail/logs_us-east-1",
       "subscriptionFilters": [
           "Destination"
       ],
       "messageType": "DATA_MESSAGE",
       "logEvents": [
           {
               "id": "31953106606966983378809025079804211143289615424298221568",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
           },
           {
               "id": "31953106606966983378809025079804211143289615424298221569",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
           },
           {
               "id": "31953106606966983378809025079804211143289615424298221570",
               "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」屬性是每個記錄事件的唯一識別符。

## 範例 2：使用 的訂閱篩選條件 AWS Lambda
<a name="LambdaFunctionExample"></a>

在此範例中，您將建立 CloudWatch Logs 訂閱篩選條件，將日誌資料傳送至您的 AWS Lambda 函數。

**注意**  
建立 Lambda 函數前，請計算將產生的日誌資料量。請務必建立可以處理此磁碟區的函數。如果函數沒有足夠的磁碟區，日誌串流將受到限制。如需 Lambda 限制的詳細資訊，請參閱 [AWS Lambda 限制](https://docs.aws.amazon.com/lambda/latest/dg/limits.html)。

**建立 Lambda 的訂閱篩選條件**

1. 建立 AWS Lambda 函數。

   確保您已設定 Lambda 執行角色。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的[步驟 2.2：建立 IAM 角色 (執行角色)](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。

1. 開啟文字編輯器，並建立名為 `helloWorld.js` 的檔案，內含下列內容：

   ```
   var zlib = require('zlib');
   exports.handler = function(input, context) {
       var payload = Buffer.from(input.awslogs.data, 'base64');
       zlib.gunzip(payload, function(e, result) {
           if (e) { 
               context.fail(e);
           } else {
               result = JSON.parse(result.toString());
               console.log("Event Data:", JSON.stringify(result, null, 2));
               context.succeed();
           }
       });
   };
   ```

1. 壓縮檔案 helloWorld.js，並以名稱 `helloWorld.zip` 將其儲存。

1. 使用下列命令，其中角色是您在第一個步驟中設定的 Lambda 執行角色：

   ```
   aws lambda create-function \
       --function-name helloworld \
       --zip-file fileb://file-path/helloWorld.zip \
       --role lambda-execution-role-arn \
       --handler helloWorld.handler \
       --runtime nodejs12.x
   ```

1. 授予 CloudWatch Logs 許可來執行函數。使用下列命令，將預留位置帳戶取代為您自己的帳戶且將預留位置日誌群組取代為要處理的日誌群組：

   ```
   aws lambda add-permission \
       --function-name "helloworld" \
       --statement-id "helloworld" \
       --principal "logs.amazonaws.com" \
       --action "lambda:InvokeFunction" \
       --source-arn "arn:aws:logs:region:123456789123:log-group:TestLambda:*" \
       --source-account "123456789012"
   ```

1. 使用下列命令建立訂閱篩選條件，將預留位置帳戶取代為您自己的帳戶且將預留位置日誌群組取代為要處理的日誌群組：

   ```
   aws logs put-subscription-filter \
       --log-group-name myLogGroup \
       --filter-name demo \
       --filter-pattern "" \
       --destination-arn arn:aws:lambda:region:123456789123:function:helloworld
   ```

1. (選用) 使用範例日誌事件進行測試。在命令提示字元中執行下列命令，這會將簡單日誌訊息放置到訂閱的串流。

   若要查看 Lambda 函數的輸出，請導覽至 Lambda 函數，其中您將會在 /aws/lambda/helloworld 中看到輸出：

   ```
   aws logs put-log-events --log-group-name myLogGroup --log-stream-name stream1 --log-events "[{\"timestamp\":<CURRENT TIMESTAMP MILLIS> , \"message\": \"Simple Lambda Test\"}]"
   ```

   預期會看到含一系列 Lambda 的回應。Lambda 記錄中的 **Data** (資料) 屬性是以 Base64 編碼並以 gzip 格式壓縮。Lambda 收到的實際酬載為以下格式：`{ "awslogs": {"data": "BASE64ENCODED_GZIP_COMPRESSED_DATA"} }`。您可以從命令列使用以下 Unix 命令來檢視原始資料：

   ```
   echo -n "<BASE64ENCODED_GZIP_COMPRESSED_DATA>" | base64 -d | zcat
   ```

   Base64 解碼和解壓縮資料是以 JSON 形式並以下列結構進行格式化：

   ```
   {
       "owner": "123456789012",
       "logGroup": "CloudTrail",
       "logStream": "123456789012_CloudTrail_us-east-1",
       "subscriptionFilters": [
           "Destination"
       ],
       "messageType": "DATA_MESSAGE",
       "logEvents": [
           {
               "id": "31953106606966983378809025079804211143289615424298221568",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
           },
           {
               "id": "31953106606966983378809025079804211143289615424298221569",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
           },
           {
               "id": "31953106606966983378809025079804211143289615424298221570",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
           }
       ]
   }
   ```

   在上述資料結構的關鍵元素如下：  
**owner**  
原始日誌資料 AWS 的帳戶 ID。  
**logGroup**  
原始日誌資料的日誌群組名稱。  
**logStream**  
原始日誌資料的日誌串流名稱。  
**subscriptionFilters**  
與原始日誌資料相符的訂閱篩選條件名稱清單。  
**messageType**  
資料訊息將使用「DATA\$1MESSAGE」類型。有時 CloudWatch Logs 可能會發出 "CONTROL\$1MESSAGE" 類型的 Lambda 記錄，主要用於檢查是否可到達目的地。  
**logEvents**  
實際的日誌資料，以一系列的日誌事件記錄呈現。「id」屬性是每個記錄事件的唯一識別符。

## 範例 3：使用 Amazon Data Firehose 的訂閱篩選條件
<a name="FirehoseExample"></a>

在此範例中，您將建立 CloudWatch Logs 訂閱，將任何符合您定義篩選條件的傳入日誌事件傳送至 Amazon Data Firehose 交付串流。從 CloudWatch Logs 傳送至 Amazon Data Firehose 的資料已使用 gzip 第 6 級壓縮進行壓縮，因此您不需要在 Firehose 交付串流中使用壓縮。然後，您可以使用 Firehose 中的解壓縮功能自動解壓縮日誌。如需詳細資訊，請參閱[將 CloudWatch Logs 傳送至 Firehose](https://docs.aws.amazon.com/logs/SubscriptionFilters.html#FirehoseExample)。

**注意**  
建立 Firehose 串流之前，請先計算要產生的日誌資料量。請務必建立可處理此磁碟區的 Firehose 串流。如果串流無法處理磁碟區、日誌串流將受到限制。如需 Firehose 串流磁碟區限制的詳細資訊，請參閱 [Amazon Data Firehose Data Limits](https://docs.aws.amazon.com/firehose/latest/dev/limits.html)。

**建立 Firehose 的訂閱篩選條件**

1. 建立 Amazon Simple Storage Service (Amazon S3) 儲存貯體。我們建議您使用專為 CloudWatch Logs 建立的儲存貯體。不過，如果您想要使用現有的儲存貯體，請跳到步驟 2。

   執行以下命令，將預留位置 Region 換成您想要使用的區域：

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-bucket2 --create-bucket-configuration LocationConstraint=region
   ```

   下列為範例輸出：

   ```
   {
       "Location": "/amzn-s3-demo-bucket2"
   }
   ```

1. 建立 IAM 角色，授予 Amazon Data Firehose 將資料放入 Amazon S3 儲存貯體的許可。

   如需詳細資訊，請參閱《[Amazon Data Firehose 開發人員指南》中的使用 Amazon Data Firehose 控制存取](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html)。 **

   首先，請按如下所示，使用文字編輯器來建立檔案 `~/TrustPolicyForFirehose.json` 中的信任政策：

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

1. 使用 **create-role** 命令來建立 IAM 角色，並指定信任政策檔案。請注意傳回的 **Role.Arn** 值，因您將在後續步驟需要此值：

   ```
   aws iam create-role \
    --role-name FirehosetoS3Role \
    --assume-role-policy-document file://~/TrustPolicyForFirehose.json
   
   {
       "Role": {
           "AssumeRolePolicyDocument": {
               "Statement": {
                   "Action": "sts:AssumeRole",
                   "Effect": "Allow",
                   "Principal": {
                       "Service": "firehose.amazonaws.com"
                   }
               }
           },
           "RoleId": "AAOIIAH450GAB4HC5F431",
           "CreateDate": "2015-05-29T13:46:29.431Z",
           "RoleName": "FirehosetoS3Role",
           "Path": "/",
           "Arn": "arn:aws:iam::123456789012:role/FirehosetoS3Role"
       }
   }
   ```

1. 建立許可政策，以定義 Firehose 可以在您的帳戶上執行的動作。首先，使用文字編輯器來建立檔案 `~/PermissionsForFirehose.json` 中的許可政策：

   ```
   {
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [ 
             "s3:AbortMultipartUpload", 
             "s3:GetBucketLocation", 
             "s3:GetObject", 
             "s3:ListBucket", 
             "s3:ListBucketMultipartUploads", 
             "s3:PutObject" ],
         "Resource": [ 
             "arn:aws:s3:::amzn-s3-demo-bucket2", 
             "arn:aws:s3:::amzn-s3-demo-bucket2/*" ]
       }
     ]
   }
   ```

1. 使用以下 put-role-policy 命令將許可政策與角色建立關聯：

   ```
   aws iam put-role-policy --role-name FirehosetoS3Role --policy-name Permissions-Policy-For-Firehose --policy-document file://~/PermissionsForFirehose.json
   ```

1. 如下所示建立目的地 Firehose 交付串流，將 **RoleARN** 和 **BucketARN** 的預留位置值取代為您建立的角色和儲存貯體 ARNs：

   ```
   aws firehose create-delivery-stream \
      --delivery-stream-name 'my-delivery-stream' \
      --s3-destination-configuration \
     '{"RoleARN": "arn:aws:iam::123456789012:role/FirehosetoS3Role", "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket2"}'
   ```

   請注意，Firehose 會自動為交付的 Amazon S3 物件使用 YYYY/MM/DD/HH UTC 時間格式的字首。您可以指定在時間格式前綴前要新增的額外前綴。如果字首結尾是斜線 (/)，則會在 Amazon S3 儲存貯體中顯示為資料夾。

1. 等到串流成為作用中 (這可能需要花費幾分鐘)。您可以使用 Firehose **describe-delivery-stream** 命令來檢查 **DeliveryStreamDescription.DeliveryStreamStatus** 屬性。此外，請留意 **DeliveryStreamDescription.DeliveryStreamARN** 值，因您將在後續步驟需要此值：

   ```
   aws firehose describe-delivery-stream --delivery-stream-name "my-delivery-stream"
   {
       "DeliveryStreamDescription": {
           "HasMoreDestinations": false,
           "VersionId": "1",
           "CreateTimestamp": 1446075815.822,
           "DeliveryStreamARN": "arn:aws:firehose:us-east-1:123456789012:deliverystream/my-delivery-stream",
           "DeliveryStreamStatus": "ACTIVE",
           "DeliveryStreamName": "my-delivery-stream",
           "Destinations": [
               {
                   "DestinationId": "destinationId-000000000001",
                   "S3DestinationDescription": {
                       "CompressionFormat": "UNCOMPRESSED",
                       "EncryptionConfiguration": {
                           "NoEncryptionConfig": "NoEncryption"
                       },
                       "RoleARN": "delivery-stream-role",
                       "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket2",
                       "BufferingHints": {
                           "IntervalInSeconds": 300,
                           "SizeInMBs": 5
                       }
                   }
               }
           ]
       }
   }
   ```

1. 建立 IAM 角色，授予 CloudWatch Logs 將資料放入 Firehose 交付串流的許可。首先，使用文字編輯器來建立檔案 `~/TrustPolicyForCWL.json` 中的信任政策：

   此政策包含 `aws:SourceArn` 全域條件內容金鑰，以協助預防混淆代理人安全問題。如需詳細資訊，請參閱[預防混淆代理人](Subscriptions-confused-deputy.md)。

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

1. 使用 **create-role** 命令來建立 IAM 角色，並指定信任政策檔案。請注意傳回的 **Role.Arn** 值，因您將在後續步驟需要此值：

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

1. 建立許可政策以定義 CloudWatch Logs 可在您的帳戶上執行哪些動作。首先，使用文字編輯器來建立許可政策檔案 (例如，`~/PermissionsForCWL.json`)：

   ```
   {
       "Statement":[
         {
           "Effect":"Allow",
           "Action":["firehose:PutRecord"],
           "Resource":[
               "arn:aws:firehose:region:account-id:deliverystream/delivery-stream-name"]
         }
       ]
   }
   ```

1. 使用 put-role-policy 命令將許可政策與角色建立關聯：

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

1. 在 Amazon Data Firehose 交付串流處於作用中狀態且您已建立 IAM 角色後，您可以建立 CloudWatch Logs 訂閱篩選條件。訂閱篩選條件會立即開始從所選日誌群組到 Amazon Data Firehose 交付串流的即時日誌資料流程：

   ```
   aws logs put-subscription-filter \
       --log-group-name "CloudTrail" \
       --filter-name "Destination" \
       --filter-pattern "{$.userIdentity.type = Root}" \
       --destination-arn "arn:aws:firehose:region:123456789012:deliverystream/my-delivery-stream" \
       --role-arn "arn:aws:iam::123456789012:role/CWLtoKinesisFirehoseRole"
   ```

1. 設定訂閱篩選條件後，CloudWatch Logs 會將符合篩選條件模式的所有傳入日誌事件轉送至您的 Amazon Data Firehose 交付串流。您的資料會根據 Amazon Data Firehose 交付串流上設定的時間緩衝間隔，開始出現在 Amazon S3 中。一旦經過足夠的時間，您就可以檢查 Amazon S3 儲存貯體來驗證資料。

   ```
   aws s3api list-objects --bucket 'amzn-s3-demo-bucket2' --prefix 'firehose/'
   {
       "Contents": [
           {
               "LastModified": "2015-10-29T00:01:25.000Z",
               "ETag": "\"a14589f8897f4089d3264d9e2d1f1610\"",
               "StorageClass": "STANDARD",
               "Key": "firehose/2015/10/29/00/my-delivery-stream-2015-10-29-00-01-21-a188030a-62d2-49e6-b7c2-b11f1a7ba250",
               "Owner": {
                   "DisplayName": "cloudwatch-logs",
                   "ID": "1ec9cf700ef6be062b19584e0b7d84ecc19237f87b5"
               },
               "Size": 593
           },
           {
               "LastModified": "2015-10-29T00:35:41.000Z",
               "ETag": "\"a7035b65872bb2161388ffb63dd1aec5\"",
               "StorageClass": "STANDARD",
               "Key": "firehose/2015/10/29/00/my-delivery-stream-2015-10-29-00-35-40-7cc92023-7e66-49bc-9fd4-fc9819cc8ed3",
               "Owner": {
                   "DisplayName": "cloudwatch-logs",
                   "ID": "1ec9cf700ef6be062b19584e0b7d84ecc19237f87b6"
               },
               "Size": 5752
           }
       ]
   }
   ```

   ```
   aws s3api get-object --bucket 'amzn-s3-demo-bucket2' --key 'firehose/2015/10/29/00/my-delivery-stream-2015-10-29-00-01-21-a188030a-62d2-49e6-b7c2-b11f1a7ba250' testfile.gz
   
   {
       "AcceptRanges": "bytes",
       "ContentType": "application/octet-stream",
       "LastModified": "Thu, 29 Oct 2015 00:07:06 GMT",
       "ContentLength": 593,
       "Metadata": {}
   }
   ```

   在 Amazon S3 物件中的資料會以 gzip 格式壓縮。您可以使用以下 Unix 命令來透過命令列檢查原始資料：

   ```
   zcat testfile.gz
   ```

## 範例 4：使用 Amazon OpenSearch Service 的訂閱篩選條件
<a name="OpenSearchExample"></a>

在此範例中，您將建立 CloudWatch Logs 訂閱，將符合您所定義篩選條件的傳入日誌事件傳送至 OpenSearch Service 網域。

**建立 OpenSearch Service 的訂閱篩選條件**

1. 建立 OpenSearch Service 網域 如需詳細資訊，請參閱[建立 OpenSearch Service 網域](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains)

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1.  在導覽窗格中，選擇 **Log groups** (日誌群組)。

1. 選取日誌群組的名稱。

1. 選擇 **Actions** (動作)、**Subscription filters** (訂閱篩選條件)、**Create Amazon OpenSearch Service subscription filter** (建立 Amazon OpenSearch Service 訂閱篩選條件)。

1. 選擇您是否要串流至此帳戶或其他帳戶中的叢集。
   + 如果您選擇**此帳戶**，請選取您在步驟 1 中建立的網域。
   + 如果您選擇**另一個帳戶**，請輸入該網域的 ARN 和端點。

1.  如果您選擇其他帳戶，請提供網域 ARN 和端點。

1. 針對 Amazon OpenSearch Service 叢集，選擇將交付日誌群組資料的叢集名稱

1. 選擇日誌格式。

1. 針對**訂閱篩選條件模式**，輸入要在日誌事件中找到的術語或模式。這可確保您只將感興趣的資料傳送至 OpenSearch Service 叢集。如需詳細資訊，請參閱[指標篩選條件的篩選條件模式語法](FilterAndPatternSyntaxForMetricFilters.md)。

1. (選用) 針對 **Select log data to test** (選取要測試的日誌資料)，選擇一個日誌串流，然後選擇 **Test pattern** (測試模式)，以驗證您的搜尋篩選條件是否會傳回您預期的結果。

1. 選擇 **Start streaming** (開始串流)。

# 帳戶層級訂閱篩選條件
<a name="SubscriptionFilters-AccountLevel"></a>

**重要**  
存在使用訂閱篩選條件造成無限遞迴迴圈的風險，如果未解決，可能會導致擷取計費大幅增加。為了降低此風險，建議您在帳戶層級訂閱篩選條件中使用選擇條件，以排除從訂閱交付工作流程一部分的資源擷取日誌資料的日誌群組。如需此問題和決定要排除哪些日誌群組的詳細資訊，請參閱 [日誌遞迴預防](Subscriptions-recursion-prevention.md)。

 您可以設定帳戶層級訂閱政策，其中包含帳戶中的日誌群組子集。帳戶訂閱政策可以使用 Amazon Kinesis Data Streams AWS Lambda或 Amazon Data Firehose。透過帳戶層級訂閱政策傳送至服務的日誌會以 gzip 格式進行 base64 編碼和壓縮。本節提供您可以遵循的範例，為 Amazon Kinesis Data Streams、Lambda 和 Firehose 建立帳戶層級訂閱。

**注意**  
若要檢視您帳戶中所有訂閱篩選條件政策的清單，請使用 `--policy-type` 參數值為 `SUBSCRIPTION_FILTER_POLICY`的 `describe-account-policies`命令。如需詳細資訊，請參閱 [ describe-account-policies](https://docs.aws.amazon.com/cli/latest/reference/logs/describe-account-policies.html)¶。

**Topics**
+ [範例 1：使用 Amazon Kinesis Data Streams 的訂閱篩選條件](#DestinationKinesisExample-AccountLevel)
+ [範例 2：使用 的訂閱篩選條件 AWS Lambda](#LambdaFunctionExample-AccountLevel)
+ [範例 3：使用 Amazon Data Firehose 的訂閱篩選條件](#FirehoseExample-AccountLevel)

## 範例 1：使用 Amazon Kinesis Data Streams 的訂閱篩選條件
<a name="DestinationKinesisExample-AccountLevel"></a>

在您建立要與帳戶層級訂閱政策搭配使用的 Amazon Kinesis Data Streams 資料串流之前，請計算將產生的日誌資料量。請務必使用足夠碎片建立 串流，以處理此磁碟區。如果串流沒有足夠的碎片，則會調節。如需串流磁碟區限制的詳細資訊，請參閱 Amazon Kinesis Data Streams 文件中的[配額和限制](https://docs.aws.amazon.com/streams/latest/dev/service-sizes-and-limits.html)。

**警告**  
由於多個日誌群組的日誌事件會轉送至目的地，因此存在限流風險。限流的交付項目會持續重試，時間長達 24 小時。24 小時後，失敗的交付項目就會捨棄。  
若要降低限流風險，您可以採取下步驟：  
使用 CloudWatch 指標監控 Amazon Kinesis Data Streams 串流。這可協助您識別限流，並相應地調整您的組態。例如， `DeliveryThrottling` 指標會追蹤 CloudWatch Logs 在轉送資料至訂閱目的地時受到調節的日誌事件數量。如需詳細資訊，請參閱[使用 CloudWatch 指標監控使用量](CloudWatch-Logs-Monitoring-CloudWatch-Metrics.md)。
在 Amazon Kinesis Data Streams 中為您的串流使用隨需容量模式。隨需模式會在您的工作負載上升或下降時，立即為您的工作負載調整所需的容量。如需詳細資訊，請參閱[隨需模式](https://docs.aws.amazon.com/streams/latest/dev/how-do-i-size-a-stream.html#ondemandmode)。
限制 CloudWatch Logs 訂閱篩選條件模式，以符合 Amazon Kinesis Data Streams 中的串流容量。如果您傳送太多資料至串流，您可能需要減少篩選條件大小或調整篩選條件標準。

下列範例使用帳戶層級訂閱政策，將所有日誌事件轉送至 Amazon Kinesis Data Streams 中的串流。篩選條件模式會將任何日誌事件與文字相符，`Test`並將其轉送至 Amazon Kinesis Data Streams 中的串流。

**為 Amazon Kinesis Data Streams 建立帳戶層級訂閱政策**

1. 使用下列命令建立目的地 串流：

   ```
   $ C:\>  aws kinesis create-stream —stream-name "TestStream" —shard-count 1
   ```

1. 等待幾分鐘讓串流變成作用中。您可以使用 [describe-stream](https://docs.aws.amazon.com/cli/latest/reference/kinesis/describe-stream.html) 命令來檢查 **StreamDescription.StreamStatus** 屬性，以驗證串流是否處於作用中狀態。

   ```
   aws kinesis describe-stream --stream-name "TestStream"
   ```

   下列為範例輸出：

   ```
   {
       "StreamDescription": {
           "StreamStatus": "ACTIVE",
           "StreamName": "TestStream",
           "StreamARN": "arn:aws:kinesis:region:123456789012:stream/TestStream",
           "Shards": [
               {
                   "ShardId": "shardId-000000000000",
                   "HashKeyRange": {
                       "EndingHashKey": "EXAMPLE8463463374607431768211455",
                       "StartingHashKey": "0"
                   },
                   "SequenceNumberRange": {
                       "StartingSequenceNumber":
                       "EXAMPLE688818456679503831981458784591352702181572610"
                   }
               }
           ]
       }
   }
   ```

1. 建立將授予 CloudWatch Logs 許可以將資料放到串流中的 IAM 角色。首先，您將需要在檔案中建立信任政策 (例如，`~/TrustPolicyForCWL-Kinesis.json`)。請使用文字編輯器來建立此政策。

   此政策包含 `aws:SourceArn` 全域條件內容金鑰，以協助預防混淆代理人安全問題。如需詳細資訊，請參閱[預防混淆代理人](Subscriptions-confused-deputy.md)。

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

1. 使用 **create-role** 命令來建立 IAM 角色，並指定信任政策檔案。請注意傳回的 **Role.Arn** 值，因您將在後續步驟需要此值：

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

   以下為輸出範例。

   ```
   {
       "Role": {
           "AssumeRolePolicyDocument": {
               "Statement": {
                   "Action": "sts:AssumeRole",
                   "Effect": "Allow",
                   "Principal": {
                       "Service": "logs.amazonaws.com"
                   },
                   "Condition": { 
                       "StringLike": { 
                           "aws:SourceArn": { "arn:aws:logs:region:123456789012:*" }
                       } 
                   }
               }
           },
           "RoleId": "EXAMPLE450GAB4HC5F431",
           "CreateDate": "2023-05-29T13:46:29.431Z",
           "RoleName": "CWLtoKinesisRole",
           "Path": "/",
           "Arn": "arn:aws:iam::123456789012:role/CWLtoKinesisRole"
       }
   }
   ```

1. 建立許可政策以定義 CloudWatch Logs 可在您的帳戶上執行哪些動作。首先，您將需要在檔案中建立許可政策 (例如，`~/PermissionsForCWL-Kinesis.json`)。請使用文字編輯器來建立此政策。請勿使用 IAM 主控台來建立它。

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

1. 使用以下 [put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html) 命令將許可政策與角色建立關聯：

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

1. 在串流處於**作用中**狀態且您已建立 IAM 角色之後，您可以建立 CloudWatch Logs 訂閱篩選條件政策。此政策會立即開始將即時日誌資料傳送至串流的流程。在此範例中，所有包含字串的日誌事件`ERROR`都會串流，但名為 `LogGroupToExclude1`和 的日誌群組中的日誌事件除外`LogGroupToExclude2`。

   ```
   aws logs put-account-policy \
       --policy-name "ExamplePolicy" \
       --policy-type "SUBSCRIPTION_FILTER_POLICY" \
       --policy-document '{"RoleArn":"arn:aws:iam::123456789012:role/CWLtoKinesisRole", "DestinationArn":"arn:aws:kinesis:region:123456789012:stream/TestStream", "FilterPattern": "Test", "Distribution": "Random"}' \
       --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \
       --scope "ALL"
   ```

1. 設定訂閱篩選條件後，CloudWatch Logs 會將符合篩選條件模式和選取條件的所有傳入日誌事件轉送到您的串流。

   欄位是選用`selection-criteria`的，但對於排除可能導致訂閱篩選條件無限日誌遞迴的日誌群組非常重要。如需此問題和決定要排除哪些日誌群組的詳細資訊，請參閱 [日誌遞迴預防](Subscriptions-recursion-prevention.md)。目前， NOT IN 是 唯一支援的運算子`selection-criteria`。

   您可以使用 Amazon Kinesis Data Streams 碎片迭代器和使用 Amazon Kinesis Data Streams `get-records`命令擷取一些 Amazon Kinesis Data Streams 記錄，來驗證日誌事件的流程：

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

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

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

   在 Amazon Kinesis Data Streams 開始傳回資料之前，您可能需要使用此命令幾次。

   您應該預期會看到含一系列的記錄的回應。Amazon Kinesis Data Streams 記錄中**的資料**屬性是 base64 編碼並以 gzip 格式壓縮。您可以使用以下 Unix 命令來透過命令列檢查原始資料：

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

   Base64 解碼和解壓縮資料是以 JSON 形式並以下列結構進行格式化：

   ```
   { 
       "messageType": "DATA_MESSAGE",
       "owner": "123456789012",
       "logGroup": "Example1",
       "logStream": "logStream1",
       "subscriptionFilters": [ 
           "ExamplePolicy" 
       ],
       "logEvents": [ 
           { 
               "id": "31953106606966983378809025079804211143289615424298221568",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
           },
           { 
               "id": "31953106606966983378809025079804211143289615424298221569",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}" 
           }, 
           { 
               "id": "31953106606966983378809025079804211143289615424298221570",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}" 
           } 
       ],
       "policyLevel": "ACCOUNT_LEVEL_POLICY"
   }
   ```

   資料結構中的關鍵元素如下：  
**messageType**  
資料訊息將使用「DATA\$1MESSAGE」類型。有時 CloudWatch Logs 可能會發出 "CONTROL\$1MESSAGE" 類型的 Amazon Kinesis Data Streams 記錄，主要用於檢查目的地是否可連線。  
**owner**  
原始日誌資料 AWS 的帳戶 ID。  
**logGroup**  
原始日誌資料的日誌群組名稱。  
**logStream**  
原始日誌資料的日誌串流名稱。  
**subscriptionFilters**  
與原始日誌資料相符的訂閱篩選條件名稱清單。  
**logEvents**  
實際的日誌資料，以一系列的日誌事件記錄呈現。「id」屬性是每個記錄事件的唯一識別符。  
**policyLevel**  
強制執行政策的層級。"ACCOUNT\$1LEVEL\$1POLICY" 是帳戶層級訂閱篩選條件政策`policyLevel`的 。

## 範例 2：使用 的訂閱篩選條件 AWS Lambda
<a name="LambdaFunctionExample-AccountLevel"></a>

在此範例中，您將建立 CloudWatch Logs 帳戶層級訂閱篩選條件政策，將日誌資料傳送至您的 AWS Lambda 函數。

**警告**  
建立 Lambda 函數前，請計算將產生的日誌資料量。請務必建立可以處理此磁碟區的函數。如果函數無法處理磁碟區，則會調節日誌串流。由於所有日誌群組或帳戶日誌群組子集的日誌事件都會轉送至目的地，因此會有限流風險。如需 Lambda 限制的詳細資訊，請參閱 [AWS Lambda 限制](https://docs.aws.amazon.com/lambda/latest/dg/limits.html)。

**為 Lambda 建立帳戶層級訂閱篩選條件政策**

1. 建立 AWS Lambda 函數。

   確保您已設定 Lambda 執行角色。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的[步驟 2.2：建立 IAM 角色 (執行角色)](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。

1. 開啟文字編輯器，並建立名為 `helloWorld.js` 的檔案，內含下列內容：

   ```
   var zlib = require('zlib');
   exports.handler = function(input, context) {
       var payload = Buffer.from(input.awslogs.data, 'base64');
       zlib.gunzip(payload, function(e, result) {
           if (e) { 
               context.fail(e);
           } else {
               result = JSON.parse(result.toString());
               console.log("Event Data:", JSON.stringify(result, null, 2));
               context.succeed();
           }
       });
   };
   ```

1. 壓縮檔案 helloWorld.js，並以名稱 `helloWorld.zip` 將其儲存。

1. 使用下列命令，其中角色是您在第一個步驟中設定的 Lambda 執行角色：

   ```
   aws lambda create-function \
       --function-name helloworld \
       --zip-file fileb://file-path/helloWorld.zip \
       --role lambda-execution-role-arn \
       --handler helloWorld.handler \
       --runtime nodejs18.x
   ```

1. 授予 CloudWatch Logs 許可來執行函數。使用下列命令，將預留位置帳戶取代為您自己的帳戶。

   ```
   aws lambda add-permission \
       --function-name "helloworld" \
       --statement-id "helloworld" \
       --principal "logs.amazonaws.com" \
       --action "lambda:InvokeFunction" \
       --source-arn "arn:aws:logs:region:123456789012:log-group:*" \
       --source-account "123456789012"
   ```

1. 使用下列命令建立帳戶層級訂閱篩選條件政策，將預留位置帳戶取代為您自己的帳戶。在此範例中，所有包含字串的日誌事件`ERROR`都會串流，但名為 `LogGroupToExclude1`和 的日誌群組中的日誌事件除外`LogGroupToExclude2`。

   ```
   aws logs put-account-policy \
       --policy-name "ExamplePolicyLambda" \
       --policy-type "SUBSCRIPTION_FILTER_POLICY" \
       --policy-document '{"DestinationArn":"arn:aws:lambda:region:123456789012:function:helloWorld", "FilterPattern": "Test", "Distribution": "Random"}' \
       --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \
       --scope "ALL"
   ```

   設定訂閱篩選條件後，CloudWatch Logs 會將符合篩選條件模式和選取條件的所有傳入日誌事件轉送到您的串流。

   欄位是選用`selection-criteria`的，但對於排除可能導致訂閱篩選條件無限日誌遞迴的日誌群組非常重要。如需此問題和決定要排除哪些日誌群組的詳細資訊，請參閱 [日誌遞迴預防](Subscriptions-recursion-prevention.md)。目前， NOT IN 是 唯一支援的運算子`selection-criteria`。

1. (選用) 使用範例日誌事件進行測試。在命令提示字元中執行下列命令，這會將簡單日誌訊息放置到訂閱的串流。

   若要查看 Lambda 函數的輸出，請導覽至 Lambda 函數，其中您將會在 /aws/lambda/helloworld 中看到輸出：

   ```
   aws logs put-log-events --log-group-name Example1 --log-stream-name logStream1 --log-events "[{\"timestamp\":CURRENT TIMESTAMP MILLIS , \"message\": \"Simple Lambda Test\"}]"
   ```

   預期會看到含一系列 Lambda 的回應。Lambda 記錄中的 **Data** (資料) 屬性是以 Base64 編碼並以 gzip 格式壓縮。Lambda 收到的實際酬載為以下格式：`{ "awslogs": {"data": "BASE64ENCODED_GZIP_COMPRESSED_DATA"} }`。您可以從命令列使用以下 Unix 命令來檢視原始資料：

   ```
   echo -n "<BASE64ENCODED_GZIP_COMPRESSED_DATA>" | base64 -d | zcat
   ```

   Base64 解碼和解壓縮資料是以 JSON 形式並以下列結構進行格式化：

   ```
   { 
       "messageType": "DATA_MESSAGE",
       "owner": "123456789012",
       "logGroup": "Example1",
       "logStream": "logStream1",
       "subscriptionFilters": [ 
           "ExamplePolicyLambda" 
       ],
       "logEvents": [ 
           { 
               "id": "31953106606966983378809025079804211143289615424298221568",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
           },
           { 
               "id": "31953106606966983378809025079804211143289615424298221569",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}" 
           }, 
           { 
               "id": "31953106606966983378809025079804211143289615424298221570",
               "timestamp": 1432826855000,
               "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}" 
           } 
       ],
       "policyLevel": "ACCOUNT_LEVEL_POLICY"
   }
   ```
**注意**  
帳戶層級訂閱篩選條件不會套用至目的地 Lambda 函數的日誌群組。這是為了防止無限日誌遞迴，這可能會導致擷取帳單增加。如需此問題的詳細資訊，請參閱 [日誌遞迴預防](Subscriptions-recursion-prevention.md) 。

   資料結構中的關鍵元素如下：  
**messageType**  
資料訊息將使用「DATA\$1MESSAGE」類型。有時 CloudWatch Logs 可能會發出 "CONTROL\$1MESSAGE" 類型的 Amazon Kinesis Data Streams 記錄，主要用於檢查目的地是否可連線。  
**owner**  
原始日誌資料 AWS 的帳戶 ID。  
**logGroup**  
原始日誌資料的日誌群組名稱。  
**logStream**  
原始日誌資料的日誌串流名稱。  
**subscriptionFilters**  
與原始日誌資料相符的訂閱篩選條件名稱清單。  
**logEvents**  
實際的日誌資料，以一系列的日誌事件記錄呈現。「id」屬性是每個記錄事件的唯一識別符。  
**policyLevel**  
強制執行政策的層級。"ACCOUNT\$1LEVEL\$1POLICY" 是帳戶層級訂閱篩選條件政策`policyLevel`的 。

## 範例 3：使用 Amazon Data Firehose 的訂閱篩選條件
<a name="FirehoseExample-AccountLevel"></a>

在此範例中，您將建立 CloudWatch Logs 帳戶層級訂閱篩選條件政策，將符合您所定義篩選條件的傳入日誌事件傳送至 Amazon Data Firehose 交付串流。從 CloudWatch Logs 傳送至 Amazon Data Firehose 的資料已使用 gzip 第 6 級壓縮進行壓縮，因此您不需要在 Firehose 交付串流中使用壓縮。然後，您可以使用 Firehose 中的解壓縮功能自動解壓縮日誌。如需詳細資訊，請參閱[使用 CloudWatch Logs 寫入 Kinesis Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/writing-with-cloudwatch-logs.html)。

**警告**  
建立 Firehose 串流之前，請先計算將產生的日誌資料量。請務必建立可處理此磁碟區的 Firehose 串流。如果串流無法處理磁碟區、日誌串流將受到限制。如需 Firehose 串流磁碟區限制的詳細資訊，請參閱 [Amazon Data Firehose Data Limits](https://docs.aws.amazon.com/firehose/latest/dev/limits.html)。

**建立 Firehose 的訂閱篩選條件**

1. 建立 Amazon Simple Storage Service (Amazon S3) 儲存貯體。我們建議您使用專為 CloudWatch Logs 建立的儲存貯體。不過，如果您想要使用現有的儲存貯體，請跳到步驟 2。

   執行以下命令，將預留位置 Region 換成您想要使用的區域：

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-bucket2 --create-bucket-configuration LocationConstraint=region
   ```

   下列為範例輸出：

   ```
   {
       "Location": "/amzn-s3-demo-bucket2"
   }
   ```

1. 建立 IAM 角色，授予 Amazon Data Firehose 將資料放入 Amazon S3 儲存貯體的許可。

   如需詳細資訊，請參閱《[Amazon Data Firehose 開發人員指南》中的使用 Amazon Data Firehose 控制存取](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html)。 **

   首先，請按如下所示，使用文字編輯器來建立檔案 `~/TrustPolicyForFirehose.json` 中的信任政策：

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

1. 使用 **create-role** 命令來建立 IAM 角色，並指定信任政策檔案。請記下傳回的 **Role.Arn** 值，因為在後續步驟中會需要它：

   ```
   aws iam create-role \
    --role-name FirehosetoS3Role \
    --assume-role-policy-document file://~/TrustPolicyForFirehose.json
   
   {
       "Role": {
           "AssumeRolePolicyDocument": {
               "Statement": {
                   "Action": "sts:AssumeRole",
                   "Effect": "Allow",
                   "Principal": {
                       "Service": "firehose.amazonaws.com"
                   }
               }
           },
           "RoleId": "EXAMPLE50GAB4HC5F431",
           "CreateDate": "2023-05-29T13:46:29.431Z",
           "RoleName": "FirehosetoS3Role",
           "Path": "/",
           "Arn": "arn:aws:iam::123456789012:role/FirehosetoS3Role"
       }
   }
   ```

1. 建立許可政策，以定義 Firehose 可以在您的帳戶上執行的動作。首先，使用文字編輯器來建立檔案 `~/PermissionsForFirehose.json` 中的許可政策：

   ```
   {
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [ 
             "s3:AbortMultipartUpload", 
             "s3:GetBucketLocation", 
             "s3:GetObject", 
             "s3:ListBucket", 
             "s3:ListBucketMultipartUploads", 
             "s3:PutObject" ],
         "Resource": [ 
             "arn:aws:s3:::amzn-s3-demo-bucket2", 
             "arn:aws:s3:::amzn-s3-demo-bucket2/*" ]
       }
     ]
   }
   ```

1. 使用以下 put-role-policy 命令將許可政策與角色建立關聯：

   ```
   aws iam put-role-policy --role-name FirehosetoS3Role --policy-name Permissions-Policy-For-Firehose --policy-document file://~/PermissionsForFirehose.json
   ```

1. 如下所示建立目的地 Firehose 交付串流，將 **RoleARN** 和 **BucketARN** 的預留位置值取代為您建立的角色和儲存貯體 ARNs：

   ```
   aws firehose create-delivery-stream \
      --delivery-stream-name 'my-delivery-stream' \
      --s3-destination-configuration \
     '{"RoleARN": "arn:aws:iam::123456789012:role/FirehosetoS3Role", "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket2"}'
   ```

   NFirehose 會自動為交付的 Amazon S3 物件使用 YYYY/MM/DD/HH UTC 時間格式的字首。您可以指定在時間格式前綴前要新增的額外前綴。如果字首結尾是斜線 (/)，則會在 Amazon S3 儲存貯體中顯示為資料夾。

1. 等待幾分鐘，讓串流變成作用中。您可以使用 Firehose **describe-delivery-stream** 命令來檢查 **DeliveryStreamDescription.DeliveryStreamStatus** 屬性。此外，請留意 **DeliveryStreamDescription.DeliveryStreamARN** 值，因您將在後續步驟需要此值：

   ```
   aws firehose describe-delivery-stream --delivery-stream-name "my-delivery-stream"
   {
       "DeliveryStreamDescription": {
           "HasMoreDestinations": false,
           "VersionId": "1",
           "CreateTimestamp": 1446075815.822,
           "DeliveryStreamARN": "arn:aws:firehose:us-east-1:123456789012:deliverystream/my-delivery-stream",
           "DeliveryStreamStatus": "ACTIVE",
           "DeliveryStreamName": "my-delivery-stream",
           "Destinations": [
               {
                   "DestinationId": "destinationId-000000000001",
                   "S3DestinationDescription": {
                       "CompressionFormat": "UNCOMPRESSED",
                       "EncryptionConfiguration": {
                           "NoEncryptionConfig": "NoEncryption"
                       },
                       "RoleARN": "delivery-stream-role",
                       "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket2",
                       "BufferingHints": {
                           "IntervalInSeconds": 300,
                           "SizeInMBs": 5
                       }
                   }
               }
           ]
       }
   }
   ```

1. 建立 IAM 角色，授予 CloudWatch Logs 將資料放入 Firehose 交付串流的許可。首先，使用文字編輯器來建立檔案 `~/TrustPolicyForCWL.json` 中的信任政策：

   此政策包含 `aws:SourceArn` 全域條件內容金鑰，以協助預防混淆代理人安全問題。如需詳細資訊，請參閱[預防混淆代理人](Subscriptions-confused-deputy.md)。

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

1. 使用 **create-role** 命令來建立 IAM 角色，並指定信任政策檔案。請記下傳回的 **Role.Arn** 值，因為在後續步驟中會需要它：

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

1. 建立許可政策以定義 CloudWatch Logs 可在您的帳戶上執行哪些動作。首先，使用文字編輯器來建立許可政策檔案 (例如，`~/PermissionsForCWL.json`)：

   ```
   {
       "Statement":[
         {
           "Effect":"Allow",
           "Action":["firehose:PutRecord"],
           "Resource":[
               "arn:aws:firehose:region:account-id:deliverystream/delivery-stream-name"]
         }
       ]
   }
   ```

1. 使用 put-role-policy 命令將許可政策與角色建立關聯：

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

1. 在 Amazon Data Firehose 交付串流處於作用中狀態且您已建立 IAM 角色後，您可以建立 CloudWatch Logs 帳戶層級訂閱篩選條件政策。此政策會立即啟動從所選日誌群組到 Amazon Data Firehose 交付串流的即時日誌資料流程：

   ```
   aws logs put-account-policy \
       --policy-name "ExamplePolicyFirehose" \
       --policy-type "SUBSCRIPTION_FILTER_POLICY" \
       --policy-document '{"RoleArn":"arn:aws:iam::123456789012:role/CWLtoKinesisFirehoseRole", "DestinationArn":"arn:aws:firehose:us-east-1:123456789012:deliverystream/delivery-stream-name", "FilterPattern": "Test", "Distribution": "Random"}' \
       --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \
       --scope "ALL"
   ```

1. 設定訂閱篩選條件後，CloudWatch Logs 會將符合篩選條件模式的傳入日誌事件轉送至您的 Amazon Data Firehose 交付串流。

   欄位是選用`selection-criteria`的，但對於排除可能導致訂閱篩選條件無限日誌遞迴的日誌群組非常重要。如需此問題和決定要排除哪些日誌群組的詳細資訊，請參閱 [日誌遞迴預防](Subscriptions-recursion-prevention.md)。目前， NOT IN 是 唯一支援的運算子`selection-criteria`。

   您的資料會根據 Amazon Data Firehose 交付串流上設定的時間緩衝間隔，開始出現在 Amazon S3 中。一旦經過足夠的時間，您就可以檢查 Amazon S3 儲存貯體來驗證資料。

   ```
   aws s3api list-objects --bucket 'amzn-s3-demo-bucket2' --prefix 'firehose/'
   {
       "Contents": [
           {
               "LastModified": "2023-10-29T00:01:25.000Z",
               "ETag": "\"a14589f8897f4089d3264d9e2d1f1610\"",
               "StorageClass": "STANDARD",
               "Key": "firehose/2015/10/29/00/my-delivery-stream-2015-10-29-00-01-21-a188030a-62d2-49e6-b7c2-b11f1a7ba250",
               "Owner": {
                   "DisplayName": "cloudwatch-logs",
                   "ID": "1ec9cf700ef6be062b19584e0b7d84ecc19237f87b5"
               },
               "Size": 593
           },
           {
               "LastModified": "2015-10-29T00:35:41.000Z",
               "ETag": "\"a7035b65872bb2161388ffb63dd1aec5\"",
               "StorageClass": "STANDARD",
               "Key": "firehose/2023/10/29/00/my-delivery-stream-2023-10-29-00-35-40-EXAMPLE-7e66-49bc-9fd4-fc9819cc8ed3",
               "Owner": {
                   "DisplayName": "cloudwatch-logs",
                   "ID": "EXAMPLE6be062b19584e0b7d84ecc19237f87b6"
               },
               "Size": 5752
           }
       ]
   }
   ```

   ```
   aws s3api get-object --bucket 'amzn-s3-demo-bucket2' --key 'firehose/2023/10/29/00/my-delivery-stream-2023-10-29-00-01-21-a188030a-62d2-49e6-b7c2-b11f1a7ba250' testfile.gz
   
   {
       "AcceptRanges": "bytes",
       "ContentType": "application/octet-stream",
       "LastModified": "Thu, 29 Oct 2023 00:07:06 GMT",
       "ContentLength": 593,
       "Metadata": {}
   }
   ```

   在 Amazon S3 物件中的資料會以 gzip 格式壓縮。您可以使用以下 Unix 命令來透過命令列檢查原始資料：

   ```
   zcat testfile.gz
   ```

# 跨帳戶跨區域訂閱
<a name="CrossAccountSubscriptions"></a>

您可以與不同 AWS 帳戶的擁有者合作，並在您的 AWS 資源上接收其日誌事件，例如 Amazon Kinesis 或 Amazon Data Firehose 串流 （這稱為跨帳戶資料共用）。例如，您可以從集中式 Amazon Kinesis Data Streams 或 Firehose 串流讀取此日誌事件資料，以執行自訂處理和分析。自訂處理在您進行跨多個帳戶的協作和分析資料時特別有用。

例如，公司的資訊安全群組可能要分析即時入侵偵測或異常行為的資料，讓它可以對公司所有部門的帳戶進行稽核，方法是收集他們的聯合身分生產日誌以集中處理。跨這些帳戶的事件資料即時串流可以組合並交付給資訊安全群組，而資訊安全群組可以使用 Amazon Kinesis Data Streams 將資料連接到其現有的安全分析系統。

**注意**  
日誌群組和目的地必須位於相同的 AWS 區域。不過，目的地指向的 AWS 資源可以位於不同的區域。在下列各節中的範例中，所有區域特定的資源都會在美國東部 （維吉尼亞北部） 建立）。

如果您已設定 AWS Organizations 並正在使用成員帳戶，您可以使用日誌集中，從來源帳戶收集日誌資料到中央監控帳戶。

使用集中式日誌群組時，您可以在建立訂閱篩選條件時使用下列系統欄位維度：
+ `@aws.account` - 此維度代表日誌事件來源 AWS 的帳戶 ID。
+ `@aws.region` - 此維度代表產生日誌事件 AWS 的區域。

這些維度有助於識別日誌資料來源，以便更精細地篩選和分析衍生自集中式日誌的指標。

**Topics**
+ [使用 Amazon Kinesis Data Streams 的跨帳戶跨區域日誌資料共用](CrossAccountSubscriptions-Kinesis.md)
+ [使用 Firehose 的跨帳戶跨區域日誌資料共用](CrossAccountSubscriptions-Firehose.md)
+ [使用 Amazon Kinesis Data Streams 的跨帳戶跨區域帳戶層級訂閱](CrossAccountSubscriptions-Kinesis-Account.md)
+ [使用 Firehose 的跨帳戶跨區域帳戶層級訂閱](CrossAccountSubscriptions-Firehose-Account.md)

# 使用 Amazon Kinesis Data Streams 的跨帳戶跨區域日誌資料共用
<a name="CrossAccountSubscriptions-Kinesis"></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.md)
+ [更新現有的跨帳戶訂閱](Cross-Account-Log_Subscription-Update.md)

# 設定新的跨帳戶訂閱
<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** 的日誌事件會立刻開始流向目的地。

# 更新現有的跨帳戶訂閱
<a name="Cross-Account-Log_Subscription-Update"></a>

如果您目前有跨帳戶日誌訂閱，其中目的地帳戶僅授予特定寄件者帳戶許可，而您想要更新此訂閱，讓目的地帳戶授予組織中所有帳戶的存取權，請按照本節中的步驟進行。

**Topics**
+ [步驟 1：更新訂閱篩選條件](Cross-Account-Log_Subscription-Update-filter.md)
+ [步驟 2：更新現有的目的地存取政策](Cross-Account-Log_Subscription-Update-policy.md)

# 步驟 1：更新訂閱篩選條件
<a name="Cross-Account-Log_Subscription-Update-filter"></a>

**注意**  
只有跨帳戶訂閱由 [從 AWS 服務啟用記錄](AWS-logs-and-resource-policy.md) 所列服務建立的日誌才需要此步驟。如果您不使用這些日誌群組之一建立的日誌，則可以跳至 [步驟 2：更新現有的目的地存取政策](Cross-Account-Log_Subscription-Update-policy.md)。

在某些情況下，您必須更新所有傳送日誌至目的地帳戶的寄件者帳戶中的訂閱篩選條件。此更新會新增 IAM 角色，CloudWatch 可以代入該角色並驗證寄件者帳戶是否具有將日誌傳送至收件人帳戶的許可。

針對您想要更新的每個寄件者帳戶，按照本節中的步驟進行，以將組織 ID 用於跨帳戶訂閱許可。

在本節的範例中，`111111111111` 和 `222222222222` 兩個帳戶已經建立訂閱篩選條件，以將日誌傳送至帳戶 `999999999999`。現有的訂閱篩選條件值如下：

```
## Existing Subscription Filter parameter values
    \ --log-group-name "my-log-group-name" 
    \ --filter-name "RecipientStream" 
    \ --filter-pattern "{$.userIdentity.type = Root}" 
    \ --destination-arn "arn:aws:logs:region:999999999999:destination:testDestination"
```

如果需要尋找目前的訂閱篩選條件參數值，請輸入下列命令。

```
aws logs describe-subscription-filters 
    \ --log-group-name "my-log-group-name"
```

**更新訂閱篩選條件以開始將組織 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-subscription-filter 
       \ --log-group-name "my-log-group-name" 
       \ --filter-name "RecipientStream" 
       \ --filter-pattern "{$.userIdentity.type = Root}" 
       \ --destination-arn "arn:aws:logs:region:999999999999:destination:testDestination"
       \ --role-arn "arn:aws:iam::111111111111:role/CWLtoSubscriptionFilterRole"
   ```

# 步驟 2：更新現有的目的地存取政策
<a name="Cross-Account-Log_Subscription-Update-policy"></a>

更新所有寄件者帳戶中的訂閱篩選條件之後，您可以更新收件人帳戶中的目的地存取政策。

下列範例中，收件人帳戶為 `999999999999`，且目的地名稱為 `testDestination`。

此更新可讓屬於組織且 ID 為 `o-1234567890` 的所有帳戶傳送日誌至收件人帳戶。只有已建立訂閱篩選條件的帳戶才會真的傳送日誌至收件人帳戶。

**更新收件人帳戶中的目的地存取政策，以開始將組織 ID 用於許可**

1. 在收件人帳戶中，使用文字編輯器建立 `~/AccessPolicy.json` 檔案，其中包含以下內容。

------
#### [ 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"
                       ]
                   }
               }
           }
       ]
   }
   ```

------

1. 輸入下列命令，將您剛建立的政策連接到現有的目的地。若要更新目的地以使用具有組織 ID 的存取政策，而非列出特定 AWS 帳戶 IDs的存取政策，請包含 `force` 參數。
**警告**  
如果您使用 中列出的 AWS 服務傳送的日誌[從 AWS 服務啟用記錄](AWS-logs-and-resource-policy.md)，則在執行此步驟之前，您必須先更新所有寄件者帳戶中的訂閱篩選條件，如 中所述[步驟 1：更新訂閱篩選條件](Cross-Account-Log_Subscription-Update-filter.md)。

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

# 使用 Firehose 的跨帳戶跨區域日誌資料共用
<a name="CrossAccountSubscriptions-Firehose"></a>

若要跨帳戶共用日誌資料，您需要建立日誌資料寄件者和接收者：
+ **日誌資料寄件者** - 從收件人取得目的地資訊，並讓 CloudWatch Logs 知道可開始將日誌事件傳送到指定的目的地。在本節其餘部分的程序中，日誌資料寄件者顯示的虛構 AWS 帳戶號碼為 111111111111。
+ **日誌資料收件人** - 設定封裝 Amazon Kinesis Data Streams 串流的目的地，並讓 CloudWatch Logs 知道收件人想要接收日誌資料。然後，收件人接著會與寄件者共用與其目的地有關的資訊。在本節其餘部分的程序中，日誌資料收件人的虛擬 AWS 帳戶號碼為 222222222222。

本節中的範例使用 Firehose 交付串流搭配 Amazon S3 儲存。您也可以使用不同的設定來設定 Firehose 交付串流。如需詳細資訊，請參閱[建立 Firehose 交付串流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

**注意**  
日誌群組和目的地必須位於相同的 AWS 區域。不過，目的地指向 AWS 的資源可以位於不同的 區域。

**注意**  
 支援***相同帳戶***和***跨區域***交付串流的 Firehose 訂閱篩選條件。

**Topics**
+ [步驟 1：建立 Firehose 交付串流](CreateFirehoseStream.md)
+ [步驟 2：建立目的地](CreateFirehoseStreamDestination.md)
+ [步驟 3：新增/驗證跨帳戶目的地的 IAM 許可](Subscription-Filter-CrossAccount-Permissions-Firehose.md)
+ [步驟 4：建立訂閱篩選條件](CreateSubscriptionFilterFirehose.md)
+ [驗證日誌事件的流程](ValidateLogEventFlowFirehose.md)
+ [在執行時間修改目的地成員資格](ModifyDestinationMembershipFirehose.md)

# 步驟 1：建立 Firehose 交付串流
<a name="CreateFirehoseStream"></a>

**重要**  
 在完成下列步驟之前，您必須使用 存取政策，以便 Firehose 可以存取您的 Amazon S3 儲存貯體。如需詳細資訊，請參閱《*Amazon Data Firehose 開發人員指南*》中的[控制存取](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#using-iam-s3)。  
 必須在日誌資料收件人帳戶中完成本區段 (步驟 1) 中的所有步驟。  
 在以下範例命令中使用美國東部 (維吉尼亞北部)。請將此區域替換成您部署的正確區域。

**建立要用作目的地的 Firehose 交付串流**

1. 建立 Amazon S3 儲存貯體：

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-bucket --create-bucket-configuration LocationConstraint=us-east-1
   ```

1. 建立 IAM 角色，授予 Firehose 將資料放入儲存貯體的許可。

   1. 首先，使用文字編輯器在檔案 `~/TrustPolicyForFirehose.json` 中建立信任政策。

      ```
      { "Statement": { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId":"222222222222" } } } }
      ```

   1. 建立 IAM 角色，並指定您剛建立的信任政策檔案。

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

   1. 此命令的輸出看起來如下：記下角色名稱和角色 ARN。

      ```
      {
          "Role": {
              "Path": "/",
              "RoleName": "FirehosetoS3Role",
              "RoleId": "AROAR3BXASEKW7K635M53",
              "Arn": "arn:aws:iam::222222222222:role/FirehosetoS3Role",
              "CreateDate": "2021-02-02T07:53:10+00:00",
              "AssumeRolePolicyDocument": {
                  "Statement": {
                      "Effect": "Allow",
                      "Principal": {
                          "Service": "firehose.amazonaws.com"
                      },
                      "Action": "sts:AssumeRole",
                      "Condition": {
                          "StringEquals": {
                              "sts:ExternalId": "222222222222"
                          }
                      }
                  }
              }
          }
      }
      ```

1. 建立許可政策，以定義 Firehose 可在您的帳戶中執行的動作。

   1. 首先，使用文字編輯器在名為 `~/PermissionsForFirehose.json` 的檔案中建立下列許可政策。根據您的使用案例，可能需要為此檔案新增更多許可。

      ```
      {
          "Statement": [{
              "Effect": "Allow",
              "Action": [
                  "s3:PutObject",
                  "s3:PutObjectAcl",
                  "s3:ListBucket"
              ],
              "Resource": [
                  "arn:aws:s3:::amzn-s3-demo-bucket",
                  "arn:aws:s3:::amzn-s3-demo-bucket/*"
              ]
          }]
      }
      ```

   1. 輸入下列命令，將您剛建立的許可政策與 IAM 角色相關聯。

      ```
      aws iam put-role-policy --role-name FirehosetoS3Role --policy-name Permissions-Policy-For-Firehose-To-S3 --policy-document file://~/PermissionsForFirehose.json
      ```

1. 輸入下列命令來建立 Firehose 交付串流。以部署的正確值取代 *my-role-arn* 和 *amzn-s3-demo-bucket2-arn*。

   ```
   aws firehose create-delivery-stream \
      --delivery-stream-name 'my-delivery-stream' \
      --s3-destination-configuration \
     '{"RoleARN": "arn:aws:iam::222222222222:role/FirehosetoS3Role", "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket"}'
   ```

   輸出格式應類似以下內容：

   ```
   {
       "DeliveryStreamARN": "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream"
   }
   ```

# 步驟 2：建立目的地
<a name="CreateFirehoseStreamDestination"></a>

**重要**  
此程序中的所有步驟必須在日誌資料收件人帳戶中完成。

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

**若要建立目的地**

1. 等到您在 中建立的 Firehose 串流[步驟 1：建立 Firehose 交付串流](CreateFirehoseStream.md)變成作用中。您可以使用以下命令來檢查 **StreamDescription.StreamStatus** 屬性。

   ```
   aws firehose describe-delivery-stream --delivery-stream-name "my-delivery-stream"
   ```

   此外，請留意 **DeliveryStreamDescription.DeliveryStreamARN** 值，因後續步驟中需要用到。此命令的範例輸出：

   ```
   {
       "DeliveryStreamDescription": {
           "DeliveryStreamName": "my-delivery-stream",
           "DeliveryStreamARN": "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream",
           "DeliveryStreamStatus": "ACTIVE",
           "DeliveryStreamEncryptionConfiguration": {
               "Status": "DISABLED"
           },
           "DeliveryStreamType": "DirectPut",
           "VersionId": "1",
           "CreateTimestamp": "2021-02-01T23:59:15.567000-08:00",
           "Destinations": [
               {
                   "DestinationId": "destinationId-000000000001",
                   "S3DestinationDescription": {
                       "RoleARN": "arn:aws:iam::222222222222:role/FirehosetoS3Role",
                       "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket",
                       "BufferingHints": {
                           "SizeInMBs": 5,
                           "IntervalInSeconds": 300
                       },
                       "CompressionFormat": "UNCOMPRESSED",
                       "EncryptionConfiguration": {
                           "NoEncryptionConfig": "NoEncryption"
                       },
                       "CloudWatchLoggingOptions": {
                           "Enabled": false
                       }
                   },
                   "ExtendedS3DestinationDescription": {
                       "RoleARN": "arn:aws:iam::222222222222:role/FirehosetoS3Role",
                       "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket",
                       "BufferingHints": {
                           "SizeInMBs": 5,
                           "IntervalInSeconds": 300
                       },
                       "CompressionFormat": "UNCOMPRESSED",
                       "EncryptionConfiguration": {
                           "NoEncryptionConfig": "NoEncryption"
                       },
                       "CloudWatchLoggingOptions": {
                           "Enabled": false
                       },
                       "S3BackupMode": "Disabled"
                   }
               }
           ],
           "HasMoreDestinations": false
       }
   }
   ```

   可能需要花費幾分鐘，交付串流才會變成作用中狀態。

1. 當交付串流處於作用中狀態時，請建立 IAM 角色，授予 CloudWatch Logs 將資料放入 Firehose 串流的許可。首先，您將需要在檔案 **\$1/TrustPolicyForCWL.json** 中建立信任政策。請使用文字編輯器來建立此政策。如需 CloudWatch Logs 端點的詳細資訊，請參閱 [Amazon CloudWatch Logs 端點和配額](https://docs.aws.amazon.com/general/latest/gr/cwl_region.html)。

   此政策包含 `aws:SourceArn` 全域條件內容金鑰，可指定 `sourceAccountId` 以協助預防混淆代理人安全問題。如果您在第一次呼叫中還不知道來源帳戶 ID，我們建議您將目的地 ARN 放在來源 ARN 欄位中。在後續呼叫中，應將來源 ARN 設定為從第一次呼叫中收集的實際來源 ARN。如需詳細資訊，請參閱[預防混淆代理人](Subscriptions-confused-deputy.md)。

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

1. 使用 **aws iam create-role** 命令來建立 IAM 角色，並指定您剛建立的信任政策檔案。

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

   下列為範例輸出。請留意傳回的 `Role.Arn` 值，因為後續步驟中需要用到。

   ```
   {
       "Role": {
           "Path": "/",
           "RoleName": "CWLtoKinesisFirehoseRole",
           "RoleId": "AROAR3BXASEKYJYWF243H",
           "Arn": "arn:aws:iam::222222222222:role/CWLtoKinesisFirehoseRole",
           "CreateDate": "2021-02-02T08:10:43+00:00",
           "AssumeRolePolicyDocument": {
               "Statement": {
                   "Effect": "Allow",
                   "Principal": {
                       "Service": "logs.region.amazonaws.com"
                   },
                   "Action": "sts:AssumeRole",
                   "Condition": {
                       "StringLike": {
                           "aws:SourceArn": [
                               "arn:aws:logs:region:sourceAccountId:*",
                               "arn:aws:logs:region:recipientAccountId:*"
                           ]
                       }
                   }
               }
           }
       }
   }
   ```

1. 建立許可政策以定義 CloudWatch Logs 可在您的帳戶上執行哪些動作。首先，使用文字編輯器在檔案 **\$1/PermissionsForCWL.json** 中建立許可政策：

   ```
   {
       "Statement":[
         {
           "Effect":"Allow",
           "Action":["firehose:*"],
           "Resource":["arn:aws:firehose:region:222222222222:*"]
         }
       ]
   }
   ```

1. 輸入以下命令，將許可政策與角色建立關聯：

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

1. Firehose 交付串流處於作用中狀態且您已建立 IAM 角色後，您可以建立 CloudWatch Logs 目的地。

   1. 此步驟不會將存取政策與您的目的地建立關聯，且為完成建立目的地之兩個步驟的僅第一個步驟。記下承載中傳回的新目的地的 ARN，因為您會在後續步驟中使用它作為 `destination.arn`。

      ```
      aws logs put-destination \                                                       
          --destination-name "testFirehoseDestination" \
          --target-arn "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream" \
          --role-arn "arn:aws:iam::222222222222:role/CWLtoKinesisFirehoseRole"
      
      {
          "destination": {
              "destinationName": "testFirehoseDestination",
              "targetArn": "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream",
              "roleArn": "arn:aws:iam::222222222222:role/CWLtoKinesisFirehoseRole",
              "arn": "arn:aws:logs:us-east-1:222222222222:destination:testFirehoseDestination"}
      }
      ```

   1. 上一個步驟完成後，請在日誌資料收件人帳戶中 (222222222222)，將存取政策與目的地建立關聯。

      此政策可讓日誌資料寄件者帳戶 (111111111111) 只能在日誌資料收件人帳戶 (222222222222) 中存取目的地。您可以使用文字編輯器來將此政策在放在 **\$1/AccessPolicy.json** 檔案中：

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

****  

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

------

   1. 這會建立可定義誰擁有對目的地的寫入存取權之政策。此政策必須指定 **logs:PutSubscriptionFilter** 動作來存取目的地。跨帳戶的使用者將使用 **PutSubscriptionFilter** 動作來將日誌事件傳送到目的地：

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

# 步驟 3：新增/驗證跨帳戶目的地的 IAM 許可
<a name="Subscription-Filter-CrossAccount-Permissions-Firehose"></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": "AllowSubscriptionFiltersOnAnyResourceInOneSpecificAccount",
               "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": "AllowSubscriptionFiltersOnSpecificResource",
               "Effect": "Allow",
               "Action": "logs:PutSubscriptionFilter",
               "Resource": [
                   "arn:aws:logs:*:*:log-group:*",
                   "arn:aws:logs:*:123456789012:destination:amzn-s3-demo-bucket"
               ]
           }
       ]
   }
   ```

------

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

切換到傳送端帳戶，在此範例中是 111111111111。您現在將在傳送端帳戶中建立訂閱篩選條件。在此範例中，篩選條件與包含 AWS CloudTrail 事件的日誌群組相關聯，因此「根」 AWS 憑證所做的每個記錄活動都會傳送到您先前建立的目的地。如需如何將 AWS CloudTrail 事件傳送至 CloudWatch Logs 的詳細資訊，請參閱*AWS CloudTrail 《 使用者指南*》中的[將 CloudTrail 事件傳送至 CloudWatch Logs](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/send-cloudtrail-events-to-cloudwatch-logs.html)。

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

```
aws logs put-subscription-filter \
    --log-group-name "aws-cloudtrail-logs-111111111111-300a971e" \                   
    --filter-name "firehose_test" \
    --filter-pattern "{$.userIdentity.type = AssumedRole}" \
    --destination-arn "arn:aws:logs:us-east-1:222222222222:destination:testFirehoseDestination"
```

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

# 驗證日誌事件的流程
<a name="ValidateLogEventFlowFirehose"></a>

建立訂閱篩選條件後，CloudWatch Logs 會將符合篩選條件模式的所有傳入日誌事件轉送至 Firehose 交付串流。根據 Firehose 交付串流上設定的時間緩衝間隔，資料開始出現在 Amazon S3 儲存貯體中。一旦經過足夠的時間，您就可以檢查 Amazon S3 儲存貯體來驗證資料。若要檢查儲存貯體，請輸入以下命令：

```
aws s3api list-objects --bucket 'amzn-s3-demo-bucket' 
```

該命令的輸出類似如下：

```
{
    "Contents": [
        {
            "Key": "2021/02/02/08/my-delivery-stream-1-2021-02-02-08-55-24-5e6dc317-071b-45ba-a9d3-4805ba39c2ba",
            "LastModified": "2021-02-02T09:00:26+00:00",
            "ETag": "\"EXAMPLEa817fb88fc770b81c8f990d\"",
            "Size": 198,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "firehose+2test",
                "ID": "EXAMPLE27fd05889c665d2636218451970ef79400e3d2aecca3adb1930042e0"
            }
        }
    ]
}
```

然後，您可以輸入下列命令，從儲存貯體擷取特定物件。將 `key` 的值換成您在前一個命令中找到的值。

```
aws s3api get-object --bucket 'amzn-s3-demo-bucket' --key '2021/02/02/08/my-delivery-stream-1-2021-02-02-08-55-24-5e6dc317-071b-45ba-a9d3-4805ba39c2ba' testfile.gz
```

在 Amazon S3 物件中的資料會以 gzip 格式壓縮。您可以從命令列使用下列其中一個命令來檢查原始資料：

Linux：

```
zcat testfile.gz
```

macOS：

```
zcat <testfile.gz
```

# 在執行時間修改目的地成員資格
<a name="ModifyDestinationMembershipFirehose"></a>

在某些情況下，您可能需要在您擁有的目的地中新增或移除日誌寄件者。您可以對含新存取政策的目的地使用 **PutDestinationPolicy** 動作。在下列範例中，之前新增的帳戶 **111111111111** 會停止傳送更多日誌資料，且帳戶 **333333333333** 會啟用。

1. 擷取目前與目的地 **testDestination** 相關聯的政策，並留意 **AccessPolicy**：

   ```
   aws logs describe-destinations \
       --destination-name-prefix "testFirehoseDestination"
   
   {
       "destinations": [
           {
               "destinationName": "testFirehoseDestination",
               "targetArn": "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream",
               "roleArn": "arn:aws:iam:: 222222222222:role/CWLtoKinesisFirehoseRole",
               "accessPolicy": "{\n  \"Version\" : \"2012-10-17\",\n  \"Statement\" : [\n    {\n      \"Sid\" : \"\",\n      \"Effect\" : \"Allow\",\n      \"Principal\" : {\n        \"AWS\" : \"111111111111 \"\n      },\n      \"Action\" : \"logs:PutSubscriptionFilter\",\n      \"Resource\" : \"arn:aws:logs:us-east-1:222222222222:destination:testFirehoseDestination\"\n    }\n  ]\n}\n\n",
               "arn": "arn:aws:logs:us-east-1: 222222222222:destination:testFirehoseDestination",
               "creationTime": 1612256124430
           }
       ]
   }
   ```

1. 更新政策，以反映帳戶 **111111111111** 已停用，且帳戶 **333333333333** 已啟用。將此政策放置在 **\$1/NewAccessPolicy.json** 檔案中：

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

****  

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

------

1. 使用以下命令將 **NewAccessPolicy.json** 檔案中定義的政策與目的地建立關聯：

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

   這最終會停止來自帳戶 ID **111111111111** 的日誌事件。在帳戶 **333333333333** 的擁有者建立訂閱篩選條件後，來自帳戶 ID **333333333333** 的日誌事件會立刻開始流向目的地。

# 使用 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
   ```

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

若要跨帳戶共用日誌資料，您需要建立日誌資料寄件者和接收者：
+ **日誌資料寄件者** - 從收件人取得目的地資訊，並讓 CloudWatch Logs 知道可開始將日誌事件傳送到指定的目的地。在本節其餘部分的程序中，日誌資料寄件者顯示的虛構 AWS 帳戶號碼為 111111111111。
+ **日誌資料收件人** - 設定封裝 Amazon Kinesis Data Streams 串流的目的地，並讓 CloudWatch Logs 知道收件人想要接收日誌資料。然後，收件人接著會與寄件者共用與其目的地有關的資訊。在本節其餘部分的程序中，日誌資料收件人的虛構 AWS 帳戶號碼為 222222222222。

本節中的範例使用 Firehose 交付串流搭配 Amazon S3 儲存。您也可以使用不同的設定來設定 Firehose 交付串流。如需詳細資訊，請參閱[建立 Firehose 交付串流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

**注意**  
日誌群組和目的地必須位於相同的 AWS 區域。不過，目的地指向 AWS 的資源可以位於不同的 區域。

**注意**  
 支援***相同帳戶***和***跨區域***交付串流的 Firehose 訂閱篩選條件。

**Topics**
+ [步驟 1：建立 Firehose 交付串流](CreateFirehoseStream-Account.md)
+ [步驟 2：建立目的地](CreateFirehoseStreamDestination-Account.md)
+ [步驟 3：建立帳戶層級訂閱篩選條件政策](CreateSubscriptionFilterFirehose-Account.md)
+ [驗證日誌事件的流程](ValidateLogEventFlowFirehose-Account.md)
+ [在執行時間修改目的地成員資格](ModifyDestinationMembershipFirehose-Account.md)

# 步驟 1：建立 Firehose 交付串流
<a name="CreateFirehoseStream-Account"></a>

**重要**  
 在完成下列步驟之前，您必須使用存取政策，以便 Firehose 可以存取您的 Amazon S3 儲存貯體。如需詳細資訊，請參閱《*Amazon Data Firehose 開發人員指南*》中的[控制存取](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#using-iam-s3)。  
 必須在日誌資料收件人帳戶中完成本區段 (步驟 1) 中的所有步驟。  
 在以下範例命令中使用美國東部 (維吉尼亞北部)。請將此區域替換成您部署的正確區域。

**建立要用作目的地的 Firehose 交付串流**

1. 建立 Amazon S3 儲存貯體：

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-bucket --create-bucket-configuration LocationConstraint=us-east-1
   ```

1. 建立 IAM 角色，授予 Firehose 將資料放入儲存貯體的許可。

   1. 首先，使用文字編輯器在檔案 `~/TrustPolicyForFirehose.json` 中建立信任政策。

      ```
      { "Statement": { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId":"222222222222" } } } }
      ```

   1. 建立 IAM 角色，並指定您剛建立的信任政策檔案。

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

   1. 此命令的輸出看起來如下：記下角色名稱和角色 ARN。

      ```
      {
          "Role": {
              "Path": "/",
              "RoleName": "FirehosetoS3Role",
              "RoleId": "AROAR3BXASEKW7K635M53",
              "Arn": "arn:aws:iam::222222222222:role/FirehosetoS3Role",
              "CreateDate": "2021-02-02T07:53:10+00:00",
              "AssumeRolePolicyDocument": {
                  "Statement": {
                      "Effect": "Allow",
                      "Principal": {
                          "Service": "firehose.amazonaws.com"
                      },
                      "Action": "sts:AssumeRole",
                      "Condition": {
                          "StringEquals": {
                              "sts:ExternalId": "222222222222"
                          }
                      }
                  }
              }
          }
      }
      ```

1. 建立許可政策，以定義 Firehose 可以在您的帳戶中執行的動作。

   1. 首先，使用文字編輯器在名為 `~/PermissionsForFirehose.json` 的檔案中建立下列許可政策。根據您的使用案例，可能需要為此檔案新增更多許可。

      ```
      {
          "Statement": [{
              "Effect": "Allow",
              "Action": [
                  "s3:PutObject",
                  "s3:PutObjectAcl",
                  "s3:ListBucket"
              ],
              "Resource": [
                  "arn:aws:s3:::amzn-s3-demo-bucket",
                  "arn:aws:s3:::amzn-s3-demo-bucket/*"
              ]
          }]
      }
      ```

   1. 輸入下列命令，將您剛建立的許可政策與 IAM 角色相關聯。

      ```
      aws iam put-role-policy --role-name FirehosetoS3Role --policy-name Permissions-Policy-For-Firehose-To-S3 --policy-document file://~/PermissionsForFirehose.json
      ```

1. 輸入下列命令來建立 Firehose 交付串流。以部署的正確值取代 *my-role-arn* 和 *amzn-s3-demo-bucket2-arn*。

   ```
   aws firehose create-delivery-stream \
      --delivery-stream-name 'my-delivery-stream' \
      --s3-destination-configuration \
     '{"RoleARN": "arn:aws:iam::222222222222:role/FirehosetoS3Role", "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket"}'
   ```

   輸出格式應類似以下內容：

   ```
   {
       "DeliveryStreamARN": "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream"
   }
   ```

# 步驟 2：建立目的地
<a name="CreateFirehoseStreamDestination-Account"></a>

**重要**  
此程序中的所有步驟必須在日誌資料收件人帳戶中完成。

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

**若要建立目的地**

1. 等到您在 中建立的 Firehose 串流[步驟 1：建立 Firehose 交付串流](CreateFirehoseStream-Account.md)變成作用中。您可以使用以下命令來檢查 **StreamDescription.StreamStatus** 屬性。

   ```
   aws firehose describe-delivery-stream --delivery-stream-name "my-delivery-stream"
   ```

   此外，請留意 **DeliveryStreamDescription.DeliveryStreamARN** 值，因後續步驟中需要用到。此命令的範例輸出：

   ```
   {
       "DeliveryStreamDescription": {
           "DeliveryStreamName": "my-delivery-stream",
           "DeliveryStreamARN": "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream",
           "DeliveryStreamStatus": "ACTIVE",
           "DeliveryStreamEncryptionConfiguration": {
               "Status": "DISABLED"
           },
           "DeliveryStreamType": "DirectPut",
           "VersionId": "1",
           "CreateTimestamp": "2021-02-01T23:59:15.567000-08:00",
           "Destinations": [
               {
                   "DestinationId": "destinationId-000000000001",
                   "S3DestinationDescription": {
                       "RoleARN": "arn:aws:iam::222222222222:role/FirehosetoS3Role",
                       "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket",
                       "BufferingHints": {
                           "SizeInMBs": 5,
                           "IntervalInSeconds": 300
                       },
                       "CompressionFormat": "UNCOMPRESSED",
                       "EncryptionConfiguration": {
                           "NoEncryptionConfig": "NoEncryption"
                       },
                       "CloudWatchLoggingOptions": {
                           "Enabled": false
                       }
                   },
                   "ExtendedS3DestinationDescription": {
                       "RoleARN": "arn:aws:iam::222222222222:role/FirehosetoS3Role",
                       "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket",
                       "BufferingHints": {
                           "SizeInMBs": 5,
                           "IntervalInSeconds": 300
                       },
                       "CompressionFormat": "UNCOMPRESSED",
                       "EncryptionConfiguration": {
                           "NoEncryptionConfig": "NoEncryption"
                       },
                       "CloudWatchLoggingOptions": {
                           "Enabled": false
                       },
                       "S3BackupMode": "Disabled"
                   }
               }
           ],
           "HasMoreDestinations": false
       }
   }
   ```

   可能需要花費幾分鐘，交付串流才會變成作用中狀態。

1. 當交付串流處於作用中狀態時，請建立 IAM 角色，以授予 CloudWatch Logs 將資料放入 Firehose 串流的許可。首先，您將需要在檔案 **\$1/TrustPolicyForCWL.json** 中建立信任政策。請使用文字編輯器來建立此政策。如需 CloudWatch Logs 端點的詳細資訊，請參閱 [Amazon CloudWatch Logs 端點和配額](https://docs.aws.amazon.com/general/latest/gr/cwl_region.html)。

   此政策包含 `aws:SourceArn` 全域條件內容金鑰，可指定 `sourceAccountId` 以協助預防混淆代理人安全問題。如果您在第一次呼叫中還不知道來源帳戶 ID，我們建議您將目的地 ARN 放在來源 ARN 欄位中。在後續呼叫中，應將來源 ARN 設定為從第一次呼叫中收集的實際來源 ARN。如需詳細資訊，請參閱[預防混淆代理人](Subscriptions-confused-deputy.md)。

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

1. 使用 **aws iam create-role** 命令來建立 IAM 角色，並指定您剛建立的信任政策檔案。

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

   下列為範例輸出。請留意傳回的 `Role.Arn` 值，因為後續步驟中需要用到。

   ```
   {
       "Role": {
           "Path": "/",
           "RoleName": "CWLtoKinesisFirehoseRole",
           "RoleId": "AROAR3BXASEKYJYWF243H",
           "Arn": "arn:aws:iam::222222222222:role/CWLtoKinesisFirehoseRole",
           "CreateDate": "2023-02-02T08:10:43+00:00",
           "AssumeRolePolicyDocument": {
               "Statement": {
                   "Effect": "Allow",
                   "Principal": {
                       "Service": "logs.amazonaws.com"
                   },
                   "Action": "sts:AssumeRole",
                   "Condition": {
                       "StringLike": {
                           "aws:SourceArn": [
                               "arn:aws:logs:region:sourceAccountId:*",
                               "arn:aws:logs:region:recipientAccountId:*"
                           ]
                       }
                   }
               }
           }
       }
   }
   ```

1. 建立許可政策以定義 CloudWatch Logs 可在您的帳戶上執行哪些動作。首先，使用文字編輯器在檔案 **\$1/PermissionsForCWL.json** 中建立許可政策：

   ```
   {
       "Statement":[
         {
           "Effect":"Allow",
           "Action":["firehose:*"],
           "Resource":["arn:aws:firehose:region:222222222222:*"]
         }
       ]
   }
   ```

1. 輸入以下命令，將許可政策與角色建立關聯：

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

1. Firehose 交付串流處於作用中狀態且您已建立 IAM 角色後，您可以建立 CloudWatch Logs 目的地。

   1. 此步驟不會將存取政策與您的目的地建立關聯，且為完成建立目的地之兩個步驟的僅第一個步驟。記下承載中傳回的新目的地的 ARN，因為您會在後續步驟中使用它作為 `destination.arn`。

      ```
      aws logs put-destination \                                                       
          --destination-name "testFirehoseDestination" \
          --target-arn "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream" \
          --role-arn "arn:aws:iam::222222222222:role/CWLtoKinesisFirehoseRole"
      
      {
          "destination": {
              "destinationName": "testFirehoseDestination",
              "targetArn": "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream",
              "roleArn": "arn:aws:iam::222222222222:role/CWLtoKinesisFirehoseRole",
              "arn": "arn:aws:logs:us-east-1:222222222222:destination:testFirehoseDestination"}
      }
      ```

   1. 上一個步驟完成後，請在日誌資料收件人帳戶中 (222222222222)，將存取政策與目的地建立關聯。此政策可讓日誌資料寄件者帳戶 (111111111111) 只能在日誌資料收件人帳戶 (222222222222) 中存取目的地。您可以使用文字編輯器，將此政策放入 `~/AccessPolicy.json`檔案中：

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

****  

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

------

   1. 這會建立可定義誰擁有對目的地的寫入存取權之政策。此政策必須指定 `logs:PutSubscriptionFilter`和 `logs:PutAccountPolicy`動作才能存取目的地。跨帳戶使用者將使用 `PutSubscriptionFilter`和 `PutAccountPolicy`動作，將日誌事件傳送至目的地。

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

# 步驟 3：建立帳戶層級訂閱篩選條件政策
<a name="CreateSubscriptionFilterFirehose-Account"></a>

切換到傳送端帳戶，在此範例中是 111111111111。您現在將在傳送帳戶中建立帳戶層級訂閱篩選條件政策。在此範例中，篩選條件會導致除了兩個日誌群組之外`ERROR`，所有包含字串的每個日誌事件，都交付到您先前建立的目的地。

```
aws logs put-account-policy \
    --policy-name "CrossAccountFirehoseExamplePolicy" \
    --policy-type "SUBSCRIPTION_FILTER_POLICY" \
    --policy-document '{"DestinationArn":"arn:aws:logs:us-east-1:222222222222:destination:testFirehoseDestination", "FilterPattern": "{$.userIdentity.type = AssumedRole}", "Distribution": "Random"}' \
    --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \
    --scope "ALL"
```

傳送帳戶的日誌群組和目的地必須位於相同的 AWS 區域。不過，目的地可以指向 AWS 資源，例如位於不同區域的 Firehose 串流。

# 驗證日誌事件的流程
<a name="ValidateLogEventFlowFirehose-Account"></a>

建立訂閱篩選條件後，CloudWatch Logs 會將符合篩選條件模式和選取條件的所有傳入日誌事件轉送至 Firehose 交付串流。根據 Firehose 交付串流上設定的時間緩衝間隔，資料開始出現在 Amazon S3 儲存貯體中。一旦經過足夠的時間，您就可以檢查 Amazon S3 儲存貯體來驗證資料。若要檢查儲存貯體，請輸入以下命令：

```
aws s3api list-objects --bucket 'amzn-s3-demo-bucket' 
```

該命令的輸出類似如下：

```
{
    "Contents": [
        {
            "Key": "2021/02/02/08/my-delivery-stream-1-2021-02-02-08-55-24-5e6dc317-071b-45ba-a9d3-4805ba39c2ba",
            "LastModified": "2023-02-02T09:00:26+00:00",
            "ETag": "\"EXAMPLEa817fb88fc770b81c8f990d\"",
            "Size": 198,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "firehose+2test",
                "ID": "EXAMPLE27fd05889c665d2636218451970ef79400e3d2aecca3adb1930042e0"
            }
        }
    ]
}
```

然後，您可以輸入下列命令，從儲存貯體擷取特定物件。將 `key` 的值換成您在前一個命令中找到的值。

```
aws s3api get-object --bucket 'amzn-s3-demo-bucket' --key '2021/02/02/08/my-delivery-stream-1-2021-02-02-08-55-24-5e6dc317-071b-45ba-a9d3-4805ba39c2ba' testfile.gz
```

在 Amazon S3 物件中的資料會以 gzip 格式壓縮。您可以從命令列使用下列其中一個命令來檢查原始資料：

Linux：

```
zcat testfile.gz
```

macOS：

```
zcat <testfile.gz
```

# 在執行時間修改目的地成員資格
<a name="ModifyDestinationMembershipFirehose-Account"></a>

在某些情況下，您可能需要在您擁有的目的地中新增或移除日誌寄件者。您可以使用 **PutDestinationPolicy** 和目的地上的`PutAccountPolicy`動作搭配新的存取政策。在下列範例中，之前新增的帳戶 **111111111111** 會停止傳送更多日誌資料，且帳戶 **333333333333** 會啟用。

1. 擷取目前與目的地 **testDestination** 相關聯的政策，並留意 **AccessPolicy**：

   ```
   aws logs describe-destinations \
       --destination-name-prefix "testFirehoseDestination"
   ```

   傳回的資料可能如下所示。

   ```
   {
       "destinations": [
           {
               "destinationName": "testFirehoseDestination",
               "targetArn": "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream",
               "roleArn": "arn:aws:iam:: 222222222222:role/CWLtoKinesisFirehoseRole",
               "accessPolicy": "{\n  \"Version\" : \"2012-10-17\",\n  \"Statement\" : [\n    {\n      \"Sid\" : \"\",\n      \"Effect\" : \"Allow\",\n      \"Principal\" : {\n        \"AWS\" : \"111111111111 \"\n      },\n      \"Action\" : \"logs:PutSubscriptionFilter\",\n      \"Resource\" : \"arn:aws:logs:us-east-1:222222222222:destination:testFirehoseDestination\"\n    }\n  ]\n}\n\n",
               "arn": "arn:aws:logs:us-east-1: 222222222222:destination:testFirehoseDestination",
               "creationTime": 1612256124430
           }
       ]
   }
   ```

1. 更新政策，以反映帳戶 **111111111111** 已停用，且帳戶 **333333333333** 已啟用。將此政策放置在 **\$1/NewAccessPolicy.json** 檔案中：

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

****  

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

------

1. 使用以下命令將 **NewAccessPolicy.json** 檔案中定義的政策與目的地建立關聯：

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

   這最終會停止來自帳戶 ID **111111111111** 的日誌事件。在帳戶 **333333333333** 的擁有者建立訂閱篩選條件後，來自帳戶 ID **333333333333** 的日誌事件會立刻開始流向目的地。

# 預防混淆代理人
<a name="Subscriptions-confused-deputy"></a>

混淆代理人問題屬於安全性議題，其中沒有執行動作許可的實體可以強制具有更多許可的實體執行該動作。在 中 AWS，跨服務模擬可能會導致混淆代理人問題。在某個服務 (呼叫服務) 呼叫另一個服務 (被呼叫服務) 時，可能會發生跨服務模擬。可以操縱呼叫服務來使用其許可，以其不應有存取許可的方式對其他客戶的資源採取動作。為了防止這種情況， AWS 提供工具，協助您保護所有 服務的資料，讓 服務主體能夠存取您帳戶中的資源。

我們建議在資源政策中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)、[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceorgid](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceorgid)、 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceorgpaths](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceorgpaths)全域條件內容索引鍵，以限制將另一個服務提供給資源的許可。使用 `aws:SourceArn`，僅將一個資源與跨服務存取權相關聯。使用 `aws:SourceAccount`，讓該帳戶中的任何資源都與跨服務使用相關聯。使用 `aws:SourceOrgID`，允許組織內任何帳戶的任何資源與跨服務使用相關聯。使用 `aws:SourceOrgPaths`，將 AWS Organizations 路徑中帳戶的任何資源與跨服務使用相關聯。如需使用和了解路徑的詳細資訊，請參閱[了解 AWS Organizations 實體路徑](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_last-accessed-view-data-orgs.html#access_policies_last-accessed-viewing-orgs-entity-path)。

防範混淆代理人問題的最有效方法是使用 `aws:SourceArn` 全域條件內容索引鍵，以及資源的完整 ARN。如果不知道資源的完整 ARN，或者如果您指定了多個資源，請使用 `aws:SourceArn` 全域內容條件索引鍵搭配萬用字元 (`*`) 來表示 ARN 的未知部分。例如 `arn:aws:servicename:*:123456789012:*`。

如果 `aws:SourceArn` 值不包含帳戶 ID (例如 Amazon S3 儲存貯體 ARN)，您必須同時使用 `aws:SourceAccount` 和 `aws:SourceArn` 來限制許可。

若要大規模防範混淆代理人問題，請在資源型政策中使用 `aws:SourceOrgID` 或 `aws:SourceOrgPaths` 全域條件內容鍵和資源的組織 ID 或組織路徑。當您新增、移除或移動組織中的帳戶時，包含 `aws:SourceOrgID` 或 `aws:SourceOrgPaths` 鍵的政策將會自動包含正確的帳戶，您無需手動更新政策。

記載的政策用於授予對 CloudWatch Logs 的存取權，以將資料寫入 中的 Amazon Kinesis Data Streams 和 Firehose，[步驟 1：建立目的地](CreateDestination.md)並[步驟 2：建立目的地](CreateFirehoseStreamDestination.md)示範如何使用`aws:SourceArn`全域條件內容金鑰來協助防止混淆代理人問題。

# 日誌遞迴預防
<a name="Subscriptions-recursion-prevention"></a>

如果未防止，訂閱篩選條件可能會導致 CloudWatch Logs 和目的地的擷取計費大幅增加，則存在導致無限日誌遞迴的風險。當訂閱篩選條件與因訂閱交付工作流程而接收日誌事件的日誌群組相關聯時，就會發生這種情況。擷取到日誌群組的日誌會傳送到目的地，導致日誌群組擷取更多日誌，然後再次轉送到目的地，建立遞迴迴圈。

例如，將目的地為 Firehose 的訂閱篩選條件視為 Firehose，這會將日誌事件交付給 Amazon S3。此外，也有 Lambda 函數可處理交付至 Amazon S3 的新事件，並產生一些日誌本身。如果訂閱篩選條件套用至 Lambda 函數的日誌群組，則函數產生的日誌事件會在目的地轉送至 Firehose 和 Amazon S3，然後再次叫用該函數，導致產生更多日誌並轉送至 Firehose 和 Amazon S3，進而再次叫用該函數等。這將發生在無限迴圈中，導致日誌擷取、Firehose 和 Amazon S3 的計費意外增加。

如果 Lambda 函數連接到已啟用 CloudWatch Logs 流程日誌的 VPC，則 VPC 的日誌群組也可能導致日誌遞迴。

建議您不要將訂閱篩選條件套用至屬於訂閱交付工作流程一部分的日誌群組。對於帳戶層級訂閱篩選條件，請使用 `PutAccountPolicy` API 中的 `selectionCriteria` 參數，從政策中排除這些日誌群組。

排除日誌群組時，請考慮下列產生日誌的服務，這些 AWS 服務可能是訂閱交付工作流程的一部分：
+ Amazon EC2 搭配 Fargate
+ Lambda
+ AWS 步驟函數
+ 為 CloudWatch Logs 啟用的 Amazon VPC 流程日誌

**注意**  
Lambda 目的地的日誌群組所產生的日誌事件將不會轉送回帳戶層級訂閱篩選條件政策的 Lambda 函數。在此情況下，帳戶訂閱政策`selectionCriteria`不需要使用 排除目的地 Lambda 函數的日誌群組。