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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:42:38