将日志写入 Amazon S3

远程日志记录到 Amazon S3 使用现有的 Airflow 连接来读取或写入日志。如果您没有正确设置连接,此过程将失败。

启用远程日志记录

要启用此功能,必须如下配置 airflow.cfg

[logging]
# Airflow can store logs remotely in AWS S3. Users must supply a remote
# location URL (starting with either 's3://...') and an Airflow connection
# id that provides access to the storage location.
remote_logging = True
remote_base_log_folder = s3://my-bucket/path/to/logs
remote_log_conn_id = my_s3_conn
# Use server-side encryption for logs stored in S3
encrypt_s3_logs = False

在上面的示例中,Airflow 将尝试使用 S3Hook(aws_conn_id='my_s3_conn')

您还可以使用 LocalStack 在本地模拟 Amazon S3。要进行配置,您必须额外设置端点 URL 以指向您的本地栈。您可以通过连接额外参数 Extra 的 endpoint_url 字段来实现此操作。例如,{"endpoint_url": "http://localstack:4572"}

使用 AWS IRSA 为 Amazon S3 启用远程日志记录

IRSA 是一项功能,允许您将 IAM 角色分配给 Kubernetes 服务帐户。它利用了 Kubernetes 的一项特性,即 服务帐户令牌卷投影。当 Pod 配置了引用 IAM 角色的服务帐户时,Kubernetes API 服务器会在启动时调用集群的公共 OIDC 发现端点。调用 AWS API 时,AWS SDK 会调用 sts:AssumeRoleWithWebIdentity。IAM 在验证令牌签名后,会将 Kubernetes 发出的令牌换取临时的 AWS 角色凭证。

为了从 Amazon EKS 访问 AWS 服务(例如 S3),建议使用 IAM Role for ServiceAccounts。在以下步骤中,您将学习如何创建一个新的 IAM 角色,并将其与 ServiceAccount 一起用于 Airflow WebServers 和 Workers(Kubernetes Executors)。

步骤1:创建服务帐户的 IAM 角色 (IRSA)

此步骤使用 eksctl 创建 IAM 角色和服务帐户。另请注意,此示例使用附加了完整 S3 权限的托管策略到 IAM 角色。这仅用于测试目的。我们强烈建议您创建一个受限的 S3 IAM 策略并将其与 --attach-policy-arn 一起使用。

或者,您可以使用其他 IaC 工具,例如 Terraform。有关使用 Terraform 部署 Airflow(包括 IRSA)的信息,请查看此示例 链接

提供所有必需的输入并执行以下命令。

eksctl create iamserviceaccount --cluster="<EKS_CLUSTER_ID>" --name="<SERVICE_ACCOUNT_NAME>" --namespace="<NAMESPACE>" --attach-policy-arn="<IAM_POLICY_ARN>" --approve``

包含示例输入的示例

eksctl create iamserviceaccount --cluster=airflow-eks-cluster --name=airflow-sa --namespace=airflow --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3FullAccess --approve

如果您创建自己的 IAM 策略(强烈建议),它应包含以下权限。

  • s3:ListBucket(用于写入日志的 S3 存储桶)

  • s3:GetObject(用于写入日志的前缀下的所有对象)

  • s3:PutObject(用于写入日志的前缀下的所有对象)

步骤2:使用服务帐户更新 Helm Chart values.yaml

此步骤使用 Airflow Helm Chart 部署。如果您使用 Helm Chart 部署 Airflow,则可以按照如下所述修改 values.yaml。将步骤1创建的服务帐户(例如,airflow-sa)添加到 Helm Chart values.yaml 的以下部分。我们使用现有的 serviceAccount,因此设置为 create: false,现有名称为 name: airflow-sa

workers:
  serviceAccount:
    create: false
    name: airflow-sa
    # Annotations are automatically added by **Step1** to serviceAccount. So, you dont need to mention the annotations. We have added this for information purpose
    annotations:
      eks.amazonaws.com/role-arn: <ENTER_IAM_ROLE_ARN_CREATED_BY_EKSCTL_COMMAND>

webserver:
  serviceAccount:
    create: false
    name: airflow-sa
    # Annotations are automatically added by **Step1** to serviceAccount. So, you dont need to mention the annotations. We have added this for information purpose
    annotations:
      eks.amazonaws.com/role-arn: <ENTER_IAM_ROLE_ARN_CREATED_BY_EKSCTL_COMMAND

config:
  logging:
    remote_logging: 'True'
    logging_level: 'INFO'
    remote_base_log_folder: 's3://<ENTER_YOUR_BUCKET_NAME>/<FOLDER_PATH' # Specify the S3 bucket used for logging
    remote_log_conn_id: 'aws_conn' # Notice that this name is used in Step3 for creating connections through Airflow UI
    delete_worker_pods: 'False'
    encrypt_s3_logs: 'True'

步骤3:创建 Amazon Web Services 连接

通过上述配置,Webserver 和 Worker Pods 可以访问 Amazon S3 存储桶并写入日志,而无需使用任何 Access Key 和 Secret Key 或实例配置文件凭证。

  • 使用 Airflow Web UI

    在执行 DAGs 之前,最后一步是在 Airflow UI 中创建连接。

    • 使用 admin 凭证登录 Airflow Web UI 并导航到 Admin -> Connections

    • 创建 Amazon Web Services 的连接,并选择图像中显示的选项(连接 ID 和连接类型)。

    • Extra 文本框中选择创建 S3 存储桶的正确区域。

    ../_images/aws-base-conn-airflow.png
  • 使用 Airflow CLI

    airflow connections add aws_conn --conn-uri aws://@/?region_name=eu-west-1

    请注意,-conn-uri 参数中使用的 @ 通常用于分隔密码和主机,但在本例中,它符合所使用的 uri 验证器。

步骤4:验证日志

  • 执行示例 DAGs

  • 验证 S3 存储桶中的日志

  • 从 Airflow UI 中的 DAGs 日志验证日志

此条目是否有帮助?