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!')
}