一、背景
AWS上的服务如rds,redis等不定期会有服务更新操作,这种操作有些是强制的,不自己更新,到期后aws会自动更新,可能会影响业务,那么需要怎么看呢
二、查看
控制台-对应服务-服务更新-查看
官网相关:https://aws.amazon.com/cn/elasticache/elasticache-maintenance/?nc1=h_ls
更新影响:https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/red-ug/CacheNodes.NodeReplacement.html#ReplaceShardNode
三、脚本检测
有些服务更新可能自己忘了,所以需要用脚本检测下
import os
import json
import sys
sys.path.append('/data/python_project/test')
import logger
from logger import Logger
log_new = Logger("aws_update_service").get_log()
def get_update(profile_name):
get_need_update_str = '/usr/local/bin/aws elasticache describe-service-updates --profile %s --output=json --service-update-status=available --query \'ServiceUpdates[?AutoUpdateAfterRecommendedApplyByDate==`true`].ServiceUpdateName\'' % profile_name
service_need_update_all = os.popen(get_need_update_str)
service_need_update_all = json.loads(service_need_update_all.read())
get_service_update_str = '/usr/local/bin/aws elasticache describe-update-actions --profile %s --output=json --query \'UpdateActions[?UpdateActionStatus==`not-applied`].{"ReplicationGroupId":ReplicationGroupId,"ServiceUpdateName":ServiceUpdateName}\'' % profile_name
service_update_all = os.popen(get_service_update_str)
service_update_all = json.loads(service_update_all.read())
for service_update in service_update_all:
if service_update["ServiceUpdateName"] in service_need_update_all:
result_all.append(service_update)
result_all = []
profile_all = ["config1", "config2"]
for profile_name in profile_all:
try:
get_update(profile_name)
except Exception as e:
log_new.error(e)
logger.send_email('获取更新服务失败,错误: %s' % e)
if len(result_all) == 0:
log_new.info('没有需要更新的服务')
else:
result_info = "\n".join([str(i) for i in result_all])
log_new.info('需要更新的信息为%s' % result_info)
logger.send_email(result_info, 'Redis服务更新')
logger.py
import time
import datetime
import os,sys
import logging
import json
import smtplib
from email.header import Header
from email.mime.text import MIMEText
log_path = '/data/python_project/logs/'
class Logger:
def __init__(self, loggername):
# 创建一个logger
self.logger = logging.getLogger()
self.logger_name = loggername
def get_log(self):
"""定义一个函数,回调logger实例"""
self.logger.setLevel(logging.INFO) # Log等级总开关
# 创建一个handler,用于写入日志文件
log_name = log_path + self.logger_name + '.log'
fh = logging.FileHandler(log_name, mode='a')
fh.setLevel(logging.DEBUG) # 输出到file的log等级的开关
# 创建一个handler,用于将日志输出到控制台
#ch = logging.StreamHandler()
#ch.setLevel(logging.DEBUG)
# 定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
#ch.setFormatter(formatter)
# 给logger添加handler
self.logger.addHandler(fh)
#self.logger.addHandler(ch)
return self.logger
def send_email(d_info_str,title):
log_new = Logger("public_email")
mail_res = True
while mail_res:
try:
send_email_detail(d_info_str,title)
log_new.get_log().info("mail has been send successfully")
mail_res = False
except Exception as e:
log_new.get_log().error('邮件发送出现问题')
time.sleep(2)
def send_email_detail(d_info_str,title):
mail_host = "smtp.exmail.qq.com" # SMTP服务器
mail_user = "********" # 用户名
mail_pass = "*******" # 密码(这里的密码不是登录邮箱密码,而是授权码)
sender = '*******' # 发件人邮箱
receivers = ['*******', "**********"] # 接收人邮箱
body = d_info_str
title = title # 邮件主
message = MIMEText(body, 'html', 'utf-8') # 内容, 格式, 编码
message['From'] = "{}".format(sender)
message['To'] = ",".join(receivers)
message['Subject'] = title
smtpObj = smtplib.SMTP_SSL(mail_host, 465) # 启用SSL发信, 端口一般是465
smtpObj.login(mail_user, mail_pass) # 登录验证
smtpObj.sendmail(sender, receivers, message.as_string()) # 发送