def lambda_handler()

in src/aws-lambda/pinpoint-auto-workshop/pinpoint-auto-workshop.py [0:0]


def lambda_handler(event, context):
    logger.info('## ENVIRONMENT VARIABLES')
    logger.info(os.environ)
    logger.info('## EVENT')
    logger.info(event)

    region = os.environ['AWS_REGION']
    account_id = sts.get_caller_identity()['Account']
    pinpoint_app_id = os.environ['pinpoint_app_id']
    lambda_function_arn = os.environ['pinpoint_recommender_arn']
    offers_lambda_function_arn = os.environ['pinpoint_offers_recommender_arn']
    pinpoint_personalize_role_arn = os.environ['pinpoint_personalize_role_arn']
    email_from_address = os.environ['email_from_address']
    email_from_name = os.environ.get('email_from_name', 'AWS Retail Demo Store')
    # Info on CloudWatch event rule used to repeatedely call this function.
    lambda_event_rule_name = os.environ['lambda_event_rule_name']

    response = ssm.get_parameter(Name='retaildemostore-product-recommendation-campaign-arn')
    personalize_campaign_arn = response['Parameter']['Value']

    response = ssm.get_parameter(Name='retaildemostore-personalized-offers-campaign-arn')
    offers_campaign_arn = response['Parameter']['Value']

    assert personalize_campaign_arn != 'NONE', 'Personalize Campaign ARN not initialized'

    logger.info('Personalize Campaign ARN: ' + personalize_campaign_arn)

    recommender_id = create_recommender(pinpoint_personalize_role_arn, personalize_campaign_arn, lambda_function_arn)
    logger.info('Pinpoint recommender configuration ID: ' + str(recommender_id))

    if do_deploy_offers_campaign:
        offers_recommender_id = create_offers_recommender(pinpoint_personalize_role_arn, offers_campaign_arn, offers_lambda_function_arn)
        logger.info('Pinpoint offers configuration ID: ' + str(recommender_id))

    # Create email templates
    create_welcome_email_template()
    create_abandoned_cart_email_template()
    create_recommendations_email_template(recommender_id)

    # Locations services and personalized offers templates
    if do_deploy_offers_campaign:
        create_location_offers_email_template(offers_recommender_id)
        create_location_abandoned_cart_email_template()

    # Enable email for Pinpoint project
    email_from = email_from_address
    if email_from_name:
        email_from = '{}<{}>'.format(email_from_name, email_from_address)

    logger.info('Enabling email channel for Pinpoint project')
    response = pinpoint.update_email_channel(
        ApplicationId = pinpoint_app_id,
        EmailChannelRequest={
            'Enabled': True,
            'FromAddress': email_from,
            'Identity': 'arn:aws:ses:{}:{}:identity/{}'.format(region, account_id, email_from_address)
        }
    )

    logger.debug(json.dumps(response, indent = 2, default = str))

    # Create AllEmailUsers segment
    segment_config = create_all_email_users_segment(pinpoint_app_id)
    logger.debug(json.dumps(segment_config, indent = 2, default = str))
    all_email_users_segment_id = segment_config['Id']
    all_email_users_segment_version = segment_config['Version']

    # Create UsersWithCartEmail segment
    segment_config = create_users_with_cart_segment(pinpoint_app_id, all_email_users_segment_id,
                                                    segment_name_suffix='Email')
    logger.debug('Email cart segment config: ' + json.dumps(segment_config, indent=2, default=str))
    email_users_with_cart_segment_id = segment_config['Id']
    email_users_with_cart_segment_version = segment_config['Version']

    # Create Welcome campaign (triggered on sign up)
    welcome_campaign_config = create_campaign(
        pinpoint_app_id, all_email_users_segment_id, all_email_users_segment_version,
        event_type="UserSignedUp", campaign_name='WelcomeEmail',
        email_from=email_from, email_template_name=welcome_template_name, sms_template_name=None)
    logger.debug('welcome_campaign_config:'+json.dumps(welcome_campaign_config,
                                                       indent=2, default=str))

    # Create Abandoned Cart campaign (triggered on session stop)
    abandoned_cart_campaign_config = create_campaign(
        pinpoint_app_id, email_users_with_cart_segment_id, email_users_with_cart_segment_version,
        event_type="_session.stop", campaign_name='AbandonedCartEmail',
        email_from=email_from, email_template_name=abandoned_cart_template_name, sms_template_name=None)
    logger.debug('abandoned_cart_campaign_config:'+json.dumps(abandoned_cart_campaign_config,
                                                       indent=2, default=str))

    if do_deploy_offers_campaign:
        # If offers campaign and geofence are not deployed, there is no point deploying these campaigns as
        # geofence will not trigger.

        # Create Abandoned Cart campaign with Location geofence
        location_abandoned_cart_campaign_config = create_campaign(
            pinpoint_app_id, email_users_with_cart_segment_id, email_users_with_cart_segment_version,
            event_type=GEOFENCE_PINPOINT_EVENTTYPE, campaign_name='LocationAbandonedCartCampaign',
            email_from=email_from, email_template_name=location_abandoned_cart_template_name, sms_template_name=None)
        logger.debug('location_abandoned_cart_campaign_config:' + json.dumps(location_abandoned_cart_campaign_config,
                                                                             indent=2, default=str))
        # Send an offer when a user approaches your store.
        location_recommender_campaign_config = create_campaign(
            pinpoint_app_id, all_email_users_segment_id, all_email_users_segment_version,
            event_type=GEOFENCE_PINPOINT_EVENTTYPE, campaign_name='LocationRecommendationsCampaign',
            email_from=email_from, email_template_name=location_offers_recommendations_template_name, sms_template_name=None)
        logger.debug('location_recommender_campaign_config:'+json.dumps(location_recommender_campaign_config,
                                                                        indent=2, default=str))

    # Now let us set up SMS segments and campaigns.

    # Are we set up to send SMS?
    response = ssm.get_parameter(Name='retaildemostore-pinpoint-sms-longcode')
    pinpoint_sms_long_code = response['Parameter']['Value']

    if(pinpoint_sms_long_code != 'NONE'):

        logger.info('Enabling SMS channel for Pinpoint project...')
        update_sms_channel_response = pinpoint.update_sms_channel(
            ApplicationId = pinpoint_app_id,
            SMSChannelRequest={
                'Enabled': True,
                'ShortCode': pinpoint_sms_long_code
            }
        )

    else:

        logger.info('Enabling SMS channel for Pinpoint project (no long code)...')
        update_sms_channel_response = pinpoint.update_sms_channel(
            ApplicationId=pinpoint_app_id,
            SMSChannelRequest={
                'Enabled': True
            }
        )

    logger.debug('SMS enable response: ' + json.dumps(update_sms_channel_response, indent = 2, default = str))

    logger.info('Creating SMS templates')
    create_recommendation_sms_template(recommender_id)
    if do_deploy_offers_campaign:
        create_location_offers_sms_template(offers_recommender_id)
        create_location_abandoned_cart_sms_template()

    # create AllSMSUsers segment
    segment_config = create_users_with_verified_sms_segment(pinpoint_app_id)
    all_sms_users_segment_id = segment_config['Id']
    all_sms_users_segment_version = segment_config['Version']

    # Create UsersWithCartSMS segment
    segment_config = create_users_with_cart_segment(pinpoint_app_id, all_sms_users_segment_id,
                                                    segment_name_suffix='SMS')
    logger.debug('SMS cart segment config: ' + json.dumps(segment_config, indent=2, default=str))
    sms_users_with_cart_segment_id = segment_config['Id']
    sms_users_with_cart_segment_version = segment_config['Version']

    # Create SMS alerts Campaign
    sms_signup_recommendations_campaign_config_sms = create_campaign(
        pinpoint_app_id, all_sms_users_segment_id,
        all_sms_users_segment_version,
        event_type='UserVerifiedSMS', campaign_name='SMSAlerts',
        email_from=None, email_template_name=None,
        sms_template_name=sms_recommendation_template_name)
    logger.debug(
        'sms_signup_recommendations_campaign_config_sms:' + json.dumps(sms_signup_recommendations_campaign_config_sms,
                                                                    indent=2, default=str))

    if do_deploy_offers_campaign:
        # If offers campaign and geofence are not deployed, there is no point deploying these campaigns as
        # geofence will not trigger.

        # Location demo: When the user gets near our geofence (local store) and they have products in their cart
        # we tell them to come pick them up.
        location_abandoned_cart_campaign_config_sms = create_campaign(
            pinpoint_app_id, sms_users_with_cart_segment_id,
            sms_users_with_cart_segment_version,
            event_type=GEOFENCE_PINPOINT_EVENTTYPE, campaign_name='LocationAbandonedCartCampaignSMS',
            email_from=None, email_template_name=None,
            sms_template_name=location_abandoned_cart_template_name)
        logger.debug(
            'location_abandoned_cart_campaign_config sms:' + json.dumps(location_abandoned_cart_campaign_config_sms,
                                                                        indent=2, default=str))

        # Location demo: When a user gets near a store we want to send a recommendation of an offer
        location_recommender_campaign_config_sms = create_campaign(
            pinpoint_app_id, all_sms_users_segment_id,
            all_sms_users_segment_version,
            event_type=GEOFENCE_PINPOINT_EVENTTYPE, campaign_name='LocationRecommendationsCampaignSMS',
            email_from=None, email_template_name=None, sms_template_name=location_offers_recommendations_template_name)
        logger.debug('location_recommender_campaign_config_sms:' + json.dumps(location_recommender_campaign_config_sms,
                                                                          indent=2, default=str))

    # No need for this lambda function to be called anymore so delete CW event rule that has been calling us.
    delete_event_rule(lambda_event_rule_name)

    return {
        'statusCode': 200,
        'body': json.dumps('Pinpoint workshop resources successfully provisioned!')
    }