將 Lambda 函式日誌傳送至 Amazon S3 - AWS Lambda

將 Lambda 函式日誌傳送至 Amazon S3

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

注意

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

定價

如需定價詳細資訊,請參閱 Amazon CloudWatch 定價

Amazon S3 日誌目的地的必要許可

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

  1. 將 CloudWatch Logs 與 Lambda 搭配使用所需的 IAM 許可

  2. 設定 CloudWatch Logs 訂閱篩選條件,將 Lambda 函式日誌傳送至 Amazon S3。此篩選條件會定義要傳送至 Amazon S3 儲存貯體的日誌事件。

設定 CloudWatch Logs 訂閱篩選條件,將 Lambda 函式日誌傳送至 Amazon S3

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

建立 Amazon S3 的訂閱篩選條件

  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" }
  2. 建立 IAM 角色,授予 CloudWatch Logs 將資料放入 Amazon S3 儲存貯體的許可。此政策包含一個 aws:SourceArn 全域條件內容索引鍵,可協助防範混淆代理人安全問題。如需詳細資訊,請參閱混淆代理人防範

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

      { "Statement": { "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Condition": { "StringLike": { "aws:SourceArn": "arn:aws:logs:region:123456789012:*" } }, "Action": "sts:AssumeRole" } }
    2. 使用 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" } }
  3. 建立許可政策以定義 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
  4. 建立一個 Delivery 日誌群組,或使用現有的 Delivery 日誌群組。

    aws logs create-log-group --log-group-name my-logs --log-group-class DELIVERY --region REGION_NAME
  5. 使用 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

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

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

  2. 選擇函式的名稱。

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

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

  5. 在「日誌記錄組態」區段中,選擇編輯

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

  7. 在「日誌目的地」區段中,完成下列步驟:

    1. 選擇目的地服務。

    2. 選擇建立新日誌群組,或使用現有日誌群組

      注意

      若為 Amazon S3 目的地選擇現有日誌群組,請確保所選日誌群組的類型為 Delivery 日誌群組。

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

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

  8. 選擇儲存

注意

若主控台中提供的 IAM 角色沒有必要許可,則目的地設定會失敗。若要修正此問題,請參閱 Amazon S3 日誌目的地的必要許可

跨帳戶日誌記錄

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

如需有關設定跨帳戶日誌記錄的詳細說明,包括必要的 IAM 角色與政策,請參閱 CloudWatch Logs 文件中的 Setting up a new cross-account subscription