首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AWS Lambda:“参数验证失败”

AWS Lambda:“参数验证失败”
EN

Stack Overflow用户
提问于 2019-07-24 10:20:37
回答 1查看 14K关注 0票数 1

我有一个lambda函数,我在其中发送电子邮件,邮件模板作为对象从S3桶中获取。我已经在我的电脑中本地运行了代码,而且我工作得很好。当我将它粘贴到lambda函数中时,它会显示以下错误。

代码语言:javascript
运行
复制
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

我检查了从S3桶加载模板时,它在lambda中显示了以下错误。当我在代码中声明BODY_HTML而不从Lambda中的S3获取它时,它工作得很好。下面是我的代码:

代码语言:javascript
运行
复制
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'])

)

它应该在Function Logs中成功返回消息ID。在这方面有什么帮助吗?我看不出背后有什么逻辑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-24 10:55:26

很难相信第二个代码能够工作,因为它包含的错误与第一个错误日志中报告的错误相同。我复制了代码,它也以同样的方式失败了。

可以通过从错误日志读取此消息来发现问题。

参数Message.Body.Html.Data的无效类型,值:B“. ",类型:类字节,有效类型:类'str':ParamValidationError。

主体应该是字符串类型,但object_content类型

代码语言:javascript
运行
复制
object_content = s3_response['Body'].read()

类型为字节。你需要把它转换成字符串。例如BODY_HTML = str(object_content)

重要

不要在代码中存储永久凭据,而不是

代码语言:javascript
运行
复制
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')

通过lambda执行角色将权限授予您的Lambda函数。

如果您需要提供对lambda函数的跨帐户访问,则在该角色中包含sts:AssumeRole权限,然后使用通过调用sts:AssumeRole获得的临时凭据。

代码语言:javascript
运行
复制
client = boto3.client(
    'ses',
    aws_access_key_id=...,
    aws_secret_access_key=...,
    aws_session_token=... // !!!
)

但是,从不在函数代码中存储永久凭据。您确定下次将代码放入某个公共存储库时,您不会忘记用******替换这些值吗?每次?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57180610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档