我有一个使用客户管理的 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 内容?非常感谢任何帮助。