如何在 Amazon MWAA 上使用 Airflow DAG 访问跨账户资源并解决相关问题?

3 分钟阅读
0

我想在 Amazon Managed Workflows for Apache Airflow (Amazon MWAA) 上使用 Airflow DAG 访问跨账户资源并解决相关问题。

解决方法

apache-airflow providers-amazon 库已预装在 Amazon MWAA 中。该库提供各种 AWS 运算符,可帮助管理 AWS 服务中的任务。以下步骤使用 AWS 运算符结合 AWS Identity and Access Management (IAM) 和 Airflow 连接以通过 Amazon MWAA 进行跨账户访问。有关详细信息,请参阅 Apache Airflow 网站上的 Amazon Web Services 连接

要使用 Apache Airflow 在 Amazon MWAA 中开启跨账户资源访问权限,请完成以下步骤:

**注意:**以下步骤调用跨账户 AWS Glue 作业,需要两个 AWS 账户。账户 A 是来源账户,必须包含已建立的 Amazon MWAA 环境。账户 B 是目标账户。

在账户 B 中为 AWS Glue 创建 IAM 角色

在账户 B 中完成以下步骤:

  1. 打开 IAM 控制台
  2. 选择 Roles(角色),然后选择 Create role(创建角色)。
  3. 对于 Trusted entity type(可信实体类型),选择 Custom Trust Policy(自定义信任策略)。然后,建立信任关系,允许账户 A 中的 Amazon MWAA 运行时角色代入账户 B 角色:
    信任策略示例:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::example-account-a-id:role/example-mwaa-runtime-role"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
    **注意:**将 example-account-a-id 替换为您的账户 A ID,将 example-mwaa-runtime-role 替换为 Amazon MWAA 运行时角色。
  4. 对于 Permissions(权限),授予 glue:StartJobRun
    **注意:**要获得对 AWS Glue 的完全访问权限,请附上 AWSGlueConsoleFullAccess 托管式策略。
    GlueCrossAccount 角色的权限策略示例:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "glue:StartJobRun",
            "glue:GetJob"
          ],
          "Resource": "arn:aws:glue:example-region:example-account-a-id:job/example-job"
        }
      ]
    }
    **注意:**将 example-region 替换为您的 AWS 区域,将 example-account-a-id 替换为您的账户 A ID,将 example-job 替换为作业名称。

更新账户 A 中的 Amazon MWAA 运行时角色

在账户 A 中完成以下步骤:

  1. 打开 IAM 控制台
  2. 找到 Amazon MWAA 运行时角色。与 Amazon MWAA 环境关联的角色可以在环境详细信息页面 > Permissions(权限)> Execution role(执行角色)中找到。
  3. 选择 Edit Policy(编辑策略)。然后,为账户 B 中的角色添加 sts:AssumeRole
    策略示例:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "sts:AssumeRole",
          "Resource": "arn:aws:iam::example-account-b-id:role/example-glue-role"
        }
      ]
    }
    **注意:**将 example-account-b-id 替换为您的账户 B ID,将 example-glue-role 替换为您的 AWS Glue 角色名称。

在 Amazon MWAA 中创建 Airflow 连接

在账户 A 中完成以下步骤:

  1. 访问您的 Amazon MWAA 环境的 Airflow 用户界面
  2. 选择 Admin(管理员),然后选择 Connections(连接)。
  3. 要添加新连接,请选择 Add a new record(添加新记录)。然后,输入以下连接详细信息:
    对于 Connection ID(连接 ID),为连接分配唯一标识符。
    对于 Connection Type(连接类型),从下拉列表中选择 Amazon Web Services。
    对于 AWS Access Key ID(AWS 访问密钥 ID)和 AWS Secret Access Key(AWS 秘密访问密钥),请将这些字段留空。您将使用 IAM 角色进行身份验证。
    对于 Extra,以 JSON 格式输入角色 ARN 和区域。
    Extra 字段示例:
    { "role_arn": "arn:aws:iam::example-account-b:role/example-glue-role", "region_name": "example-region" }
    **注意:**将 example-account-b-id 替换为您的账户 B ID,将 example-glue-role 替换为您的 AWS Glue 角色名称,将 example-region 替换为您的区域。
  4. 选择 Save(保存)。对要连接的每个 AWS 账户重复前面的步骤 1 到 4。

在 Airflow DAG 中配置 GlueJobOperator

要在 DAG 中配置 GlueJobOperator,请使用 Airflow 运算符并为 AWS Glue 作业指定 AWS 连接 ID。有关详细信息,请参阅 Apache Airflow 网站上的 airflow.providers.amazon.aws.operators.glue

示例 DAG:

from airflow import DAG
from airflow.providers.amazon.aws.operators.glue import GlueJobOperator
from datetime import datetime, timedelta

default_args = {
    'owner': 'airflow',
    'start_date': datetime(2023, 1, 1),
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
}

dag = DAG(
    'glue_cross_account',
    default_args=default_args,
    schedule_interval=None,
    catchup=False,
)

run_glue_job = GlueJobOperator(
    task_id='run_glue_job',
    job_name='example-glue-job',
    aws_conn_id='example-aws-connection-id',
    dag=dag,
)

**注意:**将 example-glue-job 替换为您的 AWS Glue 作业名称,将 example-connection-id 替换为您的 Airflow 连接 ID。

当 Airflow DAG 中的 GlueJobOperator 运行时,将假定连接设置中指定的角色。此角色拥有在账户 B 中运行 AWS Glue 作业所需的权限。此外,账户 A 中的 Airflow 任务会触发账户 B 中的 AWS Glue 作业,并使用账户 B 中的资源和数据。

有关详细信息,请参阅 Apache Airflow 网站上的 AWS Glue

故障排除

如果任务失败或未触发 AWS Glue 作业,请执行以下操作:

  • 检查 Apache Airflow 日志。这些日志提供有关任务期间发生的事件的详细信息,有助于识别 IAM 权限错误、连接问题和配置问题等问题。
  • 检查您的 IAM 权限。确保 AWS Glue 跨账户 IAM 角色具有 AWS Glue 操作所需的权限。此外,请确保您有权访问所需的 Amazon Simple Storage Service (Amazon S3) 资源。
  • 检查您的 Airflow 连接。确保为 AWS 连接 ID 正确配置代入指定 IAM 角色的访问权限。
  • 检查您的脚本位置。确保您的 AWS Glue 脚本的 Amazon S3 路径可访问且脚本格式正确。
  • 对于无法访问互联网的私有 Amazon Virtual Private Cloud (Amazon VPC) 中的环境,请检查您的网络配置。确保您的网络配置(例如中转网关Amazon VPC 对等连接)允许与 AWS 服务进行通信。
  • 检查是否有任何附加到资源的基于资源的策略以允许跨账户访问。

**注意:**Airflow 2.5.1 Amazon 提供程序软件包(版本 7.1.0)存在一个已知问题,要求用户在 GlueJobOperator 任务中指定 IAM 角色或 ARN。要解决此问题,请升级到 Amazon 提供程序软件包的 8.2.0 版或更高版本(Amazon MWAA 2.6.3 的默认版本)。有关详细信息,请参阅 GitHub 网站上的更新提供程序版本后,GlueJobOperator 因参数 RoleName 的类型无效而失败

相关信息

创建角色

AWS 官方
AWS 官方已更新 3 个月前