我的 AWS Glue 提取、加载和转换 (ETL) 作业不会将日志写入 Amazon CloudWatch。
简述
如果您的 AWS Glue 作业未将日志写入 CloudWatch,请确认:
- 您的 AWS Glue 作业具有所有必需的 AWS Identity and Access Management (IAM) 权限。
- AWS Key Management Service (AWS KMS) 密钥允许 CloudWatch Logs 使用该密钥。
- 您的作业会检查正确的 CloudWatch 日志组。
- logs:AssociateKmsKey IAM 权限已附加到 AWS Glue 角色。
- 如果您没有对 AWS Glue Spark ETL 作业使用连续日志记录,请在日志聚合之前检查作业是否失败。
解决方法
AWS Glue 作业角色没有权限创建和写入 CloudWatch 日志组
如果您不使用 AWSGlueServiceRole 托管策略,请确认附加到 ETL 作业的 IAM 角色具有正确的权限。使用 CloudWatch 需要以下权限。如果作业使用自定义日志组,IAM 策略必须提供对自定义日志组的访问权限:
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:*:*:*:/aws-glue/*",
"arn:aws:logs:*:*:*:/customlogs/*"
]
}
注意: 将 arn:aws:logs:*:*:*:/customlogs/* 替换为自定义日志组的 ARN。
AWS KMS 密钥未向 CloudWatch Logs 授予权限
如果您为 AWS Glue 作业使用安全配置,请检查您的 AWS KMS 密钥。附加到安全配置的 AWS KMS 密钥必须允许 CloudWatch Logs 使用该密钥。将以下策略附加到 AWS KMS 密钥:
{ "Effect": "Allow",
"Principal": {
"Service": "logs.region.amazonaws.com"
},
"Action": [
"kms:Encrypt*",
"kms:Decrypt*",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:Describe*"
],
"Resource": "*",
"Condition": {
"ArnEquals": {
"kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:us-west-2:1111222233334444:log-group:log-group-name"
}
}
}
将 us-west-2 替换为您的 AWS 区域,将 1111222233334444 替换为您的 AWS 账户 ID,将 og-group-name 替换为您的日志组的名称。
有关更多信息,请参阅使用 AWS Key Management Service 加密 CloudWatch Logs 中的日志数据。
另外,确认 logs:AssociateKmsKey IAM 权限已附加到 AWS Glue 角色。有关更多信息,请参阅连续日志记录的安全配置。
连续日志记录未开启
如果您没有为 AWS Glue Spark ETL 作业开启连续日志记录,日志聚合将在作业完成后进行。如果作业在日志聚合之前失败,日志可能不会被推送到 CloudWatch。
为您的 AWS Glue 作业开启连续日志记录,以在应用程序出现故障时填充日志。
您没有在正确的日志组中查找日志
如果您开启了连续日志记录并使用默认日志组,可以在以下位置找到 CloudWatch 日志:
-
自定义消息(如来自打印语句的消息)会被推送到 /aws-glue/jobs/output 日志组。
-
来自 AWS Glue 记录器的消息会被推送到 /aws-glue/jobs/logs-v2 下的驱动程序日志。
logger = glueContext.get_logger()
logger.info("MY INFO LOGGER MESSAGE" )
logger.error("MY ERROR LOGGER MESSAGE")
-
来自 Python 记录器的消息会被推送到 /aws-glue/jobs/output 下的驱动程序日志。
import logging
MSG_FORMAT = '%(asctime)s %(levelname)s %(name)s: %(message)s'
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
logging.basicConfig(format=MSG_FORMAT, datefmt=DATETIME_FORMAT)
logger2 = logging.getLogger("logger2")
logger2.setLevel(logging.INFO)
logger2.info("Test log message from python logging")
-
使用安全配置的作业会将来自 AWS Glue 记录器的自定义消息推送到 /aws-glue/jobs/logs-v2-testconfig。将 testconfig 替换为安全配置的名称。
-
使用安全配置的作业会将来自 Python 记录器的自定义消息推送到 /aws-glue/jobs/testconfig-role/job-role/output。将 testconfig 替换为安全配置的名称,将 job-role 替换为 AWS Glue 作业角色。
如果您开启了连续日志记录并使用自定义日志组,可以在以下位置找到 CloudWatch 日志:
- 自定义日志消息、驱动程序日志和执行程序日志存储在自定义日志组下。
如果您未开启连续日志记录,可以在以下位置找到 CloudWatch 日志:
- 诸如打印语句输出和 Python 日志消息等消息存储在 /aws-glue/jobs/output 下。
- 来自 AWS Glue 记录器的所有自定义消息存储在 /aws-glue/jobs/error 下。
有关更多信息,请参阅日志记录行为。
相关信息
在 AWS Glue 中进行日志记录和监控
监控 AWS Glue