View a markdown version of this page

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

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

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

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

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

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

Same-account 导出 (CLI)

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

创建 S3 存储桶 (CLI)

我们建议您使用专为 CloudWatch 日志创建的存储桶。但是,如果您想使用现有存储桶,则可以跳过此过程。

注意

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

使用创建 S3 存储桶 AWS CLI

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

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

下面是示例输出。

{ "Location": "/amzn-s3-demo-bucket" }

设置访问权限 (CLI)

要稍后创建导出任务,您需要使用 AmazonS3ReadOnlyAccess IAM 角色和以下权限登录:

  • logs:CreateExportTask

  • logs:CancelExportTask

  • logs:DescribeExportTasks

  • logs:DescribeLogStreams

  • logs:DescribeLogGroups

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

在 S3 存储桶上设置权限 (CLI)

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

重要

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

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

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

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

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

    aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json
    警告

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

(可选)导出到使用 SSE-KMS (CLI) 加密的 Amazon S3 存储桶的目标

仅当您要导出到使用服务器端加密的 S3 存储桶时,才需要使用此过程。 AWS KMS keys这种加密被称为 SSE-KMS。

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

    • Region替换为您的日志区域。

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

    JSON
    { "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-ARN: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. 输入以下命令,amzn-s3-demo-bucket替换为要将日志导出到的存储桶的名称。

    aws s3api put-bucket-encryption --bucket amzn-s3-demo-bucket --server-side-encryption-configuration file://bucketencryption.json

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

创建导出任务 (CLI)

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

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

  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 "amzn-s3-demo-bucket" --destination-prefix "export-task-output"

    下面是示例输出。

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

Cross-account 导出 (CLI)

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

为跨账户导出 (CLI) 创建 S3 存储桶

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

注意

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

使用创建 S3 存储桶 AWS CLI

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

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

下面是示例输出。

{ "Location": "/amzn-s3-demo-bucket" }

设置跨账户导出 (CLI) 的访问权限

首先,您必须创建新的 IAM 策略,使 CloudWatch 日志能够对目标账户中的目标 Amazon S3 存储桶s3:PutObject执行操作。

s3:PutObject操作外,策略中包含的其他操作还取决于目标存储桶是使用 AWS KMS 加密还是使用 S3 对象所有权设置启用 ACL。

  • 如果使用 KMS 加密,请为密钥资源添加 kms:GenerateDataKeykms:Decrypt 操作

  • 如果在存储桶上启用了 ACL,请为存储桶资源添加 s3:PutObjectAcl 操作

在以下策略中更改amzn-s3-demo-bucket为目标 S3 存储桶的名称。

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

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }

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

JSON
{ "Version":"2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" }, { "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

如果在目标存储桶上启用了 ACL,则在上述策略中将 s3: PutObjectAcl to s3: Ac PutObject tion block 添加。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }

要创建导出任务,您必须使用附加了AmazonS3ReadOnlyAccess托管策略、上面创建的 IAM 策略的 IAM 角色以及以下权限登录:

  • logs:CreateExportTask

  • logs:CancelExportTask

  • logs:DescribeExportTasks

  • logs:DescribeLogStreams

  • logs:DescribeLogGroups

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

在 S3 存储桶上设置权限以进行跨账户导出 (CLI)

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

重要

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

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

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

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

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

    aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json
    警告

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

(可选)导出到使用加密的 Amazon S3 存储桶 SSE-KMS 进行跨账户导出 (CLI) 的目标

仅当您要导出到使用服务器端加密的 S3 存储桶时,才需要使用此过程。 AWS KMS keys这种加密被称为 SSE-KMS。

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

    • us-east-1替换为您的日志区域。

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

    • 123456789012替换为拥有 KMS 密钥的账号。

    • key_id使用 kms-key ID。

    • role_name其角色用于创建导出任务。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Sid": "AllowCWLServicePrincipalUsage", "Effect": "Allow", "Principal": { "Service": "logs.us-east-1.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" }, { "Sid": "EnableIAMUserPermissions", "Effect": "Allow", "Principal": { "AWS": "account-ARN" }, "Action": [ "kms:GetKeyPolicy*", "kms:PutKeyPolicy*", "kms:DescribeKey*", "kms:CreateAlias*", "kms:ScheduleKeyDeletion*", "kms:Decrypt" ], "Resource": "*" }, { "Sid": "EnableIAMRolePermissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/role_name" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }
  2. 输入以下命令:

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

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

    { "KeyMetadata": { "AWSAccountId": "account_id", "KeyId": "key_id", "Arn": "arn:aws:kms:us-east-1:123456789012: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. 输入以下命令,amzn-s3-demo-bucket替换为要将日志导出到的存储桶的名称。

    aws s3api put-bucket-encryption --bucket amzn-s3-demo-bucket --server-side-encryption-configuration file://bucketencryption.json

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

为跨账户导出 (CLI) 创建导出任务

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

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

  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 "amzn-s3-demo-bucket" --destination-prefix "export-task-output"

    下面是示例输出。

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