在lambda中使用boto3与SNS&;EMR客户端获取集群的详细信息并将其发送到邮件中



我可以获得输出,并使用下面代码中的SNS服务通过电子邮件发送。但是,它一次为1个集群输出发送一封邮件,而不是在1封邮件中发送所有集群详细信息。

导入boto3导入json从日期时间导入时间增量

REGION="us-east-1">

Topic_Arn="Arn:aws:sns:us-east-1:000000:testlog">

emrclient=boto3.client('emr',region_name=region)snscllient=boto3.client('sns',region_name=region)

def lambda_handler(事件,上下文):EMRS=emrclient.list_clusters(ClusterStates=["启动"、"运行"、"等待"])

clusters = EMRS["Clusters"]
for cluster_details in clusters :
id = cluster_details.get("Id")
describe_cluster = emrclient.describe_cluster(
ClusterId = id
)
cluster_values = describe_cluster["Cluster"]
name = cluster_values.get("Name")
tag_val = cluster_values.get("Tags")
Instancehours = cluster_values.get("NormalizedInstanceHours")

emr_ig = emrclient.list_instance_groups(
ClusterId = id
)
emrid = emr_ig["InstanceGroups"]
for item in emrid :
purchase_type = item.get("Market")
instancegroup_id = item.get("Id")
instancegroup_type = item.get("InstanceGroupType")
status = item.get("Status")
state = status.get("State")
timeline = status.get("Timeline")
autoscaling = item.get("AutoScalingPolicy", None)
#autoscaling_status = autoscaling.get("Status")
#autoscaling_state = autoscaling_status.get("State")
create_date_time = timeline.get("CreationDateTime")
ready_date_time = timeline.get("ReadyDateTime")
emrdetails = "Cluster_ID = " + id + "," + "status_of_cluster = " + state + "," + " Instance_Group = " + instancegroup_type + "," + " Market = " + purchase_type + "," + " CreationDateTime = " + str(create_date_time) + "," + " NormalizedInstanceHours = " + str(Instancehours) + "," + " Autosacle = " + str(autoscaling)
emr_status_list = []
emr_status_list.append(emrdetails)
emrStatusCheck = []
for emr_status in emr_status_list :
if ((emr_status.split(",")[3]).split("=")[1].strip() == str("ON_DEMAND") and (emr_status.split(",")[2]).split("=")[1].strip() == str("CORE") and (emr_status.split(",")[6]).split("=")[1].strip() == str("None")):
emrStatusCheck.append(emr_status)
print(emrStatusCheck)
snsclient.publish(
TopicArn =  Topic_Arn,
Subject = "EMR Cluster Details",
Message = emrStatusCheck
)

将sns语句移出for循环,使其只执行一次。示例:

for emr_status in emr_status_list :
if ((emr_status.split(",")[3]).split("=")[1].strip() == str("ON_DEMAND") and (emr_status.split(",")[2]).split("=")[1].strip() == str("CORE") and (emr_status.split(",")[6]).split("=")[1].strip() == str("None")): 
emrStatusCheck.append(emr_status) 
print(emrStatusCheck) 
snsclient.publish( TopicArn = Topic_Arn, Subject = "EMR Cluster Details", Message = emrStatusCheck )

是的,将SNS发布语句移到循环外部。您可能还需要将每个集群的消息聚合为单个复合消息

相关内容

最新更新