基于python实现将AWS-ElastiCache-的Reserved_Cache_Nodes-预留节点及费用的信息统计

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于python实现将AWS-ElastiCache-的Reserved_Cache_Nodes-预留节点及费用的信息统计相关的知识,希望对你有一定的参考价值。

在AWS-ElastiCache中,Reserved_Cache_Nodes-预留节点,也就类似于EC2与RDS的RI(预留实例)

购买RI时,需要确认好引擎,可以选择 Redis 或者 Memcached 两种

都是为了节省成本而选择预付费用的一种方式 ,当AWS账号有多个时,如何通过编程的方式批量获取所有账号所有区域Region的RN信息呢

我们可以通过aws cli的方式,也可以通过AWS SDK for Python (Boto3)的方式,这里笔者将使用后者进行实现

首先,我们先看一个RN的数据信息结构,是json格式,详细如下:

\'ReservedCacheNodeId\': \'webporoject2023\', \'ReservedCacheNodesOfferingId\': \'65048c7a-79cc-48bf-a45a-163570d48906\', \'CacheNodeType\': \'cache.t2.micro\', \'StartTime\': datetime.datetime(2020, 8, 20, 9, 44, 48, 102000, tzinfo=tzutc()), \'Duration\': 31536000, \'FixedPrice\': 460.0, \'UsagePrice\': 0.0, \'CacheNodeCount\': 1, \'ProductDescription\': \'redis\', \'OfferingType\': \'Heavy Utilization\', \'State\': \'retired\', \'RecurringCharges\': [\'RecurringChargeAmount\': 0.052, \'RecurringChargeFrequency\': \'Hourly\'], \'ReservationARN\': \'arn:aws-cn:elasticache:cn-north-1:221234567891:reserved-instance:webporoject2023\'

这样我们可以通过 ElastiCacheclientclient.describe_reserved_cache_nodes()的方式获取如下一些关键的字段信息

那么,这里就会缺少,我们可能更希望直接看到的EndTime与AWS_Account ,对于AWS_Account 当然可以通过profile变量得到,可以设计成一样

对于EndTime,则我们可以自己计算出来,逻辑为Endtime=StartTime+Duration , 其中Duration的数字为秒数,一般来说就1年或者3年的秒数

接下来就是通过代码进行实现,笔者整理的核心代码如下:

ReservedCacheNodesResponse=ElastiCacheclient.describe_reserved_cache_nodes()

for ReservedCacheNode in ReservedCacheNodesResponse["ReservedCacheNodes"]:
    ReservedCacheNodeId=ReservedCacheNode["ReservedCacheNodeId"]
    ReservedCacheNodesOfferingId=ReservedCacheNode["ReservedCacheNodesOfferingId"]
    CacheNodeType=ReservedCacheNode["CacheNodeType"]
    Duration=ReservedCacheNode["Duration"]
    StartTime=(ReservedCacheNode["StartTime"]+datetime.timedelta(hours=8)).strftime("%Y-%m-%d %H:%M:%S")
    # Regarding Endtime, we can calculate it based on the StartTime and Duration
    EndTime=(ReservedCacheNode["StartTime"]+datetime.timedelta(seconds=Duration)+datetime.timedelta(hours=8)).strftime("%Y-%m-%d %H:%M:%S")
    FixedPrice=ReservedCacheNode["FixedPrice"]
    UsagePrice=ReservedCacheNode["UsagePrice"]
    CacheNodeCount=ReservedCacheNode["CacheNodeCount"]
    ProductDescription=ReservedCacheNode["ProductDescription"]
    OfferingType=ReservedCacheNode["OfferingType"]
    State=ReservedCacheNode["State"]
    RecurringChargeAmount=ReservedCacheNode["RecurringCharges"][0]["RecurringChargeAmount"]
    RecurringChargeFrequency=ReservedCacheNode["RecurringCharges"][0]["RecurringChargeFrequency"]
    ReservationARN=ReservedCacheNode["ReservationARN"]

最后再将结果输出到Excel文件,通过邮件发送到reviwer的邮箱即可,结果大致如下:

特殊说明:可以看到的有的RN的结束时间还没有到,就显示retired过期了

这是因为这个RN产品CacheNodeType被官方要求强制升级了,我们收到官方的通知后,可以进行升级,最后完成旧的RN退款,完成后就会显示成过期 状态了

 

 

尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/17364043.html

 

python 基于 Redis 实现缓存系统

Redis 服务器用途非常广泛,例如我们可以基于 Redis 服务器实现缓存系统。缓存系统可以缓解客户端访问压力,当缓存有效时只需直接将缓存结果返回给客户端而不用执行真正的后端逻辑。尝试在 Python 中实现一个简单的缓存系统。

要求条件:

  • 假设缓存的结果都是 Python 字典,通过 json 进行序列化和反序列化
  • 确保实验环境的 Redis 服务器已经启动

cache.py 文件中实现一个缓存系统类,类名称为 RedisCache ,可以通过 RedisCache.cache 方法装饰一个函数并缓存函数的执行结果

参考代码:

import json
from functools import wraps


# 该类用于生成针对某个 Redis 服务器的实例
# 实例的 cache 方法的返回值为装饰器
class RedisCache:
    def __init__(self, redis_client):
        self._redis = redis_client

    def cache(self, timeout=0):
        def decorator(func):
            @wraps(func)
            def wrap(*args, **kw):
                if timeout <= 0:
                    return func(*args, **kw)
                key = func.__name__
                raw = self._redis.get(key)
                if not raw:
                    value = func(*args, **kw)
                    self._redis.setex(key, timeout, json.dumps(value))
                    return value
                return json.loads(raw.decode())
            return wrap
        return decorator

RedisCache 的使用示例如下:

cache = RedisCache(r)

@cache.cache(timeout=10)
def execute():
    pass

初始化 RedisCache 后,可以通过 cache.cache(timeout=10) 方式装饰函数 execute,意思是说首次执行 execute 函数时其结果会被缓存 10 秒,10 秒内访问都直接返回缓存结果,10 秒后再访问时 execute 函数将重新执行。

  • Redis 中可以指定一个 key 的生存时间,生存时间结束 key 就会被删除
  • 缓存和获取缓存时,需要进行序列化和反序列化处理

以上是关于基于python实现将AWS-ElastiCache-的Reserved_Cache_Nodes-预留节点及费用的信息统计的主要内容,如果未能解决你的问题,请参考以下文章

基于Python实现词云制作

python 基于 Redis 实现缓存系统

python 基于 Redis 实现缓存系统

逻辑回归 算法推导与基于Python的实现详解

基于Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现(Python版本)

基于阈值的7种图像分割方法以及Python实现