从Snowflake发送电子邮件警报 [英] Sending Email alerts from Snowflake
问题描述
如果存储过程在Snowflake中失败,我们是否可以发送电子邮件警报? 当我查看Snowflake文档时,没有提到Snowflake中的电子邮件实用程序
推荐答案
您可以直接从Snowflake发送电子邮件,也可以选择将表/视图中的数据作为附件发送。这是使用Snowflake外部函数完成的,该函数通过AWS Gateway调用AWS Lambda函数。 第一步是设置AWS网关。您可以按照以下说明操作: Creating a Customizable External Function on AWS
如果您从Snowflake获得了样例函数,那么您已经成功设置了添加电子邮件功能的基础。下一步是设置S3存储桶以创建需要作为电子邮件附件发送的数据文件。
创建一个名为‘Snowapi’的AWS S3存储桶。我们不需要将此存储桶暴露给Internet,因此请将"挡路所有公共访问"设置为"打开"。
现在您需要提供Snowflake对此Bucket的访问权限。创建一个IAM用户"雪花"。添加权限->;附加退出策略:AmazonS3FullAccess。转到"安全凭证"选项卡,然后"创建访问密钥"。使用以下命令中的Access Key ID和Secret Access Key将数据卸载到S3存储桶中。
创建或替换UTIL.AWS_S3_Stage URL=‘s3://nowapi/’ CREDENTIALS=(AWS_KEY_ID=‘ABCD123456789123456789’ AWS_SECRET_KEY=‘ABCD12345678901234567890123456789’); 复制到@UTIL.AWS_S3_Stage/Outbound/SampleData.csv 从… FILE_FORMAT= 覆盖=TRUE SINGLE=TRUE;下一步是使用下面的NodeJS代码创建一个新的Lambda函数。请注意,这使用SENDGRID API。SendGrid有一个永远免费的层级,每天有100封电子邮件。我在本地安装了此库,并将uploaded the zip文件安装到AWS以创建Lambda函数。
//Lambda Function name: email
const sgMail = require('@sendgrid/mail');
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
exports.handler = async (event, context, callback) => {
sgMail.setApiKey(process.env.SENDGRID_KEY);
const paramArray = JSON.parse(event.body).data[0];
//paramArray[0] has the row number from Snowflake
var message = {
to: paramArray[1].replace(/s/g, '').split(','),
from: paramArray[2].replace(/s/g, ''),
subject: paramArray[3],
html: paramArray[4]
};
// Attach file
if (paramArray.length > 5) {
var fileName = paramArray[5].substring(paramArray[5].lastIndexOf("/")+1);
var filePath = paramArray[5].substring(0, paramArray[5].lastIndexOf("/"));
try {
const params = {Bucket: process.env.BUCKET_NAME + filePath, Key: fileName};
const data = await s3.getObject(params).promise();
var fileContent = data.Body.toString('base64');
} catch (e) {
throw new Error(`Could not retrieve file from S3: ${e.message}`);
}
message.attachments = [{content: fileContent,
filename: fileName,
type: "application/text",
disposition: "attachment"
}];
}
try{
await sgMail.send(message);
return {
'statusCode': 200,
'headers': { 'Content-Type': 'application/json' },
'body' : "{'data': [[0, 'Email Sent to "+ paramArray[1] + "']]}"
};
} catch(e){
return {
'statusCode': 202,
'headers': { 'Content-Type': 'application/json' },
'body' : "{'data': [[0, 'Error - " + e.message + "']]}"
};
}
};
为lambda函数设置以下两个环境变量:
SENDGRID_KEY: <sendgrid_api_key> BUCKET_NAME: snowapi
创建Snowflake外部函数:
create or replace external function util.aws_email (mailTo varchar,mailFrom varchar,subject varchar,htmlBody varchar,fileName varchar) returns variant api_integration = aws_api_integration as 'https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/PROD/email';
为上述外部函数创建包装过程:
create or replace procedure util.sendemail (MAILTO varchar,MAILFROM varchar,SUBJECT varchar,HTMLBODY varchar,FILENAME varchar) returns string language javascript EXECUTE AS OWNER as $$ // Call the AWSLambda function. var qry = "select util.aws_email(:1,:2,:3,:4,:5)"; // null should be in lowercase. var stmt = snowflake.createStatement({sqlText: qry, binds: [MAILTO, MAILFROM||'no-reply@yourdomain.com', SUBJECT ||'Email sent from Snowflake', HTMLBODY||'<p>Hi there,</p> <p>Good luck!</p>', FILENAME||null] }); var rs; try{ rs = stmt.execute(); rs.next(); return rs.getColumnValue(1); } catch(err) { throw "ERROR: " + err.message.replace(/ /g, " "); } $$;
都准备好了!最终结果是发送电子邮件的干净呼叫,如下所示。
Call SENDEMAIL('to_email@dummy.com, to_another_email@dummy.com', 'from@yourdomain.com', 'Test Subject', 'Sample Body');
好运!!
这篇关于从Snowflake发送电子邮件警报的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!