[Talend]EC2上で動かすTalendのジョブのContextをタグから変更出来るようにしてみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。

TalendではContextにDBの接続情報といった実行環境毎に異なる値を格納すると言った事が可能です。

[Talend] 実行時にコンテクストパラメータを変更する方法

Contextには環境情報を含ませることができ、開発環境で動かす場合はローカルのDBを参照し本番環境はAWS上のRDSを参照すると言ったことが設定可能です。

Talendのデフォルトの状態では、作成したジョブに指定するContextの環境設定はジョブを出力する際に、指定する必要があります。 また、ジョブの出力画面は出力が完了した後に自動的に閉じてしまうため、出力が完了した後に自分が指定した値を確認することができません。

そのため、実際に配置する環境のContextとは異なる指定してビルドを作成し、動かしてしまういったことが発生する恐れがあります。 ContextにはDBの接続情報等を記載することになりますので、上記の場合開発中のジョブの実行結果が本番のDBに反映されると言った恐れもあります。

そもそも、開発環境のEC2に配置したジョブが本番環境用のContextで動くなんてことはありえないはずです。

それならばジョブが実行する際にEC2から環境の情報を取得し、取得した環境のContextで動けば、 異なるContextで動いてしまうといったことは避けられることになります。

また、EC2にはインスタンスのメタ情報としてタグをもたせることができます。

Amazon EC2 リソースにタグを付ける - Amazon Elastic Compute Cloud

Talendのジョブが実行時にそのタグを参照することでContextを外部(EC2のタグ)から指定するといった流れになります。

環境毎のContextを含むジョブの作成

Talendのジョブを作成し、Contextの項目でDefaultの横の+ボタンを押下します。 CreateContextEnviroment

Contextの環境を作成する画面が表示されるので、今回はDevelopment,Productionという項目を作成します。

AddContextEnviroment AddContextEnviromentResult

次にContextの値を設定していきます。

messageという項目を作成し、Defaultにデフォルト、Developmentには開発、Productionには本番という値を入れておきます。 SetContextValue

最後にtJavaコンポーネントをジョブに配置し、以下の様にContextの中身を表示する実装を行います。

SetContextValue

System.out.println(Context.message);

上記のジョブを動かすことで、設定した値が示されることを確認します。

今回の例ではDefaultに設定したデフォルトという文字列が表示される事がわかります。 ShowResultLocal

EC2のタグを取得し、実行するシェルの作成

Talendのジョブを出力した際に、一緒に作成されるシェルに仕掛けをつくります。 シェルの設定画面を開きます。

ファイル→プロジェクトプロパティの編集と遷移します。

MoveProjectProperties

次に、ビルド→シェル設定→shの中を以下の内容に書き換えます。

MoveProjectProperties

#!/bin/sh
cd `dirname $0`
ROOT_PATH=`pwd`
ENV=$(aws ec2 describe-instances --region ap-northeast-1  --filter "Name=instance-id,Values=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)"   --query 'Reservations[].Instances[].Tags[?Key==`Env`].Value[]'   --output text | tr -d '\n')
java ${talend.job.jvmargs} -cp ${talend.job.sh.classpath} ${talend.job.class} --context=$ENV "$@" 

仕掛けとしては4行目にてaws cliのdescribe-instanceで自分のインスタンスの情報を取得し、queryとoutputのオプションでEnvをKeyとしたタグの値のみを抽出しているといった流れになります。

EC2インスタンスの立ち上げ

普通にEC2インスタンスを立ち上げます。 その際タグでEnvというKeyとその値にDevelopmentとセットします。 createEC2Instance また、作成する際にEC2の情報が取得できるIAM Roleを付与しておく必要があります。

動作確認

作成したEC2インスタンスに対してエクスポートしたジョブを配置します。

その後実行すると、今回タグにはDevelopmentという値をセットしているため、開発という文字列が表示されることになります。

$ sh ./ContextChange_run.sh
開発

また、タグの値をProductionに変更することで、出力結果が開発から本番に変更されます。

changeEC2Tag

$ sh ./ContextChange_run.sh
開発

結論

この方法を用いることでTalendのContextを変更するに際し、ジョブのビルドやシェルの書き換え無しが必要なくなることとなります。 そうすると一度作成したAMIやDockerのイメージを別環境向けに配置するといったことも容易に行えそうです。