inu

Jenkinsのマスター/スレーブ機能を使うときの設定メモ

Jenkins を使ってバッチ処理を行っているプログラム群がある。プラグインのアップデートをしたところスレーブ機能の設定が飛んだということで、改めて設定した際のメモ。

実現したいこと

  • マスターサーバーでスケジュール管理
  • マスターサーバーでログ管理
  • 大量データを処理する長時間処理を、高性能なスレーブサーバーに任せる
  • スレーブサーバーを使い終わったら自動でターミネートする

参考:Jenkinsを使った自動テスト環境を作る(後編)――Dockerコンテナを使って自動ビルドを実行する | さくらのナレッジ

環境

指定の必要がある項目

Jenkinsの管理 > ノードの管理 > Configure Clouds からスレーブサーバーの設定を行う

Amazon EC2

  • Name: スレーブサーバーを置くAWS アカウントの名前を入れた
  • Amazon EC2 Credentials: 利用対象の IAM 権限を渡す。Jenkinsの管理 > Manage Credentials からクレデンシャル登録を行っておく
  • Region: スレーブサーバーを置くリージョン。今回は普通に ap-northeast-1
  • EC2 Key Pair's Private Key: スレーブサーバーへのssh接続用情報、こちらもManage Credentials から追加しておく

AMIs

  • AMI ID: 利用する AMI のID
  • Instance Type: AMI のタイプに合っていないと無言でエラーになって起動できないので注意
  • Availability Zone: 後で指定するサブネットのAZと合わせないとエラーになる
  • Security group names: nameだけどセキュリティグループIDじゃないとエラーになる。マスターのいるSGからのインバウンドを許可しておく
  • Remote FS root: とりあえず今回は /var/jenkins で問題ない
  • Remote user: ssh接続するユーザー名。今回は ec2-user
  • Labels: ジョブ側から指定する時のスレーブサーバータイプのお名前
  • 用途: このマシーンを特定ジョブ専用にする。明示的にこのノードを使用するよう指定された場合のみこのノードで作業が行われる

以下は「高度な設定」を開いて設定する。

  • Subnet IDs for VPC: ここを指定しないとデフォルトVPCに置かれてしまう
  • Tags: Name = [お好きなお名前]。これくらいはやっておかないとEC2のコンソールで探しづらいので
  • Associate Public IP: 今回はインターネットを使う必要があるプログラムなので、パブリックIP付与。パブサブネットに建てる

注意事項

マスターからスレーブへのssh接続には5分以上かかる

Launch Timeout in seconds を設定しているとタイムアウトの可能性がある

https://issues.jenkins.io/browse/JENKINS-62724

Host Key Verification Strategy は check-new-hard が推奨

らしい。以前のバージョンではデフォルトで check-new-soft だったようだが……

https://github.com/jenkinsci/ec2-plugin/#strategies

そもそもを考えれば

このバッチ処理たちのアーキテクトを今の自分がイチから組むとしたら、Cloudwatch のクーロンと AWS Batch の組み合わせにすると思う。処理時間15分以上かかるかつ大量データ扱う以上 Lambda では無理だし。サーバーのお世話をしたくない。プラグインのバージョン問題に悩まされたくない。そもそものバッチプログラムを Docker 上で動くように組む。

移行にかかる工数(ほぼほぼ元のバッチプログラムの変更になるだろうけど)を考えると、あえてそれを今やるという判断にならないのだろうが……

マスター/スレーブという言葉もあまり使うべきではなかったね。