Python3.8 Lambda发布至KMS加密SNS报错,代码缺失什么?
解决Lambda向KMS加密SNS主题发消息时的KMSNotFound错误
嘿,我之前也碰到过类似的问题,咱们来拆解这个错误!错误提示说找不到aws/sns这个KMS密钥,背后主要是两个常见原因,一步步来解决:
1. 区域不匹配坑了你
AWS托管的aws/sns密钥是区域专属的——每个AWS区域都有自己独立的这个密钥。如果你的Lambda函数部署的区域和SNS主题所在区域不一样,Lambda会去自己的区域找aws/sns密钥,但这个密钥要么不存在,要么和SNS用的不是同一个,自然就报NotFound了。
怎么修?
初始化SNS客户端时明确指定和SNS主题一致的区域就行:
import os import boto3 def handler(event, context): # 替换成你的SNS主题所在的区域,比如us-east-1、ap-southeast-1 sns = boto3.client('sns', region_name='<你的SNS区域>') message = 'Hello world' response = sns.publish( TopicArn='<My topic ARN>', Message=message, ) return response
2. Lambda执行角色缺KMS权限
就算区域匹配了,Lambda的执行角色也得有访问这个KMS密钥的权限才能完成加密发布。默认情况下,Lambda角色不会自动获得KMS的操作权限,所以会被拒绝(这里表现为找不到密钥,本质是权限不足)。
怎么加权限?
给Lambda的执行角色添加上这个IAM策略(记得替换占位符为你的实际区域和账号ID):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:<你的区域>:<你的AWS账号ID>:key/aws/sns" } ] }
如果你的SNS用的是自定义KMS密钥(不是默认的aws/sns),那还要额外确保这个自定义密钥的密钥策略里允许Lambda执行角色访问——在密钥的权限设置里添加对应的信任条目就行。
最后再检查下
- 确认SNS主题用的是默认密钥还是自定义密钥,别搞混了资源ARN
- 检查Lambda执行角色的信任关系,确保AWS Lambda服务能正常扮演这个角色
内容的提问来源于stack exchange,提问作者Arcones
相关产品推荐
相关产品推荐

