将日志写入 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 以指向您的本地堆栈。您可以通过连接额外字段 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),建议对 ServiceAccounts 使用 IAM 角色。在以下步骤中,您将学习如何使用 ServiceAccount 创建新的 IAM 角色,并将其与 Airflow Web 服务器和工作器(Kubernetes 执行器)一起使用。

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

此步骤是使用 eksctl 创建 IAM 角色和服务帐户。另请注意,此示例使用附加到 IAM 角色的具有完整 S3 权限的托管策略。这仅用于测试目的。我们强烈建议您创建一个受限的 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 连接

通过上述配置,Web 服务器和工作器 Pod 可以访问 Amazon S3 存储桶并写入日志,而无需使用任何访问密钥和密钥或实例配置文件凭证。

  • 使用 Airflow Web UI

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

    • 使用 admin 凭证登录到 Airflow Web UI,并导航到 管理员 -> 连接

    • Amazon Web Services 创建连接,并选择选项(连接 ID 和连接类型),如图所示。

    • 额外 文本框中选择创建 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:验证日志

  • 执行示例 DAG

  • 验证 S3 存储桶中的日志

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

此条目有帮助吗?