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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:57:21