AWS Config ルールのコンポーネント - AWS Config

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Config ルールのコンポーネント

AWS Config ルールは、 AWS リソースの設定を評価します。ルールには、AWS Config マネージドルールと AWS Config カスタムルールという 2 つのタイプがあります。

AWS Config マネージドルールは、 によって作成された事前定義済みのカスタマイズ可能なルールです AWS Config。マネージドルールのリストについては、「 AWS Config マネージドルールのリスト」を参照してください。

AWS Config カスタムルールは、ゼロから作成するルールです。 AWS Config カスタムルールを作成するには 2 つの方法があります。Lambda 関数 (AWS Lambda デベロッパーガイド) と Guard (Guard GitHub Repository ) では、 で AWS Lambda 作成された policy-as-code language. AWS Config custom ルールはAWS Config カスタム Lambda ルール、Guard で作成された AWS Config カスタムルールはAWS Config カスタムポリシールール と呼ばれます。

このページでは、 ルール開発キット (RDK) と AWS Config ルール開発キットライブラリ (RDKlib) を使用して Python で AWS Config カスタムルールを作成する方法に関する AWS Config マネージド AWS Config ルールとベストプラクティスのメタデータについて説明します。 AWS Config カスタムポリシールールを作成する方法のチュートリアルについては、「カスタムポリシールールの作成 AWS Config」を参照してください。 AWS Config カスタム Lambda ルールの作成方法のチュートリアルについては、AWS Config 「カスタム Lambda ルールの作成」を参照してください。

AWS Config マネージドルールメタデータ

AWS Config マネージドルールには、次の変更可能なメタデータを含めることができます。

defaultName

defaultName は、ルールのインスタンスがデフォルトで取得する名前です。

[ Description] ( 説明)

ルールの説明は、ルールが評価する内容のコンテキストを提供します。 AWS Config コンソールには 256 文字の制限があります。ベストプラクティスとして、ルールの説明に「するかどうかを確認」で始まる、NON_COMPLIANT シナリオの説明を含めます。サービス名は、ルールの説明に最初に記載されたときに、 AWS または Amazon で始まる完全な形式で記述する必要があります。例えば、初めて使用する場合 CloudWatch は、 CloudTrail または CloudWatch の代わりに AWS CloudTrail Amazon を使用します。それ以降に言及するときは、サービス名を省略できます。

scope

スコープは、ルールがターゲットとするリソースタイプを決定します。サポートされるリソースタイプのリストについては、サポートされているリソースタイプを参照してください。

compulsoryInputParameter詳細

compulsoryInputParameter詳細 は、ルールが評価を実行するために必要なパラメータに使用されます。例えば、access-keys-rotated マネージドルールには、必須パラメータとして maxAccessKeyAge が含まれます。パラメータが必須の場合、(オプション) としてマークされません。パラメータごとに、型を指定する必要があります。タイプは、「文字列」、「int」、「double」、「CSV」、「ブール値」、StringMap「」のいずれかです。

optionalInputParameter詳細

optionalInputParameter詳細 は、ルールが評価を実行するためのオプションであるパラメータに使用されます。例えば、elasticsearch-logs-to-cloudwatch マネージドルールには、オプションのパラメータとして logTypes が含まれます。パラメータごとに、型を指定する必要があります。タイプは、「文字列」、「int」、「double」、「CSV」、「ブール値」、StringMap「」のいずれかです。

supportedEvaluationModes

は、リソースがデプロイされる前、またはリソースがデプロイされた後に、リソースを評価するタイミング supportedEvaluationModes を決定します。

DETECTIVE は、デプロイ済みのリソースを評価するために使用します。これにより、既存のリソース構成設定を評価できます。PROACTIVE は、リソースをデプロイ前に評価するために使用します。

これにより、リージョンのアカウントにあるプロアクティブルールのセットに基づいて、リソースを定義するために AWS リソースプロパティのセットが COMPLIANT か NON_COMPLIANT かを評価できます。

supportedEvaluationModes から DETECTIVE、、PROACTIVEまたは DETECTIVEと の両方を指定できますPROACTIVE。評価モードを指定する必要があります。このフィールドを空のままにすることはできません。

詳細については、「評価モード」を参照してください。プロアクティブ評価をサポートするマネージドルールのリストについては、「評価モード別の AWS Config マネージドルールのリスト」を参照してください。

注記

プロアクティブルールは、NON_COMPLIANT のフラグが付けられたリソースを修正したり、これらのリソースのデプロイを妨げたりしません。

AWS Config カスタムルール構造

このセクションでは、 AWS Config ルール開発キット (RDK) と AWS Config ルール開発キットライブラリ (RDKlib) の使用について説明します。RDK または RDKlib の詳細については、aws-config-rdk 「」およびaws-config-rdklib GitHub 「 リポジトリ」を参照してください。

ルールの記述

  1. AWS CLI のインストールのステップに従います。

  2. コンソール AWS Config を使用した のセットアップ」または「 AWS Config を使用した のセットアップ AWS CLI」の手順に従います。 AWS Config がサポートされている AWS リージョンについては、「 リージョンAWS サービス」リストからリージョンを選択してください。

  3. pip で推奨される方法を使用して RDK をインストールします。

    pip install rdk
    注記

    pip を使用する前に、マシンに pip がインストールされていることを確認してください。

  4. pip で推奨される方法を使用して RDKLib をインストールします。

    pip install rdklib
    注記

    pip を使用する前に、マシンに pip がインストールされていることを確認してください。

  1. 指定したリソースタイプの変更によってトリガーされるルールを作成するには、次のコマンドを実行します。

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

    次の例では、AWS::IAM::User リソースタイプへの変更によってトリガーされるルールを作成します。

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

    以下は、変更によってトリガーされるルールの rdk create コマンドで使用できるフラグです。

    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
    注記

    RDKLib を使用するには、ルールのランタイムを python3.6-lib に設定する必要があります。

    rdk create を実行した後、ルール名の付いた新しいディレクトリが表示されます。ディレクトリには以下の 3 つのファイルが含まれます。

    • RULE_NAME.py - ルールロジックが格納されている Python ファイル


    • RULE_NAME_test.py - ルールのユニットテストが格納されている Python ファイル

    • parameters.json-RDK のデプロイ設定用の JSON ファイル

  2. 次のステップは、ルールロジックを記述することです。RULE_NAME.py ファイルを編集するだけで済みます。RULE_NAME.py ファイルを開くと、ルールロジックを追加できるテンプレートが表示されます。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)

    次の例は、ルールロジックを使用した MFA_ENABLED_RULE テンプレートの編集バージョンです。このルールは、IAM ユーザーが多要素認証 (MFA) を有効にしているかどうかを確認します。IAM ユーザーが MFA を有効にしていない場合、ルールは NON_COMPLIANT です。ルールロジックとテンプレートで提供されるメソッドの詳細については、「ルールのロジック」を参照してください。

    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. 次のステップでは、 AWS コンソールまたは AWS を使用して に RDKlib レイヤーをインストールします AWS CLI。RdkLib は、 AWS Lambda Layer として機能するように設計されています。これにより、ライブラリをデプロイパッケージに含める必要なく、ライブラリを使用できます。

    • AWS コンソールを使用して RDKlib レイヤーをインストールするには、次のステップを実行します。

      1. https://console.aws.amazon.com/lambda/ で AWS Lambda コンソールを開きます。

      2. [Create Function] (関数を作成) を選択します。

      3. [Create function] (関数を作成) ページで、[Browse serverless app repository] (サーバーレスアプリリポジトリの参照) を選択し、検索フィールドに「rdklib」と入力します。

      4. 関数の詳細を確認し、デプロイします。変更を加える必要はありません。

      5. 左のナビゲーションペインで、[Layers] (レイヤー) ページを選択します。次に、先ほど作成した Lambda レイヤーを選択し、Lambda レイヤーの Amazon リソースネーム (ARN) をコピーします。ルールをデプロイするときに Lambda レイヤーの ARN が必要になります。

    • を使用して RDKlib レイヤーをインストールするには AWS CLI、次のコマンドを実行します。

      1. RDKlib-Layer の変更セットを作成します。

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

        次の出力が返されます。

        { "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. change-set を実行します。完全な変更セット ARN (前のステップで生成された出力ChangeSetId から) をコピー/貼り付けて、次のコマンドをカスタマイズできます。

        aws cloudformation execute-change-set --change-set-name NAME_OF_THE_CHANGE_SET
      3. デプロイされたスタックの一部である関連リソースをすべて返します。

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

        次の出力が返されます。

        { "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. 前のステップで生成された出力から Lambda レイヤーの ARN をコピーします。Lambda レイヤーの ARN は PhysicalResourceId です。

        "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
  4. 次のステップは、Lambda 関数が引き受けるロールを指定することです。デフォルトでは、Lambda 関数は AWSServiceRoleForConfig ロールを引き受けようとしますが、これは許可されていません。AWS_ConfigRole 管理ポリシーでロールを作成する必要があります。ロールは AWS Config との信頼関係が必要です。また、/rdk/ パスの下にあるすべてのロールがそのロールを引き受ける必要があります。以下に示しているのは、信頼ポリシーの例です。

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

    この信頼ポリシーを使用して、次のコマンドを実行します。

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

    次に、次のコマンドを実行して ExecutionRoleName の入力パラメータを更新し、ロール名を指定します。

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

    rdk modify を使用して、変更によってトリガーされるルールの詳細を以下のフラグで更新することもできます。

    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. 最後のステップは、ルールのデプロイです。ルールをデプロイするには、ステップ 3 の Lambda レイヤーの ARN を指定して次のコマンドを実行します。

    rdk deploy YOUR_RULE_NAME --rdklib-layer-arn YOUR_RDKLIB_LAYER_ARN
  6. これでルールがデプロイされます。 AWS Config コンソールを使用して、ルールが期待どおりに機能しているかどうかを確認できます。

  1. 指定したリソースタイプの定期的にトリガーされるルールを作成するには、次のコマンドを実行します。

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

    次の例では、AWS::IAM::User リソースタイプに対して 24 時間ごとにトリガーされるルールを作成します。

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

    以下は、定期的なルールの rdk create コマンドで使用できるフラグです。

    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']
    注記

    RDKLib を使用するには、ルールのランタイムを python3.6-lib に設定する必要があります。

    rdk create を実行した後、ルール名の付いた新しいディレクトリが表示されます。ディレクトリには以下の 3 つのファイルが含まれます。

    • RULE_NAME.py - ルールロジックが格納されている Python ファイル


    • RULE_NAME_test.py - ルールのユニットテストが格納されている Python ファイル

    • parameters.json-RDK のデプロイ設定用の JSON ファイル

  2. 次のステップは、ルールロジックを記述することです。RULE_NAME.py ファイルを編集するだけで済みます。RULE_NAME.py ファイルを開くと、ルールロジックを追加できるテンプレートが表示されます。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)

    テンプレートは、デフォルトで変更によってトリガーされるルールに設定されます。代わりに、ロジックを evaluate_periodic メソッドに追加します。次の例は、ルールロジックを使用した MFA_ENABLED_RULE テンプレートの編集バージョンです。このルールは、IAM ユーザーが多要素認証 (MFA) を有効にしているかどうかを確認します。IAM ユーザーが MFA を有効にしていない場合、ルールは NON_COMPLIANT です。ルールロジックとテンプレートで提供されるメソッドの詳細については、「ルールのロジック」を参照してください。

    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. 次のステップでは、 AWS コンソールまたは AWS を使用して に RDKlib レイヤーをインストールします AWS CLI。RdkLib は、 AWS Lambda Layer として機能するように設計されています。これにより、ライブラリをデプロイパッケージに含める必要なく、ライブラリを使用できます。

    • AWS コンソールを使用して RDKlib レイヤーをインストールするには、次のステップを実行します。

      1. https://console.aws.amazon.com/lambda/ で AWS Lambda コンソールを開きます。

      2. [Create Function] (関数を作成) を選択します。

      3. [Create function] (関数を作成) ページで、[Browse serverless app repository] (サーバーレスアプリリポジトリの参照) を選択し、検索フィールドに「rdklib」と入力します。

      4. 関数の詳細を確認し、デプロイします。変更を加える必要はありません。

      5. 左のナビゲーションペインで、[Layers] (レイヤー) ページを選択します。次に、先ほど作成した Lambda レイヤーを選択し、Lambda レイヤーの Amazon リソースネーム (ARN) をコピーします。ルールをデプロイするときに Lambda レイヤーの ARN が必要になります。

    • を使用して RDKlib レイヤーをインストールするには AWS CLI、次のコマンドを実行します。

      1. RDKlib-Layer の変更セットを作成します。

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

        次の出力が返されます。

        { "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. change-set を実行します。完全な変更セット ARN (前のステップで生成された出力ChangeSetId から) をコピー/貼り付けて、次のコマンドをカスタマイズできます。

        aws cloudformation execute-change-set --change-set-name NAME_OF_THE_CHANGE_SET
      3. デプロイされたスタックの一部である関連リソースをすべて返します。

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

        次の出力が返されます。

        { "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. 前のステップで生成された出力から Lambda レイヤーの ARN をコピーします。Lambda レイヤーの ARN は PhysicalResourceId です。

        "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
  4. 次のステップは、Lambda 関数が引き受けるロールを指定することです。デフォルトでは、Lambda 関数は AWSServiceRoleForConfig ロールを引き受けようとしますが、これは許可されていません。AWS_ConfigRole 管理ポリシーでロールを作成する必要があります。ロールは AWS Config との信頼関係が必要です。また、/rdk/ パスの下にあるすべてのロールがそのロールを引き受ける必要があります。以下に示しているのは、信頼ポリシーの例です。

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

    この信頼ポリシーを使用して、次のコマンドを実行します。

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

    次に、次のコマンドを実行して ExecutionRoleName の入力パラメータを更新し、ロール名を指定します。

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

    rdk modify を使用して、定期的なルールの詳細を以下のフラグで更新することもできます。

    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. 最後のステップは、ルールのデプロイです。ルールをデプロイするには、ステップ 3 の Lambda レイヤーの ARN を指定して次のコマンドを実行します。

    rdk deploy YOUR_RULE_NAME --rdklib-layer-arn YOUR_RDKLIB_LAYER_ARN
  6. これでルールがデプロイされます。 AWS Config コンソールを使用して、ルールが期待どおりに機能しているかどうかを確認できます。

ルールのロジック

次の Python コードサンプルは、RDK と RDKLib を使用してルールを記述するためのテンプレートです。変更を加えるのは、evaluate_parametersevaluate_change、および evaluate_periodic メソッドの内側だけです。または必要に応じてロジックを支援するまったく新しい関数を記述します。RDK および RDKLib でルールを記述するための前提条件については、「前提条件」を参照してください。

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 は、ルールが対象とするリソースタイプです。使用する場合は、ルールが対象とするリソースタイプに設定されたグローバル変数にする必要があります。サポートされるリソースタイプのリストについては、サポートされているリソースタイプを参照してください。

evaluate_parameters

説明

このメソッドは、ルールの入力パラメータが有効かどうかを確認するために使用されます。ベストプラクティスは以下のとおりです。

  • 正しい数のパラメータがリストされているかどうかを確認します。

  • パラメータ名が正しいかどうかを確認します。

  • パラメータ値が正しいタイプであるかどうかを確認します。

  • パラメータが整数の場合、パラメータが妥当な範囲の間にあるかどうかを確認します。

  • パラメータに使用できるオプションの数が限られている場合は、そのパラメータがそれらのオプションの 1 つであるかどうかを確認します。

  • パラメータが文字列の場合は、妥当な長さであるかどうかを確認し、値の前後のスペースを削除します。

  • 大文字と小文字の区別が適切に処理されているかどうかを確認します。

  • 可能な場合は、パラメータの入力を制限します。たとえば、ARN のカンマ区切りリストを受け取る場合、使用できる文字はカンマと ARN でサポートされている文字だけであることを確認してください。

パラメータ

rule_parameters は、ルールの入力パラメータのディクショナリです。

戻り値の構文

いずれかのパラメータが有効でない場合は、InvalidParametersError エラーを発生させることができます。

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

パラメータがすべて有効な場合、メソッドはディクショナリを返す必要があります。

return valid_rule_parameters
evaluate_change

説明

このメソッドは、変更によってトリガーされるルールを評価するロジックに使用されます。

パラメータ

event は、 によって提供される AWS Lambda イベントです AWS Config。これは、Lambda 関数が動作するためのデータを格納する JSON 形式のドキュメントです。例については、AWS Config 「ルール のイベントの例」を参照してください。

client_factory は、ルールに使用される ClientFactory オブジェクトです。 ClientFactory クラスは、 AWS サービスへの低レベルのインターフェイスを提供する boto3 クライアントを作成または再利用します。boto3 クライアントメソッドは AWS サービス API とマッピングされます。つまり、サービスオペレーションは同じ名前のクライアントメソッドにマッピングされ、同じオペレーションパラメータへのアクセスを提供します。利用可能なサービスのリストについては、Boto3 Docs の「Available services」を参照してください。

client_factory のリクエストの構文は次のとおりです。

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

例:

iam_client = client_factory.build_client("iam")
注記

AWS サービスの boto3 名が必要です。

configuration_item は、オーバーサイズであっても、完全な構成項目のディクショナリです。設定項目は、サポートされている AWS リソースのさまざまな属性 point-in-time の表示を表します。の内容についてはConfigurationItem、 AWS Config API リファレンスのConfigurationItem「」を参照してください。

valid_rule_parametersevaluate_parameters() メソッドの出力です。

戻り値の構文

このメソッドは、次のうち 1 つ以上を返します。

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

削除されたリソースをレポートするルールは、不必要なルール評価を避けるために、NOT_APPLICABLE の評価結果を返す必要があります。

すべての非準拠の評価には、注釈を使用する必要があります。例:

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

説明

このメソッドは、定期的なルールを評価するために使用されます。

パラメータ

event は、 によって提供される AWS Lambda イベントです AWS Config。これは、Lambda 関数が動作するためのデータを格納する JSON 形式のドキュメントです。例については、AWS Config 「ルール のイベントの例」を参照してください。

client_factory は、ルールに使用される ClientFactory オブジェクトです。 ClientFactory クラスは、 AWS サービスへの低レベルのインターフェイスを提供する boto3 クライアントを作成または再利用します。boto3 クライアントメソッドは AWS サービス API とマッピングされます。つまり、サービスオペレーションは同じ名前のクライアントメソッドにマッピングされ、同じオペレーションパラメータへのアクセスを提供します。利用可能なサービスのリストについては、Boto3 Docs の「Available services」を参照してください。

client_factory のリクエストの構文は次のとおりです。

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

例:

iam_client = client_factory.build_client("iam")
注記

AWS サービスの boto3 名が必要です。

valid_rule_parametersevaluate_parameters() メソッドの出力です。

戻り値の構文

このメソッドは、次のうち 1 つ以上を返します。

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

削除されたリソースをレポートするルールは、不必要なルール評価を避けるために、NOT_APPLICABLE の評価結果を返す必要があります。

すべての非準拠の評価には、注釈を使用する必要があります。例:

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

説明

このメソッドを変更する必要はありません。Lambda ハンドラーは、イベントを処理するために使用されます。関数は、 がeventオブジェクトを handlerメソッドに AWS Lambda 渡すときに実行されます。詳細については、「Python の Lambda 関数ハンドラー」を参照してください。

パラメータ

event は、 によって提供される AWS Lambda イベントです AWS Config。これは、Lambda 関数が動作するためのデータを格納する JSON 形式のドキュメントです。例については、AWS Config 「ルール のイベントの例」を参照してください。

context は、ランタイムに Lambda によって関数に渡されるオブジェクトです。このオブジェクトは、関数が実行時に使用できる情報とメソッドを提供するメソッドおよびプロパティを提供します。Lambda の新しいバージョンでは、コンテキストは使用されなくなりました。