メインコンテンツにスキップ

2件の投稿件の投稿が「jenkins」タグ付き

すべてのタグを見る

JenkinsでEC2コストを節約する方法

· 4分の読み時間
Haril Song
Owner, Software Engineer at 42dot

特定の時間や条件で実行する必要があるバッチアプリケーションのリソースコストを最適化するための非常にシンプルな方法を共有したいと思います。

問題

  1. バッチは特定の時間にのみ実行されます。例えば、日次、月次、年次などの定期的な計算タスク。
  2. 応答速度は重要ではなく、バッチが実行されることが優先されます。
  3. 特定の時間に必要なリソースのために24時間EC2インスタンスを維持するのは非効率です。
  4. クラウドサーバーのリソースが必要なときだけEC2インスタンスを準備することは可能でしょうか?

もちろん可能です。AWS ECSやAWS EKSなどの自動化ソリューションもありますが、ここではJenkinsを使ってバッチとEC2サーバーを直接管理し、環境を設定する方法を考えます。

アーキテクチャ

このインフラストラクチャ設計により、バッチ実行のためにリソースが必要なときだけコストが発生するようにできます。

Jenkins

Jenkinsノード管理ポリシー

image

キューにリクエストが待機しているときのみノードをアクティブにし、不要なエラーログを最小限に抑えます。また、1分間アクティビティがない場合はアイドル状態に移行します。

AWS CLI

AWS CLIのインストール

AWS CLIを使用すると、ターミナル環境でAWSリソースを管理できます。以下のコマンドを使用して、現在実行中のインスタンスのリストを取得できます:

aws ec2 describe-instances

必要なリソースの情報を確認したら、ターゲットを指定して特定のアクションを実行できます。コマンドは以下の通りです:

EC2の起動

aws ec2 start-instances --instance-ids {instanceId}

EC2の停止

aws ec2 stop-instances --instance-ids {instanceId}

スケジューリング

バッチを月に一度実行するためのcron式を書いて、簡単に設定できます。

image

H 9 1 * *

これで、EC2インスタンスはほとんどの時間停止状態にあり、月に一度Jenkinsによってバッチ処理のために起動されます。

結論

使用していないときにEC2インスタンスを稼働状態にしておくのはコスト面で非効率です。この記事では、Jenkinsと簡単なコマンドを使用して、必要なときだけEC2を利用する方法を示しました。

EKSのような高レベルのクラウドオーケストレーションツールもこのような問題をエレガントに解決できますが、時にはシンプルなアプローチが最も効率的であることもあります。この記事を締めくくるにあたり、あなたの状況に最適な方法を選んでいただければ幸いです。

DockerでJenkinsを運用する

· 5分の読み時間
Haril Song
Owner, Software Engineer at 42dot

概要

この記事では、Dockerを使用してJenkinsをインストールおよび運用する方法について説明します。

目次

インストール

Docker

docker run --name jenkins-docker -d -p 8080:8080 -p 50000:50000 -v /home/jenkins:/var/jenkins_home -u root jenkins/jenkins:lts 

ホストマシン上にJenkinsデータを永続化するためにボリュームをマウントします。TeamCityとは異なり、Jenkinsはすべての設定をファイルで管理します。マウントを設定することで、認証情報やデータ管理が非常に便利になるため、必ず設定してください。一般的なターゲットパスは/home/jenkinsまたは/var/lib/jenkinsです。

この記事の目的のために、/home/jenkinsパスが作成されていると仮定します。

認証

マスターとノードの両方に対するセキュリティとアクセス制御を確保するために、'jenkins'という名前のユーザーを作成し、以下の手順に従います。

ユーザーアクセス権の設定

chown -R jenkins /var/lib/jenkins

SSHキーの管理

キーがない場合は、ssh-keygenを使用してプライベートキーとパブリックキーを生成します。

パスの入力を求められたら、/home/jenkins/.ssh/id_rsaと入力して、キーが/home/jenkins/.sshに作成されるようにします。

GitLab

GitLabの個人設定にはSSH設定タブがあります。そこにパブリックキーを追加します。

パイプラインでGitを選択すると、リポジトリパスの入力フィールドが表示されます。git@~で始まるSSHパスを入力すると赤いエラーが表示されます。これを解決するために、資格情報を作成します。SSH資格情報を選択して作成し、ID値には有用な値を入力することをお勧めします。

ノード設定

ノードはJenkinsの役割を効率的に分散する方法です。

ノードと通信するために、マスターでssh-keygenを使用してキーを生成します。既に使用しているキーがある場合は、それを再利用できます。

image

  • ID: この値はJenkinsが内部でSSHキーを識別するために使用され、Jenkinsfileで資格情報を使用しやすくするため、意味のある値を設定するのがベストです。設定しない場合はUUID値が生成されます。
  • Username: Linuxユーザー。通常、'jenkins'がユーザーとして使用されるため、'jenkins'と入力します。これを入力しないと、キーエラーが発生する可能性があるので注意してください

Dockerアクセス権限

dockerグループが存在しない場合は、作成します。通常、Dockerをインストールすると自動的に作成されます。

sudo groupadd docker

以下のコマンドを実行して、JenkinsユーザーにDockerを実行する権限を付与します。

sudo gpasswd -a jenkins docker
# Adding user jenkins to group docker
sudo chmod 666 /var/run/docker.sock

変更を適用するためにDockerデーモンを再起動します。

systemctl restart docker

これでdocker psコマンドを実行できるようになります。

再起動

Jenkinsのバージョンを更新したり、プラグインをインストール、削除、更新したりすると、Jenkinsが再起動します。しかし、Dockerで管理している場合、コンテナがダウンし、Jenkinsが起動できなくなります。再起動を有効にするには、コンテナに再起動ポリシーを設定する必要があります。

docker update --restart=always jenkins-docker

これにより、jenkins-dockerコンテナは常に実行状態に保たれます。

注意

プラグインを更新する際には、現在運用中のJenkinsのバージョンと互換性があるかどうかを慎重に確認してください。Jenkinsとプラグインのバージョンが一致しないと、パイプラインの失敗につながることがよくあります。

参考

Managing Jenkins with Docker