如何在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
相关产品推荐
相关产品推荐

