CloudWatch向不同地区的SNS报警

问题描述 投票:0回答:2

我正在尝试从位于不同区域的 CloudWatch 警报通知 SNS 主题。原因是我需要短信提醒,但我的服务所在地区不提供短信提醒。如果我输入订阅的 ARN 并在控制台中保存更改,我会收到“保存警报时出错。请重试”。再试一次也没有帮助。使用本地区域的主题确实有效,但这不是我需要的。

有没有办法通知不同地区的主题?如果没有,还有其他简单的方法可以实现我的目标吗?

amazon-web-services amazon-sns amazon-cloudwatch
2个回答
13
投票

没有找到任何文档明确说明这是无法完成的,但尝试使用 CLI 将 us-east-1 中的 SNS 设置为 eu-west-1 中的警报操作,我得到了这个:

调用 PutMetricAlarm 操作时发生错误(ValidationError):指定的区域 us-east-1 无效。仅支持 eu-west-1。

所以我假设它不受支持。

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

设置将如下所示:

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

4
投票

为了补充 @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'
© www.soinside.com 2019 - 2024. All rights reserved.