AWS CDK实现Lambda检测网站内容变更后通过SNS发送短信
实现SNS短信通知需要完成两处修改
1. 修改CDK栈配置(文件路径:lib/lambda_query_website_aws_cdk-stack.ts)
你需要给Lambda函数添加SNS主题的发布权限,同时把SNS主题的ARN传入Lambda的环境变量,方便代码里调用:
import * as cdk from '@aws-cdk/core'; import events = require('@aws-cdk/aws-events'); import targets = require('@aws-cdk/aws-events-targets'); import lambda = require('@aws-cdk/aws-lambda'); import * as sns from '@aws-cdk/aws-sns'; import * as subscriptions from '@aws-cdk/aws-sns-subscriptions'; import * as iam from '@aws-cdk/aws-iam'; // 新增导入IAM模块 import fs = require('fs') export class LambdaQueryWebsiteAwsCdkStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // 提前创建SNS主题,方便后续传入Lambda const myTopic = new sns.Topic(this, 'MyTopic'); myTopic.addSubscription(new subscriptions.SmsSubscription('+15551231234')); const lambdaFn = new lambda.Function(this, 'Singleton', { code: new lambda.InlineCode(fs.readFileSync('lambda-handler.py', { encoding: 'utf-8' })), handler: 'index.main', timeout: cdk.Duration.seconds(300), runtime: lambda.Runtime.PYTHON_3_6, environment: { 'PREV_RESPONSE': '', 'SNS_TOPIC_ARN': myTopic.topicArn // 新增SNS主题ARN环境变量 } }); // 给Lambda添加SNS主题的发布权限 lambdaFn.addToRolePolicy(new iam.PolicyStatement({ actions: ['sns:Publish'], resources: [myTopic.topicArn] })); // 每日6:00至23:00每30分钟运行一次 const rule = new events.Rule(this, 'Rule', { schedule: events.Schedule.expression('cron(0/30 6-23 * * ? *)') }); rule.addTarget(new targets.LambdaFunction(lambdaFn)); } }
2. 修改Lambda函数代码(文件路径:lambda-handler.py)
导入AWS SDK for Python(boto3),在检测到内容变更的逻辑中调用SNS发布消息接口:
import os import urllib.request import boto3 # 新增导入boto3 # 初始化SNS客户端 sns_client = boto3.client('sns') url= "https://mywebsite.com" def main(event, context): print("I'm running!") response = urllib.request.urlopen(url) response_text = response.read() html = response_text.decode('utf-8') sns_topic_arn = os.getenv('SNS_TOPIC_ARN') if os.getenv('PREV_RESPONSE',default="HTML_BODY") != html: print("网站内容发生变更") os.environ['PREV_RESPONSE'] = html # 调用SNS发布短信通知 sns_client.publish( TopicArn=sns_topic_arn, Message='检测到目标网站内容已变更,请及时查看。', Subject='网站变更通知' )
注意:你当前将历史响应内容存在Lambda环境变量中的逻辑无法持久生效,Lambda运行时修改的环境变量不会保留到下次调用,每次冷启动或新的执行实例都会重置环境变量。如果需要持久存储历史响应,可使用DynamoDB、S3或者AWS Systems Manager Parameter Store等服务存储。
内容的提问来源于stack exchange,提问作者MasterOfTheHouse
相关产品推荐
相关产品推荐

