packages/blueprints/gen-ai-chatbot/static-assets/chatbot-genai-cdk/custom-resources/cognito-trigger/index.py (72 lines of code) (raw):
import os
import boto3
import cfnresponse
USER_POOL_ID = os.environ['USER_POOL_ID']
cognito = boto3.client('cognito-idp')
def handler(event, context):
"""Custom resource to implement the functionality to add triggers to existing Cognito user pools.
Because CloudFormation does not provide that functionality.
"""
request_type = event['RequestType']
physical_resource_id = event.get('PhysicalResourceId') or f'{USER_POOL_ID}-triggers'
resource_properties = event['ResourceProperties']
triggers = resource_properties['Triggers']
try:
if request_type == 'Create':
response = cognito.describe_user_pool(UserPoolId=USER_POOL_ID)
attr = response['UserPool']
lambda_config = attr.get('LambdaConfig', {})
update_user_pool_lambda_config(USER_POOL_ID, attr, lambda_config={
**lambda_config,
**triggers,
})
physical_resource_id = f'{USER_POOL_ID}-triggers'
cfnresponse.send(event, context, cfnresponse.SUCCESS, resource_properties, physical_resource_id)
elif request_type == 'Update':
response = cognito.describe_user_pool(UserPoolId=USER_POOL_ID)
attr = response['UserPool']
lambda_config = attr.get('LambdaConfig', {})
old_resource_properties = event['OldResourceProperties']
old_triggers = old_resource_properties['Triggers']
update_user_pool_lambda_config(USER_POOL_ID, attr, lambda_config={
**{ k: v for k, v in lambda_config.items() if k not in old_triggers.keys() },
**triggers,
})
physical_resource_id = f'{USER_POOL_ID}-triggers'
cfnresponse.send(event, context, cfnresponse.SUCCESS, resource_properties, physical_resource_id)
elif request_type == 'Delete':
response = cognito.describe_user_pool(UserPoolId=USER_POOL_ID)
attr = response['UserPool']
lambda_config = attr.get('LambdaConfig', {})
update_user_pool_lambda_config(USER_POOL_ID, attr, lambda_config={
k: v for k, v in lambda_config.items() if k not in triggers.keys()
})
cfnresponse.send(event, context, cfnresponse.SUCCESS, None, physical_resource_id)
except Exception as err:
print(err)
cfnresponse.send(event, context, cfnresponse.FAILED, None, physical_resource_id)
def update_user_pool_lambda_config(user_pool_id, attr, lambda_config):
if 'TemporaryPasswordValidityDays' in attr.get('Policies', {}).get('PasswordPolicy', {}):
attr.get('AdminCreateUserConfig', {}).pop('UnusedAccountValidityDays', None)
cognito.update_user_pool(
UserPoolId=user_pool_id,
**{
k: v for k, v in attr.items() if k in [
'Policies',
'DeletionProtection',
'AutoVerifiedAttributes',
'SmsVerificationMessage',
'EmailVerificationMessage',
'EmailVerificationSubject',
'VerificationMessageTemplate',
'SmsAuthenticationMessage',
'UserAttributeUpdateSettings',
'MfaConfiguration',
'DeviceConfiguration',
'EmailConfiguration',
'SmsConfiguration',
'UserPoolTags',
'AdminCreateUserConfig',
'UserPoolAddOns',
'AccountRecoverySetting',
]
},
LambdaConfig=lambda_config,
)