Skip to content

Bug: CodePipeline Event Data Class incorrectly handles optional User Configuration #2117

Closed
@neilramsay

Description

@neilramsay

Expected Behaviour

On a CodePipeline Job Data Class, accessing either decoded_user_parameters or user_parameters should return None if no User Parameters were supplied.

Current Behaviour

Attempting to call decoded_user_parameters or user_parameters, when none were supplied, causes a KeyError to occur.

The AWS CodePipeline Lambda Action does not require UserParameters, however the CodePipeline Event Data Class expects it to be set, and raises a KeyError.

Code snippet

from aws_lambda_powertools.utilities.data_classes import (
    event_source,
    CodePipelineJobEvent,
)
from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools.logging import Logger
import boto3

CODEPIPELINE = boto3.client("codepipeline")
logger = Logger(service="bug-report", level="DEBUG")

@event_source(data_class=CodePipelineJobEvent)
def handler(event: CodePipelineJobEvent, context: LambdaContext):
    try:
        logger.debug(str(event.raw_event))
        event.decoded_user_parameters
    except Exception as e:
        logger.exception(e, stack_info=True)
        CODEPIPELINE.put_job_failure_result(
            jobId=event.get_id, failureDetails={"type": "JobFailed", "message": str(e)}
        )
        raise e

    CODEPIPELINE.put_job_success_result(jobId=event.get_id)

Possible Solution

See #2113

Steps to Reproduce

  1. Create a CodePipeline with a AWS Lambda Build Step, without User Parameters. image

  2. Write Lambda to access event.decoded_user_parameters

  3. Note incoming JSON event image

Traceback (most recent call last):
  File \"/var/task/pipeline_action.py\", line 22, in handler
    check_inputs(event)
  File \"/var/task/pipeline_action.py\", line 119, in check_inputs
    elif \"TemplateFile\" not in event.decoded_user_parameters:
  File \"/var/task/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py\", line 165, in decoded_user_parameters
    return self.data.action_configuration.configuration.decoded_user_parameters
  File \"/var/task/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py\", line 27, in decoded_user_parameters
    self._json_data = json.loads(self.user_parameters)
  File \"/var/task/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py\", line 21, in user_parameters
   return self[\"UserParameters\"]
  File \"/var/task/aws_lambda_powertools/utilities/data_classes/common.py\", line 17, in __getitem__
    return self._data[key]
KeyError: 'UserParameters'

AWS Lambda Powertools for Python version

latest

AWS Lambda function runtime

3.8

Packaging format used

PyPi

Debugging logs

No response

Metadata

Metadata

Labels

bugSomething isn't workingevent_sourcesEvent Source Data Class utility

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions