GCP Composerでbotoファイルを使用してGCSからS3にファイルをコピーする方法
ycsg113XYZ 夜のコンパイル
GCP Composer(airflow)のアプリログはGoogle Storageに格納されます。
そしてログをクリーニングする機能は無いため、どんどん溜まっていきます。
溜まったままにしておいても良いかと思いますが、ストレージへの保管料ももったいないですし、何よりAirflowが遅くなってる気がするのです。
そのため定期的に削除する必要があります。
例えばDAGが1つあり、その中にタスクが
とある場合、日々のログは次のように溜まっていきます。
airflowで使用しちるgcsのlogsディレクトリ
DAG01
TASK01
[スケジュールの日時yyyy-mm-dd]
1.log
[スケジュールの日時yyyy-mm-dd]
1.log
[スケジュールの日時yyyy-mm-dd]
1.log
TASK02
[スケジュールの日時yyyy-mm-dd]
1.log
[スケジュールの日時yyyy-mm-dd]
1.log
[スケジュールの日時yyyy-mm-dd]
1.log
TASK02
[スケジュールの日時yyyy-mm-dd]
1.log
[スケジュールの日時yyyy-mm-dd]
1.log
[スケジュールの日時yyyy-mm-dd]
1.log
このようにTASK単位、さらに実行日単位にログが出力されるため、例えば1ヶ月分だけ残して過去分削除したいとなった場合に消すのが大変です。
gsutil ls -r gs://[composer使用のGCSバケット]/logs/* | grep -v "/:" | grep "2022-01-20" | xargs gsutil rm
※上記の2022-01-20 の箇所を削除する年月日にする
gsutil ls -r gs://[composer使用のGCSバケット]/logs/* | grep -v "/:" | grep "2022-01-" | xargs gsutil rm
※上記の2022-01- の箇所を削除する年月にする。
定期的に実行するためにAirflowにDAGを作成するのが良いかと思います!
え、DAGのサンプルは無いんですか?
それは次回までの宿題だね!
以下に100日前のログを消すサンプルコードを示します!19行目くらいにある-100が100日前を指しています。
# coding:utf-8
from airflow import DAG
from datetime import datetime, timedelta, time
from airflow.operators.bash_operator import BashOperator
default_args = {
'owner': 'sample',
'depends_on_past': False,
'start_date': datetime(2023, 2, 10)
}
dag = DAG(
'dag_delete_airflow_log',
default_args=default_args,
schedule_interval='0 9 * * *',
catchup=True,
)
delete_date = '{{ macros.ds_format(macros.ds_add(next_ds, -100), "%Y-%m-%d", "%Y-%m-%d") }}'
shellcommand = 'gsutil ls -r gs://[composer使用のGCSバケット]/logs/* | grep -v "/:" | grep "' + delete_date + '" | xargs gsutil rm'
delete_airflow_log = BashOperator(
task_id='task_delete_airflow_log',
bash_command=shellcommand,
dag=dag
)
delete_airflow_log