【AWS/ECS/Fargate】Embulkのジョブをサーバレスに実行する基盤を作ってみるチュートリアル(パート1)
ECS(Elastic Container Service)とEmbulkの勉強したついでに、EmbulkのバッチETL処理をサーバレスの基盤で実行する環境を構築するチュートリアルを作ってみました。バッチ処理はクラウドの課金体系と相性がいいのでサーバレスで実行できるようにするとコスト最適化ができると思います。
まぁ、最近はクラウド型のETLサービスも増えているのでそこまで必要なかったりするかもしれません。ただ、クラウドサービスの辛いところはVPCなどに閉じているような従来型のデータ連携の場合にちょっとセキュリティ的に考えることが多くてなかなか手が出しにくい(承認に骨が折れる)点かなと思います。
そんなこんなで、自力でサーバレス基盤でETLを実行できるようにすればいいのでは?と思い検証してみました。結構需要はありそうな構成なのかなと思ったりしています。(すでにそういう基盤を作っている企業も結構ありそう)
単純にEmbulkやECSでのバッチ処理について学んでみたいという方にも参考になると思います。よろしければ自身のAWSアカウントで試してみてください~(*^▽^*)
(執筆時点での情報のため、適宜最新情報に合わせて読み替えが必要になるかもしれませんが、その辺はご容赦ください。また、ある程度AWSのマネジメントコンソールの操作ができる前提で、細かく手順を書いていない部分があります。)
目次
- チュートリアルについて
- 1-1) VPCについて
- 1-2) Cloud9の構築
- 1-3) RDSの構築
- 1-4) セキュリティグループの設定
- 1-5) Cloud9とRDSの初期セットアップ
- 1-6) パラメータストアに保存
チュートリアルについて
前書きはこれくらいにしてチュートリアルの紹介に入ります。
今回作成するEmbulkのジョブは以下を想定しています。
・業務システムが利用するDBから分析用のDWHへ差分データを連携するETLジョブ
(チュートリアルのためDBは同じDBを流用します。もちろん別の環境でもいいです。)
構成図を載せておきます。
手を動かして理解することがチュートリアルの良さだと思うので、基本的にマネジメントコンソールと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のセキュリティグループを設定します。
インバウンドのルールを以下に設定します。
・Protocol:TCP
port range:5432
Source:ECS用に作成したセキュリティグループ
・Protocol:TCP
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
これにて開発の準備が整いました。次のパートに続きます!