【问题标题】:AWS Lambda is not reading environment variablesAWS Lambda 未读取环境变量
【发布时间】:2018-07-15 21:35:45
【问题描述】:

我正在编写一个 python 脚本来查询 Qualys API 的漏洞元数据。我在 AWS 中将其作为 lambda 函数执行。我已经在控制台中设置了环境变量,但是当我执行我的函数时,我收到以下错误:

module initialization error: name 'QUALYS_USERNAME' is not defined

我正在使用这个 os 模块在我的处理函数的代码中调用它们:

import os
import requests
import time
import lxml
import tinys3
from lxml import etree

def lambda_handler(event, context):
    QUALYS_USERNAME = os.environ('QUALYS_USERNAME')
    QUALYS_PASSWORD = os.environ('QUALYS_PASSWORD')
    ACCESS_KEY = os.environ('ACCESS_KEY')
    SECRET_KEY = os.environ('SECRET_KEY')

s = requests.Session()
s.headers.update({'X-Requested-With':QUALYS_USERNAME})

def login(s):
    payload = {'action':'login', 'username':QUALYS_USERNAME, 
    'password':QUALYS_PASSWORD}

    r = s.post('https://qualysapi.qualys.com/api/2.0/fo/session/', 
    data=payload)

def launchReport(s, polling_delay=120):
    payload = {'action':'launch', 'template_id':'X', 
    'output_format':'xml', 'report_title':'X'}

    r = s.post('https://qualysapi.qualys.com/api/2.0/fo/report/', data=payload)
    global extract_id
    extract_id = etree.fromstring(r.content).find('.//VALUE').text
    print("Report ID = %s" % extract_id)
    time.sleep(polling_delay)
    return extract_id

def bucket_upload(s):
    conn = tinys3.Connection(ACCESS_KEY,SECRET_KEY)
    payload = {'action': 'fetch', 'id': extract_id}
    r = s.post('https://qualysapi.qualys.com/api/2.0/fo/report/', 
    data=payload)

    os.chdir('/tmp')
    with open(extract_id + '.xml', 'w') as file:
        file.write(r.content)
    f = open(extract_id + '.xml','rb')
    conn.upload(extract_id + '.xml',f,'X-bucket')

login(s)
launchReport(s)
bucket_upload(s)

这是我在 Lambda 中定义的环境变量:

Env Variables Console

我不确定为什么会收到此错误。

【问题讨论】:

  • 如果您添加一些打印语句,运行 Lambda,然后查看 CloudWatch Logs,您将看到什么时候执行的代码。

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


【解决方案1】:

您需要以字典而不是函数调用的形式访问环境变量。

QUALYS_USERNAME = os.environ["QUALYS_USERNAME"] QUALYS_PASSWORD = os.environ["QUALYS_PASSWORD"]

【讨论】:

    【解决方案2】:

    潜在原因:函数之外的内联代码在事件处理程序之前运行。

    不相关:您应该将 IAM 角色用于 AWS 凭证,并将 Parameter Store 用于其他非 AWS 凭证,而不是使用环境变量作为凭证。

    【讨论】:

    • IAM 角色仅涵盖 S3 的访问密钥,而不是第三方服务的 HTTP 身份验证凭据。
    • @jordanm 好点。添加了从 Parameter Store 获取非 AWS 凭证和任何其他机密的建议。
    • 函数之外的内联代码在处理程序之前运行似乎是清晰的解释......或者至少是其中的一部分。将s.headers.update({'X-Requested-With':QUALYS_USERNAME}) 移动到login() 中似乎是合适的,尽管我承认这里的变量范围是如何工作的。
    • 是的,我的作用域搞砸了......当我将 env 调用放入 login() 函数时,它正确执行。显然login() 不知道lambda_handler() 中发生了什么。但是,我肯定会考虑改用 Parameter Store。
    • @NickD。您是否重组了您的代码,以便实际调用的 Lambda 事件处理程序获取它需要的凭据并调用它需要运行的函数?
    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 2020-01-16
    • 2020-08-18
    • 2017-08-01
    • 2022-11-03
    • 2019-11-30
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多