如何通过SNS和Cloudwatch发送短信?

时间:2019-06-21 10:50:07

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

当我的EC2实例停止时,我正在尝试向手机发送短信。

  1. 我正在自动停止EC2实例,现在我想在停止时将SMS发送到我的手机。
  2. 我用手机号码创建了SNS主题。作为订户。
  3. EC2停止时我创建了一个警报。
  4. 在SNS下>移动>文本消息(SMS)>文本消息首选项(编辑):

a。我选择“默认消息类型”作为“事务”。

b。我创建了一个新的IAM角色。

IAM角色政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:PutMetricFilter",
                "logs:PutRetentionPolicy"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

SNS主题访问策略

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:Publish",
        "SNS:RemovePermission",
        "SNS:SetTopicAttributes",
        "SNS:DeleteTopic",
        "SNS:ListSubscriptionsByTopic",
        "SNS:GetTopicAttributes",
        "SNS:Receive",
        "SNS:AddPermission",
        "SNS:Subscribe"
      ],
      "Resource": "arn:aws:sns:us-west-2:account-id:sns-topic-name",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "account-id"
        },
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:cloudwatch:us-west-2:account-id:alarm:*"
        }
      }
    }
  ]
}

触发警报时,出现以下错误:

{
  "actionState": "Failed",
  "stateUpdateTimestamp": 1561102479560,
  "notificationResource": "arn:aws:sns:us-west-2:account-id:sns-topic-name",
  "publishedMessage": null,
  "error": "Resource: arn:aws:cloudwatch:us-west-2:account-id:alarm:alarm-name is not authorized to perform: SNS:Publish on resource: arn:aws:sns:us-west-2:account-id:sns-topic-name"
}

我无法理解它需要什么许可。

2 个答案:

答案 0 :(得分:1)

错误原因很可能是由于该策略的值不正确。我不确定为保护敏感值而更改了哪些值,但是您需要更新sns-topic-nameaccount-id

但是,我建议您实现目标的另一种方式...

您可以使用 Amazon CloudWatch Events 查找特定事件(例如,实例将状态更改为“已停止”),并使其直接向Amazon SNS发送消息(不使用警报)。 / p>

步骤是:

  • 在Amazon CloudWatch控制台中,单击规则
  • 创建规则
  • 服务名称: EC2
  • 事件类型: EC2实例状态更改通知
  • 特定状态:已停止
  • 选择任何实例特定实例ID
  • 在右侧的目标下,单击添加目标
  • SNS主题
  • 选择您的主题

CloudWatch Events - Create Rule

这将在实例停止时发送一条消息。

答案 1 :(得分:0)

该错误似乎是由于IAM角色缺少将消息发布到SNS主题的权限所致。安排将必要的权限附加到您使用的角色或用户身上,如下所示:

 {
  "Id": "Policy1415489375392",
  "Statement": [
    {
      "Sid": "AWSConfigSNSPolicy20150201",
      "Action": [
        "SNS:Publish"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:sns:region:account-id:myTopic",
      "Principal": {
        "AWS": [
          "account-id1",
          "account-id2",
          "account-id3",
        ]
      }
    }
  ]
}