使用 Amazon CLI 将日志数据导出到 Amazon S3
在以下示例中,您将使用导出任务将所有数据从名为 my-log-group
的 CloudWatch Logs 日志组导出到名为 my-exported-logs
的 Amazon S3 存储桶中。此示例假定您已创建了一个名为 my-log-group
的日志组。
不支持将日志数据导出到由 Amazon KMS 加密的 Amazon S3 存储桶。
步骤 1:创建 Amazon S3 存储桶
我们建议您使用专为 CloudWatch Logs 创建的存储桶。但是,如果要使用现有存储桶,请跳至第 2 步。
Amazon S3 存储桶必须与要导出的日志数据位于同一区域。CloudWatch Logs 不支持将数据导出到其他区域中的 Amazon S3 存储桶。
使用 Amazon CLI 创建 Amazon 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:设置 Amazon S3 存储桶上的权限
默认情况下,所有 Amazon S3 存储桶和对象都是私有的。仅资源所有者(创建了存储桶的账户)能够访问存储桶及其包含的任何对象。不过,资源所有者可以选择通过编写访问策略来向其他资源和用户授予访问权限。
设置 Amazon 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" } }, "Principal": { "Service": "logs.us-east-2
.amazonaws.com" } } ] }-
如果存储桶位于其他账户中,请改用以下策略。它使用您在上一步中创建的 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/random-string
/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } }, "Principal": { "Service": "logs.us-east-2
.amazonaws.com" } }, { "Action": "s3:PutObject" , "Effect": "Allow", "Resource": "arn:aws:s3:::my-exported-logs/random-string
/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } }, "Principal": { "AWS": "arn:aws:iam::SendingAccountID
:user/CWLExportUser
" } } ] } -
如果存储桶位于其他账户中,并且您使用的是 IAM 角色而不是 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/random-string
/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } }, "Principal": { "Service": "logs.us-east-2
.amazonaws.com" } }, { "Action": "s3:PutObject" , "Effect": "Allow", "Resource": "arn:aws:s3:::my-exported-logs/random-string
/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } }, "Principal": { "AWS": "arn:aws:iam::SendingAccountID
:role/CWLExportUser
" } } ] }
-
使用 put-bucket-policy 命令将您刚添加的策略设置为存储桶上的访问策略。此策略可让 CloudWatch Logs 将日志数据导出到您的 Amazon S3 存储桶中。存储桶拥有者将对所有导出的对象拥有完全权限。
aws s3api put-bucket-policy --bucket my-exported-logs --policy file://policy.json
警告 如果现有存储桶已附加一个或多个策略,请将 CloudWatch Logs 访问的语句添加到这些策略。我们建议您评估生成的权限集,确保它们适合访问存储桶的用户。
步骤 4:创建导出任务
创建从日志组导出日志的导出任务后,导出任务可能需要几秒到几小时的时间才能完成,具体取决于要导出的数据大小。
使用 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
" }
步骤 5:说明导出任务
创建导出任务后,您可以获取任务的当前状态。
使用 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
}] }
步骤 6:取消导出任务
您可以取消处于 PENDING
或 RUNNING
状态的导出任务。
使用 Amazon CLI 取消导出任务
在命令提示符处,使用以下 cancel-export-task 命令:
aws logs --profile CWLExportUser cancel-export-task --task-id "
cda45419-90ea-4db5-9833-aade86253e66
"
您可以使用 describe-export-tasks 命令验证任务是否已成功取消。