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

この記事は約3分で読めます

こんにちは、 @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の権限を追加) ※公式サイトを参考に作成してください
REFERENCESession Manager のカスタム IAM ロールを作成 - AWS Systems Managerdocs.aws.amazon.com
  • EC2内のSSMエージェントを追加・更新
    ※Amazon Linux2はデフォルトで入っている様子

Lambda関数の作成

Lambdaのコンソールから、関数の作成を選択します。 以下の値を設定して関数を作成します。

Note

  • 関数名: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でスケージュールを決めて定期的に実行させることも可能です。

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