You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:18:00