Pro*_*ova 1 python amazon-web-services boto3 aws-lambda
我有一个 lambda 函数,我在其中发送电子邮件,并且邮件模板作为对象从 S3 存储桶中获取。我已经在我的计算机本地运行了代码并且工作正常。当我将其粘贴到 lambda 函数中时,它显示以下错误。
Response:
{
"errorMessage": "Parameter validation failed:\nInvalid type for parameter Message.Body.Html.Data, value: b\"<html>\\n<head></head>\\n<body>\\n <h1>Amazon SES Test (SDK for Python)</h1>\\n <p>This email was sent with\\n <a href='https://aws.amazon.com/ses/'>Amazon SES</a> using the\\n <a href='https://aws.amazon.com/sdk-for-python/'>\\n AWS SDK for Python (Boto)</a>.</p>\\n</body>\\n</html>\", type: <class 'bytes'>, valid types: <class 'str'>",
"errorType": "ParamValidationError",
"stackTrace": [
[
"/var/task/lambda_function.py",
65,
"lambda_handler",
"Source=SENDER,"
],
[
"/var/runtime/botocore/client.py",
314,
"_api_call",
"return self._make_api_call(operation_name, kwargs)"
],
[
"/var/runtime/botocore/client.py",
586,
"_make_api_call",
"api_params, operation_model, context=request_context)"
],
[
"/var/runtime/botocore/client.py",
621,
"_convert_to_request_dict",
"api_params, operation_model)"
],
[
"/var/runtime/botocore/validate.py",
291,
"serialize_to_request",
"raise ParamValidationError(report=report.generate_report())"
]
]
}
Request ID:
"7b13a612-97f6-4278-9825-724abeaa3b51"
Function Logs:
START RequestId: 7b13a612-97f6-4278-9825-724abeaa3b51 Version: $LATEST
Parameter validation failed:
Invalid type for parameter Message.Body.Html.Data, value: b"<html>\n<head></head>\n<body>\n <h1>Amazon SES Test (SDK for Python)</h1>\n <p>This email was sent with\n <a href='https://aws.amazon.com/ses/'>Amazon SES</a> using the\n <a href='https://aws.amazon.com/sdk-for-python/'>\n AWS SDK for Python (Boto)</a>.</p>\n</body>\n</html>", type: <class 'bytes'>, valid types: <class 'str'>: ParamValidationError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 65, in lambda_handler
Source=SENDER,
File "/var/runtime/botocore/client.py", line 314, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/var/runtime/botocore/client.py", line 586, in _make_api_call
api_params, operation_model, context=request_context)
File "/var/runtime/botocore/client.py", line 621, in _convert_to_request_dict
api_params, operation_model)
File "/var/runtime/botocore/validate.py", line 291, in serialize_to_request
raise ParamValidationError(report=report.generate_report())
botocore.exceptions.ParamValidationError: Parameter validation failed:
Invalid type for parameter Message.Body.Html.Data, value: b"<html>\n<head></head>\n<body>\n <h1>Amazon SES Test (SDK for Python)</h1>\n <p>This email was sent with\n <a href='https://aws.amazon.com/ses/'>Amazon SES</a> using the\n <a href='https://aws.amazon.com/sdk-for-python/'>\n AWS SDK for Python (Boto)</a>.</p>\n</body>\n</html>", type: <class 'bytes'>, valid types: <class 'str'>
END RequestId: 7b13a612-97f6-4278-9825-724abeaa3b51
REPORT RequestId: 7b13a612-97f6-4278-9825-724abeaa3b51 Duration: 1608.47 ms Billed Duration: 1700 ms Memory Size: 128 MB Max Memory Used: 71 MB
Run Code Online (Sandbox Code Playgroud)
我检查过,当我从 S3 存储桶加载模板时,它在 lambda 中显示以下错误。当我在代码中声明 BODY_HTML 并且不从 Lambda 中的 S3 获取它时,它工作正常。现在这是我的代码:
import json
import os
import boto3
from botocore.exceptions import ClientError
SENDER = "***********"
RECIPIENT = "************"
AWS_REGION = "us-east-1"
def lambda_handler(event, context):
CHARSET = "UTF-8"
client = boto3.client('ses',aws_access_key_id=******,
aws_secret_access_key=*****,region_name='us-east-1')
s3_client = boto3.client('s3',aws_access_key_id=*********,
aws_secret_access_key=***********,region_name='us-east-1')
s3_response_object = s3_client.get_object(Bucket='my s3 bucket', Key='template.html')
object_content = s3_response_object['Body'].read()
BODY_HTML = object_content
SUBJECT = "sqs-poc-lambda test email"
BODY_TEXT = ("This is a test email for sqs-poc-lambda"
)
try:
#Provide the contents of the email.
response = client.send_email(
Destination={
'ToAddresses': [
RECIPIENT,
],
},
Message={
'Body': {
'Html': {
'Charset': CHARSET,
'Data': BODY_HTML,
},
'Text': {
'Charset': CHARSET,
'Data': BODY_TEXT,
},
},
'Subject': {
'Charset': CHARSET,
'Data': SUBJECT,
},
},
Source=SENDER,
)
except ClientError as e:
print(e.response['Error']['Message'])
else:
print("Email sent! Message ID:"),
print(response['MessageId'])
Run Code Online (Sandbox Code Playgroud)
)
它应该在Function Logs. 对此有什么帮助吗?我看不出这背后有任何逻辑。
很难相信第二个代码可以工作,因为它包含第一个错误日志中报告的相同错误。我已经复制了代码,但它以同样的方式失败。
通过从错误日志中读取此消息可以发现问题。
参数 Message.Body.Html.Data 的类型无效,值:b"...",类型:类字节,有效类型:类“str”:ParamValidationError。
主体应该是字符串类型,但是object_content
object_content = s3_response['Body'].read()
Run Code Online (Sandbox Code Playgroud)
是字节类型。您需要将其转换为字符串。例如BODY_HTML = str(object_content)
重要的
不要在 lambda 代码中存储永久凭据。
client = boto3.client('ses',aws_access_key_id=******,
aws_secret_access_key=*****,region_name='us-east-1')
s3_client = boto3.client('s3',aws_access_key_id=*********,
aws_secret_access_key=***********,region_name='us-east-1')
Run Code Online (Sandbox Code Playgroud)
通过 Lambda 执行角色向您的 lambda 函数授予权限。
如果您需要提供对 lambda 函数的跨帐户访问,请sts:AssumeRole在该角色中包含权限,然后使用通过调用获得的临时凭据sts:AssumeRole
client = boto3.client(
'ses',
aws_access_key_id=...,
aws_secret_access_key=...,
aws_session_token=... // !!!
)
Run Code Online (Sandbox Code Playgroud)
但同样,永远不要在函数代码中存储永久凭据。您确定下次将代码放入某个公共存储库时不会忘记将这些值替换为 吗******?每一次?
| 归档时间: |
|
| 查看次数: |
20789 次 |
| 最近记录: |