使用 AWS CLI 将日志数据导出到 Amazon S3 - Amazon CloudWatch 日志

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS CLI 将日志数据导出到 Amazon S3

在以下示例中,您使用导出任务将名为的 CloudWatch 日志日志组中的所有数据导出my-log-group到名为的 Amazon S3 存储桶my-exported-logs。此示例假定您已创建了一个名为 my-log-group 的日志组。

支持将日志数据导出到由 AWS KMS 加密的 S3 桶。

步骤 1:创建 S3 存储桶

我们建议您使用专为 Logs 创建的存储 CloudWatch 桶。但是,如果要使用现有存储桶,请跳至第 2 步。

注意

S3 存储桶必须与要导出的日志数据位于同一个区域中。 CloudWatch 日志不支持将数据导出到其他区域的 S3 存储桶。

使用 AWS CLI 创建 S3 桶

在命令提示符处,运行以下 create-bucket 命令,其中 LocationConstraint 是您要将日志数据导出到的区域。

aws s3api create-bucket --bucket my-exported-logs --create-bucket-configuration LocationConstraint=us-east-2

下面是示例输出。

{ "Location": "/my-exported-logs" }

步骤 2:设置访问权限

要在步骤 5 中创建导出任务,您需要分配 AmazonS3ReadOnlyAccess IAM 角色和以下权限:

  • logs:CreateExportTask

  • logs:CancelExportTask

  • logs:DescribeExportTasks

  • logs:DescribeLogStreams

  • logs:DescribeLogGroups

要提供访问权限,请为您的用户、组或角色添加权限:

步骤 3:在 S3 桶上设置权限

默认情况下,所有 S3 桶和对象都是私有的。仅资源所有者(创建了存储桶的账户)能够访问存储桶及其包含的任何对象。不过,资源所有者可以选择通过编写访问策略来向其他资源和用户授予访问权限。

重要

为了使导出到 S3 桶更加安全,我们现在要求您指定允许将日志数据导出到 S3 桶的源账户列表。

以下示例中,aws:SourceAccount 密钥中账户 ID 的列表会是用户可以从其中将日志数据导出到 S3 存储桶的账户。aws:SourceArn 密钥是正在进行的操作的资源。如本示例所示,您可以将其限制为特定的日志组,也可以使用通配符。

建议您还包括创建 S3 桶的账户的账户 ID,以允许在同一账户内导出。

在 S3 桶上设置权限
  1. 创建一个名为 policy.json 的文件并添加以下访问策略,将 my-exported-logs 更改为您的 S3 存储桶的名称,并将 Principal 更改为您要将日志数据导出到的区域的端点,例如 us-west-1。使用文本编辑器以创建此策略文件。请勿使用 IAM 控制台。

    { "Version": "2012-10-17", "Statement": [ { "Action": "s3:GetBucketAcl", "Effect": "Allow", "Resource": "arn:aws:s3:::my-exported-logs", "Principal": { "Service": "logs.Region.amazonaws.com" }, "Condition": { "StringEquals": { "aws:SourceAccount": [ "AccountId1", "AccountId2", ... ] }, "ArnLike": { "aws:SourceArn": [ "arn:aws:logs:Region:AccountId1:log-group:*", "arn:aws:logs:Region:AccountId2:log-group:*", ... ] } } }, { "Action": "s3:PutObject" , "Effect": "Allow", "Resource": "arn:aws:s3:::my-exported-logs/*", "Principal": { "Service": "logs.Region.amazonaws.com" }, "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceAccount": [ "AccountId1", "AccountId2", ... ] }, "ArnLike": { "aws:SourceArn": [ "arn:aws:logs:Region:AccountId1:log-group:*", "arn:aws:logs:Region:AccountId2:log-group:*", ... ] } } } ] }
  2. 使用put-bucket-policy命令将您刚刚添加的策略设置为存储桶的访问策略。此策略允许 CloudWatch 日志将日志数据导出到您的 S3 存储桶。存储桶拥有者将对所有导出的对象拥有完全权限。

    aws s3api put-bucket-policy --bucket my-exported-logs --policy file://policy.json
    警告

    如果现有存储桶已附加了一个或多个策略,请添加该策略的 CloudWatch 日志访问权限声明。我们建议您评估生成的权限集,确保它们适合访问存储桶的用户。

(可选)步骤 4:导出到使用 SSE-KMS 加密的桶

仅当您要导出到使用服务器端通过 AWS KMS keys 加密的 S3 桶时,才需要执行此步骤。这种加密称为 SSE-KMS。

导出到使用 SSE-KMS 加密的桶
  1. 使用文本编辑器创建名为 key_policy.json 的文件,并添加以下访问策略。添加策略时,进行以下更改:

    • Region 替换为日志的区域。

    • account-ARN 替换为拥有 KMS 密钥的账户的 ARN。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Allow CWL Service Principal usage", "Effect": "Allow", "Principal": { "Service": "logs.Region.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" }, { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "account-ARN" }, "Action": [ "kms:GetKeyPolicy*", "kms:PutKeyPolicy*", "kms:DescribeKey*", "kms:CreateAlias*", "kms:ScheduleKeyDeletion*", "kms:Decrypt" ], "Resource": "*" } ] }
  2. 输入以下 命令:

    aws kms create-key --policy file://key_policy.json

    下面是此命令的示例输出:

    { "KeyMetadata": { "AWSAccountId": "account_id", "KeyId": "key_id", "Arn": "arn:aws:kms:us-east-2:account_id:key/key_id", "CreationDate": "time", "Enabled": true, "Description": "", "KeyUsage": "ENCRYPT_DECRYPT", "KeyState": "Enabled", "Origin": "AWS_KMS", "KeyManager": "CUSTOMER", "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", "KeySpec": "SYMMETRIC_DEFAULT", "EncryptionAlgorithms": [ "SYMMETRIC_DEFAULT" ], "MultiRegion": false }
  3. 使用文本编辑器创建名为 bucketencryption.json 的文件,其中包含以下内容。

    { "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "aws:kms", "KMSMasterKeyID": "{KMS Key ARN}" }, "BucketKeyEnabled": true } ] }
  4. 输入以下命令,将 bucket-name 替换为您要将日志导出到的桶的名称。

    aws s3api put-bucket-encryption --bucket bucket-name --server-side-encryption-configuration file://bucketencryption.json

    如果该命令没有返回错误,则该过程成功。

步骤 5:创建导出任务

使用以下命令创建导出任务。创建后,导出任务可能需要几秒到几小时的时间才能完成,具体取决于要导出的数据大小。

使用 AWS CLI 将数据导出到 Amazon S3。
  1. 步骤 2:设置访问权限 中所述,使用足够的权限登录。

  2. 在命令提示符处,使用以下create-export-task命令创建导出任务。

    aws logs create-export-task --profile CWLExportUser --task-name "my-log-group-09-10-2015" --log-group-name "my-log-group" --from 1441490400000 --to 1441494000000 --destination "my-exported-logs" --destination-prefix "export-task-output"

    下面是示例输出。

    { "taskId": "cda45419-90ea-4db5-9833-aade86253e66" }

步骤 6:说明导出任务

创建导出任务后,您可以获取任务的当前状态。

使用 AWS CLI 描述导出任务

在命令提示符处,使用以下describe-export-tasks命令。

aws logs --profile CWLExportUser describe-export-tasks --task-id "cda45419-90ea-4db5-9833-aade86253e66"

下面是示例输出。

{ "exportTasks": [ { "destination": "my-exported-logs", "destinationPrefix": "export-task-output", "executionInfo": { "creationTime": 1441495400000 }, "from": 1441490400000, "logGroupName": "my-log-group", "status": { "code": "RUNNING", "message": "Started Successfully" }, "taskId": "cda45419-90ea-4db5-9833-aade86253e66", "taskName": "my-log-group-09-10-2015", "tTo": 1441494000000 }] }

您可以三种不同的方式使用 describe-export-tasks 命令:

  • 无任何筛选器 - 按照与创建时间相反的顺序列出所有导出任务。

  • 筛选任务 ID - 仅列出具有指定 ID 的导出任务(如果有)。

  • 筛选任务状态 - 列出具有指定状态的导出任务。

例如,使用以下命令筛选 FAILED 状态。

aws logs --profile CWLExportUser describe-export-tasks --status-code "FAILED"

下面是示例输出。

{ "exportTasks": [ { "destination": "my-exported-logs", "destinationPrefix": "export-task-output", "executionInfo": { "completionTime": 1441498600000 "creationTime": 1441495400000 }, "from": 1441490400000, "logGroupName": "my-log-group", "status": { "code": "FAILED", "message": "FAILED" }, "taskId": "cda45419-90ea-4db5-9833-aade86253e66", "taskName": "my-log-group-09-10-2015", "to": 1441494000000 }] }

步骤 7:取消导出任务

您可以取消处于 PENDINGRUNNING 状态的导出任务。

使用 AWS CLI 取消导出任务

在命令提示符处,使用以下cancel-export-task命令:

aws logs --profile CWLExportUser cancel-export-task --task-id "cda45419-90ea-4db5-9833-aade86253e66"

您可以使用describe-export-tasks命令验证任务是否已成功取消。