Componenti di unAWS ConfigRule - AWS Config

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Componenti di unAWS ConfigRule

AWS Configle regole di valutazione delle impostazioni di configurazione delAWSrisorse AWS. Esistono due tipi di regole:AWS Config Regole gestite eAWS ConfigRegole personalizzate. Le regole gestite sono regole predefinite e personalizzabili create daAWS Config. Per un elenco di regole gestite, consulta.elenco diAWS ConfigRegole gestite di.

Le regole personalizzate sono regole che è possibile creare utilizzando Guard oAWS LambdaFunzioni . Guardia (Proteggi il repository GitHub) è un policy-as-code lingua che consente di scrivere criteri applicati daAWS ConfigRegole dei criteri personalizzati.AWS Lambdautilizza il codice personalizzato caricato per valutare una regola personalizzata. Viene invocato da eventi che gli vengono pubblicati da una fonte dell'evento, cheAWS Configrichiama quando viene avviata la regola personalizzata.

Questa pagina illustra la struttura delle definizioni delle regole e le best practice su come scrivere regole con Python utilizzando ilAWS ConfigKit di sviluppo regole (RDK) eAWS ConfigLibreria Rules Development Kit (RdkLib). Per una procedura dettagliata che mostra come creareAWS ConfigRegole dei criteri personalizzati, vedereCreazione diAWS ConfigRegole di policy personalizzate. Per una procedura dettagliata che mostra come creareAWS ConfigRegole Lambda personalizzate, vediCreazione diAWS ConfigRegole Lambda personalizzate.

Definizioni di regole

AWS ConfigLe definizioni delle regole contengono i seguenti campi:

  • identificatore

  • Nome predefinito

  • description

  • scopo

  • SourceDetails

  • Dettagli sui parametri di input obbligatori

  • Dettagli sui parametri di input facoltativi

  • etichette

Nell'esempio JSON seguente viene illustrata la definizione della regola per lacodedeploy-ec2-minimum-health hosts-configuratoregola gestita.

{ "identifier": "CODEDEPLOY_EC2_MINIMUM_HEALTHY_HOSTS_CONFIGURED", "defaultName": "codedeploy-ec2-minimum-healthy-hosts-configured", "description": "Checks if the deployment group for EC2/On-Premises Compute Platform is configured with a minimum healthy hosts fleet percentage or host count greater than or equal to the input threshold. The rule is NON_COMPLIANT if either is below the threshold.", "scope": { "resourceTypes": [ "AWS::CodeDeploy::DeploymentGroup" ] }, "sourceDetails": [ { "eventSource": "AWS_CONFIG", "messageType": "ConfigurationItemChangeNotification" }, { "eventSource": "AWS_CONFIG", "messageType": "OversizedConfigurationItemChangeNotification" } ], "compulsoryInputParameterDetails": {}, "optionalInputParameterDetails": { "minimumHealthyHostsFleetPercent": { "type": "int", "description": "Minimum percentage of healthy hosts fleet during deployment. Default value is set to 66 percent.", "defaultValue": "66" }, "minimumHealthyHostsHostCount": { "type": "int", "description": "Minimum number of healthy hosts in fleet during deployment. Default value is set to 1.", "defaultValue": "1" } }, "labels": [ "CodeDeploy" ] }

Metadati delle regole

identificatore

L'identificatore di regola funziona come ID per unAWS Configregola gestita. Gli identificatori di regola sono scritti in ALL_CAPS_WITH_UNDERSCORES. Ad esempio:CODEDEPLOY_EC2_MINIMUM_HEALTHY_HOSTS_CONFIGUREDè l'identificatore della regola ecodedeploy-ec2-minimum-healthy-hosts-configuredè il nome della regola. L'identificatore di regola viene utilizzato per identificare una regola quandoCreazione diAWS ConfigRegole gestite conAWS CloudFormationModelli dio quando si chiama ilPutConfigRuleAPI.

Nota

Per alcune regole, l'identificatore della regola è diverso dal nome della regola. Ad esempio, l'identificatore della regola perrestricted-sshèINCOMING_SSH_DISABLED.

Nome predefinito

DefaultName è il nome che le istanze di una regola riceveranno per impostazione predefinita.

description

La descrizione della regola fornisce il contesto per ciò che la regola valuta. LaAWS ConfigLa console ha un limite di 256 caratteri. Come best practice, la descrizione della regola dovrebbe essere con «Verifica se» e includere una descrizione dello scenario NON_COMPLIANT. I nomi di servizio devono essere scritti per intero a partire daAWSo Amazon quando menzionato per la prima volta nella descrizione della regola. Ad esempio:AWS CloudTrailAmazon CloudWatch anziché CloudTrail o CloudWatch per il primo utilizzo. I nomi dei servizi possono essere abbreviati dopo il successivo riferimento.

scopo

L'ambito determina quali tipi di risorse sono le destinazioni della regola. Ciò è necessario se la regola è attivata da una modifica o è sia attivata sia periodica, ed è facoltativa per le regole periodiche. Per un elenco di tipi di risorsa supportati, consulta Tipi di risorsa supportati.

SourceDetails

SourceDetails determina il tipo di trigger della regola.ConfigurationItemChangeNotificationeOversizedConfigurationItemChangeNotificationsono utilizzati per le regole attivate dalle modifiche. Quando AWS Config rileva una modifica della configurazione per una risorsa, invia una notifica relativa all'elemento della configurazione. Se la notifica supera le dimensioni massime consentite da Amazon Simple Notification Service (Amazon SNS), la notifica include un breve riepilogo dell'articolo della configurazione. Puoi visualizzare la notifica completa seguendo la posizione del bucket S3 specificata nel campo S3BucketLocation.

ScheduleNotificationè usato per regole periodiche. Se una regola viene valutata sia periodicamente che in base alle modifiche alla configurazione, è possibile utilizzare tutti e tre i tipi di notifiche. Per ulteriori informazioni, consultaSpecificare i trigger perAWS ConfigRegolamento

Dettagli sui parametri di input obbligatori

CompulsoryInputParameterDetails vengono utilizzati per i parametri necessari per una regola per eseguire la valutazione. Ad esempio, le ricetteaccess-keys-rotatedinclude la regola gestitamaxAccessKeyAgecome parametro obbligatorio. Se è necessario un parametro, non verrà contrassegnato come (facoltativo). Per ogni parametro, è necessario specificare un tipo. Il tipo può essere uno di «String», «int», «double», «CSV», «booleano» e «StringMap».

Dettagli sui parametri di input facoltativi

OptionalInputParameterDetails vengono utilizzati per i parametri facoltativi per una regola per eseguire la valutazione. Ad esempio, le ricettecodedeploy-ec2-minimum-healthy-hosts-configuredinclude la regola gestitaminimumHealthyHostsFleetPercenteminimumHealthyHostsHostCountcome parametri facoltativi. Per ogni parametro, è necessario specificare un tipo. Il tipo può essere uno di «String», «int», «double», «CSV», «booleano» e «StringMap».

etichette

Le etichette possono essere utilizzate per contrassegnare le regole. Ad esempio, le ricettecodedeploy-auto-rollback-monitor-enabled,codedeploy-ec2-minimum-healthy-hosts-configured, ecodedeploy-lambda-allatonce-traffic-shift-disabledle regole gestite includono tutte l'etichettaCodeDeploy.

Struttura delle regole

Questa sezione contiene informazioni sull'utilizzo dellaAWS ConfigKit di sviluppo regole (RDK) eAWS ConfigLibreria Rules Development Kit (RdkLib). Per ulteriori informazioni su RDK o RDKLib, consulta laaws-config-rdkeaws-config-rdklib GitHub Repository.

Regole di scrittura

  1. Segui la procedura riportata inInstallazione diAWS CLI.

  2. Segui la procedura riportata inConfigurazioneAWS Configcon la consoleoConfigurazioneAWS Configcon ilAWS CLI. Per informazioni suAWSRegioni in cuiAWS Configè supportato, seleziona la tua regione dalAWSElenco dei servizi regionali.

  3. Installare l'RDK, utilizzando il metodo consigliato con pip:

    pip install rdk
    Nota

    Prima di utilizzare pip, assicurarsi che sia installato sul computer.

  4. Installare RDKLib, utilizzando il metodo consigliato con pip:

    pip install rdklib
    Nota

    Prima di utilizzare pip, assicurarsi che sia installato sul computer.

  1. Per creare una regola attivata da una modifica al tipo di risorsa specificato, eseguire il seguente comando:

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

    Nell'esempio seguente viene creata una regola che viene attivata da una modifica allaAWS::IAM::Usertipo di risorsa:

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

    Di seguito sono riportati i flag che è possibile utilizzare conrdk createcomando per le regole attivate da modifiche:

    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

    Per utilizzare RdkLib, il runtime della regola deve essere impostato supython3.6-lib.

    Dopo la corsardk create, dovresti vedere una nuova directory con il nome della regola e 3 file:

    • RULE_NAME.py- File Python in cui è memorizzata la logica delle regole


    • RULE_NAME_test.py- File Python in cui sono memorizzati i test unitari della regola

    • parameters.json- File JSON per le impostazioni di distribuzione di RDK

  2. Il passaggio successivo consiste nel scrivere la logica delle regole. Dovrai solo modificare ilRULE_NAME.py. Se apri ilRULE_NAMEfile.py, vedrai un modello in cui è possibile aggiungere la logica delle regole. Di seguito è riportato il modello generato per 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)

    L'esempio seguente è una versione modificata del modello MFA_ENABLED_RULE con la logica delle regole. La regola verifica se gli utenti IAM hanno abilitato l'autenticazione a più fattori (MFA). La regola è NON_COMPLIANT se un utente IAM non ha abilitato l'MFA. Per ulteriori informazioni sulla logica delle regole e sui metodi forniti nel modello, vedereLogica delle regole.

    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. Il passaggio successivo consiste nell'installazione del layer RDKLib inAWScon o ilAWSConsole oAWS CLI. RdKlib è progettato per funzionare comeAWS Lambdalivello. Consente di utilizzare la libreria senza doverla includere nel pacchetto di distribuzione in uso.

    • Per installare il livello RDKLib conAWSConsole, procedi nel seguente modo:

      1. Apri la console AWS Lambda all'indirizzo https://console.aws.amazon.com/lambda/.

      2. Selezionacrea funzione.

      3. Sulcrea funzionepage, selezionaSfoglia il repository di app serverlesse nel campo di ricerca digitarerdklib.

      4. Esaminare i dettagli della funzione e quindi distribuirli. Non dovresti dover apportare modifiche.

      5. Nel riquadro di navigazione a sinistra, scegli laLivelli(Certificato creato). Quindi scegli il layer Lambda appena creato e copia l'ARN (Amazon Resource Name) del layer Lambda. Avrai bisogno dell'ARN del livello Lambda quando distribuisci la regola.

    • Per installare il livello RDKLib conAWS CLI, esegui i comandi seguenti:

      1. Create il set di modifiche per il livello RDKLib.

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

        Restituisce il seguente output:

        { "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. Esegui il set di modifiche. È possibile copiare/incollare l'ARN completo del set di modifiche (changeSetID dall'output generato nel passaggio precedente) per personalizzare il seguente comando:

        aws cloudformation execute-change-set --change-set-name NAME_OF_THE_CHANGE_SET
      3. Restituisce tutte le risorse associate che fanno parte dello stack distribuito.

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

        Restituisce il seguente output:

        { "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. Copiare l'ARN del livello Lambda dall'output generato nel passaggio precedente. L'ARN dello strato Lambda è ilPhysicalResourceId.

        "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
  4. Il prossimo passo è fornire un ruolo da assumere per la funzione Lambda. Per impostazione predefinita, le funzioni Lambda tentano di assumereAWSServiceRoleForConfigruolo, che non è consentito. Il ruolo deve essere creato con laAWS_ConfigRolepolicy gestita. Il ruolo deve avere una relazione di trust conAWS Confige tutti i ruoli del percorso /rdk/ dovrebbero assumere il ruolo. Di seguito viene riportato un esempio di policy di attendibilità:

    { "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/*" } } } ] }

    Tramite questa policy di attendibilità, esegui il comando seguente:

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

    Ora, eseguire il seguente comando per aggiornare il parametro di input perExecutionRoleNamee fornire il nome del ruolo:

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

    È possibile utilizzare ancherdk modifyper aggiornare i dettagli delle regole attivate dalla modifica utilizzando i seguenti flag:

    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. La fase finale consiste nel distribuire la regola. Per distribuire la regola, esegui il seguente comando con l'ARN del livello Lambda dal passaggio 3:

    rdk deploy YOUR_RULE_NAME --rdklib-layer-arn YOUR_RDKLIB_LAYER_ARN
  6. La regola è ora implementata. Puoi utilizzare il pluginAWS ConfigConsole per verificare se la regola funziona come previsto.

  1. Per creare una regola che viene attivata periodicamente per un tipo di risorsa specificato, eseguire il seguente comando:

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

    Nell'esempio seguente viene creata una regola che viene attivata ogni 24 ore per laAWS::IAM::Usertipo di risorsa:

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

    Di seguito sono riportati i flag che è possibile utilizzare conrdk createcomando per regole periodiche:

    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

    Per utilizzare RdkLib, il runtime della regola deve essere impostato supython3.6-lib.

    Dopo la corsardk create, dovresti vedere una nuova directory con il nome della regola e 3 file:

    • RULE_NAME.py- File Python in cui è memorizzata la logica delle regole


    • RULE_NAME_test.py- File Python in cui sono memorizzati i test unitari della regola

    • parameters.json- File JSON per le impostazioni di distribuzione di RDK

  2. Il passaggio successivo consiste nel scrivere la logica delle regole. Dovrai solo modificare ilRULE_NAME.py. Se apri ilRULE_NAMEfile.py, vedrai un modello in cui è possibile aggiungere la logica delle regole. Di seguito è riportato il modello generato per 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)

    Il modello è impostato per impostazione predefinita sulle regole attivate dalla modifica. Invece, aggiungi la tua logica alevaluate_periodicMethod. L'esempio seguente è una versione modificata del modello MFA_ENABLED_RULE con la logica delle regole. La regola verifica se gli utenti IAM hanno abilitato l'autenticazione a più fattori (MFA). La regola è NON_COMPLIANT se un utente IAM non ha abilitato l'MFA. Per ulteriori informazioni sulla logica delle regole e sui metodi forniti nel modello, vedereLogica delle regole.

    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. Il passaggio successivo consiste nell'installazione del layer RDKLib inAWScon o ilAWSConsole oAWS CLI. RdKlib è progettato per funzionare comeAWS Lambdalivello. Consente di utilizzare la libreria senza doverla includere nel pacchetto di distribuzione in uso.

    • Per installare il livello RDKLib conAWSConsole, procedi nel seguente modo:

      1. Apri la console AWS Lambda all'indirizzo https://console.aws.amazon.com/lambda/.

      2. Selezionacrea funzione.

      3. Sulcrea funzionepage, selezionaSfoglia il repository di app serverlesse nel campo di ricerca digitarerdklib.

      4. Esaminare i dettagli della funzione e quindi distribuirli. Non dovresti dover apportare modifiche.

      5. Nel riquadro di navigazione a sinistra, scegli laLivelli(Certificato creato). Quindi scegli il layer Lambda appena creato e copia l'ARN (Amazon Resource Name) del layer Lambda. Avrai bisogno dell'ARN del livello Lambda quando distribuisci la regola.

    • Per installare il livello RDKLib conAWS CLI, esegui i comandi seguenti:

      1. Create il set di modifiche per il livello RDKLib.

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

        Restituisce il seguente output:

        { "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. Esegui il set di modifiche. È possibile copiare/incollare l'ARN completo del set di modifiche (changeSetID dall'output generato nel passaggio precedente) per personalizzare il seguente comando:

        aws cloudformation execute-change-set --change-set-name NAME_OF_THE_CHANGE_SET
      3. Restituisce tutte le risorse associate che fanno parte dello stack distribuito.

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

        Restituisce il seguente output:

        { "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. Copiare l'ARN del livello Lambda dall'output generato nel passaggio precedente. L'ARN dello strato Lambda è ilPhysicalResourceId.

        "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
  4. Il prossimo passo è fornire un ruolo da assumere per la funzione Lambda. Per impostazione predefinita, le funzioni Lambda tentano di assumereAWSServiceRoleForConfigruolo, che non è consentito. Il ruolo deve essere creato con laAWS_ConfigRolepolicy gestita. Il ruolo deve avere una relazione di trust conAWS Confige tutti i ruoli del percorso /rdk/ dovrebbero assumere il ruolo. Di seguito viene riportato un esempio di policy di attendibilità:

    { "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/*" } } } ] }

    Tramite questa policy di attendibilità, esegui il comando seguente:

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

    Ora, eseguire il seguente comando per aggiornare il parametro di input perExecutionRoleNamee fornire il nome del ruolo:

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

    È possibile utilizzare ancherdk modifyper aggiornare i dettagli periodici delle regole utilizzando i seguenti flag:

    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. La fase finale consiste nel distribuire la regola. Per distribuire la regola, esegui il seguente comando con l'ARN del livello Lambda dal passaggio 3:

    rdk deploy YOUR_RULE_NAME --rdklib-layer-arn YOUR_RDKLIB_LAYER_ARN
  6. La regola è ora implementata. Puoi utilizzare il pluginAWS ConfigConsole per verificare se la regola funziona come previsto.

Logica delle regole

Il seguente esempio di codice Python è un modello per scrivere una regola utilizzando RDK e RKDLib. Dovresti apportare modifiche solo all'interno delevaluate_parameters,evaluate_change, eevaluate_periodico scrivere funzioni completamente nuove per aiutare con la logica se necessario. Per i prerequisiti per scrivere regole con RDK e RDKLib, vederePrerequisiti.

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_RESOURCESsono i tipi di risorsa che la regola è destinata. Se utilizzato, dovrebbe trattarsi di una variabile globale impostata sui tipi di risorsa che la regola è destinata. Per un elenco di tipi di risorsa supportati, consulta Tipi di risorsa supportati.

evaluate_parameters

Descrizione

Questo metodo viene utilizzato per verificare se i parametri di input per la regola sono validi. Di seguito sono riportate le best practice:

  • Verificare se è elencato il numero corretto di parametri.

  • Verificare se il nome del parametro è corretto.

  • Verificare se il valore del parametro è del tipo corretto.

  • Se il parametro è un numero intero, verificare se il parametro è compreso tra limiti ragionevoli.

  • Se il parametro ha un numero limitato di opzioni possibili, verificare se il parametro è una di queste opzioni.

  • Se il parametro è una stringa, verificare che sia una lunghezza ragionevole e tagliare qualsiasi spazio prima o dopo il valore.

  • Controlla se la sensibilità tra maiuscole e minuscole è gestita in modo appropriato.

  • Limitare l'input dei parametri quando possibile. Ad esempio, se ricevi un elenco di ARN separati da virgole, assicurati che gli unici caratteri consentiti siano virgole e caratteri supportati da ARN.

Parametri

rule_parametersè un dizionario dei parametri di input per la regola.

Sintassi del reso

Se uno dei parametri non è valido, è possibile sollevare unInvalidParametersErrorerrore:

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

Se i parametri sono tutti validi, il metodo dovrebbe restituire un dizionario:

return valid_rule_parameters
evaluate_change

Descrizione

Questo metodo viene utilizzato per la logica per valutare una regola attivata dalla modifica.

Parametri

eventè ilAWS Lambdaevento fornito daAWS Config. È un documento in formato JSON formattato che contiene i dati che una funzione Lambda deve funzionare. Per alcuni esempi, consultare .Esempio eventi perAWS ConfigRegolamento.

client_factoryè il ClientFactory oggetto da utilizzare per la regola. La ClientFactory class crea o riutilizza un client boto3, che fornisce un'interfaccia di basso livello a unAWSservizio. I metodi client boto3 vengono mappati con unAWSAPI del servizio, il che significa che le operazioni di servizio mappano i metodi del client con lo stesso nome e forniscono l'accesso agli stessi parametri operativi. Per un elenco dei servizi disponibili, consulta.Servizi disponibilinella documentazione di Boto3 Docs.

La sintassi della richiesta diclient_factoryè il seguente:

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

Ad esempio:

iam_client = client_factory.build_client("iam")
Nota

Il nome boto3 delAWSè richiesto il servizio.

configuration_itemè il dizionario della configurazione completa Item, anche se sovradimensionato. Un elemento di configurazione rappresenta un point-in-time visualizzazione dei vari attributi di un supportatoAWSrisorsa. Per informazioni sui contenuti diConfigurationItem, consultaArticolo di configurazionenellaAWS ConfigInformazioni di riferimento sull'API.

valid_rule_parametersè l'output delevaluate_parameters()Method.

Sintassi del reso

Il metodo deve restituire una o più delle seguenti:

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

È necessario utilizzare le annotazioni per tutte le valutazioni non conformi. Ad esempio:

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

Descrizione

Questo metodo viene utilizzato per valutare una regola periodica.

Parametri

eventè ilAWS Lambdaevento fornito daAWS Config. È un documento in formato JSON formattato che contiene i dati che una funzione Lambda deve funzionare. Per alcuni esempi, consultare .Esempio eventi perAWS ConfigRegolamento.

client_factoryè il ClientFactory oggetto da utilizzare per la regola. La ClientFactory class crea o riutilizza un client boto3, che fornisce un'interfaccia di basso livello a unAWSservizio. I metodi client boto3 vengono mappati con unAWSAPI del servizio, il che significa che le operazioni di servizio mappano i metodi del client con lo stesso nome e forniscono l'accesso agli stessi parametri operativi. Per un elenco dei servizi disponibili, consulta.Servizi disponibilinella documentazione di Boto3 Docs.

La sintassi della richiesta diclient_factoryè il seguente:

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

Ad esempio:

iam_client = client_factory.build_client("iam")
Nota

Il nome boto3 delAWSè richiesto il servizio.

valid_rule_parametersè l'output delevaluate_parameters()Method.

Sintassi del reso

Il metodo deve restituire una o più delle seguenti:

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

È necessario utilizzare le annotazioni per tutte le valutazioni non conformi. Ad esempio:

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

Descrizione

Non dovrebbe essere necessario modificare questo metodo. Il gestore lambda viene utilizzato per elaborare eventi. La funzione viene eseguita quandoAWS Lambdapassa ileventoggetto alhandlerMethod. Per ulteriori informazioni, consultare Gestore della funzione Lambda in Python.

Parametri

eventè ilAWS Lambdaevento fornito daAWS Config. È un documento in formato JSON formattato che contiene i dati che una funzione Lambda deve funzionare. Per alcuni esempi, consultare .Esempio eventi perAWS ConfigRegolamento.

contextè che un oggetto viene passato alla funzione da Lambda in runtime. Questo oggetto fornisce i metodi e le proprietà che forniscono le informazioni e i metodi che la funzione può utilizzare durante la sua esecuzione. Si noti che nelle versioni più recenti di Lambda, il contesto non viene più utilizzato.