読者です 読者をやめる 読者になる 読者になる

tkuchikiの日記

Linux やプログラミングについて書きます。

Jenkins EC2 Plugin で Spot Instance を使ってテストを回す

AmazonLinux AWS EC2 Jenkins SpotInstance

動作確認した環境は、

Amazon Linux 2015.03
Java 1.7.0_75
Jenkins 1.610
EC2 Plugin 1.27

です。

Jenkins EC2 Plugin で Spot Instance を使えるようにするまで、
試行錯誤しましたので、導入方法をまとめました。

Jenkins のインストール

適宜 sudo してください。

curl -s http://pkg.jenkins-ci.org/redhat/jenkins.repo -o /etc/yum.repos.d/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
yum install -y jenkins

EC2 Plugin のインストール

Jenkins > Jenkinsの管理 > プラグインの管理
の、[利用可能]タブから Amazon EC2 plugin にチェックを入れて 「ダウンロードして再起動後にインストール」

AMI の作成

  • EC2 インスタンスを起動
  • JENKINS_URL は環境に合わせて適宜変更して、以下を実行。適宜 sudo してください
wget http://JENKINS_URL/plugin/ec2/AMI-Scripts/ubuntu-init.py -O /usr/bin/userdata
chmod +x /usr/bin/userdata
echo "/usr/bin/userdata" >> /etc/rc.local
  • AMI を作成する(以降の手順で AMI ID を使います)

JNLP 用の port を固定する

  • JNLP 用の port がデフォルトではランダムになっていますが、これだと Security Group の設定が大変なので固定します
  • Jenkins > Jenkinsの管理 > グローバルセキュリティの設定の、
    • 「セキュリティを有効化」にチェックを入れる
    • JNLPスレーブ用TCPポート番号 を固定にして、port を設定(画像の例は、58080)
    • 権限管理を適宜設定(画像の例は、「全員に許可」)

f:id:tkuchiki:20150424183709p:plain

Security Group の設定

  • JNLP 用の port を開ける(Master Node に適用)
    • JNLP 用 port 固定時に設定した port をあける

EC2 Plugin の設定

Jenkins > Jenkinsの管理>システムの設定から、

  • 「保存」、「適用」ボタンの上らへんにある「追加」ボタンから 「Amazon Linux」を選択

f:id:tkuchiki:20150424180455p:plain

  • 以下をそれぞれ入力
    • Access Key ID
    • Secret Access Key
    • Region
    • EC2 Key Pair's Private Key
    • AMIs
      • Description
      • AMI ID : 作成した AMI の ID を設定
      • Instance Type
      • Availability Zone
      • Use Spot Instance にチェック
      • Spot Max Bid Price
      • Choose Bid Type
      • Security group names : AWS の Security Group の name をカンマ区切りで指定
      • Remote user : ec2-user (適宜変更する)
      • AMI Type : unix(Amazon Linux の例なので)
      • Root command prefix : sudo(必要であれば)
      • Labels : Slave Node を管理する単位なので適宜入力、スペース区切りで複数指定可能
      • 用途 : このスレーブをできるだけ利用する(必要に応じて変更)
      • Idle termination time : terminate(または stop) するまでの時間(分)
    • 高度な設定
      • Number of Executors : 同時ビルド数
      • Subnet ID for VPC : VPC を使うときに、Subnet ID を指定する
      • Tags : これを省略すると動かなくなります。EC2 用の Name タグを設定しましょう
      • Instance Cap: 最大ビルド数
      • Associate Public IP : Global IP を自動で振って欲しければ設定しましょう

ジョブ作成

  • Jenkins > 新規ジョブ作成
    • ジョブ名 : 適宜入力
    • ジョブの種類も適宜設定
  • 設定画面に遷移後、
    • 実行するノードを制限 の ラベル式 : AMIs の Labels に設定したものを設定する
    • ビルド手順の追加 から「シェルの実行」を選択
    • シェルの実行のシェルスクリプトに以下を入力

f:id:tkuchiki:20150424185651p:plain

#!/bin/bash
echo "$(date) : $(hostname)" >> /tmp/hostname

ビルド実行

  • 左ペインにある「ビルド実行」を押下
  • Spot Request が投げられて、インスタンスが起動します
    • 5 ~ 10 分くらいで起動します
  • Spot Instance に入ると、/tmp/hostname が生成されていると思います
    • それから Idle termination time 分後、Spot Instance が terminate されます

まとめ

EC2 Plugin を使うと簡単に Spot instance を起動してテストを回すことができます。
システム設定に不備があると起動しないので注意してください。
私は、Tag を設定していなかったことでエラーが出て起動しなくて、半年前に一度挫折しました。
一度できるようになると、かなりの費用削減になると思いますので、おすすめです。