【運用自動化】AWS Config 適合パック (Conformance Packs) を使って AWS 組織内の VPC Flow Logs 無効化設定を検知・自動修復してみた
📌 本記事では、AWS Config 適合パック (Conformance Packs) を活用して AWS Organizations 全アカウントの VPC Flow Logs が無効化されていることを検知し、S3 への集約設定を自動修復する手順を解説いたします。
はじめに
こんにちは。フニです。
組織のセキュリティ要件上、AWS 組織内のアカウントで VPC Flow Logs が無効化されている場合、それを検知して自動的に有効化する仕組みが必要になるケースもあるのではないでしょうか。
今回は、AWS Config 適合パックを活用することで実装できそうでしたので試してみました。
AWS Config 適合パックとは?
複数の AWS Config ルールと修復アクションを1つのパッケージにまとめて管理できる機能です。
詳細は以下のブログをご参照ください。
前提
※ 本記事のコードはあくまでもサンプルです。必要に応じて変更してください。
- AWS Organizations 環境構築済み
- 組織の全アカウントにおける展開先リージョンで AWS Config が有効化済み
手順
Phase 1: VPC Flow Logs 用 S3 バケット作成する
- ログ集約アカウントにログイン後、S3 コンソール画面へ移動します。

- リージョンを確認後、「バケットを作成」を押下します。

- 今回は S3 バケット名のみを入力し、デフォルト設定で作成します。
(必要に応じてバケット設定を変更してください。)

- 作成したバケットの「アクセス許可」タブから、バケットポリシーの編集を押下します。

- 以下のポリシーを参考に、<s3-bucket-name> の箇所を編集して適用します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<s3-bucket-name>/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
},
{
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::<s3-bucket-name>"
}
]
}
Phase 2: CloudFormation StackSets で IAM ロールをデプロイする
AWS CloudFormation StackSets の有効化及び委任管理者の登録を実施します。
組織の Payer アカウントでの作業が必要です。詳細は以下を参考にしてください。
- AWS コンソールにログイン後、CloudFormation コンソール画面へ移動します。

- 左側のタブから「StackSets」を押下し、スタックセットを作成します。

- 以下のサンプルコードをローカル上に保存しておきます。
(ファイル名:iam-role-stacksets.yaml)
AWSTemplateFormatVersion: '2010-09-09'
Description: |
IAM Role for SSM Automation to enable VPC Flow Logs across organization accounts.
This template is deployed via CloudFormation StackSets with service-managed permissions.
Features:
- Least privilege IAM permissions for VPC Flow Logs management
- Cross-account S3 write access for centralized logging
- Secure trust relationship with Systems Manager Automation
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: "Logging Configuration"
Parameters:
- LogArchiveBucket
- LogArchiveAccountId
- Label:
default: "Role Configuration"
Parameters:
- RoleName
ParameterLabels:
LogArchiveBucket:
default: "Centralized Log Archive S3 Bucket Name"
LogArchiveAccountId:
default: "Log Archive Account ID"
RoleName:
default: "IAM Role Name"
Parameters:
LogArchiveBucket:
Type: String
Description: Name of the centralized S3 bucket for VPC Flow Logs (in Log Archive Account)
AllowedPattern: '^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$'
ConstraintDescription: Must be a valid S3 bucket name (lowercase, hyphens allowed)
LogArchiveAccountId:
Type: String
Description: AWS Account ID of the Log Archive Account
AllowedPattern: '^\d{12}$'
ConstraintDescription: Must be a 12-digit AWS Account ID
RoleName:
Type: String
Default: VPCFlowLogsAutomationRole
Description: Name of the IAM Role for SSM Automation
AllowedPattern: '^[\w+=,.@-]{1,64}$'
ConstraintDescription: Must be a valid IAM role name
Resources:
# SSM Automation Execution Role
VPCFlowLogsAutomationRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Ref RoleName
Description: |
IAM Role for Systems Manager Automation to enable and manage VPC Flow Logs.
Provides least privilege permissions for VPC Flow Logs creation and S3 access.
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
# Allow SSM Automation service to assume this role
- Effect: Allow
Principal:
Service:
- ssm.amazonaws.com
Action:
- 'sts:AssumeRole'
Condition:
StringEquals:
'aws:SourceAccount': !Ref 'AWS::AccountId'
ArnLike:
'aws:SourceArn': !Sub 'arn:${AWS::Partition}:ssm:*:${AWS::AccountId}:automation-execution/*'
# Allow AWS Config service to assume this role for remediation
- Effect: Allow
Principal:
Service:
- config.amazonaws.com
Action:
- 'sts:AssumeRole'
ManagedPolicyArns: []
Policies:
- PolicyName: VPCFlowLogsManagement
PolicyDocument:
Version: '2012-10-17'
Statement:
# CloudWatch Logs permissions for Flow Logs delivery
- Sid: CloudWatchLogsPermissions
Effect: Allow
Action:
- 'logs:CreateLogDelivery'
- 'logs:DeleteLogDelivery'
- 'logs:CreateLogGroup'
Resource: '*'
# EC2 VPC Flow Logs Creation
- Sid: VPCFlowLogsCreation
Effect: Allow
Action:
- 'ec2:CreateFlowLogs'
Resource: '*'
# SSM Automation passrole permission
- Sid: PassRoleForAutomation
Effect: Allow
Action:
- 'iam:PassRole'
Resource: !Sub 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/${RoleName}'
Condition:
StringEquals:
'iam:PassedToService':
- 'ec2.amazonaws.com'
- 'logs.amazonaws.com'
- 'vpc-flow-logs.amazonaws.com'
Tags:
- Key: Name
Value: !Ref RoleName
- Key: ManagedBy
Value: CloudFormation-StackSets
- Key: Purpose
Value: VPCFlowLogsAutomation
Outputs:
AutomationRoleArn:
Description: ARN of the SSM Automation execution role
Value: !GetAtt VPCFlowLogsAutomationRole.Arn
Export:
Name: !Sub '${AWS::StackName}-AutomationRoleArn'
AutomationRoleName:
Description: Name of the SSM Automation execution role
Value: !Ref VPCFlowLogsAutomationRole
Export:
Name: !Sub '${AWS::StackName}-AutomationRoleName'
LogArchiveBucketName:
Description: Centralized S3 bucket name for VPC Flow Logs
Value: !Ref LogArchiveBucket
Export:
Name: !Sub '${AWS::StackName}-LogArchiveBucket'
- 保存した yaml ファイルをアップロードし、次へを押下します。

- スタックセット名・パラメータを入力し、次へを押下します。
- Centralized Log Archive S3 Bucket Name:Phase 1 で作成した S3 バケット名
- Log Archive Account ID:Phase 1 で利用した AWS アカウント ID
- IAM Role Name:VPCFlowLogsAutomationRole

- チェックボックスの内容に同意し、次へを押下します。

- バージニア北部リージョンを指定し、次へを押下します。
(必要に応じて同時実行数などを変更してください。)

- 確認画面で「送信」を押下し、オペレーションが完了になるまで待機します。

Phase 3: AWS Config 適合パックをデプロイする
AWS Config の有効化及び委任管理者の登録を実施します。
組織の Payer アカウントでの作業が必要です。詳細は以下を参考にしてください。
- AWS コンソールにログイン後、CloudShell 画面を開きます。
(適用対象リージョンで間違いないかご確認ください。)

- 以下のサンプルコードを修正後、ローカル上に保存しておきます。
(ファイル名:vpc-flowlogs-conformance-pack.yaml)
- <AWSアカウントID>:AWS Config 委任管理者の AWS アカウント ID
- <S3バケット名>:Phase 1 で作成した S3 バケット名
Resources:
VpcFlowLogsEnabledRule:
Type: AWS::Config::ConfigRule
Properties:
ConfigRuleName: vpc-flow-logs-enabled
Description: |
Checks whether Amazon VPC Flow Logs are found and enabled for all VPCs.
The rule is NON_COMPLIANT if flow logs are not enabled for at least one VPC.
# Scope: Apply to all VPCs
Scope:
ComplianceResourceTypes:
- AWS::EC2::VPC
# Input Parameters for the Rule
InputParameters:
trafficType: ALL
# Rule Source: AWS Managed Rule
Source:
Owner: AWS
SourceIdentifier: VPC_FLOW_LOGS_ENABLED
# Evaluation Frequency
MaximumExecutionFrequency: TwentyFour_Hours
# Note: Remediation configuration is separate (see below)
#############################################################################
# Automatic Remediation Configuration
#############################################################################
VpcFlowLogsRemediation:
Type: AWS::Config::RemediationConfiguration
Properties:
# Link to the Config Rule
ConfigRuleName: vpc-flow-logs-enabled
# Target SSM Automation Document - AWS Managed (no runtime management required)
TargetType: SSM_DOCUMENT
TargetId: AWS-EnableVPCFlowLogs
TargetVersion: "1"
# Resource Type
ResourceType: AWS::EC2::VPC
# Automatic Remediation Settings
Automatic: true
MaximumAutomaticAttempts: 5
RetryAttemptSeconds: 60
# IAM Role for SSM Automation Execution
ExecutionControls:
SsmControls:
ConcurrentExecutionRatePercentage: 10
ErrorPercentage: 10
# Parameters passed to SSM Automation
Parameters:
# Automation Execution Role
AutomationAssumeRole:
StaticValue:
Values:
- arn:aws:iam::<AWSアカウントID>:role/VPCFlowLogsAutomationRole
# VPC IDs from Config Rule evaluation
VPCIds:
ResourceValue:
Value: RESOURCE_ID
# S3 destination type
LogDestinationType:
StaticValue:
Values:
- s3
# S3 bucket ARN for centralized logging
LogDestinationArn:
StaticValue:
Values:
- arn:aws:s3:::<S3バケット名>
# Traffic type to log
TrafficType:
StaticValue:
Values:
- ALL
- 保存しておいたファイルを CloudShell 上にアップロードします。

- 以下のコマンドで Config 適合パックを有効化します。
aws configservice put-organization-conformance-pack \
--organization-conformance-pack-name="EnableVPCFlowLogsConformancePack" \
--template-body="file://vpc-flowlogs-conformance-pack.yaml"

- デプロイした適合パックの状態を確認し、CREATE_SUCCESSFUL になるまで待機します。
デプロイした適合パックを確認するコマンド
$ aws configservice describe-organization-conformance-packs --organization-conformance-pack-name=EnableVPCFlowLogsConformancePack
{
"OrganizationConformancePacks": [
{
"OrganizationConformancePackName": "EnableVPCFlowLogsConformancePack",
"OrganizationConformancePackArn": "arn:aws:config:ap-northeast-1:<AWSアカウントID>:organization-conformance-pack/EnableVPCFlowLogsConformancePack-g5hniluq",
"ConformancePackInputParameters": [],
"ExcludedAccounts": [],
"LastUpdateTime": "2025-12-11T04:33:20.268000+00:00"
}
]
}
デプロイ状況について確認するコマンド
$ aws configservice describe-organization-conformance-pack-statuses --organization-conformance-pack-name=EnableVPCFlowLogsConformancePack
{
"OrganizationConformancePackStatuses": [
{
"OrganizationConformancePackName": "EnableVPCFlowLogsConformancePack",
"Status": "CREATE_IN_PROGRESS",
"LastUpdateTime": "2025-12-11T04:37:31.152000+00:00"
}
]
}
デプロイ状況をアカウント個別に確認するコマンド
$ aws configservice get-organization-conformance-pack-detailed-status --organization-conformance-pack-name=EnableVPCFlowLogsConformancePack
{
"OrganizationConformancePackDetailedStatuses": [
{
"AccountId": "111111111111",
"ConformancePackName": "OrgConformsPack-EnableVPCFlowLogsConformancePack-g5hniluq",
"Status": "CREATE_SUCCESSFUL",
"LastUpdateTime": "2025-12-11T04:35:24.445000+00:00"
},
{
"AccountId": "222222222222",
"ConformancePackName": "OrgConformsPack-EnableVPCFlowLogsConformancePack-g5hniluq",
"Status": "CREATE_SUCCESSFUL",
"LastUpdateTime": "2025-12-11T04:35:24.897000+00:00"
}
]
}
メンバーアカウントで動作確認
📌 補足
Config 適合パックのデプロイの前に、予め作成しておいた VPC で確認しました。
- メンバーアカウントの方で、適合パックが作成されていることを確認しました。

- VPC Flow Logs が無効になっていたため、非準拠として検出されていました。

- CloudTrail ログ上では、以下3つの活動が順番に実行されていました。
- PutEvaluations:AWS Config に評価結果を連携する
- StartAutomationExecution:Automation の Runbook を実行する
- CreateFlowLogs:VPC Flow Logs を作成する

- VPC には、S3 バケットを送信先とした VPC Flow Logs が有効化されていました。

- VPC 上に EC2 インスタンスを立ち上げ、トラフィックを作ってみます。
sh-5.2$ curl https://classmethod.jp/
- 保存用 S3 バケットを確認したら、無事に以下のパスに保存されていました。
<S3バケット名>/AWSLogs/<AWSアカウントID>/vpcflowlogs/<リージョン>/YYYY/MM/DD/ファイル

環境のクリーンアップ (削除手順)
適合パックを削除したい場合は CloudShell で以下のコマンドを実行します。
$ aws configservice delete-organization-conformance-pack --organization-conformance-pack-name "EnableVPCFlowLogsConformancePack"
あとは以下2点を削除すればクリーンアップは完了です。
- Phase 2 で作成した CloudFormation StackSets
- Phase 1 で作成した S3 バケット
注意点
- デプロイ対象は組織内の全アカウントが対象となります。(OU単位では不可)
- Config 適合パックは、必要なリージョン毎にデプロイが必要となります。
おわりに
AWS 組織内の VPC Flow Logs が無効化されている場合、AWS Config 適合パック (Conformance Packs) を活用した S3 への集約設定を自動修復する仕組みを作ってみました。
今回は VPC Flow Logs でしたが、他にも組織のセキュリティ要件に反する設定を自動修復する仕組みが必要な場合に検討できる嬉しい機能ですね!
参考







