Help us understand the problem. What is going on with this article?

LambdaでEKS Worker Nodeの夜間・休日停止を行う

はじめに

検証環境やステージング環境でEKSを使用するときには夜間・休日には停止させて料金を抑えたいことがあると思います。
しかしながらEKSのWorker Nodeの数は宣言的であるがために停止させても新たに立ち上がります。
Masterを消すにしても元の状態に戻すためのアプリケーションのバックアップ・リストア作業を全て自動化しておかないと面倒です。

今回はLambdaでAutoscaling Groupのパラメータを変更することでWorker Nodeを夜間・休日にシャットダウンさせます。

環境情報

macOS Mojave 10.14.1
EKS: 1.14

実施手順

1. Lambda関数の作成

ランタイムはPython 3.7とします。
スクリーンショット 2020-02-19 0.14.51.png

関数は次のようになります。
停止と起動の両方に対応できるようにします。

lambda_function.py
import boto3

autoscaling = boto3.client("autoscaling")

def lambda_handler(event, context):
  args = dict(AutoScalingGroupName=event["AutoSaclingGroupName"], 
              MinSize=event["MinSize"], 
              MaxSize=event["MaxSize"], 
              DesiredCapacity=event["DesiredCapacity"])
  autoscaling.update_auto_scaling_group(**args)

2. CloudWatch Eventsルールの作成

起動停止の2種類のルールをCloudWatch Eventsで作成していきます。
Nodeは平日7:00-23:00(JST)で起動しているものとします。
スクリーンショット 2020-02-19 0.29.20.png

停止ルール

スケジュールではcron式(0 14 ? * MON-FRI *)(日本時間で平日23:00)を入れますがUTCであることに注意しましょう。
関数は手順1で作成したものです。
スクリーンショット 2020-02-19 0.44.02.png

関数への入力は次のJsonを指定します。
Node数が0になるようにします。

{
  "AutoSaclingGroupName": "pulumi-eks-cluster-5b04401d-NodeGroup-1OC0O09KCF829",
  "MinSize": 0,
  "MaxSize": 0,
  "DesiredCapacity": 0
}

ルール名を指定して作成を完了させます。
スクリーンショット 2020-02-19 0.37.30.png

起動ルール

起動ルールではcron式(0 22 ? * SUN-THU *)(日本時間で平日7:00)とします。
こちらもUTCであることに注意しましょう。

スクリーンショット 2020-02-19 0.45.38.png

入力のJsonは次のようになります。
デフォルトNode数を2としています。

{
  "AutoSaclingGroupName": "pulumi-eks-cluster-5b04401d-NodeGroup-1OC0O09KCF829",
  "MinSize": 1,
  "MaxSize": 2,
  "DesiredCapacity": 2
}

ルール名を指定して作成を完了させます。
スクリーンショット 2020-02-19 0.47.31.png

3. IAM Policyのアタッチ

手順1で自動で作成されたIAM RoleにAutoScalingGroupを操作するためのIAM Policyをアタッチします。

スクリーンショット 2020-02-19 0.49.10.png

updateするだけなのでオーバーキルではありますが、事前に用意されているAutoScalingFullAccessを選択することとします。

スクリーンショット 2020-02-19 0.54.40.png

問題なくアタッチされたことを確認します。

スクリーンショット 2020-02-19 0.57.21.png

テスト

Lambdaの画面でテストをします。

テストイベント設定でNode停止ルールを設定します。

スクリーンショット 2020-02-19 1.01.28.png

実際にテストしてみましょう。
成功となることが確認できます。

スクリーンショット 2020-02-19 1.03.21.png

AutoScalingGroupの画面でNode数が0になることが確認できます。

スクリーンショット 2020-02-19 1.06.10.png

おわりに

LambdaでEKS Worker Nodeに紐付くAutoscaling GroupのNode数を変更し夜間・休日に停止させる手順を説明しました。

本当に料金を抑えるなら下記3つの設定を全てコード化しておき毎日削除・作成を行うことが理想だと思います。

  • AWSリソース
  • Kubernetesリソース
  • アプリケーション

ただ、コード化する時間が取れない場合はとりあえず今回の手順に沿ってWorker Nodeだけ落とすだけでも料金は抑えられます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした