月度归档: 2021年1月

使用AWS GA提升互联网流量性能

如果您提供游戏、媒体、移动或金融等应用程序,则需要一致的、低延迟的用户体验。AWS Global Accelerator通过提高客户机和运行在AWS上的应用程序之间的internet流量的性能,帮助您实现更低的延迟。它使用AWS全球网络将TCP或UDP通信定向到离客户机最近的AWS区域中的健康应用程序端点:通过Anycast方式将客户端的流量路由到最近的AWS边缘位置,然后通过AWS全球网络将其路由到最近的区域端点。

GA的原理和特性

Global Accelerator为每个加速器提供两个静态IP地址。这些IP地址是任意发送的,并通过AWS边缘位置在全球进行广播。使用您配置的加速器,Global Accelerator将TCP或UDP流量路由到应用程序端点(如Amazon EC2实例、应用程序负载均衡器、网络负载均衡器或弹性IP地址),并改善用户流量的延迟、抖动、包丢失和吞吐量性能。可以使用速度比较工具https://speedtest.globalaccelerator.aws/从您自己的位置测试使用GA的性能优势。

衡量绩效的一个流行方法是通过生产量——即在一段时间内可以传输多少数据。无论您是为API调用、文件上传还是IP语音调用提供服务,吞吐量的大小都会影响用户的体验。如今,Global Accelerator引入了一项改进,通过在边缘终止TCP,自动提供额外的吞吐量改进。通常,TCP连接是通过internet上的客户机和AWS区域中的应用程序端点之间的三路握手(即三条消息)建立的。因此,客户端离端点越远,初始连接设置花费的时间就越长。由于TCP在边缘终止,Global Accelerator通过在客户机和距离客户机最近的AWS边缘位置之间建立TCP连接,减少了初始设置时间。几乎同时,在AWS区域的边缘位置和应用程序端点之间建立第二个TCP连接。由于这个过程,客户端从全局加速器边缘位置获得更快的响应,并且从边缘位置到该区域的应用程序端点的上游连接被优化为在AWS全球网络上运行。作为该特性的一部分实现的优化包括:

  • 巨型帧的支持。通过在AWS区域的AWS边缘位置和应用端点之间启用巨型帧,Global Accelerator能够在每个数据包中多发送和接收6倍的数据(有效负载)。巨型帧支持减少了客户端和应用程序之间传输数据所需的总时间。
  • 大型接收端窗口和TCP缓冲区。通过调优AWS edge基础设施上的接收端窗口和TCP缓冲区设置,Global Accelerator能够在更短的时间内接收和缓冲来自应用程序的大量数据。这为您的客户端提供了更快的下载速度,现在直接从AWS边缘获取数据的时间缩短了。
  • 大的拥塞窗口。通过在AWS全球网络上传输数据,global Accelerator可以扩展TCP拥塞窗口,以发送比通常通过公共internet可能发送的更多的数据。

性能测试与结论

为了评估这个特性对性能的影响,我们测量了从世界各地的客户端到运行在AWS US East (N. Virginia)地区Amazon EC2上的端点的吞吐量。我们比较了通过TCP终止的Global Accelerator传输数据时的吞吐量和通过公共internet传输数据时的吞吐量。使用Global Accelerator的结果是吞吐量性能提高了60%。在所有情况下,使用Global Accelerator获得的吞吐量性能收益取决于许多因素,包括传输的数据量以及最后一英里网络中的连接的质量、容量和距离。

下面的图表显示了澳大利亚(图1)和美国(图2)的互联网客户端从AWS US East (N. Virginia)地区下载100KB的对象所花费的时间。图中比较了通过Global Accelerator(蓝色线)下载对象和通过公共internet从EC2直接下载对象(绿色线)的情况——包括启用TCP在边缘终止之前和之后。通过第三方工具进行的实际用户测量显示,对于通过带有TCP终止的Global Accelerator从AWS美国东部(北弗吉尼亚)地区下载对象的澳大利亚客户来说,实际用户测量结果提高了60%左右。美国的客户改善了40%以上。

https://d2908q01vomqb2.cloudfront.net/5b384ce32d8cdef02bc3a139d4cac0a22bb029e8/2020/03/12/Screen-Shot-2020-03-12-at-3.10.05-PM.png

https://d2908q01vomqb2.cloudfront.net/5b384ce32d8cdef02bc3a139d4cac0a22bb029e8/2020/03/12/Screen-Shot-2020-03-12-at-3.10.24-PM.png

我们注意到,在使用数字体验监控平台千人来衡量性能时,也出现了类似的结果。下面的图表(图3)显示,当一个100 KB的测试文件通过Global Accelerator从AWS EU(爱尔兰)地区下载时,非洲、美洲、亚洲和欧洲的40个客户端通过TCP终端通过Global Accelerator从AWS EU(爱尔兰)地区下载时,平均下载吞吐量提高了2.5倍以上。

https://d2908q01vomqb2.cloudfront.net/5b384ce32d8cdef02bc3a139d4cac0a22bb029e8/2020/03/12/Screen-Shot-2020-03-12-at-3.10.32-PM.png

GA的使用场景

为单一区域应用程序提升延迟和可用性

通过提升本地和全球流量的网络路由,AWS Global Accelerator 帮助缩小单一区域部署和多个区域部署之间的差距。如果导向您应用程序的单一区域的本地和全球流量留在了公共互联网,则可能会受到互联网拥塞和本地中断的负面影响。使用 Global Accelerator,您的用户流量会离开互联网,通过 80+ 全球边缘站点进入 Amazon 的私有全球网络,再导向您的应用程序源。AWS Global Accelerator 可以快速设置,并将流量性能提升高达 60%。

多区域应用程序的简化和弹性流量路由

随着您的应用程序架构发展,复杂性也随之增大,有面向客户的更长 IP 列表以及更细微的流量路由逻辑。AWS Global Accelerator 通过为您提供两个来自全球分布式边缘站点的静态任播 IP 地址来解决这一问题,为您的应用程序提供单个切入点,无论其部署了多少个 AWS 区域。这样,您可以增加或删除源、可用区域或区域,而无需降低应用程序可用性。对您的流量路由进行手动管理,或在控制台用终端节点流量调拨和权重进行管理。如果您的应用程序终端节点存在故障或可用性问题,AWS Global Accelerator 将在几秒钟内自动把您的新连接重新导向运行正常的终端节点。

用于在线游戏的增强型玩家服务器联网

发展和维持您的在线多玩家游戏社区需要顺畅和具有竞争力的游戏体验。使用 AWS Global Accelerator 沿私有 AWS 网络路由玩家流量,可以提升您的玩家在线体验,降低游戏内延迟、抖动和数据包丢失。支持常用引擎流量加速,如 Unity 和 Unreal。AWS 边缘站点将玩家流量传入并路由至 15+ AWS Global Accelerator 支持区域中任何游戏服务器,提供更快的加载时间和更稳定的游戏内体验。无需打断高可用性 AWS 网络的服务,即可处理您的大型流量高峰,如游戏启动和游戏内活动。

在 AWS 上运行服务通信和 IP 语音

AWS Global Accelerator 通过减少呼叫设置时间的方式来提升您的实时通信 (RTC),同时增加呼叫成功比率和质量。在电信行业,您为应用程序提供延迟敏感的 RTC,包括 IP 语音以及跨多种设备的视频会议。为了支持该功能,使用 Global Accelerator 可允许您运行应用程序协议,如会话启动、沿 AWS 网络的实时和 WebRTC。直接连接至您的流量暂存控制器,以减少网络依赖关系和跳转的数量。这可以在互联网高峰时段和呼叫流量高峰时段稳定您的 RTC 发起人流量。

GA定价

使用 AWS Global Accelerator,您需要为预置的每台加速器以及流经加速器的主方向流量付费。

在账户中运行加速器时,每小时(不足 1 小时按 1 小时算)收取 0.025 USD,直到加速器被删除。

除了对在 AWS 区域中运行的应用程序终端节点收取正常的 EC2 数据传出费用之外,还会收取数据传输附加费。

数据传输附加费如下:

参考文献:

https://aws.amazon.com/cn/blogs/networking-and-content-delivery/achieve-up-to-60-better-performance-for-internet-traffic-with-aws-global-accelerator/

https://aws.amazon.com/cn/blogs/networking-and-content-delivery/improving-real-time-communication-rtc-client-experience-with-aws-global-accelerator/

https://aws.amazon.com/cn/global-accelerator

如需进一步协助或服务,请留言,泰岳云服务会提供自动化工具及专业服务。

企业微信、钉钉接收 Amazon CloudWatch 告警

一、背景介绍

我们看到一些国内的 AWS 用户,在使用企业微信和钉钉作为内部工作沟通平台。他们希望将Amazon CloudWatch 接收到的监控、告警信息发送到企业微信和钉钉等即时通讯工具中,方便统一运维。 Amazon CloudWatch 能够直接以邮件、短信的形式发送告警通知,也可以与 AWS Lambda 结合,通过 Amazon Connect 以电话的形式发送告警通知。

在这篇文章中,我们将会介绍如何通过 Amazon SNS 和 AWS Lambda 来实现将 AWS CloudWatch 告警信息发送到微信和钉钉。

CloudWatch 与 SNS、Lambda 配合使用常见流程如下:
以上架构中, Amazon CloudWatch 作为事件触发器,当它收到告警信息、定时任务、特定事件发生等事件时,它可以直接触发 AWS Lambda 来执行函数内容。业务将消息推送到 SNS ,由 SNS 来触发后续的操作。如: SNS  触发 AWS Lambda 执行、 SNS  发送邮件/短信通知等。

二、方案架构

本方案中 CloudWatch 接收 EC2 运行指标并进行监控。当 EC2 指标超出设定阈值后,CloudWatch 触发告警事件,并将事件消息通过 SNS 发送到 Lambda 函数。Lambda函数执行用户自定义的代码,包括:解析告警消息并发送到企业微信、钉钉机器人、或者 Prometheus 等平台。

架构中 AWS 服务简介:

Amazon CloudWatch  可以用来收集 AWS  包括 EC2 、 RDS 、 EKS 等各种服务运行日志也可以收集用户应用程序日志,可以作为 AWS 上日志数据集散地。同时在 CloudWatch 上可以设置基于指标的告警、基于时间和事件的规则,它可以与 Amazon SNS 和 Lambda 等其他AWS服务进行使用。

AWS Lambda 是无服务器的函数计算服务。通过  AWS Lambda ,无需预置或管理服务器即可运行代码。借助  Lambda ,您几乎可以为任何类型的应用程序或后端服务运行代码,而且完全无需管理。您可以将您的代码设置为自动从其他  AWS  服务如: CloudWatch 、 SNS 等触发,或者直接从任何  Web 或移动应用程序调用。

Amazon SNS 是一项用于应用与应用之间以及应用与人之间通信的完全托管型消息收发服务。

三、使用企业微信接收 CloudWatch 告警

企业微信端设置

  1. 注册企业微信账号
  2. 在企业微信中创建应用

 

   3.创建完成后记录应用 Secret

企业微信告警流程

a) 获取 access_token ,参考微信官方说明文档

示例代码:

tokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
def get_token():
values = {'corpid': ''<corpid>'', 'corpsecret': '<'corpsecret'>'}
req = requests.post(tokenUrl, params=values)
data = json.loads(req.text)
return data["access_token"]

 b) 缓存和刷新 access_token

c) 调用具体的业务接口

示例代码:

sendMsg = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="

def send_msg(msg):
    url = sendMsg + get_token()
    print(url)
    values = """{"touser" : "<成员ID列表>" ,
      "msgtype":"text",
      "agentid":"<企业应用ID>",
      "text":{
        "content": "发送的告警内容!"
      },
      "safe":"0"
      }"""
    requests.post(url, values)

创建 Amazon SNS






确认已订阅

创建AWS Lambda 函数

配置 Lambda 环境变量

新建 corpid 和 corpsecret 环境变量,根据从企业微信获取的值填充。

为Lambda添加触发器:选择上一步创建的SNS作为触发器


打包并上传 Lambda 函数代码:

新建函数文件lambda_function.py,内容如下:

#from botocore.vendored import requests
import requests
import json
import os
tokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
corpid = os.getenv('corpid')
corpsecret = os.getenv('corpsecret')
def get_token():
    values = {'corpid': corpid, 'corpsecret': corpsecret}
    req = requests.post(tokenUrl, params=values)
    data = json.loads(req.text)
    return data["access_token"]
sendMsg = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="
def send_msg(msg):
    url = sendMsg + get_token()
    print(url)
    values = """{"touser" : "@all" ,
      "msgtype":"text",
      "agentid":"<微信应用agentid 替换>",
      "text":{
        "content": "%s"
      },
      "safe":"0"
      }""" % msg
    requests.post(url, values)
def lambda_handler(event, context):
    Message = json.loads(event['Records'][0]['Sns']['Message'])
    OldStateValue = Message['OldStateValue']
    NewStateValue = Message['NewStateValue']
    Timestamp = event['Records'][0]['Sns']['Timestamp']
    NewStateReason = json.loads(event['Records'][0]['Sns']['Message'])['NewStateReason']
    msg = "Alarm Details:n"+"State Change:"+OldStateValue + " -> " + NewStateValue + "n" 
        "Timestamp:" + Timestamp +"n" 
        "Reason for State Change:" + NewStateReason
    print(msg)
    send_msg(msg)

本例中使用 python requests 库发送 post 请求,目前有两种办法实现:

  • 直接使用 vendored 中的 requests ,但该方法2021年1月30日以后将不能使用。故不做推荐。
  • 独立安装 requests 库,需要将包和 lambda 代码一起上传到 AWS Lambda 执行环境。以使用虚拟环境来安装函数依赖为例。参考文档
  1. 创建虚拟环境

python3 -m venv v-env

  1. 激活环境。

source v-env/bin/activate

  1. 使用 pip 安装库

pip install requests

  1. 停用虚拟环境

deactivate

  1. 使用库内容创建一个 ZIP 存档

cd v-env/lib/python3.7/site-packages

  1. 将函数代码添加到存档中
zip -r9 ${OLDPWD}/function.zip .
cd $OLDPWD
zip -g function.zip lambda_function.py
  1. 将二进制 ZIP 部署包上传到Lambda 并更新函数代码

创建EC2 CloudWatch告警并与SNS关联

选择要监控的 EC2 监控选项卡,创建警报。(下图是中国区控制台界面, AWS Global 控制台界面略有不同)

选择前面步骤创建的 SNS 主题,并选择合适的监控告警指标

测试告警接收

给 EC2 增加负载观察 CloudWatch 指标变化和告警情况

如上图所示, CPU 利用率已经超过设定阈值, CloudWatch 发出告警。

在 CloudWatch 日志组中查看 Lambda 日志


收到告警邮件

企业微信收到告警信息

四、使用钉钉接收CloudWatch告警

钉钉群设置

在接收告警信息的钉钉群中添加机器人,以下设置内容同钉钉官方说明:

按照以下步骤添加自定义钉钉机器人并获取 Webhook 地址。

  1. 在PC版钉钉上打开您想要添加报警机器人的钉钉群,并单击右上角的群设置图标。
  2. 群设置面板中单击智能群助手
  3. 智能群助手面板单击添加机器人
  4. 群机器人对话框单击添加机器人区域的图标,然后选择添加自定义

5. 在机器人详情对话框单击添加

6. 在添加机器人对话框中编辑机器人头像和名称,选中必要的安全设置(至少选择一  种),选中我已阅读并同意《自定义机器人服务及免责条款》。单击完成

  1. 添加机器人对话框中复制生成的机器人 Webhook 地址。

创建Amazon SNS

同上述配置企业微信告警 SNS 过程。

创建AWS Lambda

创建Lambda与上述配置企业微信过程基本相同,建议独立安装 requests 包并上传。 Lambda函数内容略有区别。创建钉钉告警 Lambda 环境变量和代码如下:

import requests
import json
def send_msg(msg):
    token = '16a9f365c63bca077649fa06760b73123a9047e678a984926f433cdeec1292ab'
    #token = os.getenv('token')
    url = "https://oapi.dingtalk.com/robot/send?access_token="
    url = url + token
    headers = {'Content-Type': 'application/json'}
    print(url)
    values = """{
      "msgtype":"text",
      "text":{
        "content": "%s"
      }
      }""" %msg
    print(values)
    request = requests.post(url, values,headers=headers)
    return request.text
def lambda_handler(event, context):
    Message = json.loads(event['Records'][0]['Sns']['Message'])
    OldStateValue = Message['OldStateValue']
    NewStateValue = Message['NewStateValue']
    Timestamp = event['Records'][0]['Sns']['Timestamp']
    NewStateReason = json.loads(event['Records'][0]['Sns']['Message'])['NewStateReason']
    msg = "Alarm Details:n"+"State Change:"+OldStateValue + " -> " + NewStateValue + "n" 
        "Timestamp:" + Timestamp +"n" 
        "Reason for State Change:" + NewStateReason
    print(msg)
    send_msg(msg)

告警测试

测试方法同微信告警。给 EC2 增加负载(可以参考命令进行测试:for i in `seq 1 $(cat /proc/cpuinfo | grep “processor” | wc -l)`; do dd if=/dev/zero of=/dev/null & done),观察CloudWatch指标是否超过告警阈值。以下分别是钉钉告警 CloudWatch 日志和钉钉 app 接收到的告警信息示例。

五、总结

Amazon CloudWatch  作为AWS平台上告警和监控信息的集散地,将它与 SNS 、 Lambda 配合,利用 AWS Lambda 函数计算服务灵活的特点,可以将 AWS 服务的监控和告警信息轻松发送到微信、钉钉、 Zabbix 等第三方系统,实现自定义监控告警。

 

本文转自AWS官方博客《企业微信、钉钉接收 Amazon CloudWatch 告警》