You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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控制台手动配置

如果需要直接在控制台调整权限:

  1. 打开IAM控制台,找到该Lambda函数对应的执行角色:
    • 从错误信息中的ARN(arn:aws:sts::<AWS_ACCOUNT_ID>:assumed-role/<ROLE_NAME>/amplifyadmin)提取<ROLE_NAME>,搜索该角色名
  2. 进入角色的权限策略页面,点击添加权限 -> 创建内联策略
  3. 切换到JSON模式,输入以下策略(替换<PHONE_NUMBER>为目标手机号):
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "arn:aws:sns:*:*:<PHONE_NUMBER>"
        }
    ]
}
  1. 给策略命名(如SNSPublishToTargetPhone),点击创建策略完成配置

注意事项

  • 手机号必须使用国际格式,包含国家代码前缀(如中国手机号为+86xxxxxxxxx)
  • 生产环境避免使用*作为资源范围,严格限制可发送短信的手机号,降低权限风险
  • 若使用Amplify mock测试,确保运行amplify push后再重新启动mock服务,保证权限生效

内容的提问来源于stack exchange,提问作者A.J. Peppers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:43:36