使用将日志数据导出到 Amazon S3 Amazon CLI - Amazon CloudWatch 日志
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

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

支持将日志数据导出到由 Amazon KMS 加密的 S3 存储桶。不支持导出到由 DSSE-KMS 加密的存储桶。

有关如何设置导出的详细信息取决于您要导出到的 Amazon S3 存储桶与要导出的日志是位于同一个账户中,还是不同的账户中。

同账号导出

如果 Amazon S3 存储桶与要导出的日志位于同一个账户中,请参阅本节中的说明。

步骤 1:创建 S3 存储桶

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

注意

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

要创建 S3 存储桶,请使用 Amazon CLI

在命令提示符处,运行以下 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 加密的桶

仅当您要导出到使用服务器端加密的 S3 存储桶时,才需要执行此步骤。 Amazon KMS keys这种加密称为 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:创建导出任务

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

要使用将数据导出到 Amazon S3 Amazon CLI
  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" }

跨账户导出

如果 Amazon S3 存储桶与要导出的日志位于不同账户中,请参阅本节中的说明。

步骤 1:创建 S3 存储桶

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

注意

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

要创建 S3 存储桶,请使用 Amazon CLI

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

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

下面是示例输出。

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

步骤 2:设置访问权限

首先,您必须创建新的 IAM 策略,以使 CloudWatch 日志拥有目标 Amazon S3 存储桶的s3:PutObject权限。

要在步骤 5 中创建导出任务,您需要使用 AmazonS3ReadOnlyAccess IAM 角色登录并且具有其他某些权限。您可以创建包含其他必要权限的策略。

您创建的策略取决于目标存储桶是否使用 Amazon KMS 加密。如果它不使用 Amazon KMS 加密,请创建包含以下内容的策略。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-exported-logs/*" } ] }

如果目标存储桶使用 Amazon KMS 加密,请创建包含以下内容的策略。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-exported-logs/*" }, { "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "ARN_OF_KMS_KEY" } ] }

要在步骤 5 中创建导出任务,您必须使用 AmazonS3ReadOnlyAccess IAM 角色登录,并且使用刚刚创建的 IAM policy 且具有以下权限:

  • 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:*", ... ] } } }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::create_export_task_caller_account:role/role_name" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-exported-logs/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
  2. 使用put-bucket-policy命令将您刚刚添加的策略设置为存储桶的访问策略。此策略允许 CloudWatch 日志将日志数据导出到您的 S3 存储桶。存储桶拥有者将对所有导出的对象拥有完全权限。

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

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

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

仅当您要导出到使用服务器端加密的 S3 存储桶时,才需要执行此步骤。 Amazon KMS keys这种加密称为 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": "*" }, { "Sid": "Enable IAM Role Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::create_export_task_caller_account:role/role_name" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "ARN_OF_KMS_KEY" } ] }
  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:创建导出任务

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

要使用将数据导出到 Amazon S3 Amazon CLI
  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" }