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

如何在Python版AWS Lambda中启动EC2实例时传入UserData脚本?

解决Lambda启动EC2时Base64编码UserData的问题

核心问题是对boto3处理UserData的逻辑不清晰:create_instances方法会自动对传入的未编码文本进行Base64编码;如果手动传入已编码字符串,必须保证格式完全正确才能被EC2识别。

两种正确处理方式:

方式1:直接传入未编码脚本(推荐)

无需自行编码,直接将原始脚本字符串传给UserData参数,boto3会自动完成Base64编码,避免格式错误。示例代码:

import os
import boto3

AMI = "ami-052efd3df9dad4825"
INSTANCE_TYPE = "c6a.32xlarge"

ec2 = boto3.resource('ec2')
                
def lambda_handler(event, context):
    # 原始未编码的UserData脚本(以bash为例)
    user_data_script = """#!/bin/bash
echo "Hello from UserData" > /tmp/init.log
yum update -y
"""
    instance = ec2.create_instances(
        ImageId=AMI,
        InstanceType=INSTANCE_TYPE,
        MaxCount=1,
        MinCount=1,
        UserData=user_data_script,
    )

    print("New instance created:", instance[0].id)

方式2:传入已Base64编码的脚本

若坚持自行编码,需确保编码后的字符串是无换行的标准Base64格式,直接传入即可。示例代码:

import os
import boto3
import base64

AMI = "ami-052efd3df9dad4825"
INSTANCE_TYPE = "c6a.32xlarge"

ec2 = boto3.resource('ec2')
                
def lambda_handler(event, context):
    # 原始脚本
    raw_script = """#!/bin/bash
echo "Hello from UserData" > /tmp/init.log
yum update -y
"""
    # 手动Base64编码并移除换行符
    encoded_user_data = base64.b64encode(raw_script.encode('utf-8')).decode('utf-8').replace('\n', '')
    
    instance = ec2.create_instances(
        ImageId=AMI,
        InstanceType=INSTANCE_TYPE,
        MaxCount=1,
        MinCount=1,
        UserData=encoded_user_data,
    )

    print("New instance created:", instance[0].id)

常见错误点

  • 手动编码时保留了换行符:EC2无法解析带换行的Base64字符串
  • 使用了非标准Base64编码:比如url-safe格式,EC2仅支持标准Base64编码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:33:26