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

Arc*_*nes 4 amazon-web-services amazon-sns boto3 aws-lambda

我正在尝试从 Python 3.8 Lambda 函数发布到 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,
    )
Run Code Online (Sandbox Code Playgroud)

如果 SNS 未加密,则代码可以完美运行......

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

在此输入图像描述

执行 lambda 时出现以下错误:

{“errorMessage”:“调用发布操作时发生错误 (KMSNotFound):keyId aws/sns 无效(服务:AWSKMS;状态代码:400;错误代码:NotFoundException;请求 ID:d81234100-9cb4-4af2-0032-c4a568a955f4 )", "errorType": "KMSNotFoundException", "stackTrace": [ " 文件 \"/var/task/lambda.py\",第 10 行,处理程序\n boto3.client('sns').publish(\ n", " 文件 \"/var/runtime/botocore/client.py\", 第 316 行,在 _api_call\n 返回 self._make_api_call(operation_name, kwargs)\n", " 文件 \"/var/runtime/botocore /client.py\",第 626 行,在 _make_api_call\n 中引发 error_class(parsed_response, operation_name)\n" ] }

我的代码中缺少什么?

Arc*_*nes 7

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>"
  }
}
Run Code Online (Sandbox Code Playgroud)