当前位置: 首页 > 知识库问答 >
问题:

在KMS加密的SNS中从lambda函数发布

邓越泽
2023-03-14

我试图从一个Python 3.8Lambda函数发布到一个KMS加密的SNS主题。我的lambda的代码是:

import os
import boto3

sns = boto3.client('sns')


def handler(event, context):
    message = 'Hello world'

    response = sns.publish(
        TopicArn='<My topic ARN>',
        Message=message,
    )

如果SNS没有加密,代码可以完美地工作······

...但是当我通过以下选项加密SNS主题时:

在执行lambda时,我得到以下错误:

{“errorMessage”:“调用发布操作时发生错误(KMSNotFound):无效键号AWS/SNS(服务:AWSKMS;状态代码:400;错误代码:NotFoundException;请求ID:d81234100-9cb4-4af2-0032-c4a568a955f4)”,“errorType”:“KmsnotFoundException”,“StackTrace”:[“File\”/var/task/lambda.py\“,第10行,在处理程序中\n boto3.client('sns').Publish(\n”,“File\”._make_api_call(operation_name,kwargs)\n“,”File“/var/runtime/botocore/client.py”,第626行,在_make_api_call\n引发error_class(parsed_response,operation_name)\n“]}

我在代码中遗漏了什么?

共有1个答案

边国安
2023-03-14

AWS支持人员善意地指出,我在lambda执行角色中缺少KMS权限。

Lambda函数执行角色必须具有以下内容才能在SNS中发布加密主题:

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:GenerateDataKey",
      "kms:Decrypt"
    ],
    "Resource": "<the-key-with-which-the-topic-is-encrypted>"
  }
}
 类似资料:
  • 我无法解决问题,而且文件也没有什么帮助。 我有一个lambda需要使用KMS解密一个值。我正在使用sam部署我的lambda。最初我尝试添加策略声明

  • 我是AWS Lambda函数的新手。我需要在AWS Lambeda上完成一些工作 众所周知,如果AWS Cloudwatch违反阈值,它会触发一个特定的警报,但它会一次性发出SNS通知,但假设如果cpu利用率在1小时内保持在70%以上,我们不会在Cloud watch警报中收到任何通知,下次我们将只有在cpu利用率回到低于阈值状态时才会收到通知。 所以被放在帮手,所以如果有人可以帮助我写一个lam

  • 我正在使用Amazon AWS开发一个应用程序,我试图实现的是将lambda函数附加到DynamoDB表,因此在添加新行后,触发lambda函数。在上面提到的lambda函数中,我想添加使用Amazon SNS服务发送消息推送的功能,但我在他们的留档中找不到任何信息,如果可以的话,如果可以的话,到底需要做些什么才能让它工作?我在他们的留档中发现的是,您可以将lambda函数触发器附加到SNS主题,

  • 我是AWS KMS(钥匙管理服务)的新手。 目前,我想创建一个启用服务器端加密(SSE)并将消息发布到订阅Amazon SQS队列的SNS。 Cloudformation的资源部分如下:(未显示CMK密钥和SNS Arn) 如您所见,只有SNS主题启用了SSE,但SQS只是订阅SNS主题。 当我试图将消息发布到SNS主题时。SQS队列(MySQS)可以成功接收消息,但其主体似乎未加密(仍为人类可读

  • 我正在使用Lambda函数将消息推送到SQS队列。消息放入SQS队列后,我需要触发其他Lambda函数来处理队列中的消息。 我认为我们可以使用SNS实现这一点。我是AWS服务新手,请建议在SNS的帮助下基于SQS队列消息触发Lambda函数的解决方案。

  • 所有服务都在欧盟西部1区。我知道发布到SNS的代码是正确的,因为它在非VPC环境中运行时可以工作。我要发布到的ARN保持不变:。 我知道可以设置NAT服务器来避免这个问题,但如果可能的话,我更愿意使用VPCendpoint来降低成本。