AWS Lambdaを活用してEC2上のApacheを再起動してみた!

AWS
この記事は約4分で読めます。

こんにちは、@Manabu です。

Manabu
Manabu

LambdaでEC2内のコマンドを実行させたい!

今回は、このような発想からAWS LambdaでEC2内のApacheを再起動する対応について記載しています。

この記事は、以下のような方におすすめです。

・AWS Lambdaを使ってみたい
・LambdaでEC2の処理を実行したい

ぜひ参考にしてください。

はじめに

EC2内でApacheを使用したWebサービスを公開していることを前提としています。

以下のAWSのサービスを利用します。

・EC2
・IAM(ロール)
・Lambda

対応手順

以下、手順を記載していきます。

Lambda関数用のIAMロールを作成

AWSのマネジメントコンソールよりログインし、IAMのコンソールからロールを作成します。
詳細な手順は省略します。

許可するポリシーは以下です。

・AmazonEC2ReadOnlyAccess
・AmazonSSMFullAccess

EC2にSSMでアクセスできるか確認

Lambda関数は、AWSのSSM(Systems Manager)を使用してEC2でのコマンド実行を実現しようとしているので、使用できるか確認する必要があります。

SSMのセッションマネージャーのコンソールから、実行させたいインスタンスが確認できれば接続可能です。

接続できない場合、以下の対応は必要です。

・EC2にIAMロールを付与(SSMの権限を追加)
※公式サイトを参考に作成してください

Session Manager のカスタム IAM ロールを作成 - AWS Systems Manager
インスタンス上の Session Manager アクションに対してのみ許可を付与するカスタム IAM ロールを作成します。

・EC2内のSSMエージェントを追加・更新
※Amazon Linux2はデフォルトで入っている様子

Lambda関数の作成

Lambdaのコンソールから、関数の作成を選択します。

以下の値を設定して関数を作成します。

・関数名:testRestartApacheOnEC2(自由に入力してください)
・ランタイム:Python 3.12
・アーキテクチャ:x86_64
・実行ロール:LambdaEC2ExecRole(上記で作成したIAMロールを選択)

コードをデプロイ

コードソースに表示されているソースを以下に変更して、Deployを実行します。
※EC2のインスタンスIDを入力する箇所がありますので、ご自身の指定のEC2の情報を入力してください。

import boto3
import json

def lambda_handler(event, context):
# EC2 インスタンスIDを指定
instance_id = 'あなたのEC2インスタンスIDをここに置く'

# SSM クライアントの初期化
ssm_client = boto3.client('ssm')

try:
  # SSM を使用して EC2 インスタンス上で Apache 再起動コマンドを実行
  response = ssm_client.send_command(
    InstanceIds=[instance_id],
    DocumentName='AWS-RunShellScript',
    Parameters={
      'commands': [
        'sudo systemctl restart httpd' # Apache を再起動するコマンド
      ]
    },
  )

  # コマンドの送信結果をログに記録
  print("Command sent to instance: ", response)

  return {
    'statusCode': 200,
    'body': json.dumps('Apache restart command sent successfully.')
  }
except Exception as e:
  # エラーが発生した場合は、エラーメッセージをログに記録
  print(e)

  return {
  'statusCode': 500,
  'body': json.dumps('Error sending Apache restart command.')
}

テスト

テストタブからテストを実行します。

実行結果として、ステータス200が返ってくると正しくApacheの再起動が実行されています。

最後に

今回は、EC2の中にあるApacheを再起動させる処理をLambdaで実装しました。

これを参考にすれば、Laravelのカスタムコマンドを実行したり、今回のように再起動したり自由に使えそうですね。

また、EventBridgeでスケージュールを決めて定期的に実行させることも可能です。

色々な使い方が考えられるので、また良い使い方があれば紹介したいと思います。