in UpdateMembers/src/UpdateMember/index.py [0:0]
def lambda_handler(event, context):
logger.info(event)
try:
# set variables and boto3 clients
config = Config(
retries = {
'max_attempts': 23,
'mode': 'standard'
}
)
administrator_account_id = context.invoked_function_arn.split(":")[4]
member_account_id = event["account"]
role_arn = os.environ["MemberRole"].replace("<accountId>", member_account_id)
global sts_client
if not sts_client:
sts_client = boto3.client("sts")
assumed_role_object = sts_client.assume_role(
RoleArn=role_arn, RoleSessionName="SecurityHubUpdater"
)
credentials = assumed_role_object["Credentials"]
member_security_hub_client = boto3.client(
"securityhub",
aws_access_key_id=credentials["AccessKeyId"],
aws_secret_access_key=credentials["SecretAccessKey"],
aws_session_token=credentials["SessionToken"],
config=config,
)
# Optimization - no need to reinitilize the administrator security hub client for every instance of this Lambda function
global administrator_security_hub_client
if not administrator_security_hub_client:
administrator_security_hub_client = boto3.client("securityhub", config=config)
# Get standard subscription controls
standards = administrator_security_hub_client.describe_standards()
administrator_enabled_standards = get_enabled_standard_subscriptions(
standards, administrator_account_id, administrator_security_hub_client
)
member_enabled_standards = get_enabled_standard_subscriptions(
standards, member_account_id, member_security_hub_client
)
logger.info("Update Account %s", member_account_id)
# Update standard subscriptions in member account
standards_updated = update_standard_subscription(
administrator_enabled_standards,
member_enabled_standards,
member_security_hub_client,
)
if standards_updated:
logger.info("Fetch enabled standards again.")
member_enabled_standards = get_enabled_standard_subscriptions(
standards, member_account_id, member_security_hub_client
)
# Get Controls
admin_controls = get_controls(
administrator_enabled_standards, administrator_security_hub_client
)
member_controls = get_controls(
member_enabled_standards, member_security_hub_client
)
# Get exceptions
exceptions = get_exceptions(event)
logger.debug("Exceptions: %s", str(exceptions))
# Disable/enable the controls in member account
update_member(
admin_controls, member_controls, member_security_hub_client, exceptions
)
except botocore.exceptions.ClientError as error:
logger.error(error)
return {"statusCode": 500, "account": member_account_id, "error": str(error)}
return {"statusCode": 200, "account": member_account_id}