AWS ConfigのマネージドルールをCDK(Python)で設定したメモ

#AWS
#Config
#CDK
#Python
#マネージドルール

AWS リソースを構成する際、設定を任意の基準に満たしているか評価させたり、基準に満たしていない場合、SNS を連携させて通知をしたり、Lambda などをトリガーにして基準に満たすように処理を加えるなどを実現することができます。

以下公式 HP からの引用

・AWS リソースの設定が最適な設定であるかどうかを評価する。

・AWS アカウントに関連付けられているサポート対象リソースの現在の設定のスナップショットを取得する。

・アカウント内にある 1 つ以上のリソースの設定を取得する。

・1 つ以上のリソースの設定履歴を取得する。

・リソースが作成、変更、または削除されるたびに通知を受け取る。

・リソース間の関係を表示する (特定のセキュリティグループを使用するすべてのリソースを確認する場合など)。

引用 HP https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/WhatIsConfig.html

AWS Config のルールにはカスタムルールとマネージドルールがあります

AWS が提供してくれているルールがマネージドルールです

マネージドルールで用意されておらず、独自でルールを作りたい場合はカスタムルールを使用します

カスタムルールでは AWS Lambda を連携させて独自ルールを作っていくことになります

$ mkdir cdk && cd cdk $ cdk init --language python

実行し、以下の様な初期ファイル群を作る

cdk/ .venv ├ stacks/ │ ├ __init__.py │ └ config_stack.py .gitignore ├ app.py ├ cdk.json README.md ├ requirements-dev.txt ├ requirements.txt └ source.bat

Python virtual enviroment をアクティブ化し、仮想環境を構築 自動生成された requirements.txt を使って aws-cdk-lib のライブラリをインストールする

$ source .venv/bin/activate $ pip install -r requirements.txt

今回は Cognito のリソース群を構築したいため、ここからファイルを編集していく

  1. app.py
#!/usr/bin/env python3 import os import aws_cdk as cdk from cdk.config_stack import ConfigStack app = cdk.App() ConfigStack(app, "ConfigStack") app.synth()
  1. cdk/config_stack.py
from aws_cdk import ( Stack, aws_config as config ) from constructs import Construct class ConfigStack(Stack): def __init__(self, scope: Construct, construct_id: str, env_vals, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) config.ManagedRule(self, "API_GW_CACHE_ENABLED_AND_ENCRYPTED", identifier=config.ManagedRuleIdentifiers.API_GW_CACHE_ENABLED_AND_ENCRYPTED, rule_scope=config.RuleScope.from_resources([config.ResourceType.APIGATEWAY_STAGE]) ) config.ManagedRule(self, "API_GW_EXECUTION_LOGGING_ENABLED", identifier=config.ManagedRuleIdentifiers.API_GW_EXECUTION_LOGGING_ENABLED, input_parameters={ "loggingLevel": "ERROR,INFO" }, rule_scope=config.RuleScope.from_resources([config.ResourceType.APIGATEWAY_STAGE, config.ResourceType.APIGATEWAYV2_STAGE]) ) config.CfnConfigRule(self, "API_GW_ASSOCIATED_WITH_WAF", source=config.CfnConfigRule.SourceProperty( owner="AWS", source_identifier="API_GW_ASSOCIATED_WITH_WAF" ), scope=config.CfnConfigRule.ScopeProperty( compliance_resource_types=["AWS::ApiGateway::Stage"] ) )

Config ルールのプロパティは主に identifier, input_parameters, rule_scope を設定します

indentifier: マネージドルールの識別子を設定

input_parameters: マネージドルールの識別子ごとのオプションを設定できます。内容は各識別子のドキュメントを参照してください。

rule_scope: ルールを評価するトリガーとなる範囲(スコープ)を設定

AWS Config の CDK ドキュメントに ManagedRule という API があり、ManagedRuleIdentifiers の中に設定したい識別子があればこれを使って設定できました。

上記では「API_GW_CACHE_ENABLED_AND_ENCRYPTED」を例に実装しています。

しかし、「API_GW_ASSOCIATED_WITH_WAF」のように ManagedRuleIdentifiers の中にないものもいくつかありました。

その場合は、CfnConfigRule の API を使用することで設定することができました

compliance_resource_types に設定する文字列については以下のリンクを参照してください

マネージドルールのリスト

https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html

aws_config/ManagedRule のドキュメント

https://docs.aws.amazon.com/cdk/api/v1/python/aws_cdk.aws_config/ManagedRule.html

aws_config/CfnConfigRule のドキュメント

https://docs.aws.amazon.com/cdk/api/v1/python/aws_cdk.aws_config/CfnConfigRule.html

aws_config/ManagedRuleIdentifiers のドキュメント

https://docs.aws.amazon.com/cdk/api/v1/python/aws_cdk.aws_config/ManagedRuleIdentifiers.html

compliance_resource_types で設定したいリソースタイプの文字列はこちらを参照

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/resource-config-reference.html

今回作った CDK は Config ルールのみなのでこのまま cdk deploy すると失敗してしまいます。

コンソール等で別途 Config の初回セットアップを済ませる必要があります

初回セットアップでは Config 実行に必要な IAM、設定履歴やスナップショットファイルを保存する S3 バケットなどを設定する必要があります

ここまで来たら deploy を実行、

$ cdk bootstrap $ cdk deploy

これで CDK で Config ルールを設定できます

AWS マネージドルールはたくさんあるので、要件に合ったものを設定してみてください