文档章节

使用 AWS SNS 发送通知到 HTTP 终端

Fenying
 Fenying
发布于 2016/09/15 11:26
字数 1041
阅读 122
收藏 0

作者: Angus.Fenying <i.am.x.fenying@gmail.com>

日期: 2016-08-27 05:46 PM

AWS 的 SNS 是一个消息推送服务,通过 SNS,可以将 AWS 的其他服务(如 S3)的事件消息转发给 其它终端(E-Mail,HTTP服务器等)。

一般情况下 SNS 的消息是一次性的,发完就消失了,当然也可以配置延迟发送的消息,这里只讲第一种。

下面直接开始说使用方式。

1. 创建 SNS 主题

主题是指一个消息集合,一个主题可储存多条消息,其他 AWS 服务可以将某些消息发到这个 SNS 主题下。

订阅是指:谁订阅了这个主题,主题就将其中的消息分发给这些订阅者,例如 HTTP 终端。

在使用之前必须先至少创建一个 SNS 主题,主题名称为 test,显示名随意。

2. 创建一个订阅(HTTP为例)

创建号了 SNS 主题后,下面有一个很大的按钮,叫你创建订阅,但是,先不要理他!

因为你一旦创建了一个订阅,AWS 马上就会发一个确认请求到那个地址——明显你应该还没准备好。

下面我们先说说怎么确认。 >>> 官方教程 <<<

不过官方教程有点长,我这里直接说最简单的方法。

AWS SNS 做这个确认订阅操作,就像我们注册网站账户的时候要验证邮箱或者手机一样,确认这个 HTTP 终端是你在用,否则你随便添加一个 HTTP 地址,天天叫 AWS 发请求,岂不是麻烦大了。

这就是确认订阅的目的。

当然了,确认订阅也和我们注册账户很像,它发送一个 HTTP POST 请求到你的地址,比如我这是 http://fenying.net/aws/sns/test/,当然了,这个地址是骗你们的。

它发送的 HTTP Body 是一个 JSON 结构,其中字段 SubscribeURL 里面是确认地址,用 HTTP GET 调用这个地址就可以完成订阅确认,这里用 PHP 代码处理:

<?php
/**
 * /aws/sns/test/index.php
 */
$rawData = file_get_contents('php://input');
$_POST = json_decode($rawData);

$ch = curl_init($_POST->SubscribeURL) ;

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_exec($ch) ;
curl_close($ch);

现在我们来创建一个 HTTP 类型的订阅,地址写你的处理地址,我这里是 http://fenying.net/aws/sns/test/。

创建完成,AWS 会发送一个确认请求到上面的地址。

3. 绑定 S3 Bucket 和 SNS

首先给我们的 SNS 主题 test 添加策略,修改为所有人都可以发消息。

然后进入 S3 控制台,选择一个 Bucket 查看属性,在 Events 栏里面添加一个事件,我选择的是 PUT,然后选择我们的 test SNS 主题,随便写个前缀(这里用 upload/)和名称,然后保存。

有没有绑定成功现在还无法确认,因为我们没有修改代码。下面写个简单的 DEMO:

<?php
/**
 * /aws/sns/test/index.php
 */
file_put_contents(
    's3.sns.log', 
    $_SERVER['REQUEST_URI'] . PHP_EOL .
    json_encode($_SERVER, 1) . PHP_EOL .
    file_get_contents('php://input') . PHP_EOL . PHP_EOL,
    FILE_APPEND
);

设置完毕,下面开始测试吧,上传一个文件到刚才的储存桶下面,key 比如 upload/test.zip

然后去我们的服务器上查看下 s3.sns.log 文件,就可以得到具体的请求数据结构了。

4、安全检测

我们的 HTTP 终端需要检测是否调用信息来自 AWS SNS,一个最简单的方法是根据 SNS Topic ARN 判断, 请求的 SNS Topic ARN 通过 $_SERVER['HTTP_X_AMZ_SNS_TOPIC_ARN'] 可以获取到,即 HTTP 请求头里面的字段 x-amz-sns-topic-arn

SNS Topic 的 ARN 可以在 SNS 控制台看到,一个典型的 SNS Topic ARN 是一个 arn:aws:sns:us-east-1:123456789012:sample

当然,还有更安全的方法是,使用亚马逊提供的哈希校验算法,根据 POST 的 JSON 里面的字段实现, 这个比较复杂,就不说明了,请查看官方文档。

(完)

© 著作权归作者所有

Fenying
粉丝 15
博文 13
码字总数 14020
作品 0
深圳
程序员
私信 提问
AWS数据库容灾-RDS异号备份

AWS数据库容灾 项目要求 A账号定时将本账号北京区的RDS数据库进行快照备份,并将备份的快照分享给B账号,B帐号收到分享后及时将分享的快照复制到自己的北京区RDS快照组中进行备份。 解决方案...

蓝色雨全
2018/06/13
0
0
Amazon SNS Mobile Push Notifications

Amazon SNS 的实现的流程图如下(网址 http://docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html): 以上流程图是向移动设备发送message的一个流程,SNS服务其实也是利用别的平台(如下...

墨迹天下
2013/08/23
0
0
AWS相关了解

服务器能玩那么多花样0.0 图片.png Amazon Virtual Private Cloud (VPC) 允许您在 Amazon Web Services (AWS) 云中预置一个逻辑隔离分区,让您在自己定义的虚拟网络中启动 AWS 资源。您可以完...

治电小白菜
2017/11/25
0
0
玩转AWS CloudWatch微信告警

做海外业务时大多使用亚马逊 AWS 服务,配套AWS 监控 CloudWatch 功能强大,如果能和微信结合就更棒了。现在分享下如何玩转 CloudWatch 微信通知。 AWS EC2 云主机配套的云监控服务 CloudWat...

OneAPM蓝海讯通
2015/12/16
47
1
用Python抓取亚马逊云(AWS)的日志(CloudTrail)数据

如今是云的时代,许多公司都把自己的IT架构部署在基础架构云(IaaS)上。著名的IaaS提供商有亚马逊,微软(Azure),IBM等,国内也有诸如阿里云等。这里亚马逊毫无疑问是该市场的领军者。 AW...

naughty
2015/04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云安全中心:自动化安全闭环实现全方位默认安全防护

随着数字化转型的深入发展,企业云上资产越来越多元化,随之而来的是安全威胁的复杂化,企业需要花费大量精力进行告警分析、威胁检测、病毒查杀等工作。Gartner曾指出,随着安全警报的复杂性...

迷你芊宝宝
24分钟前
1
0
好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM

好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM 最近在The Sass Way里看到了Modular CSS typography一文,发现文章在开头部分就提到了OOCSS、 SMACSS、 BEM、这3个词。“如果还不...

好程序员IT
27分钟前
2
0
Gradle的安装和在idea的配置

下载gradle 下载地址:http://services.gradle.org/distributions/ 。我下载的是 gradle-5.4-bin.zip。然后解压到G:\gradle-5.4 配置环境变量。 有3个环境变量: GRADLE_HOME 等于gradle的安...

王坤charlie
27分钟前
1
0
聊聊分布式事务,再说说解决方案

前言 最近很久没有写博客了,一方面是因为公司事情最近比较忙,另外一方面是因为在进行 CAP 的下一阶段的开发工作,不过目前已经告一段落了。 接下来还是开始我们今天的话题,说说分布式事务...

群星纪元
30分钟前
3
0
分布式项目(6)consul注册中心

lelinked
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部