【问题标题】:How to set timestamp to aws region timezone for aws lambda python code如何将时间戳设置为 aws lambda python 代码的 aws 区域时区
【发布时间】:2020-09-26 10:25:58
【问题描述】:

在我的 python lambda 代码中,基于主键作为“deviceId”和排序键时间戳(采用 YYYY-MM-DD HH:MN:SS 格式)扫描 dynamodb,我需要扫描每一个最后 15 分钟的数据(从现在的时间)。我在孟买地区 (ap-south-1),如何在以下 lambda 代码中设置本地时区。因为它正在选择默认的UTC日期时间。理想情况下,lambda必须扫描&如果返回计数> = 10,则恒温器+5。

import boto3
import math
import json
import time
from datetime import datetime,timedelta
from dateutil.tz import tzlocal
from boto3.dynamodb.conditions import Key, Attr

client = boto3.client('dynamodb')
dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):

    #table_name= "thermostat_dynamo"
    table_name= "newsensor"
    Primary_Column_Name = 'deviceId'
    table = dynamodb.Table(table_name)
    #key_param = "thermostat"
    #thermostatVal = table.get_item(Key={key_param:event[key_param]}) ## get record from dynamodb for this sensor
    thermostatVal= 77
    #now = datetime.now()
    now = datetime.now(tzlocal())
    fifteen_min_ago =  now - timedelta(seconds=900)
    now = now.strftime('%F %T')
    fifteen_min_ago = fifteen_min_ago.strftime('%F %T')

    fe = Key('timeStamp').between(fifteen_min_ago,now);
    response = table.scan(FilterExpression=fe & Attr('temperature').lt(thermostatVal))

    if response['Count'] == 10:
    #return thermostatVal+5 
        thermonew = thermostatVal + 5
        tosensor = '{"thermostat":'+'"%s"}' %thermonew
        print(tosensor)
        #response = client.publish(topic="updatehomesensor", qos=1, payload=tosensor)
        return

    elif response['Count'] < 10:
        #tosensor = '{"thermostat":'+'"%s"}' %thermostatVal
        print('{"thermostat":'+'"%s"}' %thermostatVal)
        #response = client.publish(topic="updatehomesensor", qos=1, payload=tosensor)
        return

【问题讨论】:

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


    【解决方案1】:

    所有 Lambda 实例均设置为 UTC 时区。如果你想改变这种行为,你需要更新环境变量。

    详细文档如下,其中提到 TZ 作为保留的环境变量 https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html.

    因此,例如,在您的情况下,您希望将 lambda 设置为使用 IST [印度标准时区]。您需要完成以下步骤。

    1. 在函数的配置选项卡中向下滚动到环境变量部分。
    2. 单击编辑并添加变量 TZ,其值为 Asia/Calcutta [ For IST ]。

    它应该如下所示

    保存环境变量后,您的环境将使用 TZ 变量中提到的时区。

    【讨论】:

    • 这真的有效吗?在这种情况下,“保留”一词似乎意味着您不能以这种方式对其进行更改。
    • 是的,它有效,我正在使用它。保留意味着它只能用于其预期目的,它不是恒定的,因此不能更改。
    【解决方案2】:

    首先,没有用于获取区域时区的本地 CLI 命令,因此该区域的时区需要来自您。

    您可以创建AWS_TIMEZONE 的环境变量并将值设置为'Asia/Kolkata'。然后您需要添加import os and from pytz import timezone 并调用timezone = timezone(os.environ['AWS_TIMEZONE']),然后更新now = datetime.now(timezone)。您部署到的每个区域都可以为 AWS_TIMEZONE 设置不同的变量值。

    但是,如果您可以将任何日期时间实际存储在 UTC 中,我建议您这样做,因为这样可以减少对时区问题的混淆,并且通常被认为是最佳做法。

    【讨论】:

    • 得到错误响应:{ "errorMessage": "'Asia/Kolkata'", "errorType": "KeyError", "stackTrace": [ " File \"/var/task/lambda_function.py \",第 25 行,在 lambda_handler\n 现在 = datetime.now(os.environ[AWS_TIMEZONE])\n","文件 \"/var/lang/lib/python3.7/os.py\",第 681 行, in __getitem__\n raise KeyError(key) from None\n" ] }
    • 糟糕,更新了答案,现在可以使用了
    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 2022-01-21
    • 2017-11-19
    • 1970-01-01
    • 2016-10-09
    • 2023-03-23
    • 2018-06-23
    • 2021-12-13
    相关资源
    最近更新 更多