こんにちは、@Manabu です。
LambdaでEC2内のコマンドを実行させたい!
今回は、このような発想からAWS LambdaでEC2内のApacheを再起動する対応について記載しています。
この記事は、以下のような方におすすめです。
ぜひ参考にしてください。
はじめに
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の権限を追加)
※公式サイトを参考に作成してください
・EC2内のSSMエージェントを追加・更新
※Amazon Linux2はデフォルトで入っている様子
Lambda関数の作成
Lambdaのコンソールから、関数の作成を選択します。
以下の値を設定して関数を作成します。
コードをデプロイ
コードソースに表示されているソースを以下に変更して、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でスケージュールを決めて定期的に実行させることも可能です。
色々な使い方が考えられるので、また良い使い方があれば紹介したいと思います。