如何使用云监视事件使用单个 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])
我对此很陌生,我想每天在 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])