AWS ConfigのマネージドルールをCDK(Python)で設定したメモ
AWS Config とは?
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 を連携させて独自ルールを作っていくことになります
CDK のセットアップ
$ 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
3.ファイルを編集
今回は Cognito のリソース群を構築したいため、ここからファイルを編集していく
- 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()
- 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: ルールを評価するトリガーとなる範囲(スコープ)を設定
API の種類
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 マネージドルールはたくさんあるので、要件に合ったものを設定してみてください