【问题标题】:AWS Lambda python function sending multiple SNS messagesAWS Lambda python 函数发送多条 SNS 消息
【发布时间】:2023-03-18 00:50:01
【问题描述】:

我在 AWS Lambda 函数中有 Python 3.6,它会多次处理每个项目,而不仅仅是一次,我不知道为什么。它检查特定标签值并在满足该值时通过 SNS 发送电子邮件,而不是收到一封电子邮件警报,我收到 5 个或更多。

相关代码如下,我有x出帐号。

aws_account_numbers = {xxxxxxxxxxx,xxxxxxxxxxx,xxxxxxxxxxx,xxxxxxxxxxx,xxxxxxxxxxx,xxxxxxxxxxx}


def lambda_handler(event, context):
    today = datetime.date.today()
    mdy = today_string = today.strftime('%m/%d/%y')

    for name, acctnum in aws_account_numbers.items():
        roleArn = "arn:aws:iam::%s:role/EOTSS-Monitor-Tags-expenddate" % acctnum
        stsClient = boto3.client('sts')
        sts_response = stsClient.assume_role(RoleArn=roleArn,RoleSessionName='AssumeCrossAccountRole', DurationSeconds=1800)
        ec2 = boto3.resource(service_name='ec2',region_name=region,aws_access_key_id = sts_response['Credentials']['AccessKeyId'],
            aws_secret_access_key = sts_response['Credentials']['SecretAccessKey'], aws_session_token = sts_response['Credentials']['SessionToken'])

        for instance in ec2.instances.all():
            if instance.tags is None:
                continue
            for tag in instance.tags:
                if tag['Key'] == 'expenddate':
                    expiredInstances=[]
                    if (tag['Value']) <= mdy:
                        sns_client.publish(
                            TopicArn = 'arn:aws:sns:us-east-1:xxxxxxxxxxx:EOTSS-Monitor-Tag-Exceptions-Temp',
                            Subject = '!!!! Tag Exception has Expired.',
                            Message = str("The tag exception for instance %s has expired in account %s" % (instance.id,acctnum)))
                else:
                    print ("end")
    return "sucess"

【问题讨论】:

  • 如果您在多个帐户中有多个满足要求的实例,会有什么预期行为?
  • 什么触发了您的 Lambda 执行?一个事件?它计划在某个地方运行?你手动运行它吗?
  • John - 多个帐户中有多个实例可能满足标签值。有些日子没有其他日子,标签符合该标准的多个实例。
  • 这是由 CloudWatch 规则在美国东部标准时间每天凌晨 2 点触发的。我发现有趣的是,在测试时我切换了 SNS 主题,这样在测试期间我就不会向整个团队发送电子邮件。我将 SNS 主题切换到只通知我的主题。当我这样做时,我只会为每个实例收到一个电子邮件警报,而不是每个我收到的其他 SNS 主题的 4 个警报。

标签: python-3.x amazon-web-services aws-lambda amazon-sns


【解决方案1】:

您应该添加额外的调试代码以确认publish() 命令被多次调用。

例如:

        for instance in ec2.instances.all():
            if instance.tags is None:
                continue
            for tag in instance.tags:
                print('Checking instance: ', instance.id)   # <-- Added
                if tag['Key'] == 'expenddate':
                    expiredInstances=[]
                    if (tag['Value']) <= mdy:
                        print('Sending publish message')    # <-- Added
                        sns_client.publish(
                            TopicArn = 'arn:aws:sns:us-east-1:xxxxxxxxxxx:EOTSS-Monitor-Tag-Exceptions-Temp',
                            Subject = '!!!! Tag Exception has Expired.',
                            Message = str("The tag exception for instance %s has expired in account %s" % (instance.id,acctnum)))

这将帮助您确定代码是否发送多条消息,或者 Amazon SNS 是否多次发送一条消息。

顺便说一句,我可以看到 region 在您的代码中定义的位置,但我看不到 expiredInstances 被使用。

【讨论】:

  • 这似乎是导致问题的 SNS 主题。我删除了 SNS 主题并用稍微不同的名称重新创建了它,然后将我的 Lambda 函数指向该主题,几天来,每个满足条件的实例我只收到一封电子邮件警报。
【解决方案2】:

这似乎是导致问题的 SNS 主题。我删除了 SNS 主题并使用稍微不同的名称重新创建了它,然后将我的 Lambda 函数指向该主题,几天来,每个满足条件的实例我只收到一封电子邮件警报。

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 2021-01-22
    • 2016-03-16
    • 2016-03-05
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多