异地SNS CloudWatch告警

CloudWatch alarm to SNS in different region

我正在尝试从位于不同区域的 CloudWatch 警报通知 SNS 主题。原因是我想要短信提醒,我的服务所在地区没有。如果我输入订阅的 ARN 并在控制台中保存更改,我会收到 "There was an error saving the alarm. Please try again." 重试无济于事。在本地使用主题确实有效,但这不是我需要的。

有没有办法通知不同地区的主题?如果没有,是否有另一种简单的方法可以实现我的目标?

没有找到任何明确说明不能这样做的文档,但尝试从 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 主题作为操作。

为了补充@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'