【问题标题】:How to create missing volume tag in lambda python如何在 lambda python 中创建丢失的卷标签
【发布时间】:2023-03-17 02:45:01
【问题描述】:

我正在尝试在 Amazon EBS 卷上创建标签,但前提是该标签不存在。其他一切都在我的代码上工作,但这部分不知何故不起作用。如果值与我的给定值不匹配,我希望这个 Lambda 函数创建一个标签。另一个条件是如果标签不存在,则创建一个标签。所以我的第一个条件是有效的,但不是第二个。如果标签不存在,我会收到一条错误消息(请参阅附件)此方法无效。我正在使用!=,另外,我使用了if not in tag['Key'] == 'Tech.BackUp.Retention.Days'。这条线也给了我一个错误。

已编辑:

  • 如果我没有Tech.Backup.Retention.Days 标签,那么我想创建一个标签:Tech.Backup.Retention.Days。价值无关紧要,我可以解决这个问题。
  • 这只是我的状况不正常。例如,我列出了 3 卷,每卷都包含某种类型的标签。其中一些带有Tech.Backup.Retention.Days,而另一些则没有。哪一个没有它,我想创造它。

还有一点:Lambda function to check if specific tag do NOT exists-python

这是我发现的类似问题,但这种方法甚至不起作用。相信我,我已经研究了一个星期,但无法解决它。我是 lambda 新手,可能是我错过了一些技巧。

已编辑 2ndV

我将在这里做的是:如果我找到一个备份标记然后检查值 (30),如果值为 30,则删除卷,如果值不是 30,则将值更新为 30。注意:我找不到如何更新值,所以每次值不匹配时,我都会创建一个具有给定值的新标签。最后,如果标签甚至不存在,则创建一个新标签。

问题:在我添加您的代码后,如果标签不存在,那么它正在创建一个新标签,但如果标签存在并且值匹配,那么它不会被删除。

这是我的全部代码:

TAG1 = 'Tech.BackUp.Retention.Days'
TAG2 = 'Tech.Backup.Time.HourOfDay'
ec2 = boto3.resource('ec2',region_name='us-east-2')
volume_list = ['1111']
for volume in volume_list:
    try:
        tag1_value = ([tag['Value'] for tag in volume.tags if tag['Key'] == TAG1] or [None])[0]
        tag2_value = ([tag['Value'] for tag in volume.tags if tag['Key'] == TAG2] or [None])[0]

        #first tag
        if  tag1_value == '30':
            print("Exist")
        else:
            delV.create_tags(Tags=[{'Key':TAG1, 'Value': '30'}])
            delV.create_tags(Tags=[{'Key':TAG2, 'Value': '01'}])
            break
        #second tag
        if tag2_value == '01':
            print("delete")
    except ClientError as e:
        continue

Picture of my code

【问题讨论】:

  • 能否请您编辑您的问题并提供您想要应用的确切逻辑(以文字形式)?例如“如果 xyz 标签不存在,则使用值 20 创建它。”
  • @JohnRotenstein 我已经编辑了这个问题。如果您需要任何其他内容或有更多问题,请告诉我。在此先感谢...

标签: python amazon-web-services aws-lambda boto3


【解决方案1】:

下面是一些代码,如果不存在则添加标签:

import boto3

TAG_NAME = 'Tech.BackUp.Retention.Days'

ec2_resource = boto3.resource('ec2')

volumes = ec2_resource.volumes.all()
for volume in volumes:
    # If there are no tags named TAG_NAME:
    if not any(tag['Key'] for tag in volume.tags if tag['Key'] == TAG_NAME):
        # Add the tag
        print('Adding tag to', volume.id)
        volume.create_tags(Tags=[{'Key':TAG_NAME, 'Value': '20'}])

基本上,它会查看标签的所有键并检查所需的标签是否存在不。如果是这样,它会添加标签。

If 可能看起来有点奇怪,但使用列表推导式更像 Pythonesque。


根据您的更新要求:

import boto3

TAG1 = 'Tech.BackUp.Retention.Days'
TAG2 = 'Tech.BackUp.Time.HourOfDay'

ec2_resource = boto3.resource('ec2')

volumes_list = ['vol-1234']
for volume in volumes_list:

    # Get value of TAG1
    tag1_value = ([tag['Value'] for tag in volume.tags if tag['Key'] == TAG1] or [None])[0]

    if tag1_value == '30':
        # Delete the volume
        volume.delete()
    else:
        volume.create_tags(Tags=[{'Key':TAG1, 'Value': '30'}])
        volume.create_tags(Tags=[{'Key':TAG2, 'Value': '01'}])

【讨论】:

  • 它对我不起作用。我再次编辑并包含了我的整个代码。并且还解释了我正在尝试做的事情。查看编辑后的 ​​2nv
  • 为您更新的要求添加了另一个答案。请注意,我建议的代码不需要循环标记 (for tag in vtag.tags)。
  • 如果我这样做是正确的,我必须更改我的整个代码,并且我正在检查第二个标签值,所以如果我遇到错误,我正在处理它,会让你知道。非常感谢您的帮助
  • 它不起作用。这就是错误:tag1_Value 无法正常工作 - 响应:{“errorMessage”:“'str' 对象没有属性 'tags'”、“errorType”:“AttributeError”、“stackTrace”:[“File \”/var/ task/lambda_function.py\",第 12 行,在 lambda_handler\n tag1_value = ([tag['Value'] for tag in delV.tags if tag['Key'] == TAG1] or [None])[0] \n" ] }
  • 错误信息是说你的delV 变量是一个字符串,而不是一个卷。我认为您应该使用vtag.tags,而不是delV.tags。我会推荐更具描述性的变量名称以避免像这样的潜在错误(例如for volume in volumes_list:)。
【解决方案2】:

以上逻辑有效。唯一的问题是您必须包含 [],以便它也接受一个空值(对于 TypeError)。

如果没有,任何(tag['Key'] for tag in volume.tags 或[] if tag['Key'] == TAG_NAME):。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多