

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

# 將 Lambda 函式日誌傳送至 Amazon S3
<a name="logging-with-s3"></a>

您可以透過 Lambda 主控台設定 Lambda 函式，將日誌直接傳送至 Amazon S3。此功能為長期日誌儲存提供了一種經濟實惠的解決方案，還可使用 Athena 等服務實現強大的分析功能。

**注意**  
您可以透過 Lambda 主控台、AWS CLI、AWS CloudFormation 和所有 AWS SDK，設定將 Lambda 函式日誌傳送至 Amazon S3。

## 定價
<a name="logging-s3-pricing"></a>

如需定價詳細資訊，請參閱 [Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/#Vended_Logs)。

## Amazon S3 日誌目的地的必要許可
<a name="logging-s3-permissions"></a>

在使用 Lambda 主控台將 Amazon S3 設定為函式的日誌目的地時，您需要滿足如下條件：

1. 將 CloudWatch Logs 與 Lambda 搭配使用[所需的 IAM 許可](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html#monitoring-cloudwatchlogs-prereqs)。

1. [設定 CloudWatch Logs 訂閱篩選條件，將 Lambda 函式日誌傳送至 Amazon S3](#using-cwl-subscription-filter-lambda-s3)。此篩選條件會定義要傳送至 Amazon S3 儲存貯體的日誌事件。

## 設定 CloudWatch Logs 訂閱篩選條件，將 Lambda 函式日誌傳送至 Amazon S3
<a name="using-cwl-subscription-filter-lambda-s3"></a>

要將日誌從 CloudWatch Logs 傳送至 Amazon S3，您需建立訂閱篩選條件。此篩選條件會定義要傳送至 Amazon S3 儲存貯體的日誌事件。您的 Amazon S3 儲存貯體必須與日誌群組位於同一個區域。

### 建立 Amazon S3 的訂閱篩選條件
<a name="create-subscription-filter-s3"></a>

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
   ```
**注意**  
`amzn-s3-demo-bucket2` 為 Amazon S3 儲存貯體名稱的範例。該名稱已被*保留*。若要讓此程序正常運作，您必須將其取代為唯一的 Amazon S3 儲存貯體名稱。

   下列為範例輸出：

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

1. 建立 IAM 角色，授予 CloudWatch Logs 將資料放入 Amazon S3 儲存貯體的許可。此政策包含一個 aws:SourceArn 全域條件內容索引鍵，可協助防範混淆代理人安全問題。如需詳細資訊，請參閱[混淆代理人防範](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions-confused-deputy.html)。

   1. 使用文字編輯器在 `~/TrustPolicyForCWL.json` 檔案中建立信任政策，如下所示：

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

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

      ```
      aws iam create-role \
       --role-name CWLtoS3Role \
       --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": "CWLtoS3Role",
              "Path": "/",
              "Arn": "arn:aws:iam::123456789012:role/CWLtoS3Role"
          }
      }
      ```

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

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

   使用下列 `put-role-policy` 命令，將許可政策與角色建立關聯：

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

1. 建立一個 `Delivery` 日誌群組，或使用現有的 `Delivery` 日誌群組。

   ```
   aws logs create-log-group --log-group-name my-logs --log-group-class DELIVERY --region REGION_NAME
   ```

1. 使用 `PutSubscriptionFilter` 命令設定目的地

   ```
   aws logs put-subscription-filter
   --log-group-name my-logs
   --filter-name my-lambda-delivery
   --filter-pattern ""
   --destination-arn arn:aws:s3:::amzn-s3-demo-bucket2
   --role-arn arn:aws:iam::123456789012:role/CWLtoS3Role
   --region REGION_NAME
   ```

## 將 Lambda 函式日誌傳送至 Amazon S3
<a name="logging-s3-setup"></a>

在 Lambda 主控台中，您可以在建立新函式之後將函式日誌直接傳送至 Amazon S3。若要執行此動作，請執行下列步驟：

1. 登入 AWS 管理主控台，並開啟 Lambda 主控台。

1. 選擇函式的名稱。

1. 選擇 **Configuration** (組態) 索引標籤。

1. 選擇**監控與操作工具**索引標籤。

1. 在「日誌記錄組態」區段中，選擇**編輯**。

1. 在「日誌內容」區段中，選取一種日誌格式。

1. 在「日誌目的地」區段中，完成下列步驟：

   1. 選擇目的地服務。

   1. 選擇**建立新日誌群組**，或使用**現有日誌群組**。
**注意**  
若為 Amazon S3 目的地選擇現有日誌群組，請確保所選日誌群組的類型為 `Delivery` 日誌群組。

   1. 選擇要用作函式日誌目的地的 Amazon S3 儲存貯體。

   1. CloudWatch `Delivery` 日誌群組隨即顯示。

1. 選擇**儲存**。

**注意**  
若主控台中提供的 IAM 角色沒有必要許可，則目的地設定會失敗。若要修正此問題，請參閱 [Amazon S3 日誌目的地的必要許可](#logging-s3-permissions)。

## 跨帳戶日誌記錄
<a name="cross-account-logging-s3"></a>

您可以設定 Lambda 將日誌傳送至不同 AWS 帳戶的 Amazon S3 儲存貯體。這需要設定目的地，並在兩個帳戶中設定適當的許可。

如需有關設定跨帳戶日誌記錄的詳細說明，包括必要的 IAM 角色與政策，請參閱 CloudWatch Logs 文件中的 [Setting up a new cross-account subscription](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CrossAccountSubscriptions.html)。