如何让 lambda 从使用 KMS 加密的 S3 存储桶中获取对象

问题描述 投票:0回答:0

我有一个使用客户管理的 kms 密钥加密的 s3 存储桶,SES 服务也使用该密钥将邮件保存到加密的 s3 存储桶中。 SES根据messageID调用lambda函数从s3 bucket中获取mail(object)并进行处理。 Lambda 能够获取邮件,但采用加密格式。

以下是lambda执行角色策略:

{
    "Statement": [
        {
            "Action": [
                "s3:GetObject",
                "s3:ListBucket",
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::bucket-name/*",
                "arn:aws:kms:us-east-1:576635234322:key/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
            ]
        }
    ],
    "Version": "2012-10-17"
}

lambda 代码(在 python 3.8 中)如下:

import json
import boto3

s3 = boto3.client('s3')
kms = boto3.client('kms')

def lambda_handler(event, context):
    message_id = event['Records'][0]['ses']['mail']['messageId']
    bucket_name = 'bucket-name'
    object_key = f'mails/{message_id}'

    try:
        # Get the S3 object metadata
        response = s3.head_object(Bucket=bucket_name, Key=object_key)

        kms_key_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
        # Decrypt the S3 object using the KMS key

        decrypted_object = s3.get_object(Bucket=bucket_name, Key=object_key, SSECustomerKey=kms_key_id, SSECustomerAlgorithm='AES256')
        
        # print('Decrypted S3 object:', decrypted_object)
        print(decrypted_object['Body'].read())
        
    
    except Exception as e:
        print('Error processing S3 object:', str(e))
    
    return {
        'statusCode': 200,
        'body': json.dumps('Success')
    }

错误: 处理 S3 对象时出错:调用 GetObject 操作时发生错误(InvalidRequest):加密参数不适用于此对象。

这个问题的任何解决方案,以便 lambda 可以解密和读取 s3 内容?非常感谢任何帮助。

amazon-web-services amazon-s3 aws-lambda amazon-ses amazon-kms
© www.soinside.com 2019 - 2024. All rights reserved.