title: AWS Lambda : "Parameter validation failed"
body: <p>I have a lambda fucntion where I am sending email and the mail template is fetching as an object from an S3 bucket. I have ran the code locally in my computer and I works fine. When I paste it inside my lambda function, it shows following error. </p>
  
  <pre><code>Response:
  {
    "errorMessage": "Parameter validation failed:\nInvalid type for parameter Message.Body.Html.Data, value: b\"&lt;html&gt;\\n&lt;head&gt;&lt;/head&gt;\\n&lt;body&gt;\\n  &lt;h1&gt;Amazon SES Test (SDK for Python)&lt;/h1&gt;\\n  &lt;p&gt;This email was sent with\\n    &lt;a href='https://aws.amazon.com/ses/'&gt;Amazon SES&lt;/a&gt; using the\\n    &lt;a href='https://aws.amazon.com/sdk-for-python/'&gt;\\n      AWS SDK for Python (Boto)&lt;/a&gt;.&lt;/p&gt;\\n&lt;/body&gt;\\n&lt;/html&gt;\", type: &lt;class 'bytes'&gt;, valid types: &lt;class 'str'&gt;",
    "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"&lt;html&gt;\n&lt;head&gt;&lt;/head&gt;\n&lt;body&gt;\n  &lt;h1&gt;Amazon SES Test (SDK for Python)&lt;/h1&gt;\n  &lt;p&gt;This email was sent with\n    &lt;a href='https://aws.amazon.com/ses/'&gt;Amazon SES&lt;/a&gt; using the\n    &lt;a href='https://aws.amazon.com/sdk-for-python/'&gt;\n      AWS SDK for Python (Boto)&lt;/a&gt;.&lt;/p&gt;\n&lt;/body&gt;\n&lt;/html&gt;", type: &lt;class 'bytes'&gt;, valid types: &lt;class 'str'&gt;: 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"&lt;html&gt;\n&lt;head&gt;&lt;/head&gt;\n&lt;body&gt;\n  &lt;h1&gt;Amazon SES Test (SDK for Python)&lt;/h1&gt;\n  &lt;p&gt;This email was sent with\n    &lt;a href='https://aws.amazon.com/ses/'&gt;Amazon SES&lt;/a&gt; using the\n    &lt;a href='https://aws.amazon.com/sdk-for-python/'&gt;\n      AWS SDK for Python (Boto)&lt;/a&gt;.&lt;/p&gt;\n&lt;/body&gt;\n&lt;/html&gt;", type: &lt;class 'bytes'&gt;, valid types: &lt;class 'str'&gt;
  
  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
  </code></pre>
  
  <p>I have checked when I load the template from S3 bucket it shows the following error in lambda. When I declare the BODY_HTML inside my code and not fetch it from S3 in Lambda, it works fine. Here is my code now :</p>
  
  <pre><code>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'])
  </code></pre>
  
  <p>)</p>
  
  <p>It should return the message ID successfully in the <code>Function Logs</code>. Any help on this? I cannot see any logic behind this.</p>