如何无需user_data,自动在EC2实例创建时触发脚本执行?
实现EC2实例创建后自动运行脚本的自动化方案
你提到的EventBridge其实可以捕获EC2实例创建完成的事件,对应的事件类型是EC2 Instance State-change Notification——当实例状态切换为running时,就代表实例创建完成并可用,这就是你需要的触发点。下面是完整的实现方案:
步骤1:配置EventBridge规则
- 进入EventBridge控制台创建新规则
- 事件源选择「AWS服务」,服务名称选「EC2」,事件类型选择「EC2 Instance State-change Notification」
- 在「具体状态」中勾选
running,若需过滤特定实例,可添加标签匹配条件(比如只处理带AutoRunScript: true标签的实例) - 目标选择「Lambda函数」,指定后续要创建的Lambda函数
步骤2:创建Lambda函数(以Python为例)
Lambda需要具备执行SSM命令和查询EC2实例的权限,先给Lambda的IAM角色添加以下权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:SendCommand", "ec2:DescribeInstances" ], "Resource": "*" } ] }
然后编写Lambda代码,从EventBridge事件中提取实例ID,再通过SSM发送命令执行脚本:
import boto3 ssm = boto3.client('ssm') def lambda_handler(event, context): # 从事件中提取实例ID instance_id = event['detail']['instance-id'] # 发送SSM命令执行自定义脚本,替换为你的实际命令 response = ssm.send_command( InstanceIds=[instance_id], DocumentName='AWS-RunShellScript', Parameters={ 'commands': [ '#!/bin/bash', 'echo "自动脚本运行成功" >> /var/log/auto_script.log', 'yum update -y', 'systemctl enable --now nginx' ] } ) print(f"已向实例 {instance_id} 发送命令,命令ID: {response['Command']['CommandId']}") return response
步骤3:确保实例满足前置条件
- SSM Agent:Amazon Linux、Amazon Linux 2、Ubuntu 16.04+等官方镜像默认预装SSM Agent,其他系统需手动安装
- 实例IAM角色:给实例附加
AmazonSSMManagedInstanceCore权限策略,确保实例能和SSM服务通信 - 网络连通性:实例需能访问SSM服务,可通过公网IP、NAT网关或VPC端点实现
额外注意事项
- 手动创建实例时,记得绑定具备SSM权限的IAM角色,否则Lambda无法向其发送命令
- 可在Lambda中添加错误处理逻辑,比如捕获SSM调用异常,记录到CloudWatch Logs或发送告警
- 存量实例可通过EC2批量操作或手动调用SSM命令补运行脚本
内容的提问来源于stack exchange,提问作者Mit94
相关产品推荐
相关产品推荐

