AWS Lambda Python创建AMI时自动打标签功能失效求助
问题说明
- 基于AWS CodePipeline部署EC2实例流程中,需要在部署前后分别创建AMI,现有AMI创建逻辑运行正常,但生成的AMI无自定义标签,无法快速区分预部署、部署后版本,需要补充Python侧的AMI打标逻辑。
- 此前测试过公开的Serverless AMI备份相关代码,创建AMI逻辑正常,但标签添加功能失效。
- 参考过同场景的通用实现方案,但因Python基础不足,无法完成现有代码的适配修改。
- 已自行尝试添加
TagSpecifications参数,分别测试过将参数追加到代码末尾、插入代码中段两种写法,均未完成打标。
正确实现方法
TagSpecifications参数必须作为create_image接口的入参传入,同时必须明确指定标签绑定的资源类型为image,随意将参数插在代码任意位置的写法不会生效。
可直接复用的代码示例
import boto3 from datetime import datetime # 初始化EC2客户端,替换为你实际使用的区域 ec2 = boto3.client('ec2', region_name='cn-north-1') def create_ami(instance_id, deploy_stage): """ 创建带标签的AMI :param instance_id: 需要制作AMI的EC2实例ID :param deploy_stage: 部署阶段,传pre-deploy代表部署前,post-deploy代表部署后 """ ami_name = f"{deploy_stage}-ami-{instance_id}-{datetime.now().strftime('%Y%m%d%H%M')}" resp = ec2.create_image( InstanceId=instance_id, Name=ami_name, # 若不需要制作AMI时重启实例可保持NoReboot为True NoReboot=True, # 标签配置必须写在create_image的入参括号内 TagSpecifications=[ { # 必须指定资源类型为image,否则标签会被接口忽略 'ResourceType': 'image', 'Tags': [ {'Key': 'DeployStage', 'Value': deploy_stage}, {'Key': 'SourceInstance', 'Value': instance_id}, {'Key': 'CreateTime', 'Value': datetime.now().isoformat()} # 可在此处追加其他需要的自定义标签 ] } ] ) return resp['ImageId'] # 调用示例:创建部署前AMI # pre_ami_id = create_ami('i-替换为你的实际实例ID', 'pre-deploy') # 调用示例:创建部署后AMI # post_ami_id = create_ami('i-替换为你的实际实例ID', 'post-deploy')
常见失效原因排查
- 语法位置错误:
TagSpecifications写在create_image方法调用的括号外部,作为独立代码行,参数不会被传入AWS接口,完全不生效。 - 缺少资源类型声明:
TagSpecifications配置中未填写ResourceType: 'image',接口无法识别标签的绑定目标,会直接丢弃标签配置。 - 权限缺失:CodePipeline绑定的执行角色缺少
ec2:CreateTags权限,即使代码写法正确也无法完成打标,需要在IAM策略中补充对应权限。
兜底补标方案:如果已经生成了未带标签的AMI,可以调用单独的打标接口补打标签,不需要重新制作AMI:
def add_tag_for_exist_ami(ami_id, tags): ec2.create_tags( Resources=[ami_id], Tags=tags )
内容的提问来源于stack exchange,提问作者Ken Lee
相关产品推荐
相关产品推荐

