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

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

AWS Config ルールは、AWS リソースの設定内容を評価します。ルールには、AWS Config マネージドルールと AWS Config カスタムルールという 2 つのタイプがあります。マネージドルールは、AWS Config によって作成される、事前定義されたカスタマイズ可能なルールです。マネージドルールのリストについては、「AWS Config マネージドルールのリスト」を参照してください。

カスタムルールは、Guard または AWS Lambda 関数を使用して作成できる 1 つ以上のルールです。Guard (Guard GitHub リポジトリ) は、AWS Config カスタムポリシールールによって適用されるポリシーを記述できるようにするコードとしてのポリシー言語です。AWS Lambda は、ユーザーがアップロードしたカスタムコードを使用してカスタムルールを評価します。イベントソースから発行されたイベントによって、この関数が呼び出されます。この関数は、カスタムルールが開始されたときに、AWS Config によって呼び出されます。

このページでは、ルール定義の構造と、AWS Config ルール開発キット (RDK) および AWS Config ルール開発キットライブラリ (RDKLib) を使用してルールを記述する方法に関するベストプラクティスについて説明します。AWS Config カスタムポリシールールの作成方法を示すチュートリアルについては、「AWS Config カスタムポリシールールの作成」を参照してください。AWS Config カスタム Lambda ルールの作成方法を示すチュートリアルについては、「AWS Config カスタム Lambda ルールの作成」を参照してください。

ルール定義

AWS Config ルール定義には以下のフィールドがあります。

  • identifier

  • defaultName

  • [ Description] ( 説明)

  • scope

  • SourceDetails

  • compulsoryInputParameterDetails

  • optionalInputParameterDetails

  • labels

次の JSON 例は、codedeploy-ec2-minimum-healthy-hosts-configured マネージドルールのルール定義を示しています。

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

ルールのメタデータ

identifier

ルール識別子は、AWS Config マネージドルールの ID として機能します。ルール識別子は ALL_CAPS_WITH_UNDERSCORES で記述されます。例えば、CODEDEPLOY_EC2_MINIMUM_HEALTHY_HOSTS_CONFIGURED はルール識別子で、codedeploy-ec2-minimum-healthy-hosts-configured はルール名です。ルール識別子は、AWS CloudFormation テンプレートで AWS Config マネージドルールを作成する場合や、PutConfigRule API を呼び出す場合に使用されます。

注記

ルールによっては、ルール識別子はルール名と異なる場合があります。例えば、restricted-ssh のルール識別子は INCOMING_SSH_DISABLED です。

defaultName

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

[ Description] ( 説明)

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

scope

スコープは、ルールがターゲットとするリソースタイプを決定します。これは、ルールが変更によってトリガーされるか、または変更によってトリガーされるとともに定期的にトリガーされる場合に必要であり、定期的なルールの場合はオプションです。サポートされるリソースタイプのリストについては、サポートされているリソースタイプを参照してください。

SourceDetails

sourceDetails は、ルールのトリガータイプを決定します。ConfigurationItemChangeNotificationOversizedConfigurationItemChangeNotification は、変更によってトリガーされるルールに使用されます。AWS Config は、リソースの設定変更を検出すると、設定項目の通知を送信します。通知が Amazon Simple Notification Service (Amazon SNS) の最大許容サイズを超えている場合、通知には設定項目の概要が含まれます。完全な通知は、s3BucketLocation フィールドで指定した S3 バケット内の参照先にあります。

ScheduleNotification は定期的なルールに使用されます。ルールが定期的に評価されるとともに、設定の変更によって評価される場合は、3 種類の通知すべてを使用できます。詳細については、「AWS Config ルールのトリガーの指定」を参照してください。

compulsoryInputParameterDetails

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

optionalInputParameterDetails

OptionalInputParameterDetails は、ルールが評価を行うためのオプションのパラメータに使用されます。例えば、codedeploy-ec2-minimum-healthy-hosts-configured マネージドルールには、オプションのパラメータとして minimumHealthyHostsFleetPercentminimumHealthyHostsHostCount が含まれます。パラメータごとに、型を指定する必要があります。型は、「String」、「int」、「double」、「CSV」、「boolean」、「StringMap」のいずれかになります。

labels

ルールにタグを付けるために、ラベルを使用できます。例えば、codedeploy-auto-rollback-monitor-enabledcodedeploy-ec2-minimum-healthy-hosts-configured、および codedeploy-lambda-allatonce-traffic-shift-disabled マネージドルールには、すべてラベル CodeDeploy が含まれます。

ルールの構造

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

ルールの記述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      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 を実行します。完全な 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 と RKdLib を使用してルールを記述するためのテンプレートです。変更を加えるのは、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 でサポートされている文字だけであることを確認してください。

[Parameters] (パラメータ)

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

戻り値の構文

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

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

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

return valid_rule_parameters
evaluate_change

説明

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

[Parameters] (パラメータ)

event は AWS Config が提供する AWS Lambda イベントです。これは、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 リソースのさまざまな属性を特定の時点で反映したビューです。ConfigurationItem の内容の詳細については、AWS Config API リファレンスの「ConfigurationItem」を参照してください。

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

戻り値の構文

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

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

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

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

説明

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

[Parameters] (パラメータ)

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

client_factory はルールに使用する ClientFactory オブジェクトです。ClientFactory クラスは、AWS のサービスに対する低レベルのインターフェイスを提供する boto3 クライアントを作成または再利用します。boto3 クライアントのメソッドは、AWS サービス API にマッピングされます。つまり、サービスの操作は、同じ名前のクライアントメソッドにマッピングされ、同じ操作パラメータにアクセスできるようになります。利用可能なのサービスのリストについては、Boto3 Docs の「AAvailable 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)]

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

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

説明

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

[Parameters] (パラメータ)

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

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