【问题标题】:How to send SMS through SNS and Cloudwatch?如何通过 SNS 和 Cloudwatch 发送短信?
【发布时间】:2019-06-24 17:32:44
【问题描述】:

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

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

一个。我选择了“默认消息类型”作为“事务性”。

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

我无法理解它需要什么权限。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    步骤如下:

    • 在 Amazon CloudWatch 控制台中,单击规则
    • 创建规则
    • 服务名称: EC2
    • 事件类型: EC2 实例状态变化通知
    • 具体状态:已停止
    • 选择任何实例特定实例ID
    • 在右侧的Targets下,点击Add target
    • SNS 话题
    • 选择您的主题

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

    【讨论】:

    • 嗨,约翰,我已按照步骤操作,它有效,但对于少数手机号码,它不发送短信。与移动提供商或 AWS 有关吗?
    • 如果它适用于某些数字,但不是每个数字,那么它将超出您的控制范围。 AWS Support可能能够调查。
    【解决方案2】:

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

    【讨论】:

    • 您好 Vishnu,我将 SNS 主题的访问策略更改为您所说的,但它仍然给我同样的错误。我错过了一些非常小的事情吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多