我们的服务目前使用AWS的SNS SMS向用户发送交易文本(即帐户确认,密码重置等)。我们还有至少两个环境 - 开发和生产 - 使用相同的SNS SMS服务,因为两个环境都在同一个AWS账户和区域中运行。
我们正在通过Lambda摄取CloudWatch故障日志,在我们的数据库中记录SMS退回信息;但是,我们无法区分出Dev用于测试目的的反弹与基于这些日志的用户生产中的合法反弹。
目标是能够通过环境区分反弹,以便我们可以在相应的数据库中正确记录它们;但是,除了使用单独的帐户或可能其他地区之外,我在SNS或CloudWatch中没有看到任何方法。
是否有人知道如何实现我们的目标,而无需诉诸单独的帐户甚至地区?
答案 0 :(得分:0)
每次通过AWS SNS发送SMS时,您都可以将结果存储在PublishResult对象中,该对象包含消息的消息ID,如以下示例代码所示,该代码取自SNS文档:
public static void main(String[] args) {
AmazonSNSClient snsClient = new AmazonSNSClient();
String message = "My SMS message";
String phoneNumber = "+1XXX5550100";
Map<String, MessageAttributeValue> smsAttributes =
new HashMap<String, MessageAttributeValue>();
//<set SMS attributes>
sendSMSMessage(snsClient, message, phoneNumber, smsAttributes);
}
public static void sendSMSMessage(AmazonSNSClient snsClient, String message,
String phoneNumber, Map<String, MessageAttributeValue> smsAttributes) {
PublishResult result = snsClient.publish(new PublishRequest()
.withMessage(message)
.withPhoneNumber(phoneNumber)
.withMessageAttributes(smsAttributes));
System.out.println(result); // Prints the message ID.
}
控制台输出: {MessageId:9b888f80-15f7-5c30-81a2-c4511a3f5229}
您如何使用此信息取决于许多注意事项,例如在生产和开发环境中运行代码的主机数量,发送消息后您希望访问此数据的速度,数据保留,可伸缩性以及方式您计划存储CloudWatch日志。
可能的解决方案:
解决方案取决于您的需求。 AWS拥有无数的数据存储解决方案,可用于存储您的消息ID;简单存储(S3),NoSQL数据库(如DynamoDB),甚至是数据仓库集群解决方案(如AWS Redshift)。一个示例是使用Kinesis Firehose将您的数据流式传输到S3存储桶,其中包含您的消息ID(以及您在发布时可能要存储的任何其他相关信息)作为序列化JSON对象。这样做的好处是成本非常低,您可以使用AWS Athena轻松查询S3对象。
根据您使用和访问CloudWatch日志的方式,其他数据库可能更合适。
披露:我在负责短信发送的AWS团队工作。
答案 1 :(得分:-1)
坦率地说,您必须通过代码使用消息 ID 自己处理它,如 Aws 人员所述。
这是一个简单的用例,我不明白为什么 AWS 可以支持它。