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

How to send SMS through SNS and Cloudwatch?

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

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

一个。我选择 "Default message type" 作为 "Transactional".

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"
}

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

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

但是,我会推荐另一种实现目标的方法...

您可以使用 Amazon CloudWatch Events 来查找特定事件(例如实例将状态更改为已停止)并让它直接向 Amazon SNS 发送消息(无需使用闹钟)。

步骤是:

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

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

错误似乎是由于您的 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",
        ]
      }
    }
  ]
}