ENGINEERING ARTICLE
AWS Lambdaを活用してEC2上のApacheを再起動してみた!
この記事は約3分で読めます
こんにちは、 @Manabu です。
ManabuLambdaで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でスケージュールを決めて定期的に実行させることも可能です。
色々な使い方が考えられるので、また良い使い方があれば紹介したいと思います。