AWS Lambda发送指定号码SMS的IAM角色权限配置咨询
解决方案:AWS Lambda向指定手机号发送SMS的最小权限实现
核心思路
通过限定IAM角色的SNS资源范围,让Lambda仅能向指定手机号发送短信,既避免通配符权限过大,又无需创建IAM用户密钥。SNS的SMS资源格式为arn:aws:sns:区域ID:AWS账号ID:带国际区号的手机号,直接将目标手机号对应的ARN写入策略即可实现最小权限控制。
步骤1:配置Lambda执行角色的IAM策略
创建或修改Lambda的执行角色,附加以下自定义策略(替换示例中的区域、账号ID和实际手机号):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sns:Publish", "Resource": [ "arn:aws:sns:us-east-1:123456789012:+1333xxxxxxx", "arn:aws:sns:us-east-1:123456789012:+1444xxxxxxx" ] } ] }
步骤2:Lambda函数代码示例(Python)
在函数中根据日期逻辑选择目标手机号,调用SNS发送短信:
import boto3 from datetime import datetime def lambda_handler(event, context): sns_client = boto3.client('sns') # 替换为实际带国际区号的手机号 my_mobile = "+1333xxxxxxx" partner_mobile = "+1444xxxxxxx" today = datetime.today().day # 根据日期逻辑确定发送对象和内容 if today == 1: target = my_mobile msg = "每月1号提醒:你的待办任务已更新" elif today == 15: target = partner_mobile msg = "每月15号提醒:需与合作伙伴同步进度" else: return {"statusCode": 200, "body": "今日无需发送短信"} response = sns_client.publish(PhoneNumber=target, Message=msg) return {"statusCode": 200, "body": f"短信已发送至{target},消息ID:{response['MessageId']}"}
关键注意事项
- 手机号必须带国际区号(如中国手机号为
+8613xxxxxxxxx),否则SNS无法识别发送目的地。 - 若后续需新增目标手机号,只需在IAM策略的
Resource列表中添加对应手机号的ARN即可。 - 此方案遵循AWS权限最小化原则,Lambda仅拥有向指定号码发送短信的权限,无额外风险。
内容的提问来源于stack exchange,提问作者Dora
相关产品推荐
相关产品推荐

