AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

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 Identity and Access Management (IAM) と Airflow 接続で AWS オペレーターを使用し、Amazon MWAA とのクロスアカウント接続を行います。詳細については、Apache Airflow のウェブサイトで「Amazon Web Services 接続」を参照してください。

Apache Airflow を使用して Amazon MWAA でクロスアカウントリソースアクセスを有効にするには、次の手順を実行します。

注: 次のステップでは、クロスアカウントの AWS Glue ジョブを呼び出します。2 つの AWS アカウントが必要です。アカウント A はソースアカウントであり、確立されている Amazon MWAA 環境が必要です。アカウント B はターゲットアカウントです。

アカウント B に AWS Glue 用の IAM ロールを作成します。

アカウント B から、次の手順を実行します。

  1. IAM コンソールを開きます。
  2. [ロール] を選択し、**[ロールの作成]**を選択します。
  3. [信頼されたエンティティタイプ] で、[カスタム信頼ポリシー] を選択します。次に、アカウント 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. [アクセス許可]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 環境に関連付けられているロールは、環境の詳細ページの、[アクセス許可] > [実行ロール] にあります。
  3. [ポリシーの編集] を選択します。次に、アカウント 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 UI にアクセスします。
  2. [管理] を選択し、[接続] を選択します。
  3. 新しい接続を追加するために、[新しいレコードを追加] を選択します。次の接続情報を入力します。
    [接続 ID] で、接続に一意の識別子を割り当てます。
    [接続タイプ] で、ドロップダウンリストから [Amazon Web Services] を選択します。
    [AWS アクセスキー ID][AWS シークレットアクセスキー] のフィールドは、空白のままにします。認証には IAM ロールを使用します。
    [その他] には、ロールの ARN とリージョンを JSON 形式で入力します。
    [その他] フィールドの例を次に示します。
    { "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. [保存] を選択します。接続する 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 エアフローログを確認します。これらのログから、タスク中に発生したことに関する詳細情報を取得できます。IAM アクセス許可エラーや、接続、設定に関する問題を特定するのに役立ちます。
  • IAM アクセス許可を確認します。AWS Glue のクロスアカウント IAM ロールに、AWS Glue 操作に必要なアクセス許可があることを確認してください。また、必要な Amazon Simple Storage Service (Amazon S3) リソースにアクセスできることも確認してください。
  • エアフロー接続を確認します。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公式更新しました 2ヶ月前