データベース技術調査ブログ

LinuxやPostgreSQL、Oracleデータベース、AWSの知識をアウトプットしていきます

【AWS/ECS/Fargate】Embulkのジョブをサーバレスに実行する基盤を作ってみるチュートリアル(パート1)

ECS(Elastic Container Service)とEmbulkの勉強したついでに、EmbulkのバッチETL処理をサーバレスの基盤で実行する環境を構築するチュートリアルを作ってみました。バッチ処理クラウドの課金体系と相性がいいのでサーバレスで実行できるようにするとコスト最適化ができると思います。


まぁ、最近はクラウド型のETLサービスも増えているのでそこまで必要なかったりするかもしれません。ただ、クラウドサービスの辛いところはVPCなどに閉じているような従来型のデータ連携の場合にちょっとセキュリティ的に考えることが多くてなかなか手が出しにくい(承認に骨が折れる)点かなと思います。

そんなこんなで、自力でサーバレス基盤でETLを実行できるようにすればいいのでは?と思い検証してみました。結構需要はありそうな構成なのかなと思ったりしています。(すでにそういう基盤を作っている企業も結構ありそう)


単純にEmbulkECSでのバッチ処理について学んでみたいという方にも参考になると思います。よろしければ自身のAWSアカウントで試してみてください~(*^▽^*)
(執筆時点での情報のため、適宜最新情報に合わせて読み替えが必要になるかもしれませんが、その辺はご容赦ください。また、ある程度AWSのマネジメントコンソールの操作ができる前提で、細かく手順を書いていない部分があります。)



目次

チュートリアルについて

前書きはこれくらいにしてチュートリアルの紹介に入ります。


今回作成するEmbulkのジョブは以下を想定しています。
・業務システムが利用するDBから分析用のDWHへ差分データを連携するETLジョブ
 (チュートリアルのためDBは同じDBを流用します。もちろん別の環境でもいいです。)


構成図を載せておきます。

f:id:jimatomo:20210919122206p:plain
Embulk on ECS Fargateのチュートリアル構成図

手を動かして理解することがチュートリアルの良さだと思うので、基本的にマネジメントコンソールとCloud9でやります。
個別のVPCが必要な場合は準備している前提とします。(デフォルトのVPCでも問題ないです!)


複数パートに分けてお送りします。


【パート1】開発環境の準備(★本記事)
【パート2】Embulkコンテナの作成・単体テスト
【パート3】ECSのタスク定義と動作確認
【パート4】Step Functionsで簡単に実行できるように設定する



それではパート1のスタートです。


1-1) VPCについて

VPCの要件は以下です。
パブリックサブネット(インターネットゲートウェイへのルーティングの設定がされているサブネット)が一つ
プライベートサブネットは任意で2AZにそれぞれ一つ


S3へのアクセスが発生するのでVPCエンドポイントを設定しておくといいです!(なくても問題ないです)


1-2) Cloud9の構築

※自分のクライアント端末でLinuxやDockerの環境があればそれを使ってもいいです。ただしIAMのクレデンシャルの管理はお気を付けください。


Cloud9のマネジメントコンソールを開いてネットワークの設定以外はデフォルトの設定で作成してください。
(私は大した金額差はないのでインスタンスタイプの実t3.smallに変更しました。)


VPCの設定は用意したVPCの中のパブリックサブネットを選択してください。

その他詳細は英語になりますが、ドキュメントを参照ください。
Creating an EC2 Environment - AWS Cloud9


話は断線しますが、Cloud9はコンソールにアクセスしたユーザの権限を継承します。
この仕様、便利で好きです(^^♪


1-3) RDSの構築

RDSはPostgreSQLを利用します。RDSのマネジメントコンソールを開いて作りましょう。


サブネットグループを作っていない場合はまずはサブネットグループから作ります。サブネットグループは用意したVPCの中のプライベートサブネット2つを選択します。


基本的にデフォルトの設定でいいです。以下に設定しないといけないやつの設定例を書いておきます。(★テンプレートは「開発/テスト」を選択しましょう。)
エンジンのタイプPostgreSQL
バージョンPostgreSQL 13.3-R1(無難に最新版のものを選択してもらえばいいです。)
DB インスタンス識別子:(なんでもいいです。)
スターパスワード:(なんでもいいです。)
DB インスタンスクラス:db.t3.micro(全然性能求められないので安い奴で)
マルチ AZ 配置:スタンバイインスタンスを作成しないでください
VPC:(用意したVPCを選択)
セキュリティグループ:新規作成(名前は何でもいいです。)

※ほかにも追加設定がありますが、要らないものが多いのでチェック外してもいいです。
バックアップ
Performance Insights
モニタリング


出来上がったら、一旦セキュリティグループの設定にします。

1-4) セキュリティグループの設定

先にECSが利用するセキュリティグループを作成しておきます。作るだけで何もいじらなくていいです。


作り終わったら、RDSのセキュリティグループを設定します。
インバウンドのルールを以下に設定します。
ProtocolTCP
 port range:5432
 Source:ECS用に作成したセキュリティグループ

ProtocolTCP
 port range:5432
 Source:Cloud0のセキュリティグループ


1-5) Cloud9とRDSの初期セットアップ

Cloud9のターミナルでRDSの初期セットアップをしておきましょう。


まず最初にpsqlをインストールします。(最新版のpsqlをインストールするのがいいのですが、使う分には問題ないのでyumで入れちゃいます。)

# psqlのインストール
sudo yum install -y postgresql.x86_64

# psqlのインストール確認
psql --version


★<>は各々の環境に合わせて変更してください。

export PGHOST=<RDSのエンドポイント>
export PGDATABASE=postgres
export PGUSER=postgres
export PGPASSWORD=<マスターパスワード>

psql


ユーザとデータベースを作成します。(\passwordメタコマンドでパスワード入力のコマンドプロンプトが表示されます。)

CREATE USER poc_user;
\password poc_user

CREATE DATABASE source;
CREATE DATABASE target;

\q


ソースデータベースに接続してテーブルを作成します。

export PGDATABASE=source
export PGUSER=poc_user
export PGPASSWORD=<poc_userのパスワード>

psql
create table test_tbl (
  id integer primary key,
  payload text,
  updated_at timestamp
);

insert into test_tbl values (1,'test', current_timestamp);
insert into test_tbl values (2,'test', current_timestamp);
insert into test_tbl values (3,'test', current_timestamp);
insert into test_tbl values (4,'test', current_timestamp);
insert into test_tbl values (5,'test', current_timestamp);

SELECT * FROM test_tbl;


★ターゲットデータベースへの操作は別ターミナルを開いてやると便利
ターゲットデータベースに接続してテーブルを作成します。

export PGHOST=<RDSのエンドポイント>
export PGDATABASE=target
export PGUSER=poc_user
export PGPASSWORD=<poc_userのパスワード>

psql
create table test_target_tbl (
  id integer,
  payload text,
  updated_at timestamp
);

-- jobの実行前
SELECT * FROM test_target_tbl;

これにてデータベース側の準備は完了です。


1-6) パラメータストアに保存

後で使いますが、RDSへの接続関係の情報を保存しておきます。
★別ターミナルを開いてやると便利(※<>は読み替えてください。)

aws ssm put-parameter \
    --name "/embulk/source/postgresql/host" \
    --type "String" \
    --value "<RDSのエンドポイント>" \
    --overwrite

aws ssm put-parameter \
    --name "/embulk/target/postgresql/host" \
    --type "String" \
    --value "RDSのエンドポイント" \
    --overwrite

aws ssm put-parameter \
    --name "/embulk/source/postgresql/port" \
    --type "String" \
    --value "5432" \
    --overwrite

aws ssm put-parameter \
    --name "/embulk/target/postgresql/port" \
    --type "String" \
    --value "5432" \
    --overwrite

aws ssm put-parameter \
    --name "/embulk/source/postgresql/poc_user" \
    --type "SecureString" \
    --value "<マスターパスワード>" \
    --overwrite

aws ssm put-parameter \
    --name "/embulk/target/postgresql/poc_user" \
    --type "SecureString" \
    --value "<マスターパスワード>" \
    --overwrite


これにて開発の準備が整いました。次のパートに続きます!

【パート2】Embulkコンテナの作成・単体テスト