Componentes de una AWS Config regla - AWS Config

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Componentes de una AWS Config regla

AWS Config las reglas evalúan los valores de configuración de AWS los recursos. Hay dos tipos de reglas: reglas administradas de AWS Config y reglas personalizadas de AWS Config .

AWS Config Las reglas administradas son reglas predefinidas y personalizables creadas por AWS Config. Para obtener una lista de reglas administradas, consulte Lista de reglas AWS Config administradas.

AWS Config Las reglas personalizadas son reglas que se crean desde cero. Hay dos formas de crear reglas AWS Config personalizadas: con funciones de Lambda (Guía para AWS Lambda desarrolladores) y con Guard (Guard GitHub Repository), un policy-as-code lenguaje. AWS Config las reglas personalizadas creadas con AWS Lambda se denominan reglas Lambda AWS Config personalizadas y las reglas AWS Config personalizadas creadas con Guard se denominan reglas de políticas AWS Config personalizadas.

En esta página se analizan los metadatos de las reglas AWS Config administradas y las mejores prácticas sobre cómo escribir reglas AWS Config personalizadas con Python mediante el kit de desarrollo de AWS Config reglas (RDK) y la biblioteca del kit de desarrollo de AWS Config reglas (RDKlib). Para ver un tutorial sobre cómo crear reglas de políticas AWS Config personalizadas, consulte Creación AWS Config de reglas de políticas personalizadas. Para ver un tutorial sobre cómo crear reglas Lambda AWS Config personalizadas, consulte Creación de reglas Lambda AWS Config personalizadas.

AWS Config metadatos de reglas gestionadas

AWS Config las reglas gestionadas pueden contener los siguientes metadatos mutables:

defaultName

El defaultName es el nombre que recibirán las instancias de una regla de forma predeterminada.

description

La description de la regla proporciona el contexto de lo que evalúa la regla. La consola de AWS Config tiene un límite de 256 caracteres. Como práctica recomendada, la descripción de la regla debería empezar por “Comprueba si” e incluir una descripción del supuesto NON_COMPLIANT. Los nombres de los servicios deben escribirse completos empezando AWS por Amazon cuando se mencionen por primera vez en la descripción de la regla. Por ejemplo, AWS CloudTrail o Amazon CloudWatch en lugar de CloudTrail o CloudWatch para el primer uso. Los nombres de los servicios se pueden abreviar después.

scope

El scope determina los tipos de recursos a los que se dirige la regla. Para obtener una lista de tipos de recursos compatibles, consulte Tipos de recursos compatibles.

compulsoryInputParameterDetalles

Los compulsoryInputParameter detalles se utilizan para los parámetros necesarios para que una regla realice su evaluación. Por ejemplo, la regla de access-keys-rotated administrada incluye maxAccessKeyAge como parámetro obligatorio. Si un parámetro es obligatorio, no se marcará como (opcional). Para cada parámetro, se debe especificar un tipo Los tipos pueden ser «String», «int», «double», «CSV», «boolean» y "StringMap».

optionalInputParameterDetalles

Los optionalInputParameter detalles se utilizan para los parámetros que son opcionales para que una regla realice su evaluación. Por ejemplo, la regla de elasticsearch-logs-to-cloudwatch administrada incluye logTypes como parámetro opcional. Para cada parámetro, se debe especificar un tipo El tipo puede ser «String», «int», «double», «CSV», «boolean» y "StringMap».

supportedEvaluationModes

supportedEvaluationModes Determina cuándo se evaluarán los recursos, ya sea antes de que se haya implementado un recurso o después de que se haya implementado.

DETECTIVE se utiliza para evaluar los recursos que ya se han implementado. Esto le permite evaluar los valores de configuración de los recursos existentes. PROACTIVE se utiliza para evaluar los recursos antes de que se hayan implementado.

Esto le permite evaluar si un conjunto de propiedades de un recurso, si se utiliza para definir un AWS recurso, cumple o no lo es, dado el conjunto de reglas proactivas que tiene en su cuenta en su región.

Puede especificar el supportedEvaluationModes para DETECTIVEPROACTIVE, o ambos DETECTIVE y. PROACTIVE Debe especificar un modo de evaluación y este campo no puede permanecer vacío.

Para obtener más información, consulte Modos de evaluación. Para obtener una lista de reglas administradas que admiten una evaluación proactiva, consulte Lista de reglas AWS Config administradas por modo de evaluación.

nota

Las reglas proactivas no corrigen los recursos que están marcados como NON_COMPLIANT ni impiden su implementación.

AWS Config estructura de reglas personalizada

Esta sección contiene información sobre el uso del kit de desarrollo de AWS Config reglas (RDK) y la biblioteca del kit de desarrollo de AWS Config reglas (RDKLib). Para obtener más información sobre el RDK o el RDKLib, consulte los repositorios y. aws-config-rdk aws-config-rdklib GitHub

Reglas de escritura

  1. Siga los pasos descritos en Instalación de la AWS CLI.

  2. Siga los pasos que se indican en Configuración AWS Config con la consola o Configuración con. AWS Config AWS CLI Para obtener información sobre las AWS regiones en las AWS Config que se admite, seleccione su región en la lista de servicios AWS regionales.

  3. Instale el RDK con el método recomendado con pip:

    pip install rdk
    nota

    Antes de usar pip, asegúrese de que esté instalado en su máquina.

  4. Instale la RDKLib con el método recomendado con pip:

    pip install rdklib
    nota

    Antes de usar pip, asegúrese de que esté instalado en su máquina.

  1. Para crear una regla desencadenada por un cambio en un tipo de recurso específico, ejecute el siguiente comando:

    rdk create YOUR_RULE_NAME --runtime python3.6-lib --resource-types AWS::Resource::Type

    En el siguiente ejemplo, se crea una regla que se activa cuando se cambia el tipo de recurso de AWS::IAM::User:

    rdk create MFA_ENABLED_RULE --runtime python3.6-lib --resource-types AWS::IAM::User

    Los siguientes son los marcadores que puede utilizar con el comando rdk create para las reglas desencadenadas por cambios:

    rdk create RULE_NAME --runtime pythonX.X-lib // Python runtime version --input-parameters REQUIRED_PARAMETERS // Parameters that are required for a rule to do its evaluation --optional-parameters OPTIONAL_PARAMETERS // Parameters that are optional for a rule to do its evaluation --resource-types AWS::Resource::Type // Resource type(s) that the rule targets
    nota

    Para usar RDKLib, el tiempo de ejecución de la regla debe estar establecido en python3.6-lib.

    Tras ejecutar rdk create, deberías ver un nuevo directorio con el nombre de la regla y tres archivos:

    • RULE_NAME.py: el archivo Python donde se almacena la lógica de la regla


    • RULE_NAME_test.py: el archivo Python donde se almacenan las pruebas unitarias de la regla

    • parameters.json: el archivo JSON para la configuración de implementación del RDK

  2. El siguiente paso es escribir la lógica de la regla. Solo tendrá que editar el archivo RULE_NAME.py. Si abre el archivo RULE_NAME.py, verá una plantilla en la que puede añadir la lógica de reglas. La siguiente es la plantilla generada para MFA_ENABLED_RULE:

    from rdklib import Evaluator, Evaluation, ConfigRule, ComplianceType APPLICABLE_RESOURCES = ['AWS::IAM::User'] class MFA_ENABLED_RULE(ConfigRule): def evaluate_change(self, event, client_factory, configuration_item, valid_rule_parameters): ############################### # Add your custom logic here. # ############################### return [Evaluation(ComplianceType.NOT_APPLICABLE)] #def evaluate_periodic(self, event, client_factory, valid_rule_parameters): # pass def evaluate_parameters(self, rule_parameters): valid_rule_parameters = rule_parameters return valid_rule_parameters ################################ # DO NOT MODIFY ANYTHING BELOW # ################################ def lambda_handler(event, context): my_rule = MFA_ENABLED_RULE() evaluator = Evaluator(my_rule, APPLICABLE_RESOURCES) return evaluator.handle(event, context)

    El siguiente ejemplo es una versión editada de la plantilla MFA_ENABLED_RULE con la lógica de reglas. La regla comprueba si los usuarios de IAM tienen la autenticación multifactor (MFA) habilitada. La regla es NON_COMPLIANT si un usuario de IAM no tiene habilitado la MFA. Para obtener más información sobre la lógica de reglas y los métodos proporcionados en la plantilla, consulte Lógica de reglas.

    from rdklib import ComplianceType, ConfigRule, Evaluation, Evaluator APPLICABLE_RESOURCES = ["AWS::IAM::User"] class MFA_ENABLED_RULE(ConfigRule): def evaluate_change(self, event, client_factory, configuration_item, valid_rule_parameters): username = configuration_item.get("resourceName") iam_client = client_factory.build_client("iam") response = iam_client.list_mfa_devices(UserName=username) # Scenario:1 IAM user has MFA enabled. if response["MFADevices"]: return [Evaluation(ComplianceType.COMPLIANT)] # Scenario:2 IAM user has MFA not enabled. annotation = "MFA needs to be enabled for user." return [Evaluation(ComplianceType.NON_COMPLIANT, annotation=annotation)] def evaluate_parameters(self, rule_parameters): valid_rule_parameters = rule_parameters return valid_rule_parameters ################################ # DO NOT MODIFY ANYTHING BELOW # ################################ def lambda_handler(event, context): my_rule = MFA_ENABLED_RULE() evaluator = Evaluator(my_rule, APPLICABLE_RESOURCES) return evaluator.handle(event, context)
  3. El siguiente paso es instalar la capa RDKLib AWS con la AWS consola o. AWS CLI RDKLib está diseñada para funcionar como una capa de AWS Lambda que permite utilizar la biblioteca sin tener que incluirla en el paquete de implementación.

    • Para instalar la capa RDKLib con la AWS consola, realice los siguientes pasos:

      1. Abra la AWS Lambda consola en https://console.aws.amazon.com/lambda/.

      2. Seleccione Crear una función.

      3. En la página Crear una función, elija Examinar el repositorio de aplicaciones sin servidor e introduzca rdklib en el campo de búsqueda.

      4. Revise los detalles de la función y, a continuación, impleméntela. No debería tener que hacer ningún cambio.

      5. En el panel de navegación izquierdo, elija Capas. A continuación, elija la capa Lambda que acaba de crear y copie el nombre de recurso de Amazon (ARN) de la capa Lambda. Necesitará el ARN de la capa Lambda al implementar la regla.

    • Para instalar la capa RDKlib con AWS CLI, ejecute los siguientes comandos:

      1. Cree el conjunto de cambios para la capa RDKlib.

        aws serverlessrepo create-cloud-formation-change-set --application-id arn:aws:serverlessrepo:ap-southeast-1:711761543063:applications/rdklib --stack-name RDKlib-Layer

        Que devuelve el siguiente resultado:

        { "ApplicationId": "arn:aws:serverlessrepo:ap-southeast-1:711761543063:applications/rdklib", "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/a3d536322-585e-4ffd-9e2f-552c8b887d6f/ffe7ff5c-ab38-4ab9-b746-9c1617ca95c1", "SemanticVersion": "0.1.0", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/serverlessrepo-RDKlib-Layer/365436a0-a58a-11ea-9b04-12ae8fb95b53" }
      2. Ejecute el conjunto de cambios. Puede copiar y pegar el ARN completo del conjunto de cambios ChangeSetId (del resultado generado en el paso anterior) para personalizar el siguiente comando:

        aws cloudformation execute-change-set --change-set-name NAME_OF_THE_CHANGE_SET
      3. Que devuelve todos los recursos asociados que forman parte de la pila implementada.

        aws cloudformation describe-stack-resources --stack-name serverlessrepo-RDKlib-Layer

        Que devuelve el siguiente resultado:

        { "StackResources": [ { "StackName": "serverlessrepo-RDKlib-Layer", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/serverlessrepo-RDKlib-Layer/365436a0-a58a-11ea-9b04-12ae8fb95b53", "LogicalResourceId": "RdklibLayercf22317faf", "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1", "ResourceType": "AWS::Lambda::LayerVersion", "Timestamp": "2020-06-03T11:26:30.501Z", "ResourceStatus": "CREATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } } ] }
      4. Copie el ARN de la capa Lambda del resultado generado en el paso anterior. El ARN de la capa Lambda es el PhysicalResourceId.

        "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
  4. El siguiente paso es proporcionar un rol para que lo asuma la función de Lambda. De forma predeterminada, las funciones de Lambda intentan asumir el rol AWSServiceRoleForConfig, lo cual no está permitido. Debe crear un rol con la política administrada de AWS_ConfigRole. El rol debe tener una relación de confianza con AWS Config y todos los roles de la ruta /rdk/ deben asumirlo. A continuación, se muestra un ejemplo de una política de confianza:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-ID:root" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::account-ID:role/rdk/*" } } } ] }

    Con esta política de confianza, ejecute el siguiente comando:

    aws iam create-role --role-name your-role-name --assume-role-policy-document file://trust-policy.json

    Ahora, ejecute el siguiente comando para actualizar el parámetro de entrada para ExecutionRoleName y proporcionar el nombre del rol:

    rdk modify YOUR_RULE_NAME --input-parameters '{"ExecutionRoleName":"your-role-name"}'

    También puede utilizar rdk modify para actualizar los detalles de las reglas desencadenadas por cambios con los siguientes marcadores:

    rdk modify RULE_NAME --input-parameters REQUIRED_PARAMETERS // Parameters that are required for a rule to do its evaluation --optional-parameters OPTIONAL_PARAMETERS // Parameters that are optional for a rule to do its evaluation --resource-types AWS::Resource::Type // Resource type(s) that the rule targets
  5. El último paso es implementar la regla. Para implementar la regla, ejecute el siguiente comando con el ARN de la capa Lambda del paso 3:

    rdk deploy YOUR_RULE_NAME --rdklib-layer-arn YOUR_RDKLIB_LAYER_ARN
  6. La regla ya está implementada. Puede utilizar la AWS Config consola para comprobar si la regla funciona según lo previsto.

  1. Para crear una regla que se desencadene periódicamente para un tipo de recurso específico, ejecute el siguiente comando:

    rdk create YOUR_RULE_NAME --runtime python3.6-lib --resource-types AWS::Resource::Type --maximum-frequency EXECUTION_FREQUENCY

    En el siguiente ejemplo, se crea una regla que se desencadena cada 24 horas para el tipo de recurso AWS::IAM::User:

    rdk create MFA_ENABLED_RULE --runtime python3.6-lib --resource-types AWS::IAM::User --maximum-frequency TwentyFour_Hours

    Los siguientes son los marcadores que puede utilizar con el comando rdk create para las reglas periódicas:

    rdk create RULE_NAME --runtime pythonX.X-lib // Python runtime version --input-parameters REQUIRED_PARAMETERS // Parameters that are required for a rule to do its evaluation --optional-parameters OPTIONAL_PARAMETERS // Parameters that are optional for a rule to do its evaluation --resource-types AWS::Resource::Type // Resource type(s) that the rule targets --maximum-frequency EXECUTION_FREQUENCY // How often the rule should be run on a periodic trigger.
 One of ['One_Hour','Three_Hours','Six_Hours','Twelve_Hours','TwentyFour_Hours']
    nota

    Para usar RDKLib, el tiempo de ejecución de la regla debe estar establecido en python3.6-lib.

    Tras ejecutar rdk create, deberías ver un nuevo directorio con el nombre de la regla y tres archivos:

    • RULE_NAME.py: el archivo Python donde se almacena la lógica de la regla


    • RULE_NAME_test.py: el archivo Python donde se almacenan las pruebas unitarias de la regla

    • parameters.json: el archivo JSON para la configuración de implementación del RDK

  2. El siguiente paso es escribir la lógica de la regla. Solo tendrá que editar el archivo RULE_NAME.py. Si abre el archivo RULE_NAME.py, verá una plantilla en la que puede añadir la lógica de reglas. La siguiente es la plantilla generada para MFA_ENABLED_RULE:

    from rdklib import Evaluator, Evaluation, ConfigRule, ComplianceType APPLICABLE_RESOURCES = ['AWS::IAM::User'] class MFA_ENABLED_RULE(ConfigRule): def evaluate_change(self, event, client_factory, configuration_item, valid_rule_parameters): ############################### # Add your custom logic here. # ############################### return [Evaluation(ComplianceType.NOT_APPLICABLE)] #def evaluate_periodic(self, event, client_factory, valid_rule_parameters): # pass def evaluate_parameters(self, rule_parameters): valid_rule_parameters = rule_parameters return valid_rule_parameters ################################ # DO NOT MODIFY ANYTHING BELOW # ################################ def lambda_handler(event, context): my_rule = MFA_ENABLED_RULE() evaluator = Evaluator(my_rule, APPLICABLE_RESOURCES) return evaluator.handle(event, context)

    La plantilla utiliza de forma predeterminada las reglas desencadenadas por cambios. En su lugar, añada su lógica al método evaluate_periodic. El siguiente ejemplo es una versión editada de la plantilla MFA_ENABLED_RULE con la lógica de reglas. La regla comprueba si los usuarios de IAM tienen la autenticación multifactor (MFA) habilitada. La regla es NON_COMPLIANT si un usuario de IAM no tiene habilitado la MFA. Para obtener más información sobre la lógica de reglas y los métodos proporcionados en la plantilla, consulte Lógica de reglas.

    from rdklib import ComplianceType, ConfigRule, Evaluation, Evaluator APPLICABLE_RESOURCES = ["AWS::IAM::User"] class MFA_ENABLED_RULE(ConfigRule):l def evaluate_periodic(self, event, client_factory, valid_rule_parameters): evaluations = [] iam_client = client_factory.build_client("iam") paginator = iam_client.get_paginator("list_users") response_iterator = paginator.paginate() for response in response_iterator: for user in response["Users"]: username = user["UserName"] response = iam_client.list_mfa_devices(UserName=username) # Scenario:1 IAM user has MFA enabled. if response["MFADevices"]: evaluations.append(Evaluation(ComplianceType.COMPLIANT, username, "AWS::IAM::User")) # Scenario:2 IAM user has MFA not enabled. if not response["MFADevices"]: annotation = "MFA needs to be enabled for user." evaluations.append( Evaluation(ComplianceType.NON_COMPLIANT, username, "AWS::IAM::User", annotation=annotation) ) return evaluations def evaluate_parameters(self, rule_parameters): valid_rule_parameters = rule_parameters return valid_rule_parameters ################################ # DO NOT MODIFY ANYTHING BELOW # ################################ def lambda_handler(event, context): my_rule = MFA_ENABLED_RULE() evaluator = Evaluator(my_rule, APPLICABLE_RESOURCES) return evaluator.handle(event, context)
  3. El siguiente paso es instalar la capa RDKLib AWS con la AWS consola o. AWS CLI RDKLib está diseñada para funcionar como una capa de AWS Lambda que permite utilizar la biblioteca sin tener que incluirla en el paquete de implementación.

    • Para instalar la capa RDKLib con la AWS consola, realice los siguientes pasos:

      1. Abra la AWS Lambda consola en https://console.aws.amazon.com/lambda/.

      2. Seleccione Crear una función.

      3. En la página Crear una función, elija Examinar el repositorio de aplicaciones sin servidor e introduzca rdklib en el campo de búsqueda.

      4. Revise los detalles de la función y, a continuación, impleméntela. No debería tener que hacer ningún cambio.

      5. En el panel de navegación izquierdo, elija Capas. A continuación, elija la capa Lambda que acaba de crear y copie el nombre de recurso de Amazon (ARN) de la capa Lambda. Necesitará el ARN de la capa Lambda al implementar la regla.

    • Para instalar la capa RDKlib con AWS CLI, ejecute los siguientes comandos:

      1. Cree el conjunto de cambios para la capa RDKlib.

        aws serverlessrepo create-cloud-formation-change-set --application-id arn:aws:serverlessrepo:ap-southeast-1:711761543063:applications/rdklib --stack-name RDKlib-Layer

        Que devuelve el siguiente resultado:

        { "ApplicationId": "arn:aws:serverlessrepo:ap-southeast-1:711761543063:applications/rdklib", "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/a3d536322-585e-4ffd-9e2f-552c8b887d6f/ffe7ff5c-ab38-4ab9-b746-9c1617ca95c1", "SemanticVersion": "0.1.0", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/serverlessrepo-RDKlib-Layer/365436a0-a58a-11ea-9b04-12ae8fb95b53" }
      2. Ejecute el conjunto de cambios. Puede copiar y pegar el ARN completo del conjunto de cambios ChangeSetId (del resultado generado en el paso anterior) para personalizar el siguiente comando:

        aws cloudformation execute-change-set --change-set-name NAME_OF_THE_CHANGE_SET
      3. Que devuelve todos los recursos asociados que forman parte de la pila implementada.

        aws cloudformation describe-stack-resources --stack-name serverlessrepo-RDKlib-Layer

        Que devuelve el siguiente resultado:

        { "StackResources": [ { "StackName": "serverlessrepo-RDKlib-Layer", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/serverlessrepo-RDKlib-Layer/365436a0-a58a-11ea-9b04-12ae8fb95b53", "LogicalResourceId": "RdklibLayercf22317faf", "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1", "ResourceType": "AWS::Lambda::LayerVersion", "Timestamp": "2020-06-03T11:26:30.501Z", "ResourceStatus": "CREATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } } ] }
      4. Copie el ARN de la capa Lambda del resultado generado en el paso anterior. El ARN de la capa Lambda es el PhysicalResourceId.

        "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
  4. El siguiente paso es proporcionar un rol para que lo asuma la función de Lambda. De forma predeterminada, las funciones de Lambda intentan asumir el rol AWSServiceRoleForConfig, lo cual no está permitido. Debe crear un rol con la política administrada de AWS_ConfigRole. El rol debe tener una relación de confianza con AWS Config y todos los roles de la ruta /rdk/ deben asumirlo. A continuación, se muestra un ejemplo de una política de confianza:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-ID:root" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::account-ID:role/rdk/*" } } } ] }

    Con esta política de confianza, ejecute el siguiente comando:

    aws iam create-role --role-name your-role-name --assume-role-policy-document file://trust-policy.json

    Ahora, ejecute el siguiente comando para actualizar el parámetro de entrada para ExecutionRoleName y proporcionar el nombre del rol:

    rdk modify YOUR_RULE_NAME --input-parameters '{"ExecutionRoleName":"your-role-name"}'

    También puede utilizar rdk modify para actualizar los detalles de la regla periódica con los siguientes marcadores:

    rdk modify RULE_NAME --input-parameters REQUIRED_PARAMETERS // Parameters that are required for a rule to do its evaluation --optional-parameters OPTIONAL_PARAMETERS // Parameters that are optional for a rule to do its evaluation --resource-types AWS::Resource::Type // Resource type(s) that the rule targets --maximum-frequency EXECUTION_FREQUENCY // How often the rule should be run on a periodic trigger.
 One of ['One_Hour','Three_Hours','Six_Hours','Twelve_Hours','TwentyFour_Hours']
  5. El último paso es implementar la regla. Para implementar la regla, ejecute el siguiente comando con el ARN de la capa Lambda del paso 3:

    rdk deploy YOUR_RULE_NAME --rdklib-layer-arn YOUR_RDKLIB_LAYER_ARN
  6. La regla ya está implementada. Puede utilizar la AWS Config consola para comprobar si la regla funciona según lo previsto.

Lógica de reglas

El siguiente ejemplo de código Python es una plantilla para escribir una regla con el RDK y la RDKLib. Solo debe hacer cambios en los métodos evaluate_parameters, evaluate_change y evaluate_periodic, o escribir funciones completamente nuevas para facilitar la lógica, si es necesario. Para conocer los requisitos previos para escribir reglas con el RDK y la RDKLib, consulte Requisitos previos.

from rdklib import Evaluator, Evaluation, ConfigRule, ComplianceType APPLICABLE_RESOURCES = ["AWS::Resource::Type"] # When you create a rule, the class name will be the name you give the rule when you create it instead of ConfigRule class ConfigRule (ConfigRule): def evaluate_parameters(self, rule_parameters): return rule_parameters def evaluate_change(self, event, client_factory, configuration_item, valid_rule_parameters): ############################### # Add your custom logic here. # ############################### def evaluate_periodic(self, event, client_factory, valid_rule_parameters): ############################### # Add your custom logic here. # ############################### ################################ # DO NOT MODIFY ANYTHING BELOW # ################################ def lambda_handler(event, context): my_rule = ConfigRule() evaluator = Evaluator(my_rule, APPLICABLE_RESOURCES) return evaluator.handle(event, context)
APPLICABLE_RESOURCES

APPLICABLE_RESOURCES son los tipos de recursos a los que se dirige la regla. Si se usan, debe ser una variable global establecida en función de los tipos de recursos a los que se dirige la regla. Para obtener una lista de tipos de recursos compatibles, consulte Tipos de recursos compatibles.

evaluate_parameters

Descripción

Este método se utiliza para comprobar si los parámetros de entrada de la regla son válidos. A continuación se indican las prácticas recomendadas:

  • Compruebe si aparece el número correcto de parámetros.

  • Compruebe si el nombre del parámetro es correcto.

  • Compruebe si el valor del parámetro es del tipo correcto.

  • Si el parámetro es un número entero, compruebe si el parámetro se encuentra entre límites razonables.

  • Si el parámetro tiene un número limitado de opciones posibles, compruebe si el parámetro es una de esas opciones.

  • Si el parámetro es una cadena, compruebe si tiene una longitud razonable y recorte todo espacio delante o detrás del valor.

  • Compruebe si la diferencia entre mayúsculas y minúsculas se gestiona adecuadamente.

  • Limite la entrada de parámetros cuando sea posible. Por ejemplo, si recibe una lista de ARN separados por comas, asegúrese de que los únicos caracteres permitidos sean las comas y los caracteres admitidos por los ARN.

Parámetros

rule_parameters es un diccionario de parámetros de entrada para la regla.

Sintaxis de devolución

Si uno de los parámetros no es válido, puede producirse un error InvalidParametersError:

from rdklib import InvalidParametersError raise InvalidParametersError("Error message to display")

Si todos los parámetros son válidos, el método debería devolver un diccionario:

return valid_rule_parameters
evaluate_change

Descripción

Este método se utiliza como lógica para evaluar una regla desencadenada por cambios.

Parámetros

eventes el AWS Lambda evento proporcionado por AWS Config. Es un documento con formato JSON que contiene datos para que una función de Lambda los maneje. Para ver ejemplos, consulte Ejemplos de eventos para AWS Config reglas.

client_factoryes el ClientFactory objeto que se utilizará para la regla. La ClientFactory clase crea o reutiliza un cliente boto3, que proporciona una interfaz de bajo nivel a un servicio. AWS Los métodos del cliente boto3 se asignan a una API de AWS servicio, lo que significa que las operaciones de servicio se asignan a métodos de cliente del mismo nombre y proporcionan acceso a los mismos parámetros de operación. Para obtener una lista de los servicios disponibles, consulte los servicios disponibles en la documentación de Boto3 Docs.

La sintaxis requerida de client_factory es la siguiente:

response = client_factory.build_client( service='string')

Por ejemplo:

iam_client = client_factory.build_client("iam")
nota

Se requiere el nombre boto3 del AWS servicio.

configuration_item es el diccionario del elemento de configuración completo, incluso si está sobredimensionado. Un elemento de configuración representa una point-in-time vista de los distintos atributos de un recurso compatible AWS . Para obtener información sobre el contenido deConfigurationItem, consulte ConfigurationItemla referencia de la AWS Config API.

valid_rule_parameters es el resultado del método evaluate_parameters().

Sintaxis de devolución

El método debe devolver uno o más de los siguientes valores:

[Evaluation(ComplianceType.COMPLIANT)]
[Evaluation(ComplianceType.NON_COMPLIANT)]
[Evaluation(ComplianceType.NOT_APPLICABLE)]
nota

Las reglas que informen sobre los recursos eliminados deben devolver el resultado de la evaluación de NOT_APPLICABLE para evitar evaluaciones innecesarias de las reglas.

Debe utilizar anotaciones para todas las evaluaciones no conformes. Por ejemplo:

[return [Evaluation(ComplianceType.NON_COMPLIANT, annotation="Explanation for why the rule is NON_COMPLIANT")]]
evaluate_periodic

Descripción

Este método se utiliza para evaluar una regla periódica.

Parámetros

eventes el AWS Lambda evento ofrecido por AWS Config. Es un documento con formato JSON que contiene datos para que una función de Lambda los maneje. Para ver ejemplos, consulte Ejemplos de eventos para AWS Config reglas.

client_factoryes el ClientFactory objeto que se utilizará para la regla. La ClientFactory clase crea o reutiliza un cliente boto3, que proporciona una interfaz de bajo nivel a un servicio. AWS Los métodos del cliente boto3 se asignan a una API de AWS servicio, lo que significa que las operaciones de servicio se asignan a métodos de cliente del mismo nombre y proporcionan acceso a los mismos parámetros de operación. Para obtener una lista de los servicios disponibles, consulte los servicios disponibles en la documentación de Boto3 Docs.

La sintaxis requerida de client_factory es la siguiente:

response = client_factory.build_client( service='string')

Por ejemplo:

iam_client = client_factory.build_client("iam")
nota

Se requiere el nombre boto3 del AWS servicio.

valid_rule_parameters es el resultado del método evaluate_parameters().

Sintaxis de devolución

El método debe devolver uno o más de los siguientes valores:

[Evaluation(ComplianceType.COMPLIANT)]
[Evaluation(ComplianceType.NON_COMPLIANT)]
[Evaluation(ComplianceType.NOT_APPLICABLE)]
nota

Las reglas que informen sobre los recursos eliminados deben devolver el resultado de la evaluación de NOT_APPLICABLE para evitar evaluaciones innecesarias de las reglas.

Debe utilizar anotaciones para todas las evaluaciones no conformes. Por ejemplo:

[return [Evaluation(ComplianceType.NON_COMPLIANT, annotation="Explanation for why the rule is NON_COMPLIANT")]]
lambda_handler

Descripción

No debería ser necesario modificar este método. El controlador Lambda se usa para procesar eventos. La función se ejecuta cuando se AWS Lambda pasa el event objeto al handler método. Para más información, consulte Controlador de funciones de Lambda en Python.

Parámetros

eventes el AWS Lambda evento proporcionado por AWS Config. Es un documento con formato JSON que contiene datos para que una función de Lambda los maneje. Para ver ejemplos, consulte Ejemplos de eventos para AWS Config reglas.

context es un objeto de contexto que Lambda pasa a su función en el tiempo de ejecución. Este objeto proporciona métodos y propiedades que facilitan información y métodos que la función puede utilizar mientras se ejecuta. Tenga en cuenta que en las versiones más recientes de Lambda, el contexto ya no se usa.