AWS Amplify中notifFunc调用SNS:Publish权限不足,如何解决?
解决AWS Amplify函数调用SNS Publish接口的权限错误
我在AWS Amplify项目中拥有一个名为notifFunc的函数,尝试通过AWS.SNS()类调用SNS:Publish接口直接向指定手机号发送短信(而非通过AWS Topic)。运行amplify mock function notifFunc测试该函数时,收到如下错误:
{ "statusCode": 400, "headers": { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "*" }, "body": "{\"message\":\"User: arn:aws:sts::<AWS_ACCOUNT_ID>:assumed-role/<SERVER_REGION>/amplifyadmin is not authorized to perform: SNS:Publish on resource: <PHONE_NUMBER> because no identity-based policy allows the SNS:Publish action\",\"code\":\"AuthorizationError\",\"time\":\"2023-08-28T15:41:49.680Z\",\"requestId\":\"cd03bfc8-2668-5c9b-a8a9-e2aee41584c3\",\"statusCode\":403,\"retryable\":false,\"retryDelay\":0.4495027262455986}" }
调用SNS:Publish的代码如下:
const AWS = require('aws-sdk') const sns = new AWS.SNS() exports.handler = async (event) => { const contact = event.body.contact let response = { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': '*', }, body: JSON.stringify(`Message sent to ${contact}.`) }; try { let params = { Message: 'This is a test message.', PhoneNumber: contact, } const resp = await sns.publish(params).promise() console.log(resp) } catch (error) { return { statusCode: 400, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': '*', }, body: JSON.stringify(error) } } return response };
解决方案
方法一:通过Amplify CLI配置(推荐)
Amplify管理的资源优先用CLI配置,能保证本地与云端权限同步:
- 打开项目根目录,运行命令:
amplify update function - 选择要修改的函数
notifFunc - 选择
Lambda function permissions选项 - 选择
Add permissions for Amazon SNS - 勾选
Publish操作 - 资源范围选择:
- 测试环境可选择
All resources - 生产环境建议选
Specific resources,输入目标手机号(格式需带国家区号,如+8613800138000)
- 测试环境可选择
- 完成配置后运行
amplify push,权限会自动同步到云端及本地mock环境
方法二:AWS控制台手动配置
如果需要直接在控制台调整权限:
- 打开IAM控制台,找到该Lambda函数对应的执行角色:
- 从错误信息中的ARN(
arn:aws:sts::<AWS_ACCOUNT_ID>:assumed-role/<ROLE_NAME>/amplifyadmin)提取<ROLE_NAME>,搜索该角色名
- 从错误信息中的ARN(
- 进入角色的权限策略页面,点击
添加权限->创建内联策略 - 切换到
JSON模式,输入以下策略(替换<PHONE_NUMBER>为目标手机号):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:*:*:<PHONE_NUMBER>" } ] }
- 给策略命名(如
SNSPublishToTargetPhone),点击创建策略完成配置
注意事项
- 手机号必须使用国际格式,包含国家代码前缀(如中国手机号为
+86xxxxxxxxx) - 生产环境避免使用
*作为资源范围,严格限制可发送短信的手机号,降低权限风险 - 若使用Amplify mock测试,确保运行
amplify push后再重新启动mock服务,保证权限生效
内容的提问来源于stack exchange,提问作者A.J. Peppers
相关产品推荐
相关产品推荐

