サイトアイコン 協栄情報ブログ

AWS LambdaとAWS EventBridgeを使用してEC2を自動停止・自動起動させてみた


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

経緯

AWS Lambdaのユースケースについて調査しておりまして、AWS Lambdaを使用して今回EC2の自動停止・自動起動の検証を行いAWS Lambdaについて深く知るためにブログに書こうと思いました。

 

目的

1.AWS Lambdaについての概要
2.AWS Lambdaを使用してEC2の自動停止・自動起動の検証

 

AWS Lambdaの概要

AWS Lambda は、サーバーをプロビジョニングまたは管理せずにコードを実行できるようにするコンピューティングサービスです。

 

クラウド上にプログラムを定義しておくことで、インターネットを通じてプログラムを実行できるサービスです。つまり、利用者側はプログラムコードを用意して、Lambdaに設定するだけでプログラムの実行が可能となります。

 

AWS Lambdaはどのように使われるのか

AWS Lambda単体ではLambda関数の実行はできません。Lambda関数を実行させるためには、他のサービスリソースで処理を起動させるきっかけとなるトリガーを設定する必要があります。

 

なお、Lambdaを実行するトリガーには大きく分けて2種類あります。

 

1.トリガーと同期して関数を起動するタイプです。
(代表的なサービス:Cognito、API Gatewayなど)
2.イベントが発生したことを検知して非同期で関数を実行するタイプです。
(代表的なサービス:Amazon S3、CloudWatch Logs、CloudWatch Eventsなど)

 

このようにAWS Lambdaは、なんらかのイベントが起きたら、あらかじめ設定していたプログラムの処理が実行される、というようなサービスです。つまり、AWSの他のサービスと組み合わせて利用する、といった使い方が典型的な使い方になります。

 

Lambdaが使用されるタイミング

 

 

参照リンク:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html

 

検証

それではAWS Lambdaを使用してEC2の自動停止・自動起動を検証します。
EC2での検証を行うため、起動しているEC2インスタンスがあることが前提条件になります。

 

Lambda用のIAMポリシーとIAMロールの作成

LambdaからEC2にアクセスするためのロールを作成します。そのためにEC2を起動・停止、Cloudwatchでログを確認するためのポリシーを作成します。

 

ポリシー作成

IAMのコンソール画面からポリシー→「ポリシー作成」を選択
Jsonタブをクリックし下記のポリシーを貼り付けます。

 

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}

 

上記のポリシーを貼り付けたら”次へ”
ポリシー名をyamagami-EC2startstop-PLにしました。
ポリシー作成を実行

 

 

ロールを作成

IAMのコンソール画面からロール→「ロール作成」を選択

設定項目 設定値
信頼されたエンティティ AWSサービス
ユースケース Lambda
ロール名 yamagami-EC2startstop-role

次へを選択

 

許可ポリシーで先ほど作成した、「yamagami-EC2startstop-role」ポリシーにチェックして、次へ。

 

ロール作成を実行します。
これでLambdaからEC2にアクセスするための、IAMロールが作成されました。

 

Lambda関数の作成

起動用と停止用の2つのLambda関数を作成します。

 

Lambdaコンソールに移動し、「関数の作成」を選択

関数名は「yamagami-EC2stop」とし、ランタイムは「Python3.9」を選択。
実行ロール「既存のロールを使用する」を選択し、先ほど作成した「yamagami-EC2startstop-role」を選択。

 

 

関数の作成を実行

 

コードソースに下記コードを貼り付け、「Deploy」を選択。
自分の使用しているリージョンとインスタンスIDを入力しました。

 

import boto3
region = 'リージョン'
instances = ['インスタンスID']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

 

停止できるかどうかテストしてみます。
「テスト」を選択
EC2インスタンスが停止しているかを確認する。

 

同じ方法で起動するためのLambda関数も作成します。
上記と同じ方法でPython3.9の関数を作成、関数名は「yamagami-EC2start」としました。

 

コードソースに下記コードを貼り付け、「Deploy」を選択。

import boto3
region = 'リージョン名'
instances = ['インスタンスID']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))

 

「テスト」を選択
EC2インスタンスが起動しているかを確認する。

 

作成した2つの関数は実行中に処理が中断しないようにタイムアウトを10秒にしておきます。
設定→一般設定→編集→タイムアウト10秒に設定

 

EventBridgeの設定

EC2の自動起動停止の時間を設定するためのスケジュールをEventBridgeで作成します。こちらも起動用と停止用で2つスケジュールを作成します。

 

EventBridgeのコンソール画面からスケジュールを選択し「スケジュール作成」を選択

 

設定項目 設定値
スケジュール名 yamagami-EC2stop
スケジュールパターン 定期的なスケジュール
スケジュールの種類 cron式
フレックスウィンドウ オフ

 

cron(0 15 * * ? *)
毎日15時にEC2が停止する時間に設定しました。

 

 

・ターゲットの選択
AWS Lambda Invoke にチェックを入れます。
作成したLambda関数(yamagami-EC2stop)を選択。

 

 

・設定

設定項目 定値
スケジュールの状態 有効化
イベントの最大経過時間 24
再試行回数 185
デッドレターキュー なし
アクセス許可 このスケジュールの新しいロールを作成

 

次へを選択し「スケジュールを作成」を選択

 

同じように起動するスケジュールも作成いたします。

 

スケジュール名は「yamagami-EC2start」にしました。
cron式は(10 15 * * ? *)にしました。
今回は検証ですので停止した10分後に起動する設定にしました。

 

検証結果

時間通りに停止・起動しているかを、設定した時間経過後にEC2のコンソール画面でチェックを行います。
停止、起動していれば成功です

 

CloudWatchに出力されたログを確認

CloudWatchに出力されたログも確認してみます。
作成したLambda関数の「モニタリング」→CloudWatchログを表示を選択
ログストリームの中に指定した時間のログができていることを確認して選択
Lambdaソースの中で出力している内容が確認できれば検証クリアです。

 

まとめ

今回はLambdaを使用してEC2の自動停止と自動起動を行いました。
実際にどのようにLambdaを使用し他のAWSサービスとどのように連携しているのか深く知ることができました。
今回はLambdaを使用しEC2を停止・起動行いましたが、Amazon EventBridge Schedulerだけでも自動停止・自動起動できるので、さまざまなユースケースがあります。利用目的に合ったアーキテクトを設計する必要があると思いました。
今後もAWS Lambdaをうまく活用していきたいです。

モバイルバージョンを終了