跳至内容

为什么我的 AWS Glue 作业没有将日志写入 Amazon CloudWatch?

2 分钟阅读
0

我的 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

AWS 官方已更新 2 年前