remediation/aliyun-config-remediation.py (38 lines of code) (raw):
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import logging
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkecs.request.v20140526.StopInstanceRequest import StopInstanceRequest
logger = logging.getLogger()
def handler(event, context):
get_resources_non_compliant(event)
def get_resources_non_compliant(event):
resources = parse_json(event)
for resource in resources:
remediation_ecs_instance_no_public_ip(resource)
def parse_json(content):
"""
Parse string to json object
:param content: json string content
:return: Json object
"""
try:
return json.loads(content)
except Exception as e:
logger.error('Parse content:{} to json error:{}.'.format(content, e))
return None
def remediation_ecs_instance_no_public_ip(resource, context):
logger.info(resource)
region_id = resource['regionId']
account_id = resource['accountId']
resource_id = resource['resourceId']
resource_type = resource['resourceType']
config_rule_id = resource['configRuleId']
if resource_type == 'ACS::ECS::Instance' and config_rule_id == 'cr-xxxxx':
print(region_id, account_id, resource_id, resource_type, config_rule_id)
stop_ecs_instance(context, region_id, resource_id)
def stop_ecs_instance(context, resource_region_id, resource_id):
logger.info("Noticeļ¼begin stop instance {}{}".format(resource_region_id, resource_id))
creds = context.credentials
client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id=resource_region_id)
request = StopInstanceRequest()
request.set_accept_format('json')
request.set_InstanceId(resource_id)
request.set_StoppedMode("KeepCharging")
request.add_query_param('SecurityToken', creds.security_token)
response = client.do_action_with_exception(request)
logger.info(response)