使用 Amazon CLI 将日志数据导出到 Amazon S3
在以下示例中,您将使用导出任务将所有数据从名为 my-log-group
的 CloudWatch Logs 日志组导出到名为 my-exported-logs
的 Amazon S3 存储桶中。此示例假定您已创建了一个名为 my-log-group
的日志组。
支持将日志数据导出到由 Amazon KMS 加密的 S3 桶。
步骤 1:创建 S3 存储桶
我们建议您使用专为 CloudWatch Logs 创建的存储桶。但是,如果要使用现有存储桶,请跳至第 2 步。
S3 桶必须与要导出的日志数据位于同一区域。CloudWatch Logs 不支持将数据导出到其他区域中的 S3 桶。
使用 Amazon 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:创建对 Amazon S3 和 CloudWatch Logs 具有完全访问权限的 IAM 用户
在以下步骤中,您将创建具有必要权限的 IAM 用户。
创建角色并分配权限
-
输入以下命令以创建 IAM 角色。
aws iam create-user --user-name
CWLExportUser
-
将 IAM 托管策略附加到您刚刚创建的 IAM 用户。
export S3POLICYARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].{ARN:Arn}' --output text)
export CWLPOLICYARN=$( aws iam list-policies --query 'Policies[?PolicyName==`CloudWatchLogsFullAccess`].{ARN:Arn}' --output text)
aws iam attach-user-policy --user-name
CWLExportUser
--policy-arn $S3POLICYARNaws iam attach-user-policy --user-name
CWLExportUser
--policy-arn $CWLPOLICYARN -
确认已附加两个托管策略。
aws iam list-attached-user-policies --user-name
CWLExportUser
-
将 Amazon CLI 配置为包含
CWLExportUser
IAM 用户的 IAM 凭证。有关更多信息,请参阅配置 Amazon CLI。
步骤 3:在 S3 桶上设置权限
默认情况下,所有 S3 桶和对象都是私有的。仅资源所有者(创建了存储桶的账户)能够访问存储桶及其包含的任何对象。不过,资源所有者可以选择通过编写访问策略来向其他资源和用户授予访问权限。
为了使导出到 S3 桶更加安全,我们现在要求您指定允许将日志数据导出到 S3 桶的源账户列表。在下面的示例中,这些账户 ID 的列表在 aws:SourceAccount
键中指定。
建议您还包括创建 S3 桶的账户的账户 ID,以允许在同一账户内导出。
在 S3 桶上设置权限
-
创建一个名为
policy.json
的文件并添加以下访问策略,将Resource
更改为您的 S3 存储桶的名称,并将Principal
更改为您要将日志数据导出到的区域的终端节点。使用文本编辑器以创建此策略文件。请勿使用 IAM 控制台。{ "Version": "2012-10-17", "Statement": [ { "Action": "s3:GetBucketAcl", "Effect": "Allow", "Resource": "arn:aws:s3:::
my-exported-logs
", "Principal": { "Service": "logs.us-east-2
.amazonaws.com" } }, { "Action": "s3:PutObject" , "Effect": "Allow", "Resource": "arn:aws:s3:::my-exported-logs
/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceAccount": [ "AccountId1
", "AccountId2
", ... ] } }, "Principal": { "Service": "logs.us-east-2
.amazonaws.com" } } ] } -
使用 put-bucket-policy 命令将您刚添加的策略设置为存储桶上的访问策略。此策略可让 CloudWatch Logs 将日志数据导出到您的 S3 桶中。存储桶拥有者将对所有导出的对象拥有完全权限。
aws s3api put-bucket-policy --bucket my-exported-logs --policy file://policy.json
警告 如果现有存储桶已附加一个或多个策略,请将 CloudWatch Logs 访问的语句添加到这些策略。我们建议您评估生成的权限集,确保它们适合访问存储桶的用户。
(可选)步骤 4:导出到使用 SSE-KMS 加密的桶
仅当您要导出到使用服务器端通过 Amazon KMS keys 加密的 S3 桶时,才需要执行此步骤。这种加密称为 SSE-KMS。
导出到使用 SSE-KMS 加密的桶
-
使用文本编辑器创建名为
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": "*" } ] } -
-
输入以下命令:
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 } -
使用文本编辑器创建名为
bucketencryption.json
的文件,其中包含以下内容。{ "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "aws:kms", "KMSMasterKeyID": "{KMS Key ARN}" }, "BucketKeyEnabled": true } ] }
-
输入以下命令,将
bucket-name
替换为您要将日志导出到的桶的名称。aws s3api put-bucket-encryption --bucket
bucket-name
--server-side-encryption-configuration file://bucketencryption.json如果该命令没有返回错误,则该过程成功。
步骤 5:创建导出任务
创建从日志组导出日志的导出任务后,导出任务可能需要几秒到几小时的时间才能完成,具体取决于要导出的数据大小。
使用 Amazon CLI 创建导出任务
在命令提示符处,使用以下 create-export-task 命令创建导出任务。
aws logs create-export-task --profile CWLExportUser --task-name "
my-log-group-09-10-2015
" --log-group-name "my-log-group
" --from1441490400000
--to1441494000000
--destination "my-exported-logs
" --destination-prefix "export-task-output
"
下面是示例输出。
{ "taskId": "
cda45419-90ea-4db5-9833-aade86253e66
" }
步骤 6:说明导出任务
创建导出任务后,您可以获取任务的当前状态。
使用 Amazon 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:取消导出任务
您可以取消处于 PENDING
或 RUNNING
状态的导出任务。
使用 Amazon CLI 取消导出任务
在命令提示符处,使用以下 cancel-export-task 命令:
aws logs --profile CWLExportUser cancel-export-task --task-id "
cda45419-90ea-4db5-9833-aade86253e66
"
您可以使用 describe-export-tasks 命令验证任务是否已成功取消。