in functions/source/ClusterBootstrap/lambda_function.py [0:0]
def lambda_handler(event, context):
"""Main Lambda Handler"""
def log_config(loglevel=None, botolevel=None):
"""Setup logging"""
if 'ResourceProperties' in event.keys():
if 'loglevel' in event['ResourceProperties'] and not loglevel:
loglevel = event['ResourceProperties']['loglevel']
if 'botolevel' in event['ResourceProperties'] and not botolevel:
botolevel = event['ResourceProperties']['botolevel']
if not loglevel:
loglevel = 'warning'
if not botolevel:
botolevel = 'error'
# Set log verbosity levels
loglevel = getattr(logging, loglevel.upper(), 20)
botolevel = getattr(logging, botolevel.upper(), 40)
mainlogger = logging.getLogger()
mainlogger.setLevel(loglevel)
logging.getLogger('boto3').setLevel(botolevel)
logging.getLogger('botocore').setLevel(botolevel)
mylogger = logging.getLogger("lambda_handler")
mylogger.setLevel(loglevel)
return logging.LoggerAdapter(
mylogger,
{'requestid': event.get('RequestId','__None__')}
)
def get_ssm_parameter(ssm_client, ssm_parameter_name):
param_value = ssm_client.get_parameter(
Name=ssm_parameter_name,
WithDecryption=False
)
return param_value.get('Parameter').get('Value')
"""Main Lambda Logic"""
# Setup Logging
logger = log_config()
logger.info(event)
print(event)
# Get Environment Variables
AUTOSCALING_GROUPS=[ ""+os.environ["AutoScalingGroup"] ]
CLUSTER_MEMBERS=os.environ["ClusterMembersSSM"]
LEADER_ELECTED=os.environ["LeaderElectedSSM"]
LEADER=os.environ["LeaderSSM"]
print(AUTOSCALING_GROUPS)
print(CLUSTER_MEMBERS)
print(LEADER_ELECTED)
print(LEADER)
# Get Parameters we are passed
instance_id=event["instance_id"]
cluster_members = []
# Is there an elected leader?
ssm_client = boto3.client("ssm")
leader_elected = get_ssm_parameter(ssm_client, LEADER_ELECTED)
print("LeaderElected: {}".format(leader_elected))
# No Elected Leader bail out
if leader_elected != "True":
logger.info("No elected leader yet no nodes should bootstrap. Bailing out.")
print("No elected leader yet no nodes should bootstrap. Bailing out.")
return
# Describe ASG and find nodes.
asg_client = boto3.client("autoscaling")
response = asg_client.describe_auto_scaling_groups(
AutoScalingGroupNames=AUTOSCALING_GROUPS
)
cluster_members = []
print(response)
for AutoScalingGroup in response.get("AutoScalingGroups"):
print(AutoScalingGroup)
for instance in AutoScalingGroup.get("Instances"):
print(instance)
cluster_members.append(instance.get("InstanceId"))
# Find ones that are not healthy or don't exist
# terminating:wait
# TODO: Remove nodes which are no longer in the Vault API.
# Rewrite the SSM Parameter with cluster members including new node.
print(cluster_members)
separator = ","
cluster_members_string = separator.join(cluster_members)
response = ssm_client.put_parameter(
Name=CLUSTER_MEMBERS,
Type="String",
Value=cluster_members_string,
Overwrite=True
)
print("All done")
return