Al crear una regla, configure una corrección personalizada mediante Function Compute para solucionar los recursos identificados como Non-compliant.
Requisitos previos
Contexto
El siguiente ejemplo utiliza la regla administrada ecs-running-instance-no-public-ip para mostrar cómo configurar y ejecutar una corrección personalizada.
La regla administrada ecs-running-instance-no-public-ip identifica como no conformes las instancias de ECS en ejecución que tienen una dirección IPv4 pública. Posteriormente, la corrección detiene dichas instancias.
Procedimiento
Inicie sesión en la consola de Cloud Config.
-
Opcional. En la esquina superior izquierda, seleccione un grupo de cuentas.
Esta operación solo es necesaria si utiliza una cuenta de administración de un directorio de recursos. De lo contrario, no necesita realizarla.
En el panel de navegación izquierdo, elija .
En la página Rules, haga clic en Create Rule.
En la página Select Create Method, seleccione Based on managed rule, elija la regla ecs-running-instance-no-public-ip de las plantillas y luego haga clic en Next.
En la página Set Basic Properties, conserve la configuración predeterminada de los parámetros y haga clic en Next.
En la página Set Effective Scope, conserve la configuración predeterminada de los parámetros y haga clic en Next.
-
En la página Set Correction, active el interruptor Set Correction, seleccione Function Compute, establezca Invoke Type en Manual Remediation, seleccione un Function ARN y luego haga clic en Submit.
ImportanteLa corrección automática modifica los recursos no conformes según parámetros preestablecidos y podría interrumpir su negocio. El valor predeterminado de Invoke Type es Manual Remediation. Se recomienda mantener esta configuración.
Si tiene la certeza de que la corrección no afectará a su negocio, establezca Invoke Type en Automatic Remediation. Cloud Config corregirá automáticamente los recursos no conformes.
Haga clic en Create New Function para crear un servicio y una función en la consola de Function Compute. Quickly create a function.
Al crear la función, establezca Function Type en Event Function y runtime en python 3. Configure los demás parámetros según sea necesario. Código de ejemplo:
#!/usr/bin/env python # -*- encoding: utf-8 -*- import json from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkcore.auth.credentials import AccessKeyCredential from aliyunsdkcore.auth.credentials import StsTokenCredential from aliyunsdkecs.request.v20140526.StopInstanceRequest import StopInstanceRequest from aliyunsdkcore.auth.credentials import AccessKeyCredential from aliyunsdkcore.auth.credentials import StsTokenCredential from aliyunsdkkms.request.v20160120.DecryptRequest import DecryptRequest # -*- coding: utf-8 -*- import logging import json 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): """ Parses a string into a 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' and config_rule_id == 'cr-f8a1626622af005d****': 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("Stopping 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("i-hp3f6lofgrnml5mt****") request.set_StoppedMode("KeepCharging") request.add_query_param('SecurityToken', creds.security_token) response = client.do_action_with_exception(request) logger.info(response)NotaCódigo de muestra más reciente: aliyun-config-remediation.py.
Funciones clave:
handler: Punto de entrada predeterminado que se invoca cuando Cloud Config desencadena una corrección. El elemento
handlerse establece al crear la función.get_resources_non_compliant: Analiza sintácticamente los recursos no conformes.remediation: Punto de entrada para la lógica de corrección personalizada. Configúrela según sus requisitos de cumplimiento. Para la regla "ecs-running-instance-no-public-ip", esta función detiene las instancias que tienen una dirección IP pública.
-
Ejecute la corrección manualmente.
En la página Rules, localice la regla objetivo y haga clic en Remediation Detail en la columna Remediation Template.
-
En la pestaña Remediation Detail, haga clic en Perform Manual Correction junto a Remediation Detail.
La sección Execution Result List muestra los resultados de la corrección y los motivos de fallo.
NotaEn la pestaña Remediation Detail, haga clic en el Function ARN junto a Remediation Template para abrir la pestaña Function Code en la consola de Function Compute.
Documentos relacionados
Para consultar el código de funciones y las configuraciones de permisos en entornos de múltiples cuentas, consulte Implement custom remediation for non-compliant resources in a multi-account environment by using Resource Directory.