LoginSignup
0
0

InstanceRestarter(インスタンスをリスタートするやーつー)

Posted at

概要

必要にかられて、こんなものを作ったのでメモがてら。

  1. EventBridgeから定期的に
  2. Lambdaを起動して
    1. 指定された名前に合致するインスタンスに対して
    2. reboot(またはterminate)のリクエストを出す

作成手順

IAM

  1. ロールを作成
    1. 信頼されたエンティティを選択
      1. 信頼されたエンティティタイプ → AWSのサービス
      2. ユースケース → Lambda
    2. 許可を追加
      1. 許可ポリシー
        1. (何もしなくてOK)
      2. 許可の境界を設定
        1. 許可の境界なしでロールを作成(デフォルト)
    3. 名前、確認、および作成
      1. ロールの詳細
        1. ロール名 → それなりの名前(InstanceRestarter-role等)
        2. 説明 → お好きに
  2. 作成したロールを選択
  3. 許可タブ内から許可を追加 → インラインポリシーを作成を選択
    1. アクセス許可を指定
      1. ポリシーエディタでJSONを選択してIAM.jsonの内容を貼り付ける
        • rebootではなくterminateをする場合には貼り付け後に、JSON内のec2:RebootInstancesec2:TerminateInstancesに書き換える
      2. JSON内のXXXXXXXXXXXXをAWSのアカウントIDに書き換える
    2. 確認して作成
      1. ポリシーの詳細
        1. ポリシー名 → それなりの名前(InstanceRestarter-role-policy等)

Lambda

  1. 関数の作成ボタン
    1. 基本的な情報
      1. 関数名 → それなりの名前(InstanceRestarter-lambda等)
      2. ランタイム → Ruby(最新のサポート対象のものでOK)
      3. アーキテクチャ → x86_64
      4. アクセス権限 → デフォルトの実行ロールの変更 → 既存のロールを使用する
      5. 既存のロール → 先ほど作成したIAMを選択
    2. 詳細設定 → すべて未チェック(デフォルト)のまま
  2. コードタブ
    1. lambda_function.rbをダブルクリックで開き、lambda_function.rbの内容を貼り付け、Deployボタン
      • rebootではなくterminateをする場合には貼り付け後に、ソース内のec2_client.reboot_instancesec2_client.terminate_instancesに書き換え、Deployボタン
  3. 設定タブ
    1. 一般設定
      1. タイムアウトを必要に応じて変更する
        • 30秒とか
    2. 環境変数
      1. キーINSTANCE_NAMESを追加し、値として対象としたいEC2インスタンスの名前を空白区切りで列挙する

EventBridge

  1. 左メニューバス>ルール内のルールを作成ボタン
    1. ルールの詳細
      1. 名前 → それなりの名前(InstanceRestarter-schedule-rule等)
      2. 説明 → お好きに
      3. イベントバス → お好きに
      4. 選択したイベントバスでルールを有効にする → ON
      5. ルールタイプ → スケジュール
      6. :bangbang:メインのボタンEventBridge Scheduler で続行ではなく続行してルールを作成するボタンで次の項目へ:bangbang:
    2. スケジュールを定義
      1. スケジュールパターン → お好きに
        • 毎日3時に定期実行であればcron(0 18 * * ? *)
        • 毎日5時に定期実行であればcron(0 20 * * ? *)
    3. ターゲットを選択
      1. ターゲットタイプ → AWSのサービス
      2. ターゲットを選択 → Lambda関数
      3. 関数 → 先ほど作成したLambdaを選択
    4. バージョン/エイリアスを設定
      • デフォルト
    5. 追加設定
      • すべてデフォルトのまま

ログ

(Lambdaが実行された後に)CloudWatch Logsのロググループ/aws/lambda/{Lambda関数名}に出力される。
必要に応じてロググループの保持期間を設定する。
内容としては以下の通り

  • 指定された名前のインスタンスが見つからないとき
    • #{name}: not found.
  • 指定された名前のインスタンスに対しリスタート要求を出したとき
    • #{name}: restart #{instance_id}
    • 同じ名前で複数のインスタンスがあれば複数行出力される

ソース一覧

IAM.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances"
            ],
            "Resource": [
                "arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:instance/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*"
            ]
        }
    ]
}

lambda_function.rb

require 'aws-sdk-ec2'
require 'json'

def lambda_handler(event:, context:)
  instance_names = ENV['INSTANCE_NAMES'].split
  
  ec2_client = Aws::EC2::Client.new()
  
  instance_names.each do |name|
    describe_instances = ec2_client.describe_instances({
      filters: [
        {
          name: 'tag-key',
          values: ['Name'],
        },
        {
          name: 'tag-value',
          values: [name],
        },
      ]
    })
    
    if describe_instances.reservations.empty? then
      puts "#{name}: not found."
      next
    end
    
    describe_instances.reservations[0].instances.each do |item|
      puts "#{name}: restart #{item.instance_id}"
      ec2_client.reboot_instances({
        instance_ids: [
          item.instance_id,
        ],
      })
    end
  end
  
  { statusCode: 200, body: 'finish.' }
end
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0