カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

CSVファイルをFluentdでS3にアップロードする際に環境変数を使用する

過去にFluentdで以下のような記事を書きましたが、今回はそれをベースにS3のパスに環境変数を使用するのを試してみます。

www.capybara-engineer.com

環境変数を使用する方法は以下の記事を参考にさせていただきました。
blog.putise.com

環境

Windows Server 2019
Td-agent v3.8.0

実施作業

準備

ファイルをアップロードするS3バケットを作成します。
f:id:live-your-life-dd18:20210512120610p:plain


Fluentdから呼び出す環境変数を設定します。
f:id:live-your-life-dd18:20210512121019p:plain


Fluentdのconfファイルは以下を使用します。
「s3_object_key_format 」の「#{ENV['PATHNAME']}」の部分が環境変数を呼び出しているところです。

<source>
  @type tail
  path C:\data\test-data.csv
  pos_file C:\var\log\td-agent\test-data.csv.pos
  read_from_head true

  <parse>
    @type csv
    keys sepal_length,sepal_width,petal_length,petal_width
    types sepal_length:float,sepal_width:float,petal_length:float,petal_width:float
  </parse>

  tag s3.data.csv
</source>

<match s3.*.*>
  @type s3

  <assume_role_credentials>
    role_arn          arn:aws:iam::************:role/test-bation
    role_session_name test-bation
  </assume_role_credentials>
  
  s3_bucket test-temp-2021
  s3_region ap-northeast-1
  path fluentd

  s3_object_key_format %{path}/%{time_slice}/#{ENV['PATHNAME']}/${tag[1]}_%{hms_slice}.json.%{file_extension}
  time_slice_format year=%Y/month=%m/day=%d
  overwrite true

  <buffer tag,time>
    @type file
    path C:\var\log\td-agent\s3
    timekey 10s  # 3 min
    timekey_wait 1m
    chunk_limit_size 30m

    compress gzip
  </buffer>
  <format>
    @type json
  </format>
</match>



アップロードするのは以下のCSVです。
※こちらの取得元は過去のFluentdの記事に書いてます。
f:id:live-your-life-dd18:20210512121401p:plain

コマンド実行

Td-agentプロンプトを立ち上げて、プロセスを実行するコマンドを実行してみます。

$ fluentd -c etc\td-agent\td-agent.conf

f:id:live-your-life-dd18:20210512121944p:plain


ファイルはアップロードされましたが、環境変数は設定されてませんでした。
f:id:live-your-life-dd18:20210512122124p:plain

原因調査

参考にした記事だとタグ名に使用していたので、もしかしたらパス名には使えないのかもしれないと思いました。
なので、Fluentdのタグに設定し、タグから取得する形で動かしてみます。


修正後のconfファイルは以下です。
このファイルでTd-agentを実行してみます。

<source>
  @type tail
  path C:\data\test-data.csv
  pos_file C:\var\log\td-agent\test-data.csv.pos
  read_from_head true

  <parse>
    @type csv
    keys sepal_length,sepal_width,petal_length,petal_width
    types sepal_length:float,sepal_width:float,petal_length:float,petal_width:float
  </parse>

  tag "s3.data.csv.#{ENV['PATHNAME']}"
</source>

<match s3.*.*.*>
  @type s3

  <assume_role_credentials>
    role_arn          arn:aws:iam::************:role/test-bation
    role_session_name test-bation
  </assume_role_credentials>
  
  s3_bucket test-temp-2021
  s3_region ap-northeast-1
  path fluentd

  s3_object_key_format %{path}/%{time_slice}/${tag[3]}/${tag[1]}_%{hms_slice}.json.%{file_extension}
  time_slice_format year=%Y/month=%m/day=%d
  overwrite true

  <buffer tag,time>
    @type file
    path C:\var\log\td-agent\s3
    timekey 10s  # 3 min
    timekey_wait 1m
    chunk_limit_size 30m

    compress gzip
  </buffer>
  <format>
    @type json
  </format>
</match>



無事に環境変数PATHNAMEに設定した値がS3上のパスに反映されていました。
環境変数を使いたい場合はそのままでは使えないようなので、注意が必要です。
f:id:live-your-life-dd18:20210512135642p:plain

感想及び所感

というわけで今回は環境変数から取得した値をS3パスに埋め込む方法について試してみました。