动机:
记住生日对我来说是一项异常艰巨的任务。我没有改善自己和记忆力,而是决定让技术为我解决问题,同时了解运维和系统管理员的神秘世界。我还发现不用于垃圾邮件的自动 SMS 系统非常有趣。在社交媒体接管的短时间内,但手机没有可靠的互联网连接,有短信网关允许用户与互联网互动。一个人可以在 Facebook 上发帖、发推文或获得家庭作业问题的答案——所有这些都无需连接互联网。本着这种精神,我想创建一个长时间运行的脚本,它会定期检查我的名单上是否有即将到来的生日,如果有的话,会向我发送一条消息,说明他们的年龄和生日。
堆栈选择:
我决定使用 Twilio SMS 服务,因为他们有一个不错的免费套餐,允许您以少量信用将消息发送到经过验证的电话号码。有了我所期待的消息数量,我知道我不会很快用完积分。
该 API 非常易于使用,一旦我获得了我的帐户 SID 和身份验证令牌以及确认的电话号码,我就可以很容易地在我的机器上进行测试。我按照建议将凭据存储在环境变量中。
https://www.twilio.com/docs/sms/quickstart/python
您可以在下面看到通过 Twilio 发送 SMS 消息是多么容易。
import os
from twilio . rest import Client
account_sid = os . environ [ 'TWILIO_ACCOUNT_SID' ]
auth_token = os . environ [ 'TWILIO_AUTH_TOKEN' ]
client = Client ( account_sid , auth_token )
message = client . messages \
. create (
body = "Join Earth's mightiest heroes. Like Kevin Bacon." ,
from_ = '+15017122661' ,
to = '+15558675310'
)
print ( message . sid )
在为您可以在此处找到的脚本创建工作脚本和 Docker 容器后: https ://github.com/christophercalm/sms-birthday-reminder ,我决定我需要考虑可能的托管。最简单的解决方案是在我的本地 Windows 机器上运行 Docker 容器,但我知道正常运行时间会很短,因此我想在 AWS 中体验一下。
我发现的纯 AWS 解决方案是将我的容器存储在 Elastic Container Registry 中,并使用 Elastic Container Service 运行容器。
ECR 设置
我使用本指南来设置我的 ECR 帐户和命令行工具。我还必须首先使用 IAM 用户而不是使用根帐户创建细粒度权限。
https://docs.aws.amazon.com/AmazonECR/latest/userguide/get-set-up-for-amazon-ecr.html
安装 CLI 后,我需要配置身份验证,我可以按照此处的文档进行操作: https ://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli- 配置-快速入门-信用-创建
设置好之后。我按照此处的说明创建了一个存储库并推送它。
https://docs.aws.amazon.com/AmazonECS/latest/userguide/create-container-image 。
弹性云服务器设置
在从 ECR 中拉出我的容器之前,我需要将任务执行 IAM 角色添加到将运行容器的 IAM 用户。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html
我选择了 ECS 控制台演练,您可以在访问 ECS 主页后找到它: https ://aws.amazon.com/ecs/getting-started/,而不是使用 Amazon Copilot。这个决定纯粹是为了方便,因为我不想在我的机器上安装另一个 CLI 工具。但就我的目的而言,它运作良好。我不会说创建一个使用 ECS 存储库的容器很直观,但是在摆弄 IAM 权限并找到正确的存储库 URL 之后,我能够在此页面https://docs 的一些帮助下做到这一点。 aws.amazon.com/AmazonECR/latest/userguide/ECR_on_ECS.html
使用 EC2
最后,在意识到 ECS 在免费层中不可用后,我最终将我的脚本托管在带有 EC2 的 Ubuntu 22.04 LTS 容器上。这相对容易设置,但作为对我未来自己的一点说明,密钥生成工具适用于 ubuntu 用户,而不是通过 SSH 登录时的 root 用户。我只是拉入了 git repo 并添加了我的真实数据和 env 文件。然后按照 Dockerfile 中的命令设置 cron 作业和 python 包。
我将 crontab 条目更改为
# must be ended with a new line "LF" (Unix) and not "CRLF" (Windows) # will run at 6pm (Central = UTC - 5) 0 23 * * * cd /app && /usr/local/bin/python3 send-birthday-sms.py >/dev/null 2>&1 | logger -t python-sms
将脚本记录到 syslog 而不是 Docker 输出文件。在创建 cronjob 时我注意到的另一件事是所有容器和 ec2 机器都默认使用 UTC 运行,所以我只是调整了我想要的时间。
尽管由于成本原因我最终没有永久使用 ECS 和 ECR 堆栈,但我可以看到它们对于设置根据需要自动提供和自动扩展的服务非常有用。
原文: https://thoughtscollected.tech/posts/automated-sms-with-twilio-ecs-ecr/