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
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.
Indice
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 per
restricted-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.
ConfigurationItemChangeNotification
eOversizedConfigurationItemChangeNotification
sono 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 ricette
access-keys-rotated
include la regola gestitamaxAccessKeyAge
come 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 ricette
codedeploy-ec2-minimum-healthy-hosts-configured
include la regola gestitaminimumHealthyHostsFleetPercent
eminimumHealthyHostsHostCount
come 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 ricette
codedeploy-auto-rollback-monitor-enabled
,codedeploy-ec2-minimum-healthy-hosts-configured
, ecodedeploy-lambda-allatonce-traffic-shift-disabled
le 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-rdk
Regole di scrittura
-
Segui la procedura riportata inInstallazione diAWS CLI.
-
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
. -
Installare l'RDK, utilizzando il metodo consigliato con pip:
pip install rdk
Nota Prima di utilizzare pip, assicurarsi che sia installato sul computer.
-
Installare RDKLib, utilizzando il metodo consigliato con pip:
pip install rdklib
Nota Prima di utilizzare pip, assicurarsi che sia installato sul computer.
-
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-typesAWS::Resource::Type
Nell'esempio seguente viene creata una regola che viene attivata da una modifica alla
AWS::IAM::User
tipo 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 con
rdk create
comando per le regole attivate da modifiche:rdk create
RULE_NAME
--runtime pythonX.X
-lib // Python runtime version --input-parametersREQUIRED_PARAMETERS
// Parameters that are required for a rule to do its evaluation --optional-parametersOPTIONAL_PARAMETERS
// Parameters that are optional for a rule to do its evaluation --resource-typesAWS::Resource::Type
// Resource type(s) that the rule targetsNota Per utilizzare RdkLib, il runtime della regola deve essere impostato su
python3.6-lib
.Dopo la corsa
rdk create
, dovresti vedere una nuova directory con il nome della regola e 3 file:
- File Python in cui è memorizzata la logica delle regoleRULE_NAME
.py
- File Python in cui sono memorizzati i test unitari della regolaRULE_NAME
_test.pyparameters.json
- File JSON per le impostazioni di distribuzione di RDK
Il passaggio successivo consiste nel scrivere la logica delle regole. Dovrai solo modificare il
.py. Se apri ilRULE_NAME
file.py, vedrai un modello in cui è possibile aggiungere la logica delle regole. Di seguito è riportato il modello generato per MFA_ENABLED_RULE:RULE_NAME
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)
-
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:
Apri la console AWS Lambda all'indirizzo https://console.aws.amazon.com/lambda/
. Selezionacrea funzione.
Sulcrea funzionepage, selezionaSfoglia il repository di app serverlesse nel campo di ricerca digitarerdklib.
Esaminare i dettagli della funzione e quindi distribuirli. Non dovresti dover apportare modifiche.
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:
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" }
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
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" } } ] }
Copiare l'ARN del livello Lambda dall'output generato nel passaggio precedente. L'ARN dello strato Lambda è il
PhysicalResourceId
."PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
-
-
Il prossimo passo è fornire un ruolo da assumere per la funzione Lambda. Per impostazione predefinita, le funzioni Lambda tentano di assumere
AWSServiceRoleForConfig
ruolo, che non è consentito. Il ruolo deve essere creato con laAWS_ConfigRole
policy 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.jsonOra, eseguire il seguente comando per aggiornare il parametro di input per
ExecutionRoleName
e fornire il nome del ruolo:rdk modify
YOUR_RULE_NAME
--input-parameters '{"ExecutionRoleName":"your-role-name
"}'È possibile utilizzare anche
rdk modify
per aggiornare i dettagli delle regole attivate dalla modifica utilizzando i seguenti flag:rdk modify
RULE_NAME
--input-parametersREQUIRED_PARAMETERS
// Parameters that are required for a rule to do its evaluation --optional-parametersOPTIONAL_PARAMETERS
// Parameters that are optional for a rule to do its evaluation --resource-typesAWS::Resource::Type
// Resource type(s) that the rule targets -
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-arnYOUR_RDKLIB_LAYER_ARN
La regola è ora implementata. Puoi utilizzare il pluginAWS ConfigConsole per verificare se la regola funziona come previsto.
-
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-typesAWS::Resource::Type
--maximum-frequencyEXECUTION_FREQUENCY
Nell'esempio seguente viene creata una regola che viene attivata ogni 24 ore per la
AWS::IAM::User
tipo 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 con
rdk create
comando per regole periodiche:rdk create
RULE_NAME
--runtime pythonX.X
-lib // Python runtime version --input-parametersREQUIRED_PARAMETERS
// Parameters that are required for a rule to do its evaluation --optional-parametersOPTIONAL_PARAMETERS
// Parameters that are optional for a rule to do its evaluation --resource-typesAWS::Resource::Type
// Resource type(s) that the rule targets --maximum-frequencyEXECUTION_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 su
python3.6-lib
.Dopo la corsa
rdk create
, dovresti vedere una nuova directory con il nome della regola e 3 file:
- File Python in cui è memorizzata la logica delle regoleRULE_NAME
.py
- File Python in cui sono memorizzati i test unitari della regolaRULE_NAME
_test.pyparameters.json
- File JSON per le impostazioni di distribuzione di RDK
Il passaggio successivo consiste nel scrivere la logica delle regole. Dovrai solo modificare il
.py. Se apri ilRULE_NAME
file.py, vedrai un modello in cui è possibile aggiungere la logica delle regole. Di seguito è riportato il modello generato per MFA_ENABLED_RULE:RULE_NAME
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 al
evaluate_periodic
Method. 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)
-
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:
Apri la console AWS Lambda all'indirizzo https://console.aws.amazon.com/lambda/
. Selezionacrea funzione.
Sulcrea funzionepage, selezionaSfoglia il repository di app serverlesse nel campo di ricerca digitarerdklib.
Esaminare i dettagli della funzione e quindi distribuirli. Non dovresti dover apportare modifiche.
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:
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" }
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
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" } } ] }
Copiare l'ARN del livello Lambda dall'output generato nel passaggio precedente. L'ARN dello strato Lambda è il
PhysicalResourceId
."PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
-
-
Il prossimo passo è fornire un ruolo da assumere per la funzione Lambda. Per impostazione predefinita, le funzioni Lambda tentano di assumere
AWSServiceRoleForConfig
ruolo, che non è consentito. Il ruolo deve essere creato con laAWS_ConfigRole
policy 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.jsonOra, eseguire il seguente comando per aggiornare il parametro di input per
ExecutionRoleName
e fornire il nome del ruolo:rdk modify
YOUR_RULE_NAME
--input-parameters '{"ExecutionRoleName":"your-role-name
"}'È possibile utilizzare anche
rdk modify
per aggiornare i dettagli periodici delle regole utilizzando i seguenti flag:rdk modify
RULE_NAME
--input-parametersREQUIRED_PARAMETERS
// Parameters that are required for a rule to do its evaluation --optional-parametersOPTIONAL_PARAMETERS
// Parameters that are optional for a rule to do its evaluation --resource-typesAWS::Resource::Type
// Resource type(s) that the rule targets --maximum-frequencyEXECUTION_FREQUENCY
// How often the rule should be run on a periodic trigger. One of ['One_Hour','Three_Hours','Six_Hours','Twelve_Hours','TwentyFour_Hours'] -
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-arnYOUR_RDKLIB_LAYER_ARN
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_periodic
o 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_RESOURCES
sono 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 un
InvalidParametersError
errore: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 di
client_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 di
client_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 il
event
oggetto alhandler
Method. 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.