def _cleanup_old_versions(name): logger.info('cleaning up old versions of {0}. Keeping {1}'.format( name, REVISIONS)) versions = _versions(name) for version in versions[0:(len(versions) - REVISIONS)]: logger.debug('deleting {} version {}'.format(name, version)) aws_lambda('delete_function', FunctionName=name, Qualifier=version)
def _get_target_arn(name): try: function_arn = aws_lambda('get_function', FunctionName=name, query='Configuration.FunctionArn') except ClientError: function_arn = None return function_arn
def _function_alias(name, version, alias=LIVE): try: logger.info('creating function alias {0} for {1}:{2}'.format( alias, name, version)) arn = aws_lambda('create_alias', FunctionName=name, FunctionVersion=version, Name=alias, query='AliasArn') except ClientError: logger.info('alias {0} exists. updating {0} -> {1}:{2}'.format( alias, name, version)) arn = aws_lambda('update_alias', FunctionName=name, FunctionVersion=version, Name=alias, query='AliasArn') return arn
def create_update_lambda(role_arn, wiring): name, handler, memory, timeout = (wiring[k] for k in ('FunctionName', 'Handler', 'MemorySize', 'Timeout')) try: logger.info('finding lambda function') function_arn = aws_lambda('get_function', FunctionName=name, query='Configuration.FunctionArn') except ClientError: function_arn = None if not function_arn: logger.info('creating new lambda function {}'.format(name)) with open('cronyo.zip', 'rb') as zf: function_arn, version = aws_lambda('create_function', FunctionName=name, Runtime='python3.8', Role=role_arn, Handler=handler, MemorySize=memory, Timeout=timeout, Publish=True, Code={'ZipFile': zf.read()}, query='[FunctionArn, Version]') else: logger.info('updating lambda function {}'.format(name)) aws_lambda('update_function_configuration', FunctionName=name, Runtime='python3.8', Role=role_arn, Handler=handler, MemorySize=memory, Timeout=timeout) with open('cronyo.zip', 'rb') as zf: function_arn, version = aws_lambda('update_function_code', FunctionName=name, Publish=True, ZipFile=zf.read(), query='[FunctionArn, Version]') function_arn = _function_alias(name, version) _cleanup_old_versions(name) logger.debug('function_arn={} ; version={}'.format(function_arn, version)) return function_arn
def put(name, cron_expression, function_name, target_input={}, description=None): logger.info("finding lambda function {}".format(function_name)) target_arn = \ _get_target_arn(function_name) or \ _get_target_arn(_namespaced(function_name)) if not target_arn: logger.error("unable to find lambda function for {}".format(function_name)) return logger.debug( "create / update cron rule {0}: {1} for target {2}".format( name, cron_expression, target_arn ) ) if description: rule = events("put_rule", Name=name, ScheduleExpression=cron_expression, Description=description) else: rule = events("put_rule", Name=name, ScheduleExpression=cron_expression) events( "put_targets", Rule=name, Targets=[ { "Id": "1", "Arn": target_arn, "Input": json.dumps(target_input) } ] ) try: logger.debug("setting lambda permission") source_arn = rule["RuleArn"] if source_arn.find(NAMESPACE) > 0: rule_prefix = rule["RuleArn"].split("/{}".format(NAMESPACE))[0] source_arn = "{}/{}*".format(rule_prefix, NAMESPACE) logger.debug("lambda permission SourceArn:{}".format(source_arn)) aws_lambda( "add_permission", FunctionName=target_arn, Action="lambda:InvokeFunction", Principal="events.amazonaws.com", SourceArn=source_arn, StatementId=hashlib.sha1(source_arn.encode("utf-8")).hexdigest() ) except ClientError as error: logger.debug("permission already set. {}".format(error)) for rule in _find([name]): logger.info("rule created/updated:\n{}".format(yaml.dump(_export_rule(rule))))
def _get_version(name, alias=LIVE): return aws_lambda('get_alias', FunctionName=name, Name=alias, query='FunctionVersion')
def _versions(name): versions = aws_lambda('list_versions_by_function', FunctionName=name, query='Versions[].Version') return versions[1:]