将日志写入 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 存储桶的正确区域。
使用 Airflow CLI
airflow connections add aws_conn --conn-uri aws://@/?region_name=eu-west-1
请注意,
@
用于-conn-uri
参数,通常用于分隔密码和主机,但在这种情况下,它符合使用的 uri 验证器。
步骤 4:验证日志¶
执行示例 DAG
验证 S3 存储桶中的日志
从 DAG 日志中验证 Airflow UI 中的日志