LoginSignup
0
1

More than 3 years have passed since last update.

EC2のプロセス監視と自動再起動

Posted at

EC2で稼働しているプロセスがダウンした時に、自動起動する仕組みを作っていきたいと思います
今回は、dockerプロセスがダウンした場合を例とします

前提条件

  • Amazon Linux2
  • amazon-ssm-agentインストール済み
  • cloudwatch-agentインストール済み
  • dockerインストール済み
  • EC2のIAMロールにAmazonSSMFullAccessのポリシーがアタッチ済み

プロセスの監視を設定します

Systems Manager パラメータストアの設定

CloudWatchのメトリクスに入れるための定義を作成します
AWSマネジメントコンソールからSystem Manager、パラメータストアをたどり、「パラメータを作成」を実行します
タイプはString、データ型はtextで、以下を値に設定します

{
    "metrics": {
        "append_dimensions": {
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "procstat": [
                {
                    "exe": "docker",
                    "measurement": [
                        "pid_count"
                    ],
                    "metrics_collection_interval": 60
                }
            ]
        }
    }
}

Systems Manager Run Commandを実行

EC2のCloudwatchAgentに反映します
AWSマネジメントコンソールからSystem Manager、Run Commandをたどります
コマンドドキュメントに、AmazonCloudWatch-ManageAgent を選択します
Actionは、Configure(Append)を選択します
Optional Configuration Locationに、先ほど作成した パラメータストアの名前 を入力します
実行して、反映を待ちます

Cloudwatchでアラームを作成

数分して、AWSマネジメントコンソールからCloudwatch、アラームをたどり、アラームの作成を実行すると、カスタムメトリクスが表示されると思います

image.png

image.png

プロセスの再起動(自動起動)の実装を設定します

lambdaを作成します

  • プロセス監視のアラートをトリガーに、SSMに再起動コマンドを送るlamdbaを作ります
  • AWSマネジメントコンソールからLambdaをたどり、関数の作成を行います
  • python2.7で作ります
  • lambda作成と同時に作ったRoleを開いて、「AmazonSSMFullAccess」のポリシーを付与しておきます
lambda_function.py
import boto3
import logging
import json

logger = logging.getLogger()
logger.setLevel(logging.INFO)

ssm = boto3.client('ssm')

def lambda_handler(event, context):

    try:
        message = json.loads(event['Records'][0]['Sns']['Message'])
        # instanceIdが入るDimensionsの配列番号を一度ログに出して確認 以下は[1]にinstanceidが入る場合
        # logger.info(message)
        instanceId = message['Trigger']['Dimensions'][1]['value']
        logger.info(instanceId)
        command = "実行するコマンド" # sudo service docker.service start && sudo docker run xxxxx
        ssm.send_command(
            InstanceIds = [
                instanceId
            ],
            DocumentName = "AWS-RunShellScript",
            Parameters = {
                "commands": [
                    command
                ],
                "executionTimeout": ["600"]
            },
        )
        logger.info("send_command")
    except Exception as e:
        logger.error(e)
  • lambdaのトリガーは、Cloudwatchアラームで指定した、SNSトピックを指定します

image.png

これで、以下のようにdockerを落としてみて、ちゃんと上がって来ればOKです

sudo service docker.service stop
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1