😺

AWS ECS FargateでEmbulkをスケーラブルにバッチ実行する

に公開

スケーラブルにembulkを実行したくなったのでECS Fargateで動かせるようにしました。

  1. embulk.propertiesファイルを作成
jruby=file:///usr/src/app/jruby-complete-9.4.5.0.jar
  1. Dockerfileを作成
    FargateではCMDで実行コマンドを指定します。
    CMDを記載する必要があります。
# EmBulkはJava8が必要
FROM openjdk:8-jre-slim

# set working dir
WORKDIR /usr/src/app

# install curl
RUN apt-get update && \
    apt-get install -y curl

# install jruby
RUN curl --create-dirs -o "./jruby-complete-9.4.5.0.jar" -L "https://repo1.maven.org/maven2/org/jruby/jruby-complete/9.4.5.0/jruby-complete-9.4.5.0.jar"
RUN chmod +x ./jruby-complete-9.4.5.0.jar

# Embulk Dlownload
RUN curl --create-dirs -o ./embulk -L "https://github.com/embulk/embulk/releases/download/v0.11.4/embulk-0.11.4.jar" && \
    chmod +x ./embulk

# install Ruby gems
COPY ./embulk.properties /root/.embulk/embulk.properties
RUN ./embulk gem install embulk -v 0.11.4 # Embulk と同じバージョンを指定
RUN ./embulk gem install msgpack -v 1.7.2
# RUN ./embulk gem install bundler # if you need Bundler
# RUN ./embulk gem install liquid  # if you need Liquid

# Embulkのプラグインをインストール
# 以下の例ではMySQLのプラグインをインストールしています
RUN ./embulk gem install embulk-output-bigquery
RUN ./embulk gem install embulk-input-gcs
RUN ./embulk gem install embulk-input-mysql

# configファイル等をコンテナにコピー
COPY ./ .

#Fargate で実行するコマンド
CMD ["bash", "exe_config.sh", "config/config.yml"]

3.config実行ファイルを作成
${}を使って実行するジョブ毎にconfigファイルを指定できるようにします。
デフォルトではconfig/config.ymlを指定するようにしています。

java -jar ./embulk run ${1:-config/config.yml}

4.config.ymlとusers.csvを作成
configフォルダを作成しその中にconfig.ymlを作成します。

in:
  type: file
  path_prefix: ./data/users.csv
  parser:
    charset: UTF-8
    newline: LF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: name, type: string}
out: {type: stdout}

また、dataフォルダを作成しそこにinput用のusers.csvを作成します。
outputはstdoutにするので今回は不要です。

id,name
1,userA
2,useB
  1. ファイル構成
.
├── Dockerfile
├── config
│   └── config.yml
├── data
│   └── users.csv
├── embulk.properties
└── exe_config.sh

6.ECRにコンテナをデプロイ
AWSしログインしECRでリポジトリを作成して右上のプッシュコマンドをクリックするとコマンドが表示されるのでその通りに実行します。
!(https://storage.googleapis.com/zenn-user-upload/45cffc1ca8c7-20250401.png)

  1. ECSでクラスターとタスク定義を作成
    クラスターを作成し、デプロイしたコンテナを指定したタスク定義を作成します。

  2. タスク実行
    クラスターでタスク実行を選択し作成したタスク定義を選択して実行します。
    注意点としてサブネットはパブリックである必要があります。そうしないとECRからコンテナのpullが失敗します。
    違うconfigファイルを実行したい場合はコンテナの上書きで実行するconfigファイルを指定できます。
    上書きするときの書き方↓

bash, exe_config.sh, [実行したいconfigファイルのパス]
  1. 結果確認
    うまく行けば以下のように結果コードが0と、stdoutのログが表示がされます。


11.参考にしたサイト
https://qiita.com/fjunya/items/91305f20d6891beadb16

Discussion