向不同地区的SNS发出CloudWatch警报

时间:2018-07-06 05:12:33

标签: amazon-web-services amazon-sns amazon-cloudwatch

我正在尝试通过位于不同区域的CloudWatch警报通知SNS主题。原因是我想要SMS警报,而该警报在我的服务所在的地区不可用。如果输入订阅的ARN并将更改保存在控制台中,则会收到“保存警报时出错。请重试。”重试无济于事。在本地使用主题确实可以,但这不是我所需要的。

是否可以通过其他方式通知主题?如果没有,还有其他简单的方法可以实现我的目标吗?

2 个答案:

答案 0 :(得分:6)

找不到任何明确表示无法完成此操作的文档,但尝试将 us-east-1 中的SNS设置为 eu-west中的警报操作-1 (使用CLI),我得到了:

An error occurred (ValidationError) when calling the PutMetricAlarm operation: Invalid region us-east-1 specified. Only eu-west-1 is supported.

所以我假设它不受支持。

要获得所需的功能,可以使用AWS Lambda。假设您的服务位于不支持SMS的区域,我将使用 eu-central-1 作为示例。

设置如下:

  1. [ us-east-1 ]在支持SMS的区域中创建可以发送SMS消息的SNS主题。
  2. [ eu-central-1 ”创建一个lambda函数,该函数将消息从服​​务所在区域的步骤1开始发送到SNS主题。
  3. [ eu-central-1 ]在您的服务所在的区域中创建一个SNS主题。 对于SNS主题,使用AWS Lambda协议配置预订,并将其指向步骤2中的lambda。
  4. [ eu-central-1 ]在您的服务所在的区域创建警报,并将第3步中的SNS主题作为操作。

答案 1 :(得分:1)

要添加到@Tartaglia的答案中,以下是使用Python 3的这种lambda函数的来源,由于没有时间妥善处理,所以从各种来源将它们拼凑在一起:

import json
import logging

import boto3


logger = logging.getLogger()
logger.setLevel(logging.INFO)


session = boto3.Session(region_name='eu-west-1') # EU (Ireland)
sns_client = session.client('sns')


def lambda_handler(event, context):
    logger.info('Received event: %s', event)

    for record in event['Records']:
        sns_message = record['Sns']

        response = sns_client.publish(
            TopicArn='YOUR TOPIC ARN HERE',
            Subject=sns_message.get('Subject', None),
            Message=sns_message.get('Message', None))

        logger.info('Publish response: %s', response)

    return 'OK'