Skip to content

Instantly share code, notes, and snippets.

@nir0s
Last active January 9, 2021 00:48
Show Gist options
  • Save nir0s/0f28e0498de5d63d11eb22a8a41b3fee to your computer and use it in GitHub Desktop.
Save nir0s/0f28e0498de5d63d11eb22a8a41b3fee to your computer and use it in GitHub Desktop.
A Lambda function to delete a CloudFormation Stack on Pull Request Close GitHub Event
import sys
import json
import logging
import boto3
def _get_logger():
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler(sys.stdout))
return logger
def _delete_stack(branch_name):
"""Delete a stack if it exists for `branch_name`
"""
logger.info('Branch is: %s', branch_name)
client = boto3.client('cloudformation')
logger.info('Describing stacks...')
response = client.describe_stacks()
for record in response['Stacks']:
if record['StackName'] == branch_name:
logger.info('Deleting stack: %s...', branch_name)
client.delete_stack(StackName=branch_name)
logger.info('Stack deleted')
break
else:
logger.info('Stack %s does not exist. Ignoring...', branch_name)
def _process_branch(event_type, event_message):
"""Process a branch if the GitHub event is a closing of a PR.
"""
if event_type == 'pull_request' and event_message.get('action') == 'closed':
_delete_stack(event_message['pull_request']['head']['ref'])
else:
logger.info('`event_type` is not `pull_request` or `action` is not `closed`. Ignoring...')
def call(event):
"""Process a GitHub event
event (dict): GitHub generated info about the current event.
"""
logger = _get_logger()
event_data = event['Records'][0]['Sns']
event_type = event_data['MessageAttributes']['X-Github-Event']['Value']
event_message = json.loads(event_data['Message'])
_process_branch(event_type, event_message)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment