【AWS】 Jenkins SlaveタスクをFargate上で実行する

1. 環境

  • OS : AmazonLinux2
  • Jenkins : 2.223-1.1
  • ECS プラグイン: Amazon Elastic Container Service (ECS) / Fargate plugin(1.26)

<前提>

  • AmazonLinxu2 に Jenkinsがインストールされていること(Yumでインストールできます)

2. 作業

① ECSプラグインをインストールする

Jenkins上でECSを実行するために、プラグインをインストールします。

1. Jenkinsのコンソールにログインする。

2. [Jenkinsの管理] ‐ [プラグインの管理] - [利用可能] タブを開く

3. 「Amazon Elastic Container Service (ECS) / Fargate plugin」にチェックを入れ、[ダウンロードして再起動後にインストール] をクリックする

4. 画面が推移するので、「インストール完了後、ジョブがなければJenkinsを再起動する」にチェックを入れる
自動でJenkinsが再起動します。

5. Jenkins再起動後に、[Jenkinsの管理] ‐ [プラグインの管理] - [インストール済み] タブを開き、プラグインがインストールされていることを確認する。

f:id:ykoomaru:20200412201209p:plain

② クラスター作成

Fargateを実行するクラスターを作成します。

1. AWSコンソールにログインし、[ECS] - [クラスター] - [クラスターの作成] をクリックする

2. [ネットワーキングのみ] を選択し、[次のステップ] をクリックする

f:id:ykoomaru:20200412202022p:plain

3. 任意の「クラスター名」を入力し、[作成] をクリックする
このタイミングでVPCも作成する場合は、「VPCの作成」 にチェックを入れる

f:id:ykoomaru:20200412202546p:plain

4. クラスターが正常に作成されたことを確認する

f:id:ykoomaru:20200412202614p:plain

③ タスク定義作成

次にFargate上で実行するコンテナの設定情報を定義するタスク定義を作成します。

1. [ECS] - [タスク定義] - [新しいタスク定義の作成] をクリックする

2. [FARGATE] を選択し、[次のステップ] をクリックする

f:id:ykoomaru:20200412203409p:plain

3. 以下の項目を入力し、[作成] をクリックする。

<タスク定義参考>
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html

  • タスク定義名【必須】: 任意の値
  • タスクロール : 実行したタスク内で利用するIAMロール
  • タスク実行ロール【必須】 : AWSがFargateからタスクを実行するためのIAMロール
  • タスクメモリ (GB) : タスクに割り当てるメモリ ※
  • タスク CPU (vCPU) : タスクに割り当てるCPU ※
  • App Mesh 統合の有効化 : App Mesh利用する場合はチェック *プロキシ設定の有効化 : App Meshのプロキシを利用する場合はチェック
  • コンテナの追加【必須】 : コンテナの設定

※ メモリとCPUで指定できる組み合わせが決まっている。
組み合わせについては、AWS公式サイトを参照すること。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size

4. タスク定義が正常に作成されたことを確認する

f:id:ykoomaru:20200412204749p:plain

④ Jenkins Slave Template 設定

最後にJenkinsの Slave Templateの設定をします。

1. Jenkinsにログインし、[Jenkinsの管理] - [システムの管理] - [Cloud - a separate configuration page.] をクリックする

2. 以下の項目を入力し、[Save] をクリックする

  • Name :
  • Amazon ECS Credentials :
  • Amazon ECS Region Name : 「② クラスター作成」でクラスターを作成したリージョン
  • ECS Cluster : クラスター名
  • ECS agent templates
    • Label
    • Task Definition Override : 「③ タスク定義作成」で作成したタスク定義のARN
    • Launch type : FARGATE
    • Subnets : コンテナを起動するサブネット。ECSのエンドポイント及びJenkinsサーバーにアクセスできること。
    • Security Groups : コンテナにアタッチするSG。ECSのエンドポイント(443)及びJenkinsサーバー(8080)にアクセスできること。

Launch typeを「FARGATE」にした場合、現時点のプラグインの仕様なのか、Template Nameに値を入れてもタスク定義が自動で作成されません。そのためタスク定義を事前に作成して、Task Definition Overrideでタスクを指定する必要があります。 Launch typeが「EC2」の場合は、タスク定義が自動で作成される。毎回タスク定義を作成するのは手間なのでアップデートしてほしい、、、

⑤ 動作確認

最後に動作確認します。

1. [実行するノードを制限] で先ほど作成したラベルを指定したジョブを作成します。 2. [ビルド実行] をクリックし、ジョブが正常に動作することを確認します。

ジョブ実行後に、クラスターを確認するとFarrgateでタスクが実行されていることを確認できます。 f:id:ykoomaru:20200412212154p:plain

3. 最後に

Jenkins上のタスクをFargate上で実行できるようになって、Jenkinsのスレーブ用に環境を用意する必要がなくなり、運用が大変楽になりますね。
ただ、ECS on Fargateでは、privilegedオプションが利用できないので、特権が必要なジョブを実行している場合は注意してください。

 privileged
 このパラメータが true のとき、コンテナには、ホストコンテナインスタンスに対する昇格されたアクセス権限 (root ユーザーと同様) が付与されます。
このパラメータは、Docker Remote API の コンテナを作成する セクションの Privileged にマッピングし、--privileged オプションを docker run にマッピングします。
このパラメータは、Fargate 起動タイプを使用する Windows コンテナまたはタスクではサポートされていません。

可能な限りマネージドサービスを利用して、快適なAWSライフを!!