import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.auth.credentials import StsTokenCredential
from aliyunsdksts.request.v20150401.AssumeRoleRequest import AssumeRoleRequest
import logging
logger = logging.getLogger()
def handler(event, context):
get_resources_non_compliant(event, context)
def get_resources_non_compliant(event, context):
resources = parse_json(event)
for resource in resources:
remediation(resource, context)
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(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':
logger.info("process account_id: {}, resource_id: {}, config_rule_id: {}".format(
account_id, resource_id, config_rule_id))
install_monitoring_agent(context, account_id, region_id, resource_id)
def install_monitoring_agent(context, account_id, resource_region_id, resource_id):
logger.info("start install agent {}: {}".format(resource_region_id, resource_id))
token = assume_role_and_get_token(context, account_id, resource_region_id)
client = AcsClient(token['Credentials']['AccessKeyId'], token['Credentials']['AccessKeySecret'],
region_id=resource_region_id)
request = CommonRequest()
request.set_accept_format('json')
request.set_domain(f'metrics.{resource_region_id}.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https')
request.set_version('2019-01-01')
request.set_action_name('InstallMonitoringAgent')
request.add_query_param('InstanceIds.1', resource_id)
request.add_query_param('Force', "true")
request.add_query_param('SecurityToken', token['Credentials']['SecurityToken'])
response = client.do_action_with_exception(request)
logger.info(response)
def assume_role_and_get_token(context, account_id, region_id):
creds = context.credentials
logger.info('assume_role_and_get_token begin.')
credentials = StsTokenCredential(creds.access_key_id, creds.access_key_secret, creds.security_token)
client = AcsClient(credential=credentials)
request = AssumeRoleRequest()
request.set_domain(f'sts-vpc.{region_id}.aliyuncs.com')
request.set_accept_format('json')
request.set_RoleArn(f'acs:ram::{account_id}:role/configcustomremediationrole')
request.set_RoleSessionName("ConfigCustomRemediationRole")
response = client.do_action_with_exception(request)
logger.info('assume_role_and_get_token response : {}.'.format(response))
token = json.loads(response)
logger.info('assume_role_and_get_token: {}, assume role: {}.'.format(context.credentials, token))
return token