【AWS初心者向け】LambdaでEC2インスタンスの自動起動/停止を設定する手順


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

どうも、クラ本部の黒田です。
あっという間に三連休が終わりましたね。
今回はLambdaを使用して、指定したEC2インスタンスの自動的な起動と停止を行う方法についてご紹介します。この設定を行うことで、定期的なスケジュールに従って特定なEC2インスタンスを操作できます。それでは、構築手順を見ていきましょう。

■ はじめに

AWS Lambdaを利用してEC2インスタンスの自動起動と停止を設定することは、運用効率の向上やコスト削減など、さまざまなメリットをもたらします。以下にその主な利点をご紹介します。

  1. コスト最適化
    EC2インスタンスは実行中の時間に対して課金されます。Lambdaを使用して自動的にEC2インスタンスを停止することで、必要な時間だけインスタンスを実行し、無駄なコストを削減できます。例えば、夜間や休日など、利用されていない時間帯にインスタンスを停止することで、コストを最適化することができます。

  2. 作業効率の向上
    従来は手動でEC2インスタンスの起動や停止を行う必要がありましたが、Lambdaを使用することでこれらの操作を自動化できます。定期的なスケジュールに従ってインスタンスを起動/停止させるため、運用作業の手間が軽減され、作業効率が向上します。

  3. リソースの最適利用
    EC2インスタンスが必要なときだけ起動されるため、リソースの最適利用が可能です。一時的な処理やバッチ処理など、特定の時間帯にのみインスタンスが必要な場合でも、自動化された運用によって無駄なリソース使用を避けることができます。

  4. 24/7可用性の確保
    Lambda関数を使用して自動起動/停止を設定することで、必要なタイミングでインスタンスを自動的に起動することができます。これにより、24時間365日の可用性を確保しつつ、必要なときだけリソースを使用できるようになります。

  5. 人為的ミスの削減
    手動での起動や停止操作では、人為的ミスが発生する可能性があります。Lambdaを使用した自動化により、定期的な運用作業が自動化されるため、ヒューマンエラーを減少させることができます。

これらのメリットを享受するために、Lambdaを使用してEC2インスタンスの自動起動/停止を設定することを検討してみてください。運用の効率化とコスト削減に貢献する手法として、Lambdaの活用は非常に有益です。

■ 構成図

file


■ 実装概要

  • 1.必要なポリシー、IAMロールの作成
  • 2.Lambda関数の作成
  • 3.トリガー設定
  • 4.実行成功後通知設定
  • 5.動作確認

■ 前提条件

  • VPC上にEC2インスタンスが作成されていること

■ 実装手順

1. IAMロールの作成

最初に、Lambda関数がEC2インスタンスを操作するための適切な権限を持つIAMロールを作成します。

  • ロール名: Auto_EC2-Role
  • ポリシー名: Auto_EC2-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": "*"
             }
         ]
     }
    • このIAMポリシーは、特定のアカウント内の特定のEC2インスタンスに対して、
    • CloudWatch Logsへのログ書き込みとEC2インスタンスの制御(起動、停止、インスタンス情報の取得)を許可するためのものです。
    • logs:CreateLogGroup、logs:CreateLogStream、logs:PutLogEventsのアクションに関するステートメントは、CloudWatch Logsへのアクセスを許可します。
    • これにより、Lambda関数がロググループを作成し、ログイベントを書き込むことができます。
    • ec2:Start、ec2:Stop、ec2:DescribeInstancesのアクションに関するステートメントは、特定のEC2インスタンスの起動、停止、およびインスタンス情報の取得を許可します。
    • ec2:Start*は、すべての起動アクションを対象としますが、具体的に指定することもできます。
    • ポリシーのResourceフィールドには、許可する対象のリソースのARNが指定されています。ただし、リソースの指定が具体的なインスタンスIDになっているため、このポリシーは特定のEC2インスタンスに対して操作を許可するものです。


2. Lambda関数の作成

  • 関数名: Auto_EC2_Instances
  • ランタイム: Python
  • ロール: 先ほど作成したIAMロール Auto_EC2-Role

関数コードは以下の通りで必要な部分修正する上、貼り付けてご利用ください。

   import boto3

   def lambda_handler(event, context):
       # EC2クライアントの初期化
       ec2 = boto3.client('ec2', region_name='ap-northeast-1')

       # 起動または停止するインスタンスIDを指定
       instance_id = 'EC2_instance_id'

       # インスタンスの現在の状態を取得
       response = ec2.describe_instances(InstanceIds=[instance_id])
       instance_state = response['Reservations'][0]['Instances'][0]['State']['Name']

       if instance_state == 'running':
           # インスタンスが起動中の場合は停止させる
           ec2.stop_instances(InstanceIds=[instance_id])
       elif instance_state == 'stopped':
           # インスタンスが停止中の場合は起動させる
           ec2.start_instances(InstanceIds=[instance_id])

※「Deploy」を押さないと、適用されないので、ご注意!

  • Lambda関数は、指定したEC2インスタンスの状態を確認し、その状態に応じてインスタンスを起動または停止します。具体的には、次の手順を行います。

  • boto3 ライブラリを使用して、EC2クライアントを初期化します。このクライアントはEC2リソースへのアクセスを提供します。

  • 操作対象のEC2インスタンスのID(instance_id)を指定します。操作したいインスタンスのIDに置き換える必要があります。

  • describe_instances メソッドを使用して、指定したインスタンスの情報を取得します。この情報にはインスタンスの現在の状態も含まれます。

  • 取得したインスタンスの状態を確認し、その状態に応じて stop_instances または start_instances メソッドを使用してインスタンスの起動または停止を行います。

  • この関数をLambda関数としてデプロイすると、指定したEC2インスタンスの状態に合わせて自動的に起動・停止が行われるようになります。必要に応じて、インスタンスIDなどの詳細を適切に置き換えてください。


3. トリガーの設定

  • トリガータイプ: CloudWatch Eventsルール


  • スケジュール式: 例えば、毎日午前9時に起動する場合は cron(0 9 * * ? *) と入力

    ※動作確認のため、現時点の時間を設定してあります。

4. 正常に実行された場合の通知設定

  • Lambda送信先にSNSトピックを指定


これで設定が完了しました!Lambda関数が指定したCloudWatch Eventsルールに従ってEC2インスタンスを自動的に起動/停止します。

■ 動作確認

設定が正しく行われているか、トリガーが機能しているかを確認しましょう。

・ スケジュールされた時間に正常に実行された通知メールを受信


・CloudWatch ロググループより、実行Logが出力されていることを確認

/aws/lambda/Auto_EC2_Instances

■ 最後に

以上がLambdaを使用してEC2インスタンスの自動起動/停止を設定する手順です。設定が完了したら、自動的な運用効率の向上を実感できることでしょう。※ 作成したリソースの削除を忘れずに!!!

この手順に従ってLambdaを利用すれば、EC2インスタンスの管理がより簡単になります。ぜひお試しください!

では、皆さん、また次回お会いしましょう。

以下はクラ本部メンバー記事のご紹介です。

↑↑↑クラ本部メンバーが書いた記事のご紹介 ↑↑↑、合わせてやってみるのもいいかと

Last modified: 2023-08-13

Author