簡體   English   中英

通過 SNS 捕獲 AWS lambda 函數的 output 和 email

[英]Capture a AWS lambda function's output and email it via SNS

Lambda function 代碼:

import json
import datetime
import redshift_module.pygresql_redshift_common as db_handler
from decouple import config
import pg

host = config('host')
port = config('port')
db_name = config('db_name')
db_user = config('db_user')
db_password = config('db_password')


def get_connection(host, port, dbname, user, password):
    rs_conn_string = "host=%s port=%s dbname=%s user=%s password=%s" % (
        host, port, dbname, user, password)
    rs_conn = pg.connect(dbname=rs_conn_string)
    rs_conn.query("set statement_timeout = 1200000")
    return rs_conn


def query(con, query):
    res = con.query(query)
    return res


rs_conn = db_handler.get_connection(host, port, db_name, db_user, db_password)
query_string = "call XYZ_warehouse.ABC_revenue_last_7_days();"

res = query(rs_conn, query_string)
print(res.getresults())


def lambda_handler(event, context):
    return {'statusCode': 200, 'body': json.dumps('Hello from Lambda!')}

因此代碼在 redshift 數據庫上運行查詢 function。 lambda 的 output 包含如下字符串:

DEUS revenue is completely matching and revenue is : 5139 and Revenue without shipping is: 4987

我需要做的是在執行結果中捕獲像這樣的行,也許將它們存儲在某個變量或日志文件中,這樣我就可以 email 它們。 我試過在查詢 object 上運行.getresults()但它返回一個空字符串。 也許是因為它沒有返回記錄或表格?

有沒有辦法可以捕獲 lambda function 的完整 output? 或者將它發送到某處的文件?

創建字典並保存所有要通過 email 發送的 output。

現在將其轉換為 json 並通過 SNS 或 SES 發送

您的問題有點不清楚,您是否也需要有關檢索查詢結果的幫助?

如果是這樣,我建議你從這里閱讀

有沒有辦法可以捕獲 lambda function 的完整 output? 或者將它發送到某處的文件?

一種選擇是將 lambda 函數的 output 發送到 s3 存儲桶,例如

import boto3

s3 = boto3.resource(
    's3',
    region_name='us-east-1',
    aws_access_key_id=KEY_ID,
    aws_secret_access_key=ACCESS_KEY
)
content="String content to write to a new S3 file"
s3.Object('my-bucket-name', 'newfile.txt').put(Body=content)

您可以設置一個 s3 觸發器, 一旦將新的 object 添加到存儲桶中,它就會觸發第二個 lambda

然后,您的第二個 lambda 可以轉換為 JSON 並作為 Vaquar Khan 的回答通過 SNS/SES 發送。

如果我理解正確“您想將 lambda 中的 output 存儲在單獨的位置/文件中”以將其用作 email。

如果它是純 lambda output 你可以簡單地使用lambda destinations

目的地允許您根據失敗或成功來分離結果。 如果成功,您可以將其發送到目標(SNS、SQS、EventBridge 或不同的 Lambda),如果失敗,您可以將其發送到失敗目的地

目的地文檔

解決了

我作為初學者想出的解決方案是:

  • 創建另一個由 CloudwatchLogs 觸發的 lambda function。
  • 選擇輸出查詢結果的function的日志組。 它的日志將包含您需要的行。
  • 要從日志中獲取這些行,您需要以下代碼:
    •  decoded_data = json.loads(gzip.decompress(b64decode(event['awslogs']['data'])))
    • 根據您的查詢 lambda function 創建的最新日志將存儲在decoded_data
    • 然后從字典中提取您想要的行並通過 SNS email。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM