如何使用云监视事件使用单个 lambda 创建和终止 EMR 集群

how to create and terminate a EMR cluster using single lambda using cloud watch events

我对此很陌生,我想每天在 0900 创建一个 emr 集群,并在 1300 使用 cloudwatch 事件触发器再次终止它。我希望这通过单个 lambda(python) 发生,而不是创建 2 个 lambda,一个用于创建,一个用于终止。 请帮帮我

import boto3

client = boto3.client('emr', region_name='us-east-1')

response = client.run_job_flow(
    Name="Boto3 test cluster",
    ReleaseLabel='emr-5.12.0',
    Instances={
        'MasterInstanceType': 'm4.xlarge',
        'SlaveInstanceType': 'm4.xlarge',
        'InstanceCount': 3,
        'KeepJobFlowAliveWhenNoSteps': True,
        'TerminationProtected': False,
        'Ec2SubnetId': 'my-subnet-id',
        'Ec2KeyName': 'my-key',
    },
    VisibleToAllUsers=True,
    JobFlowRole='EMR_EC2_DefaultRole',
    ServiceRole='EMR_DefaultRole'
)

我必须添加什么代码才能使其符合我的要求?? 提前致谢

首先,您必须创建 2 个不同的 Cloudwatch 事件,并且它们分别在计划 0900 和 1300(使用 cron 表达式)。将它们设置为触发你的 lambda。

修改您的 lambda 代码以处理事件信息并获取将具有您的计划规则名称的“资源”。

现在基于该值 运行 您的代码。

import boto3

client = boto3.client('emr', region_name='us-east-1')

def lambda_handler(event, context): 
 
rule_name = event["Records"][0]["resources"].split("/")[-1]

if rule_name == 'crete_emr_rule':
  response = client.run_job_flow(
    Name="Boto3 test cluster",
    ReleaseLabel='emr-5.12.0',
    Instances={
        'MasterInstanceType': 'm4.xlarge',
        'SlaveInstanceType': 'm4.xlarge',
        'InstanceCount': 3,
        'KeepJobFlowAliveWhenNoSteps': True,
        'TerminationProtected': False,
        'Ec2SubnetId': 'my-subnet-id',
        'Ec2KeyName': 'my-key',
    },
    VisibleToAllUsers=True,
    JobFlowRole='EMR_EC2_DefaultRole',
    ServiceRole='EMR_DefaultRole'
   )
elif rule_name = "Terminate emr rule":
  list_emr = client.list_clusters(
  CreatedAfter=datetime(2021, 1, 1)# use time/date function to get these values
  CreatedBefore=datetime(2021, 1, 1),
  ClusterStates=['WAITING'],
  )   

  cluster_id = list_emr['Clusters'][0][Id]
  client.terminate_job_flows(JobFlowIds=[cluster_id])