You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Serverless框架管理与Lambda交互的EC2实例?

当然可以用Serverless管理EC2实例!下面我会一步步拆解实现方法,以及你关心的功能支持细节:

1. 能否通过Serverless管理EC2实例?

答案是肯定的。Serverless框架本质是AWS CloudFormation的抽象层,只要CloudFormation支持的AWS资源(包括EC2实例、安全组、子网等),都能通过Serverless框架来定义、部署和全生命周期管理。

2. 如何用Serverless框架管理与Lambda交互的EC2实例?

下面是一套完整的实现流程,包含配置示例:

步骤1:在Serverless配置文件中定义EC2资源

你需要在serverless.yml的resources区块里手动编写CloudFormation资源定义,比如EC2实例、配套的安全组。示例配置如下:

service: ec2-lambda-manager

provider:
  name: aws
  runtime: nodejs18.x
  region: us-east-1
  # 给Lambda配置操作EC2的权限
  iamRoleStatements:
    - Effect: Allow
      Action:
        - ec2:StartInstances
        - ec2:StopInstances
        - ec2:DescribeInstances
      Resource: !GetAtt MyEC2Instance.Arn # 限定到具体实例,比*更安全

# 定义与EC2交互的Lambda函数
functions:
  toggleEC2State:
    handler: handler.toggleEC2
    environment:
      EC2_INSTANCE_ID: !Ref MyEC2Instance # 把EC2实例ID注入Lambda环境变量
    events:
      - httpApi:
          path: /ec2/toggle
          method: post

# 定义EC2及关联资源
resources:
  Resources:
    MyEC2Instance:
      Type: AWS::EC2::Instance
      Properties:
        ImageId: ami-0c55b159cbfafe1f0 # 替换为你部署区域的有效AMI(比如Amazon Linux 2)
        InstanceType: t2.micro
        SecurityGroups:
          - !Ref EC2SecurityGroup
    EC2SecurityGroup:
      Type: AWS::EC2::SecurityGroup
      Properties:
        GroupDescription: Basic access for EC2 instance
        SecurityGroupIngress:
          - IpProtocol: tcp
            FromPort: 22
            ToPort: 22
            CidrIp: 192.168.1.0/24 # 生产环境仅限指定IP段访问SSH
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: 0.0.0.0/0

步骤2:编写Lambda交互逻辑

创建handler.js文件,实现启动/停止EC2的功能:

const AWS = require('aws-sdk');
const ec2 = new AWS.EC2();

module.exports.toggleEC2 = async (event) => {
  const instanceId = process.env.EC2_INSTANCE_ID;
  
  try {
    // 查询当前实例状态
    const stateRes = await ec2.describeInstances({ InstanceIds: [instanceId] }).promise();
    const currentState = stateRes.Reservations[0].Instances[0].State.Name;

    // 根据状态执行启停操作
    const action = currentState === 'running' ? 'stopInstances' : 'startInstances';
    await ec2[action]({ InstanceIds: [instanceId] }).promise();

    return {
      statusCode: 200,
      body: JSON.stringify({
        message: `EC2实例 ${instanceId} 已${currentState === 'running' ? '停止' : '启动'}`,
        currentState: currentState === 'running' ? 'stopped' : 'running'
      })
    };
  } catch (err) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: err.message })
    };
  }
};

步骤3:部署与测试

执行命令部署整个服务:

serverless deploy

部署完成后,用生成的HTTP API端点发送请求,就能触发Lambda来控制EC2实例了。

3. Serverless平台是否内置相关功能,还是需要手动创建CloudFormation实例?

Serverless框架本身没有内置专门的EC2管理开箱即用功能——它的核心定位是简化无服务器资源(Lambda、API Gateway等)的开发部署。不过因为它完全兼容CloudFormation,所以你需要在resources区块手动编写EC2相关的CloudFormation资源定义(就像上面示例中的AWS::EC2::Instance)。

也有一些第三方插件(比如serverless-ec2-plugin)可以简化EC2配置,但本质还是帮你生成对应的CloudFormation模板,底层逻辑不变。

内容的提问来源于stack exchange,提问作者Allyl Isocyanate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:39:35