TalendでCI/CDとコンテナー型仮想化を使用してサーバーレスアーキテクチャに移行する

TalendでCI/CDとコンテナー型仮想化を使用してサーバーレスアーキテクチャに移行する

  • Thibaut Gourdel
    Thibaut Gourdel is Technical Product Marketing Jr at Talend since 2017. His area of interest includes cloud technologies, containerization, serverless computing and data stream processing.

CI/CDとコンテナーの重要性

CI/CD(継続的インテグレーション・デリバリー・デプロイ)は、ソフトウェアプロジェクトを成功させるための重要な要素であり、プロジェクトを進めるうえで明らかにメリットがあります。既に、コンテナーは現在あらゆる場所で使用され、開発者から絶大な人気を博しています。CI/CDを使用するユーザーは、構築しているアプリケーションを自動的かつ継続的にテスト/検証できるので、アプリケーションの品質を確かなものにします。一方で、コンテナーは、企業が採用する標準的な手順に基づき、一度構築すれば「どこにでも」デプロイできるので、ソフトウェアの配布と実行をより俊敏に行えます。このような一般的なDevOpsプラクティスにより、「特定のマシンしか動作しない」という状況は、回避されます。結果として、サービスを市場投入するまでの時間が短縮されるとともに、デリバリーの頻度を高めることができます。

Talendのシステム環境へどのように適応できるか?

Talendでは、CI/CDとコンテナーの両方のメリットを利用できます。Talend 7.0のリリース以降では、標準的なMavenビルドにより、Dockerイメージ内でTalendジョブをビルドできるようになりました。そして、このプロセスをCI/CDのパイプラインにスムーズに接続できます。

サーバーレスアーキテクチャとは?

最後の段階で活用されるのはサーバーレスアーキテクチャです。Talendでは、サーバーレスでジョブがデプロイされます。実際に、ジョブをコンテナー内で送ることによって、統合ジョブを任意の場所に自由にデプロイできるようになりました。様々な選択において、サーバーレスとして定義される新しいサービスのカテゴリーが登場しています。AWS FargateやAzure Container Instancesなど、ほとんどの大手クラウドプロバイダーはコンテナー用のサーバーレスサービスの提供を開始しています。これらのサービスを利用すると、コンテナーを実行する際にインフラストラクチャ(サーバーやクラスター)を管理する必要がなくなります。発生するコストはコンテナーの使用料だけです。

これらの新しい機能は、Talend Connect US 2018の基調講演で紹介され、AWS FargateAzure ACIでジョブのビルドから実行までのパイプライン全体のデモンストレーションを使用して解説されました。このブログでは、Jenkinsを利用してCI/CDパイプラインを作成する方法について説明します。最初にDockerイメージ内でジョブをビルドし、Dockerレジストリでイメージを利用できるようにします。そしてAWS FargateやAzure ACIを呼び出してイメージを実行します。

Schema for going serverles with Talend through CI/CD and containers

このプロセスを再現する方法を見ていきましょう。

まず、次の要件を満たしていることを確認して下さい。

  • Talend Studio 7.0 以降
  • Talend Cloud Spring 18’ 以降
  • Jenkinsサーバーを利用できること
  • Jenkinsサーバーが、同じマシンにインストールされたDockerデーモンにアクセスできること
  • Talend CommandLineがJenkinsのマシンにインストールされていること
  • Nexus version 2 または 3
  • Talend CI BuilderがTalend CommandLineと共に構成されていること

* 上記のTalendコンポーネントは全て、Talend Cloudの30日間の試用版で利用できます。

Talend環境

Talendを初めて使用する方向けに、各コンポーネントの概要について説明します。Talend Cloudから使用を開始し、Talend Management Console(TMC)でプロジェクトを作成します。次に、Gitリポジトリを使用してジョブのアーティファクトを保管するようにプロジェクトを構成します。さらに、ホストされたNexusサーバーがジョブで必要な全てのサードパーティライブラリを保管するように、TMCでNexusを構成する必要があります。Talend Cloudのアカウントで、TMCを使用してプロジェクトとアーティファクトの管理を行います。

次に、Studioをインストールし、Talend Cloudアカウントで接続します。Studioは、Talendのメインとなるジョブ設計環境であり、ここで統合ジョブをビルドします。これらのステップに従ってStudioからクラウドアカウントでログインすると、TMCで定義されたプロジェクトを確認でき、Gitリポジトリに構成されたプロジェクトを使用できます。必要なプラグインをStudioに追加するには、後述のステップに従います。

最後に必要な2つのコンポーネントは、CI BuilderとTalend CommandLine(cmdline)です(クラウドの試用版を使用している場合、CommandLineツールはStudioのインストールファイルに含まれています)。CommandLineツールをインストールまたは初めて使用するときには、CommandLineツールのライセンスも指定する必要があります。このときは、Studioと同じライセンスファイルを使用できます。CommandLineツールとCI Builderツールは、Studio(実際にはGit)で設計されたジョブからコードを取得し、スクリプトを使用して実行可能バイナリーをビルドし、稼働環境へデプロイできるようにするコンポーネントです。CI BuilderとStudio内のプロファイルによって、Talend Cloudのランタイム環境またはコンテナーのどちらを指定するかが決まります。最初に次のステップを実行します。

1)Talend Cloudでプロジェクトを作成する

最初に、Talend Cloudアカウントでプロジェクトを作成し、プロジェクトをGitHubリポジトリにリンクする必要があります。この操作を行うためのドキュメントを参照して下さい

また、Talend CloudアカウントでNexusを構成することを忘れないで下さい。Talend CloudでNexusを構成するためのドキュメントに従って下さい。Nexusでは、次のリポジトリを用意する必要があります。

  • releases
  • snapshots
  • talend-custom-libs-release
  • talend-custom-libs-snapshot
  • talend-updates
  • thirdparty

2)Maven DockerプロファイルをStudioに追加する

Studioを構成するため、Maven Dockerプロファイルをプロジェクトの構成とジョブのpomファイルに追加します。必要な2つのファイルは、ここにありますproject.xmlstandalone-job.xmlです。

この操作を行うには、Studio左上部にあるメニューから[Project Properties] -> [Build] -> [Project / Standalone Job]を選択します。

上でコピーしたものに置き換えます。変更は必要ありません。

実際には、ここで行っている処理は、fabric8 Mavenプラグインを使用した「docker」と呼ばれる新しいプロファイルの追加です。このMavenプロファイルを使用してジョブをビルドするときには、openjdk:8-jre-slimがベースイメージとして使用され、ジョブの実行方法を示す小さなスクリプトと共にジョブのjarが追加されます。TalendはOpenJDKとAlpine Linuxをサポートしていないことに注意して下さい。テストの目的でのみ、openjdk:8-jre-slimイメージを保持できますが、実稼働を目的とする場合、Oracle Javaイメージでビルドする必要があります。詳細については、サポートされるプラットフォームのドキュメントを参照して下さい。

3)Jenkinsをセットアップする

3番目のステップはJenkinsサーバーのセットアップです。ここでは、Jenkinsの初期構築については取り上げません。今までJenkinsを使用したことがない場合は、Jenkins Pipelineのスタートガイドを参照して下さい。初期構築が完了したら、Maven、Git、Docker、Pipeline、Blue Oceanプラグインを使用して、CI/CDパイプラインを使用します。

Maven設定ファイルをJenkinsにセットします。Jenkinsの設定(Manage Jenkins)で、[Managed files]に移動し、「maven-file」というIDを使用してファイルを作成します。下のスクリーンショットに示すように、このファイルをコピーします。ユーザー独自の設定に合わせてCommandLineのパスを変更し、Nexus認証情報とURLを独自に指定したことを確認して下さい。

 

パイプラインの詳細に移る前に、いくつかの認証情報を定義する必要があります。これを行うには、[Manage Jenkins]と[Configure credentials]を選択し、左側の[Credentials]を選択します。下のスクリーンショットを参照して下さい。

GitHub、Docker Hub、AWS、Azure用に4つの認証情報を作成します。AWSのみを使用する予定の場合は、Azure認証情報を指定する必要はありません(逆も然りです)。AWS認証情報のユーザー名としてACCESS KEYを指定し、パスワードとしてSECRET ACCESS KEYを必ず指定して下さい。

最後に、パイプラインに移る前に、Jenkinsマシンで2つのCLI Dockerイメージを使用できるようにする必要があります。実際に、JenkinsはAWS CLIとAzure CLIでDockerイメージを使用し、様々なサービスに対してCLIコマンドを実行します。これは、これらのCLIをマシンにインストールせずに簡単に使用するための方法です。以下のイメージを使用します。

  • vfarcic/aws-cli (docker pull vfarcic/aws-cli:latest; docker tag vfarcic/aws-cli:latest aws-cli)
  • microsoft/azure-cli:latest (docker pull microsoft/azure-cli:latest; docker tag microsoft/azure-cli:latest azure-cli)

勿論これに限らず、ユーザー環境に合うイメージを使用できます。

これらのDockerイメージをJenkinsマシン上でプルする必要があります。これにより、パイプラインでJenkins Dockerプラグインを使用し、「withDockerContainer(‘image’)」関数を使用してCLIコマンドを実行(後述)できます。Dockerコンテナー内のビルドのステップの実行については、こちらのJenkinsドキュメントを参照して下さい。Now that all the pre-requisites have been

全ての前提条件を満たしたら、メインページで「新しいアイテム」を作成して[Pipeline]を選択します。

作成後に、パイプラインを構成できます。ここでは、パイプラインのスクリプト(Groovy言語)を定義します。

スクリプトはこちらを参照して下さい。

このファイルで、主要なステップを見ていきましょう。

ファイルの先頭部では、環境変数を使用してユーザー独自の設定を指定できます。「TALEND_JOB_PIPELINE」というプロジェクトと「test」というジョブを使用する例が用意されています。プロジェクトのGit名は、GitHubリポジトリ内のプロジェクト名と一致している必要があります。名前が大文字になっているのはそのためです。このスクリプトでは、Dockerイメージ名としてジョブ名を使用するので、ジョブ名にアンダースコアは使用できません。アンダースコアを使用したい場合は、Dockerイメージに別の名前を定義して下さい。次の環境変数を設定する必要があります。

env.PROJECT_GIT_NAME = 'TALEND_JOB_PIPELINE'
env.PROJECT_NAME = env.PROJECT_GIT_NAME.toLowerCase()
env.JOB = 'test'
env.VERSION = '0.1'
env.GIT_URL = 'https://github.com/tgourdel/talend-pipeline-job.git'
env.TYPE = "" // if big data = _mr
env.DOCKERHUB_USER = "talendinc"

このファイル内で、各ステップは「stage(ステージ)」によって定義されます。最初の2つのステージでは、Gitプラグインを使用してジョブの最新バージョンをプルします。

そして、ジョブをビルドします。ご覧のように、Mavenプラグインを利用しています。設定はJenkins設定ファイルに含まれています。これは、上記でmaven-file IDを使用してJenkinsの構成に追加したファイルです。

「Build, Test and Publish to Nexus」(ビルド、テスト、Nexusへの公開)ステージと「Package Jobs as Container」(コンテナーとしてのジョブのパッケージ化)ステージで、次の行を変更します。

-Dproduct.path=/cmdline -DgenerationType=local -DaltDeploymentRepository=snapshots::default::http://nexus:8081/repository/snapshots/ -Xms1024m -Xmx3096m

ここでは、CommandLineディレクトリのユーザー独自パス(Jenkinsサーバーに対して相対的なパス)とNexus URLを指定します。

Dockerイメージでのジョブのビルド後で、イメージをDockerhubレジストリにプッシュします。このステップと次のステップでは、CLIを使用して異なるサードパーティを使用します。DockerデーモンはJenkinsのマシンで実行しているので、Docker CLIを直接使用できます。withCredentials()関数を使用してDockerhubのユーザー名とパスワードを取得します。

stage ('Push to a Registry') {
            withCredentials([usernamePassword(credentialsId: 'dockerhub', passwordVariable: 'dockerhubPassword', usernameVariable: 'dockerhubUser')]) {
               sh 'docker tag $PROJECT_NAME/$JOB:$VERSION $DOCKERHUB_USER/$JOB:$VERSION'
               sh "docker login -u ${env.dockerhubUser} -p ${env.dockerhubPassword}"
               sh "docker push $DOCKERHUB_USER/$JOB:$VERSION"
           }
}

「Deployment environment」(デプロイ環境)ステージは、パイプラインを実行する際のユーザーとの対話的処理です。コンテナーをAWS FargateまたはAzure ACIのどちらにデプロイするかの確認が行われます。デプロイまで連続的にビルドを実行する場合は、このステップを省略できます。このステップはデモ用です。

次の2つのステージは、AWS FargateまたはAzure ACIへのデプロイです。2つのそれぞれのステージでは、ユーザー独自の設定を使用して変更する必要があります。たとえば、AWS Fargateのデプロイステージでは、次の行を変更します。

aws ecs run-task --cluster TalendDeployedPipeline --task-definition TalendContainerizedJob --network-configuration awsvpcConfiguration={subnets=[subnet-6b30d745],securityGroups=[],assignPublicIp=ENABLED} --launch-type FARGATE

Fargate Clusterの名前とタスクの定義を変更する必要があります。これらは、AWSコンソールで作成して下さい。この操作については、こちらのドキュメントを参照して下さい。このブログ執筆時点で、AWS Fargateは北部バージニア地域でのみの使用可能ですが、他の地域でも今後使用できるようになります。タスク定義で定義されるコンテナーは、イメージ名としてのジョブ名によりDocker Hubアカウントで作成されます。たとえば、パイプラインスクリプト内のデフォルト構成を使用する場合は、talendinc/test:0.1となります。

同じことがAzure ACIにも当てはまり、ユーザー独自のリソースグループとコンテナーインスタンスを指定する必要があります。

4)CommandLineを構成する

実際のところ、MavenはCommandLineを使用してジョブをビルドします。CommandLineは、スクリプトモードとサーバーモードの2つのモードで使用できます。ここでは、サーバーモードでCommandLineを使用します。最初に、CommandLineのワークスペースを指定する必要があります(ここではJenkinsワークスペース)。Jenkinsワークスペースへのユーザー独自のパスを使用して、次のようにcommand-line.shファイルを変更します(パスは、前のステップで選択したパイプライン名によって異なります)。

./Talend-Studio-linux-gtk-x86_64 -nosplash -application org.talend.commandline.CommandLine -consoleLog -data /var/jenkins_home/workspace/talend_job_pipeline startServer -p 8002

ユーザー独自の設定に従ってJenkinsのホームパスを変更します。最後に、/configuration/maven_user_settings.xmlファイルを変更します。そのためには、ユーザー独自のNexus URLとログイン情報をコピーして、このファイルに貼り付けます。

その後で、バックグラウンドでCommandLineを起動します。

$ /cmdline/commandline-linux.sh &

5)パイプラインを実行する

必要な全ての構成が完了したら、パイプラインを実行できます。そのためには、[Open Blue Ocean]ビューに移動し、[run]ボタンをクリックします。これによりパイプラインがトリガーされ、パイプラインの進捗状況が表示されます。

Screenshot of Jenkins Pipeline to build Talend Jobs into Docker Containers

DockerコンテナーにTalendジョブをビルドするためのJenkins Pipeline

ここでのパイプラインは、コンテナーをデプロイする場所をユーザーに尋ねます。AWS FargateまたはAzure ACIを選択します。Fargateを使用する例を見てみましょう。

 

デプロイを進めると、Fargateクラスターに1つの保留中のタスクが残ります。

実行されたタスクの詳細を調べる場合は、ジョブのログにアクセスできます。

これで、次のような任意の場所でDockerコンテナーにパッケージ化されたTalend統合ジョブを実行できるようになります。

  • AWS Fargate
  • Azure ACI
  • Google Container Engine
  • Kubernetes or OpenShift
  • And more …

TalendのCI/CD機能により、ビルドからジョブの実行までのプロセス全体を自動化できます。

クラウドの選択肢にかかわらずコンテナーの移植性を活用したい場合、この例を参考に、CI/CDツール(ここではJenkins)を使用して、様々なクラウドコンテナーサービスでビルドを自動化して実行できます。これは、数多くある方法の1つの例にすぎませんが、コンテナーとしてジョブをビルドできるようになれば、統合ジョブの全く新しい可能性が開かれます。ユースケースによっては、このような新しいサーバーレスサービス(FargateやAzure ACIなど)によってコストを大幅に削減できます。インフラストラクチャの構成にかける時間を短縮し、ジョブの設計に専念することもできます。

 

ディスカッションに参加

0 Comments

コメントを残す

Your email address will not be published. Required fields are marked *