AWS Lambdaを使ってクラウドサービスはサーバレスで自動起動・停止する方法

2023年3月31日掲載

キービジュアル

はじめに

クラウドサービスは非常に便利です。Webブラウザにてクラウドサービスのコンソールからボタンを数回クリックするだけで、仮想コンピューティングを立ち上げたり、停止したりすることができます。

一方で、仮想コンピューティングは使い続けるけど、例えば深夜や、土日とか使ってない時間帯は課金したくないですよね?その場合はコンソールから手動操作で仮想コンピューティングを停止することができます。しかし、この作業もサービス起動&停止の都度WebブラウザでGUI操作をするため手間がかかります。サブスクリプションもしくはリザーブドインスタンスを購入すればいい、という解決策もありますが、仮想コンピューティングでないプロダクトサービス、例えばRDSやRedshiftなど、プロダクトサービスによってはこまめにサービス起動&停止しながら利用したほうが、サブスクリプションもしくはリザーブドインスタンスを購入するより安く済む場合もあります。

そんなユーザー向けに、本記事は、AWSのLambdaとPythonを使って、簡単にEC2インスタンスを一定時刻に自動起動&自動停止する方法をご紹介します。

これを応用すれば、RDSやRedshiftに対し一定時刻に起動&停止することや、Slackから入力することで仮想コンピューティングを自動起動&停止、CPU使用率の変動推移が1時間以上0%であれば仮想コンピューティングを自動停止、NWトラフィックが高くなったら仮想コンピューティングを自動起動、DBが障害になったらDBを素早くフェイルオーバー、などサーバレスによる様々な自動起動・停止処理を行うことができます。

目次

  • この記事ではAWS EC2インスタンスの自動起動・停止する方法を紹介します。
  • ある程度Lambda関数とPythonの知識がある事を前提に書いています。
  • EC2インスタンスの開始・停止自動化により、手動で設定する手間が省けます。

1. 全体像

AWS Lambdaを使った、EC2インスタンスの自動起動・停止方法の流れおよび全体像は次の図の通りになります。

img-asw-lambda-auto-restart-blog-20230331-001.png

2. IAM設定とEC2インスタンスの準備

Lambdaを使ってEC2インスタンスの自動起動・停止を実現するにあたって、事前準備としてIAM PolicyとRoleを設定します。IAM PolicyはLambdaが指定時刻にEC2インスタンスを起動&停止するための操作権限、RoleはLambdaの対象サービスがその操作を許可するための権限です。

2.1  AWSコンソール画面のIAM画面にて、IAM PolicyとRoleを作成します。

   2.1.1  IAM Policyの作成

img-asw-lambda-auto-restart-blog-20230331-002.png
img-asw-lambda-auto-restart-blog-20230331-003.png
img-asw-lambda-auto-restart-blog-20230331-004.png
img-asw-lambda-auto-restart-blog-20230331-005.png

以下は設定するポリシーのサンプル例です。

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

2.1.2  IAMのRoleを作成します

img-asw-lambda-auto-restart-blog-20230331-006.png
img-asw-lambda-auto-restart-blog-20230331-007.png
img-asw-lambda-auto-restart-blog-20230331-008.png
img-asw-lambda-auto-restart-blog-20230331-009.png

2.1.3  EC2インスタンス2台を作成します。

img-asw-lambda-auto-restart-blog-20230331-010.png

2.2  Labelを付けます

    Key: ohara-lambda Value:start&stop

img-asw-lambda-auto-restart-blog-20230331-011.png

3. Lambda関数作成

以下はEC2インスタンスの開始と停止するそれぞれのLambda関数を作成します。作成する際に、Pythonのバージョンと作成されたRoleを選択します。

3.1  StartEC2関数を作成する

img-asw-lambda-auto-restart-blog-20230331-012.png
img-asw-lambda-auto-restart-blog-20230331-013.png

3.2. StopEC2関数を作成する

img-asw-lambda-auto-restart-blog-20230331-014.png
img-asw-lambda-auto-restart-blog-20230331-015.png

4. コードの編集

上記作成された関数の中身は空なので、関数を編集して、リージョン情報など必要なパラメータを追加する必要があります。

4.1  StartEC2関数コードを編集する

img-asw-lambda-auto-restart-blog-20230331-016.png

以下はEC2インスタンスを開始するサンプルコードです。

lambda_function.py
import json
import boto3
def lambda_handler(event, context):
    region = "ap-northeast-1"
    client = boto3.client('ec2', region)
    responce = client.describe_instances(Filters=[{'Name': 'tag:ohara-lambda', "Values": ['start&stop']}])
    target_instans_ids = []
    for reservation in responce['Reservations']:
        for instance in reservation['Instances']:
            target_instans_ids.append(instance['InstanceId'])
    print(target_instans_ids)
    client.start_instances(InstanceIds=target_instans_ids)
    print('EC2 instances are started .')
    return {
        "statusCode": 200,
        "message": 'Finished start EC2 instances process.'
    }

4.2  StopEC2関数コードを編集する

img-asw-lambda-auto-restart-blog-20230331-017.png

以下はEC2インスタンスを停止するサンプルコードです。

lambda_function.py
import json
import boto3


def lambda_handler(event, context):
    region = "ap-northeast-1"
    client = boto3.client('ec2', region)
    responce = client.describe_instances(Filters=[{'Name': 'tag:ohara-lambda', "Values": ['start&stop']}])

    target_instans_ids = []
    for reservation in responce['Reservations']:
        for instance in reservation['Instances']:
            target_instans_ids.append(instance['InstanceId'])

    print(target_instans_ids)

    client.stop_instances(InstanceIds=target_instans_ids)
    print('EC2 instances are stopped.')
    return {
        "statusCode": 200,
        "message": 'Finished stop EC2 instances process.'
    }

5. コード手動実行

まずは上記作成された関数が上手く動作するかを検証するため、関数コードを手動で実行します。

5.1.1  StartEC2関数を実行前、EC2のステータスを確認します

img-asw-lambda-auto-restart-blog-20230331-018.png

5.1.2  StartEC2関数:デフォルトの設定でEventを設定

img-asw-lambda-auto-restart-blog-20230331-019.png

5.1.3  StartEC2関数を実行する

img-asw-lambda-auto-restart-blog-20230331-020.png
img-asw-lambda-auto-restart-blog-20230331-021.png

5.1.4  StartEC2関数を実行後、EC2のステータスを確認します

img-asw-lambda-auto-restart-blog-20230331-022.png
img-asw-lambda-auto-restart-blog-20230331-023.png

5.2.1  StopEC2関数:デフォルトの設定でEventを設定

img-asw-lambda-auto-restart-blog-20230331-024.png

5.2.2  StopEC2関数を実行する

img-asw-lambda-auto-restart-blog-20230331-025.png
img-asw-lambda-auto-restart-blog-20230331-026.png

5.2.3  StopEC2関数を実行後、EC2のステータスを確認します

img-asw-lambda-auto-restart-blog-20230331-027.png

6. CloudWatch Eventsで関数実行

以降は、EC2インスタンスが自動的に実行できるように、CloudWatch Eventを設定し、上記作成された関数を定期的に実行します。

6.1.1 CloudWatch Eventsを設定します

img-asw-lambda-auto-restart-blog-20230331-028.png
img-asw-lambda-auto-restart-blog-20230331-029.png
img-asw-lambda-auto-restart-blog-20230331-030.png

6.1.2  CloudWatch Eventsルールを設定します

LambdaはUTC協定時間を採用しています。

UTC日本時間とUTC協定時間では+9時間の時差があります。

eg: 25 11 * * ? *

img-asw-lambda-auto-restart-blog-20230331-031.png
img-asw-lambda-auto-restart-blog-20230331-032.png
img-asw-lambda-auto-restart-blog-20230331-033.png

6.1.3  CloudWatch Eventsで関数を実行後、ステータスを確認します

img-asw-lambda-auto-restart-blog-20230331-034.png

6.2.1  CloudWatch Eventsルールを設定します

eg: 35 11 * * ? *

img-asw-lambda-auto-restart-blog-20230331-035.png
img-asw-lambda-auto-restart-blog-20230331-036.png
img-asw-lambda-auto-restart-blog-20230331-037.png

6.2.2   CloudWatch Eventsで関数を実行後、ステータスを確認します

img-asw-lambda-auto-restart-blog-20230331-038.png
img-asw-lambda-auto-restart-blog-20230331-039.png

7. CloudWatch Events設定例

以降は具体的なシナリオでCloudWatch Eventsの設定例を紹介します。

7.1.1   CloudWatch EventsでStartEC2設定例

•AM 9:00に対象タグ(start&stop)がついているEC2インスタンスが自動起動

•毎週月‐金の朝9時に実行させたい場合、UTC協定時間の0時に設定する

•Cron表記: 0 0 ? * MON-FRI *

※Lambdaは、UTC協定時間を採用しています。 UTC日本時間とUTC協定時間では+9時間の時差があります。

img-asw-lambda-auto-restart-blog-20230331-040.png
img-asw-lambda-auto-restart-blog-20230331-041.png
img-asw-lambda-auto-restart-blog-20230331-042.png

7.1.2   CloudWatch EventsでStopEC2設定例

•毎週月‐金の夜9時に実行させたい場合、UTC協定時間の12時に設定する

•Cron表記: 0 12 ? * MON-FRI *

img-asw-lambda-auto-restart-blog-20230331-043.png
img-asw-lambda-auto-restart-blog-20230331-044.png
img-asw-lambda-auto-restart-blog-20230331-045.png

7. さいごに

AWSのLambdaはUTC協定時間を採用しています。日本時間と+9時間の時差があることに注意する必要があります。

また、Lambda関数でPythonスクリプトを書くため、ある程度のPython知識が必要です。

本記事は、AWSのLambdaとPythonを使って、簡単にEC2インスタンスを一定時刻に自動起動&自動停止する方法をご紹介させて頂きました。興味を持っている方はお試し下さい。

関連サービス

Amazon Web Services (AWS)

ソフトバンクはAWS アドバンストティアサービスパートナーです。「はじめてのAWS導入」から大規模なサービス基盤や基幹システムの構築まで、お客さまのご要望にあわせて最適なAWS環境の導入を支援します。

MSPサービス

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

条件に該当するページがございません