AWS Lambdaでコスト削減してみる!

REPORT
2023.07.27

はじめに

ソリューション開発部2に所属している上間と申します!

主な業務内容としてはグーネット沖縄・グーバイク沖縄・グーホーム・グーホーム賃貸のPLで、サイトの運用と開発を行っています。

営業の方からAWSの費用を少しでも抑えられないかと依頼があったため、そちらの紹介をしたいと思います。

やること

指定の時間になったらAWS Lambdaで複数のEC2サーバーを起動・停止させます。

以下がざっくりとした概要になります。

1. IAMポリシー・ロールの作成

2. Lambda関数の作成・実装・テスト

3. Amazon EventBridgeで Lambdaを実行する時間を指定

1.IAMポリシー・ロールの作成

まずはIAMのポリシーを作成しましょう!

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": "*"
        }
    ]
}

「次へ」を押下し、ポリシー名を入力して「ポリシーの作成」で作成完了です。

本記事では例として「ServerStartStop」をポリシー名とします。

作成したポリシーをロールにアタッチします。

IAMのコンソールから、「ロール」を選択し、「ロールを作成」を押下します。

信頼されたエンティティタイプは「AWSのサービス」、ユースケースは「Lambda」を選択し、「次へ」を押下します。

許可ポリシーは先ほど作成したポリシーを検索し、選択後に「次へ」を押下します。

ポリシーと同様にロール名と説明に何をするロールなのかを分かるように記述をして「ロールを作成」で作成完了です。

2.Lambda関数の作成・実装・テスト

Lambdaのコンソールを開き、「関数」を選択します。

次に「関数の作成」を押下し、「一から作成」を選択します。

関数名の入力と実行ロールを「既存のロールを使用する」にします。

作成したロールを選択後に「関数の作成」で作成完了です。

作成した関数の実装になります。

「コード」タブのlambda_function.pyに以下を記述します。

「region」には起動・停止したいEC2サーバーのリージョンを記述し、「instances」にはインスタンスIDを指定してください。

「Deploy」を押下し、コードを保存します。

※ 後ほどのテストで実際に起動・停止を行うので、開発など停止していいインスタンスを指定してください。


import boto3
import os
region = 'ap-northeast-1'
instances = ["i-xxxxxxxxxxxxxxx","i-xxxxxxxxxxxxxxx"]

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    action = event["Action"]

    if action == "Start":
        ec2.start_instances(InstanceIds=instances)
        print('started instance')
    elif action == "Stop":
        ec2.stop_instances(InstanceIds=instances)
        print('stopped instance')
    else:
        print('Lamdba function could not be executed.')

Lambdaの設定は完了となりますが、実際にテストをして起動・停止できるか試してみましょう!

「テスト」タブにて、イベントアクションを「新しいイベントを作成」にします。

イベント名を設定し、イベントJSONには以下コードを記述します。

【インスタンスを起動する場合】


{
  "Action": "Start"
}

【インスタンスを停止する場合】


{
  "Action": "Stop"
}

「保存」でテストイベントを保存し、「テスト」を押下すると実行されます。

EC2のコンソールから対象のインスタンスを確認して、起動 or 停止していれば成功となります!

3.Amazon EventBridgeで Lambdaを実行する時間を指定

EventBridge のコンソールを開き、「ルール」を選択します。

次に「ルールを作成」を押下します。

まずはサーバー起動のルールを作成しましょう!

名前を入力し、ルールタイプは「スケジュール」を選択します。

問題なければ「続行してルールを作成する」を押下します。

起動したい時間に設定します。私は朝の9時にしたいので、「cron(0 0 ? * * *)」で設定します。

時間はUTCなので、時差を考慮してください。

設定したら「次へ」を押下します。

ターゲットタイプは「AWSのサービス」を選択します。

ターゲットを選択では、「Lambda関数」と作成した関数名を設定し、「次へ」を押下します。

タグについては今回は設定せず、「次へ」を押下します。

確認画面になりますので、問題なければ「ルールを作成」を押下します。

これでサーバー起動の設定は完了です。

停止のルールも同じように作成すれば全ての設定は完了となります!

これで時間通りに自動でサーバーの起動・停止できるようになりました!

最後に

私は9時に起動・18時に停止の設定をしました。

その結果、24時間起動だったサーバーが9時間の起動になりましたのでかなりコストの削減になりました!

関数を複製し、他のサーバーに適用するともっと削減できるかと思いますので試してみてくださいー!!

参考

EC2インスタンス起動/停止をLambdaで自動化してみた

一つのLambdaで複数のEC2 インスタンスを起動・停止を行う

プロジェクトマネージャー

プロジェクトマネージャー

沖縄本社では、一緒に働くITエンジニアを募集しています

AIエンジニア、システムエンジニア、その他多数募集中!

ページトップへ戻る