in functions/source/registerType/lambda_function.py [0:0]
def register(event, _):
logger.error(f"event: {json.dumps(event)}")
type_name = event['ResourceProperties']['TypeName'].replace("::", "-").lower()
version = Version(event['ResourceProperties'].get('Version', '0.0.0'))
if version != Version('0.0.0') and version <= get_current_version(type_name):
print("version already registered is greater than this version, leaving as is.")
if not cfn.list_type_versions(Type='RESOURCE', TypeName=event['ResourceProperties']['TypeName'])['TypeVersionSummaries']:
print("resource missing, re-registering...")
else:
try:
arn = cfn.describe_type(Type='RESOURCE', TypeName=event['ResourceProperties']['TypeName'])['Arn']
return arn
except cfn.exceptions.TypeNotFoundException:
print("resource missing, re-registering...")
execution_role_arn = put_role(type_name, event['ResourceProperties']['IamPolicy'], execution_trust_policy)
log_role_arn = put_role('CloudFormationRegistryResourceLogRole', log_policy, log_trust_policy)
kwargs = {
"Type": 'RESOURCE',
"TypeName": event['ResourceProperties']['TypeName'],
"SchemaHandlerPackage": event['ResourceProperties']['SchemaHandlerPackage'],
"LoggingConfig": {
"LogRoleArn": log_role_arn,
"LogGroupName": f"/cloudformation/registry/{type_name}"
},
"ExecutionRoleArn": execution_role_arn
}
retries = 3
while True:
try:
try:
response = cfn.register_type(**kwargs)
except cfn.exceptions.CFNRegistryException as e:
if "Maximum number of versions exceeded" not in str(e):
raise
delete_oldest(event['ResourceProperties']['TypeName'])
continue
version_arn = stabilize(response['RegistrationToken'])
break
except Exception as e:
if not retries:
raise
retries -= 1
logger.error(e, exc_info=True)
sleep(60)
if version_arn:
cfn.set_type_default_version(Arn=version_arn)
set_version(type_name, event['ResourceProperties'].get('Version', '0.0.0'))
return version_arn