Componentes de uma AWS Config regra - AWS Config

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Componentes de uma AWS Config regra

AWS Configas regras avaliam as definições de configuração de seus AWS recursos. Há dois tipos de regras: regras AWS Config gerenciadas e regras AWS Config personalizadas.

As regras gerenciadas do AWS Config são regras predefinidas e personalizáveis criadas pelo AWS Config. Para obter uma lista de regras gerenciadas, consulte Lista de regras AWS Config gerenciadas.

Regras personalizadas do AWS Config são regras que você cria do zero. Há duas maneiras de criar regras AWS Config personalizadas: com funções do Lambda (Guia do AWS Lambda desenvolvedor) e com o Guard (Guard GitHub Repository), uma policy-as-code linguagem. AWS Configas regras personalizadas criadas com AWS Lambda são chamadas de Regras Lambda AWS Config personalizadas e as regras AWS Config personalizadas criadas com o Guard são chamadas de Regras de Política AWS Config Personalizadas.

Esta página discute a estrutura das definições de regras e as melhores práticas sobre como escrever regras com Python usando o Kit de Desenvolvimento de Regras (RDK) e a AWS Config Biblioteca do Kit de Desenvolvimento de AWS Config Regras (RDKLib). Para ver um passo a passo sobre como criar regras de política AWS Config personalizadas, consulte Criação de regras de política AWS Config personalizadas. Para ver um passo a passo sobre como criar regras AWS Config personalizadas do Lambda, consulte Criação de regras AWS Config personalizadas do Lambda.

Definições de regras

AWS Configas definições de regras contêm os seguintes campos:

  • identificador

  • Nome padrão

  • descrição

  • escopo

  • Detalhes da fonte

  • compulsoryInputParameterDetalhes

  • optionalInputParameterDetalhes

  • rótulos

  • supportedEvaluationModes

O exemplo JSON a seguir mostra a definição da regra para a regra elasticsearch-logs-to-cloudwatchgerenciada.

{ "identifier": "ELASTICSEARCH_LOGS_TO_CLOUDWATCH", "defaultName": "elasticsearch-logs-to-cloudwatch", "description": "Checks if Amazon OpenSearch Service domains are configured to send logs to Amazon CloudWatch Logs. The rule is COMPLIANT if a log is enabled for an Amazon ES domain. This rule is NON_COMPLIANT if logging is not configured." "scope": { "resourceTypes": [ "AWS::Elasticsearch::Domain" ] }, "sourceDetails": [ { "eventSource": "AWS_CONFIG", "messageType": "ConfigurationItemChangeNotification" }, { "eventSource": "AWS_CONFIG", "messageType": "OversizedConfigurationItemChangeNotification" } ], "compulsoryInputParameterDetails": {}, "optionalInputParameterDetails": { "logTypes": { "type": "CSV", "description": "Comma-separated list of logs that are enabled. Valid values are 'search', 'index', 'error'." } }, "labels": [ "Elasticsearch", "CloudWatch", "Logs" ], "supportedEvaluationModes": [ { "evaluationMode": "DETECTIVE" }, { "evaluationMode": "PROACTIVE" } ] }

Metadados da regra

identificador

O identificador da regra funciona como o ID de uma regra AWS Config gerenciada. Os identificadores de regras são escritos em ALL_CAPS_WITH_UNDERSCORES. Por exemplo, ELASTICSEARCH_LOGS_TO_CLOUDWATCH é o identificador da regra e elasticsearch-logs-to-cloudwatch o nome da regra. O identificador da regra é usado para identificar uma regra ao criar regras AWS Config gerenciadas com AWS CloudFormation modelos ou ao chamar a PutConfigRuleAPI.

nota

Para algumas regras, o identificador da regra é diferente do nome da regra. Por exemplo, o identificador da regra para restricted-ssh éINCOMING_SSH_DISABLED.

Nome padrão

O DefaultName é o nome que as instâncias de uma regra receberão por padrão.

descrição

A descrição da regra fornece contexto para o que a regra avalia. O AWS Config console tem um limite de 256 caracteres. Como prática recomendada, a descrição da regra deve começar com “Verifica se” e incluir uma descrição do cenário NON_COMPLIANT. Os nomes dos serviços devem ser escritos na íntegra, começando com AWS ou Amazon, quando mencionados pela primeira vez na descrição da regra. Por exemplo, AWS CloudTrail ou Amazon CloudWatch em vez de CloudTrail ou CloudWatch para primeiro uso. Os nomes dos serviços podem ser abreviados após a referência subsequente.

escopo

O escopo determina quais tipos de recursos a regra visa. Para obter uma lista de tipos de recursos compatíveis, consulte Tipos de recursos com suporte.

Detalhes da fonte

Os SourceDetails determinam o tipo de gatilho da regra. Há dois tipos de acionadores: alterações de configuração para regras acionadas por alterações e periódicas para regras periódicas. Você também pode configurar sua regra para usar os dois tipos acionados no que é chamado de regra híbrida. Para obter mais informações, consulte Tipos de acionadores

ConfigurationItemChangeNotificatione OversizedConfigurationItemChangeNotification são usados para regras acionadas por mudanças. Quando o AWS Config detecta uma alteração de configuração de um recurso, ele envia uma notificação de item de configuração. Se a notificação exceder o tamanho máximo permitido pelo Amazon Simple Notification Service (Amazon SNS), a notificação incluirá um breve resumo do item de configuração. Você pode ver a notificação completa no local do bucket do S3 especificado no campo s3BucketLocation.

ScheduleNotificationé usado para regras periódicas.

Se houver uma regra híbrida que seja avaliada periodicamente e por alterações de configuração, todos os três tipos de notificações poderão ser usados.

compulsoryInputParameterDetalhes

Os compulsoryInputParameter Detalhes são usados para parâmetros necessários para que uma regra faça sua avaliação. Por exemplo, a regra access-keys-rotated gerenciada inclui maxAccessKeyAge como parâmetro obrigatório. Se um parâmetro for necessário, ele não será marcado como (opcional). Para cada parâmetro, um tipo deve ser especificado. O tipo pode ser “String”, “int”, “double”, “CSV”, “boolean” e "StringMap”.

optionalInputParameterDetalhes

Os optionalInputParameter Detalhes são usados para parâmetros que são opcionais para que uma regra faça sua avaliação. Por exemplo, a regra elasticsearch-logs-to-cloudwatch gerenciada inclui logTypes como parâmetro opcional. Para cada parâmetro, um tipo deve ser especificado. O tipo pode ser “String”, “int”, “double”, “CSV”, “boolean” e "StringMap”.

rótulos

Os rótulos podem ser usados para marcar regras. Por exemplo, todas as codedeploy-auto-rollback-monitor-enabled regras codedeploy-lambda-allatonce-traffic-shift-disabled gerenciadas e as regras gerenciadas incluem o rótuloCodeDeploy. codedeploy-ec2-minimum-healthy-hosts-configured Você pode usar rótulos para ajudar a gerenciar, pesquisar e filtrar regras.

supportedEvaluationModes

Isso supportedEvaluationModes determina quando os recursos serão avaliados, antes de um recurso ser implantado ou depois de um recurso ter sido implantado.

DETECTIVEé usado para avaliar recursos que já foram implantados. Isso permite que você avalie as definições de configuração dos seus recursos existentes. PROACTIVEé usado para avaliar os recursos antes de serem implantados.

Isso permite avaliar se um conjunto de propriedades do recurso, se usado para definir um AWS recurso, seria COMPATÍVEL ou NÃO COMPATÍVEL, considerando o conjunto de regras proativas que você tem em sua conta na sua região.

Você pode especificar o supportedEvaluationModes para DETECTIVEPROACTIVE, ou ambos DETECTIVE PROACTIVE e. Você deve especificar um modo de avaliação e esse campo não pode ficar vazio.

Para obter mais informações, consulte Modos de avaliação. Para obter uma lista de regras gerenciadas que oferecem suporte à avaliação proativa, consulte Lista de regras AWS Config gerenciadas por modo de avaliação.

nota

As regras proativas não corrigem os recursos sinalizados como NÃO COMPLIANT nem impedem que sejam implantados.

Estrutura da regra

Esta seção contém informações sobre como usar o Kit de Desenvolvimento de AWS Config Regras (RDK) e a Biblioteca do Kit de Desenvolvimento de AWS Config Regras (RDKLib). Para obter mais informações sobre o RDK ou o RDKLib, consulte os repositórios e. aws-config-rdkaws-config-rdklibGitHub

Regras de escrita

  1. Siga as etapas em Instalando AWS CLI o.

  2. Siga as etapas em Configuração AWS Config com o console ou Configuração AWS Config com AWS CLI o. Para obter informações sobre as AWS regiões onde AWS Config há suporte, selecione sua região na lista de serviços AWS regionais.

  3. Instale o RDK usando o método recomendado com pip:

    pip install rdk
    nota

    Antes de usar o pip, verifique se ele está instalado em sua máquina.

  4. Instale o RDKlib, usando o método recomendado com pip:

    pip install rdklib
    nota

    Antes de usar o pip, verifique se ele está instalado em sua máquina.

  1. Para criar uma regra que é acionada por uma alteração no tipo de recurso especificado, execute o seguinte comando:

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

    O exemplo a seguir cria uma regra que é acionada por uma alteração no tipo de AWS::IAM::User recurso:

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

    A seguir estão os sinalizadores que você pode usar com o rdk create comando para regras acionadas por alterações:

    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 o RDKLib, o tempo de execução da regra deve ser definido como. python3.6-lib

    Depois de executarrdk create, você verá um novo diretório com o nome da regra e 3 arquivos nele:

    • RULE_NAME.py- Arquivo Python onde a lógica da regra é armazenada


    • RULE_NAME_test.py- Arquivo Python onde os testes unitários da regra são armazenados

    • parameters.json- Arquivo JSON para as configurações de implantação do RDK

  2. A próxima etapa é escrever a lógica da regra. Você só precisará editar o RULE_NAME arquivo.py. Se você abrir o RULE_NAME arquivo.py, verá um modelo no qual poderá adicionar lógica de regras. A seguir está o modelo que foi gerado 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)

    O exemplo a seguir é uma versão editada do modelo MFA_ENABLED_RULE com a lógica da regra. A regra verifica se os usuários do IAM têm a autenticação multifator (MFA) ativada. A regra é NON_COMPLIANT se um usuário do IAM não tiver a MFA desativada. Para obter mais informações sobre a lógica de regras e os métodos fornecidos no modelo, consulteLógica de regras.

    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. A próxima etapa é instalar a camada RDKlib AWS com o AWS console ou. AWS CLI O RDKlib foi projetado para funcionar como uma camada. AWS Lambda Ele permite que você use a biblioteca sem precisar incluí-la em seu pacote de implantação.

    • Para instalar a camada RDKlib com o AWS console, execute as seguintes etapas:

      1. Abra o console do AWS Lambda em https://console.aws.amazon.com/lambda/.

      2. Selecione Criar função.

      3. Na página Criar função, selecione Procurar repositório de aplicativos sem servidor e, no campo de pesquisa, digite rdklib.

      4. Revise os detalhes da função e, em seguida, implante-a. Você não deveria ter que fazer nenhuma alteração.

      5. No painel de navegação esquerdo, escolha a página Camadas. Em seguida, escolha a camada Lambda que você acabou de criar e copie o Amazon Resource Name (ARN) da camada Lambda. Você precisará do ARN da camada Lambda ao implantar sua regra.

    • Para instalar a camada RDKlib com oAWS CLI, execute os seguintes comandos:

      1. Crie o conjunto de alterações para a camada RDKLib.

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

        Ele retorna a seguinte saída:

        { "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. Execute o conjunto de alterações. Você pode copiar/colar o ARN completo do conjunto de alterações (ChangeSetIdda saída gerada na etapa anterior) para personalizar o seguinte comando:

        aws cloudformation execute-change-set --change-set-name NAME_OF_THE_CHANGE_SET
      3. Retorne todos os recursos associados que fazem parte da pilha implantada.

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

        Ele retorna a seguinte saída:

        { "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 o ARN da camada Lambda da saída gerada na etapa anterior. O ARN da camada Lambda é o. PhysicalResourceId

        "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
  4. A próxima etapa é fornecer uma função a ser assumida pela função Lambda. Por padrão, as funções do Lambda tentam assumir a AWSServiceRoleForConfig função, o que não é permitido. Você precisa criar uma função com a política AWS_ConfigRole gerenciada. A função deve ter uma relação de confiança AWS Config e todas as funções no caminho /rdk/ devem assumir a função. Veja a seguir um exemplo de política de confiança:

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

    Usando essa política de confiança, execute o seguinte comando:

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

    Agora, execute o comando a seguir para atualizar o parâmetro de entrada ExecutionRoleName e fornecer o nome da função:

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

    Você também pode usar rdk modify para atualizar os detalhes da regra acionada por alterações usando os seguintes sinalizadores:

    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. A etapa final é implantar sua regra. Para implantar sua regra, execute o seguinte comando com o ARN da camada Lambda da etapa 3:

    rdk deploy YOUR_RULE_NAME --rdklib-layer-arn YOUR_RDKLIB_LAYER_ARN
  6. A regra agora está implantada. Você pode usar o AWS Config console para verificar se a regra está funcionando conforme o esperado.

  1. Para criar uma regra que é acionada periodicamente para um tipo de recurso especificado, execute o seguinte comando:

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

    O exemplo a seguir cria uma regra que é acionada a cada 24 horas para o tipo de AWS::IAM::User recurso:

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

    A seguir estão os sinalizadores que você pode usar com o rdk create comando para regras 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 o RDKLib, o tempo de execução da regra deve ser definido como. python3.6-lib

    Depois de executarrdk create, você verá um novo diretório com o nome da regra e 3 arquivos nele:

    • RULE_NAME.py- Arquivo Python onde a lógica da regra é armazenada


    • RULE_NAME_test.py- Arquivo Python onde os testes unitários da regra são armazenados

    • parameters.json- Arquivo JSON para as configurações de implantação do RDK

  2. A próxima etapa é escrever a lógica da regra. Você só precisará editar o RULE_NAME arquivo.py. Se você abrir o RULE_NAME arquivo.py, verá um modelo no qual poderá adicionar lógica de regras. A seguir está o modelo que foi gerado 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)

    O modelo usa como padrão as regras acionadas por alterações. Em vez disso, adicione sua lógica ao evaluate_periodic método. O exemplo a seguir é uma versão editada do modelo MFA_ENABLED_RULE com a lógica da regra. A regra verifica se os usuários do IAM têm a autenticação multifator (MFA) ativada. A regra é NON_COMPLIANT se um usuário do IAM não tiver a MFA desativada. Para obter mais informações sobre a lógica de regras e os métodos fornecidos no modelo, consulteLógica de regras.

    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. A próxima etapa é instalar a camada RDKlib AWS com o AWS console ou. AWS CLI O RDKlib foi projetado para funcionar como uma camada. AWS Lambda Ele permite que você use a biblioteca sem precisar incluí-la em seu pacote de implantação.

    • Para instalar a camada RDKlib com o AWS console, execute as seguintes etapas:

      1. Abra o console do AWS Lambda em https://console.aws.amazon.com/lambda/.

      2. Selecione Criar função.

      3. Na página Criar função, selecione Procurar repositório de aplicativos sem servidor e, no campo de pesquisa, digite rdklib.

      4. Revise os detalhes da função e, em seguida, implante-a. Você não deveria ter que fazer nenhuma alteração.

      5. No painel de navegação esquerdo, escolha a página Camadas. Em seguida, escolha a camada Lambda que você acabou de criar e copie o Amazon Resource Name (ARN) da camada Lambda. Você precisará do ARN da camada Lambda ao implantar sua regra.

    • Para instalar a camada RDKlib com oAWS CLI, execute os seguintes comandos:

      1. Crie o conjunto de alterações para a camada RDKLib.

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

        Ele retorna a seguinte saída:

        { "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. Execute o conjunto de alterações. Você pode copiar/colar o ARN completo do conjunto de alterações (ChangeSetIdda saída gerada na etapa anterior) para personalizar o seguinte comando:

        aws cloudformation execute-change-set --change-set-name NAME_OF_THE_CHANGE_SET
      3. Retorne todos os recursos associados que fazem parte da pilha implantada.

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

        Ele retorna a seguinte saída:

        { "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 o ARN da camada Lambda da saída gerada na etapa anterior. O ARN da camada Lambda é o. PhysicalResourceId

        "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
  4. A próxima etapa é fornecer uma função a ser assumida pela função Lambda. Por padrão, as funções do Lambda tentam assumir a AWSServiceRoleForConfig função, o que não é permitido. Você precisa criar uma função com a política AWS_ConfigRole gerenciada. A função deve ter uma relação de confiança AWS Config e todas as funções no caminho /rdk/ devem assumir a função. Veja a seguir um exemplo de política de confiança:

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

    Usando essa política de confiança, execute o seguinte comando:

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

    Agora, execute o comando a seguir para atualizar o parâmetro de entrada ExecutionRoleName e fornecer o nome da função:

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

    Você também pode usar rdk modify para atualizar os detalhes da regra periódica usando os seguintes sinalizadores:

    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. A etapa final é implantar sua regra. Para implantar sua regra, execute o seguinte comando com o ARN da camada Lambda da etapa 3:

    rdk deploy YOUR_RULE_NAME --rdklib-layer-arn YOUR_RDKLIB_LAYER_ARN
  6. A regra agora está implantada. Você pode usar o AWS Config console para verificar se a regra está funcionando conforme o esperado.

Lógica de regras

O exemplo de código Python a seguir é um modelo para escrever uma regra usando o RDK e o RKDLib. Você só deve fazer alterações nos evaluate_periodic métodos evaluate_parametersevaluate_change, e ou escrever funções completamente novas para ajudar com a lógica, se necessário. Para obter os pré-requisitos para escrever regras com o RDK e o RDKLib, consulte. Pré-requisitos

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)
RECURSOS_APLICÁVEIS

APPLICABLE_RESOURCESsão o (s) tipo (s) de recurso que a regra visa. Se usada, essa deve ser uma variável global definida para o (s) tipo (s) de recurso que a regra visa. Para obter uma lista de tipos de recursos compatíveis, consulte Tipos de recursos com suporte.

avaliar_parâmetros

Descrição

Esse método é usado para verificar se os parâmetros de entrada da regra são válidos. A seguir estão as melhores práticas:

  • Verifique se o número correto de parâmetros está listado.

  • Verifique se o nome do parâmetro está correto.

  • Verifique se o valor do parâmetro é do tipo correto.

  • Se o parâmetro for um número inteiro, verifique se o parâmetro está entre limites razoáveis.

  • Se o parâmetro tiver um número limitado de opções possíveis, verifique se o parâmetro é uma dessas opções.

  • Se o parâmetro for uma string, verifique se ele tem um tamanho razoável e corte qualquer espaço antes ou depois do valor.

  • Verifique se alguma distinção entre maiúsculas e minúsculas foi tratada adequadamente.

  • Limite a entrada de parâmetros quando possível. Por exemplo, se você estiver recebendo uma lista de ARNs separados por vírgula, certifique-se de que os únicos caracteres permitidos sejam vírgulas e os caracteres suportados por ARNs.

Parâmetros

rule_parametersé um dicionário de parâmetros de entrada para a regra.

Sintaxe de retorno

Se um dos parâmetros não for válido, você poderá gerar um InvalidParametersError erro:

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

Se os parâmetros forem todos válidos, o método deverá retornar um dicionário:

return valid_rule_parameters
avaliar_mudança

Descrição

Esse método é usado para que a lógica avalie uma regra acionada por alterações.

Parâmetros

eventé o AWS Lambda evento fornecido porAWS Config. É um documento formatado em JSON que contém dados para a operação de uma função Lambda. Para ver exemplos, consulte Exemplos de eventos para AWS Config regras.

client_factoryé o ClientFactory objeto a ser usado para a regra. A ClientFactory classe cria ou reutiliza um cliente boto3, que fornece uma interface de baixo nível para um serviço. AWS Os métodos do cliente boto3 são mapeados com uma API AWS de serviço, o que significa que as operações do serviço mapeiam os métodos do cliente com o mesmo nome e fornecem acesso aos mesmos parâmetros de operação. Para obter uma lista dos serviços disponíveis, consulte Serviços disponíveis na documentação do Boto3 Docs.

A sintaxe da solicitação de client_factory é a seguinte:

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

Por exemplo:

iam_client = client_factory.build_client("iam")
nota

O nome boto3 do AWS serviço é obrigatório.

configuration_itemé o dicionário do item de configuração completo, mesmo que seja superdimensionado. Um item de configuração representa uma point-in-time visualização dos vários atributos de um AWS recurso suportado. Para obter informações sobre o conteúdo doConfigurationItem, consulte ConfigurationItema Referência da AWS Config API.

valid_rule_parametersé a saída do evaluate_parameters() método.

Sintaxe de retorno

O método deve retornar um ou mais dos seguintes itens:

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

Você deve usar anotações para todas as avaliações não compatíveis. Por exemplo:

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

Descrição

Esse método é usado para avaliar uma regra periódica.

Parâmetros

eventé o AWS Lambda evento fornecido porAWS Config. É um documento formatado em JSON que contém dados para a operação de uma função Lambda. Para ver exemplos, consulte Exemplos de eventos para AWS Config regras.

client_factoryé o ClientFactory objeto a ser usado para a regra. A ClientFactory classe cria ou reutiliza um cliente boto3, que fornece uma interface de baixo nível para um serviço. AWS Os métodos do cliente boto3 são mapeados com uma API AWS de serviço, o que significa que as operações do serviço mapeiam os métodos do cliente com o mesmo nome e fornecem acesso aos mesmos parâmetros de operação. Para obter uma lista dos serviços disponíveis, consulte Serviços disponíveis na documentação do Boto3 Docs.

A sintaxe da solicitação de client_factory é a seguinte:

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

Por exemplo:

iam_client = client_factory.build_client("iam")
nota

O nome boto3 do AWS serviço é obrigatório.

valid_rule_parametersé a saída do evaluate_parameters() método.

Sintaxe de retorno

O método deve retornar um ou mais dos seguintes itens:

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

Você deve usar anotações para todas as avaliações não compatíveis. Por exemplo:

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

Descrição

Você não deve precisar modificar esse método. O manipulador lambda é usado para processar eventos. A função é executada quando AWS Lambda passa o event objeto para o handler método. Para obter mais informações, consulte Manipulador de funções do Lambda em Python.

Parâmetros

eventé o AWS Lambda evento fornecido porAWS Config. É um documento formatado em JSON que contém dados para a operação de uma função Lambda. Para ver exemplos, consulte Exemplos de eventos para AWS Config regras.

contexté um objeto passado para sua função pelo Lambda em tempo de execução. Esse objeto fornece métodos e propriedades que fornecem informações e métodos que a função pode usar enquanto é executada. Observe que nas versões mais recentes do Lambda, o contexto não é mais usado.