AWS SNS订阅SQS队列异常:部分创建方式失效求助
AWS SNS订阅SQS队列异常问题排查与修复
问题现象
将SNS主题订阅至SQS队列时,不同创建方式结果差异明显,但订阅完成后所有参数完全一致:
- ✅ AWS控制台操作:先创建主题、队列,再从队列端发起订阅,消息推送正常。
- ❌ 主题端创建订阅:无法正常接收消息。
- ❌ PHP代码创建订阅:同样无法正常工作,代码示例:
$this->snsClient->subscribe([ 'TopicArn' => $this->topicArn, 'Protocol' => 'sqs', 'Endpoint' => $queueArn, 'Attributes' => [ 'FilterPolicy' => json_encode(['eventName' => [$event]]), 'RawMessageDelivery' => 'true' ] ]);
此前通过手动按有效方式解决过类似问题,但本次需要动态创建,无法依赖手动操作,需定位问题根源。
修复方案
问题源于SQS队列缺少允许SNS发送消息的权限策略:从队列端创建订阅时,AWS控制台会自动为队列添加对应的权限策略;但从主题端或通过代码创建订阅时,不会自动配置该策略,导致SNS无法向队列推送消息。
以下是PHP实现的权限配置代码:
// 定义允许SNS向SQS队列发送消息的策略 $policy = json_encode([ 'Version' => '2012-10-17', 'Statement' => [ [ 'Sid' => 'SQSPolicyAllowSNSMessages', 'Effect' => 'Allow', 'Principal' => ['Service' => 'sns.amazonaws.com'], 'Action' => 'sqs:SendMessage', 'Resource' => $queueArn, 'Condition' => [ 'ArnLike' => [ 'aws:SourceArn' => $this->topicArn ] ] ] ] ]); // 为SQS队列设置权限策略 $this->sqsClient->setQueueAttributes([ 'QueueUrl' => $queueUrl, 'Attributes' => [ 'Policy' => $policy ] ]);
内容的提问来源于stack exchange,提问作者xdev
相关产品推荐
相关产品推荐

