トラブルシューティング:CloudWatch ログ記録と CloudTrail のエラー - Amazon Managed Workflows for Apache Airflow

トラブルシューティング:CloudWatch ログ記録と CloudTrail のエラー

このページのトピックには、Amazon Managed Workflows for Apache Airflow 環境で発生する可能性のある Amazon CloudWatch Logs と AWS CloudTrail エラーの解決策が含まれています。

ログ

次のトピックでは、Apache Airflow ログを表示する際に発生する可能性があるエラーについて説明します。

タスクログが表示されないか、「Cloudwatch log_group からリモートログを読み取っています」というエラーが表示されます。

Amazon MWAA は、Amazon CloudWatch Logs との間で直接ログを読み書きするように Apache Airflow を設定しています。ワーカーがタスクの開始に失敗したり、ログの書き込みに失敗したりすると、エラーが表示される:

*** Reading remote log from Cloudwatch log_group: airflow-environmentName-Task log_stream: DAG_ID/TASK_ID/timestamp/n.log.Could not read remote logs from log_group: airflow-environmentName-Task log_stream: DAG_ID/TASK_ID/time/n.log.
  • 次のステップを推奨します。

    1. 環境の INFO レベルでタスクログを有効にしていることを確認します。詳細については、「Amazon CloudWatch の Airflow ログの表示」を参照してください。

    2. 環境 実行ロール に正しい権限ポリシーがあることを確認します。

    3. オペレータまたはタスクが正しく動作していること、DAG を解析するのに十分なリソースがあること、ロードする適切な Python ライブラリがあることを確認します。正しい依存関係があることを確認するには、問題の原因となっているインポートが見つかるまで、インポートを削除してみます。Amazon MWAA ローカルランナーツール を使用して Python の依存関係をテストすることをお勧めします。

ログなしでタスクが失敗しました

ワークフロー内のタスクが失敗し、失敗したタスクのログが見つからない場合は、次に示すように、デフォルトパラメータに queue パラメータが設定されていることを確認してください。

from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow.utils.dates import days_ago # Setting queue argument to default. default_args = { "start_date": days_ago(1), "queue": "default" } with DAG(dag_id="any_command_dag", schedule_interval=None, catchup=False, default_args=default_args) as dag: cli_command = BashOperator( task_id="bash_command", bash_command="{{ dag_run.conf['command'] }}" )

問題を解決するには、コードから queue を削除し、DAG を再実行してください。

CloudTrail に「リソースはすでに存在している例外」というエラーが表示されます

"errorCode": "ResourceAlreadyExistsException", "errorMessage": "The specified log stream already exists", "requestParameters": { "logGroupName": "airflow-MyAirflowEnvironment-DAGProcessing", "logStreamName": "scheduler_cross-account-eks.py.log" }

特定の Python 要件、例えば Amazon MWAA が CloudWatch と通信するために使用する watchtower ライブラリを以前のバージョンに戻す apache-airflow-backport-providers-amazon があるかもしれません。次のステップを推奨します。

  • 以下のライブラリを requirements.txt に追加する

    watchtower==1.0.6

CloudTrail に「リクエストが無効です」というエラーが表示されます。

Invalid request provided: Provided role does not have sufficient permissions for s3 location airflow-xxx-xxx/dags

同じ DX テンプレートを使用して Amazon AWS CloudFormation 環境とAmazon S3バケットを作成している場合は、AWS CloudFormation テンプレートに DependsOn セクションを追加する必要があります。この2つのリソース(MWAA 環境とMWAA 実行ポリシー)は、AWS CloudFormation 内で依存関係にあります。次のステップを推奨します。

  • AWS CloudFormation のテンプレートに以下の DependsOn 文を追加してください。

    ... MaxWorkers: 5 NetworkConfiguration: SecurityGroupIds: - !GetAtt SecurityGroup.GroupId SubnetIds: !Ref subnetIds WebserverAccessMode: PUBLIC_ONLY DependsOn: MwaaExecutionPolicy MwaaExecutionPolicy: Type: AWS::IAM::ManagedPolicy Properties: Roles: - !Ref MwaaExecutionRole PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: airflow:PublishMetrics Resource: ...

    例については、「Amazon Managed Workflows for Apache Airflow のクイックスタートチュートリアル」を参照してください。

Apache Airflow ログに「64 ビット Oracle クライアントライブラリが見つかりませんでした:「libclntsh.so: 共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません」と表示されます。

  • 次のステップを推奨します。

    1. Apache Airflow v2 を使用している場合、core.lazy_load_plugins : False を Apache Airflow の構成オプションとして追加してください。詳細については、「2 の設定オプションによるプラグインの読み込み」を参照してください。

ディスパッチャのログに psycopg2 「サーバが接続を誤って閉じました」とあります。

次のようなエラーが表示される場合は、Apache Airflow スケジューラリソースが不足している可能性があります。

2021-06-14T10:20:24.581-05:00 sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly 2021-06-14T10:20:24.633-05:00 This probably means the server terminated abnormally 2021-06-14T10:20:24.686-05:00 before or while processing the request.

次のステップを推奨します。

  • 最大 5 つのスケジューラを指定できる Apache Airflow v2.0.2 へのアップグレードを検討してください。

「タスクインスタンス %s が完了したと Executor から報告されました(%s)。ただし、タスクは DAG 処理ログに %s 表示されています。」が表示されました。

次のようなエラーが表示される場合は、長時間タスクの実行が Amazon MWAA のタスク時間制限に達している可能性があります。Amazon MWAA では、どの Airflow タスクにも 12 時間の制限があり、タスクがキューに詰まったり、自動スケーリングなどのアクティビティをブロックしたりすることができないようになっています

Executor reports task instance %s finished (%s) although the task says its %s. (Info: %s) Was the task killed externally

次のステップを推奨します。

  • タスクを実行時間の短い複数のタスクに分解することを考慮してください。Airflow には通常、オペレーターが非同期になるというモデルがあります。外部システム上のアクティビティを呼び出し、Apache Airflow センサーがポーリングを行って処理が完了したことを確認します。センサーに障害が発生しても、オペレーターの機能に影響を与えることなく、安全に再試行できます。

「log_group: airflow-*{*environmentName}-Task log_stream:* {*DAG_ID}/*{*TASK_ID}/*{*time}/*{*n}.log からリモートログを読み込めませんでした」と表示されました。自分のタスクログ

次のようなエラーが表示される場合、ご使用の環境の実行ロールに、タスクログのログストリームを作成するためのアクセス権限ポリシーが含まれていない可能性があります。

Could not read remote logs from log_group: airflow-*{*environmentName}-Task log_stream:* {*DAG_ID}/*{*TASK_ID}/*{*time}/*{*n}.log.

次のステップを推奨します。

  • Amazon MWAA 実行ロール にあるサンプルポリシーのいずれかを使用して、環境の実行ロールを変更します。

requirements.txt ファイルで Apache Airflow バージョンと互換性のないプロバイダパッケージを指定している場合もあります。たとえば、Apache Airflow v2.0.2 を使用している場合、apache-airflow-providers-databricks パッケージのように、Airflow 2.1+ とのみ互換性のあるパッケージを指定している可能性があります。

次のステップを推奨します。

  1. Apache Airflow v2.0.2 を使用している場合は、requirements.txt ファイルを変更して apache-airflow[databricks] を追加します。これにより、Apache Airflow v2.0.2 と互換性のある正しいバージョンの Databricks パッケージがインストールされます。

  2. GitHub の aws-mwaa-local-runner を使用して、DAG、カスタムプラグイン、Python の依存関係をローカルでテストします。