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、アラームをたどり、アラームの作成を実行すると、カスタムメトリクスが表示されると思います
プロセスの再起動(自動起動)の実装を設定します
lambdaを作成します
- プロセス監視のアラートをトリガーに、SSMに再起動コマンドを送るlamdbaを作ります
- AWSマネジメントコンソールからLambdaをたどり、関数の作成を行います
- python2.7で作ります
- lambda作成と同時に作ったRoleを開いて、「AmazonSSMFullAccess」のポリシーを付与しておきます
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トピックを指定します
これで、以下のようにdockerを落としてみて、ちゃんと上がって来ればOKです
sudo service docker.service stop