如何用CDK实现夜间关闭SageMaker GPU推理实例?
方案可行性与实现步骤
这个方案完全可行,通过AWS CDK可以轻松实现SageMaker推理实例的定时启停自动化,具体实现步骤如下:
1. 核心组件说明
- EventBridge 规则:设置定时调度,分别在目标时间触发停止/启动实例的规则
- Lambda 函数:编写代码调用SageMaker API,完成推理端点的启停操作
- IAM 权限:为Lambda函数配置必要权限,允许其调用SageMaker的启停接口
2. CDK 代码示例(Python)
完整栈实现代码
from aws_cdk import ( aws_lambda as _lambda, aws_events as events, aws_events_targets as targets, aws_iam as iam, Stack, ) from constructs import Construct class SageMakerAutoSchedulerStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # 创建Lambda执行角色 lambda_role = iam.Role(self, "SageMakerSchedulerRole", assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"), managed_policies=[ iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AWSLambdaBasicExecutionRole"), iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSageMakerFullAccess") # 生产环境建议缩小权限范围 ] ) # 启停端点的Lambda函数逻辑 scheduler_code = _lambda.Code.from_inline(""" import boto3 sagemaker = boto3.client('sagemaker') TARGET_ENDPOINT = '你的推理端点名称' def lambda_handler(event, context): action = event.get('action') if not action: return {'status': 'failed', 'message': 'Missing action parameter'} try: if action == 'stop': sagemaker.stop_endpoint(EndpointName=TARGET_ENDPOINT) print(f"Successfully stopped endpoint: {TARGET_ENDPOINT}") elif action == 'start': sagemaker.start_endpoint(EndpointName=TARGET_ENDPOINT) print(f"Successfully started endpoint: {TARGET_ENDPOINT}") return {'status': 'success'} except Exception as e: print(f"Error executing action: {str(e)}") return {'status': 'failed', 'message': str(e)} """) # 创建Lambda函数 sm_scheduler_lambda = _lambda.Function(self, "SageMakerSchedulerLambda", runtime=_lambda.Runtime.PYTHON_3_11, handler="index.lambda_handler", code=scheduler_code, role=lambda_role, ) # 定时停止规则(示例:北京时间20:00 = UTC 12:00,根据你的时区调整) stop_rule = events.Rule(self, "SageMakerStopRule", schedule=events.Schedule.cron( minute="0", hour="12", day="*", month="*", week_day="*" ) ) stop_rule.add_target(targets.LambdaFunction(sm_scheduler_lambda, event=events.RuleTargetInput.from_object({"action": "stop"}) )) # 定时启动规则(示例:北京时间次日08:00 = UTC 00:00,根据你的时区调整) start_rule = events.Rule(self, "SageMakerStartRule", schedule=events.Schedule.cron( minute="0", hour="0", day="*", month="*", week_day="*" ) ) start_rule.add_target(targets.LambdaFunction(sm_scheduler_lambda, event=events.RuleTargetInput.from_object({"action": "start"}) ))
3. 关键注意事项
- 时区转换:EventBridge的cron表达式默认使用UTC时间,需将本地时间换算为UTC后配置
- 端点兼容性:先在控制台手动测试目标端点的启停功能,确认其支持该操作(部分老版本端点可能不兼容)
- 权限优化:示例中使用了全量SageMaker权限,生产环境建议自定义IAM策略,仅允许
StartEndpoint、StopEndpoint等必要操作 - 多端点管理:若需管理多个端点,可修改Lambda代码,通过环境变量或事件参数传递端点名称,实现批量调度
内容的提问来源于stack exchange,提问作者Sazzad
相关产品推荐
相关产品推荐

